ccl.c (3756B)
1 /* $OpenBSD: ccl.c,v 1.6 2003/06/04 17:34:44 millert Exp $ */ 2 3 /* ccl - routines for character classes */ 4 5 /*- 6 * Copyright (c) 1990 The Regents of the University of California. 7 * All rights reserved. 8 * 9 * This code is derived from software contributed to Berkeley by 10 * Vern Paxson. 11 * 12 * The United States Government has rights in this work pursuant 13 * to contract no. DE-AC03-76SF00098 between the United States 14 * Department of Energy and the University of California. 15 * 16 * Redistribution and use in source and binary forms, with or without 17 * modification, are permitted provided that the following conditions 18 * are met: 19 * 20 * 1. Redistributions of source code must retain the above copyright 21 * notice, this list of conditions and the following disclaimer. 22 * 2. Redistributions in binary form must reproduce the above copyright 23 * notice, this list of conditions and the following disclaimer in the 24 * documentation and/or other materials provided with the distribution. 25 * 26 * Neither the name of the University nor the names of its contributors 27 * may be used to endorse or promote products derived from this software 28 * without specific prior written permission. 29 * 30 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 31 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 32 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 33 * PURPOSE. 34 */ 35 36 /* $Header: /cvs/src/usr.bin/lex/ccl.c,v 1.6 2003/06/04 17:34:44 millert Exp $ */ 37 38 #include "flexdef.h" 39 40 /* ccladd - add a single character to a ccl */ 41 42 void ccladd( cclp, ch ) 43 int cclp; 44 int ch; 45 { 46 int ind, len, newpos, i; 47 48 check_char( ch ); 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, 68 current_max_ccl_tbl_size ); 69 } 70 71 ccllen[cclp] = len + 1; 72 ccltbl[newpos] = ch; 73 } 74 75 76 /* cclinit - return an empty ccl */ 77 78 int cclinit() 79 { 80 if ( ++lastccl >= current_maxccls ) 81 { 82 current_maxccls += MAX_CCLS_INCREMENT; 83 84 ++num_reallocs; 85 86 cclmap = reallocate_integer_array( cclmap, current_maxccls ); 87 ccllen = reallocate_integer_array( ccllen, current_maxccls ); 88 cclng = reallocate_integer_array( cclng, current_maxccls ); 89 } 90 91 if ( lastccl == 1 ) 92 /* we're making the first ccl */ 93 cclmap[lastccl] = 0; 94 95 else 96 /* The new pointer is just past the end of the last ccl. 97 * Since the cclmap points to the \first/ character of a 98 * ccl, adding the length of the ccl to the cclmap pointer 99 * will produce a cursor to the first free space. 100 */ 101 cclmap[lastccl] = cclmap[lastccl - 1] + ccllen[lastccl - 1]; 102 103 ccllen[lastccl] = 0; 104 cclng[lastccl] = 0; /* ccl's start out life un-negated */ 105 106 return lastccl; 107 } 108 109 110 /* cclnegate - negate the given ccl */ 111 112 void cclnegate( cclp ) 113 int cclp; 114 { 115 cclng[cclp] = 1; 116 } 117 118 119 /* list_character_set - list the members of a set of characters in CCL form 120 * 121 * Writes to the given file a character-class representation of those 122 * characters present in the given CCL. A character is present if it 123 * has a non-zero value in the cset array. 124 */ 125 126 void list_character_set( file, cset ) 127 FILE *file; 128 int cset[]; 129 { 130 int i; 131 132 putc( '[', file ); 133 134 for ( i = 0; i < csize; ++i ) 135 { 136 if ( cset[i] ) 137 { 138 int start_char = i; 139 140 putc( ' ', file ); 141 142 fputs( readable_form( i ), file ); 143 144 while ( ++i < csize && cset[i] ) 145 ; 146 147 if ( i - 1 > start_char ) 148 /* this was a run */ 149 fprintf( file, "-%s", readable_form( i - 1 ) ); 150 151 putc( ' ', file ); 152 } 153 } 154 155 putc( ']', file ); 156 }