# 2.11BSD#431 - /usr/ingres/source/equel/getch.c

##### Functions

    backup            X
    getch             X

##### Variables

    Peekc             X

       1: #
       2: # include   <stdio.h>
       3:
       4: # include   "constants.h"
       5: # include       "globals.h"
       6:
       7: /*
       8: **  GETCH.C -- I/O manipulation routines
       9: **
      10: **	Defines:
      11: **		getch()
      12: **		backup()
      13: **		int Peekc[2]  -- 2 char stack, if [0]  != -1, the character to
      14: **			be returned on the next call to getch().
      15: **		char *Line_pos -- if != 0 *Line_pos is next
      16: **			character that should be returned.
      17: **		char Line_buf [MAXSTRING + 1] -- holds current
      18: **			input line's text.
      19: **
      20: **	Files:
      21: **		globals.h
      22: **
      23: **	Compilation Flags:
      24: **		xDEBUG -- to test Chardebug for
      25: **			returning activity of getch() and backup().
      26: **
      27: **	History:
      28: **		4/20/78 - written (marc)
      29: **		9/5/78 -- Peekc made Peekc [2] to allow correct
      30: **			processing in eat_display() [display.c]
      31: **			Also include processing put below this
      32: **			abstraction level
      33: **
      34: */
      35:
      36: /*
      37: **  GETCH -- Get a character from the input stream
      38: **
      39: **	Parameters:
      40: **		none
      41: **
      42: **	Returns:
      43: **		the next character on the input stream, or
      44: **		the backed up character if there is one.
      45: **		EOF_TOK is returned on EOF.
      46: **
      47: **	Side Effects:
      48: **		If a backed up character exists, unloads it.
      49: **		*Line_pos is returned if Line_pos != 0
      50: **		and no backup character exists. Line_buf
      51: **		contains the line from which characters are being
      52: **		returned. A call with Line_pos == 0 forces
      53: **		reading of the next input line. Yyline is
      54: **		incremented when a newline is returned.
      55: **		If an EOF is in the middle of a line,
      56: **		then a newline will be appended.
      57: **
      58: **	Requires:
      59: **		getc() - from utility library
      60: **		tst_include() - [include.c]
      61: **
      62: **	Diagnostics:
      63: **		"WARNING : line %d too long, broken in two\n" --
      64: **			a input line may contain at most MAXSTRING
      65: **			characters, including the terminating
      66: **			newline.
      67: **
      68: **	Called By:
      69: **		all lexical analisys routines
      70: **		include() looks at Line_buf and manipulates
      71: **		Line_pos to skip the "#include"d lines.
      72: **
      73: **	History:
      74: **		4/20/78 - written (marc)
      75: **		9/5/78 -- modified (marc)
      76: */
      77:
      78:
      79: /* initializes peek buffer to be empty */
      80: int     Peekc [2]   = {-1, -1};
      81:
      82: getch()
      83: {
      84:     register char   *cp;
      85:     register char   ch;
      86:     static      eoflag;
      87:     extern int  yyline;
      88:     extern FILE     *In_file;
      89:
      90:     if (Peekc [0] >= 0)
      91:     {
      92:         /* have a backed up character */
      93:         ch = Peekc [0];
      94:         if (ch == '\n')
      95:             yyline += 1;
      96:         Peekc [0] = Peekc [1];
      97:         Peekc [1] = -1;
      98:     }
      99:     else
     100:     {
     101:         for ( ; ; )
     102:         {
     103:             /* no lookahead character */
     104:             if (!Line_pos)
     105:             {
     106:                 if (eoflag)
     107:                 {
     108:                     eoflag = 0;
     109:
     110:                     /* try to restore previous file */
     111:                     if (!restoref())
     112:                         return (0);
     113: #					ifdef xDEBUG
     114:                     if (Chardebug || Lex_debug)
     115:                         printf("include file - pop\n");
     116: #					endif
     117:                 }
     118:                 for (cp = Line_buf; (*cp = getc(In_file)) != '\n'
     119:                             && *cp != EOF; cp++)
     120:                 {
     121:                     if (cp - Line_buf > sizeof Line_buf - 1)
     122:                     {
     123:                         printf("WARNING : line %d too long, broken in two\n",
     124:                         yyline);
     125:                         break;
     126:                     }
     127:                 }
     128:                 if (*cp == EOF)
     129:                 {
     130:                     eoflag++;
     131:                     if (cp == Line_buf)
     132:                         /* EOF after '\n' */
     133:                         continue;
     134:                     /* EOF in middle of line */
     135:                     *cp = '\n';
     136:                 }
     137:                 Line_pos = Line_buf;
     138:
     139:                 /* test for a "#include" line */
     140:                 if (tst_include())
     141:                 {
     142:                     /* Force reloading Line_buf */
     143:                     Line_pos = 0;
     144:                     eoflag = 0;
     145: #					ifdef xDEBUG
     146:                     if (Chardebug || Lex_debug)
     147:                         printf("include file - push\n");
     148: #					endif
     149:                     continue;
     150:                 }
     151:             }
     152:             cp =  Line_pos;
     153:             if (*cp == '\n')
     154:             {
     155:                 Line_pos = 0;
     156:                 yyline += 1;
     157:             }
     158:             else
     159:                 Line_pos++;
     160:             ch = *cp;
     161:             break;
     162:         }
     163:     }
     164:     ch &= 0377;
     165:
     166: #	ifdef xDEBUG
     167:     if (Chardebug)
     168:         printf("getch - returning '%c'.\n", ch);
     169: #	endif
     170:
     171:     return (ch);
     172: }
     173:
     174: /*
     175: **  BACKUP -- Back up a character on the input stream.
     176: **	Backs up a single character into Peekc.
     177: **
     178: **	Parameters:
     179: **		ch - character to back up
     180: **
     181: **	Returns:
     182: **		none
     183: **
     184: **	Side Effects:
     185: **		pushes Peekc [0] to Peekc [1].
     186: **		sets Peekc [0] to backed up character.
     187: **
     188: **	Requires:
     189: **		Peekc [2]  -- integers.
     190: **
     191: **	Called By:
     192: **		most lexical analysis routines.
     193: **
     194: **	Syserrs:
     195: **		"backup buffer overflow on line %d, \"%c%c\"." -
     196: **			can only back up two character.
     197: **	History:
     198: **		4/20/78 - written (marc)
     199: **		9/5/78 -- added on backup character (marc)
     200: **
     201: */
     202:
     203: backup(ch)
     204: char        ch;
     205: {
     206:     extern int  yyline;
     207:
     208:
     209: #	ifdef xDEBUG
     210:     if (Chardebug)
     211:         printf("backed up : '%c'\n", ch);
     212: #	endif
     213:
     214:     if (Peekc [1] >= 0)
     215:         syserr("backup buffer overflow on line %d, \"%c%c%c\".",
     216:         yyline, Peekc [0], Peekc [1], ch);
     217:
     218:     Peekc [1] = Peekc [0];
     219:     if ((Peekc [0] = ch & 0377) == '\n')
     220:         --yyline;
     221: }

#### Defined functions

backup defined in line 203; used 15 times

- in /usr/ingres/source/equel/display.c line 364, 383-389(3)
- in /usr/ingres/source/equel/name.c line 102, 115
- in /usr/ingres/source/equel/number.c line 90, 112, 129
- in /usr/ingres/source/equel/operator.c line 75-80(2), 97
- in /usr/ingres/source/equel/string.c line 60
- in /usr/ingres/source/equel/yylex.c line 178, 188

getch defined in line 82; used 16 times

- in /usr/ingres/source/equel/comment.c line 80, 94
- in /usr/ingres/source/equel/display.c line 358, 381-386(2)
- in /usr/ingres/source/equel/name.c line 86, 99
- in /usr/ingres/source/equel/number.c line 71, 86, 100, 109
- in /usr/ingres/source/equel/operator.c line 69
- in /usr/ingres/source/equel/string.c line 42
- in /usr/ingres/source/equel/yylex.c line 55, 143, 182

#### Defined variables

Peekc defined in line 80; used 11 times

- in line 90-97(5), 214-219(6)

Last modified: 1995-02-05 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 1451 |