/* filelist.c -- program to convert a DOS DIR listing into an input * file for the packer program * * To use the program, first run DIR *.* /s > ..\xxx * Then run filelist.exe ..\xxx files * to create "files" * Then you can run packer.exe files myproject.pac * to create the pac file. */ /* usage: filelist */ #include "stdio.h" #include "stdlib.h" #include "string.h" #include "cext.h" #include "cmdline.h" #define EOS '\0' FILE *inf; FILE *out; #ifdef MAYBE_THIS_IS_FOR_WIN95_DIRECTORY_LISTINGS /* findfilename -- look for pattern "*-*-*:* " in string */ /**/ int findfilename(char *line, char *rslt) { char *ptr; if (ptr = strchr(line, '-')) { if (ptr = strchr(ptr, '-')) { if (ptr = strchr(ptr, ':')) { if (ptr = strchr(ptr, ' ')) { strcpy(rslt, ptr + 1); if (strcmp(rslt, ".") == 0 || strcmp(rslt, "..") == 0 || strstr(line, "")) return 0; return 1; } } } } return 0; } #endif /* findfilename -- look for pattern "***:* " in string */ /* * NOTE: the is "/", part of the file date; ":" is in the file time * lines without these characters are not lines that contain filenames */ int findfilename(char *line, char *rslt) { char *ptr; if (ptr = strchr(line, '/')) { if (ptr = strchr(ptr + 1, '/')) { if (ptr = strchr(ptr + 1, ':')) { if (ptr = strrchr(line, ' ')) { // now ptr points to space before filename strcpy(rslt, ptr + 1); // make sure this is not directory if (strstr(line, "")) return 0; return 1; } } } } return 0; } int directory_filter(char *directory) { int skip = false;; if (strstr(directory, "WinDebug") != NULL) skip = true; if (strstr(directory, "trash") != NULL) skip = true; return skip; } /* fixup -- convert \ to / */ /**/ void fixup(char *s) { while (*s) { if (*s == '\\') *s = '/'; s++; } } /* giveup -- quit the program */ /**/ void giveup() { printf("Type return."); exit(1); } /* /* main -- */ /**/ int main(int argc, char **argv) { #define stringmax 128 char in_file[stringmax]; char out_file[stringmax]; char inline[stringmax]; char basedir[stringmax]; char filename[stringmax]; char directory[stringmax]; char wholename[stringmax]; char *s; int skip_directory = false; basedir[0] = 0; /* empty string */ cl_init(NULL, 0, NULL, 0, argv, argc); if ((s = cl_arg(1)) != NULL) { strcpy(in_file, s); inf = fopen(in_file, "r"); if (inf == NULL) { fprintf(stdout, "Error: couldn't open %s\n", in_file); exit(1); } } if ((s = cl_arg(2)) != NULL) { strcpy(out_file, s); out = fopen(out_file, "w"); if (out == NULL) { fprintf(stdout, "Error: couldn't open %s\n", out_file); exit(1); } } else { fprintf(stdout, "Error: no output file specified\n"); exit(1); } printf("writing %s ...\n", out_file); /* read a line at a time. * if the line has "Directory of", then * if you don't have base directory, grab it * otherwise search for base directory and grab remainder * if the line matches "*-*-*:* " then * grab remainder as filename * prepend directory and type ("a") and output */ while (fgets(inline, stringmax, inf)) { inline[strlen(inline) - 1] = EOS; /* remove newline at end */ if (inline[0] == EOS) continue; /* skip blank lines */ /* search for Directory */ s = strstr(inline, "Directory of "); if (s) { s += strlen("Directory of "); if (!basedir[0]) { strcpy(basedir, s); strcat(basedir, "\\"); /* append a slash to complete directory name */ strcpy(directory, ""); } else { s = strstr(s, basedir); if (!s) { printf("Expected %s at beginning of directory.\n"); printf("Input line: %s\n"); giveup(); } else { strcpy(directory, s + strlen(basedir)); fixup(directory); strcat(directory, "/"); } skip_directory = directory_filter(directory); } } else if (!skip_directory && findfilename(inline, filename)) { char type_of_file = 'a'; sprintf(wholename, "%s%s", directory, filename); /* strlwr(wholename); */ s = strchr(wholename, '.'); if (s) s++; else s = ""; if (strcmp(s, "nh") == 0 || strcmp(s, "rsrc") == 0 || strcmp(s, "dsp") == 0 || strcmp(s, "dsw") == 0 || strcmp(s, "cod") == 0 || strcmp(s, "tab") == 0 || strcmp(s, "pcm") == 0 || strcmp(s, "mp3") == 0 || strcmp(s, "mid") == 0 || strcmp(s, "aiff") == 0 || false) type_of_file = 'b'; if (strcmp(s, "pac") == 0 || strcmp(s, "ncb") == 0 || strcmp(s, "opt") == 0 || strcmp(s, "plg") == 0 || strcmp(s, "tar") == 0 || strcmp(s, "obj") == 0 || strcmp(s, "vcp") == 0 || strcmp(s, "exe") == 0 || strcmp(s, "vcp") == 0 || strcmp(s, "pdb") == 0 || strcmp(s, "sbr") == 0 || strcmp(s, "ilk") == 0 || strcmp(s, "bsc") == 0 || /* this last one says "only .lsp files in runtime directory (strcmp(directory, "runtime/") == 0 && strcmp(s, "lsp") != 0) || */ strstr(directory, "CVS/") || false ) { /* do nothing */ } else { fprintf(out, "%c %s\n", type_of_file, wholename); } } } fclose(inf); fclose(out); return 0; }