with TEXT_IO; use TEXT_IO; with INTEGER_TEXT_IO; use INTEGER_TEXT_IO; with UATL_DATA_TYPES; use UATL_DATA_TYPES; with UATL_STIM_RESPONSE_TYPES; use UATL_STIM_RESPONSE_TYPES; with UATL_BUILDER_DATA; use UATL_BUILDER_DATA; with UATL_INTERACTIVE_IO; use UATL_INTERACTIVE_IO; with TEST_MANAGER_SCREEN_DISPLAY; use TEST_MANAGER_SCREEN_DISPLAY; with TEST_MANAGER_LOGICALS; use TEST_MANAGER_LOGICALS; with UNCHECKED_DEALLOCATION; package body UATL_MACRO_PROCESSING is type MAC_TYPES is (STIM_LIST,RESP_LIST,RESP_READ,ERR_LIST,EVENT_LIST, ACT_LIST,DEACT_LIST,MODIFIER,COMPARATOR, MODIFIER_NAME,COMPARATOR_NAME,CALL_PROCEDURE, PASS_MESSAGE_TYPE,DISCRIMINANT_TYPE,NONE); NUMBER_OF_ITEMS : array(MAC_TYPES) of NATURAL := (2,2,2,1,3,2,2,1,1,1,1,1,1,2,0); type MAC_SUBS_TYPE is array(MAC_TYPES) of BOOLEAN; package MAC_TYPES_IO is new ENUMERATION_IO(MAC_TYPES); use MAC_TYPES_IO; subtype LINE_STRING is STRING(1..80); type LINE_STRING_ARRAY is array(1..3) of LINE_STRING; type LINE_LENGTH_ARRAY is array(1..3) of NATURAL; type MAC_STATEMENTS_TYPE is record LIST_NUM : NATURAL; STATES : LINE_STRING_ARRAY; LENGTH : LINE_LENGTH_ARRAY; end record; TEXT_BUFF : array (1..128) of LINE_STRING; TEXT_LNGTH : array (1..128) of NATURAL; NUMLINES : NATURAL := 0; LAST_MAC : NATURAL := 0; STATE_PTR : NATURAL := 0; LIST_PTR : NATURAL := 1; NEW_LIST : BOOLEAN := FALSE; LIST_STATES : array (1..128) of NATURAL := (others => 0); MAC_STATES : array(1..256) of MAC_STATEMENTS_TYPE; MAC_SUBS : MAC_SUBS_TYPE := (others => FALSE); DOING_MAC : BOOLEAN := FALSE; COPY_LINE : STRING(1..80); END_COPY : NATURAL; MAC_LINE : STRING(1..80); END_MAC : NATURAL; MAC_POS : NATURAL; MOD_COMP : STRING(1..80); END_MC : NATURAL; CURRENT_MAC : MAC_TYPES := NONE; WORK_MAC : MAC_TYPES := NONE; COMPLETE_MAC : MAC_TYPES := NONE; ENAME : STRING(1..80); ELENGTH : NATURAL; CHOICE : INTEGER := 0; subtype TASK_NAME_STRING is STRING(1..80); TASK_NAMES : array (1..256) of TASK_NAME_STRING; TASK_LENGTHS : array (1..256) of NATURAL; TASK_NUMBER : NATURAL; subtype CONVERT_NAME_STRING is STRING(1..80); CON_NAMES : array (1..256) of CONVERT_NAME_STRING; CON_LENGTHS : array (1..256) of NATURAL; CON_NUMBER : NATURAL; subtype RESP_BUFFER_STRING is STRING(1..80); subtype RESP_SIZE_STRING is STRING(1..10); RESP_NAMES : array (1..256) of RESP_BUFFER_STRING; RESP_LENGTH1 : array (1..256) of NATURAL; RESP_SIZE : array (1..256) of RESP_SIZE_STRING; RESP_LENGTH2 : array (1..256) of NATURAL; RESP_NUMBER : NATURAL; subtype ERROR_INDEX_STRING is STRING(1..80); INDEX_NAMES : array (1..256) of ERROR_INDEX_STRING; INDEX_LENGTHS : array (1..256) of NATURAL; INDEX_NUMBER : NATURAL; CURRENT_NON_MAC : NATURAL := 0; CUR_MAC_PTR : NATURAL := 0; MSG_PTR : NATURAL := 0; PROC_PTR : NATURAL := 0; DISC_PTRS : array(1..3) of NATURAL; LAST_DISC : NATURAL := 0; MAC_FILE : FILE_TYPE; TEST_FILE : FILE_TYPE; PROC_FILE : FILE_TYPE; SPEC_FILE : FILE_TYPE; BODY_FILE : FILE_TYPE; procedure GET is new GET_INTEGER(INTEGER); procedure RELEASE is new UNCHECKED_DEALLOCATION(STRING,STRING_PTR); function THIS_IS_NULL (IN_STRING : in STRING) return BOOLEAN is begin if (IN_STRING(1) = 'N' or IN_STRING(1) = 'n') and (IN_STRING(2) = 'U' or IN_STRING(2) = 'u') and (IN_STRING(3) = 'L' or IN_STRING(3) = 'l') and (IN_STRING(4) = 'L' or IN_STRING(4) = 'l') then if IN_STRING'length >= 5 then if (IN_STRING(5) = ' ' or IN_STRING(5) = ',' or IN_STRING(5) = ')') then return TRUE; else return FALSE; end if; else return TRUE; end if; else return FALSE; end if; end THIS_IS_NULL; function THIS_IS_BEGIN (IN_STRING : in STRING) return BOOLEAN is IT_IS_BEGIN : BOOLEAN := FALSE; begin for I in 1..IN_STRING'last-4 loop if IN_STRING(I) /= ' ' then if (IN_STRING(I ) = 'B' or IN_STRING(I ) = 'b') and (IN_STRING(I+1) = 'E' or IN_STRING(I+1) = 'e') and (IN_STRING(I+2) = 'G' or IN_STRING(I+2) = 'g') and (IN_STRING(I+3) = 'I' or IN_STRING(I+3) = 'i') and (IN_STRING(I+4) = 'N' or IN_STRING(I+4) = 'n') then if IN_STRING'length >= I+5 then if (IN_STRING(I+5) = ' ' or IN_STRING(I+5) = '-') then IT_IS_BEGIN := TRUE; exit; else IT_IS_BEGIN := FALSE; end if; else IT_IS_BEGIN := TRUE; exit; end if; else IT_IS_BEGIN := FALSE; end if; end if; end loop; return IT_IS_BEGIN; end THIS_IS_BEGIN; function THIS_IS_PROC (IN_STRING : in STRING) return BOOLEAN is IT_IS_PROC : BOOLEAN := FALSE; begin for I in 1..IN_STRING'last-9 loop if IN_STRING(I) /= ' ' then if (IN_STRING(I ) = 'P' or IN_STRING(I ) = 'p') and (IN_STRING(I+1) = 'R' or IN_STRING(I+1) = 'r') and (IN_STRING(I+2) = 'O' or IN_STRING(I+2) = 'o') and (IN_STRING(I+3) = 'C' or IN_STRING(I+3) = 'c') and (IN_STRING(I+4) = 'E' or IN_STRING(I+4) = 'e') and (IN_STRING(I+5) = 'D' or IN_STRING(I+5) = 'd') and (IN_STRING(I+6) = 'U' or IN_STRING(I+6) = 'u') and (IN_STRING(I+7) = 'R' or IN_STRING(I+7) = 'r') and (IN_STRING(I+8) = 'E' or IN_STRING(I+8) = 'e') then if IN_STRING'length >= I+9 then if (IN_STRING(I+9) = ' ' or IN_STRING(I+9) = '-') then IT_IS_PROC := TRUE; exit; else IT_IS_PROC := FALSE; end if; else IT_IS_PROC := TRUE; exit; end if; else IT_IS_PROC := FALSE; end if; end if; end loop; return IT_IS_PROC; end THIS_IS_PROC; function MACRO_STATEMENT_POSITION (INP_STR : in STRING) return NATURAL is RESULT : NATURAL := 0; begin for I in INP_STR'range loop if INP_STR(I) /= ' ' then if INP_STR(I) = '@' then return I; end if; exit; end if; end loop; return RESULT; end MACRO_STATEMENT_POSITION; procedure NEXT_MAC_AND_INPUT_POSITION (INP : in STRING; START : in out NATURAL; MAC : out MAC_TYPES) is MAC_STRING : STRING(1..20) := (others => ' '); MAC_PTR : NATURAL := 0; START_PTR : NATURAL := START; begin loop if INP(START_PTR) /= ' ' and INP(START_PTR) /= '=' and INP(START_PTR) /= '>' then MAC_PTR := MAC_PTR + 1; MAC_STRING(MAC_PTR) := INP(START_PTR); else exit; end if; START_PTR := START_PTR + 1; end loop; loop if INP(START_PTR) = ' ' or INP(START_PTR) = '=' or INP(START_PTR) = '>' then START_PTR := START_PTR + 1; else exit; end if; end loop; GET(MAC_STRING(1..MAC_PTR),MAC,MAC_PTR); START := START_PTR; end NEXT_MAC_AND_INPUT_POSITION; procedure EXTRACT_DECLARED_ITEMS (ITEMS : in NATURAL) is ITM_PTR : NATURAL; TXT_BREAK : BOOLEAN; begin STATE_PTR := STATE_PTR + 1; for I in 1..ITEMS loop ITM_PTR := 0; TXT_BREAK := FALSE; loop if MAC_LINE(MAC_POS) /= ',' then if not(TXT_BREAK) then ITM_PTR := ITM_PTR + 1; MAC_STATES(STATE_PTR).STATES(I)(ITM_PTR) := MAC_LINE(MAC_POS); MAC_STATES(STATE_PTR).LENGTH(I) := ITM_PTR; MAC_STATES(STATE_PTR).LIST_NUM := LIST_PTR; else exit; end if; else TXT_BREAK := TRUE; end if; if MAC_POS < END_MAC then MAC_POS := MAC_POS + 1; else exit; end if; end loop; end loop; LIST_STATES(LIST_PTR) := LIST_STATES(LIST_PTR) + 1; end EXTRACT_DECLARED_ITEMS; procedure EXPAND_STIM_LIST is NEW_MSG_TYPE : BOOLEAN; CUR_STATE : NATURAL; begin CON_NUMBER := CON_NUMBER + 1; CON_LENGTHS(CON_NUMBER) := MAC_STATES(1).LENGTH(2); CON_NAMES(CON_NUMBER)(1..CON_LENGTHS(CON_NUMBER)) := MAC_STATES(1).STATES(2)(1..CON_LENGTHS(CON_NUMBER)) ; for I in 2..STATE_PTR loop NEW_MSG_TYPE := TRUE; CUR_STATE := I - 1; loop if MAC_STATES(I).STATES(2)(1..MAC_STATES(I).LENGTH(2)) = MAC_STATES(CUR_STATE) .STATES(2)(1..MAC_STATES(CUR_STATE).LENGTH(2)) then NEW_MSG_TYPE := FALSE; exit; end if; CUR_STATE := CUR_STATE - 1; exit when CUR_STATE < 1; end loop; if NEW_MSG_TYPE then CON_NUMBER := CON_NUMBER + 1; CON_LENGTHS(CON_NUMBER) := MAC_STATES(I).LENGTH(2); CON_NAMES(CON_NUMBER)(1..CON_LENGTHS(CON_NUMBER)) := MAC_STATES(I).STATES(2)(1..CON_LENGTHS(CON_NUMBER)) ; end if; end loop; PUT_LINE(TEST_FILE,SECOND_INDENT & USER_STIMS & BA_LIST_PTR); PUT(TEST_FILE,NEW_BA_LIST); if STATE_PTR = 1 then PUT(TEST_FILE,ONE_ARROW); end if; NEW_LINE(TEST_FILE); for I in 1..STATE_PTR loop PUT(TEST_FILE, NEW_BA_CON & MAC_STATES(I).STATES(1)(1..MAC_STATES(I).LENGTH(1)) & RIGHT_PAREN & RIGHT_PAREN); if I < STATE_PTR then PUT_LINE(TEST_FILE,COMMA); else PUT_LINE(TEST_FILE,PAREN_SEMI); end if; end loop; end EXPAND_STIM_LIST; procedure EXPAND_RESP_LIST is begin PUT_LINE(TEST_FILE,SECOND_INDENT & USER_RESPS & BA_LIST_PTR); PUT(TEST_FILE,NEW_BA_LIST); if STATE_PTR = 1 then PUT(TEST_FILE,ONE_ARROW); end if; NEW_LINE(TEST_FILE); for I in 1..STATE_PTR loop PUT(TEST_FILE, NULL_MOD_IND & MAC_STATES(I).STATES(1)(1..MAC_STATES(I).LENGTH(1)) ); RESP_NUMBER := RESP_NUMBER + 1; RESP_NAMES(RESP_NUMBER)(1..MAC_STATES(I).LENGTH(1)) := MAC_STATES(I).STATES(1)(1..MAC_STATES(I).LENGTH(1)) ; RESP_LENGTH1(RESP_NUMBER) := MAC_STATES(I).LENGTH(1); RESP_SIZE(RESP_NUMBER)(1..MAC_STATES(I).LENGTH(2)) := MAC_STATES(I).STATES(2)(1..MAC_STATES(I).LENGTH(2)) ; RESP_LENGTH2(RESP_NUMBER) := MAC_STATES(I).LENGTH(2); if I < STATE_PTR then PUT_LINE(TEST_FILE,COMMA); else PUT_LINE(TEST_FILE,PAREN_SEMI); end if; end loop; end EXPAND_RESP_LIST; procedure EXPAND_RESP_READ is NEW_MSG_TYPE : BOOLEAN; CUR_STATE : NATURAL; FIRST_STATE : NATURAL := 32767; begin for I in 1..STATE_PTR loop if not(THIS_IS_NULL(MAC_STATES(I).STATES(1)(1..4))) then CON_NUMBER := CON_NUMBER + 1; CON_LENGTHS(CON_NUMBER) := MAC_STATES(I).LENGTH(2); CON_NAMES(CON_NUMBER)(1..CON_LENGTHS(CON_NUMBER)) := MAC_STATES(I).STATES(2)(1..CON_LENGTHS(CON_NUMBER)) ; FIRST_STATE := I; exit; end if; end loop; for I in FIRST_STATE+1..STATE_PTR loop if not(THIS_IS_NULL(MAC_STATES(I).STATES(1)(1..4))) then NEW_MSG_TYPE := TRUE; CUR_STATE := I - 1; loop if not(THIS_IS_NULL(MAC_STATES(CUR_STATE).STATES(1)(1..4))) and MAC_STATES(I).STATES(2)(1..MAC_STATES(I).LENGTH(2)) = MAC_STATES(CUR_STATE).STATES(2) (1..MAC_STATES(CUR_STATE).LENGTH(2)) then NEW_MSG_TYPE := FALSE; exit; end if; CUR_STATE := CUR_STATE - 1; exit when CUR_STATE < FIRST_STATE; end loop; if NEW_MSG_TYPE then CON_NUMBER := CON_NUMBER + 1; CON_LENGTHS(CON_NUMBER) := MAC_STATES(I).LENGTH(2); CON_NAMES(CON_NUMBER)(1..CON_LENGTHS(CON_NUMBER)) := MAC_STATES(I).STATES(2)(1..CON_LENGTHS(CON_NUMBER)) ; end if; end if; end loop; PUT_LINE(TEST_FILE,SECOND_INDENT & USER_READS & BA_LIST_PTR); PUT(TEST_FILE,NEW_BA_LIST); if STATE_PTR = 1 then PUT(TEST_FILE,ONE_ARROW); end if; NEW_LINE(TEST_FILE); for I in 1..STATE_PTR loop if not(THIS_IS_NULL(MAC_STATES(I).STATES(1)(1..4))) then PUT(TEST_FILE, NEW_BA_CON & MAC_STATES(I).STATES(1)(1..MAC_STATES(I).LENGTH(1)) & RIGHT_PAREN & RIGHT_PAREN); else PUT(TEST_FILE, ONE_SPACE & FIRST_INDENT & NULL_MOD); end if; if I < STATE_PTR then PUT_LINE(TEST_FILE,COMMA); else PUT_LINE(TEST_FILE,PAREN_SEMI); end if; end loop; end EXPAND_RESP_READ; procedure EXPAND_ERR_LIST is begin PUT_LINE(TEST_FILE,SECOND_INDENT & USER_ERRS & ERR_LIST_ACC); PUT(TEST_FILE,NEW_ERR_LIST); if STATE_PTR = 1 then PUT(TEST_FILE,ONE_ARROW); end if; NEW_LINE(TEST_FILE); for I in 1..STATE_PTR loop PUT(TEST_FILE, NULL_MOD_IND & MAC_STATES(I).STATES(1)(1..MAC_STATES(I).LENGTH(1)) ); INDEX_NUMBER := INDEX_NUMBER + 1; INDEX_NAMES(INDEX_NUMBER)(1..MAC_STATES(I).LENGTH(1)) := MAC_STATES(I).STATES(1)(1..MAC_STATES(I).LENGTH(1)) ; INDEX_LENGTHS(INDEX_NUMBER) := MAC_STATES(I).LENGTH(1); if I < STATE_PTR then PUT_LINE(TEST_FILE,COMMA); else PUT_LINE(TEST_FILE,PAREN_SEMI); end if; end loop; end EXPAND_ERR_LIST; procedure EXPAND_EVENT_LIST is LOC_LIST : NATURAL; FIRST_EV : BOOLEAN; begin PUT_LINE(TEST_FILE,SECOND_INDENT & USER_TRIGS & TRIG_LISTS_ACC); PUT(TEST_FILE,NEW_TRIG_LISTS); if LIST_PTR-1 = 1 then PUT(TEST_FILE,ONE_ARROW); end if; NEW_LINE(TEST_FILE); PUT(TEST_FILE,NEW_TRIG_LIST); if LIST_STATES(1) = 1 then PUT(TEST_FILE,ONE_ARROW); end if; NEW_LINE(TEST_FILE); LOC_LIST := MAC_STATES(1).LIST_NUM; FIRST_EV := TRUE; for I in 1..STATE_PTR loop if LOC_LIST /= MAC_STATES(I).LIST_NUM then PUT_LINE(TEST_FILE,RIGHT_PAREN & RIGHT_PAREN & COMMA); PUT(TEST_FILE,NEW_TRIG_LIST); if LIST_STATES(MAC_STATES(I).LIST_NUM) = 1 then PUT(TEST_FILE,ONE_ARROW); end if; NEW_LINE(TEST_FILE); FIRST_EV := TRUE; end if; if FIRST_EV then FIRST_EV := FALSE; else PUT_LINE(TEST_FILE,COMMA); end if; ELENGTH := MAC_STATES(I).LENGTH(1); ENAME(1..ELENGTH) := MAC_STATES(I).STATES(1)(1..ELENGTH); PUT_LINE(TEST_FILE,NEW_ENAME & DOUBLE_Q & GET_EVENT(ENAME(1..ELENGTH)) & DOUBLE_Q & COMMA); PUT_LINE(TEST_FILE,NEW_ETYPE & MAC_STATES(I).STATES(2)(1..MAC_STATES(I).LENGTH(2)) & COMMA); PUT(TEST_FILE,NEW_ONOFF & MAC_STATES(I).STATES(3)(1..MAC_STATES(I).LENGTH(3)) & RIGHT_PAREN); if I >= STATE_PTR then PUT_LINE(TEST_FILE,RIGHT_PAREN & RIGHT_PAREN & PAREN_SEMI); end if; LOC_LIST := MAC_STATES(I).LIST_NUM; end loop; LIST_PTR := 1; end EXPAND_EVENT_LIST; procedure EXPAND_ACT_LIST is begin PUT_LINE(TEST_FILE,SECOND_INDENT & USER_ACTS & ACT_LIST_ACC); PUT(TEST_FILE,NEW_ACT_LIST); if STATE_PTR = 1 then PUT(TEST_FILE,ONE_ARROW); end if; NEW_LINE(TEST_FILE); for I in 1..STATE_PTR loop ELENGTH := MAC_STATES(I).LENGTH(1); ENAME(1..ELENGTH) := MAC_STATES(I).STATES(1)(1..ELENGTH); PUT_LINE(TEST_FILE,NEW_AD_ENAME & DOUBLE_Q & GET_EVENT(ENAME(1..ELENGTH)) & DOUBLE_Q & COMMA); PUT (TEST_FILE,NEW_AD_ETYPE & MAC_STATES(I).STATES(2)(1..MAC_STATES(I).LENGTH(2)) & RIGHT_PAREN); if I >= STATE_PTR then PUT_LINE(TEST_FILE,PAREN_SEMI); else PUT_LINE(TEST_FILE,COMMA); end if; end loop; end EXPAND_ACT_LIST; procedure EXPAND_DEACT_LIST is begin PUT_LINE(TEST_FILE,SECOND_INDENT & USER_DEACTS & DEACT_LIST_ACC); PUT(TEST_FILE,NEW_DEACT_LIST); if STATE_PTR = 1 then PUT(TEST_FILE,ONE_ARROW); end if; NEW_LINE(TEST_FILE); for I in 1..STATE_PTR loop ELENGTH := MAC_STATES(I).LENGTH(1); ENAME(1..ELENGTH) := MAC_STATES(I).STATES(1)(1..ELENGTH); PUT_LINE(TEST_FILE,NEW_AD_ENAME & DOUBLE_Q & GET_EVENT(ENAME(1..ELENGTH)) & DOUBLE_Q & COMMA); PUT (TEST_FILE,NEW_AD_ETYPE & MAC_STATES(I).STATES(2)(1..MAC_STATES(I).LENGTH(2)) & RIGHT_PAREN); if I >= STATE_PTR then PUT_LINE(TEST_FILE,PAREN_SEMI); else PUT_LINE(TEST_FILE,COMMA); end if; end loop; end EXPAND_DEACT_LIST; procedure EXPAND_MODIFIER is MOD_LINE : STRING(1..80); END_MOD : NATURAL; begin PUT_LINE(TEST_FILE,SECOND_INDENT & USER_MODS & MOD_LIST_PTR); PUT(TEST_FILE,NEW_MOD_LIST); if STATE_PTR = 1 then PUT(TEST_FILE,ONE_ARROW); end if; NEW_LINE(TEST_FILE); for I in 1..STATE_PTR loop END_MOD := MAC_STATES(I).LENGTH(1); MOD_LINE(1..END_MOD) := MAC_STATES(I).STATES(1)(1..END_MOD); if THIS_IS_NULL(MOD_LINE(1..4)) then PUT(TEST_FILE,NULL_MOD_IND & MOD_LINE(1..4)); else PUT(TEST_FILE, NEW_MOD & MOD_LINE(1..END_MOD) & RIGHT_PAREN); TASK_NUMBER := TASK_NUMBER + 1; TASK_NAMES (TASK_NUMBER) := MOD_LINE; TASK_LENGTHS(TASK_NUMBER) := END_MOD; end if; if I < STATE_PTR then PUT_LINE(TEST_FILE,COMMA); else PUT_LINE(TEST_FILE,PAREN_SEMI); end if; end loop; end EXPAND_MODIFIER; procedure EXPAND_COMPARATOR is COMP_LINE : STRING(1..80); END_COMP : NATURAL; begin PUT_LINE(TEST_FILE,SECOND_INDENT & USER_COMPS & COMP_LIST_PTR); PUT(TEST_FILE,NEW_COMP_LIST); if STATE_PTR = 1 then PUT(TEST_FILE,ONE_ARROW); end if; NEW_LINE(TEST_FILE); for I in 1..STATE_PTR loop END_COMP := MAC_STATES(I).LENGTH(1); COMP_LINE(1..END_COMP) := MAC_STATES(I).STATES(1)(1..END_COMP); if THIS_IS_NULL(COMP_LINE(1..4)) then PUT(TEST_FILE,NULL_MOD_IND & COMP_LINE(1..4)); else PUT(TEST_FILE, NEW_COMP & COMP_LINE(1..END_COMP) & RIGHT_PAREN); TASK_NUMBER := TASK_NUMBER + 1; TASK_NAMES (TASK_NUMBER) := COMP_LINE; TASK_LENGTHS(TASK_NUMBER) := END_COMP; end if; if I < STATE_PTR then PUT_LINE(TEST_FILE,COMMA); else PUT_LINE(TEST_FILE,PAREN_SEMI); end if; end loop; end EXPAND_COMPARATOR; procedure EXPAND_MACRO is begin for I in 1..LAST_MAC+1 loop PUT_LINE(TEST_FILE,TEXT_BUFF(I)(1..TEXT_LNGTH(I))); end loop; case COMPLETE_MAC is when STIM_LIST => EXPAND_STIM_LIST; when RESP_LIST => EXPAND_RESP_LIST; when RESP_READ => EXPAND_RESP_READ; when ERR_LIST => EXPAND_ERR_LIST; when EVENT_LIST => EXPAND_EVENT_LIST; when ACT_LIST => EXPAND_ACT_LIST; when DEACT_LIST => EXPAND_DEACT_LIST; when MODIFIER => EXPAND_MODIFIER; when COMPARATOR => EXPAND_COMPARATOR; when others => null; end case; for I in LAST_MAC+2..NUMLINES loop PUT_LINE(TEST_FILE,TEXT_BUFF(I)(1..TEXT_LNGTH(I))); end loop; COMPLETE_MAC := NONE; CURRENT_MAC := NONE; STATE_PTR := 0; NUMLINES := 0; LAST_MAC := 0; for I in 1..LIST_PTR loop LIST_STATES(I) := 0; end loop; end EXPAND_MACRO; procedure CREATE_USER_CONVERSIONS is NEW_CON : BOOLEAN; begin if CON_NUMBER > 0 then NEW_LINE(PROC_FILE); PUT_LINE(PROC_FILE, CONVERT_TO_BA); PUT_LINE(PROC_FILE, SECOND_INDENT & LEFT_PAREN & CON_NAMES(1)(1..CON_LENGTHS(1)) & PAREN_SEMI ); for I in reverse 2..CON_NUMBER loop NEW_CON := TRUE; for J in reverse 1..I-1 loop if CON_NAMES(J)(1..CON_LENGTHS(J)) = CON_NAMES(I)(1..CON_LENGTHS(I)) then NEW_CON := FALSE; exit; end if; end loop; if NEW_CON then PUT_LINE(PROC_FILE, CONVERT_TO_BA); PUT_LINE(PROC_FILE, SECOND_INDENT & LEFT_PAREN & CON_NAMES(I)(1..CON_LENGTHS(I)) & PAREN_SEMI); end if; end loop; CON_NUMBER := 0; end if; end CREATE_USER_CONVERSIONS; procedure CREATE_USER_TASKS is NEW_TASK_NAME : BOOLEAN; begin if TASK_NUMBER > 0 then NEW_LINE(PROC_FILE); for I in 1..TASK_NUMBER loop NEW_TASK_NAME := TRUE; for J in reverse 1..I-1 loop if TASK_NAMES(I)(1..TASK_LENGTHS(I)) = TASK_NAMES(J)(1..TASK_LENGTHS(J)) then NEW_TASK_NAME := FALSE; exit; end if; end loop; if NEW_TASK_NAME then PUT_LINE(PROC_FILE,FIRST_INDENT & (TASK_NAMES(I)(1..TASK_LENGTHS(I))) & ASSIGN_NEW & (TASK_NAMES(I)(1..TASK_LENGTHS(I))) & USCORE_TYPE & SEMICOLON); end if; end loop; TASK_NUMBER := 0; end if; end CREATE_USER_TASKS; procedure CREATE_USER_RESP_BUFFERS is NEW_BUFF_NAME : BOOLEAN; begin if RESP_NUMBER > 0 then NEW_LINE(PROC_FILE); for I in 1..RESP_NUMBER loop NEW_BUFF_NAME := TRUE; for J in reverse 1..I-1 loop if RESP_NAMES(I)(1..RESP_LENGTH1(I)) = RESP_NAMES(J)(1..RESP_LENGTH1(J)) then NEW_BUFF_NAME := FALSE; exit; end if; end loop; if NEW_BUFF_NAME then PUT_LINE(PROC_FILE,FIRST_INDENT & RESP_NAMES(I)(1..RESP_LENGTH1(I)) & BA_PTR_BUF); PUT_LINE(PROC_FILE,NEW_BA_BUF & RESP_SIZE(I)(1..RESP_LENGTH2(I)) & PAREN_SEMI); end if; end loop; RESP_NUMBER := 0; end if; end CREATE_USER_RESP_BUFFERS; procedure CREATE_USER_INDEX_BUFFERS is NEW_BUFF_NAME : BOOLEAN; begin if INDEX_NUMBER > 0 then NEW_LINE(PROC_FILE); for I in 1..INDEX_NUMBER loop NEW_BUFF_NAME := TRUE; for J in reverse 1..I-1 loop if INDEX_NAMES(I)(1..INDEX_LENGTHS(I)) = INDEX_NAMES(J)(1..INDEX_LENGTHS(J)) then NEW_BUFF_NAME := FALSE; exit; end if; end loop; if NEW_BUFF_NAME then PUT_LINE(PROC_FILE,FIRST_INDENT & INDEX_NAMES(I)(1..INDEX_LENGTHS(I)) & INDEX_PTR_BUF); end if; end loop; INDEX_NUMBER := 0; end if; end CREATE_USER_INDEX_BUFFERS; procedure TEST_MACRO_PROCESSOR (FILE_NAME : in STRING) is begin TASK_NUMBER := 0; CON_NUMBER := 0; RESP_NUMBER := 0; INDEX_NUMBER := 0; -- Open the macro input file OPEN ( FILE => MAC_FILE, MODE => IN_FILE, NAME => TEST_FILES.LOGICAL_STRING.ALL & ":" & FILE_NAME & "." & TEST_PROC_MACRO); -- Create the test output file CREATE ( FILE => TEST_FILE, MODE => OUT_FILE, NAME => BUILDER.LOGICAL_STRING.ALL & ":" & FILE_NAME & ".TPE"); -- Read the Mac input until end of file while not(END_OF_FILE(MAC_FILE)) loop -- Get the line and analyze it GET_LINE(MAC_FILE,MAC_LINE,END_MAC); -- See if we have a macro statement MAC_POS := MACRO_STATEMENT_POSITION(MAC_LINE); if MAC_POS /= 0 then MAC_LINE(1..2) := "--"; DOING_MAC := TRUE; CURRENT_NON_MAC := 0; MAC_POS := MAC_POS + 1; NEXT_MAC_AND_INPUT_POSITION(INP => MAC_LINE, START => MAC_POS, MAC => WORK_MAC); if WORK_MAC /= CURRENT_MAC and CURRENT_MAC /= NONE then COMPLETE_MAC := CURRENT_MAC; EXPAND_MACRO; end if; CURRENT_MAC := WORK_MAC; EXTRACT_DECLARED_ITEMS(NUMBER_OF_ITEMS(WORK_MAC)); -- Place into text buffer NUMLINES := NUMLINES + 1; LAST_MAC := NUMLINES; TEXT_LNGTH(NUMLINES) := END_MAC; TEXT_BUFF(NUMLINES)(1..END_MAC) := MAC_LINE(1..END_MAC); if CURRENT_MAC = EVENT_LIST then NEW_LIST := TRUE; end if; else if DOING_MAC then CURRENT_NON_MAC := CURRENT_NON_MAC + 1; if THIS_IS_BEGIN(MAC_LINE(1..END_MAC)) or CURRENT_NON_MAC > 10 then DOING_MAC := FALSE; COMPLETE_MAC := CURRENT_MAC; if NEW_LIST then LIST_PTR := LIST_PTR + 1; NEW_LIST := FALSE; end if; else if CURRENT_MAC /= NONE then -- Place into text buffer NUMLINES := NUMLINES + 1; TEXT_LNGTH(NUMLINES) := END_MAC; TEXT_BUFF(NUMLINES)(1..END_MAC) := MAC_LINE(1..END_MAC); if CURRENT_MAC = EVENT_LIST then if NEW_LIST then LIST_PTR := LIST_PTR + 1; NEW_LIST := FALSE; end if; else COMPLETE_MAC := CURRENT_MAC; end if; else PUT_LINE(TEST_FILE,MAC_LINE(1..END_MAC)); end if; end if; if COMPLETE_MAC /= NONE then EXPAND_MACRO; end if; if not(DOING_MAC) then PUT_LINE(TEST_FILE,MAC_LINE(1..END_MAC)); end if; else -- Place into output file PUT_LINE(TEST_FILE,MAC_LINE(1..END_MAC)); end if; end if; end loop; CLOSE(MAC_FILE); RESET(TEST_FILE,IN_FILE); -- Create the test output file CREATE ( FILE => PROC_FILE, MODE => OUT_FILE, NAME => TEST_FILES.LOGICAL_STRING.ALL & ":" & FILE_NAME & "." & SOURCE); while not(END_OF_FILE(TEST_FILE)) loop GET_LINE(TEST_FILE,COPY_LINE,END_COPY); PUT_LINE(PROC_FILE,COPY_LINE(1..END_COPY)); if RESP_NUMBER > 0 then if THIS_IS_PROC(COPY_LINE(1..END_COPY)) then CREATE_USER_RESP_BUFFERS; end if; end if; if INDEX_NUMBER > 0 then if THIS_IS_PROC(COPY_LINE(1..END_COPY)) then CREATE_USER_INDEX_BUFFERS; end if; end if; if CON_NUMBER > 0 then if THIS_IS_PROC(COPY_LINE(1..END_COPY)) then CREATE_USER_CONVERSIONS; end if; end if; if TASK_NUMBER > 0 then if THIS_IS_BEGIN(COPY_LINE(1..END_COPY)) then CREATE_USER_TASKS; end if; end if; end loop; DELETE(TEST_FILE); CLOSE(PROC_FILE); end TEST_MACRO_PROCESSOR; procedure MCS_MACRO_PROCESSOR (FILE_NAME : in STRING) is MAC_IN_PROGRESS : BOOLEAN := FALSE; begin -- Open the macro input file OPEN ( FILE => MAC_FILE, MODE => IN_FILE, NAME => COMP_MOD.LOGICAL_STRING.ALL & ":" & FILE_NAME & "." & COMP_MOD_MACRO); -- Create the test output files CREATE ( FILE => SPEC_FILE, MODE => OUT_FILE, NAME => COMP_MOD.LOGICAL_STRING.ALL & ":" & FILE_NAME & "_." & SOURCE); CREATE ( FILE => BODY_FILE, MODE => OUT_FILE, NAME => COMP_MOD.LOGICAL_STRING.ALL & ":" & FILE_NAME & "." & SOURCE); -- Write package body spec PUT_LINE(BODY_FILE,PACKAGE_BODY & FILE_NAME & IS_WORD); NEW_LINE(BODY_FILE,2); -- Read the Mac input until end of file while not(END_OF_FILE(MAC_FILE)) loop -- Get the line and analyze it GET_LINE(MAC_FILE,MAC_LINE,END_MAC); -- See if we have a macro statement MAC_POS := MACRO_STATEMENT_POSITION(MAC_LINE); if MAC_POS /= 0 then -- Comment out the macro statement MAC_LINE(1..2) := "--"; MAC_IN_PROGRESS := TRUE; -- Get the macro and where the input parameters begin MAC_POS := MAC_POS + 1; NEXT_MAC_AND_INPUT_POSITION(INP => MAC_LINE, START => MAC_POS, MAC => WORK_MAC); -- Get the macro input parameters EXTRACT_DECLARED_ITEMS(NUMBER_OF_ITEMS(WORK_MAC)); -- Set pointers to indicate where the statements are case WORK_MAC is when MODIFIER_NAME => CUR_MAC_PTR := STATE_PTR; CURRENT_MAC := MODIFIER_NAME; when COMPARATOR_NAME => CUR_MAC_PTR := STATE_PTR; CURRENT_MAC := COMPARATOR_NAME; when CALL_PROCEDURE => PROC_PTR := STATE_PTR; when PASS_MESSAGE_TYPE => MSG_PTR := STATE_PTR; when DISCRIMINANT_TYPE => if LAST_DISC <= 2 then LAST_DISC := LAST_DISC + 1; DISC_PTRS(LAST_DISC) := STATE_PTR; end if; when others => null; end case; -- Place into output file PUT_LINE(SPEC_FILE,MAC_LINE(1..END_MAC)); else -- Place into output file PUT_LINE(SPEC_FILE,MAC_LINE(1..END_MAC)); -- Blank line indicates the end of the macro if MAC_IN_PROGRESS then END_MC := MAC_STATES(CUR_MAC_PTR).LENGTH(1); MOD_COMP(1..END_MC) := MAC_STATES(CUR_MAC_PTR).STATES(1) (1..END_MC); PUT_LINE(SPEC_FILE, TASK_TYPE & MOD_COMP(1..END_MC) & USCORE_TYPE & IS_WORD); PUT_LINE(SPEC_FILE,PRIORITY_LINE); if CURRENT_MAC = MODIFIER_NAME then PUT_LINE(SPEC_FILE,MOD_ENTRY_1); else PUT_LINE(SPEC_FILE,COMP_ENTRY_1); PUT_LINE(SPEC_FILE,COMP_ENTRY_2); end if; PUT_LINE(SPEC_FILE,TASK_COMP_ENT); PUT_LINE(SPEC_FILE,END_TASK & MOD_COMP(1..END_MC) & USCORE_TYPE & SEMICOLON); PUT_LINE(SPEC_FILE,TYPE_WORD & MOD_COMP(1..END_MC) & U_TYPE_ACCESS); PUT_LINE(SPEC_FILE,IS_ACCESS & MOD_COMP(1..END_MC) & USCORE_TYPE & SEMICOLON); PUT_LINE(SPEC_FILE,FIRST_INDENT & MOD_COMP(1..END_MC) & COLON & MOD_COMP(1..END_MC) & U_TYPE_ACCESS & SEMICOLON); PUT_LINE(SPEC_FILE,CONVERT_1); PUT_LINE(SPEC_FILE,IS_NEW_UNCH & MOD_COMP(1..END_MC) & U_TYPE_ACCESS & COMMA); if CURRENT_MAC = MODIFIER_NAME then PUT_LINE(SPEC_FILE,MOD_ACCESS); else PUT_LINE(SPEC_FILE,COMP_ACCESS); end if; -- Write task into body PUT_LINE(BODY_FILE,TASK_BODY & MOD_COMP(1..END_MC) & USCORE_TYPE & IS_WORD); if CURRENT_MAC = MODIFIER_NAME then PUT_LINE(BODY_FILE,MOD_MSG & MAC_STATES(MSG_PTR).STATES(1) (1..MAC_STATES(MSG_PTR).LENGTH(1)) & SEMICOLON); PUT_LINE(BODY_FILE,FIRST_INDENT & CONVERT_TO_BA); PUT_LINE(BODY_FILE,THIRD_INDENT & LEFT_PAREN & MAC_STATES(MSG_PTR).STATES(1) (1..MAC_STATES(MSG_PTR).LENGTH(1)) & PAREN_SEMI); end if; if LAST_DISC > 0 then if LAST_DISC = 1 then PUT_LINE(BODY_FILE,CONVERT_DISC_1); elsif LAST_DISC = 2 then PUT_LINE(BODY_FILE,CONVERT_DISC_2); else PUT_LINE(BODY_FILE,CONVERT_DISC_3); end if; PUT(BODY_FILE,THIRD_INDENT & LEFT_PAREN); for I in 1..LAST_DISC loop PUT(BODY_FILE, MAC_STATES(DISC_PTRS(I)).STATES(1) (1..MAC_STATES(DISC_PTRS(I)).LENGTH(1)) ); PUT(BODY_FILE,ONE_SPACE & COMMA); end loop; PUT_LINE(BODY_FILE,MAC_STATES(MSG_PTR).STATES(1) (1..MAC_STATES(MSG_PTR).LENGTH(1)) & PAREN_SEMI); else PUT_LINE(BODY_FILE,CONVERT_FROM_BA); PUT_LINE(BODY_FILE,THIRD_INDENT & LEFT_PAREN & MAC_STATES(MSG_PTR).STATES(1) (1..MAC_STATES(MSG_PTR).LENGTH(1)) & PAREN_SEMI); end if; PUT_LINE(BODY_FILE,BEGIN_WORD); PUT_LINE(BODY_FILE,LOOP_WORD); PUT_LINE(BODY_FILE,SELECT_WORD); if CURRENT_MAC = MODIFIER_NAME then PUT_LINE(BODY_FILE,MOD_ACCEPT_1); PUT(BODY_FILE,ASS_MOD_MSG); if LAST_DISC > 0 then PUT_LINE(BODY_FILE,COMMA); for I in 1..LAST_DISC loop PUT(BODY_FILE,FIFTH_INDENT & FIFTH_INDENT & FIRST_INDENT & ONE_SPACE & ONE_SPACE & MAC_STATES(DISC_PTRS(I)).STATES(2) (1..MAC_STATES(DISC_PTRS(I)).LENGTH(2)) ); if I < LAST_DISC then PUT_LINE(BODY_FILE,ONE_SPACE & COMMA); end if; end loop; end if; PUT_LINE(BODY_FILE,PAREN_SEMI); else PUT_LINE(BODY_FILE,COMP_ACCEPT_1); PUT_LINE(BODY_FILE,COMP_ACCEPT_2); end if; PUT_LINE(BODY_FILE,FIFTH_INDENT & MAC_STATES(PROC_PTR).STATES(1) (1..MAC_STATES(PROC_PTR).LENGTH(1))); if CURRENT_MAC = MODIFIER_NAME then PUT_LINE(BODY_FILE,MODIFY_INPUT); PUT_LINE(BODY_FILE,ASS_GUM_MSG); PUT_LINE(BODY_FILE,END_MODIFY); else PUT(BODY_FILE,COMPARE_INPUT); if LAST_DISC > 0 then PUT_LINE(BODY_FILE,COMMA); for I in 1..LAST_DISC loop PUT(BODY_FILE,FIFTH_INDENT & FOURTH_INDENT & ONE_SPACE & MAC_STATES(DISC_PTRS(I)).STATES(2) (1..MAC_STATES(DISC_PTRS(I)).LENGTH(2)) ); if I < LAST_DISC then PUT_LINE(BODY_FILE,ONE_SPACE & COMMA); end if; end loop; end if; PUT_LINE(BODY_FILE,RIGHT_PAREN & COMMA); PUT_LINE(BODY_FILE,MATCH_INPUT); PUT_LINE(BODY_FILE,END_COMPARE); end if; PUT_LINE(BODY_FILE,OR_WORD); PUT_LINE(BODY_FILE,TASK_COMP_ACC); PUT_LINE(BODY_FILE,EXIT_LOOP); PUT_LINE(BODY_FILE,END_SELECT); PUT_LINE(BODY_FILE,END_LOOP); PUT_LINE(BODY_FILE,END_TASK & MOD_COMP(1..END_MC) & USCORE_TYPE & SEMICOLON); NEW_LINE(BODY_FILE); -- Reset pointers for next macro STATE_PTR := 0; MAC_IN_PROGRESS := FALSE; CURRENT_MAC := NONE; CUR_MAC_PTR := 0; MSG_PTR := 0; PROC_PTR := 0; LAST_DISC := 0; end if; end if; end loop; CLOSE(MAC_FILE); CLOSE(SPEC_FILE); PUT_LINE(BODY_FILE,END_PACKAGE & FILE_NAME & SEMICOLON); CLOSE(BODY_FILE); end MCS_MACRO_PROCESSOR; end UATL_MACRO_PROCESSING;