/*Copyright (C) 1992, 1995 by Thomas Glen Smith. All Rights Reserved.*/
/* aplquote APL2 V1.0.0 ************************************************
* Called from aplparsf when the current character is a quote to parse *
* a quoted string. *
***********************************************************************/
#define INCLUDES APLCB+APLCHDEF+APLTOKEN
#include "includes.h"
void aplquote(cur,sp,spend)
Apltoken cur;
char *sp[]; /* pointer to pointer to string being parsed */
char *spend; /* pointer to after end of string being parsed */
{
Getcb;
extern int aplerr;
extern char *aplchar[];
char *q=aplchar[QUOTE],*s,*t,*u,*v;
int datacnt,i,j,rank;
s = t = sp[0]; /* point after starting quote */
for (i=1 , datacnt=0 ; i ; datacnt += i) {
if (t == spend) {
cur-> token_code = MESSAGE_TOKEN;
cur-> token_ptr.token_string = "unbalanced quotes";
return;
}
if (*t++ == *q)
if (t == spend) i = 0; /* all done */
else { /* is it APL quote? */
i = (*t == *q); /* i = 0 if ending quote */
t += i; /* bump t if two contiguous quotes */
}
}
sp[0] = t; /* update text pointer */
rank = (datacnt == 1) ? 0 : 1;
cur-> token_ptr.token_vector =
getcb(NULL,datacnt,APLCHAR+APLTEMP,rank,NULL);
if (aplerr) {
cur-> token_code = MESSAGE_TOKEN;
cur-> token_ptr.token_string = "out of memory";
return;
}
v = (cur-> token_ptr.token_vector)-> aplptr.aplchar;
while (datacnt--) { /* copy quoted string */
s += (*s == *q); /* bump if APL quote. */
*v++ = *s++; /* copy character */
}
}