#define DYN_DEBUG #include #include #include #include #include /*********** Basic definitions **************/ typedef char bool; #define TRUE (bool)1 #define FALSE (bool)0 typedef unsigned char byte; char memory[40000]; long int memp = 0; long int talloc = 0; void *challoc(size_t size, char *s) { void *r = malloc(size); if (r != NULL) { /*printf("allocated %4d %8ld for %s\n", size, memp, s);*/ return r; } else { printf("Failed to allocate block of size %d for %s\n", size, s); exit(1); } return r; } #define ALLOC(type) (type *)challoc(sizeof(type),#type) #define SALLOC(s) (char *)challoc(strlen(s)+1,s) #define NALLOC(type,n) (type *)challoc((n)*sizeof(type),#type) #define STRCPY(D,S) D = SALLOC(S); strcpy(D,S) #define STRNCPY(D,S,N) D = NALLOC(char,N+1); strncpy(D,S,N); D[N] = '\0'; /************ lclint macros ************/ #define streq(A,B) (strcmp(A,B) == 0) #define strieq(A,B) (stricmp(A,B) == 0) #define strneq(A,B,C) (strncmp(A,B,C) == 0) #define memeq(A,B,C) (memcmp(A,B,C) == 0) /*********** debug macros *********/ #define NO_DEBUG #ifdef DEBUG #define DEBUG_PRINT(X) printf X #define DEBUG_P(X) printf(X) #define DEBUG_P1(X,A1) printf(X,A1) #define DEBUG_P2(X,A1,A2) printf(X,A1,A2) #define DEBUG_P3(X,A1,A2,A3) printf(X,A1,A2,A3) #define DEBUG_P4(X,A1,A2,A3,A4) printf(X,A1,A2,A3,A4) #define DEBUG_P5(X,A1,A2,A3,A4,A5) printf(X,A1,A2,A3,A4,A5) #define BREAK { int i = i/0; } /* sneaky trick to remain in debugger */ #else #ifdef DYN_DEBUG bool option_debug = FALSE; #define DEBUG_PRINT(X) if (option_debug) printf X #define DEBUG_P(X) if (option_debug) printf(X) #define DEBUG_P1(X,A1) if (option_debug) printf(X,A1) #define DEBUG_P2(X,A1,A2) if (option_debug) printf(X,A1,A2) #define DEBUG_P3(X,A1,A2,A3) if (option_debug) printf(X,A1,A2,A3) #define DEBUG_P4(X,A1,A2,A3,A4) if (option_debug) printf(X,A1,A2,A3,A4) #define DEBUG_P5(X,A1,A2,A3,A4,A5) if (option_debug) printf(X,A1,A2,A3,A4,A5) #define BREAK { int i = i/0; } /* sneaky trick to remain in debugger */ #else #define DEBUG_PRINT(X) #define DEBUG_P(X) #define DEBUG_P1(X,A1) #define DEBUG_P2(X,A1,A2) #define DEBUG_P3(X,A1,A2,A3) #define DEBUG_P4(X,A1,A2,A3,A4) #define DEBUG_P5(X,A1,A2,A3,A4,A5) #define BREAK { printf("\nInternal error, please report\n"); abort(); } #endif #endif #define DEBUG_GN(X) /* fputc(X, fout) */ #define DO_DEBUG_PRINT(X) printf X #define DO_DEBUG_P(X) printf(X) #define DO_DEBUG_P1(X,A1) printf(X,A1) #define DO_DEBUG_P2(X,A1,A2) printf(X,A1,A2) #define DO_DEBUG_P3(X,A1,A2,A3) printf(X,A1,A2,A3) #define DO_DEBUG_P4(X,A1,A2,A3,A4) printf(X,A1,A2,A3,A4) int stricmp(const char *a, const char *b) { while(*a != '\0' && *b != '\0' && toupper(*a) == toupper(*b)) { a++; b++; } if (toupper(*a) < toupper(*b)) return -1; if (toupper(*a) > toupper(*b)) return 1; return 0; } int strincmp(const char *a, const char *b, const int l) { int i = 0; while(*a != '\0' && *b != '\0' && toupper(*a) == toupper(*b) && i < l) { a++; b++; i++; } if (i == l) return 0; if (toupper(*a) < toupper(*b)) return -1; if (toupper(*a) > toupper(*b)) return 1; return 0; } /* Information of a file: */ typedef struct file_T { struct file_T *next; char *floppy_name; char *disk_name; char *ext; bool floppy_exists; int floppy_years; int floppy_days; int floppy_mins; bool disk_exists; int disk_years; int disk_days; int disk_mins; } file_t; file_t *the_files; bool files_added = FALSE; file_t *new_file() { file_t *a_file = ALLOC(file_t); a_file->disk_exists = FALSE; a_file->disk_years = 0; a_file->disk_days = 0; a_file->disk_mins = 0; a_file->floppy_exists = FALSE; a_file->floppy_years = 0; a_file->floppy_days = 0; a_file->floppy_mins = 0; return a_file; } file_t *add_file(char *floppy_name, char *disk_name, char *ext) { file_t *a_file; char *s; file_t **p_file; a_file = new_file(); STRCPY(a_file->floppy_name, floppy_name); for (s = a_file->floppy_name; *s != 0; s++) *s = toupper(*s); STRCPY(a_file->disk_name, disk_name); STRCPY(a_file->ext, ext); for (s = a_file->ext; *s != 0; s++) *s = tolower(*s); p_file = &the_files; while (*p_file != NULL && stricmp((*p_file)->disk_name, a_file->disk_name) < 0) p_file = &(*p_file)->next; a_file->next = *p_file; *p_file = a_file; return a_file; } char *full_floppy_name(file_t *file) { static char result[40]; char *s; int i; strcpy(result, "A:\\"); strcat(result, file->floppy_name); strcat(result, "."); s = result + strlen(result); for (i = 0; i < 3 && file->ext[i] != '\0'; i++) *s++ = toupper(file->ext[i]); *s = '\0'; return result; } char *floppy_name(file_t *file) { static char result[40]; char *s; int i; strcpy(result, file->floppy_name); strcat(result, "."); s = result + strlen(result); for (i = 0; i < 3 && file->ext[i] != '\0'; i++) *s++ = toupper(file->ext[i]); *s = '\0'; return result; } char *full_disk_name(file_t *file) { static char result[40]; strcpy(result, "g:\\www\\"); strcat(result, file->disk_name); strcat(result, "."); strcat(result, file->ext); return result; } char *disk_name(file_t *file) { static char result[40]; strcpy(result, file->disk_name); strcat(result, "."); strcat(result, file->ext); return result; } bool is_disk_name(file_t *a_file, char *name, char *ext) { return stricmp(a_file->disk_name, name) == 0 && stricmp(a_file->ext, ext) == 0; } bool is_floppy_name(file_t *a_file, char *name, char *ext) { return stricmp(a_file->floppy_name, name) == 0 && strincmp(a_file->ext, ext, 3) == 0; } file_t *disk_name_in_use(char *disk_name, char *ext) { file_t *a_file; for (a_file = the_files; a_file != NULL; a_file = a_file->next) if (is_disk_name(a_file, disk_name, ext)) return a_file; return NULL; } file_t *floppy_name_in_use(char *floppy_name, char *ext) { file_t *a_file; for (a_file = the_files; a_file != NULL; a_file = a_file->next) if (is_floppy_name(a_file, floppy_name, ext)) return a_file; return NULL; } void add_floppy(char *floppy_name, char *ext, int years, int days, int mins) { file_t *a_file; a_file = floppy_name_in_use(floppy_name, ext); if (a_file == NULL) { char disk_name[100]; int i = 0; char *disk_ext; a_file = new_file(); strcpy(disk_name, floppy_name); while (disk_name_in_use(disk_name, ext)) { sprintf(disk_name, "%s_%d", floppy_name, i); i++; } disk_ext = ext; if (!stricmp(disk_ext, "htm")) disk_ext = "html"; files_added = TRUE; printf("REM Added new file from floppy %s.%s as %s.%s\n", floppy_name, ext, disk_name, disk_ext); a_file = add_file(floppy_name, disk_name, disk_ext); } a_file->floppy_exists = TRUE; a_file->floppy_years = years; a_file->floppy_days = days; a_file->floppy_mins = mins; DEBUG_P5("File %s.%s on floppy %d.%d.%05d\n", a_file->disk_name, a_file->ext, a_file->floppy_years, a_file->floppy_days, a_file->floppy_mins); } void copyalpha(char *d, char *s, int l) { int i; for (i = 0; *s != '\0'; s++) if (i < l && (isalnum(*s) || *s == '_')) d[i++] = *s; d[i] = '\0'; } void add_disk(char *disk_name, char *ext, int years, int days, int mins) { file_t *a_file; a_file = disk_name_in_use(disk_name, ext); if (a_file == NULL) { int i = 0; char floppy_name[10]; a_file = new_file(); copyalpha(floppy_name, disk_name, 8); while (floppy_name_in_use(floppy_name, ext)) { int m; if (i < 10) m = 7; else if (i < 100) m = 6; else if (i < 1000) m = 5; else m = 4; copyalpha(floppy_name, disk_name, m); if (strlen(floppy_name) < m) strcat(floppy_name, "_"); sprintf(floppy_name + strlen(floppy_name), "%d", i); i++; } files_added = TRUE; printf("REM Added new file from disk %s.%s as %s.%s\n", disk_name, ext, floppy_name, ext); a_file = add_file(floppy_name, disk_name, ext); } a_file->disk_exists = TRUE; a_file->disk_years = years; a_file->disk_days = days; a_file->disk_mins = mins; DEBUG_P5("File %s.%s on disk %d.%d.%05d\n", a_file->disk_name, a_file->ext, a_file->disk_years, a_file->disk_days, a_file->disk_mins); } char *split_ext(char *name) { char *ext; for (ext = name + strlen(name); ext >= name; ext--) if (*ext == '.') { *ext = '\0'; return ext+1; } return ""; } int newest_years = 0; int newest_days = 0; int newest_mins = 0; int oldest_years = 0; int oldest_days = 0; int oldest_mins = 0; #define MINS_PER_DAY (24 * 60) int diff_dates(int a_years, int a_days, int a_mins, int b_years, int b_days, int b_mins) { if (a_years < b_years) return -MINS_PER_DAY; if (b_years < a_years) return MINS_PER_DAY; if (a_days + 1 < b_days) return -MINS_PER_DAY; if (a_days > b_days + 1) return MINS_PER_DAY; return (a_mins - b_mins) + (a_days - b_days) * MINS_PER_DAY; } void read_dir(bool disk) { FILE *f; char fn[400]; /*fprintf(stderr, "Scan directory\n"); system("dir \\www >\\www\\compare\\dir.txt"); fprintf(stderr, "Ready\n");*/ f = fopen(disk ? "compare\\dir.txt" : "compare\\adir.txt", "r"); if (f==NULL) return; while (fgets(fn, 399, f)) { if (fn[strlen(fn)-1]=='\n') fn[strlen(fn)-1] = '\0'; if (fn[16] == ' ' && strlen(fn) >= 45 && stricmp(fn+44, "contents.l2s")) { char *name = fn+44; char *ext = split_ext(name); long int year, mon, day, hour, min; char *d = fn+28; char *t = strstr(d, ":") - 2; year = (d[6] - '0')*10 + d[7] - '0'; year += (year < 50) ? 2000 : 1900; if (t[5] == 'p' || t[5] == 'm') { mon = (d[0] - '0')*10 + d[1] - '0'; day = (d[3] - '0')*10 + d[4] - '0'; } else { day = (d[0] - '0')*10 + d[1] - '0'; mon = (d[3] - '0')*10 + d[4] - '0'; } hour = t[1] - '0'; if (t[0] != ' ') hour += (t[0] - '0')*10; min = (t[3] - '0')*10 + t[4] - '0'; if (hour == 12 && t[5] == 'a') hour -= 12; if (t[5] == 'p') hour += 12; day += mon * 100; min += hour * 60; if (disk) add_disk(name, ext, year, day, min); else { add_floppy(name, ext, year, day, min); if (diff_dates(year, day, min, newest_years, newest_days, newest_mins) > 0) { newest_years = year; newest_days = day; newest_mins = min; } if ( (oldest_years == 0 && oldest_days == 0 && oldest_mins == 0) || diff_dates(year, day, min, oldest_years, oldest_days, oldest_mins) < 0) { oldest_years = year; oldest_days = day; oldest_mins = min; } } } } fclose(f); } void read_contents(char *filename) { FILE *f; char fn[400]; f = fopen(filename, "r"); if (f==NULL) return; while (fgets(fn, 399, f)) { char *floppy_name; char *disk_name; char *ext; if (fn[strlen(fn)-1]=='\n') fn[strlen(fn)-1] = '\0'; floppy_name = fn; disk_name = strchr(fn, ' '); *disk_name++ = '\0'; ext = split_ext(disk_name); split_ext(floppy_name); DEBUG_P3("Added from contents %s %s %s\n", floppy_name, disk_name, ext); add_file(floppy_name, disk_name, ext); } fclose(f); } void write_contents(char *filename) { file_t *a_file; FILE *f = fopen(filename, "w"); if (f==NULL) return; for (a_file = the_files; a_file != NULL; a_file = a_file->next) { fprintf(f, "%s %s\n", floppy_name(a_file), disk_name(a_file)); } fclose(f); } bool copy_to_disk(file_t *a_file) { if (!a_file->floppy_exists) return FALSE; if (!a_file->disk_exists) return TRUE; return diff_dates(a_file->floppy_years, a_file->floppy_days, a_file->floppy_mins, a_file->disk_years, a_file->disk_days, a_file->disk_mins) > +2; } bool copy_to_floppy(file_t *a_file, int mode) { if (!a_file->disk_exists) return FALSE; if (!a_file->floppy_exists) { if (diff_dates(a_file->disk_years, a_file->disk_days, a_file->disk_mins, newest_years, newest_days, newest_mins) > 0) return mode == 1; if (diff_dates(a_file->disk_years, a_file->disk_days, a_file->disk_mins, oldest_years, oldest_days, oldest_mins) > 0) if (stricmp(a_file->ext, "html") == 0) return mode == 2; else return mode == 3; return mode == 4; } return mode == 1 && diff_dates(a_file->floppy_years, a_file->floppy_days, a_file->floppy_mins, a_file->disk_years, a_file->disk_days, a_file->disk_mins) < -2; } void sort(bool on_disk_date) { bool changes = TRUE; while (changes) { file_t **p_file; changes = FALSE; for (p_file = &the_files; *p_file != NULL && (*p_file)->next != NULL; p_file = &(*p_file)->next) { bool swap; if (on_disk_date) swap = diff_dates((*p_file)->disk_years, (*p_file)->disk_days, (*p_file)->disk_mins, (*p_file)->next->disk_years, (*p_file)->next->disk_days, (*p_file)->next->disk_mins) < 0; else swap = diff_dates((*p_file)->floppy_years, (*p_file)->floppy_days, (*p_file)->floppy_mins, (*p_file)->next->floppy_years, (*p_file)->next->floppy_days, (*p_file)->next->floppy_mins) < 0; if (swap) { file_t *h; h = (*p_file)->next; (*p_file)->next = h->next; h->next = (*p_file); (*p_file) = h; changes = TRUE; } } } } int main() { read_contents("a:\\contents.l2s"); read_dir(FALSE); read_dir(TRUE); { file_t *a_file; sort(TRUE); printf("REM files to be copied to disk\n"); for (a_file = the_files; a_file != NULL; a_file = a_file->next) if (copy_to_disk(a_file)) printf("copy %s \"%s\"\n", full_floppy_name(a_file), full_disk_name(a_file)); sort(FALSE); printf("REM files to be copied to floppy\n"); for (a_file = the_files; a_file != NULL; a_file = a_file->next) if (copy_to_floppy(a_file,1)) printf("copy \"%s\" %s\n", full_disk_name(a_file), full_floppy_name(a_file)); printf("REM older HTML files to be copied to floppy\n"); for (a_file = the_files; a_file != NULL; a_file = a_file->next) if (copy_to_floppy(a_file,2)) printf("copy \"%s\" %s\n", full_disk_name(a_file), full_floppy_name(a_file)); printf("REM other older files to be copied to floppy\n"); for (a_file = the_files; a_file != NULL; a_file = a_file->next) if (copy_to_floppy(a_file,3)) printf("REM copy %s \"%s\"\n", full_disk_name(a_file), full_floppy_name(a_file)); printf("REM very old files to be copied to floppy\n"); for (a_file = the_files; a_file != NULL; a_file = a_file->next) if (copy_to_floppy(a_file,4)) printf("REM copy %s %s\n", full_disk_name(a_file), full_floppy_name(a_file)); printf("del syncflds.bat\n"); } write_contents("g:\\www\\contents.l2s"); if (files_added) write_contents("a:\\contents.l2s"); return 0; }