|
|
1.1 ! root 1: /* ! 2: ** DosFCheck - check file names for DOS consistency ! 3: ** ! 4: ** Distribute freely, it only encourages DOS compatibility! ! 5: ** - DJ Delorie ! 6: */ ! 7: ! 8: #include <stdio.h> ! 9: #ifdef __MSDOS__ ! 10: #include <alloc.h> ! 11: #endif ! 12: #include <ctype.h> ! 13: #include <string.h> ! 14: ! 15: typedef struct ENT ! 16: { ! 17: struct ENT *next; ! 18: char *dos_name; ! 19: char *full_name; ! 20: char *path; ! 21: int tagged; ! 22: } ENT; ! 23: ! 24: ENT *eroot = 0; ! 25: ! 26: int first_inv = 1; ! 27: int first_msg = 1; ! 28: ! 29: /****************************************************************\ ! 30: * Utility routines * ! 31: \****************************************************************/ ! 32: ! 33: void ! 34: invalid_msg () ! 35: { ! 36: if (first_inv) ! 37: { ! 38: if (first_msg) ! 39: first_msg = 0; ! 40: else ! 41: putchar ('\n'); ! 42: printf ("The following files are not valid DOS file names:\n"); ! 43: first_inv = 0; ! 44: } ! 45: } ! 46: ! 47: ENT * ! 48: alloc_ent () ! 49: { ! 50: ENT *rv = (ENT *)malloc (sizeof (ENT)); ! 51: if (rv == 0) ! 52: { ! 53: fprintf (stderr, "Unable to allocate memory for an ENT\n"); ! 54: exit (1); ! 55: } ! 56: memset (rv, 0, sizeof (ENT)); ! 57: return rv; ! 58: } ! 59: ! 60: void ! 61: fill_ent (ENT *ent, char *path) ! 62: { ! 63: char *first = path; ! 64: char *null = path+strlen (path); ! 65: char *last_slash = strrchr (path, '/'); ! 66: char *cp, *dp; ! 67: int dots_seen, chars_seen; ! 68: ! 69: if (last_slash+1 == null) ! 70: { ! 71: * --null = '\0'; ! 72: last_slash = strrchr (path, '/'); ! 73: } ! 74: ! 75: if (!last_slash) ! 76: { ! 77: last_slash = first-1; ! 78: } ! 79: ! 80: if (null-last_slash < 13) ! 81: ent->dos_name = (char *)malloc (null-last_slash); ! 82: else ! 83: ent->dos_name = (char *)malloc (13); ! 84: ent->full_name = (char *)malloc (null-last_slash); ! 85: ent->path = (char *)malloc (last_slash-first+1); ! 86: ! 87: strcpy (ent->full_name, last_slash+1); ! 88: if (last_slash > first) ! 89: strncpy (ent->path, first, last_slash-first); ! 90: else ! 91: *ent->path = '\0'; ! 92: ent->path[last_slash-first] = '\0'; ! 93: ! 94: cp = last_slash+1; ! 95: dp = ent->dos_name; ! 96: dots_seen = 0; ! 97: chars_seen = 0; ! 98: while (1) ! 99: { ! 100: if (! *cp) ! 101: break; ! 102: switch (*cp) ! 103: { ! 104: case '.': ! 105: if (dots_seen == 1) ! 106: { ! 107: invalid_msg (); ! 108: printf ("%s - too many dots\n", path); ! 109: *dp = '\0'; ! 110: break; ! 111: } ! 112: *dp++ = '.'; ! 113: chars_seen = 0; ! 114: dots_seen++; ! 115: break; ! 116: case '"': ! 117: case '*': ! 118: case '+': ! 119: case ',': ! 120: case ';': ! 121: case '<': ! 122: case '=': ! 123: case '>': ! 124: case '?': ! 125: case '[': ! 126: case '\\': ! 127: case ']': ! 128: case '|': ! 129: invalid_msg (); ! 130: printf ("%s - invalid character `%c'\n", path, *cp); ! 131: *dp++ = '?'; ! 132: chars_seen++; ! 133: break; ! 134: default: ! 135: if (dots_seen) ! 136: { ! 137: if (chars_seen >= 3) ! 138: break; ! 139: } ! 140: else ! 141: if (chars_seen >= 8) ! 142: break; ! 143: if ((*cp <= ' ') || (*cp >= 0x7f)) ! 144: { ! 145: invalid_msg (); ! 146: printf ("%s - invalid character `%c'\n", path, *cp); ! 147: *dp++ = '?'; ! 148: chars_seen++; ! 149: break; ! 150: } ! 151: if (islower (*cp)) ! 152: *dp++ = toupper (*cp); ! 153: else ! 154: *dp++ = *cp; ! 155: chars_seen++; ! 156: break; ! 157: } ! 158: cp++; ! 159: } ! 160: *dp++ = '\0'; ! 161: } ! 162: ! 163: int ! 164: compare_ent_dosname (ENT **e1, ENT **e2) ! 165: { ! 166: int r = strcmp ((*e1)->dos_name, (*e2)->dos_name); ! 167: if (r == 0) ! 168: r = strcmp ((*e1)->path, (*e2)->path); ! 169: if (r == 0) ! 170: r = strcmp ((*e1)->full_name, (*e2)->full_name); ! 171: return r; ! 172: } ! 173: ! 174: int ! 175: compare_ent_fullname (ENT **e1, ENT **e2) ! 176: { ! 177: int r = strncmp ((*e1)->full_name, (*e2)->full_name, 14); ! 178: if (r == 0) ! 179: r = strcmp ((*e1)->path, (*e2)->path); ! 180: if (r == 0) ! 181: r = strcmp ((*e1)->full_name, (*e2)->full_name); ! 182: return r; ! 183: } ! 184: ! 185: char * ! 186: mpath (ENT *ent) ! 187: { ! 188: static char buf[500]; ! 189: if (ent->path) ! 190: sprintf (buf, "%s/%s", ent->path, ent->full_name); ! 191: else ! 192: return ent->full_name; ! 193: return buf; ! 194: } ! 195: ! 196: /****************************************************************\ ! 197: * List handling routines * ! 198: \****************************************************************/ ! 199: ! 200: void ! 201: add_ent (ENT *ent) ! 202: { ! 203: ent->next = eroot; ! 204: eroot = ent; ! 205: } ! 206: ! 207: void ! 208: handle_input (char *line) ! 209: { ! 210: ENT *ent = alloc_ent (); ! 211: fill_ent (ent, line); ! 212: add_ent (ent); ! 213: } ! 214: ! 215: void ! 216: display_problems () ! 217: { ! 218: ENT **elist, *ent; ! 219: int ecount, i, first, first_err; ! 220: ! 221: for (ecount=0, ent=eroot; ent; ent=ent->next, ecount++); ! 222: elist = (ENT **)malloc (sizeof (ENT *) * ecount); ! 223: for (ecount=0, ent=eroot; ent; ent=ent->next, ecount++) ! 224: elist[ecount] = ent; ! 225: ! 226: qsort (elist, ecount, sizeof (ENT *), compare_ent_dosname); ! 227: ! 228: first = 1; ! 229: first_err = 1; ! 230: for (i=0; i<ecount-1; i++) ! 231: { ! 232: if ((strcmp (elist[i]->dos_name, elist[i+1]->dos_name) == 0) && ! 233: (strcmp (elist[i]->path, elist[i+1]->path) == 0)) ! 234: { ! 235: if (first_err) ! 236: { ! 237: if (first_msg) ! 238: first_msg = 0; ! 239: else ! 240: putchar ('\n'); ! 241: printf ("The following resolve to the same DOS file names:\n"); ! 242: first_err = 0; ! 243: } ! 244: if (first) ! 245: { ! 246: printf ("%14s : %s\n", elist[i]->dos_name, mpath (elist[i])); ! 247: first = 0; ! 248: } ! 249: printf ("\t\t %s\n", mpath (elist[i+1])); ! 250: } ! 251: else ! 252: first = 1; ! 253: } ! 254: ! 255: qsort (elist, ecount, sizeof (ENT *), compare_ent_fullname); ! 256: ! 257: first = 1; ! 258: first_err = 1; ! 259: for (i=0; i<ecount-1; i++) ! 260: { ! 261: if ((strncmp (elist[i]->full_name, elist[i+1]->full_name, 14) == 0) && ! 262: (strcmp (elist[i]->path, elist[i+1]->path) == 0)) ! 263: { ! 264: if (first_err) ! 265: { ! 266: if (first_msg) ! 267: first_msg = 0; ! 268: else ! 269: putchar ('\n'); ! 270: printf ("The following resolve to the same SysV file names:\n"); ! 271: first_err = 0; ! 272: } ! 273: if (first) ! 274: { ! 275: printf ("%.14s : %s\n", elist[i]->full_name, mpath (elist[i])); ! 276: first = 0; ! 277: elist[i]->tagged = 1; ! 278: } ! 279: printf ("\t\t %s\n", mpath (elist[i+1])); ! 280: elist[i+1]->tagged = 1; ! 281: } ! 282: else ! 283: first = 1; ! 284: } ! 285: ! 286: first_err = 1; ! 287: for (i=0; i<ecount; i++) ! 288: { ! 289: if ((strlen (elist[i]->full_name) > 14) && !elist[i]->tagged) ! 290: { ! 291: if (first_err) ! 292: { ! 293: if (first_msg) ! 294: first_msg = 0; ! 295: else ! 296: putchar ('\n'); ! 297: printf ("The following file names are too long for SysV:\n"); ! 298: first_err = 0; ! 299: } ! 300: printf ("%.14s : %s\n", elist[i]->full_name, mpath (elist[i])); ! 301: } ! 302: } ! 303: } ! 304: ! 305: /****************************************************************\ ! 306: * Main entry point * ! 307: \****************************************************************/ ! 308: ! 309: main (int argc, char **argv) ! 310: { ! 311: FILE *input = stdin; ! 312: if (argc > 1) ! 313: { ! 314: input = fopen (argv[1], "r"); ! 315: if (!input) ! 316: { ! 317: perror (argv[1]); ! 318: exit (1); ! 319: } ! 320: } ! 321: while (1) ! 322: { ! 323: char line[500]; ! 324: char *lp; ! 325: fgets (line, 500, input); ! 326: if (feof (input)) ! 327: break; ! 328: lp = line+strlen (line); ! 329: while ((lp != line) && (*lp <= ' ')) ! 330: lp--; ! 331: lp[1] = 0; ! 332: handle_input (line); ! 333: } ! 334: display_problems (); ! 335: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.