From 44f58938aee13bb343c5e71f8e33a64fd8b10505 Mon Sep 17 00:00:00 2001 From: David Declerck Date: Fri, 31 May 2024 16:21:15 +0200 Subject: [PATCH] Merge SVN 3944 --- cobc/ppparse.output | 3193 ------------------------------- libcob/ChangeLog | 16 + libcob/fbdb.c | 2 +- libcob/fileio.c | 404 +++- libcob/fisam.c | 7 +- tests/testsuite.src/run_file.at | 147 +- 6 files changed, 473 insertions(+), 3296 deletions(-) delete mode 100644 cobc/ppparse.output diff --git a/cobc/ppparse.output b/cobc/ppparse.output deleted file mode 100644 index 23925aa27..000000000 --- a/cobc/ppparse.output +++ /dev/null @@ -1,3193 +0,0 @@ -Grammaire - - 0 $accept: statement_list "end of file" - - 1 statement_list: ε - 2 | statement_list statement - - 3 statement: copy_statement "." - 4 | replace_statement "." - 5 | directive "end of line" - 6 | listing_statement - 7 | CONTROL_STATEMENT control_options _dot "end of line" - - 8 directive: SOURCE_DIRECTIVE source_directive - 9 | DEFINE_DIRECTIVE define_directive - 10 | COBOL_WORDS_DIRECTIVE cobol_words_directive - 11 | SET_DIRECTIVE set_directive - 12 | REFMOD_DIRECTIVE refmod_directive - 13 | TURN_DIRECTIVE turn_directive - 14 | LISTING_DIRECTIVE listing_directive - 15 | LEAP_SECOND_DIRECTIVE leap_second_directive - - 16 $@1: ε - - 17 directive: IF_DIRECTIVE $@1 if_directive_if - - 18 $@2: ε - - 19 directive: ELIF_DIRECTIVE $@2 if_directive_elif - 20 | ELSE_DIRECTIVE - 21 | ENDIF_DIRECTIVE - - 22 $@3: ε - - 23 directive: CALL_DIRECTIVE $@3 call_directive - - 24 if_directive_if: if_directive - 25 | error - - 26 if_directive_elif: if_directive - 27 | error - - 28 set_directive: set_choice - 29 | set_directive set_choice - - 30 set_choice: CONSTANT "Variable" "Literal" - 31 | "Variable" set_options - 32 | ADDRSV alnum_list - 33 | ADDSYN alnum_equality - 34 | ASSIGN "Literal" - 35 | BOUND - 36 | CALLFH "Literal" - 37 | CALLFH - 38 | XFD "Literal" - 39 | CHECKNUM - 40 | COMP1 "Literal" - 41 | "DPC-IN-DATA" "Literal" - 42 | FOLDCOPYNAME _as "Literal" - 43 | KEYCOMPRESS "Literal" - 44 | NOKEYCOMPRESS - 45 | MAKESYN alnum_equality - 46 | NOBOUND - 47 | NOCHECKNUM - 48 | "NODPC-IN-DATA" - 49 | NOFOLDCOPYNAME - 50 | NOSPZERO - 51 | NOSSRANGE - 52 | NOODOSLIDE - 53 | ODOSLIDE - 54 | OVERRIDE alnum_equality_list - 55 | REMOVE alnum_list - 56 | SOURCEFORMAT _as "Literal" - 57 | SOURCEFORMAT _as error - 58 | SPZERO - 59 | SSRANGE _literal - - 60 alnum_list: "Literal" - 61 | alnum_list "Literal" - - 62 alnum_equality_list: alnum_equality - 63 | alnum_equality_list alnum_equality - - 64 alnum_equality: "Literal" "=" "Literal" - - 65 alnum_with_list: alnum_with - 66 | alnum_with_list alnum_with - - 67 alnum_with: "Literal" WITH "Literal" - - 68 alnum_by_list: alnum_by - 69 | alnum_by_list alnum_by - - 70 alnum_by: "Literal" BY "Literal" - - 71 set_options: ε - 72 | _as "Literal" - - 73 refmod_directive: _on - 74 | OFF - - 75 source_directive: _format _is format_type - - 76 format_type: FIXED - 77 | FREE - 78 | VARIABLE - 79 | "word" - - 80 _literal: ε - 81 | "Literal" - - 82 define_directive: "Variable" _as "Literal" _override - 83 | "Variable" _as PARAMETER _override - 84 | "Variable" _as OFF - 85 | CONSTANT "Variable" _as "Literal" _override - 86 | variable_or_literal - - 87 cobol_words_directive: EQUATE alnum_with_list - 88 | UNDEFINE alnum_list - 89 | SUBSTITUTE alnum_by_list - 90 | RESERVE alnum_list - - 91 listing_directive: ε - 92 | ON - 93 | OFF - - 94 listing_statement: LISTING_STATEMENT - 95 | TITLE_STATEMENT "Literal" _dot "end of line" - - 96 control_options: control_option - 97 | control_options control_option - - 98 control_option: SOURCE - 99 | NOSOURCE - 100 | LIST - 101 | NOLIST - 102 | MAP - 103 | NOMAP - - 104 _dot: ε - 105 | "." - - 106 leap_second_directive: ε - 107 | ON - 108 | OFF - - 109 turn_directive: ec_list CHECKING on_or_off - - 110 ec_list: "Variable" - 111 | ec_list "Variable" - - 112 on_or_off: on_with_loc - 113 | ON - 114 | OFF - - 115 on_with_loc: ON with_loc - 116 | with_loc - - 117 with_loc: WITH LOCATION - 118 | LOCATION - - 119 call_directive: call_choice - 120 | call_directive call_choice - - 121 call_choice: COBOL - 122 | "EXTERN" - 123 | STDCALL - 124 | STATIC - - 125 if_directive: "Variable" _is _not DEFINED - 126 | "Variable" _is _not SET - 127 | "Variable" _is _not condition_clause object_id - 128 | "Literal" _is _not condition_clause object_id - 129 | garbage - - 130 garbage: variable_or_literal - 131 | garbage variable_or_literal - 132 | garbage error - - 133 variable_or_literal: "Variable" - 134 | "Literal" - - 135 object_id: "Literal" - 136 | "Variable" - - 137 condition_clause: GREATER _than OR EQUAL _to - 138 | GREATER _than - 139 | LESS _than OR EQUAL _to - 140 | LESS _than - 141 | EQUAL _to - 142 | ">=" - 143 | ">" - 144 | "<=" - 145 | "<" - 146 | "=" - 147 | "<>" - - 148 copy_statement: COPY copy_source copy_in copy_suppress copy_replacing - - 149 copy_source: "Identifier or Literal" - 150 | "Text-Name" - - 151 copy_in: ε - 152 | in_or_of copy_source - - 153 in_or_of: IN - 154 | OF - - 155 copy_suppress: ε - 156 | SUPPRESS _printing - - 157 copy_replacing: ε - 158 | REPLACING replacing_list - - 159 replace_statement: REPLACE _also replacing_list - 160 | REPLACE _last OFF - - 161 replacing_list: text_src BY text_dst - 162 | lead_trail text_partial_src BY text_partial_dst - 163 | replacing_list text_src BY text_dst - 164 | replacing_list lead_trail text_partial_src BY text_partial_dst - - 165 text_src: "==" token_list "==" - 166 | identifier - - 167 text_dst: "==" "==" - 168 | "==" token_list "==" - 169 | identifier - - 170 text_partial_src: "==" "Identifier or Literal" "==" - - 171 text_partial_dst: "==" "==" - 172 | "==" "Identifier or Literal" "==" - - 173 token_list: "Identifier or Literal" - 174 | token_list "Identifier or Literal" - - 175 identifier: "Identifier or Literal" - 176 | identifier IN "Identifier or Literal" - 177 | identifier OF "Identifier or Literal" - 178 | identifier '(' subscripts ')' - - 179 subscripts: "Identifier or Literal" - 180 | subscripts "Identifier or Literal" - - 181 lead_trail: LEADING - 182 | TRAILING - - 183 _override: ε - 184 | OVERRIDE - - 185 _not: ε - 186 | NOT - - 187 _also: ε - 188 | ALSO - - 189 _last: ε - 190 | LAST - - 191 _as: ε - 192 | AS - - 193 _format: ε - 194 | FORMAT - - 195 _is: ε - 196 | IS - - 197 _printing: ε - 198 | PRINTING - - 199 _on: ε - 200 | ON - - 201 _than: ε - 202 | THAN - - 203 _to: ε - 204 | TO - - -Terminaux, suivis des règles où ils apparaissent - - "end of file" (0) 0 - '(' (40) 178 - ')' (41) 178 - error (256) 25 27 57 132 - ALSO (258) 188 - BY (259) 70 161 162 163 164 - COPY (260) 148 - "==" (261) 165 167 168 170 171 172 - IN (262) 153 176 - LAST (263) 190 - LEADING (264) 181 - OF (265) 154 177 - OFF (266) 74 84 93 108 114 160 - PRINTING (267) 198 - REPLACE (268) 159 160 - REPLACING (269) 158 - SUPPRESS (270) 156 - TRAILING (271) 182 - "." (272) 3 4 105 - "word" (273) 79 - LISTING_DIRECTIVE (274) 14 - LISTING_STATEMENT (275) 94 - TITLE_STATEMENT (276) 95 - COBOL_WORDS_DIRECTIVE (277) 10 - EQUATE (278) 87 - UNDEFINE (279) 88 - SUBSTITUTE (280) 89 - RESERVE (281) 90 - CONTROL_STATEMENT (282) 7 - SOURCE (283) 98 - NOSOURCE (284) 99 - LIST (285) 100 - NOLIST (286) 101 - MAP (287) 102 - NOMAP (288) 103 - LEAP_SECOND_DIRECTIVE (289) 15 - SOURCE_DIRECTIVE (290) 8 - FORMAT (291) 194 - IS (292) 196 - FIXED (293) 76 - FREE (294) 77 - VARIABLE (295) 78 - CALL_DIRECTIVE (296) 23 - COBOL (297) 121 - "EXTERN" (298) 122 - STDCALL (299) 123 - STATIC (300) 124 - DEFINE_DIRECTIVE (301) 9 - AS (302) 192 - PARAMETER (303) 83 - OVERRIDE (304) 54 184 - REFMOD_DIRECTIVE (305) 12 - SET_DIRECTIVE (306) 11 - ADDRSV (307) 32 - ADDSYN (308) 33 - ASSIGN (309) 34 - BOUND (310) 35 - CALLFH (311) 36 37 - XFD (312) 38 - CHECKNUM (313) 39 - COMP1 (314) 40 - CONSTANT (315) 30 85 - "DPC-IN-DATA" (316) 41 - FOLDCOPYNAME (317) 42 - KEYCOMPRESS (318) 43 - NOKEYCOMPRESS (319) 44 - MAKESYN (320) 45 - NOBOUND (321) 46 - NOCHECKNUM (322) 47 - "NODPC-IN-DATA" (323) 48 - NOFOLDCOPYNAME (324) 49 - NOODOSLIDE (325) 52 - NOSPZERO (326) 50 - NOSSRANGE (327) 51 - ODOSLIDE (328) 53 - REMOVE (329) 55 - SOURCEFORMAT (330) 56 57 - SPZERO (331) 58 - SSRANGE (332) 59 - IF_DIRECTIVE (333) 17 - ELSE_DIRECTIVE (334) 20 - ENDIF_DIRECTIVE (335) 21 - ELIF_DIRECTIVE (336) 19 - ">=" (337) 142 - "<=" (338) 144 - "<" (339) 145 - ">" (340) 143 - "=" (341) 64 146 - "<>" (342) 147 - NOT (343) 186 - THAN (344) 202 - TO (345) 204 - OR (346) 137 139 - EQUAL (347) 137 139 141 - GREATER (348) 137 138 - LESS (349) 139 140 - SET (350) 126 - DEFINED (351) 125 - TURN_DIRECTIVE (352) 13 - ON (353) 92 107 113 115 200 - CHECKING (354) 109 - WITH (355) 67 117 - LOCATION (356) 117 118 - "end of line" (357) 5 7 95 - "Identifier or Literal" (358) 149 170 172 173 174 175 176 177 179 180 - "Text-Name" (359) 150 - "Variable" (360) 30 31 82 83 84 85 110 111 125 126 127 133 136 - "Literal" (361) 30 34 36 38 40 41 42 43 56 60 61 64 67 70 72 81 82 85 95 128 134 135 - - -Non-terminaux, suivis des règles où ils apparaissent - - $accept (109) - à gauche: 0 - statement_list (110) - à gauche: 1 2 - à droite: 0 2 - statement (111) - à gauche: 3 4 5 6 7 - à droite: 2 - directive (112) - à gauche: 8 9 10 11 12 13 14 15 17 19 20 21 23 - à droite: 5 - $@1 (113) - à gauche: 16 - à droite: 17 - $@2 (114) - à gauche: 18 - à droite: 19 - $@3 (115) - à gauche: 22 - à droite: 23 - if_directive_if (116) - à gauche: 24 25 - à droite: 17 - if_directive_elif (117) - à gauche: 26 27 - à droite: 19 - set_directive (118) - à gauche: 28 29 - à droite: 11 29 - set_choice (119) - à gauche: 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 - à droite: 28 29 - alnum_list (120) - à gauche: 60 61 - à droite: 32 55 61 88 90 - alnum_equality_list (121) - à gauche: 62 63 - à droite: 54 63 - alnum_equality (122) - à gauche: 64 - à droite: 33 45 62 63 - alnum_with_list (123) - à gauche: 65 66 - à droite: 66 87 - alnum_with (124) - à gauche: 67 - à droite: 65 66 - alnum_by_list (125) - à gauche: 68 69 - à droite: 69 89 - alnum_by (126) - à gauche: 70 - à droite: 68 69 - set_options (127) - à gauche: 71 72 - à droite: 31 - refmod_directive (128) - à gauche: 73 74 - à droite: 12 - source_directive (129) - à gauche: 75 - à droite: 8 - format_type (130) - à gauche: 76 77 78 79 - à droite: 75 - _literal (131) - à gauche: 80 81 - à droite: 59 - define_directive (132) - à gauche: 82 83 84 85 86 - à droite: 9 - cobol_words_directive (133) - à gauche: 87 88 89 90 - à droite: 10 - listing_directive (134) - à gauche: 91 92 93 - à droite: 14 - listing_statement (135) - à gauche: 94 95 - à droite: 6 - control_options (136) - à gauche: 96 97 - à droite: 7 97 - control_option (137) - à gauche: 98 99 100 101 102 103 - à droite: 96 97 - _dot (138) - à gauche: 104 105 - à droite: 7 95 - leap_second_directive (139) - à gauche: 106 107 108 - à droite: 15 - turn_directive (140) - à gauche: 109 - à droite: 13 - ec_list (141) - à gauche: 110 111 - à droite: 109 111 - on_or_off (142) - à gauche: 112 113 114 - à droite: 109 - on_with_loc (143) - à gauche: 115 116 - à droite: 112 - with_loc (144) - à gauche: 117 118 - à droite: 115 116 - call_directive (145) - à gauche: 119 120 - à droite: 23 120 - call_choice (146) - à gauche: 121 122 123 124 - à droite: 119 120 - if_directive (147) - à gauche: 125 126 127 128 129 - à droite: 24 26 - garbage (148) - à gauche: 130 131 132 - à droite: 129 131 132 - variable_or_literal (149) - à gauche: 133 134 - à droite: 86 130 131 - object_id (150) - à gauche: 135 136 - à droite: 127 128 - condition_clause (151) - à gauche: 137 138 139 140 141 142 143 144 145 146 147 - à droite: 127 128 - copy_statement (152) - à gauche: 148 - à droite: 3 - copy_source (153) - à gauche: 149 150 - à droite: 148 152 - copy_in (154) - à gauche: 151 152 - à droite: 148 - in_or_of (155) - à gauche: 153 154 - à droite: 152 - copy_suppress (156) - à gauche: 155 156 - à droite: 148 - copy_replacing (157) - à gauche: 157 158 - à droite: 148 - replace_statement (158) - à gauche: 159 160 - à droite: 4 - replacing_list (159) - à gauche: 161 162 163 164 - à droite: 158 159 163 164 - text_src (160) - à gauche: 165 166 - à droite: 161 163 - text_dst (161) - à gauche: 167 168 169 - à droite: 161 163 - text_partial_src (162) - à gauche: 170 - à droite: 162 164 - text_partial_dst (163) - à gauche: 171 172 - à droite: 162 164 - token_list (164) - à gauche: 173 174 - à droite: 165 168 174 - identifier (165) - à gauche: 175 176 177 178 - à droite: 166 169 176 177 178 - subscripts (166) - à gauche: 179 180 - à droite: 178 180 - lead_trail (167) - à gauche: 181 182 - à droite: 162 164 - _override (168) - à gauche: 183 184 - à droite: 82 83 85 - _not (169) - à gauche: 185 186 - à droite: 125 126 127 128 - _also (170) - à gauche: 187 188 - à droite: 159 - _last (171) - à gauche: 189 190 - à droite: 160 - _as (172) - à gauche: 191 192 - à droite: 42 56 57 72 82 83 84 85 - _format (173) - à gauche: 193 194 - à droite: 75 - _is (174) - à gauche: 195 196 - à droite: 75 125 126 127 128 - _printing (175) - à gauche: 197 198 - à droite: 156 - _on (176) - à gauche: 199 200 - à droite: 73 - _than (177) - à gauche: 201 202 - à droite: 137 138 139 140 - _to (178) - à gauche: 203 204 - à droite: 137 139 141 - - -État 0 - - 0 $accept: • statement_list "end of file" - - $défaut réduction par utilisation de la règle 1 (statement_list) - - statement_list aller à l'état 1 - - -État 1 - - 0 $accept: statement_list • "end of file" - 2 statement_list: statement_list • statement - - "end of file" décalage et aller à l'état 2 - COPY décalage et aller à l'état 3 - REPLACE décalage et aller à l'état 4 - LISTING_DIRECTIVE décalage et aller à l'état 5 - LISTING_STATEMENT décalage et aller à l'état 6 - TITLE_STATEMENT décalage et aller à l'état 7 - COBOL_WORDS_DIRECTIVE décalage et aller à l'état 8 - CONTROL_STATEMENT décalage et aller à l'état 9 - LEAP_SECOND_DIRECTIVE décalage et aller à l'état 10 - SOURCE_DIRECTIVE décalage et aller à l'état 11 - CALL_DIRECTIVE décalage et aller à l'état 12 - DEFINE_DIRECTIVE décalage et aller à l'état 13 - REFMOD_DIRECTIVE décalage et aller à l'état 14 - SET_DIRECTIVE décalage et aller à l'état 15 - IF_DIRECTIVE décalage et aller à l'état 16 - ELSE_DIRECTIVE décalage et aller à l'état 17 - ENDIF_DIRECTIVE décalage et aller à l'état 18 - ELIF_DIRECTIVE décalage et aller à l'état 19 - TURN_DIRECTIVE décalage et aller à l'état 20 - - statement aller à l'état 21 - directive aller à l'état 22 - listing_statement aller à l'état 23 - copy_statement aller à l'état 24 - replace_statement aller à l'état 25 - - -État 2 - - 0 $accept: statement_list "end of file" • - - $défaut accepter - - -État 3 - - 148 copy_statement: COPY • copy_source copy_in copy_suppress copy_replacing - - "Identifier or Literal" décalage et aller à l'état 26 - "Text-Name" décalage et aller à l'état 27 - - copy_source aller à l'état 28 - - -État 4 - - 159 replace_statement: REPLACE • _also replacing_list - 160 | REPLACE • _last OFF - - ALSO décalage et aller à l'état 29 - LAST décalage et aller à l'état 30 - - OFF réduction par utilisation de la règle 189 (_last) - $défaut réduction par utilisation de la règle 187 (_also) - - _also aller à l'état 31 - _last aller à l'état 32 - - -État 5 - - 14 directive: LISTING_DIRECTIVE • listing_directive - - OFF décalage et aller à l'état 33 - ON décalage et aller à l'état 34 - - $défaut réduction par utilisation de la règle 91 (listing_directive) - - listing_directive aller à l'état 35 - - -État 6 - - 94 listing_statement: LISTING_STATEMENT • - - $défaut réduction par utilisation de la règle 94 (listing_statement) - - -État 7 - - 95 listing_statement: TITLE_STATEMENT • "Literal" _dot "end of line" - - "Literal" décalage et aller à l'état 36 - - -État 8 - - 10 directive: COBOL_WORDS_DIRECTIVE • cobol_words_directive - - EQUATE décalage et aller à l'état 37 - UNDEFINE décalage et aller à l'état 38 - SUBSTITUTE décalage et aller à l'état 39 - RESERVE décalage et aller à l'état 40 - - cobol_words_directive aller à l'état 41 - - -État 9 - - 7 statement: CONTROL_STATEMENT • control_options _dot "end of line" - - SOURCE décalage et aller à l'état 42 - NOSOURCE décalage et aller à l'état 43 - LIST décalage et aller à l'état 44 - NOLIST décalage et aller à l'état 45 - MAP décalage et aller à l'état 46 - NOMAP décalage et aller à l'état 47 - - control_options aller à l'état 48 - control_option aller à l'état 49 - - -État 10 - - 15 directive: LEAP_SECOND_DIRECTIVE • leap_second_directive - - OFF décalage et aller à l'état 50 - ON décalage et aller à l'état 51 - - $défaut réduction par utilisation de la règle 106 (leap_second_directive) - - leap_second_directive aller à l'état 52 - - -État 11 - - 8 directive: SOURCE_DIRECTIVE • source_directive - - FORMAT décalage et aller à l'état 53 - - $défaut réduction par utilisation de la règle 193 (_format) - - source_directive aller à l'état 54 - _format aller à l'état 55 - - -État 12 - - 23 directive: CALL_DIRECTIVE • $@3 call_directive - - $défaut réduction par utilisation de la règle 22 ($@3) - - $@3 aller à l'état 56 - - -État 13 - - 9 directive: DEFINE_DIRECTIVE • define_directive - - CONSTANT décalage et aller à l'état 57 - "Variable" décalage et aller à l'état 58 - "Literal" décalage et aller à l'état 59 - - define_directive aller à l'état 60 - variable_or_literal aller à l'état 61 - - -État 14 - - 12 directive: REFMOD_DIRECTIVE • refmod_directive - - OFF décalage et aller à l'état 62 - ON décalage et aller à l'état 63 - - $défaut réduction par utilisation de la règle 199 (_on) - - refmod_directive aller à l'état 64 - _on aller à l'état 65 - - -État 15 - - 11 directive: SET_DIRECTIVE • set_directive - - OVERRIDE décalage et aller à l'état 66 - ADDRSV décalage et aller à l'état 67 - ADDSYN décalage et aller à l'état 68 - ASSIGN décalage et aller à l'état 69 - BOUND décalage et aller à l'état 70 - CALLFH décalage et aller à l'état 71 - XFD décalage et aller à l'état 72 - CHECKNUM décalage et aller à l'état 73 - COMP1 décalage et aller à l'état 74 - CONSTANT décalage et aller à l'état 75 - "DPC-IN-DATA" décalage et aller à l'état 76 - FOLDCOPYNAME décalage et aller à l'état 77 - KEYCOMPRESS décalage et aller à l'état 78 - NOKEYCOMPRESS décalage et aller à l'état 79 - MAKESYN décalage et aller à l'état 80 - NOBOUND décalage et aller à l'état 81 - NOCHECKNUM décalage et aller à l'état 82 - "NODPC-IN-DATA" décalage et aller à l'état 83 - NOFOLDCOPYNAME décalage et aller à l'état 84 - NOODOSLIDE décalage et aller à l'état 85 - NOSPZERO décalage et aller à l'état 86 - NOSSRANGE décalage et aller à l'état 87 - ODOSLIDE décalage et aller à l'état 88 - REMOVE décalage et aller à l'état 89 - SOURCEFORMAT décalage et aller à l'état 90 - SPZERO décalage et aller à l'état 91 - SSRANGE décalage et aller à l'état 92 - "Variable" décalage et aller à l'état 93 - - set_directive aller à l'état 94 - set_choice aller à l'état 95 - - -État 16 - - 17 directive: IF_DIRECTIVE • $@1 if_directive_if - - $défaut réduction par utilisation de la règle 16 ($@1) - - $@1 aller à l'état 96 - - -État 17 - - 20 directive: ELSE_DIRECTIVE • - - $défaut réduction par utilisation de la règle 20 (directive) - - -État 18 - - 21 directive: ENDIF_DIRECTIVE • - - $défaut réduction par utilisation de la règle 21 (directive) - - -État 19 - - 19 directive: ELIF_DIRECTIVE • $@2 if_directive_elif - - $défaut réduction par utilisation de la règle 18 ($@2) - - $@2 aller à l'état 97 - - -État 20 - - 13 directive: TURN_DIRECTIVE • turn_directive - - "Variable" décalage et aller à l'état 98 - - turn_directive aller à l'état 99 - ec_list aller à l'état 100 - - -État 21 - - 2 statement_list: statement_list statement • - - $défaut réduction par utilisation de la règle 2 (statement_list) - - -État 22 - - 5 statement: directive • "end of line" - - "end of line" décalage et aller à l'état 101 - - -État 23 - - 6 statement: listing_statement • - - $défaut réduction par utilisation de la règle 6 (statement) - - -État 24 - - 3 statement: copy_statement • "." - - "." décalage et aller à l'état 102 - - -État 25 - - 4 statement: replace_statement • "." - - "." décalage et aller à l'état 103 - - -État 26 - - 149 copy_source: "Identifier or Literal" • - - $défaut réduction par utilisation de la règle 149 (copy_source) - - -État 27 - - 150 copy_source: "Text-Name" • - - $défaut réduction par utilisation de la règle 150 (copy_source) - - -État 28 - - 148 copy_statement: COPY copy_source • copy_in copy_suppress copy_replacing - - IN décalage et aller à l'état 104 - OF décalage et aller à l'état 105 - - $défaut réduction par utilisation de la règle 151 (copy_in) - - copy_in aller à l'état 106 - in_or_of aller à l'état 107 - - -État 29 - - 188 _also: ALSO • - - $défaut réduction par utilisation de la règle 188 (_also) - - -État 30 - - 190 _last: LAST • - - $défaut réduction par utilisation de la règle 190 (_last) - - -État 31 - - 159 replace_statement: REPLACE _also • replacing_list - - "==" décalage et aller à l'état 108 - LEADING décalage et aller à l'état 109 - TRAILING décalage et aller à l'état 110 - "Identifier or Literal" décalage et aller à l'état 111 - - replacing_list aller à l'état 112 - text_src aller à l'état 113 - identifier aller à l'état 114 - lead_trail aller à l'état 115 - - -État 32 - - 160 replace_statement: REPLACE _last • OFF - - OFF décalage et aller à l'état 116 - - -État 33 - - 93 listing_directive: OFF • - - $défaut réduction par utilisation de la règle 93 (listing_directive) - - -État 34 - - 92 listing_directive: ON • - - $défaut réduction par utilisation de la règle 92 (listing_directive) - - -État 35 - - 14 directive: LISTING_DIRECTIVE listing_directive • - - $défaut réduction par utilisation de la règle 14 (directive) - - -État 36 - - 95 listing_statement: TITLE_STATEMENT "Literal" • _dot "end of line" - - "." décalage et aller à l'état 117 - - $défaut réduction par utilisation de la règle 104 (_dot) - - _dot aller à l'état 118 - - -État 37 - - 87 cobol_words_directive: EQUATE • alnum_with_list - - "Literal" décalage et aller à l'état 119 - - alnum_with_list aller à l'état 120 - alnum_with aller à l'état 121 - - -État 38 - - 88 cobol_words_directive: UNDEFINE • alnum_list - - "Literal" décalage et aller à l'état 122 - - alnum_list aller à l'état 123 - - -État 39 - - 89 cobol_words_directive: SUBSTITUTE • alnum_by_list - - "Literal" décalage et aller à l'état 124 - - alnum_by_list aller à l'état 125 - alnum_by aller à l'état 126 - - -État 40 - - 90 cobol_words_directive: RESERVE • alnum_list - - "Literal" décalage et aller à l'état 122 - - alnum_list aller à l'état 127 - - -État 41 - - 10 directive: COBOL_WORDS_DIRECTIVE cobol_words_directive • - - $défaut réduction par utilisation de la règle 10 (directive) - - -État 42 - - 98 control_option: SOURCE • - - $défaut réduction par utilisation de la règle 98 (control_option) - - -État 43 - - 99 control_option: NOSOURCE • - - $défaut réduction par utilisation de la règle 99 (control_option) - - -État 44 - - 100 control_option: LIST • - - $défaut réduction par utilisation de la règle 100 (control_option) - - -État 45 - - 101 control_option: NOLIST • - - $défaut réduction par utilisation de la règle 101 (control_option) - - -État 46 - - 102 control_option: MAP • - - $défaut réduction par utilisation de la règle 102 (control_option) - - -État 47 - - 103 control_option: NOMAP • - - $défaut réduction par utilisation de la règle 103 (control_option) - - -État 48 - - 7 statement: CONTROL_STATEMENT control_options • _dot "end of line" - 97 control_options: control_options • control_option - - "." décalage et aller à l'état 117 - SOURCE décalage et aller à l'état 42 - NOSOURCE décalage et aller à l'état 43 - LIST décalage et aller à l'état 44 - NOLIST décalage et aller à l'état 45 - MAP décalage et aller à l'état 46 - NOMAP décalage et aller à l'état 47 - - $défaut réduction par utilisation de la règle 104 (_dot) - - control_option aller à l'état 128 - _dot aller à l'état 129 - - -État 49 - - 96 control_options: control_option • - - $défaut réduction par utilisation de la règle 96 (control_options) - - -État 50 - - 108 leap_second_directive: OFF • - - $défaut réduction par utilisation de la règle 108 (leap_second_directive) - - -État 51 - - 107 leap_second_directive: ON • - - $défaut réduction par utilisation de la règle 107 (leap_second_directive) - - -État 52 - - 15 directive: LEAP_SECOND_DIRECTIVE leap_second_directive • - - $défaut réduction par utilisation de la règle 15 (directive) - - -État 53 - - 194 _format: FORMAT • - - $défaut réduction par utilisation de la règle 194 (_format) - - -État 54 - - 8 directive: SOURCE_DIRECTIVE source_directive • - - $défaut réduction par utilisation de la règle 8 (directive) - - -État 55 - - 75 source_directive: _format • _is format_type - - IS décalage et aller à l'état 130 - - $défaut réduction par utilisation de la règle 195 (_is) - - _is aller à l'état 131 - - -État 56 - - 23 directive: CALL_DIRECTIVE $@3 • call_directive - - COBOL décalage et aller à l'état 132 - "EXTERN" décalage et aller à l'état 133 - STDCALL décalage et aller à l'état 134 - STATIC décalage et aller à l'état 135 - - call_directive aller à l'état 136 - call_choice aller à l'état 137 - - -État 57 - - 85 define_directive: CONSTANT • "Variable" _as "Literal" _override - - "Variable" décalage et aller à l'état 138 - - -État 58 - - 82 define_directive: "Variable" • _as "Literal" _override - 83 | "Variable" • _as PARAMETER _override - 84 | "Variable" • _as OFF - 133 variable_or_literal: "Variable" • - - AS décalage et aller à l'état 139 - - "end of line" réduction par utilisation de la règle 133 (variable_or_literal) - $défaut réduction par utilisation de la règle 191 (_as) - - _as aller à l'état 140 - - -État 59 - - 134 variable_or_literal: "Literal" • - - $défaut réduction par utilisation de la règle 134 (variable_or_literal) - - -État 60 - - 9 directive: DEFINE_DIRECTIVE define_directive • - - $défaut réduction par utilisation de la règle 9 (directive) - - -État 61 - - 86 define_directive: variable_or_literal • - - $défaut réduction par utilisation de la règle 86 (define_directive) - - -État 62 - - 74 refmod_directive: OFF • - - $défaut réduction par utilisation de la règle 74 (refmod_directive) - - -État 63 - - 200 _on: ON • - - $défaut réduction par utilisation de la règle 200 (_on) - - -État 64 - - 12 directive: REFMOD_DIRECTIVE refmod_directive • - - $défaut réduction par utilisation de la règle 12 (directive) - - -État 65 - - 73 refmod_directive: _on • - - $défaut réduction par utilisation de la règle 73 (refmod_directive) - - -État 66 - - 54 set_choice: OVERRIDE • alnum_equality_list - - "Literal" décalage et aller à l'état 141 - - alnum_equality_list aller à l'état 142 - alnum_equality aller à l'état 143 - - -État 67 - - 32 set_choice: ADDRSV • alnum_list - - "Literal" décalage et aller à l'état 122 - - alnum_list aller à l'état 144 - - -État 68 - - 33 set_choice: ADDSYN • alnum_equality - - "Literal" décalage et aller à l'état 141 - - alnum_equality aller à l'état 145 - - -État 69 - - 34 set_choice: ASSIGN • "Literal" - - "Literal" décalage et aller à l'état 146 - - -État 70 - - 35 set_choice: BOUND • - - $défaut réduction par utilisation de la règle 35 (set_choice) - - -État 71 - - 36 set_choice: CALLFH • "Literal" - 37 | CALLFH • - - "Literal" décalage et aller à l'état 147 - - $défaut réduction par utilisation de la règle 37 (set_choice) - - -État 72 - - 38 set_choice: XFD • "Literal" - - "Literal" décalage et aller à l'état 148 - - -État 73 - - 39 set_choice: CHECKNUM • - - $défaut réduction par utilisation de la règle 39 (set_choice) - - -État 74 - - 40 set_choice: COMP1 • "Literal" - - "Literal" décalage et aller à l'état 149 - - -État 75 - - 30 set_choice: CONSTANT • "Variable" "Literal" - - "Variable" décalage et aller à l'état 150 - - -État 76 - - 41 set_choice: "DPC-IN-DATA" • "Literal" - - "Literal" décalage et aller à l'état 151 - - -État 77 - - 42 set_choice: FOLDCOPYNAME • _as "Literal" - - AS décalage et aller à l'état 139 - - $défaut réduction par utilisation de la règle 191 (_as) - - _as aller à l'état 152 - - -État 78 - - 43 set_choice: KEYCOMPRESS • "Literal" - - "Literal" décalage et aller à l'état 153 - - -État 79 - - 44 set_choice: NOKEYCOMPRESS • - - $défaut réduction par utilisation de la règle 44 (set_choice) - - -État 80 - - 45 set_choice: MAKESYN • alnum_equality - - "Literal" décalage et aller à l'état 141 - - alnum_equality aller à l'état 154 - - -État 81 - - 46 set_choice: NOBOUND • - - $défaut réduction par utilisation de la règle 46 (set_choice) - - -État 82 - - 47 set_choice: NOCHECKNUM • - - $défaut réduction par utilisation de la règle 47 (set_choice) - - -État 83 - - 48 set_choice: "NODPC-IN-DATA" • - - $défaut réduction par utilisation de la règle 48 (set_choice) - - -État 84 - - 49 set_choice: NOFOLDCOPYNAME • - - $défaut réduction par utilisation de la règle 49 (set_choice) - - -État 85 - - 52 set_choice: NOODOSLIDE • - - $défaut réduction par utilisation de la règle 52 (set_choice) - - -État 86 - - 50 set_choice: NOSPZERO • - - $défaut réduction par utilisation de la règle 50 (set_choice) - - -État 87 - - 51 set_choice: NOSSRANGE • - - $défaut réduction par utilisation de la règle 51 (set_choice) - - -État 88 - - 53 set_choice: ODOSLIDE • - - $défaut réduction par utilisation de la règle 53 (set_choice) - - -État 89 - - 55 set_choice: REMOVE • alnum_list - - "Literal" décalage et aller à l'état 122 - - alnum_list aller à l'état 155 - - -État 90 - - 56 set_choice: SOURCEFORMAT • _as "Literal" - 57 | SOURCEFORMAT • _as error - - AS décalage et aller à l'état 139 - - $défaut réduction par utilisation de la règle 191 (_as) - - _as aller à l'état 156 - - -État 91 - - 58 set_choice: SPZERO • - - $défaut réduction par utilisation de la règle 58 (set_choice) - - -État 92 - - 59 set_choice: SSRANGE • _literal - - "Literal" décalage et aller à l'état 157 - - $défaut réduction par utilisation de la règle 80 (_literal) - - _literal aller à l'état 158 - - -État 93 - - 31 set_choice: "Variable" • set_options - - AS décalage et aller à l'état 139 - - "Literal" réduction par utilisation de la règle 191 (_as) - $défaut réduction par utilisation de la règle 71 (set_options) - - set_options aller à l'état 159 - _as aller à l'état 160 - - -État 94 - - 11 directive: SET_DIRECTIVE set_directive • - 29 set_directive: set_directive • set_choice - - OVERRIDE décalage et aller à l'état 66 - ADDRSV décalage et aller à l'état 67 - ADDSYN décalage et aller à l'état 68 - ASSIGN décalage et aller à l'état 69 - BOUND décalage et aller à l'état 70 - CALLFH décalage et aller à l'état 71 - XFD décalage et aller à l'état 72 - CHECKNUM décalage et aller à l'état 73 - COMP1 décalage et aller à l'état 74 - CONSTANT décalage et aller à l'état 75 - "DPC-IN-DATA" décalage et aller à l'état 76 - FOLDCOPYNAME décalage et aller à l'état 77 - KEYCOMPRESS décalage et aller à l'état 78 - NOKEYCOMPRESS décalage et aller à l'état 79 - MAKESYN décalage et aller à l'état 80 - NOBOUND décalage et aller à l'état 81 - NOCHECKNUM décalage et aller à l'état 82 - "NODPC-IN-DATA" décalage et aller à l'état 83 - NOFOLDCOPYNAME décalage et aller à l'état 84 - NOODOSLIDE décalage et aller à l'état 85 - NOSPZERO décalage et aller à l'état 86 - NOSSRANGE décalage et aller à l'état 87 - ODOSLIDE décalage et aller à l'état 88 - REMOVE décalage et aller à l'état 89 - SOURCEFORMAT décalage et aller à l'état 90 - SPZERO décalage et aller à l'état 91 - SSRANGE décalage et aller à l'état 92 - "Variable" décalage et aller à l'état 93 - - $défaut réduction par utilisation de la règle 11 (directive) - - set_choice aller à l'état 161 - - -État 95 - - 28 set_directive: set_choice • - - $défaut réduction par utilisation de la règle 28 (set_directive) - - -État 96 - - 17 directive: IF_DIRECTIVE $@1 • if_directive_if - - error décalage et aller à l'état 162 - "Variable" décalage et aller à l'état 163 - "Literal" décalage et aller à l'état 164 - - if_directive_if aller à l'état 165 - if_directive aller à l'état 166 - garbage aller à l'état 167 - variable_or_literal aller à l'état 168 - - -État 97 - - 19 directive: ELIF_DIRECTIVE $@2 • if_directive_elif - - error décalage et aller à l'état 169 - "Variable" décalage et aller à l'état 163 - "Literal" décalage et aller à l'état 164 - - if_directive_elif aller à l'état 170 - if_directive aller à l'état 171 - garbage aller à l'état 167 - variable_or_literal aller à l'état 168 - - -État 98 - - 110 ec_list: "Variable" • - - $défaut réduction par utilisation de la règle 110 (ec_list) - - -État 99 - - 13 directive: TURN_DIRECTIVE turn_directive • - - $défaut réduction par utilisation de la règle 13 (directive) - - -État 100 - - 109 turn_directive: ec_list • CHECKING on_or_off - 111 ec_list: ec_list • "Variable" - - CHECKING décalage et aller à l'état 172 - "Variable" décalage et aller à l'état 173 - - -État 101 - - 5 statement: directive "end of line" • - - $défaut réduction par utilisation de la règle 5 (statement) - - -État 102 - - 3 statement: copy_statement "." • - - $défaut réduction par utilisation de la règle 3 (statement) - - -État 103 - - 4 statement: replace_statement "." • - - $défaut réduction par utilisation de la règle 4 (statement) - - -État 104 - - 153 in_or_of: IN • - - $défaut réduction par utilisation de la règle 153 (in_or_of) - - -État 105 - - 154 in_or_of: OF • - - $défaut réduction par utilisation de la règle 154 (in_or_of) - - -État 106 - - 148 copy_statement: COPY copy_source copy_in • copy_suppress copy_replacing - - SUPPRESS décalage et aller à l'état 174 - - $défaut réduction par utilisation de la règle 155 (copy_suppress) - - copy_suppress aller à l'état 175 - - -État 107 - - 152 copy_in: in_or_of • copy_source - - "Identifier or Literal" décalage et aller à l'état 26 - "Text-Name" décalage et aller à l'état 27 - - copy_source aller à l'état 176 - - -État 108 - - 165 text_src: "==" • token_list "==" - - "Identifier or Literal" décalage et aller à l'état 177 - - token_list aller à l'état 178 - - -État 109 - - 181 lead_trail: LEADING • - - $défaut réduction par utilisation de la règle 181 (lead_trail) - - -État 110 - - 182 lead_trail: TRAILING • - - $défaut réduction par utilisation de la règle 182 (lead_trail) - - -État 111 - - 175 identifier: "Identifier or Literal" • - - $défaut réduction par utilisation de la règle 175 (identifier) - - -État 112 - - 159 replace_statement: REPLACE _also replacing_list • - 163 replacing_list: replacing_list • text_src BY text_dst - 164 | replacing_list • lead_trail text_partial_src BY text_partial_dst - - "==" décalage et aller à l'état 108 - LEADING décalage et aller à l'état 109 - TRAILING décalage et aller à l'état 110 - "Identifier or Literal" décalage et aller à l'état 111 - - $défaut réduction par utilisation de la règle 159 (replace_statement) - - text_src aller à l'état 179 - identifier aller à l'état 114 - lead_trail aller à l'état 180 - - -État 113 - - 161 replacing_list: text_src • BY text_dst - - BY décalage et aller à l'état 181 - - -État 114 - - 166 text_src: identifier • - 176 identifier: identifier • IN "Identifier or Literal" - 177 | identifier • OF "Identifier or Literal" - 178 | identifier • '(' subscripts ')' - - IN décalage et aller à l'état 182 - OF décalage et aller à l'état 183 - '(' décalage et aller à l'état 184 - - $défaut réduction par utilisation de la règle 166 (text_src) - - -État 115 - - 162 replacing_list: lead_trail • text_partial_src BY text_partial_dst - - "==" décalage et aller à l'état 185 - - text_partial_src aller à l'état 186 - - -État 116 - - 160 replace_statement: REPLACE _last OFF • - - $défaut réduction par utilisation de la règle 160 (replace_statement) - - -État 117 - - 105 _dot: "." • - - $défaut réduction par utilisation de la règle 105 (_dot) - - -État 118 - - 95 listing_statement: TITLE_STATEMENT "Literal" _dot • "end of line" - - "end of line" décalage et aller à l'état 187 - - -État 119 - - 67 alnum_with: "Literal" • WITH "Literal" - - WITH décalage et aller à l'état 188 - - -État 120 - - 66 alnum_with_list: alnum_with_list • alnum_with - 87 cobol_words_directive: EQUATE alnum_with_list • - - "Literal" décalage et aller à l'état 119 - - $défaut réduction par utilisation de la règle 87 (cobol_words_directive) - - alnum_with aller à l'état 189 - - -État 121 - - 65 alnum_with_list: alnum_with • - - $défaut réduction par utilisation de la règle 65 (alnum_with_list) - - -État 122 - - 60 alnum_list: "Literal" • - - $défaut réduction par utilisation de la règle 60 (alnum_list) - - -État 123 - - 61 alnum_list: alnum_list • "Literal" - 88 cobol_words_directive: UNDEFINE alnum_list • - - "Literal" décalage et aller à l'état 190 - - $défaut réduction par utilisation de la règle 88 (cobol_words_directive) - - -État 124 - - 70 alnum_by: "Literal" • BY "Literal" - - BY décalage et aller à l'état 191 - - -État 125 - - 69 alnum_by_list: alnum_by_list • alnum_by - 89 cobol_words_directive: SUBSTITUTE alnum_by_list • - - "Literal" décalage et aller à l'état 124 - - $défaut réduction par utilisation de la règle 89 (cobol_words_directive) - - alnum_by aller à l'état 192 - - -État 126 - - 68 alnum_by_list: alnum_by • - - $défaut réduction par utilisation de la règle 68 (alnum_by_list) - - -État 127 - - 61 alnum_list: alnum_list • "Literal" - 90 cobol_words_directive: RESERVE alnum_list • - - "Literal" décalage et aller à l'état 190 - - $défaut réduction par utilisation de la règle 90 (cobol_words_directive) - - -État 128 - - 97 control_options: control_options control_option • - - $défaut réduction par utilisation de la règle 97 (control_options) - - -État 129 - - 7 statement: CONTROL_STATEMENT control_options _dot • "end of line" - - "end of line" décalage et aller à l'état 193 - - -État 130 - - 196 _is: IS • - - $défaut réduction par utilisation de la règle 196 (_is) - - -État 131 - - 75 source_directive: _format _is • format_type - - "word" décalage et aller à l'état 194 - FIXED décalage et aller à l'état 195 - FREE décalage et aller à l'état 196 - VARIABLE décalage et aller à l'état 197 - - format_type aller à l'état 198 - - -État 132 - - 121 call_choice: COBOL • - - $défaut réduction par utilisation de la règle 121 (call_choice) - - -État 133 - - 122 call_choice: "EXTERN" • - - $défaut réduction par utilisation de la règle 122 (call_choice) - - -État 134 - - 123 call_choice: STDCALL • - - $défaut réduction par utilisation de la règle 123 (call_choice) - - -État 135 - - 124 call_choice: STATIC • - - $défaut réduction par utilisation de la règle 124 (call_choice) - - -État 136 - - 23 directive: CALL_DIRECTIVE $@3 call_directive • - 120 call_directive: call_directive • call_choice - - COBOL décalage et aller à l'état 132 - "EXTERN" décalage et aller à l'état 133 - STDCALL décalage et aller à l'état 134 - STATIC décalage et aller à l'état 135 - - $défaut réduction par utilisation de la règle 23 (directive) - - call_choice aller à l'état 199 - - -État 137 - - 119 call_directive: call_choice • - - $défaut réduction par utilisation de la règle 119 (call_directive) - - -État 138 - - 85 define_directive: CONSTANT "Variable" • _as "Literal" _override - - AS décalage et aller à l'état 139 - - $défaut réduction par utilisation de la règle 191 (_as) - - _as aller à l'état 200 - - -État 139 - - 192 _as: AS • - - $défaut réduction par utilisation de la règle 192 (_as) - - -État 140 - - 82 define_directive: "Variable" _as • "Literal" _override - 83 | "Variable" _as • PARAMETER _override - 84 | "Variable" _as • OFF - - OFF décalage et aller à l'état 201 - PARAMETER décalage et aller à l'état 202 - "Literal" décalage et aller à l'état 203 - - -État 141 - - 64 alnum_equality: "Literal" • "=" "Literal" - - "=" décalage et aller à l'état 204 - - -État 142 - - 54 set_choice: OVERRIDE alnum_equality_list • - 63 alnum_equality_list: alnum_equality_list • alnum_equality - - "Literal" décalage et aller à l'état 141 - - $défaut réduction par utilisation de la règle 54 (set_choice) - - alnum_equality aller à l'état 205 - - -État 143 - - 62 alnum_equality_list: alnum_equality • - - $défaut réduction par utilisation de la règle 62 (alnum_equality_list) - - -État 144 - - 32 set_choice: ADDRSV alnum_list • - 61 alnum_list: alnum_list • "Literal" - - "Literal" décalage et aller à l'état 190 - - $défaut réduction par utilisation de la règle 32 (set_choice) - - -État 145 - - 33 set_choice: ADDSYN alnum_equality • - - $défaut réduction par utilisation de la règle 33 (set_choice) - - -État 146 - - 34 set_choice: ASSIGN "Literal" • - - $défaut réduction par utilisation de la règle 34 (set_choice) - - -État 147 - - 36 set_choice: CALLFH "Literal" • - - $défaut réduction par utilisation de la règle 36 (set_choice) - - -État 148 - - 38 set_choice: XFD "Literal" • - - $défaut réduction par utilisation de la règle 38 (set_choice) - - -État 149 - - 40 set_choice: COMP1 "Literal" • - - $défaut réduction par utilisation de la règle 40 (set_choice) - - -État 150 - - 30 set_choice: CONSTANT "Variable" • "Literal" - - "Literal" décalage et aller à l'état 206 - - -État 151 - - 41 set_choice: "DPC-IN-DATA" "Literal" • - - $défaut réduction par utilisation de la règle 41 (set_choice) - - -État 152 - - 42 set_choice: FOLDCOPYNAME _as • "Literal" - - "Literal" décalage et aller à l'état 207 - - -État 153 - - 43 set_choice: KEYCOMPRESS "Literal" • - - $défaut réduction par utilisation de la règle 43 (set_choice) - - -État 154 - - 45 set_choice: MAKESYN alnum_equality • - - $défaut réduction par utilisation de la règle 45 (set_choice) - - -État 155 - - 55 set_choice: REMOVE alnum_list • - 61 alnum_list: alnum_list • "Literal" - - "Literal" décalage et aller à l'état 190 - - $défaut réduction par utilisation de la règle 55 (set_choice) - - -État 156 - - 56 set_choice: SOURCEFORMAT _as • "Literal" - 57 | SOURCEFORMAT _as • error - - error décalage et aller à l'état 208 - "Literal" décalage et aller à l'état 209 - - -État 157 - - 81 _literal: "Literal" • - - $défaut réduction par utilisation de la règle 81 (_literal) - - -État 158 - - 59 set_choice: SSRANGE _literal • - - $défaut réduction par utilisation de la règle 59 (set_choice) - - -État 159 - - 31 set_choice: "Variable" set_options • - - $défaut réduction par utilisation de la règle 31 (set_choice) - - -État 160 - - 72 set_options: _as • "Literal" - - "Literal" décalage et aller à l'état 210 - - -État 161 - - 29 set_directive: set_directive set_choice • - - $défaut réduction par utilisation de la règle 29 (set_directive) - - -État 162 - - 25 if_directive_if: error • - - $défaut réduction par utilisation de la règle 25 (if_directive_if) - - -État 163 - - 125 if_directive: "Variable" • _is _not DEFINED - 126 | "Variable" • _is _not SET - 127 | "Variable" • _is _not condition_clause object_id - 133 variable_or_literal: "Variable" • - - IS décalage et aller à l'état 130 - - error réduction par utilisation de la règle 133 (variable_or_literal) - "end of line" réduction par utilisation de la règle 133 (variable_or_literal) - "Variable" réduction par utilisation de la règle 133 (variable_or_literal) - "Literal" réduction par utilisation de la règle 133 (variable_or_literal) - $défaut réduction par utilisation de la règle 195 (_is) - - _is aller à l'état 211 - - -État 164 - - 128 if_directive: "Literal" • _is _not condition_clause object_id - 134 variable_or_literal: "Literal" • - - IS décalage et aller à l'état 130 - - error réduction par utilisation de la règle 134 (variable_or_literal) - "end of line" réduction par utilisation de la règle 134 (variable_or_literal) - "Variable" réduction par utilisation de la règle 134 (variable_or_literal) - "Literal" réduction par utilisation de la règle 134 (variable_or_literal) - $défaut réduction par utilisation de la règle 195 (_is) - - _is aller à l'état 212 - - -État 165 - - 17 directive: IF_DIRECTIVE $@1 if_directive_if • - - $défaut réduction par utilisation de la règle 17 (directive) - - -État 166 - - 24 if_directive_if: if_directive • - - $défaut réduction par utilisation de la règle 24 (if_directive_if) - - -État 167 - - 129 if_directive: garbage • - 131 garbage: garbage • variable_or_literal - 132 | garbage • error - - error décalage et aller à l'état 213 - "Variable" décalage et aller à l'état 214 - "Literal" décalage et aller à l'état 59 - - "end of line" réduction par utilisation de la règle 129 (if_directive) - - variable_or_literal aller à l'état 215 - - -État 168 - - 130 garbage: variable_or_literal • - - $défaut réduction par utilisation de la règle 130 (garbage) - - -État 169 - - 27 if_directive_elif: error • - - $défaut réduction par utilisation de la règle 27 (if_directive_elif) - - -État 170 - - 19 directive: ELIF_DIRECTIVE $@2 if_directive_elif • - - $défaut réduction par utilisation de la règle 19 (directive) - - -État 171 - - 26 if_directive_elif: if_directive • - - $défaut réduction par utilisation de la règle 26 (if_directive_elif) - - -État 172 - - 109 turn_directive: ec_list CHECKING • on_or_off - - OFF décalage et aller à l'état 216 - ON décalage et aller à l'état 217 - WITH décalage et aller à l'état 218 - LOCATION décalage et aller à l'état 219 - - on_or_off aller à l'état 220 - on_with_loc aller à l'état 221 - with_loc aller à l'état 222 - - -État 173 - - 111 ec_list: ec_list "Variable" • - - $défaut réduction par utilisation de la règle 111 (ec_list) - - -État 174 - - 156 copy_suppress: SUPPRESS • _printing - - PRINTING décalage et aller à l'état 223 - - $défaut réduction par utilisation de la règle 197 (_printing) - - _printing aller à l'état 224 - - -État 175 - - 148 copy_statement: COPY copy_source copy_in copy_suppress • copy_replacing - - REPLACING décalage et aller à l'état 225 - - $défaut réduction par utilisation de la règle 157 (copy_replacing) - - copy_replacing aller à l'état 226 - - -État 176 - - 152 copy_in: in_or_of copy_source • - - $défaut réduction par utilisation de la règle 152 (copy_in) - - -État 177 - - 173 token_list: "Identifier or Literal" • - - $défaut réduction par utilisation de la règle 173 (token_list) - - -État 178 - - 165 text_src: "==" token_list • "==" - 174 token_list: token_list • "Identifier or Literal" - - "==" décalage et aller à l'état 227 - "Identifier or Literal" décalage et aller à l'état 228 - - -État 179 - - 163 replacing_list: replacing_list text_src • BY text_dst - - BY décalage et aller à l'état 229 - - -État 180 - - 164 replacing_list: replacing_list lead_trail • text_partial_src BY text_partial_dst - - "==" décalage et aller à l'état 185 - - text_partial_src aller à l'état 230 - - -État 181 - - 161 replacing_list: text_src BY • text_dst - - "==" décalage et aller à l'état 231 - "Identifier or Literal" décalage et aller à l'état 111 - - text_dst aller à l'état 232 - identifier aller à l'état 233 - - -État 182 - - 176 identifier: identifier IN • "Identifier or Literal" - - "Identifier or Literal" décalage et aller à l'état 234 - - -État 183 - - 177 identifier: identifier OF • "Identifier or Literal" - - "Identifier or Literal" décalage et aller à l'état 235 - - -État 184 - - 178 identifier: identifier '(' • subscripts ')' - - "Identifier or Literal" décalage et aller à l'état 236 - - subscripts aller à l'état 237 - - -État 185 - - 170 text_partial_src: "==" • "Identifier or Literal" "==" - - "Identifier or Literal" décalage et aller à l'état 238 - - -État 186 - - 162 replacing_list: lead_trail text_partial_src • BY text_partial_dst - - BY décalage et aller à l'état 239 - - -État 187 - - 95 listing_statement: TITLE_STATEMENT "Literal" _dot "end of line" • - - $défaut réduction par utilisation de la règle 95 (listing_statement) - - -État 188 - - 67 alnum_with: "Literal" WITH • "Literal" - - "Literal" décalage et aller à l'état 240 - - -État 189 - - 66 alnum_with_list: alnum_with_list alnum_with • - - $défaut réduction par utilisation de la règle 66 (alnum_with_list) - - -État 190 - - 61 alnum_list: alnum_list "Literal" • - - $défaut réduction par utilisation de la règle 61 (alnum_list) - - -État 191 - - 70 alnum_by: "Literal" BY • "Literal" - - "Literal" décalage et aller à l'état 241 - - -État 192 - - 69 alnum_by_list: alnum_by_list alnum_by • - - $défaut réduction par utilisation de la règle 69 (alnum_by_list) - - -État 193 - - 7 statement: CONTROL_STATEMENT control_options _dot "end of line" • - - $défaut réduction par utilisation de la règle 7 (statement) - - -État 194 - - 79 format_type: "word" • - - $défaut réduction par utilisation de la règle 79 (format_type) - - -État 195 - - 76 format_type: FIXED • - - $défaut réduction par utilisation de la règle 76 (format_type) - - -État 196 - - 77 format_type: FREE • - - $défaut réduction par utilisation de la règle 77 (format_type) - - -État 197 - - 78 format_type: VARIABLE • - - $défaut réduction par utilisation de la règle 78 (format_type) - - -État 198 - - 75 source_directive: _format _is format_type • - - $défaut réduction par utilisation de la règle 75 (source_directive) - - -État 199 - - 120 call_directive: call_directive call_choice • - - $défaut réduction par utilisation de la règle 120 (call_directive) - - -État 200 - - 85 define_directive: CONSTANT "Variable" _as • "Literal" _override - - "Literal" décalage et aller à l'état 242 - - -État 201 - - 84 define_directive: "Variable" _as OFF • - - $défaut réduction par utilisation de la règle 84 (define_directive) - - -État 202 - - 83 define_directive: "Variable" _as PARAMETER • _override - - OVERRIDE décalage et aller à l'état 243 - - $défaut réduction par utilisation de la règle 183 (_override) - - _override aller à l'état 244 - - -État 203 - - 82 define_directive: "Variable" _as "Literal" • _override - - OVERRIDE décalage et aller à l'état 243 - - $défaut réduction par utilisation de la règle 183 (_override) - - _override aller à l'état 245 - - -État 204 - - 64 alnum_equality: "Literal" "=" • "Literal" - - "Literal" décalage et aller à l'état 246 - - -État 205 - - 63 alnum_equality_list: alnum_equality_list alnum_equality • - - $défaut réduction par utilisation de la règle 63 (alnum_equality_list) - - -État 206 - - 30 set_choice: CONSTANT "Variable" "Literal" • - - $défaut réduction par utilisation de la règle 30 (set_choice) - - -État 207 - - 42 set_choice: FOLDCOPYNAME _as "Literal" • - - $défaut réduction par utilisation de la règle 42 (set_choice) - - -État 208 - - 57 set_choice: SOURCEFORMAT _as error • - - $défaut réduction par utilisation de la règle 57 (set_choice) - - -État 209 - - 56 set_choice: SOURCEFORMAT _as "Literal" • - - $défaut réduction par utilisation de la règle 56 (set_choice) - - -État 210 - - 72 set_options: _as "Literal" • - - $défaut réduction par utilisation de la règle 72 (set_options) - - -État 211 - - 125 if_directive: "Variable" _is • _not DEFINED - 126 | "Variable" _is • _not SET - 127 | "Variable" _is • _not condition_clause object_id - - NOT décalage et aller à l'état 247 - - $défaut réduction par utilisation de la règle 185 (_not) - - _not aller à l'état 248 - - -État 212 - - 128 if_directive: "Literal" _is • _not condition_clause object_id - - NOT décalage et aller à l'état 247 - - $défaut réduction par utilisation de la règle 185 (_not) - - _not aller à l'état 249 - - -État 213 - - 132 garbage: garbage error • - - $défaut réduction par utilisation de la règle 132 (garbage) - - -État 214 - - 133 variable_or_literal: "Variable" • - - $défaut réduction par utilisation de la règle 133 (variable_or_literal) - - -État 215 - - 131 garbage: garbage variable_or_literal • - - $défaut réduction par utilisation de la règle 131 (garbage) - - -État 216 - - 114 on_or_off: OFF • - - $défaut réduction par utilisation de la règle 114 (on_or_off) - - -État 217 - - 113 on_or_off: ON • - 115 on_with_loc: ON • with_loc - - WITH décalage et aller à l'état 218 - LOCATION décalage et aller à l'état 219 - - $défaut réduction par utilisation de la règle 113 (on_or_off) - - with_loc aller à l'état 250 - - -État 218 - - 117 with_loc: WITH • LOCATION - - LOCATION décalage et aller à l'état 251 - - -État 219 - - 118 with_loc: LOCATION • - - $défaut réduction par utilisation de la règle 118 (with_loc) - - -État 220 - - 109 turn_directive: ec_list CHECKING on_or_off • - - $défaut réduction par utilisation de la règle 109 (turn_directive) - - -État 221 - - 112 on_or_off: on_with_loc • - - $défaut réduction par utilisation de la règle 112 (on_or_off) - - -État 222 - - 116 on_with_loc: with_loc • - - $défaut réduction par utilisation de la règle 116 (on_with_loc) - - -État 223 - - 198 _printing: PRINTING • - - $défaut réduction par utilisation de la règle 198 (_printing) - - -État 224 - - 156 copy_suppress: SUPPRESS _printing • - - $défaut réduction par utilisation de la règle 156 (copy_suppress) - - -État 225 - - 158 copy_replacing: REPLACING • replacing_list - - "==" décalage et aller à l'état 108 - LEADING décalage et aller à l'état 109 - TRAILING décalage et aller à l'état 110 - "Identifier or Literal" décalage et aller à l'état 111 - - replacing_list aller à l'état 252 - text_src aller à l'état 113 - identifier aller à l'état 114 - lead_trail aller à l'état 115 - - -État 226 - - 148 copy_statement: COPY copy_source copy_in copy_suppress copy_replacing • - - $défaut réduction par utilisation de la règle 148 (copy_statement) - - -État 227 - - 165 text_src: "==" token_list "==" • - - $défaut réduction par utilisation de la règle 165 (text_src) - - -État 228 - - 174 token_list: token_list "Identifier or Literal" • - - $défaut réduction par utilisation de la règle 174 (token_list) - - -État 229 - - 163 replacing_list: replacing_list text_src BY • text_dst - - "==" décalage et aller à l'état 231 - "Identifier or Literal" décalage et aller à l'état 111 - - text_dst aller à l'état 253 - identifier aller à l'état 233 - - -État 230 - - 164 replacing_list: replacing_list lead_trail text_partial_src • BY text_partial_dst - - BY décalage et aller à l'état 254 - - -État 231 - - 167 text_dst: "==" • "==" - 168 | "==" • token_list "==" - - "==" décalage et aller à l'état 255 - "Identifier or Literal" décalage et aller à l'état 177 - - token_list aller à l'état 256 - - -État 232 - - 161 replacing_list: text_src BY text_dst • - - $défaut réduction par utilisation de la règle 161 (replacing_list) - - -État 233 - - 169 text_dst: identifier • - 176 identifier: identifier • IN "Identifier or Literal" - 177 | identifier • OF "Identifier or Literal" - 178 | identifier • '(' subscripts ')' - - IN décalage et aller à l'état 182 - OF décalage et aller à l'état 183 - '(' décalage et aller à l'état 184 - - $défaut réduction par utilisation de la règle 169 (text_dst) - - -État 234 - - 176 identifier: identifier IN "Identifier or Literal" • - - $défaut réduction par utilisation de la règle 176 (identifier) - - -État 235 - - 177 identifier: identifier OF "Identifier or Literal" • - - $défaut réduction par utilisation de la règle 177 (identifier) - - -État 236 - - 179 subscripts: "Identifier or Literal" • - - $défaut réduction par utilisation de la règle 179 (subscripts) - - -État 237 - - 178 identifier: identifier '(' subscripts • ')' - 180 subscripts: subscripts • "Identifier or Literal" - - "Identifier or Literal" décalage et aller à l'état 257 - ')' décalage et aller à l'état 258 - - -État 238 - - 170 text_partial_src: "==" "Identifier or Literal" • "==" - - "==" décalage et aller à l'état 259 - - -État 239 - - 162 replacing_list: lead_trail text_partial_src BY • text_partial_dst - - "==" décalage et aller à l'état 260 - - text_partial_dst aller à l'état 261 - - -État 240 - - 67 alnum_with: "Literal" WITH "Literal" • - - $défaut réduction par utilisation de la règle 67 (alnum_with) - - -État 241 - - 70 alnum_by: "Literal" BY "Literal" • - - $défaut réduction par utilisation de la règle 70 (alnum_by) - - -État 242 - - 85 define_directive: CONSTANT "Variable" _as "Literal" • _override - - OVERRIDE décalage et aller à l'état 243 - - $défaut réduction par utilisation de la règle 183 (_override) - - _override aller à l'état 262 - - -État 243 - - 184 _override: OVERRIDE • - - $défaut réduction par utilisation de la règle 184 (_override) - - -État 244 - - 83 define_directive: "Variable" _as PARAMETER _override • - - $défaut réduction par utilisation de la règle 83 (define_directive) - - -État 245 - - 82 define_directive: "Variable" _as "Literal" _override • - - $défaut réduction par utilisation de la règle 82 (define_directive) - - -État 246 - - 64 alnum_equality: "Literal" "=" "Literal" • - - $défaut réduction par utilisation de la règle 64 (alnum_equality) - - -État 247 - - 186 _not: NOT • - - $défaut réduction par utilisation de la règle 186 (_not) - - -État 248 - - 125 if_directive: "Variable" _is _not • DEFINED - 126 | "Variable" _is _not • SET - 127 | "Variable" _is _not • condition_clause object_id - - ">=" décalage et aller à l'état 263 - "<=" décalage et aller à l'état 264 - "<" décalage et aller à l'état 265 - ">" décalage et aller à l'état 266 - "=" décalage et aller à l'état 267 - "<>" décalage et aller à l'état 268 - EQUAL décalage et aller à l'état 269 - GREATER décalage et aller à l'état 270 - LESS décalage et aller à l'état 271 - SET décalage et aller à l'état 272 - DEFINED décalage et aller à l'état 273 - - condition_clause aller à l'état 274 - - -État 249 - - 128 if_directive: "Literal" _is _not • condition_clause object_id - - ">=" décalage et aller à l'état 263 - "<=" décalage et aller à l'état 264 - "<" décalage et aller à l'état 265 - ">" décalage et aller à l'état 266 - "=" décalage et aller à l'état 267 - "<>" décalage et aller à l'état 268 - EQUAL décalage et aller à l'état 269 - GREATER décalage et aller à l'état 270 - LESS décalage et aller à l'état 271 - - condition_clause aller à l'état 275 - - -État 250 - - 115 on_with_loc: ON with_loc • - - $défaut réduction par utilisation de la règle 115 (on_with_loc) - - -État 251 - - 117 with_loc: WITH LOCATION • - - $défaut réduction par utilisation de la règle 117 (with_loc) - - -État 252 - - 158 copy_replacing: REPLACING replacing_list • - 163 replacing_list: replacing_list • text_src BY text_dst - 164 | replacing_list • lead_trail text_partial_src BY text_partial_dst - - "==" décalage et aller à l'état 108 - LEADING décalage et aller à l'état 109 - TRAILING décalage et aller à l'état 110 - "Identifier or Literal" décalage et aller à l'état 111 - - $défaut réduction par utilisation de la règle 158 (copy_replacing) - - text_src aller à l'état 179 - identifier aller à l'état 114 - lead_trail aller à l'état 180 - - -État 253 - - 163 replacing_list: replacing_list text_src BY text_dst • - - $défaut réduction par utilisation de la règle 163 (replacing_list) - - -État 254 - - 164 replacing_list: replacing_list lead_trail text_partial_src BY • text_partial_dst - - "==" décalage et aller à l'état 260 - - text_partial_dst aller à l'état 276 - - -État 255 - - 167 text_dst: "==" "==" • - - $défaut réduction par utilisation de la règle 167 (text_dst) - - -État 256 - - 168 text_dst: "==" token_list • "==" - 174 token_list: token_list • "Identifier or Literal" - - "==" décalage et aller à l'état 277 - "Identifier or Literal" décalage et aller à l'état 228 - - -État 257 - - 180 subscripts: subscripts "Identifier or Literal" • - - $défaut réduction par utilisation de la règle 180 (subscripts) - - -État 258 - - 178 identifier: identifier '(' subscripts ')' • - - $défaut réduction par utilisation de la règle 178 (identifier) - - -État 259 - - 170 text_partial_src: "==" "Identifier or Literal" "==" • - - $défaut réduction par utilisation de la règle 170 (text_partial_src) - - -État 260 - - 171 text_partial_dst: "==" • "==" - 172 | "==" • "Identifier or Literal" "==" - - "==" décalage et aller à l'état 278 - "Identifier or Literal" décalage et aller à l'état 279 - - -État 261 - - 162 replacing_list: lead_trail text_partial_src BY text_partial_dst • - - $défaut réduction par utilisation de la règle 162 (replacing_list) - - -État 262 - - 85 define_directive: CONSTANT "Variable" _as "Literal" _override • - - $défaut réduction par utilisation de la règle 85 (define_directive) - - -État 263 - - 142 condition_clause: ">=" • - - $défaut réduction par utilisation de la règle 142 (condition_clause) - - -État 264 - - 144 condition_clause: "<=" • - - $défaut réduction par utilisation de la règle 144 (condition_clause) - - -État 265 - - 145 condition_clause: "<" • - - $défaut réduction par utilisation de la règle 145 (condition_clause) - - -État 266 - - 143 condition_clause: ">" • - - $défaut réduction par utilisation de la règle 143 (condition_clause) - - -État 267 - - 146 condition_clause: "=" • - - $défaut réduction par utilisation de la règle 146 (condition_clause) - - -État 268 - - 147 condition_clause: "<>" • - - $défaut réduction par utilisation de la règle 147 (condition_clause) - - -État 269 - - 141 condition_clause: EQUAL • _to - - TO décalage et aller à l'état 280 - - $défaut réduction par utilisation de la règle 203 (_to) - - _to aller à l'état 281 - - -État 270 - - 137 condition_clause: GREATER • _than OR EQUAL _to - 138 | GREATER • _than - - THAN décalage et aller à l'état 282 - - $défaut réduction par utilisation de la règle 201 (_than) - - _than aller à l'état 283 - - -État 271 - - 139 condition_clause: LESS • _than OR EQUAL _to - 140 | LESS • _than - - THAN décalage et aller à l'état 282 - - $défaut réduction par utilisation de la règle 201 (_than) - - _than aller à l'état 284 - - -État 272 - - 126 if_directive: "Variable" _is _not SET • - - $défaut réduction par utilisation de la règle 126 (if_directive) - - -État 273 - - 125 if_directive: "Variable" _is _not DEFINED • - - $défaut réduction par utilisation de la règle 125 (if_directive) - - -État 274 - - 127 if_directive: "Variable" _is _not condition_clause • object_id - - "Variable" décalage et aller à l'état 285 - "Literal" décalage et aller à l'état 286 - - object_id aller à l'état 287 - - -État 275 - - 128 if_directive: "Literal" _is _not condition_clause • object_id - - "Variable" décalage et aller à l'état 285 - "Literal" décalage et aller à l'état 286 - - object_id aller à l'état 288 - - -État 276 - - 164 replacing_list: replacing_list lead_trail text_partial_src BY text_partial_dst • - - $défaut réduction par utilisation de la règle 164 (replacing_list) - - -État 277 - - 168 text_dst: "==" token_list "==" • - - $défaut réduction par utilisation de la règle 168 (text_dst) - - -État 278 - - 171 text_partial_dst: "==" "==" • - - $défaut réduction par utilisation de la règle 171 (text_partial_dst) - - -État 279 - - 172 text_partial_dst: "==" "Identifier or Literal" • "==" - - "==" décalage et aller à l'état 289 - - -État 280 - - 204 _to: TO • - - $défaut réduction par utilisation de la règle 204 (_to) - - -État 281 - - 141 condition_clause: EQUAL _to • - - $défaut réduction par utilisation de la règle 141 (condition_clause) - - -État 282 - - 202 _than: THAN • - - $défaut réduction par utilisation de la règle 202 (_than) - - -État 283 - - 137 condition_clause: GREATER _than • OR EQUAL _to - 138 | GREATER _than • - - OR décalage et aller à l'état 290 - - $défaut réduction par utilisation de la règle 138 (condition_clause) - - -État 284 - - 139 condition_clause: LESS _than • OR EQUAL _to - 140 | LESS _than • - - OR décalage et aller à l'état 291 - - $défaut réduction par utilisation de la règle 140 (condition_clause) - - -État 285 - - 136 object_id: "Variable" • - - $défaut réduction par utilisation de la règle 136 (object_id) - - -État 286 - - 135 object_id: "Literal" • - - $défaut réduction par utilisation de la règle 135 (object_id) - - -État 287 - - 127 if_directive: "Variable" _is _not condition_clause object_id • - - $défaut réduction par utilisation de la règle 127 (if_directive) - - -État 288 - - 128 if_directive: "Literal" _is _not condition_clause object_id • - - $défaut réduction par utilisation de la règle 128 (if_directive) - - -État 289 - - 172 text_partial_dst: "==" "Identifier or Literal" "==" • - - $défaut réduction par utilisation de la règle 172 (text_partial_dst) - - -État 290 - - 137 condition_clause: GREATER _than OR • EQUAL _to - - EQUAL décalage et aller à l'état 292 - - -État 291 - - 139 condition_clause: LESS _than OR • EQUAL _to - - EQUAL décalage et aller à l'état 293 - - -État 292 - - 137 condition_clause: GREATER _than OR EQUAL • _to - - TO décalage et aller à l'état 280 - - $défaut réduction par utilisation de la règle 203 (_to) - - _to aller à l'état 294 - - -État 293 - - 139 condition_clause: LESS _than OR EQUAL • _to - - TO décalage et aller à l'état 280 - - $défaut réduction par utilisation de la règle 203 (_to) - - _to aller à l'état 295 - - -État 294 - - 137 condition_clause: GREATER _than OR EQUAL _to • - - $défaut réduction par utilisation de la règle 137 (condition_clause) - - -État 295 - - 139 condition_clause: LESS _than OR EQUAL _to • - - $défaut réduction par utilisation de la règle 139 (condition_clause) diff --git a/libcob/ChangeLog b/libcob/ChangeLog index 60f5e044e..853741f5d 100644 --- a/libcob/ChangeLog +++ b/libcob/ChangeLog @@ -1468,6 +1468,22 @@ COB_STACKTRACE allowing to disable stracktrace creation on abort * common.c: also handle SIGEMT; skip module dump for SIGTERM and SIGINT +2020-08-18 Simon Sobisch + + rework file mapping via environment names and apply them to CBL_/C$ + * fileio.c (has_directory_separator, looks_absolute): new helpers + * fileio.c (cob_chk_file_mapping, cob_chk_file_env): rewritten: + file names / parts that start with period/digit are not converted, + periods within the name converted to underscores to get the environment + variable name, empty environment names are not used, if COB_FILE_PATH + is set, it is always applied if the file name is neither absolute nor + start with -F/-D (acu-compat) + * fileio.c (cob_open): return COB_STATUS_31_INCONSISTENT_FILENAME if it is + unset/empty + * fileio.c (open_cbl_file, cob_sys_delete_file, cob_sys_copy_file, + cob_sys_check_file_exist, cob_sys_rename_file): CBL_ and C$ file routines + use common mapping rules now + 2020-08-17 Simon Sobisch * common.c (struct exit_handlerlist, cob_sys_exit_proc): diff --git a/libcob/fbdb.c b/libcob/fbdb.c index 455dce5e2..75300feb4 100644 --- a/libcob/fbdb.c +++ b/libcob/fbdb.c @@ -797,7 +797,7 @@ ix_bdb_write_internal (cob_file *f, const int rewrite, const int opt) memset(&p->data,0,sizeof(p->data)); if (f->keys[i].tf_duplicates) { flags = 0; - dupno = get_dupno(f, i); + dupno = get_dupno (f, i); dupno = COB_DUPSWAP (dupno); if (dupno > dupcnt) dupcnt = dupno; diff --git a/libcob/fileio.c b/libcob/fileio.c index f565e1fa6..3f8ee86b3 100644 --- a/libcob/fileio.c +++ b/libcob/fileio.c @@ -1431,7 +1431,11 @@ cob_read_dict (cob_file *f, char *filename, int updt) return ret; } -/* Check for file options from environment variables */ +/* Check for DD_xx, dd_xx, xx environment variables for a filename + or a part specified with 'src'; + returns either the value or NULL if not found in the environment + Note: MF only checks for xx if the variable started with a $, + ACUCOBOL only checks for xx in general ... */ static char * cob_chk_file_env (cob_file *f, const char *src) { @@ -1441,78 +1445,106 @@ cob_chk_file_env (cob_file *f, const char *src) const char *t; unsigned int i; + /* GC-sanity rule: no environment handling if src starts with period */ + if (*src == '.') { + return NULL; + } + + /* no mapping if filename begins with a slash [externally checked], hypen or digits + (taken from "Programmer's Guide to File Handling, Chapter 2: File Naming") */ + switch (*file_open_name) { + case '-': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + return NULL; + default: + break; + } + + q = cob_strdup (src); + s = q; if (file_setptr->cob_env_mangle) { - q = cob_strdup (src); - s = q; for (i = 0; s[i] != 0; ++i) { if (!isalnum ((int)s[i])) { s[i] = '_'; } } } else { - q = NULL; - s = (char *)src; - } - - if ((file_open_io_env = cob_get_env ("IO_OPTIONS", NULL)) != NULL) { - cob_set_file_format (f, file_open_io_env, 1); /* Set initial defaults */ - } - if (f->organization == COB_ORG_INDEXED) { - t = "IX"; - } else if (f->organization == COB_ORG_SEQUENTIAL) { - t = "SQ"; - } else if (f->organization == COB_ORG_LINE_SEQUENTIAL) { - if((f->flag_line_adv & COB_LINE_ADVANCE)) - t = "LA"; - else - t = "LS"; - } else if (f->organization == COB_ORG_RELATIVE) { - t = "RL"; - } else { - t = "IO"; - } - snprintf (file_open_env, (size_t)COB_FILE_MAX, "%s_OPTIONS", t); - if ((file_open_io_env = cob_get_env (file_open_env, NULL)) == NULL) { - snprintf (file_open_env, (size_t)COB_FILE_MAX, "%s_options", t); - file_open_env[0] = (char)tolower(file_open_env[0]); - file_open_env[1] = (char)tolower(file_open_env[1]); - file_open_io_env = cob_get_env (file_open_env, NULL); - } - if (file_open_io_env != NULL) { - cob_set_file_format (f, file_open_io_env, 1); /* Defaults for file type */ + for (i = 0; s[i] != 0; ++i) { + if (s[i] == '.') { + s[i] = '_'; + } + } } - /* Check for IO_filename with file specific options */ - file_open_io_env = NULL; - snprintf (file_open_env, (size_t)COB_FILE_MAX, "%s%s", "IO_", s); - if ((file_open_io_env = cob_get_env (file_open_env, NULL)) == NULL) { - snprintf (file_open_env, (size_t)COB_FILE_MAX, "%s%s", "io_", s); + if (f != NULL) { + if ((file_open_io_env = cob_get_env ("IO_OPTIONS", NULL)) != NULL) { + cob_set_file_format (f, file_open_io_env, 1); /* Set initial defaults */ + } + if (f->organization == COB_ORG_INDEXED) { + t = "IX"; + } else if (f->organization == COB_ORG_SEQUENTIAL) { + t = "SQ"; + } else if (f->organization == COB_ORG_LINE_SEQUENTIAL) { + if((f->flag_line_adv & COB_LINE_ADVANCE)) + t = "LA"; + else + t = "LS"; + } else if (f->organization == COB_ORG_RELATIVE) { + t = "RL"; + } else { + t = "IO"; + } + snprintf (file_open_env, (size_t)COB_FILE_MAX, "%s_OPTIONS", t); if ((file_open_io_env = cob_get_env (file_open_env, NULL)) == NULL) { - for (i = 0; file_open_env[i] != 0; ++i) { /* Try all Upper Case */ - file_open_env[i] = (char)toupper((unsigned char)file_open_env[i]); - } + snprintf (file_open_env, (size_t)COB_FILE_MAX, "%s_options", t); + file_open_env[0] = (char)tolower(file_open_env[0]); + file_open_env[1] = (char)tolower(file_open_env[1]); file_open_io_env = cob_get_env (file_open_env, NULL); } - } - if (file_open_io_env == NULL) { /* Re-check for IO_fdname */ - snprintf (file_open_env, (size_t)COB_FILE_MAX, "%s%s", "IO_", f->select_name); + if (file_open_io_env != NULL) { + cob_set_file_format (f, file_open_io_env, 1); /* Defaults for file type */ + } + + /* Check for IO_filename with file specific options */ + file_open_io_env = NULL; + snprintf (file_open_env, (size_t)COB_FILE_MAX, "%s%s", "IO_", s); if ((file_open_io_env = cob_get_env (file_open_env, NULL)) == NULL) { - snprintf (file_open_env, (size_t)COB_FILE_MAX, "%s%s", "io_", f->select_name); + snprintf (file_open_env, (size_t)COB_FILE_MAX, "%s%s", "io_", s); if ((file_open_io_env = cob_get_env (file_open_env, NULL)) == NULL) { for (i = 0; file_open_env[i] != 0; ++i) { /* Try all Upper Case */ - file_open_env[i] = (unsigned char)toupper((int)file_open_env[i]); + file_open_env[i] = (char)toupper((unsigned char)file_open_env[i]); } file_open_io_env = cob_get_env (file_open_env, NULL); } } + if (file_open_io_env == NULL) { /* Re-check for IO_fdname */ + snprintf (file_open_env, (size_t)COB_FILE_MAX, "%s%s", "IO_", f->select_name); + if ((file_open_io_env = cob_get_env (file_open_env, NULL)) == NULL) { + snprintf (file_open_env, (size_t)COB_FILE_MAX, "%s%s", "io_", f->select_name); + if ((file_open_io_env = cob_get_env (file_open_env, NULL)) == NULL) { + for (i = 0; file_open_env[i] != 0; ++i) { /* Try all Upper Case */ + file_open_env[i] = (unsigned char)toupper((int)file_open_env[i]); + } + file_open_io_env = cob_get_env (file_open_env, NULL); + } + } + } } + /* no mapping at all if explicit disabled on compile-time (dialect configuration)*/ if (COB_MODULE_PTR && !COB_MODULE_PTR->flag_filename_mapping) { /* No DD_name checks */ strcpy (file_open_env, file_open_name); - if (q) { - cob_free (q); - } + cob_free (q); return NULL; } @@ -1520,9 +1552,11 @@ cob_chk_file_env (cob_file *f, const char *src) for (i = 0; i < NUM_PREFIX; ++i) { snprintf (file_open_env, (size_t)COB_FILE_MAX, "%s%s", prefix[i], s); file_open_env[COB_FILE_MAX] = 0; - if ((p = cob_get_env (file_open_env, NULL)) != NULL) { + p = cob_get_env (file_open_env, NULL); + if (p && *p) { break; } + p = NULL; } if (p == NULL) { /* Try all Upper case env var name */ for (i = 0; i < NUM_PREFIX; ++i) { @@ -1531,20 +1565,74 @@ cob_chk_file_env (cob_file *f, const char *src) for (i = 0; file_open_env[i] != 0; ++i) { file_open_env[i] = (char)toupper((unsigned char)file_open_env[i]); } - if ((p = cob_get_env (file_open_env, NULL)) != NULL) { + p = cob_get_env (file_open_env, NULL); + if (p && *p) { break; } + p = NULL; } if (p == NULL) { strcpy (file_open_env, file_open_name); } } - if (q) { - cob_free (q); - } + cob_free (q); return p; } +/* checks if 'src' containes a / or \ */ +static int +has_directory_separator (char *src) +{ + for (; *src; src++) { + if (*src == '/' || *src == SLASH_CHAR) { + return 1; + } + } + return 0; +} + +/* checks if 'src' looks like starting with name */ +static int +looks_absolute (char *src) +{ + /* no file path adjustment if filename is absolute + because it begins with a slash (or win-disk-drive) */ + if (file_open_name[0] == '/' + || file_open_name[0] == SLASH_CHAR +#if WIN32 + || file_open_name[1] == ':' +#endif + ) { + return 1; + } + return 0; +} + +/* checks for special ACUCOBOL-case: file that start with hypen [note: -P not supported] + no translation at all, name starts after first non-space */ +static int +has_acu_hypen (char *src) +{ + if ( src[0] == '-' + && (src[1] == 'F' || src[1] == 'D' || src[1] == 'f' || src[1] == 'd') + && isspace((cob_u8_t)src[2])) { + return 1; + } + return 0; +} + +/* do acu translation, 'src' may not be file_open_buff! */ +static void +do_acu_hypen_translation (char *src) +{ + /* maybe store device type to "adjust locking rules" */ + /* find first non-space and return it in the original storage */ + for (src = src + 3; *src && isspace ((cob_u8_t)*src); src++); + + strncpy (file_open_buff, src, (size_t)COB_FILE_MAX); + strncpy (file_open_name, file_open_buff, (size_t)COB_FILE_MAX); +} + void cob_chk_file_mapping (cob_file *f, char *filename) { @@ -1556,11 +1644,19 @@ cob_chk_file_mapping (cob_file *f, char *filename) unsigned int dollar, badchar; int k, qt; - memset (f->file_status, '0', (size_t)2); + if (f != NULL) + memset (f->file_status, '0', (size_t)2); if (filename) strcpy(file_open_name, filename); - /* Misuse "dollar" here to indicate a separator */ - dollar = 0; + + /* Special ACUCOBOL-case: file that start with hypen [note: -P not supported] + no translation at all, name starts after first non-space */ + if (has_acu_hypen (file_open_name)) { + do_acu_hypen_translation (file_open_name); + return ; + } + + /* Handle the COB_FILENAME_SPACES option */ if (chk_filename_spaces) { p = file_open_name; if (*p == '"') { @@ -1572,9 +1668,7 @@ cob_chk_file_mapping (cob_file *f, char *filename) badchar = 0; } for (; 1; p++) { - if (*p == '/' || *p == SLASH_CHAR) { - dollar = 1; - } else if (*p == qt) { + if (*p == qt) { *p = 0; if (qt == '"') memmove (file_open_name, file_open_name + 1, (size_t)(p - file_open_name)); @@ -1592,32 +1686,41 @@ cob_chk_file_mapping (cob_file *f, char *filename) break; } } - if (badchar) { + if (badchar && f != NULL) { f->file_status[0] = '9'; f->file_status[1] = 4; } - } else { - for (p = file_open_name; *p; p++) { - if (*p == '/' || *p == SLASH_CHAR) { - dollar = 1; - break; - } - } } src = file_open_name; - /* Simple case - No separators */ - if (dollar == 0) { + /* Simple case - No separators [note: this is also the ACU and Fujitsu way] */ + if (!looks_absolute(src) + && !has_directory_separator(src)) { /* Ignore leading dollar */ if (*src == '$') { src++; } /* Check for DD_xx, dd_xx, xx environment variables */ - /* If not found, use as is including the dollar character */ + /* Note: ACU and Fujitsu would only check for xx */ + /* If not found, use as is, possibly including the dollar character */ if ((p = cob_chk_file_env (f, src)) != NULL) { strncpy (file_open_name, p, (size_t)COB_FILE_MAX); - } else if (file_paths) { + /* Note: ACU specifies: "repeated until variable can't be resolved" + we don't apply this and will not in the future + [recursion is only one of the problems] */ + if (looks_absolute (src)) { + return; + } + if (has_acu_hypen (file_open_name)) { + do_acu_hypen_translation (file_open_name); + return ; + } + } + /* apply COB_FILE_PATH if set (similar to ACUCOBOL's FILE-PREFIX) + MF and Fujistu simply don't have that - not set by default, + so no compatilibity issue here */ + if (file_paths) { for(k=0; file_paths[k] != NULL; k++) { snprintf (file_open_buff, (size_t)COB_FILE_MAX, "%s%c%s", file_paths[k], SLASH_CHAR, file_open_name); @@ -1649,20 +1752,23 @@ cob_chk_file_mapping (cob_file *f, char *filename) } /* Complex */ + + /* Note: ACU and Fujitsu would return the value back and stop here */ + /* Isolate first element (everything before the slash) */ - /* If it starts with a slash, it's absolute, do nothing */ - /* Else if it starts with a $, mark and skip over the $ */ + /* If it starts with a $, mark and skip over the $ */ /* Try mapping on resultant string - DD_xx, dd_xx, xx */ /* If successful, use the mapping */ /* If not, use original element EXCEPT if we started */ - /* with a $, in which case, we ignore the element AND */ + /* with a $, in which case we ignore the element AND */ /* the following slash */ - dollar = 0; dst = file_open_buff; *dst = 0; - if (*src == '$') { + if (*src != '$') { + dollar = 0; + } else { dollar = 1; src++; } @@ -1686,29 +1792,76 @@ cob_chk_file_mapping (cob_file *f, char *filename) } /* First element completed, loop through remaining */ /* elements delimited by slash */ - /* Check each for $ mapping */ + /* Check only for $ from now on; includes the DD_xx/dd_xx/xx mapping */ + src = NULL; for (; ;) { p = strtok (orig, "/\\"); if (!p) { break; } if (!orig) { - if (dollar) { - dollar = 0; - } else { + if (!dollar) { strcat (file_open_buff, SLASH_STR); } } else { orig = NULL; } - if (*p == '$' && (src = cob_chk_file_env (f, p + 1)) != NULL) { - strncat (file_open_buff, src, (size_t)COB_FILE_MAX); + if (*p != '$') { + dollar = 0; } else { + dollar = 1; + p++; + } + if (dollar && (src = cob_chk_file_env (f, p)) != NULL) { + strncat (file_open_buff, src, (size_t)COB_FILE_MAX); + src = NULL; + } else if (!dollar) { strncat (file_open_buff, p, (size_t)COB_FILE_MAX); + src = NULL; + } else { + src = p - 1; } } + /* if we have a final $something that cannot be resolved - use as plain name */ + if (src) { + strncat (file_open_buff, src, (size_t)COB_FILE_MAX); + } strcpy (file_open_name, file_open_buff); cob_free (saveptr); + + if (looks_absolute (file_open_name)) { + return; + } + /* apply COB_FILE_PATH if set (similar to ACUCOBOL's FILE-PREFIX) */ + if (file_paths) { + for(k=0; file_paths[k] != NULL; k++) { + snprintf (file_open_buff, (size_t)COB_FILE_MAX, "%s%c%s", + file_paths[k], SLASH_CHAR, file_open_name); + file_open_buff[COB_FILE_MAX] = 0; + if (access (file_open_buff, F_OK) == 0) { + break; + } +#if defined(WITH_CISAM) || defined(WITH_DISAM) || defined(WITH_VBISAM) || defined(WITH_VISAM) + /* ISAM may append '.dat' to file name */ + snprintf (file_open_buff, (size_t)COB_FILE_MAX, "%s%c%s.dat", + file_paths[k], SLASH_CHAR, file_open_name); + file_open_buff[COB_FILE_MAX] = 0; + if (access (file_open_buff, F_OK) == 0) { + snprintf (file_open_buff, (size_t)COB_FILE_MAX, "%s%c%s", + file_paths[k], SLASH_CHAR, file_open_name); + file_open_buff[COB_FILE_MAX] = 0; + break; + } +#endif + } + if (file_paths[k] == NULL) { + snprintf (file_open_buff, (size_t)COB_FILE_MAX, "%s%c%s", + file_paths[0], SLASH_CHAR, file_open_name); + file_open_buff[COB_FILE_MAX] = 0; + } + strncpy (file_open_name, file_open_buff, (size_t)COB_FILE_MAX); + } + } void @@ -4365,8 +4518,8 @@ cob_file_open (cob_file_api *a, cob_file *f, char *filename, return COB_XSTATUS_NOT_DIR; } if (f->flag_optional) { - f->file = fp; - f->fd = fileno (fp); + f->file = NULL; + f->fd = -1; f->open_mode = (unsigned char)mode; f->flag_nonexistent = 1; f->flag_end_of_file = 1; @@ -6719,12 +6872,17 @@ cob_open (cob_file *f, const int mode, const int sharing, cob_field *fnstatus) } if (f->assign == NULL) { + /* CHECKME: that _seems_ to be a codegen error, but may also happen with EXTFH */ cob_runtime_error (_("ERROR FILE %s has ASSIGN field is NULL"), f->select_name); cob_file_save_status (f, fnstatus, COB_STATUS_31_INCONSISTENT_FILENAME); return; } if (f->assign->data == NULL) { +#if 0 /* we don't raise an error in other places and a similar error is raised in cob_fatal_error */ + cob_runtime_error ("file %s has ASSIGN field with NULL address", + f->select_name); +#endif cob_file_save_status (f, fnstatus, COB_STATUS_31_INCONSISTENT_FILENAME); return; } @@ -7654,6 +7812,7 @@ cob_param_no_quotes (int n) return (void*)s; } +/* actual processing for CBL_OPEN_FILE and CBL_CREATE_FILE */ static int open_cbl_file (cob_u8_ptr file_name, int file_access, cob_u8_ptr file_handle, const int file_flags) @@ -7685,8 +7844,12 @@ open_cbl_file (cob_u8_ptr file_name, int file_access, memset (file_handle, -1, (size_t)4); return -1; } - fd = open (fn, flag, COB_FILE_MODE); + + strncpy (file_open_name, fn, (size_t)COB_FILE_MAX); cob_free (fn); + cob_chk_file_mapping (NULL, NULL); + + fd = open (file_open_name, flag, COB_FILE_MODE); if (fd < 0) { memset (file_handle, -1, (size_t)4); return 35; @@ -7695,6 +7858,7 @@ open_cbl_file (cob_u8_ptr file_name, int file_access, return 0; } +/* entry point for library routine CBL_OPEN_FILE */ int cob_sys_open_file (unsigned char *file_name, unsigned char *file_access, unsigned char *file_lock, unsigned char *file_dev, @@ -7709,6 +7873,7 @@ cob_sys_open_file (unsigned char *file_name, unsigned char *file_access, return open_cbl_file (file_name, (int)cob_get_s64_param (2), file_handle, 0); } +/* entry point for library routine CBL_CREATE_FILE */ int cob_sys_create_file (unsigned char *file_name, unsigned char *file_access, unsigned char *file_lock, unsigned char *file_dev, @@ -7738,6 +7903,7 @@ cob_sys_create_file (unsigned char *file_name, unsigned char *file_access, return open_cbl_file (file_name, (int)cob_get_s64_param (2), file_handle, O_CREAT | O_TRUNC); } +/* entry point and processing for library routine CBL_READ_FILE */ int cob_sys_read_file (unsigned char *file_handle, unsigned char *file_offset, unsigned char *file_len, unsigned char *flags, @@ -7763,6 +7929,7 @@ cob_sys_read_file (unsigned char *file_handle, unsigned char *file_offset, if (lseek (fd, (off_t)off, SEEK_SET) == -1) { return -1; } + if (len > 0) { rc = read (fd, buf, len); if (rc < 0) { @@ -7784,6 +7951,7 @@ cob_sys_read_file (unsigned char *file_handle, unsigned char *file_offset, return rc; } +/* entry point and processing for library routine CBL_WRITE_FILE */ int cob_sys_write_file (unsigned char *file_handle, unsigned char *file_offset, unsigned char *file_len, unsigned char *flags, @@ -7813,6 +7981,7 @@ cob_sys_write_file (unsigned char *file_handle, unsigned char *file_offset, return COB_STATUS_00_SUCCESS; } +/* entry point and processing for library routine CBL_CLOSE_FILE */ int cob_sys_close_file (unsigned char *file_handle) { @@ -7824,6 +7993,7 @@ cob_sys_close_file (unsigned char *file_handle) return close (fd); } +/* dummy entry point for library routine CBL_FLUSH_FILE - doesn't do anything yet! */ int cob_sys_flush_file (unsigned char *file_handle) { @@ -7834,6 +8004,7 @@ cob_sys_flush_file (unsigned char *file_handle) return 0; } +/* entry point and processing for library routine CBL_DELETE_FILE */ int cob_sys_delete_file (unsigned char *file_name) { @@ -7848,14 +8019,20 @@ cob_sys_delete_file (unsigned char *file_name) if (fn == NULL) { return -1; } - ret = unlink (fn); + + strncpy (file_open_name, fn, (size_t)COB_FILE_MAX); cob_free (fn); + cob_chk_file_mapping (NULL, NULL); + + ret = unlink (file_open_name); if (ret) { return 128; } return 0; } +/* entry point and processing for library routine CBL_COPY_FILE, + does a direct read + write of the complete file */ int cob_sys_copy_file (unsigned char *fname1, unsigned char *fname2) { @@ -7880,20 +8057,27 @@ cob_sys_copy_file (unsigned char *fname1, unsigned char *fname2) cob_free (fn1); return -1; } + + strncpy (file_open_name, fn1, (size_t)COB_FILE_MAX); + cob_free (fn1); + cob_chk_file_mapping (NULL, NULL); + flag |= O_RDONLY; - fd1 = open (fn1, flag, 0); + fd1 = open (file_open_name, flag, 0); if (fd1 < 0) { - cob_free (fn1); cob_free (fn2); return -1; } + + strncpy (file_open_name, fn2, (size_t)COB_FILE_MAX); + cob_free (fn2); + cob_chk_file_mapping (NULL, NULL); + flag &= ~O_RDONLY; flag |= O_CREAT | O_TRUNC | O_WRONLY; - fd2 = open (fn2, flag, COB_FILE_MODE); + fd2 = open (file_open_name, flag, COB_FILE_MODE); if (fd2 < 0) { close (fd1); - cob_free (fn1); - cob_free (fn2); return -1; } @@ -7906,11 +8090,10 @@ cob_sys_copy_file (unsigned char *fname1, unsigned char *fname2) } close (fd1); close (fd2); - cob_free (fn1); - cob_free (fn2); return ret; } +/* entry point and processing for library routine CBL_CHECK_FILE_EXIST */ int cob_sys_check_file_exist (unsigned char *file_name, unsigned char *file_info) { @@ -7940,11 +8123,14 @@ cob_sys_check_file_exist (unsigned char *file_name, unsigned char *file_info) #endif } - if (stat (fn, &st) < 0) { - cob_free (fn); + strncpy (file_open_name, fn, (size_t)COB_FILE_MAX); + cob_free (fn); + cob_chk_file_mapping (NULL, NULL); + + if (stat (file_open_name, &st) < 0) { return 35; } - cob_free (fn); + sz = (cob_s64_t)st.st_size; tm = localtime (&st.st_mtime); d = (short)tm->tm_mday; @@ -7974,12 +8160,14 @@ cob_sys_check_file_exist (unsigned char *file_name, unsigned char *file_info) return 0; } +/* entry point and processing for library routine CBL_RENAME_FILE */ int cob_sys_rename_file (unsigned char *fname1, unsigned char *fname2) { char *fn1; char *fn2; - int ret; + char localbuff [COB_FILE_BUFF]; + int ret; COB_UNUSED (fname1); COB_UNUSED (fname2); @@ -7995,15 +8183,25 @@ cob_sys_rename_file (unsigned char *fname1, unsigned char *fname2) cob_free (fn1); return -1; } - ret = rename (fn1, fn2); + + strncpy (file_open_name, fn1, (size_t)COB_FILE_MAX); cob_free (fn1); + cob_chk_file_mapping (NULL, NULL); + + strncpy (localbuff, file_open_name, (size_t)COB_FILE_MAX); + + strncpy (file_open_name, fn2, (size_t)COB_FILE_MAX); cob_free (fn2); + cob_chk_file_mapping (NULL, NULL); + + ret = rename (localbuff, file_open_name); if (ret) { return 128; } return 0; } +/* entry point and processing for library routine CBL_GET_CURRENT_DIR */ int cob_sys_get_current_dir (const int p1, const int p2, unsigned char *p3) { @@ -8051,6 +8249,7 @@ cob_sys_get_current_dir (const int p1, const int p2, unsigned char *p3) return 0; } +/* entry point and processing for library routine CBL_CREATE_DIR */ int cob_sys_create_dir (unsigned char *dir) { @@ -8073,6 +8272,7 @@ cob_sys_create_dir (unsigned char *dir) return 0; } +/* entry point and processing for library routine CBL_CHANGE_DIR */ int cob_sys_change_dir (unsigned char *dir) { @@ -8095,6 +8295,7 @@ cob_sys_change_dir (unsigned char *dir) return 0; } +/* entry point and processing for library routine CBL_DELETE_DIR */ int cob_sys_delete_dir (unsigned char *dir) { @@ -8117,6 +8318,7 @@ cob_sys_delete_dir (unsigned char *dir) return 0; } +/* entry point for C$MAKEDIR, processing in cob_sys_create_dir */ int cob_sys_mkdir (unsigned char *dir) { @@ -8131,6 +8333,7 @@ cob_sys_mkdir (unsigned char *dir) return ret; } +/* entry point for C$CHDIR, processing in cob_sys_change_dir */ int cob_sys_chdir (unsigned char *dir, unsigned char *status) { @@ -8148,6 +8351,7 @@ cob_sys_chdir (unsigned char *dir, unsigned char *status) return ret; } +/* entry point for C$COPY, processing in cob_sys_copy_file */ int cob_sys_copyfile (unsigned char *fname1, unsigned char *fname2, unsigned char *file_type) @@ -8169,6 +8373,7 @@ cob_sys_copyfile (unsigned char *fname1, unsigned char *fname2, return ret; } +/* entry point and processing for C$FILEINFO */ int cob_sys_file_info (unsigned char *file_name, unsigned char *file_info) { @@ -8237,6 +8442,7 @@ cob_sys_file_info (unsigned char *file_name, unsigned char *file_info) return 0; } +/* entry point for C$DELETE, processing in cob_sys_delete_file */ int cob_sys_file_delete (unsigned char *file_name, unsigned char *file_type) { diff --git a/libcob/fisam.c b/libcob/fisam.c index 0df8e8ac1..60dd8d6fa 100644 --- a/libcob/fisam.c +++ b/libcob/fisam.c @@ -1508,8 +1508,9 @@ isam_read_next (cob_file_api *a, cob_file *f, const int read_opts) lmode = ISLOCK; } else if (read_opts & COB_READ_WAIT_LOCK) { lmode = ISLCKW; - } else if ((f->lock_mode & COB_LOCK_AUTOMATIC) - && f->open_mode != COB_OPEN_INPUT) { + } else + if ((f->lock_mode & COB_LOCK_AUTOMATIC) + && f->open_mode != COB_OPEN_INPUT) { if (!(read_opts & COB_READ_IGNORE_LOCK)) { lmode = ISLOCK; } @@ -1902,6 +1903,8 @@ isam_write (cob_file_api *a, cob_file *f, const int opt) if (ret == COB_STATUS_00_SUCCESS && retdup != COB_STATUS_00_SUCCESS) ret = retdup; + /* FIXME: use (is_suppressed_key_value) or similar to verify + that the duplicate this is not a SUPPRESSed KEY */ return ret; } diff --git a/tests/testsuite.src/run_file.at b/tests/testsuite.src/run_file.at index 6e8da8a46..c961303f5 100644 --- a/tests/testsuite.src/run_file.at +++ b/tests/testsuite.src/run_file.at @@ -3109,6 +3109,47 @@ AT_CHECK([$COBCRUN_DIRECT ./prog2], [1], [], AT_CLEANUP +AT_SETUP([ASSIGN with empty data item]) +AT_KEYWORDS([runfile status]) + +AT_DATA([prog.cob], [ + IDENTIFICATION DIVISION. + PROGRAM-ID. prog. + ENVIRONMENT DIVISION. + INPUT-OUTPUT SECTION. + FILE-CONTROL. + SELECT test-file ASSIGN path + ORGANIZATION LINE SEQUENTIAL. + DATA DIVISION. + FILE SECTION. + FD test-file. + 01 test-rec PIC X(5). + WORKING-STORAGE SECTION. + 01 WS-SUBSCRIPT-CNT PIC 9. + 01 path PIC X(10). + 01 x PIC X. + PROCEDURE DIVISION CHAINING x. + IF X = SPACE + MOVE SPACES TO path + ELSE + MOVE LOW-VALUES TO path + END-IF + OPEN INPUT test-file + DISPLAY "Hello" + STOP RUN. +]) + +AT_CHECK([$COBC -x prog.cob]) +AT_CHECK([$COBCRUN_DIRECT ./prog], [1], [], +[libcob: error: inconsistant file name (status = 31) for file test-file ('') +]) +AT_CHECK([$COBCRUN_DIRECT ./prog X], [1], [], +[libcob: error: inconsistant file name (status = 31) for file test-file ('') +]) + +AT_CLEANUP + + AT_SETUP([INDEXED file key-name]) AT_KEYWORDS([runfile split key]) @@ -5540,16 +5581,120 @@ AT_DATA([prog2.cob], [ STOP RUN. ]) +AT_DATA([prog3.cob], [ + IDENTIFICATION DIVISION. + PROGRAM-ID. prog3. + DATA DIVISION. + WORKING-STORAGE SECTION. + 01 FNAME PIC X(256). + 01 RET PIC -9. + 01 FHANDLE PIC X(4) USAGE COMP-X. + + 01 OFFSET PIC X(8) USAGE COMP-X. + 01 NBYTES PIC X(4) USAGE COMP-X. + 01 READ-BUFFER PIC X(10). + + PROCEDURE DIVISION CHAINING FNAME. + DISPLAY 'RUN WITH ' FUNCTION TRIM (FNAME TRAILING). + CALL 'CBL_OPEN_FILE' USING FNAME 1 0 0 FHANDLE. + IF RETURN-CODE NOT = 0 + DISPLAY 'error opening file ...' + MOVE 0 TO RETURN-CODE + STOP RUN. + + CALL 'CBL_CLOSE_FILE' USING FHANDLE. + IF RETURN-CODE NOT = 0 + DISPLAY 'error closing file ...' + return-code + MOVE 0 TO RETURN-CODE. + + STOP RUN. +]) + AT_CHECK([$COMPILE prog.cob], [0], [], []) -AT_CHECK([$COMPILE prog2.cob], [0], [], []) AT_CHECK([$COBCRUN_DIRECT ./prog], [0], [], [libcob: prog.cob:15: warning: call to CBL_CREATE_FILE with wrong file_lock: 11 libcob: prog.cob:15: warning: call to CBL_CREATE_FILE with wrong file_dev: 22 libcob: prog.cob:15: warning: call to CBL_OPEN_FILE with wrong access mode: 55 ]) + +AT_CHECK([$COMPILE prog2.cob], [0], [], []) AT_CHECK([$COBCRUN_DIRECT ./prog2], [0], [], []) +AT_CHECK([mkdir -p sub], [0], [], []) +AT_CHECK([$COMPILE prog3.cob], [0], [], []) +AT_CHECK([$COBCRUN_DIRECT ./prog3 notthere], [0], +[RUN WITH notthere +error opening file ... +], []) +AT_CHECK([$COBCRUN_DIRECT ./prog3 prog2], [0], +[RUN WITH prog2 +], []) +AT_CHECK([$COBCRUN_DIRECT ./prog3 ./prog2], [0], +[RUN WITH ./prog2 +], []) +# the first part is resolved by DD_var and dd_var +AT_CHECK([DD_dot="." dd_dot="A" dot="B" $COBCRUN_DIRECT ./prog3 'dot/prog'], [0], +[RUN WITH dot/prog +], []) +AT_CHECK([DD_dot="" dd_dot="." dot="A" $COBCRUN_DIRECT ./prog3 'dot/prog'], [0], +[RUN WITH dot/prog +], []) +# MF would say (ignore for now as this conflicts with ACUCOBOL) don't resolve by $ +# as it does not start with $: +#AT_CHECK([DD_dot="" dd_dot="" dot="." $COBCRUN_DIRECT ./prog3 'dot/prog'], [0], +#[RUN WITH dot/prog +#error opening file ... +#], []) +AT_CHECK([DD_dot="" dd_dot="" dot="." $COBCRUN_DIRECT ./prog3 'dot/prog'], [0], +[RUN WITH dot/prog +], []) +AT_CHECK([DD_dot="" dd_dot="" dot="" $COBCRUN_DIRECT ./prog3 'dot/prog'], [0], +[RUN WITH dot/prog +error opening file ... +], []) +# the first part with $ is resolved by DD_var and dd_var and var +AT_CHECK([DD_dot="." dd_dot="" dot="" $COBCRUN_DIRECT ./prog3 '$dot/prog'], [0], +[RUN WITH $dot/prog +], []) +AT_CHECK([DD_dot="" dd_dot="." dot="" $COBCRUN_DIRECT ./prog3 '$dot/prog'], [0], +[RUN WITH $dot/prog +], []) +AT_CHECK([DD_dot="" dd_dot="" dot="." $COBCRUN_DIRECT ./prog3 '$dot/prog'], [0], +[RUN WITH $dot/prog +], []) +# if a _leading_ $ does not exist it is removed, together with the following slash +# should ignore the variable and the first slash +AT_CHECK([DD_dot="" dd_dot="" dot="" $COBCRUN_DIRECT ./prog3 '$dot/prog'], [0], +[RUN WITH $dot/prog +], []) +# would _possibly_ fail with MF (docs are wrong here in any case...) +# but this is by GnuCOBOL design here: +AT_CHECK([DD_dot="" dd_dot="" dot="" $COBCRUN_DIRECT ./prog3 '$dot/$dotter/prog'], [0], +[RUN WITH $dot/$dotter/prog +], []) +AT_CHECK([DD_dot="" dd_dot="" dot="dot" $COBCRUN_DIRECT ./prog3 '$dot/prog'], [0], +[RUN WITH $dot/prog +error opening file ... +], []) +# should try './prog' +AT_CHECK([DD_prog="A" dd_prog="B" prog="C" $COBCRUN_DIRECT ./prog3 './prog'], [0], +[RUN WITH ./prog +], []) +# should try './$prog' +AT_CHECK([DD_prog="" dd_prog="" prog="" $COBCRUN_DIRECT ./prog3 './$prog'], [0], +[RUN WITH ./$prog +error opening file ... +], []) +AT_CHECK([$COBCRUN_DIRECT ./prog3 ../prog2], [0], +[RUN WITH ../prog2 +error opening file ... +], []) +AT_CHECK([$COBCRUN_DIRECT ./prog3 sub/../prog2], [0], +[RUN WITH sub/../prog2 +], []) + AT_CLEANUP