|
|
1.1 ! root 1: /*- ! 2: * Copyright (c) 1990 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * This code is derived from software contributed to Berkeley by ! 6: * Vern Paxson. ! 7: * ! 8: * The United States Government has rights in this work pursuant ! 9: * to contract no. DE-AC03-76SF00098 between the United States ! 10: * Department of Energy and the University of California. ! 11: * ! 12: * Redistribution and use in source and binary forms are permitted provided ! 13: * that: (1) source distributions retain this entire copyright notice and ! 14: * comment, and (2) distributions including binaries display the following ! 15: * acknowledgement: ``This product includes software developed by the ! 16: * University of California, Berkeley and its contributors'' in the ! 17: * documentation or other materials provided with the distribution and in ! 18: * all advertising materials mentioning features or use of this software. ! 19: * Neither the name of the University nor the names of its contributors may ! 20: * be used to endorse or promote products derived from this software without ! 21: * specific prior written permission. ! 22: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ! 23: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ! 24: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 25: */ ! 26: ! 27: #ifndef lint ! 28: static char sccsid[] = "@(#)ccl.c 5.2 (Berkeley) 6/18/90"; ! 29: #endif /* not lint */ ! 30: ! 31: /* ccl - routines for character classes */ ! 32: ! 33: #include "flexdef.h" ! 34: ! 35: /* ccladd - add a single character to a ccl ! 36: * ! 37: * synopsis ! 38: * int cclp; ! 39: * int ch; ! 40: * ccladd( cclp, ch ); ! 41: */ ! 42: ! 43: void ccladd( cclp, ch ) ! 44: int cclp; ! 45: int ch; ! 46: ! 47: { ! 48: int ind, len, newpos, i; ! 49: ! 50: len = ccllen[cclp]; ! 51: ind = cclmap[cclp]; ! 52: ! 53: /* check to see if the character is already in the ccl */ ! 54: ! 55: for ( i = 0; i < len; ++i ) ! 56: if ( ccltbl[ind + i] == ch ) ! 57: return; ! 58: ! 59: newpos = ind + len; ! 60: ! 61: if ( newpos >= current_max_ccl_tbl_size ) ! 62: { ! 63: current_max_ccl_tbl_size += MAX_CCL_TBL_SIZE_INCREMENT; ! 64: ! 65: ++num_reallocs; ! 66: ! 67: ccltbl = reallocate_character_array( ccltbl, current_max_ccl_tbl_size ); ! 68: } ! 69: ! 70: ccllen[cclp] = len + 1; ! 71: ccltbl[newpos] = ch; ! 72: } ! 73: ! 74: ! 75: /* cclinit - make an empty ccl ! 76: * ! 77: * synopsis ! 78: * int cclinit(); ! 79: * new_ccl = cclinit(); ! 80: */ ! 81: ! 82: int cclinit() ! 83: ! 84: { ! 85: if ( ++lastccl >= current_maxccls ) ! 86: { ! 87: current_maxccls += MAX_CCLS_INCREMENT; ! 88: ! 89: ++num_reallocs; ! 90: ! 91: cclmap = reallocate_integer_array( cclmap, current_maxccls ); ! 92: ccllen = reallocate_integer_array( ccllen, current_maxccls ); ! 93: cclng = reallocate_integer_array( cclng, current_maxccls ); ! 94: } ! 95: ! 96: if ( lastccl == 1 ) ! 97: /* we're making the first ccl */ ! 98: cclmap[lastccl] = 0; ! 99: ! 100: else ! 101: /* the new pointer is just past the end of the last ccl. Since ! 102: * the cclmap points to the \first/ character of a ccl, adding the ! 103: * length of the ccl to the cclmap pointer will produce a cursor ! 104: * to the first free space ! 105: */ ! 106: cclmap[lastccl] = cclmap[lastccl - 1] + ccllen[lastccl - 1]; ! 107: ! 108: ccllen[lastccl] = 0; ! 109: cclng[lastccl] = 0; /* ccl's start out life un-negated */ ! 110: ! 111: return ( lastccl ); ! 112: } ! 113: ! 114: ! 115: /* cclnegate - negate a ccl ! 116: * ! 117: * synopsis ! 118: * int cclp; ! 119: * cclnegate( ccl ); ! 120: */ ! 121: ! 122: void cclnegate( cclp ) ! 123: int cclp; ! 124: ! 125: { ! 126: cclng[cclp] = 1; ! 127: } ! 128: ! 129: ! 130: /* list_character_set - list the members of a set of characters in CCL form ! 131: * ! 132: * synopsis ! 133: * int cset[CSIZE]; ! 134: * FILE *file; ! 135: * list_character_set( cset ); ! 136: * ! 137: * writes to the given file a character-class representation of those ! 138: * characters present in the given set. A character is present if it ! 139: * has a non-zero value in the set array. ! 140: */ ! 141: ! 142: void list_character_set( file, cset ) ! 143: FILE *file; ! 144: int cset[]; ! 145: ! 146: { ! 147: register int i; ! 148: char *readable_form(); ! 149: ! 150: putc( '[', file ); ! 151: ! 152: for ( i = 0; i < csize; ++i ) ! 153: { ! 154: if ( cset[i] ) ! 155: { ! 156: register int start_char = i; ! 157: ! 158: putc( ' ', file ); ! 159: ! 160: fputs( readable_form( i ), file ); ! 161: ! 162: while ( ++i < csize && cset[i] ) ! 163: ; ! 164: ! 165: if ( i - 1 > start_char ) ! 166: /* this was a run */ ! 167: fprintf( file, "-%s", readable_form( i - 1 ) ); ! 168: ! 169: putc( ' ', file ); ! 170: } ! 171: } ! 172: ! 173: putc( ']', file ); ! 174: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.