home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume13 / modemcap / mgetstr.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-01-31  |  2.5 KB  |  107 lines

  1. extern    char    *__modemcap;
  2.  
  3. char    *mgetstr (id, area)
  4. register char    *id;
  5. register char    **area;
  6. {
  7.     register char    *cp = __modemcap;
  8.     register char    *str = *area;        /* start of current string        */
  9.  
  10.     if (__modemcap == (char *) 0)        /* has mgetent() been called? ...    */
  11.         return ((char *) 0);            /* ... no, can't find string    */
  12.  
  13.     while (*cp != ':' && *cp != 0)        /* find first entry in cap        */
  14.         cp++;
  15.  
  16.     if (*cp == 0)                /* empty entry???            */
  17.         return ((char *) 0);            /* ... yes, bad modemcap entry        */
  18.     else
  19.         cp++;                /* point to first character in next    */
  20.  
  21.     while (*cp != 0) {            /* until entry found or end of entry    */
  22.         if (cp[0] == id[0] && cp[1] == id[1]) {    /* found entry!!!        */
  23.             if (cp[2] != '=')    /* is it a string value???        */
  24.                 return ((char *) 0);    /* no, something else            */
  25.             else
  26.                 break;        /* yes, entry was found            */
  27.         } else {            /* not entry, skip this entire entry    */
  28.             while (*cp != ':' && *cp != 0)
  29.                 cp++;        /* search for end of current entry    */
  30.  
  31.             if (*cp != 0)
  32.                 cp++;        /* skip terminating character        */
  33.         }
  34.     }
  35.     if (*cp == 0)                /* end of modem cap entry        */
  36.         return ((char *) 0);
  37.  
  38.     cp += 3;                /* point to actual string        */
  39.     while (*cp != ':' && *cp != 0) {    /* for every character in string ...    */
  40.         if (*cp == '\\') {        /* translate escaped character        */
  41.             cp++;
  42.             switch (*cp) {
  43.                 case 'n':    /* newline            */
  44.                     **area = '\n';
  45.                     (*area)++;
  46.                     cp++;
  47.                     break;
  48.                 case 'r':    /* carriage return        */
  49.                     **area = '\r';
  50.                     (*area)++;
  51.                     cp++;
  52.                     break;
  53.                 case 'b':    /* backspace            */
  54.                     **area = '\b';
  55.                     (*area)++;
  56.                     cp++;
  57.                     break;
  58.                 case 'f':    /* form feed            */
  59.                     **area = '\f';
  60.                     (*area)++;
  61.                     cp++;
  62.                     break;
  63.                 case 't':    /* tab                */
  64.                     **area = '\t';
  65.                     (*area)++;
  66.                     cp++;
  67.                     break;
  68.                 case 'E':    /* Escape character        */
  69.                     **area = 033;
  70.                     (*area)++;
  71.                     cp++;
  72.                     break;
  73.                 case '0':
  74.                 case '1':
  75.                 case '2':
  76.                 case '3':
  77.                 case '4':
  78.                 case '5':
  79.                 case '6':
  80.                 case '7':
  81.                     **area = ((cp[0] - '0') << 6) +
  82.                          ((cp[1] - '0') << 3) +
  83.                           (cp[2] - '0');
  84.                     (*area)++;
  85.                     cp += 3;
  86.                     break;
  87.                 default:
  88.                     **area = *cp++;
  89.                     (*area)++;
  90.                     break;
  91.             }
  92.         } else if (*cp == '^') {    /* some control character        */
  93.             cp++;
  94.             if (*cp >= '@' && *cp <= '_') {
  95.                 **area = *cp - '@';
  96.                 (*area)++;
  97.             }
  98.             cp++;
  99.         } else {            /* some normal character        */
  100.             **area = *cp++;        /* put character in area        */
  101.             (*area)++;
  102.         }
  103.     }
  104.     *((*area)++) = 0;            /* null terminate area and string    */
  105.     return (str);                /* return pointer to start of string    */
  106. }
  107.