home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_11_04 / 1104085a < prev    next >
Text File  |  1992-12-23  |  2KB  |  90 lines

  1. /* gettok.c */
  2. /* Copyright 1992 by P.J. LaBrocca */
  3.  
  4. #include <stdio.h>
  5. #include <ctype.h>
  6. #include "mixed.h"
  7. #include "mixcalc.h"
  8.  
  9. #define LookAhead(x)  while( (x = getchar()) == ' ' || x == '\t' )
  10.  
  11. jmp_buf startup;
  12.  
  13. mixed_t *M;
  14. enum token_value CurrentToken;
  15.  
  16. enum token_value  gettok( void ) {
  17.     int c;
  18.     Integer tmp1, tmp2, tmp3;
  19.  
  20.     LookAhead( c );
  21.     if( c == EOF )
  22.         return CurrentToken = ENDFILE;
  23.     if( isdigit(c) ) {
  24.         ungetc( c, stdin );
  25.         scanf("%ld", &tmp1);
  26.         LookAhead(c);
  27.         if( isdigit(c) ) {
  28.             ungetc( c, stdin );
  29.             scanf("%ld", &tmp2);
  30.             LookAhead(c);
  31.             if( c != '|' ) {
  32.                 fprintf( stderr, "Expected '|'\n");
  33.                 fflush( stdin );
  34.                 longjmp( startup, 1 );
  35.             }
  36.             LookAhead(c);
  37.             if( !isdigit(c) ) {
  38.                 fprintf( stderr, "Expected a digit\n");
  39.                 fflush( stdin );
  40.                 longjmp( startup, 1 );
  41.             }
  42.             ungetc( c, stdin );
  43.             scanf("%ld", &tmp3 );
  44.             if( tmp3 == 0 ) {
  45.                 fprintf( stderr, "Denominator cannot be zero\n");
  46.                 fflush( stdin );
  47.                 longjmp( startup, 1 );
  48.             }
  49.             mix_init( M, tmp1, tmp2, tmp3 );
  50.             return CurrentToken = NUMBER;
  51.         }
  52.         if( c == '|') {
  53.             LookAhead( c );
  54.             if( !isdigit(c) ) {
  55.                 fprintf( stderr, "Expected a digit\n");
  56.                 fflush( stdin );
  57.                 longjmp( startup, 1 );
  58.             }
  59.             ungetc( c, stdin );
  60.             scanf("%ld", &tmp2 );
  61.             if( tmp2 == 0 ) {
  62.                 fprintf( stderr, "Denominator cannot be zero\n");
  63.                 fflush( stdin );
  64.                 longjmp( startup, 1 );
  65.             }
  66.             mix_init( M, 0, tmp1, tmp2 );
  67.             return CurrentToken = NUMBER;
  68.         }
  69.         ungetc( c, stdin );
  70.         mix_init( M, tmp1, 0, 1 );
  71.         return CurrentToken = NUMBER;
  72.     }
  73.     if( c == '\n' || c == ';')
  74.         return CurrentToken = PRINT;
  75.     switch( c ) {
  76.         case '*':
  77.         case '+':
  78.         case '-':
  79.         case '/':
  80.         case '(':
  81.         case ')':
  82.             return CurrentToken = c;
  83.         default:
  84.             fprintf( stderr, "Unknown token: %c\n", c);
  85.             fflush( stdin );
  86.             longjmp( startup, 1 );
  87.     }
  88. }
  89.  
  90.