Annotation of gcc/doschk.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.