home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_200 / 290_01 / ccl.c < prev    next >
Text File  |  1990-05-14  |  3KB  |  112 lines

  1. /* ccl - routines for character classes */
  2.  
  3. /*
  4.  * Copyright (c) 1987, the University of California
  5.  * 
  6.  * The United States Government has rights in this work pursuant to
  7.  * contract no. DE-AC03-76SF00098 between the United States Department of
  8.  * Energy and the University of California.
  9.  * 
  10.  * This program may be redistributed.  Enhancements and derivative works
  11.  * may be created provided the new works, if made available to the general
  12.  * public, are made available for use by anyone.
  13.  */
  14.  
  15. #include "flexdef.h"
  16. #include "ccl.h"
  17. #include "misc.h"
  18.  
  19. /* ccladd - add a single character to a ccl
  20.  *
  21.  * synopsis
  22.  *    int cclp;
  23.  *    char ch;
  24.  *    ccladd( cclp, ch );
  25.  */
  26.  
  27. void ccladd( cclp, ch )
  28. int cclp;
  29. char ch;
  30.  
  31. {
  32.     int ind, len, newpos, i;
  33.  
  34.     len = ccllen[cclp];
  35.     ind = cclmap[cclp];
  36.  
  37.     /* check to see if the character is already in the ccl */
  38.  
  39.     for ( i = 0; i < len; ++i )
  40.         if ( ccltbl[ind + i] == ch )
  41.             return;
  42.  
  43.     newpos = ind + len;
  44.  
  45.     if ( newpos >= current_max_ccl_tbl_size )
  46.     {
  47.         current_max_ccl_tbl_size += MAX_CCL_TBL_SIZE_INCREMENT;
  48.  
  49.         ++num_reallocs;
  50.  
  51.         ccltbl = reallocate_character_array( ccltbl, current_max_ccl_tbl_size );
  52.     }
  53.  
  54.     ccllen[cclp] = len + 1;
  55.     ccltbl[newpos] = ch;
  56. }
  57.  
  58.  
  59. /* cclinit - make an empty ccl
  60.  *
  61.  * synopsis
  62.  *    int cclinit();
  63.  *    new_ccl = cclinit();
  64.  */
  65.  
  66. int cclinit()
  67.  
  68. {
  69.     if ( ++lastccl >= current_maxccls )
  70.     {
  71.         current_maxccls += MAXCCLS_INCREMENT;
  72.  
  73.         ++num_reallocs;
  74.  
  75.         cclmap = reallocate_integer_array( cclmap, current_maxccls );
  76.         ccllen = reallocate_integer_array( ccllen, current_maxccls );
  77.         cclng = reallocate_integer_array( cclng, current_maxccls );
  78.     }
  79.  
  80.     if ( lastccl == 1 )
  81.         /* we're making the first ccl */
  82.         cclmap[lastccl] = 0;
  83.  
  84.     else
  85.         /* the new pointer is just past the end of the last ccl.  Since
  86.          * the cclmap points to the \first/ character of a ccl, adding the
  87.          * length of the ccl to the cclmap pointer will produce a cursor
  88.          * to the first free space
  89.          */
  90.         cclmap[lastccl] = cclmap[lastccl - 1] + ccllen[lastccl - 1];
  91.  
  92.     ccllen[lastccl] = 0;
  93.     cclng[lastccl] = 0; /* ccl's start out life un-negated */
  94.  
  95.     return ( lastccl );
  96. }
  97.  
  98.  
  99. /* cclnegate - negate a ccl
  100.  *
  101.  * synopsis
  102.  *    int cclp;
  103.  *    cclnegate( ccl );
  104.  */
  105.  
  106. void cclnegate( cclp )
  107. int cclp;
  108.  
  109. {
  110.     cclng[cclp] = 1;
  111. }
  112.