home *** CD-ROM | disk | FTP | other *** search
/ Beijing Paradise BBS Backup / PARADISE.ISO / software / BBSDOORW / DLMST260.ZIP / FMSCHK.C < prev    next >
C/C++ Source or Header  |  1993-08-15  |  6KB  |  179 lines

  1. /****************************************************************
  2. *  FMSCHK version 1.10 - check RBBS FMS directory structure     *
  3. *  compiled with Borland C++ v2.0 using Small memory model      *
  4. *  Copyright (c) 1991-1993 by Bob Hampton                       *
  5. *  S3-Tech BBS (703) 451-9509                                   *
  6. *  all rights reserved                                          *
  7. ****************************************************************/
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <dir.h>
  13. #include <ctype.h>
  14.  
  15. #define FALSE 0
  16. #define TRUE !FALSE
  17. #define MAXLINE 161        /* maximum length of FMS file line */
  18.  
  19. void fail (int linenumber, char *message, char *buffer);
  20.  
  21. int main (int argc, char **argv)
  22. {
  23.     char fmsname[MAXPATH],        /* FMS file to scan              */
  24.          buffer[MAXLINE],        /* buffer for file reading       */
  25.          *buffptr,                  /* work pointer for buffer       */
  26.          fnamebuff[14],             /* buffer for filename/ext parse */
  27.          fname[14],            /* file name                     */
  28.          fext[4],            /* file extension                */
  29.          *fsizeptr,                 /* pointer to file size          */
  30.          fsize[8],            /* file size                     */
  31.          fdate[9];            /* file date                     */
  32.     FILE *fmsfile;            /* pointer to FMS file           */
  33.     int linelength,                 /* length of FMS line            */
  34.         linenumber = 0,             /* line number in FMS file       */
  35.         length_err,                 /* flag for error in line length */
  36.         name_err,                   /*  "    "    "   " filename/ext */
  37.         size_err,                   /*  "    "    "   "  filesize    */
  38.         date_err,                   /*  "    "    "   "  file date   */
  39.         extra_err,                  /*  "    "  extraneous character */
  40.         retval = 0,                 /* return value: 0 = success     */
  41.         i = 0;               /* work variable for indexing    */
  42.  
  43.     switch (argc)
  44.     {
  45.         case 2:
  46.             strcpy (fmsname, *(argv + 1));
  47.             break;
  48.         default:
  49.             fprintf (stderr, "\nInvalid command line\n\n");
  50.             fprintf (stderr, "Usage: FMSCHK <FMS filename>\n");
  51.             exit(1);
  52.     }
  53.  
  54.     puts ("FMSCHK version 1.10                  (c) 1990-93 by Bob Hampton\n");
  55.  
  56.     /**************
  57.     *  open file  *
  58.     **************/
  59.     if ((fmsfile = fopen (fmsname, "r")) == NULL)
  60.     {
  61.         printf ("Unable to open FMS file: %s\n", fmsname);
  62.         exit (1);
  63.     }
  64.  
  65.     /*********************************************
  66.     *  read first line of file, set linelength,  *
  67.     *  and seek to beginning of file             *
  68.     *********************************************/
  69.     fgets (buffer, MAXLINE, fmsfile);
  70.     linelength = strlen (buffer);
  71.     fseek (fmsfile, 0L, SEEK_SET);
  72.  
  73.     /*******************************
  74.     *  for each line in FMS file,  *
  75.     *******************************/
  76.     while (fgets (buffer, MAXLINE, fmsfile) != NULL)
  77.     {
  78.         /******************************
  79.         *  set error flags FALSE and  *
  80.         *  increment line number      *
  81.         ******************************/
  82.         length_err = FALSE;
  83.         name_err = FALSE;
  84.         size_err = FALSE;
  85.         date_err = FALSE;
  86.         extra_err = FALSE;
  87.         linenumber++;
  88.  
  89.         /*******************************
  90.         *  check for linelength error  *
  91.         *******************************/
  92.         if (strlen(buffer) != linelength)
  93.             length_err = TRUE;
  94.  
  95.         /*********************************
  96.         *  if line contains a filename,  *
  97.         *********************************/
  98.         if (strchr("\\ *", *buffer) == NULL)    /* if filename present:   */
  99.         {
  100.             /*****************************************
  101.             *  set pointer and check for extraneous  *
  102.             *  characters in specified places        *
  103.             *****************************************/
  104.             buffptr = buffer;
  105.             if (buffer[21] != ' ' || buffer[22] != ' ' || buffer[31] != ' ')
  106.                 extra_err = TRUE;
  107.  
  108.             /*********************************************
  109.             *  get name/ext into work buffer, and check  *
  110.             *  for name/ext error, or extra characters   *
  111.             *********************************************/
  112.             strncpy (fnamebuff, buffer, 13);
  113.             fnamebuff[13] = '\0';
  114.             strcpy (fname, strtok (fnamebuff, " ."));
  115.             strcpy (fext, strtok (NULL, " ."));
  116.             if (strlen(fname) > 8)
  117.                 if (strlen (fname) > 9 || *fname != '=')
  118.                     name_err = TRUE;
  119.             if (strlen(fext) > 3)
  120.                 name_err = TRUE;
  121.             if (strtok (NULL, " "))
  122.                 extra_err = TRUE;
  123.  
  124.             /********************************************
  125.             *  get filesize into buffer, strip leading  *
  126.             *  spaces, and check for filesize error     *
  127.             ********************************************/
  128.             buffptr += 14;
  129.             strncpy (fsize, buffptr, 7);
  130.             fsize[7] = '\0';
  131.             fsizeptr = fsize;
  132.             for (i = 0; *fsizeptr == ' ' && i < 6; fsizeptr++, i++);
  133.             while (*fsizeptr)
  134.                 if (isdigit (*fsizeptr++) == 0)
  135.                     size_err = TRUE;
  136.  
  137.             /**********************************
  138.             *  get file date into buffer and  *
  139.             *  check for format error         *
  140.             **********************************/
  141.             buffptr += 9;
  142.             for (i = 0; i < 9; i += 3)
  143.             {
  144.                 if ((isdigit (buffptr[i]) && isdigit (buffptr[i+1])) == 0)
  145.                     date_err = TRUE;
  146.                 if (i < 4 && buffptr[i+2] != '-')
  147.                     date_err = TRUE;
  148.             }
  149.         }
  150.  
  151.         /******************************************
  152.         *  check error flags and print any error  *
  153.         *  messages for this FMS line             *
  154.         ******************************************/
  155.         if (length_err || name_err || size_err || date_err || extra_err)
  156.         {
  157.             retval = -1;
  158.             printf ("ERROR in line #%d of %s:\n", linenumber, fmsname);
  159.             if (length_err)
  160.                 puts ("    error in line length");
  161.             if (name_err)
  162.                 puts ("    error in filename format");
  163.             if (size_err)
  164.                 puts ("    error in filesize format");
  165.             if (date_err)
  166.                 puts ("    error in date format");
  167.             if (extra_err)
  168.                 puts ("    extraneous characters in line");
  169.             puts (buffer);
  170.         }
  171.     }
  172.     if (retval == 0)
  173.         printf ("file %s checks okay.\n", strupr(fmsname));
  174.     exit (retval);
  175.  }
  176.  
  177.  
  178.  
  179.