home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume26 / mytinfo / part02 / gettinfo.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-12-26  |  5.4 KB  |  304 lines

  1. /*
  2.  * gettinfo.c
  3.  *
  4.  * By Ross Ridge
  5.  * Public Domain
  6.  * 92/02/01 07:30:02
  7.  *
  8.  */
  9.  
  10. #include "defs.h"
  11. #include "term.h"
  12.  
  13. #include <ctype.h>
  14.  
  15. #ifdef USE_SCCS_IDS
  16. static const char SCCSid[] = "@(#) mytinfo gettinfo.c 3.2 92/02/01 public domain, By Ross Ridge";
  17. #endif
  18.  
  19. int _gettinfo(sp, cur, path)
  20. register char *sp;
  21. struct term_path *path;
  22. TERMINAL *cur; {
  23.     static char name[MAX_NAME];
  24.     static char entry[MAX_LINE];
  25.     register char *dp;
  26.     register TERMINAL *ct = cur;
  27.     int ind, i, base;
  28.     char c, flag;
  29.  
  30.     dp = entry;
  31.     while(*sp != ',' && *sp != '\0')
  32.         *dp++ = *sp++;
  33.     if (ct->name_all == NULL) {
  34.         *dp = '\0';
  35.         if ((ct->name_all = _addstr(entry)) == NULL)
  36.             return 1;
  37.         while(dp > entry && *--dp != '|');
  38.         ct->name_long = ct->name_all + (dp - entry) + 1;
  39.     }
  40.  
  41.      while(*sp != '\0') {
  42.         while(*sp == ',')
  43.             sp++;
  44.         while(isspace(*sp))
  45.             sp++;
  46.         if (*sp == ',')
  47.             continue;
  48.         if (*sp == '\0')
  49.             break;
  50.         dp = name;
  51.         while (*sp != ',' && *sp != '#' && *sp != '=' && !isspace(*sp) && *sp != '\0')
  52.             *dp++ = *sp++;
  53.         *dp = '\0';
  54. #ifdef DEBUG
  55.         printf(" %s", name);
  56. #endif
  57.         switch(*sp) {
  58.         case '=':
  59. #ifdef DEBUG
  60.             putchar('$');
  61. #endif
  62.             dp = entry;
  63.             sp++;
  64.             ind = _findstrname(name);
  65.             if (ind != -1)
  66.                 flag = _strflags[ind];
  67.             else {
  68.                 ind = _findstrfname(name);
  69.                 if (ind != -1)
  70.                     flag = _strflags[ind];
  71.                 else
  72.                     flag = 'K';
  73.             }
  74.             while(*sp != '\0' && *sp != ',') {
  75.                 switch(*sp) {
  76.                 case '%':
  77.                     *dp++ = *sp++;
  78.                     if (*sp == '^' && flag == 'G')
  79.                         *dp++ = *sp++;
  80.                     break;
  81.                 case '\\':
  82.                     switch(*++sp) {
  83.                     case 'e':
  84.                     case 'E': *dp++ = '\033'; break;
  85.                     case 'l': *dp++ = '\012'; break;
  86.                     case 'n': *dp++ = '\n'; break;
  87.                     case 'r': *dp++ = '\r'; break;
  88.                     case 't': *dp++ = '\t'; break;
  89.                     case 'b': *dp++ = '\b'; break;
  90.                     case 'f': *dp++ = '\f'; break;
  91.                     case 's': *dp++ = ' '; break;
  92.  
  93.                     case '^': 
  94.                     case '\\':
  95.                     case ',':
  96.                     case ':':
  97.                         *dp++ = *sp; break;
  98.  
  99.                     case '0':
  100.                         if (!isdigit(*(sp + 1))) {
  101.                             *dp++ = '\200';
  102.                             break;
  103.                         }
  104.                         /* FALLTHROUGH */
  105.                     case '1':
  106.                     case '2':
  107.                     case '3':
  108.                     case '4':
  109.                     case '5':
  110.                     case '6':
  111.                     case '7':
  112.                         c = *sp - '0';
  113.                         if (isdigit(sp[1]))
  114.                             c = c * 8 + (*++sp-'0');
  115.                         if (isdigit(sp[1]))
  116.                             c = c * 8 + (*++sp-'0');
  117.                         switch((char)c) {
  118.                         case 0:
  119.                             if (flag == 'K') 
  120.                                 *dp++ = '\200';
  121.                             else {
  122.                                 *dp++ = '\\';
  123.                                 *dp++ = '0';
  124.                                 *dp++ = '0';
  125.                                 *dp++ = '0';
  126.                             }
  127.                             break;
  128.                         case '$':
  129.                         case '\'':
  130.                         case '\\':
  131.                             if (flag != 'K')
  132.                                 *dp++ = '\\';
  133.                             /* FALLTHROUGH */
  134.                         default:
  135.                             if (flag == 'G'
  136.                                 && c == '%')
  137.                                 *dp++ = '\\';
  138.                             *dp++ = c;
  139.                             break;
  140.                         }
  141.                         break;
  142.                     default:
  143.                         *dp++ = '\\';
  144.                         *dp++ = *sp;
  145.                         break;
  146.                     }
  147.                     sp++;
  148.                     break;
  149.                 case '^':
  150.                     if (*++sp >= 'A' && *sp <= '_') {
  151.                         *dp++ = *sp++ - '@';
  152.                     } else if (*sp >= 'a' && *sp <= 'z') {
  153.                         *dp++ = *sp++ - 'a' + 1;
  154.                     } else if (*sp == '@') {
  155.                         if (flag == 'K')
  156.                             *dp++ = '\200';
  157.                         else {
  158.                             *dp++ = '\\';
  159.                             *dp++ = '0';
  160.                             *dp++ = '0';
  161.                             *dp++ = '0';
  162.                         }
  163.                         sp++;
  164.                     } else 
  165.                         *dp++ = '^';
  166.                     break;
  167.                 default:
  168.                     *dp++ = *sp++;
  169.                     break;
  170.                 }
  171.             }
  172.             *dp++ = '\0';
  173.             if (strcmp(name, "use") == 0) {
  174.                 if (_getother(entry, path, ct))
  175.                     return 1;
  176.                 break;
  177.             }
  178.             if (ind == -1)
  179.                 break;
  180.             if (ct->strs[ind] != (char *) -1)
  181.                 break;
  182.             if ((ct->strs[ind] = _addstr(entry)) == NULL)
  183.                 return 1;
  184.             break;    
  185.         case '#':
  186. #ifdef DEBUG
  187.             putchar('#');
  188. #endif
  189. #if 0
  190.             i = atoi(++sp);
  191. #else
  192.             sp++;
  193.             if (*sp == '0') {
  194.                 sp++;
  195.                 if (*sp == 'x' || *sp == 'X') {
  196.                     sp++;
  197.                     base = 16;
  198.                 } else
  199.                     base = 8;
  200.             } else
  201.                 base = 10;
  202.             i = 0;
  203.             while(1) {
  204.                 if (isdigit(*sp))
  205.                     i = i * base + *sp - '0';
  206.                 else if (base == 16 && isxdigit(*sp))
  207.                     i = i * base + tolower(*sp) - 'a' + 10;
  208.                 else
  209.                     break;
  210.                 sp++;
  211.             }
  212. #endif
  213.             while(*sp != '\0' && *sp != ',')
  214.                 sp++;
  215.  
  216.             ind = _findnumname(name);
  217.             if (ind != -1) {
  218.                 if (ct->nums[ind] != -2)
  219.                     break;
  220.                 ct->nums[ind] = i;
  221.             } else {
  222.                 ind = _findnumfname(name);
  223.                 if (ind != -1) {
  224.                     if (ct->nums[ind] != -2)
  225.                         break;
  226.                     ct->nums[ind] = i;
  227.                 }
  228.             }
  229.             break;
  230.         default:
  231.             while(*sp != '\0' && *sp++ != ',');
  232.             if (*(dp - 1) == '@') {
  233. #ifdef DEBUG
  234.                 putchar('@');
  235. #endif
  236.                 *(dp - 1) = '\0';
  237.                 ind = _findboolname(name);
  238.                 if (ind != -1) {
  239. #ifdef DEBUG
  240.                     putchar('!');
  241. #endif
  242.                     ct->bools[ind] = 0;
  243.                     break;
  244.                 }
  245.                 ind = _findnumname(name);
  246.                 if (ind != -1) {
  247. #ifdef DEBUG
  248.                     putchar('#');
  249. #endif
  250.                     ct->nums[ind] = -1;
  251.                     break;
  252.                 }
  253.                 ind = _findstrname(name);
  254.                 if (ind != -1) {
  255. #ifdef DEBUG
  256.                     putchar('$');
  257. #endif
  258.                     ct->strs[ind] = NULL;
  259.                     break;
  260.                 }
  261.                 ind = _findboolfname(name);
  262.                 if (ind != -1) {
  263. #ifdef DEBUG
  264.                     putchar('!');
  265. #endif
  266.                     ct->bools[ind] = 0;
  267.                     break;
  268.                 }
  269.                 ind = _findnumfname(name);
  270.                 if (ind != -1) {
  271. #ifdef DEBUG
  272.                     putchar('#');
  273. #endif
  274.                     ct->nums[ind] = -1;
  275.                     break;
  276.                 }
  277.                 ind = _findstrfname(name);
  278.                 if (ind != -1) {
  279. #ifdef DEBUG
  280.                     putchar('$');
  281. #endif
  282.                     ct->strs[ind] = NULL;
  283.                     break;
  284.                 }
  285.                 break;
  286.             }
  287. #ifdef DEBUG
  288.             putchar('!');
  289. #endif
  290.             ind = _findboolname(name);
  291.             if (ind == -1) {
  292.                 ind = _findboolfname(name);
  293.                 if (ind == -1)
  294.                     break;
  295.             }
  296.             if (ct->bools[ind] != -1)
  297.                 break;
  298.             ct->bools[ind] = 1;
  299.             break;
  300.         }
  301.     }
  302.     return 0;
  303. }
  304.