+ case '"': /* STRING */
+ cp1 = yytext;
+ cp2 = &yytext[INMAX - 1];
+ for (;;) {
+ if (cp1 >= cp2) {
+ yyerror("command string too long\n");
+ break;
+ }
+ c = getc(fin);
+ if (c == EOF || c == '"')
+ break;
+ if (c == '\\') {
+ if ((c = getc(fin)) == EOF) {
+ *cp1++ = '\\';
+ break;
+ }
+ }
+ if (c == '\n')
+ c = ' '; /* can't send '\n' */
+ *cp1++ = c;
+ }
+ if (c != '"')
+ yyerror("missing closing '\"'\n");
+ *cp1++ = '\0';
+ yylval.string = cp2 = malloc(cp1 - yytext);
+ if (cp2 == NULL)
+ fatal("ran out of memory\n");
+ cp1 = yytext;
+ while (*cp2++ = *cp1++)
+ ;
+ return(STRING);
+