/** * Open the specified output file. If it already exists, load its * contents and save the non-generated (hand edited) portions. * If a "start mark" is found, everything before it is preserved leader. * If not, the entire thing is a trailer. Assuming the start is found, * then everything after the end marker is the trailer. If the end * mark is not found, the file is actually corrupt, but we take the * remainder to be the trailer. * * @param[in] fname the output file name */ static void open_out(char const * fname) { do { char * txt = script_text = load_old_output(fname); char * scn; if (txt == NULL) break; scn = strstr(txt, START_MARK); if (scn == NULL) { script_trailer = txt; break; } *(scn++) = NUL; scn = strstr(scn, END_MARK); if (scn == NULL) { /* * The file is corrupt. */ script_trailer = txt + strlen(txt) + START_MARK_LEN + 1; break; } /* * Check to see if the data contains our marker. * If it does, then we will skip over it */ script_trailer = scn + END_MARK_LEN; script_leader = txt; } while (false); if (freopen(fname, "w" FOPEN_BINARY_FLAG, stdout) != stdout) { fprintf(stderr, zFreopenFail, errno, strerror(errno)); exit(EXIT_FAILURE); } }
/** * Open the specified output file. If it already exists, load its * contents and save the non-generated (hand edited) portions. * If a "start mark" is found, everything before it is preserved leader. * If not, the entire thing is a trailer. Assuming the start is found, * then everything after the end marker is the trailer. If the end * mark is not found, the file is actually corrupt, but we take the * remainder to be the trailer. * * @param[in] fname the output file name */ static void open_out(char const * fname, char const * pname) { do { char * txt = script_text = load_old_output(fname, pname); char * scn; if (txt == NULL) break; scn = strstr(txt, START_MARK); if (scn == NULL) { script_trailer = txt; break; } *(scn++) = NUL; scn = strstr(scn, END_MARK); if (scn == NULL) { /* * The file is corrupt. Set the trailer to be everything * after the start mark. The user will need to fix it up. */ script_trailer = txt + strlen(txt) + START_MARK_LEN + 1; break; } /* * Check to see if the data contains our marker. * If it does, then we will skip over it */ script_trailer = scn + END_MARK_LEN; script_leader = txt; } while (false); if (freopen(fname, "w" FOPEN_BINARY_FLAG, stdout) != stdout) fserr_exit(pname, "freopen", fname); }