home *** CD-ROM | disk | FTP | other *** search
/ APDL Public Domain 1 / APDL_PD1A.iso / program / assembler / as / src / c / help_lex < prev    next >
Encoding:
Text File  |  1992-08-11  |  3.6 KB  |  127 lines

  1. /*
  2.  * help_lex.c
  3.  * Copyright © 1992 Niklas Röjemo
  4.  */
  5.  
  6. #include <ctype.h>
  7. #include "global.h"
  8. #include "error.h"
  9. #include "help_lex.h"
  10.  
  11. static int char2digit(char c)
  12. {
  13.   if(c>'a') return c + 10 -'a';
  14.   if(c>'A') return c + 10 -'A';
  15.   return c-'0';
  16. }
  17.  
  18. WORD lexGetCharFromString(int *ilen, char **istr)
  19. {
  20.   char *str = *istr;
  21.   int len = *ilen;
  22.   char c;
  23.  
  24.   if(*str == '\\') {  /* An escape character */
  25.     if(--len<1) {
  26.       error(ErrorError,TRUE,"No character after '\\'.");
  27.       c = 0;
  28.       str++;
  29.     } else {
  30.       switch(*++str) {  /* Is it one of the special characters ? */
  31.         case 'a': str++; len--;  c = '\a'; break;
  32.         case 'b': str++; len--;  c = '\b'; break;
  33.         case 'f': str++; len--;  c = '\f'; break;
  34.         case 'n': str++; len--;  c = '\n'; break;
  35.         case 'r': str++; len--;  c = '\r'; break;
  36.         case 't': str++; len--;  c = '\t'; break;
  37.         case 'v': str++; len--;  c = '\v'; break;
  38.         case '\'':str++; len--;  c = '\''; break;
  39.         case '"': str++; len--;  c = '"';  break;
  40.         case '\\': str++; len--;  c = '\\';  break;
  41.         case 'x': str++; len--;
  42.           switch(len) {  /* It is an hex character */
  43.             case 0: case 1:
  44.               error(ErrorError,TRUE,"Not two hex digits after \\x.");
  45.               str += len;
  46.               len = 0;
  47.               c = 0;
  48.               break;
  49.             default:
  50.               if(isxdigit(str[0]) && isxdigit(str[1]))
  51.                 c = char2digit(str[0])*16 + char2digit(str[1]);
  52.               else {
  53.                 error(ErrorError,TRUE,"Illegal hex digit after \\x.");
  54.                 c = 0;
  55.               }
  56.               len -=2;
  57.               str +=2;
  58.           }
  59.           break;
  60.         case '0': case '1': case '2': case '3':
  61.         case '4': case '5': case '6': case '7':
  62.           switch(len) {  /* It is a octal character */
  63.             case 0: case 1: case 2: 
  64.               error(ErrorError,TRUE,"Not three octal digits after \\.");
  65.               str += len;
  66.               len = 0;
  67.               c = 0;
  68.               break;
  69.             default:
  70.               if(str[0]>='0' && str[0] <= '9'  &&
  71.                  str[1]>='0' && str[1] <= '9'  &&
  72.                  str[2]>='0' && str[2] <= '9')
  73.                 c = (str[0]-'0')*64 + (str[1]-'0')*8 + str[2]-'0';
  74.               else {
  75.                 error(ErrorError,TRUE,"Illegal octal character after \\.");
  76.                 c = 0;
  77.               }
  78.               len -=3;
  79.               str +=3;
  80.           }
  81.           break;
  82.         default:  /* Do not understand */
  83.           error(ErrorError,TRUE,"Illegal character after \\.");
  84.           c = *str++;
  85.       }
  86.     }
  87.   } else {  /* An ordinary character */
  88.     c = *str++;
  89.     len--;
  90.   }
  91.   *istr = str;
  92.   *ilen = len;
  93.   return c;
  94. }
  95.  
  96. WORD lexChar2Int(BOOL rev, int len, char *str)
  97. {
  98.   char c[4];
  99.   int i = 0;
  100.   while(len && i<4)
  101.     c[i++] = lexGetCharFromString(&len,&str);
  102.   if(rev) {
  103.     switch(i) {
  104.       case 0:  error(ErrorError,TRUE,"Empty character");
  105.                return 0;
  106.       case 1:  return c[0];
  107.       case 2:  return c[0]<< 8 | c[1];
  108.       case 3:  return c[0]<<16 | c[1]<< 8 | c[2];
  109.       case 4:  return c[0]<<24 | c[1]<<16 | c[2]<<8 | c[3];
  110.       default: error(ErrorError,TRUE,"Multi character bigger than 4 bytes (%d).",i);
  111.                return 0;
  112.     }
  113.   } else {
  114.     switch(i) {
  115.       case 0:  error(ErrorError,TRUE,"Empty character");
  116.                return 0;
  117.       case 1:  return c[0];
  118.       case 2:  return c[1]<< 8 | c[0];
  119.       case 3:  return c[2]<<16 | c[1]<< 8 | c[0];
  120.       case 4:  return c[3]<<24 | c[2]<<16 | c[1]<<8 | c[0];
  121.       default: error(ErrorError,TRUE,"Multi character bigger than 4 bytes (%d).",i);
  122.                return 0;
  123.     }
  124.   }
  125.   return 0;
  126. }
  127.