1: # include <ingres.h>
   2: # include "scanner.h"
   3: # include   <sccs.h>
   4: # include <errors.h>
   5: 
   6: SCCSID(@(#)s_string.c	8.2	2/8/85)
   7: 
   8: /*
   9: ** STRING
  10: ** A string is defined as any sequence of MAXSTRING or fewer characters,
  11: ** surrounded by string delimiters.  New-line ;characters are purged
  12: ** from strings unless preceeded by a '\'; QUOTE's must be similarly
  13: ** prefixed in order to be correctly inserted within a string.  Each
  14: ** string is entered in the symbol table, indexed by 'yylval'.  A
  15: ** token or the error condition -1 is returned.
  16: */
  17: string(op)
  18: struct optab    *op;
  19: {
  20:     extern char Cmap[];
  21:     extern char *yylval;
  22:     extern char *syment();
  23:     register int    esc;
  24:     register int    save;
  25:     register char   *ptr;
  26:     char        buf[MAXSTRING + 1];
  27: 
  28:     /* disable case conversion and fill in string */
  29:     ptr = buf;
  30:     save = Lcase;
  31:     Lcase = 0;
  32:     do
  33:     {
  34:         /* get next character */
  35:         if ((*ptr = get_scan(NORMAL)) <= 0)
  36:         {
  37:             Lcase = save;
  38:             /* non term string */
  39:             par_error(STRTERM, FATAL, 0);
  40:         }
  41: 
  42:         /* handle escape characters */
  43:         esc = (*ptr == '\\');
  44:         if (*ptr == '\n')
  45:         {
  46:             if ((*ptr = get_scan(NORMAL)) <= 0)
  47:             {
  48:                 Lcase = save;
  49:                 *ptr = 0;
  50:                 /* non term string */
  51:                 par_error(STRTERM, FATAL, 0);
  52:             }
  53:         }
  54:         if (esc == 1)
  55:         {
  56:             if ((*++ptr = get_scan(NORMAL)) <= 0)
  57:             {
  58:                 Lcase = save;
  59:                 *ptr = 0;
  60:                 /* non term string */
  61:                 par_error(STRTERM, FATAL, 0);
  62:             }
  63:             if (*ptr == *(op->term))
  64:                 *--ptr = *(op->term);
  65:         }
  66: 
  67:         /* check length */
  68:         if ((ptr - buf) > MAXSTRING - 1)
  69:         {
  70:             Lcase = save;
  71:             /* string too long */
  72:             par_error(STRLONG, WARN, 0);
  73:         }
  74:         if (Cmap[*ptr] == CNTRL)
  75:             /* cntrl in string from equel */
  76:             par_error(CNTRLCHR, WARN, 0);
  77:     } while (*ptr++ != *(op->term) || esc == 1);
  78: 
  79:     /* restore case conversion and return */
  80:     *--ptr = '\0';
  81:     Lcase = save;
  82: #	ifdef xSTR2
  83:     tTfp(71, 8, "STRING: %s\n", buf);
  84: #	endif
  85:     yylval = syment(buf, (ptr - buf) + 1);
  86:     Lastok.tok = yylval;
  87:     Lastok.toktyp = Tokens.sconst;
  88:     return (Tokens.sconst);
  89: }

Defined functions

string defined in line 6; used 1 times
Last modified: 1986-04-17
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 987
Valid CSS Valid XHTML 1.0 Strict