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