DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ B T ┃
Length: 19333 (0x4b85) Types: TextFile Names: »B«
└─⟦a7d1ea751⟧ Bits:30000550 8mm tape, Rational 1000, !users!projects 94_04_11 └─ ⟦129cab021⟧ »DATA« └─⟦this⟧ └─⟦2f6cfab89⟧ Bits:30000547 8mm tape, Rational 1000, !projects 94-01-04 └─ ⟦d65440be7⟧ »DATA« └─⟦this⟧
with Misc_Defs, Tstring, Text_Io, Misc, Main_Body; with Int_Io, Calendar, External_File_Manager; use Misc, Misc_Defs, Text_Io, External_File_Manager; package body Misc is use Tstring; -- action_out - write the actions from the temporary file to lex.yy.c procedure Action_Out is Buf : Vstring; begin while (not Text_Io.End_Of_File (Temp_Action_File)) loop Tstring.Get_Line (Temp_Action_File, Buf); if ((Tstring.Len (Buf) >= 2) and then ((Char (Buf, 1) = '%') and (Char (Buf, 2) = '%'))) then exit; else Tstring.Put_Line (Buf); end if; end loop; end Action_Out; -- bubble - bubble sort an integer array in increasing order -- -- description -- sorts the first n elements of array v and replaces them in -- increasing order. -- -- passed -- v - the array to be sorted -- n - the number of elements of 'v' to be sorted procedure Bubble (V : in Int_Ptr; N : in Integer) is K : Integer; begin for I in reverse 2 .. N loop for J in 1 .. I - 1 loop if (V (J) > V (J + 1)) then -- compare K := V (J); -- exchange V (J) := V (J + 1); V (J + 1) := K; end if; end loop; end loop; end Bubble; -- clower - replace upper-case letter to lower-case function Clower (C : in Integer) return Integer is begin if (Isupper (Character'Val (C))) then return Tolower (C); else return C; end if; end Clower; -- cshell - shell sort a character array in increasing order -- -- description -- does a shell sort of the first n elements of array v. -- -- passed -- v - array to be sorted -- n - number of elements of v to be sorted procedure Cshell (V : in out Char_Array; N : in Integer) is Gap, J, Jg : Integer; K : Character; Lower_Bound : Integer := V'First; begin Gap := N / 2; while Gap > 0 loop for I in Gap .. N - 1 loop J := I - Gap; while (J >= 0) loop Jg := J + Gap; if (V (J + Lower_Bound) <= V (Jg + Lower_Bound)) then exit; end if; K := V (J + Lower_Bound); V (J + Lower_Bound) := V (Jg + Lower_Bound); V (Jg + Lower_Bound) := K; J := J - Gap; end loop; end loop; Gap := Gap / 2; end loop; end Cshell; -- dataend - finish up a block of data declarations procedure Dataend is begin if (Datapos > 0) then Dataflush; -- add terminator for initialization Text_Io.Put_Line (" ) ;"); Text_Io.New_Line; Dataline := 0; end if; end Dataend; -- dataflush - flush generated data statements procedure Dataflush (File : in File_Type) is begin Text_Io.New_Line (File); Dataline := Dataline + 1; if (Dataline >= Numdatalines) then -- put out a blank line so that the table is grouped into -- large blocks that enable the user to find elements easily Text_Io.New_Line (File); Dataline := 0; end if; -- reset the number of characters written on the current line Datapos := 0; end Dataflush; procedure Dataflush is begin Dataflush (Current_Output); end Dataflush; -- aflex_gettime - return current time function Aflex_Gettime return Vstring is use Tstring, Calendar; Current_Time : Time; Current_Year : Year_Number; Current_Month : Month_Number; Current_Day : Day_Number; Current_Seconds : Day_Duration; Month_String, Hour_String, Minute_String, Second_String : Vstring; Hour, Minute, Second : Integer; Seconds_Per_Hour : constant Day_Duration := 3600.0; begin Current_Time := Clock; Split (Current_Time, Current_Year, Current_Month, Current_Day, Current_Seconds); case Current_Month is when 1 => Month_String := Vstr ("Jan"); when 2 => Month_String := Vstr ("Feb"); when 3 => Month_String := Vstr ("Mar"); when 4 => Month_String := Vstr ("Apr"); when 5 => Month_String := Vstr ("May"); when 6 => Month_String := Vstr ("Jun"); when 7 => Month_String := Vstr ("Jul"); when 8 => Month_String := Vstr ("Aug"); when 9 => Month_String := Vstr ("Sep"); when 10 => Month_String := Vstr ("Oct"); when 11 => Month_String := Vstr ("Nov"); when 12 => Month_String := Vstr ("Dec"); end case; Hour := Integer (Current_Seconds) / Integer (Seconds_Per_Hour); Minute := Integer ((Current_Seconds - (Hour * Seconds_Per_Hour)) / 60); Second := Integer (Current_Seconds - Hour * Seconds_Per_Hour - Minute * 60.0); if (Hour >= 10) then Hour_String := Vstr (Integer'Image (Hour)); else Hour_String := Vstr ("0" & Integer'Image (Hour)); end if; if (Minute >= 10) then Minute_String := Vstr (Integer'Image (Minute) (2 .. Integer'Image (Minute)'Length)); else Minute_String := Vstr ("0" & Integer'Image (Minute) (2 .. Integer'Image (Minute)'Length)); end if; if (Second >= 10) then Second_String := Vstr (Integer'Image (Second) (2 .. Integer'Image (Second)'Length)); else Second_String := Vstr ("0" & Integer'Image (Second) (2 .. Integer'Image (Second)'Length)); end if; return Month_String & Vstr (Integer'Image (Current_Day)) & Hour_String & ":" & Minute_String & ":" & Second_String & Integer'Image (Current_Year); end Aflex_Gettime; -- aflexerror - report an error message and terminate -- overloaded function, one for vstring, one for string. procedure Aflexerror (Msg : in Vstring) is use Text_Io; begin Tstring.Put (Standard_Error, "aflex: " & Msg); Text_Io.New_Line (Standard_Error); Main_Body.Aflexend (1); end Aflexerror; procedure Aflexerror (Msg : in String) is use Text_Io; begin Text_Io.Put (Standard_Error, "aflex: " & Msg); Text_Io.New_Line (Standard_Error); Main_Body.Aflexend (1); end Aflexerror; -- aflexfatal - report a fatal error message and terminate -- overloaded function, one for vstring, one for string. procedure Aflexfatal (Msg : in Vstring) is use Text_Io; begin Tstring.Put (Standard_Error, "aflex: fatal internal error " & Msg); Text_Io.New_Line (Standard_Error); Main_Body.Aflexend (1); end Aflexfatal; procedure Aflexfatal (Msg : in String) is use Text_Io; begin Text_Io.Put (Standard_Error, "aflex: fatal internal error " & Msg); Text_Io.New_Line (Standard_Error); Main_Body.Aflexend (1); end Aflexfatal; -- basename - find the basename of a file function Basename return Vstring is End_Char_Pos : Integer := Len (Infilename); Start_Char_Pos : Integer; begin if (End_Char_Pos = 0) then -- if reading standard input give everything this name return Vstr ("aflex_yy"); end if; -- find out where the end of the basename is while ((End_Char_Pos >= 1) and then (Char (Infilename, End_Char_Pos) /= '.')) loop End_Char_Pos := End_Char_Pos - 1; end loop; -- find out where the beginning of the basename is Start_Char_Pos := End_Char_Pos; -- start at the end of the basename while ((Start_Char_Pos > 1) and then (Char (Infilename, Start_Char_Pos) /= '/')) loop Start_Char_Pos := Start_Char_Pos - 1; end loop; if (Char (Infilename, Start_Char_Pos) = '/') then Start_Char_Pos := Start_Char_Pos + 1; end if; if (End_Char_Pos >= 1) then return Slice (Infilename, Start_Char_Pos, End_Char_Pos - 1); else return Infilename; end if; end Basename; -- line_directive_out - spit out a "# line" statement procedure Line_Directive_Out (Output_File_Name : in File_Type) is begin if (Gen_Line_Dirs) then Text_Io.Put (Output_File_Name, "--# line "); Int_Io.Put (Output_File_Name, Linenum, 1); Text_Io.Put (Output_File_Name, " """); Tstring.Put (Output_File_Name, Infilename); Text_Io.Put_Line (Output_File_Name, """"); end if; end Line_Directive_Out; procedure Line_Directive_Out is begin if (Gen_Line_Dirs) then Text_Io.Put ("--# line "); Int_Io.Put (Linenum, 1); Text_Io.Put (" """); Tstring.Put (Infilename); Text_Io.Put_Line (""""); end if; end Line_Directive_Out; -- all_upper - returns true if a string is all upper-case function All_Upper (Str : in Vstring) return Boolean is begin for I in 1 .. Len (Str) loop if (not ((Char (Str, I) >= 'A') and (Char (Str, I) <= 'Z'))) then return False; end if; end loop; return True; end All_Upper; -- all_lower - returns true if a string is all lower-case function All_Lower (Str : in Vstring) return Boolean is begin for I in 1 .. Len (Str) loop if (not ((Char (Str, I) >= 'a') and (Char (Str, I) <= 'z'))) then return False; end if; end loop; return True; end All_Lower; -- mk2data - generate a data statement for a two-dimensional array -- -- generates a data statement initializing the current 2-D array to "value" procedure Mk2data (File : in File_Type; Value : in Integer) is begin if (Datapos >= Numdataitems) then Text_Io.Put (File, ','); Dataflush (File); end if; if (Datapos = 0) then -- indent Text_Io.Put (File, " "); else Text_Io.Put (File, ','); end if; Datapos := Datapos + 1; Int_Io.Put (File, Value, 5); end Mk2data; procedure Mk2data (Value : in Integer) is begin Mk2data (Current_Output, Value); end Mk2data; -- -- generates a data statement initializing the current array element to -- "value" procedure Mkdata (Value : in Integer) is begin if (Datapos >= Numdataitems) then Text_Io.Put (','); Dataflush; end if; if (Datapos = 0) then -- indent Text_Io.Put (" "); else Text_Io.Put (','); end if; Datapos := Datapos + 1; Int_Io.Put (Value, 5); end Mkdata; -- myctoi - return the integer represented by a string of digits function Myctoi (Num_Array : in Vstring) return Integer is Total : Integer := 0; Cnt : Integer := Tstring.First; begin while (Cnt <= Tstring.Len (Num_Array)) loop Total := Total * 10; Total := Total + Character'Pos (Char (Num_Array, Cnt)) - Character'Pos ('0'); Cnt := Cnt + 1; end loop; return Total; end Myctoi; -- myesc - return character corresponding to escape sequence function Myesc (Arr : in Vstring) return Character is use Text_Io; begin case (Char (Arr, Tstring.First + 1)) is when 'a' => return Ascii.Bel; when 'b' => return Ascii.Bs; when 'f' => return Ascii.Ff; when 'n' => return Ascii.Lf; when 'r' => return Ascii.Cr; when 't' => return Ascii.Ht; when 'v' => return Ascii.Vt; when '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' => -- \<octal> declare C, Esc_Char : Character; Sptr : Integer := Tstring.First + 1; begin Esc_Char := Otoi (Tstring.Slice (Arr, Tstring.First + 1, Tstring.Len (Arr))); if (Esc_Char = Ascii.Nul) then Misc.Synerr ("escape sequence for null not allowed"); return Ascii.Soh; end if; return Esc_Char; end; when others => return Char (Arr, Tstring.First + 1); end case; end Myesc; -- otoi - convert an octal digit string to an integer value function Otoi (Str : in Vstring) return Character is Total : Integer := 0; Cnt : Integer := Tstring.First; begin while (Cnt <= Tstring.Len (Str)) loop Total := Total * 8; Total := Total + Character'Pos (Char (Str, Cnt)) - Character'Pos ('0'); Cnt := Cnt + 1; end loop; return Character'Val (Total); end Otoi; -- readable_form - return the the human-readable form of a character -- -- The returned string is in static storage. function Readable_Form (C : in Character) return Vstring is begin if ((Character'Pos (C) >= 0 and Character'Pos (C) < 32) or (C = Ascii.Del)) then case C is when Ascii.Lf => return (Vstr ("\n")); -- Newline when Ascii.Ht => return (Vstr ("\t")); -- Horizontal Tab when Ascii.Ff => return (Vstr ("\f")); -- Form Feed when Ascii.Cr => return (Vstr ("\r")); -- Carriage Return when Ascii.Bs => return (Vstr ("\b")); -- Backspace when others => return Vstr ("\" & Integer'Image (Character'Pos (C))); end case; elsif (C = ' ') then return Vstr ("' '"); else return Vstr (C); end if; end Readable_Form; -- transition_struct_out - output a yy_trans_info structure -- -- outputs the yy_trans_info structure with the two elements, element_v and -- element_n. Formats the output with spaces and carriage returns. procedure Transition_Struct_Out (Element_V, Element_N : in Integer) is begin Int_Io.Put (Element_V, 7); Text_Io.Put (", "); Int_Io.Put (Element_N, 5); Text_Io.Put (","); Datapos := Datapos + Trans_Struct_Print_Length; if (Datapos >= 75) then Text_Io.New_Line; Dataline := Dataline + 1; if (Dataline mod 10 = 0) then Text_Io.New_Line; end if; Datapos := 0; end if; end Transition_Struct_Out; function Set_Yy_Trailing_Head_Mask (Src : in Integer) return Integer is begin if (Check_Yy_Trailing_Head_Mask (Src) = 0) then return Src + Yy_Trailing_Head_Mask; else return Src; end if; end Set_Yy_Trailing_Head_Mask; function Check_Yy_Trailing_Head_Mask (Src : in Integer) return Integer is begin if (Src >= Yy_Trailing_Head_Mask) then return Yy_Trailing_Head_Mask; else return 0; end if; end Check_Yy_Trailing_Head_Mask; function Set_Yy_Trailing_Mask (Src : in Integer) return Integer is begin if (Check_Yy_Trailing_Mask (Src) = 0) then return Src + Yy_Trailing_Mask; else return Src; end if; end Set_Yy_Trailing_Mask; function Check_Yy_Trailing_Mask (Src : in Integer) return Integer is begin -- this test is whether both bits are on, or whether onlyy TRAIL_MASK is set if ((Src >= Yy_Trailing_Head_Mask + Yy_Trailing_Mask) or ((Check_Yy_Trailing_Head_Mask (Src) = 0) and (Src >= Yy_Trailing_Mask))) then return Yy_Trailing_Mask; else return 0; end if; end Check_Yy_Trailing_Mask; function Islower (C : in Character) return Boolean is begin return (C in 'a' .. 'z'); end Islower; function Isupper (C : in Character) return Boolean is begin return (C in 'A' .. 'Z'); end Isupper; function Isdigit (C : in Character) return Boolean is begin return (C in '0' .. '9'); end Isdigit; function Tolower (C : in Integer) return Integer is begin return C - Character'Pos ('A') + Character'Pos ('a'); end Tolower; procedure Synerr (Str : in String) is use Text_Io; begin Syntaxerror := True; Text_Io.Put (Standard_Error, "Syntax error at line "); Int_Io.Put (Standard_Error, Linenum); Text_Io.Put (Standard_Error, Str); Text_Io.New_Line (Standard_Error); end Synerr; end Misc; -- 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 miscellaneous aflex routines -- AUTHOR: John Self (UCI) -- DESCRIPTION -- NOTES contains functions used in various places throughout aflex. -- $Header: /co/ua/self/arcadia/aflex/ada/src/RCS/miscS.a,v 1.9 90/01/12 15:20:19 self Exp Locker: self $