Skip to content

Commit

Permalink
Refactor cob_chk_file_mapping
Browse files Browse the repository at this point in the history
  • Loading branch information
ddeclerck committed Jun 8, 2024
1 parent 18626fb commit 5174bb3
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 61 deletions.
5 changes: 5 additions & 0 deletions libcob/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@

2024-06-08 David Declerck <[email protected]>

* fileio.c (apply_file_paths): extracted from cob_chk_file_mapping
to factor out duplicated code

2023-06-02 Simon Sobisch <[email protected]>

* fisam.c (isam_read_next): use ISSTAT only for COB_WITH_STATUS_02,
Expand Down
103 changes: 42 additions & 61 deletions libcob/fileio.c
Original file line number Diff line number Diff line change
Expand Up @@ -1633,6 +1633,45 @@ do_acu_hypen_translation (char *src)
strncpy (file_open_name, file_open_buff, (size_t)COB_FILE_MAX);
}

/* 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; writes to global file_open_buff */
static void
apply_file_paths (char *src)
{
int k;
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, src);
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, src);
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, src);
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, src);
file_open_buff[COB_FILE_MAX] = 0;
}
strncpy (file_open_name, file_open_buff, (size_t)COB_FILE_MAX);
} else if (src != file_open_name) {
strncpy (file_open_name, src, (size_t)COB_FILE_MAX);
}
}

void
cob_chk_file_mapping (cob_file *f, char *filename)
{
Expand All @@ -1642,7 +1681,7 @@ cob_chk_file_mapping (cob_file *f, char *filename)
char *saveptr;
char *orig;
unsigned int dollar, badchar;
int k, qt;
int qt;

if (f != NULL)
memset (f->file_status, '0', (size_t)2);
Expand Down Expand Up @@ -1717,37 +1756,7 @@ cob_chk_file_mapping (cob_file *f, char *filename)
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);
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);
}
apply_file_paths (file_open_name);
return;
}

Expand Down Expand Up @@ -1832,36 +1841,8 @@ cob_chk_file_mapping (cob_file *f, char *filename)
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);
}

apply_file_paths (file_open_name);
}

void
Expand Down
37 changes: 37 additions & 0 deletions tests/testsuite.src/run_extensions.at
Original file line number Diff line number Diff line change
Expand Up @@ -2969,10 +2969,30 @@ AT_DATA([prog.cob], [
STOP RUN.
])

AT_DATA([prog2.cob], [
IDENTIFICATION DIVISION.
PROGRAM-ID. prog.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT TEST-FILE ASSIGN "SUBDIR/FILENAMEX".
DATA DIVISION.
FILE SECTION.
FD TEST-FILE.
01 TEST-REC PIC X(4).
PROCEDURE DIVISION.
OPEN OUTPUT TEST-FILE.
CLOSE TEST-FILE.
STOP RUN.
])

AT_CHECK([$COMPILE -ffilename-mapping prog.cob], [0], [], [])

AT_CHECK([rm -rf "tstdir" && mkdir "tstdir"], [0], [], [])

AT_CHECK([COB_FILE_PATH="tstdir" $COBCRUN_DIRECT ./prog], [0], [], [])
AT_CHECK([test -f "tstdir/FILENAMEX" && rm -f "tstdir/FILENAMEX"], [0], [], [])

AT_CHECK([COB_FILE_PATH="tstdir/" $COBCRUN_DIRECT ./prog], [0], [], [])
AT_CHECK([test -f "tstdir/FILENAMEX"], [0], [], [])

Expand All @@ -2983,6 +3003,23 @@ AT_CHECK([cat prog.err | tr '\\' '/'], [0],
[libcob: prog.cob:13: error: permanent file error (status = 30) for file TEST-FILE ('FILENAMEX' => ./nosubhere/FILENAMEX) on OPEN
], [])


AT_CHECK([$COMPILE -ffilename-mapping prog2.cob], [0], [], [])

AT_CHECK([mkdir "tstdir/SUBDIR"], [0], [], [])

AT_CHECK([COB_FILE_PATH="tstdir" $COBCRUN_DIRECT ./prog2], [0], [], [])
AT_CHECK([test -f "tstdir/SUBDIR/FILENAMEX" && rm -f "tstdir/SUBDIR/FILENAMEX"], [0], [], [])

AT_CHECK([COB_FILE_PATH="tstdir/" $COBCRUN_DIRECT ./prog2], [0], [], [])
AT_CHECK([test -f "tstdir/SUBDIR/FILENAMEX"], [0], [], [])

AT_CHECK([COB_FILE_PATH="./nosubhere" $COBCRUN_DIRECT ./prog2 2>prog.err], [1], [], [])
AT_CHECK([cat prog.err | tr '\\' '/'], [0],
[libcob: prog2.cob:13: error: permanent file error (status = 30) for file TEST-FILE ('SUBDIR/FILENAMEX' => ./nosubhere/SUBDIR/FILENAMEX) on OPEN
], [])


AT_CLEANUP


Expand Down

0 comments on commit 5174bb3

Please sign in to comment.