home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / pitools / pi2loaddb.c < prev    next >
C/C++ Source or Header  |  1994-04-06  |  6KB  |  292 lines

  1. /*
  2.  * pi2loaddb - Create LoadDB input file from a Product-Info file.
  3.  *
  4.  *
  5.  * Note that this program assumes that all of the field names are in lower
  6.  * case.
  7.  */
  8.  
  9. /*
  10.  * Written by: David W. Lowrey
  11.  *             Starbound Enterprises
  12.  */
  13.  
  14. static char RCS_ID[] = {
  15.   " $Id: prodinfo.c,v 1.3 1994/01/30 16:00:01 D_Lowrey Exp $ "
  16. };
  17.  
  18. #include <stdio.h>
  19. #include <string.h>
  20.  
  21. void clean_string (char *, char *);
  22. void do_it (FILE *);
  23.  
  24. char storage[10000][200];    /* !! ACK - CHOKE !! */
  25. char volume[256];
  26. unsigned int name, version, stored_in, type, short_desc,desc_start,desc_end;
  27. unsigned int req_start, req_end, ref_start, ref_end, dist_start, dist_end;
  28. unsigned int auth_start, auth_end;
  29.  
  30. int VolNameFlag;
  31.  
  32. int main(argc, argv)
  33. int argc;
  34. char *argv[];
  35. {
  36.   int errflg = 0;
  37.   int ch;
  38.   FILE *fin;
  39.   extern int optind;
  40.   extern char *optarg;
  41.   
  42.   while ((ch = getopt (argc, argv, "hV")) != EOF)
  43.     {
  44.       switch (ch)
  45.     {
  46.     case 'V':
  47.       VolNameFlag++;
  48.       break;
  49.     case 'h':
  50.       break;
  51.     case '?':
  52.       errflg++;
  53.       break;
  54.     default:
  55.       errflg++;
  56.       break;
  57.     }
  58.       if (errflg)
  59.     {
  60.       fprintf (stderr, "unknown arg, use -h for help\n");
  61.       exit (1);
  62.     }
  63.     }
  64.   if (optind == argc)
  65.     {
  66.       do_it (stdin);
  67.     }
  68.   else
  69.     {
  70.       for ( ; optind < argc; optind++)
  71.     {
  72.       fin = fopen (argv[optind], "r");
  73.       if (fin == NULL)
  74.         {
  75.           perror (argv[optind]);
  76.         }
  77.       else
  78.         {
  79.           do_it (fin);
  80.           fclose (fin);
  81.         }
  82.     }
  83.     }
  84.   exit (0);
  85.   return (0);
  86. }
  87.  
  88. void
  89. do_it (fin)
  90. FILE *fin;
  91. {
  92.   char line[512];
  93.   char *ptr;
  94.   unsigned int *end_ptr = NULL;
  95.   char fields[10][13] = {
  96.     "name","version","stored-in","type","short","description",
  97.     "requirements","reference","distribution","author"
  98.   };
  99.   unsigned int lens[10] = {4, 7, 4, 4, 5, 11, 12, 9, 12, 6};
  100.   unsigned int field_num = 0;
  101.   unsigned int storage_line;
  102.   int i, len;
  103.   int processed_field;
  104.   unsigned started = 0;
  105.  
  106.   void print_record(void);
  107.     
  108.   while (fgets (line, sizeof (line), fin))
  109.     {
  110.       line[strlen (line) - 1] = '\000';
  111.       if(line[0] == '.')
  112.     {
  113.       if(started && (!strncmp(line,".name",5)))
  114.         {
  115.           print_record();
  116.           started = 0;
  117.         }
  118.       if (!started)
  119.         {
  120.           version=stored_in=type=short_desc=desc_start=desc_end=0;
  121.           req_start=req_end=ref_start=ref_end=dist_start=dist_end=0;
  122.           name=auth_start=auth_end=0;
  123.           volume[0] = '\0';
  124.           storage_line = 1;
  125.           started = 1;
  126.         }
  127.       processed_field = 0;
  128.       if (end_ptr)
  129.         *end_ptr = storage_line - 1;
  130.       field_num = 0;
  131.       for(i=0; i<10; i++)
  132.         {
  133.           if (!strncmp(&line[1], fields[i], lens[i]))
  134.         {
  135.           field_num = i+1;
  136.           break;
  137.         }
  138.         }
  139.     }
  140.       else if (started)
  141.     if(processed_field)
  142.       clean_string(line, storage[storage_line++]);
  143.     else
  144.       {
  145.       ++processed_field;
  146.       switch(field_num)
  147.         {
  148.         case 0:            /* Non-used field */
  149.           processed_field = 0;
  150.           break;
  151.         case 1:            /* .name */
  152.           clean_string(line, storage[storage_line]);
  153.           name=storage_line++;
  154.           end_ptr = NULL;
  155.           break;
  156.         case 2:            /* .version */
  157.           clean_string(line, storage[storage_line]);
  158.           version=storage_line++;
  159.           end_ptr = NULL;
  160.           break;
  161.         case 3:            /* .stored-in */
  162.           clean_string(line, storage[storage_line]);
  163.           stored_in=storage_line++;
  164.           ptr = (char *)strchr(storage[stored_in], (int)':');
  165.           if(ptr) {
  166.         len = ptr-storage[stored_in];
  167.         strncpy(volume,storage[stored_in],(size_t)len);
  168.         volume[len] = '\0';
  169.           }
  170.           end_ptr = NULL;
  171.           break;
  172.         case 4:            /* .type */
  173.           clean_string(line, storage[storage_line]);
  174.           type=storage_line++;
  175.           end_ptr = NULL;
  176.           break;
  177.         case 5:            /* .short */
  178.           clean_string(line, storage[storage_line]);
  179.           short_desc=storage_line++;
  180.           end_ptr = NULL;
  181.           break;
  182.         case 6:            /* .description */
  183.           clean_string(line, storage[storage_line]);
  184.           desc_start=storage_line++;
  185.           end_ptr = &desc_end;
  186.           break;
  187.         case 7:            /* .requirements */
  188.           clean_string(line, storage[storage_line]);
  189.           req_start=storage_line++;
  190.           end_ptr = &req_end;
  191.           break;
  192.         case 8:            /* .reference */
  193.           clean_string(line, storage[storage_line]);
  194.           ref_start=storage_line++;
  195.           end_ptr = &ref_end;
  196.           break;
  197.         case 9:            /* .distribution */
  198.           clean_string(line, storage[storage_line]);
  199.           dist_start=storage_line++;
  200.           end_ptr = &dist_end;
  201.           break;
  202.         case 10:        /* .author */
  203.           clean_string(line, storage[storage_line]);
  204.           auth_start=storage_line++;
  205.           end_ptr = &auth_end;
  206.           break;
  207.         }
  208.     }
  209.     }
  210.   if (end_ptr)
  211.     *end_ptr = storage_line - 1;
  212.   print_record();
  213. }
  214.  
  215. void clean_string(char *src, char *dest)
  216. {
  217.   char *ptr;
  218.     
  219.   for (ptr=src; *ptr == ' '; ptr++);   /* Find first non blank */
  220.   strcpy (dest, ptr);
  221.   ptr = (char *)(dest + strlen(dest) - 1);
  222.   for (; *ptr == ' '; ptr--);   /* Find last non blank */
  223.   *(++ptr) = '\0';
  224. }
  225.  
  226. void print_record()
  227. {
  228.   int i;
  229.  
  230.   storage[0][0] = '\0';
  231.   printf ("#R\n");
  232.   printf ("#H %s", storage[name]);
  233.   if (version)
  234.     printf (" %s", storage[version]);
  235.   if (VolNameFlag)
  236.     {
  237.       printf (" %s", volume);
  238.     }
  239.   printf ("\n");
  240.   printf ("#K %s\n", storage[name]);
  241.   printf ("#K %s\n", volume);
  242.   if (type)
  243.     printf ("#K %s\n", storage[type]);
  244.   if (short_desc)
  245.     printf ("%s\n\n", storage[short_desc]);
  246.   if (desc_start)
  247.     {
  248.       for(i=desc_start; i<= desc_end; i++)
  249.     printf ("%s\n", storage[i]);
  250.       printf ("\n");
  251.     }
  252.   if (req_start)
  253.     {
  254.       for(i=req_start; i<= req_end; i++)
  255.     printf ("%s\n", storage[i]);
  256.       printf ("\n");
  257.     }
  258.   if (stored_in)
  259.     {
  260.       printf ("#TTHIS VERSION:\n");
  261.       if (version)
  262.     printf ("%s\t%s\n\n", storage[version], storage[stored_in]);
  263.       else
  264.     printf ("?.?\t%s\n\n", storage[stored_in]);
  265.     }
  266.   if(ref_start)
  267.     {
  268.       printf ("#TOTHER VERSIONS:\n");
  269.       for(i=ref_start; i<ref_end; i+=2) {
  270. #if 0
  271.     if (storage[i][strlen(storage[i])-1] == '/')
  272.       storage[i][strlen(storage[i])-1] = '\0';
  273. #endif
  274.     printf ("%s\t%s\n", storage[i+1], storage[i]);
  275.       }
  276.       printf ("\n");
  277.     }
  278.   if(dist_start)
  279.     {
  280.       printf ("#TDISTRIBUTION:\n");
  281.       for(i=dist_start; i<= dist_end; i++)
  282.     printf ("%s\n", storage[i]);
  283.       printf ("\n");
  284.     }
  285.   if(auth_start)
  286.     {
  287.       printf ("#TAUTHOR:\n");
  288.       for(i=auth_start; i<= auth_end; i++)
  289.     printf ("%s\n", storage[i]);
  290.     }
  291. }
  292.