main(int argc, char **argv) { char *txtFile = 0; unsigned long heapPos; int rc; unsigned extraSpace; if(argc > 1 && *argv[1] == '/' && toupper(argv[1][1]) == 'T') { txtFile = &argv[1][2]; --argc; ++argv; } if(argc != 4) { puts("Useage: INFORES resfile mapfile exefile"); return 127; } if((rc = scanMapFile(argv[2], &heapPos, &extraSpace)) != 0) return rc; if((rc = addImageDisplacement(argv[3], &heapPos, &extraSpace)) != 0) return rc; if(txtFile && (txt = fopen(txtFile, "wt")) == 0) { printf("Failed to create text file: %s\n", txtFile); return 43; } if((info = fopen(argv[1], "wb")) == 0) { printf("Failed to create file: %s\n", argv[1]); return 41; } startResource(info, RES_ID_INFO, 0); dumpTagU(INFO_EXTRA_SPACE, extraSpace); if(heapPos) dumpTag(INFO_POS_HEAPLEN, 4, &heapPos); #if 0 /* They are external now */ #ifdef FEATURE_ALIASES dumpTagU(INFO_ALIASES, 0); #endif #ifdef FEATURE_HISTORY dumpTagU(INFO_HISTORY, 256); #endif #ifdef INCLUDE_CMD_PUSHD dumpTagU(INFO_DIRSTACK, DIRSTACK_DEFAULT_SIZE); #endif #endif dumpTagU(INFO_BUFSIZE, MAX_INTERNAL_COMMAND_SIZE); dumpTag(INFO_END, 0, 0); endResource(info); fflush(info); if(ferror(info)) { printf("Error writing file: %s\n", argv[1]); return 60; } fclose(info); return 0; }
int main(int argc, char **argv) { FILE *dat, *inc; int rc; unsigned long size; string_count_t cnt; /* current string number */ string_size_t lsize; int makeLib = 0; *fDIR = '\0'; if(argv[1] && stricmp(argv[1], "/lib") == 0) { --argc; ++argv; makeLib = 1; } // output directory if (argc > 1 && stricmp(argv[1], "/dir") == 0) { --argc; ++argv; strcpy(fDIR, argv[1]); --argc; ++argv; } if (argc > 2) { puts("FIXSTRS - Generate STRINGS.DAT and STRINGS.H for a language\n" "Useage: FIXSTRS [/lib] [language] [directory]\n" "\tIf no language is specified, only the default strings are read.\n" "\tThe <language>.LNG file must reside in the current directory.\n" "Note: DEFAULT.LNG must be present in the current directory, too."); return 127; } in_file = 1; if((rc = loadFile(fTXT)) != 0) return rc; in_file = 2; if(argc > 1 && (rc = loadFile(argv[1])) != 0) { --argc; ++argv; return rc; } /* Now all the strings are cached into memory */ if(maxCnt < 2) { fputs("No string definition found.\n", stderr); return 43; } /* Prepend a directory, if needed */ if (*fDIR) { strcpy(temp1, fDIR); logfile = strcat(temp1, logfile); } /* Create the LOG file */ if(argc > 1) { /* Only if a local LNG file was specified */ log = NULL; /* No LOG entry til this time */ for(cnt = 0; cnt < maxCnt; ++cnt) { switch(strg[cnt].flags & 3) { case 0: /* Er?? */ fputs("Internal error assigned string has no origin?!\n" , stderr); return 99; case 1: /* DEFAULT.LNG only */ if(!log && (log = fopen(logfile, "wt")) == NULL) { fprintf(stderr, "Cannot create logfile: '%s'\n" , logfile); goto breakLogFile; } fprintf(log, "%s: Missing from local LNG file\n" , strg[cnt].name); break; case 2: /* local.LNG only */ if(!log && (log = fopen(logfile, "wt")) == NULL) { fprintf(stderr, "Cannot create logfile: '%s'\n" , logfile); goto breakLogFile; } fprintf(log, "%s: No such string resource\n" , strg[cnt].name); break; case 3: /* OK */ break; } if(strg[cnt].flags & VERSION_MISMATCH) { if(!log && (log = fopen(logfile, "wt")) == NULL) { fprintf(stderr, "Cannot create logfile: '%s'\n" , logfile); goto breakLogFile; } fprintf(log, "%s: Version mismatch, current is: %u\n" , strg[cnt].name, strg[cnt].version); } if(strg[cnt].flags & VALIDATION_MISMATCH) { if(!log && (log = fopen(logfile, "wt")) == NULL) { fprintf(stderr, "Cannot create logfile: '%s'\n" , logfile); goto breakLogFile; } fprintf(log, "%s: printf() format string mismatch, should be: %s\n" , strg[cnt].name, strg[cnt].vstring); } } if(log) fclose(log); } breakLogFile: /* 1. Adjust the offset and generate the overall size */ for(size = string[0].size, cnt = 1; cnt < maxCnt; ++cnt) { string[cnt].index = string[cnt-1].index + string[cnt-1].size; size += string[cnt].size; } if(size >= 0x10000ul - sizeof(string_index_t) * maxCnt) { fputs("Overall size of strings exceeds 64KB limit\n", stderr); return 44; } if (*fDIR) { strcpy(temp1, fDIR); fDAT = strcat(temp1, fDAT); } /* 2. Open STRINGS.DAT and STRINGS.H and dump control information */ if ((dat = fopen(fDAT,"wb")) == NULL) { strcpy(temp2, "creating "); strcpy(temp2, fDAT); perror(temp2); return 36; } if (*fDIR) { strcpy(temp1, fDIR); fH = strcat(temp1, fH); } if ((inc = fopen(fH,"wt")) == NULL) { strcpy(temp2, "creating "); strcat(temp2, fH); perror(temp2); return 37; } puts("FIXSTRS: building STRINGS resource"); fputs("/*\n" " * This file was automatically generated by FIXSTRS.\n" " * Any modifications will be lost next time this tool\n" " * is invoked.\n" " */\n\n", inc); fprintf(inc,"#define STRINGS_ID \"%s%u\"\n" , id, STRING_RESOURCE_MINOR_ID); startResource(dat, RES_ID_STRINGS, STRING_RESOURCE_MINOR_ID); /* Preamble of STRINGS.DAT file */ fprintf(dat, "%s%u", id, STRING_RESOURCE_MINOR_ID); /* fwrite(id, sizeof(id) - 1, 1, dat); *//* file contents ID */ fwrite("\r\n\x1a", 4, 1, dat); /* text file full stop */ fputs("#define STRINGS_ID_TRAILER 4\n", inc); /* 4 additional bytes */ fputs("\n\n", inc); /* delimiter */ /* parameters of strings */ fwrite(&maxCnt, sizeof(maxCnt), 1, dat); /* number of strings */ lsize = (string_size_t)size; fwrite(&lsize, sizeof(lsize), 1, dat); /* total size of string text */ /* string control area */ fwrite(string, sizeof(string[0]), maxCnt, dat); /* append the strings */ for(cnt = 0; cnt < maxCnt; ++cnt) { fwrite(strg[cnt].text, string[cnt].size, 1, dat); if(makeLib) fprintf(inc, "extern const char %s[];\n", strg[cnt].name); fprintf(inc, "#define %-34s 0x%02x /* @ 0x%04x */\n" , strg[cnt].name, cnt, string[cnt].index); } fputs("\n/* END OF FILE */\n", inc); endResource(dat); fflush(dat); if(ferror(dat)) { strcpy(temp2, "Unspecific write error into "); strcat(temp2, fDAT); strcat(temp2, "\n"); fputs(temp2, stderr); return 38; } fflush(inc); if(ferror(inc)) { strcpy(temp2, "Unspecific write error into "); strcat(temp2, fH); strcat(temp2, "\n"); fputs(temp2, stderr); return 39; } fclose(dat); fclose(inc); if(makeLib) { mkdir(fDIR); #define fdmake inc #define ftc101 dat //cfilename[-1] = '\\'; //strcpy(cfilename, fDMAKEFILE); if (*fDIR) { strcpy(temp1, fDIR); cfile = strcat(temp1, fDMAKEFILE); cfilename = cfile + strlen(fDIR); } if((fdmake = fopen(cfile, "wt")) == NULL) { pxerror("creating ", cfile); return 100; } strcpy(cfilename, fTCMAKEFILE); if((ftc101 = fopen(cfile, "wt")) == NULL) { pxerror("creating ", cfile); return 101; } puts("FIXSTRS: building STRINGS library source files"); /********************** prologue */ fputs("\ #\n\ # A Makefile for ATTRIB\n\ # (c) osFree project,\n\ # author, date\n\ #\n\ \n\ PROJ = strings\n\ DESC = Control file attributes\n\ #defines object file names in format objname.$(O)\n\ srcfiles = ", fdmake); /********************* individual files */ for(cnt = 0; cnt < maxCnt; ++cnt) { dumpString(cnt); fprintf(fdmake, " &\n\t" objfmt1, cnt); } for(cnt = 0; cnt < maxCnt - 1; ++cnt) fprintf(ftc101, "+" objfmt " \n", cnt); fprintf(ftc101, "+" objfmt " \n", cnt); /********************** epilogue */ fputs("\n\n\ # defines additional options for C compiler\n\ ADD_COPT = -i=$(MYDIR)..$(SEP)include -i=$(MYDIR)..$(SEP)suppl\n\ \n\ !include $(%ROOT)/mk/libsdos.mk\n\ \n\ TARGETS = $(PATH)$(PROJ).lib\n\ \n\ $(TARGETS): $(OBJS)\n\ @$(MAKE) $(MAKEOPT) -f $(PATH)makefile.mk library=$(TARGETS) library install\n\ \n\ lib: $(TARGETS)\n\ \n", fdmake); fflush(ftc101); if(ferror(ftc101)) { strcpy(temp2, "Unspecific error writing to "); strcat(temp2, fTCMAKEFILE); puts(temp2); return 104; } fclose(ftc101); fflush(fdmake); if(ferror(fdmake)) { strcpy(temp2, "Unspecific error writing to "); strcat(temp2, fDMAKEFILE); puts(temp2); return 105; } fclose(fdmake); } return 0; }
int main(int argc, char **argv) { FILE *dat, *inc; int rc; unsigned long size; string_count_t cnt; /* current string number */ string_size_t lsize; int makeLib = 0; unlink(logfile); if(argv[1] && stricmp(argv[1], "/lib") == 0) { --argc; ++argv; makeLib = 1; } if(argc > 2) { puts("FIXSTRS - Generate STRINGS.DAT and STRINGS.H for a language\n" "Useage: FIXSTRS [/lib] [language]\n" "\tIf no language is specified, only the default strings are read.\n" "\tThe <language>.LNG file must reside in the current directory.\n" "Note: DEFAULT.LNG must be present in the current directory, too."); return 127; } in_file = 1; if((rc = loadFile(fTXT)) != 0) return rc; in_file = 2; if(argc > 1 && (rc = loadFile(argv[1])) != 0) return rc; /* Now all the strings are cached into memory */ if(maxCnt < 2) { fputs("No string definition found.\n", stderr); return 43; } /* Create the LOG file */ if(argc > 1) { /* Only if a local LNG file was specified */ log = NULL; /* No LOG entry til this time */ for(cnt = 0; cnt < maxCnt; ++cnt) { switch(strg[cnt].flags & 3) { case 0: /* Er?? */ fputs("Internal error assigned string has no origin?!\n" , stderr); return 99; case 1: /* DEFAULT.LNG only */ if(!log && (log = fopen(logfile, "wt")) == NULL) { fprintf(stderr, "Cannot create logfile: '%s'\n" , logfile); goto breakLogFile; } fprintf(log, "%s: Missing from local LNG file\n" , strg[cnt].name); break; case 2: /* local.LNG only */ if(!log && (log = fopen(logfile, "wt")) == NULL) { fprintf(stderr, "Cannot create logfile: '%s'\n" , logfile); goto breakLogFile; } fprintf(log, "%s: No such string resource\n" , strg[cnt].name); break; case 3: /* OK */ break; } if(strg[cnt].flags & VERSION_MISMATCH) { if(!log && (log = fopen(logfile, "wt")) == NULL) { fprintf(stderr, "Cannot create logfile: '%s'\n" , logfile); goto breakLogFile; } fprintf(log, "%s: Version mismatch, current is: %u\n" , strg[cnt].name, strg[cnt].version); } if(strg[cnt].flags & VALIDATION_MISMATCH) { if(!log && (log = fopen(logfile, "wt")) == NULL) { fprintf(stderr, "Cannot create logfile: '%s'\n" , logfile); goto breakLogFile; } fprintf(log, "%s: printf() format string mismatch, should be: %s\n" , strg[cnt].name, strg[cnt].vstring); } } if(log) fclose(log); } breakLogFile: /* 1. Adjust the offset and generate the overall size */ for(size = string[0].size, cnt = 1; cnt < maxCnt; ++cnt) { string[cnt].index = string[cnt-1].index + string[cnt-1].size; size += string[cnt].size; } if(size >= 0x10000ul - sizeof(string_index_t) * maxCnt) { fputs("Overall size of strings exceeds 64KB limit\n", stderr); return 44; } /* 2. Open STRINGS.DAT and STRINGS.H and dump control information */ if ((dat = fopen(fDAT,"wb")) == NULL) { perror("creating " fDAT); return 36; } if ((inc = fopen(fH,"wt")) == NULL) { perror("creating " fH); return 37; } puts("FIXSTRS: building STRINGS resource"); fputs("/*\n" " * This file was automatically generated by FIXSTRS.\n" " * Any modifications will be lost next time this tool\n" " * is invoked.\n" " */\n\n", inc); fprintf(inc,"#define STRINGS_ID \"%s%u\"\n" , id, STRING_RESOURCE_MINOR_ID); startResource(dat, RES_ID_STRINGS, STRING_RESOURCE_MINOR_ID); /* Preamble of STRINGS.DAT file */ fprintf(dat, "%s%u", id, STRING_RESOURCE_MINOR_ID); /* fwrite(id, sizeof(id) - 1, 1, dat); *//* file contents ID */ fwrite("\r\n\x1a", 4, 1, dat); /* text file full stop */ fputs("#define STRINGS_ID_TRAILER 4\n", inc); /* 4 additional bytes */ fputs("\n\n", inc); /* delimiter */ /* parameters of strings */ fwrite(&maxCnt, sizeof(maxCnt), 1, dat); /* number of strings */ lsize = (string_size_t)size; fwrite(&lsize, sizeof(lsize), 1, dat); /* total size of string text */ /* string control area */ fwrite(string, sizeof(string[0]), maxCnt, dat); /* append the strings */ for(cnt = 0; cnt < maxCnt; ++cnt) { fwrite(strg[cnt].text, string[cnt].size, 1, dat); if(makeLib) fprintf(inc, "extern const char %s[];\n", strg[cnt].name); fprintf(inc, "#define %-34s 0x%02x /* @ 0x%04x */\n" , strg[cnt].name, cnt, string[cnt].index); } fputs("\n/* END OF FILE */\n", inc); endResource(dat); fflush(dat); if(ferror(dat)) { fputs("Unspecific write error into " fDAT "\n", stderr); return 38; } fflush(inc); if(ferror(inc)) { fputs("Unspecific write error into " fH "\n", stderr); return 39; } fclose(dat); fclose(inc); if(makeLib) { mkdir(stringdir); #define fdmake inc #define ftc101 dat cfilename[-1] = '\\'; strcpy(cfilename, fDMAKEFILE); if((fdmake = fopen(cfile, "wt")) == NULL) { pxerror("creating ", cfile); return 100; } strcpy(cfilename, fTCMAKEFILE); if((ftc101 = fopen(cfile, "wt")) == NULL) { pxerror("creating ", cfile); return 101; } puts("FIXSTRS: building STRINGS library source files"); /********************** prologue */ fputs("\ MAXLINELENGTH := 8192\n\ # Project specific C compiler flags\n\ MYCFLAGS_DBG = -UNDEBUG $(null,$(DEBUG) $(NULL) -DDEBUG=1)\n\ MYCFLAGS_NDBG = -DNDEBUG=1 -UDEBUG\n\ MYCFLAGS = $(null,$(NDEBUG) $(MYCFLAGS_DBG) $(MYCFLAGS_NDBG))\n\ \n\ # Default target\n\ all: $(CFG) strings.lib\n\ \n\ strings.lib .LIBRARY : ", fdmake); /********************* individual files */ for(cnt = 0; cnt < maxCnt; ++cnt) { dumpString(cnt); fprintf(fdmake, "\\\n\t" objfmt, cnt); } for(cnt = 0; cnt < maxCnt - 1; ++cnt) #ifdef __TURBOC__ fprintf(ftc101, "+" objfmt " &\n", cnt); #else fprintf(ftc101, "+" objfmt "\n", cnt); #endif fprintf(ftc101, "+" objfmt " \n", cnt); /********************** epilogue */ fputs("\n\ \n\ .IF $(CFG) != $(NULL)\n\ \n\ CONFIGURATION = $(CONF_BASE)\n\ \n\ .IF $(_COMPTYPE) == BC\n\ CONF_BASE = \\\n\ -f- \\\n\ -I$(INCDIR:s/;/ /:t\";\") \\\n\ -L$(LIBDIR:s/;/ /:t\";\") \\\n\