home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1997 March / Simtel-MSDOS-Mar1997-CD2.iso / 00_info / idx2dat.c < prev    next >
C/C++ Source or Header  |  1997-01-27  |  8KB  |  235 lines

  1. /*
  2.  
  3. NAME
  4.     idx2dat - Convert a simibm.idx file format to a data format
  5.            compatible with autoftp or batchftp for downloading
  6. SYNOPSIS
  7.     idx2dat fname1 [fname2]
  8.  
  9. DESCRIPTION
  10.     idx2dat converts a file in the format of simibm.idx into
  11.     a data file for the autoftp or batchftp program.  It will 
  12.     extract the directory and file name from each line of the
  13.     fname1 file and convert them into a format acceptable to the
  14.     common background ftp programs.  
  15.     
  16.     The simibm.idx file format is a comma delimited record with
  17.     each ASCII field in the record enclosed in quotes.  The
  18.     order of fields is:
  19.     "<vol name>","<dir name>","<fname>","x","<size>,"<type>",...
  20.     where <vol name> is the disk volume (e.g. PD1: or PD2:), 
  21.     <dir name> is the directory name (e.g. <MSDOS.DSKUTL>), 
  22.     <fname> is the name of the file in upper case letters,
  23.     <x> is ignored, <size> is the size in bytes (ignored) and
  24.     <type> is the type of the file ("7" = ASCII, "8" = binary).  
  25.     The fields after <type> are ignored by this program.
  26.  
  27.     Each record is converted to the following format:
  28.     -d <vol_name><dir name>
  29.     -t    <lc_fname>
  30.  
  31.     for binary files or:
  32.  
  33.     -d <vol_name><dir name>
  34.     -a    <lc_fname>
  35.  
  36.     for ASCII files, where lc_fname is a lowercase version of 
  37.     the <fname> field.  Simtel does not care about the case of
  38.     the file name and this will cause batchftp and autoftp to
  39.     create the local file using lowercase.  The -d line with 
  40.     the directory name is only printed once for a group of files 
  41.     from the same directory.  Note that there are slight 
  42.     differences between the data file format between autoftp and 
  43.     batchftp.  However, the forms used above are accepted by 
  44.     both programs.
  45.  
  46.     The first command line parameter is taken to be the input
  47.     file name.  The second parameter (if present) is the output
  48.     file name.  If the second file name is not given then stdout
  49.     is used.
  50.  
  51.     To set up the program, simply compile idx2dat:
  52.         cc -o idx2dat idx2dat.c
  53.     and place the executable in your bin directory.  You can
  54.     rename the executable to anything you like.
  55.  
  56. USAGE:    I have found this program a valuable timesaver.  I use a 
  57.     simple shell script which extracts the simibm.idx file from
  58.     a newly downloaded simibm.arc file and runs diff against the 
  59.     previous simibm.idx.  I then use an editor to read the diff 
  60.     file and save off lines of the file for new programs I want 
  61.     to download.  Then I use idx2dat to convert that file into a
  62.     format for autoftp or batchftp.  Now I run autoftp to start
  63.     downloading the files I selected in the background.  The
  64.     whole process takes me just five minutes with most of the
  65.     time spent browsing through the diff file for interesting
  66.     new programs.
  67.  
  68. AUTHOR
  69.     John Sauter, Industrial Technology Institute
  70.  
  71. DISTRIBUTION
  72.         This is a freeware, meaning that it can be copied and used 
  73.     freely. But the programs must NOT be sold for profit.
  74.  
  75.         Problems, improvements, comments and suggestions can be sent 
  76.     to the author at:
  77.  
  78.         E-mail:                Postal Mail:
  79.  
  80.     john@iti.org            John A. Sauter
  81.                     Industrial Technology Institute
  82.                     PO Box 1485
  83.                     Ann Arbor, MI 48106
  84.  
  85. HISTORY:
  86.       Version 1.0 by John Sauter, March 1, 1991
  87.         -------------------------------------------
  88.     After a year of internal use I decided to clean up the
  89.     program, make it compatible with both autoftp and batchftp 
  90.     and release it.  This version also includes some nominal
  91.     error checking to verify that it was given a valid
  92.     simibm.idx file.  Its not elegant.  I just used simple brute
  93.     force methods to parse the files, but all I wanted was
  94.     something quick and dirty.  It does what it says it does and
  95.     nothing more.
  96. BUGS
  97.     The program does not protect itself very well from 
  98.     overrunning array bounds.  It makes sure that the first 
  99.     three characters of a line are '"PD' and ignores the line 
  100.     if it isn't.  This will be a problem if simibm.idx ever
  101.     references volumes that don't start with "PD" (currently it
  102.     doesn't).  If this test passes, but the rest of the line 
  103.     is not in correct simibm.idx format then the program will 
  104.     probably bomb in a spectacular fashion!
  105.  
  106. */
  107.  
  108. #include <stdio.h>
  109. #include <strings.h>
  110. #include <ctype.h>
  111.  
  112. #define MAXLINE    150
  113. #define lowercase(c) (isupper((c)) ? tolower((c)) : (c))
  114.  
  115.  
  116. main(argc,argv)
  117.   int argc;
  118.   char **argv;
  119.   {
  120.      char *cname ;        /* pointer to command name */
  121.      FILE *infile;         /* input file ptr */
  122.      FILE *outfile;         /* output file ptr */
  123.      char *res;            /* fgets result */
  124.      char *iptr, *fptr, *dptr;    /* string parsing ptrs */
  125.      int i ;
  126.      char c;
  127.      char inline[MAXLINE];    /* current record from input file */
  128.      char dname[100];        /* current directory name */
  129.      char last_dname[100];    /* last directory name */
  130.      char fname[100];        /* current file name */
  131.      char type;            /* file type (ASCII, Binary) */
  132.      
  133.      cname = argv[0] ;        /* cname = comand name from argv */
  134.      if (argc < 2)
  135.      {
  136.        fprintf(stderr, "%s: Missing input file name\n", cname) ;
  137.        fprintf(stderr, "Usage: %s input_fname [output_fname]\n", cname) ;
  138.        return(-1);
  139.      }
  140.      if (argc > 3)
  141.      {
  142.        fprintf(stderr, "%s: Too many parameters\n", cname) ;
  143.        fprintf(stderr, "Usage: %s input_fname [output_fname]\n", cname) ;
  144.        return(-1);
  145.      }
  146.  
  147.  
  148. #ifdef DEBUG
  149.     fprintf(stderr, "Opening %s\n", argv[1]);
  150. #endif
  151.  
  152.      if ((infile = fopen(argv[1], "r")) == NULL)
  153.      {
  154.       printf("unable to access %s\n", argv[1]) ;
  155.     return(-1);
  156.      }
  157.      if (argc == 3)        /* open second file name for writing */
  158.      {
  159. #ifdef DEBUG
  160.     fprintf(stderr, "Opening %s\n", argv[2]);
  161. #endif
  162.         if ((outfile = fopen(argv[2], "w")) == NULL)
  163.         {
  164.          printf("unable to access %s\n", argv[2]) ;
  165.        return(-1);
  166.         }
  167.      }
  168.      else 
  169.     outfile = stdout;    /* use stdout if no fname given */
  170.  
  171.      last_dname[0] = '\0';
  172.      /* Read a line from the file */
  173.  
  174.      while((res = fgets(inline, MAXLINE, infile)) != NULL) 
  175.      {
  176. #ifdef DEBUG
  177.     fprintf(stderr, "Input line = %s\n", inline);
  178. #endif
  179.     /* get the directory name */
  180.     iptr = inline;
  181.     if (strncmp(iptr, "\"PD", 3) != 0)    /* Check for simibm.idx format */
  182.     {  
  183.        fprintf(stderr, "Error in input line:\n%s\n", inline);
  184.        fprintf(stderr, "Input line not in simibm.idx format.  Line ignored.\n");
  185.     } 
  186.     else 
  187.     {
  188.        while (*iptr++ != '"');         /* find 1st " for vol name */
  189.        dptr = dname;
  190.        while ((*dptr++ = *iptr++) != '"');    /* find 2nd qoute */
  191.        dptr--;                /* ignore the quote */
  192.        while (*iptr++ != '"');        /* find 1st " for dir name */
  193.        while ((*dptr++ = *iptr++) != '"');    /* find 2nd qoute */
  194.        *(--dptr) = '\0';            /* end directory name */
  195. #ifdef DEBUG
  196.        fprintf(stderr, "Directory name = %s\n", dname);
  197. #endif
  198.  
  199.     /* get file name */
  200.        while (*iptr++ != '"');        /* find 1st " for filename */
  201.        fptr = fname;
  202.        while ((c = *iptr++) != '"')        /* find 2nd qoute */
  203.           *fptr++ = lowercase(c);
  204.        *fptr = '\0';            /* end file name */
  205.  
  206. #ifdef DEBUG
  207.           fprintf(stderr, "File name = %s\n", fname);
  208. #endif
  209.  
  210.     /* Get the file type (after third comma) */
  211.        i = 0;
  212.        while (i < 3)
  213.           if (*iptr++ == ',')
  214.              i++;
  215.            type = *iptr;            /* get type character */
  216.  
  217. #ifdef DEBUG
  218.        fprintf(stderr, "File type = %c\n", type);
  219. #endif
  220.     /* print output line */
  221.        if (strcmp(last_dname, dname) != 0)
  222.        {
  223.           fprintf(outfile, "-d %s\n", dname);
  224.           strcpy(last_dname, dname);
  225.        }
  226.        if (type == '7')
  227.           fprintf(outfile, "-a\t%s\n", fname);
  228.            else
  229.           fprintf(outfile, "-t\t%s\n", fname);
  230.        }    /* end if */
  231.     }         /* end while */
  232.     return(0) ;
  233. }
  234.  
  235.