home *** CD-ROM | disk | FTP | other *** search
- -- Copyright (c) 1990 Regents of the University of California.
- -- All rights reserved.
- --
- -- This software was developed by John Self of the Arcadia project
- -- at the University of California, Irvine.
- --
- -- Redistribution and use in source and binary forms are permitted
- -- provided that the above copyright notice and this paragraph are
- -- duplicated in all such forms and that any documentation,
- -- advertising materials, and other materials related to such
- -- distribution and use acknowledge that the software was developed
- -- by the University of California, Irvine. The name of the
- -- University may not be used to endorse or promote products derived
- -- from this software without specific prior written permission.
- -- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- -- IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- -- WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
-
- -- TITLE character classes routines
- -- AUTHOR: John Self (UCI)
- -- DESCRIPTION routines for character classes like [abc]
- -- $Header: /dc/uc/self/arcadia/aflex/ada/src/RCS/cclB.a,v 1.7 1993/04/27 23:17:15 self Exp $
-
- with MISC_DEFS, TEXT_IO, MISC, TSTRING; use MISC_DEFS, TEXT_IO;
- package body CCL is
-
- -- ccladd - add a single character to a ccl
- procedure CCLADD(CCLP : in INTEGER;
- CH : in CHARACTER) is
- IND, LEN, NEWPOS : INTEGER;
- begin
- LEN := CCLLEN(CCLP);
- IND := CCLMAP(CCLP);
-
- -- check to see if the character is already in the ccl
- for I in 0 .. LEN - 1 loop
- if (CCLTBL(IND + I) = CH) then
- return;
- end if;
- end loop;
-
- NEWPOS := IND + LEN;
-
- if (NEWPOS >= CURRENT_MAX_CCL_TBL_SIZE) then
- CURRENT_MAX_CCL_TBL_SIZE := CURRENT_MAX_CCL_TBL_SIZE +
- MAX_CCL_TBL_SIZE_INCREMENT;
-
- NUM_REALLOCS := NUM_REALLOCS + 1;
-
- REALLOCATE_CHARACTER_ARRAY(CCLTBL, CURRENT_MAX_CCL_TBL_SIZE);
- end if;
-
- CCLLEN(CCLP) := LEN + 1;
- CCLTBL(NEWPOS) := CH;
-
- end CCLADD;
-
- -- cclinit - make an empty ccl
-
- function CCLINIT return INTEGER is
- begin
- LASTCCL := LASTCCL + 1;
- if (LASTCCL >= CURRENT_MAXCCLS) then
- CURRENT_MAXCCLS := CURRENT_MAXCCLS + MAX_CCLS_INCREMENT;
-
- NUM_REALLOCS := NUM_REALLOCS + 1;
-
- REALLOCATE_INTEGER_ARRAY(CCLMAP, CURRENT_MAXCCLS);
- REALLOCATE_INTEGER_ARRAY(CCLLEN, CURRENT_MAXCCLS);
- REALLOCATE_INTEGER_ARRAY(CCLNG, CURRENT_MAXCCLS);
- end if;
-
- if (LASTCCL = 1) then
-
- -- we're making the first ccl
- CCLMAP(LASTCCL) := 0;
-
- else
-
- -- the new pointer is just past the end of the last ccl. Since
- -- the cclmap points to the \first/ character of a ccl, adding the
- -- length of the ccl to the cclmap pointer will produce a cursor
- -- to the first free space
- CCLMAP(LASTCCL) := CCLMAP(LASTCCL - 1) + CCLLEN(LASTCCL - 1);
- end if;
-
- CCLLEN(LASTCCL) := 0;
- CCLNG(LASTCCL) := 0;
-
- -- ccl's start out life un-negated
- return LASTCCL;
- end CCLINIT;
-
- -- cclnegate - negate a ccl
-
- procedure CCLNEGATE(CCLP : in INTEGER) is
- begin
- CCLNG(CCLP) := 1;
- end CCLNEGATE;
-
- -- list_character_set - list the members of a set of characters in CCL form
- --
- -- writes to the given file a character-class representation of those
- -- characters present in the given set. A character is present if it
- -- has a non-zero value in the set array.
-
- procedure LIST_CHARACTER_SET(F : in FILE_TYPE;
- CSET : in C_SIZE_BOOL_ARRAY) is
- I, START_CHAR : INTEGER;
- begin
- TEXT_IO.PUT(F, '[');
-
- I := 1;
- while (I <= CSIZE) loop
- if (CSET(I)) then
- START_CHAR := I;
-
- TEXT_IO.PUT(F, ' ');
-
- TSTRING.PUT(F, MISC.READABLE_FORM(CHARACTER'VAL(I)));
-
- I := I + 1;
- while ((I <= CSIZE) and then (CSET(I))) loop
- I := I + 1;
- end loop;
-
- if (I - 1 > START_CHAR) then
-
- -- this was a run
- TEXT_IO.PUT(F, "-");
- TSTRING.PUT(F, MISC.READABLE_FORM(CHARACTER'VAL(I - 1)));
- end if;
-
- TEXT_IO.PUT(F, ' ');
- end if;
- I := I + 1;
- end loop;
-
- TEXT_IO.PUT(F, ']');
- end LIST_CHARACTER_SET;
- end CCL;
-