home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / cprog / actlib12.zip / STRINGS.ZIP / TOKEN.C < prev   
C/C++ Source or Header  |  1993-02-25  |  3KB  |  128 lines

  1. /*  Copyright (C) 1993   Marc Stern  (internet: stern@mble.philips.be)  */
  2.  
  3. #include "strings.h"
  4. #include <ctype.h>
  5.  
  6. /***
  7.  *  Function    :   strtoken
  8.  *
  9.  *  Description :   Parse a string to extract the next token.
  10.  *
  11.  *  Decisions   :   The tokens are separated by ' ', '\t' or '\n'.
  12.  *                Tokens may contain these separators by being quoted with
  13.  *            one of the following characters : '"`.
  14.  *            The function returns a pointer to the character following the token.
  15.  *                  Special escape sequences accepted: 
  16.  *                     \b, \f, \n, \r, \t, \e (Esc), \x..., \0..., \...
  17.  *
  18.  *  Parameters  :   in    char *string    string to be tokenized
  19.  *            out   char *token     string containing token
  20.  *
  21.  *  Return code :   pointer to character following the token.
  22.  *
  23.  *  OS/Compiler :   All
  24.  ***/
  25.  
  26. char *strtoken( const char *string, char *token )
  27.  
  28. { char delimiter;
  29.   int base;
  30.  
  31.   while ( (*string == ' ') || (*string == '\t') || (*string == '\n') ) string++;
  32.  
  33.   if( ! *string ) { *token = '\0';
  34.             return string;
  35.           }
  36.  
  37.   if ( (*string == '\"') || (*string == '\'') || (*string == '`') )
  38.      delimiter = *string++;
  39.   else delimiter = '\0';
  40.  
  41.   while ( *string != delimiter )
  42.     {
  43.           base = 0;
  44.  
  45.       switch( *string )
  46.       {
  47.         case '\\' : string++;
  48.             switch( *string )
  49.              {
  50.                case 'b' : *token++ = '\b';
  51.                       string++;
  52.                       break;
  53.  
  54.                case 'f' : *token++ = '\f';
  55.                       string++;
  56.                       break;
  57.  
  58.                case 'n' : *token++ = '\n';
  59.                       string++;
  60.                       break;
  61.  
  62.                case 'r' : *token++ = '\r';
  63.                       string++;
  64.                       break;
  65.  
  66.                case 't' : *token++ = '\t';
  67.                       string++;
  68.                       break;
  69.  
  70.                case '\\': *token++ = '\\';
  71.                       string++;
  72.                       break;
  73.  
  74.                case '\0': *token = '\\';
  75.                       return string;
  76.  
  77.                case '\'': *token++ = '\'';
  78.                       string++;
  79.                       break;
  80.  
  81.                case 'x' :
  82.                case 'X' : base = 16;
  83.                case '0' : if ( ! base ) base = 8;
  84.                case '1' :
  85.                case '2' :
  86.                case '3' :
  87.                case '4' :
  88.                case '5' :
  89.                case '6' :
  90.                case '7' : if ( ! base ) base = 10;
  91.                                       { int loop, num;
  92.  
  93.                     for ( loop = 0, num = 0; loop < 4 && isdigit(*string); loop++ )
  94.                         num = num * base + ( *string++ - '0' );
  95.                     *token++ = (char) num;
  96.                     break;
  97.                       }
  98.  
  99.                case 'E' :
  100.                case 'e' : *token++ = '\033';    /* 033 is ESC */
  101.                       string++;
  102.                       break;
  103.  
  104.                default: *token++ = *string++;
  105.                     break;
  106.              }
  107.  
  108.             break;
  109.  
  110.         case ' '  :
  111.         case '\t' :
  112.         case '\n' : if ( ! delimiter ) { *token = '\0';
  113.                              return string;
  114.                            }
  115.                 break;
  116.  
  117.         default   : *token++ = *string++;
  118.             break;
  119.       }
  120.  
  121.     }    /* end of while */
  122.  
  123.   *token = '\0';
  124.   if ( *string ) string++;        /* at the last delimiter */
  125.  
  126.   return string;
  127. }
  128.