home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / MISC / OS2 / DWNSRT47.ZIP / DOWNPAR.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-12-01  |  15.8 KB  |  430 lines

  1. /* ============================================================= */
  2. /*  Rob Hamerling's MAXIMUS download file scan and sort utility. */
  3. /*  -> Parameter processing routines for DOWNSORT.               */
  4. /* ============================================================= */
  5.  
  6. // #define DEBUG_MODE
  7.  
  8. #define INCL_BASE
  9. #include <os2.h>
  10.  
  11. #include "downsort.h"
  12.  
  13. #include <ctype.h>
  14. #include <memory.h>
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include <time.h>
  19.  
  20. /*  Symbolic names of keyword parameters */
  21. #define    K_CMT      0
  22. #define    K_TIT      1
  23. #define    K_FNT      2
  24. #define    K_DAT      3
  25. #define    K_ALL      4
  26. #define    K_NEW      5
  27. #define    K_GBL      6
  28. #define    K_BBS      7
  29. #define    K_FIL      8
  30. #define    K_ORP      9
  31. #define    K_NNN     10
  32. #define    K_PRE     11
  33. #define    K_SUB     12
  34. #define    K_BOT     13
  35. #define    K_NDS     14
  36. #define    K_ODS     15
  37. #define    K_END    255
  38.  
  39. /* ----------------------------------------- */
  40. /* Process commandline and system parameters */
  41. /* ----------------------------------------- */
  42. void get_parm(k,p)
  43. int  k;                                 // parm count
  44. char *p[];                              // pointer array
  45. {
  46.   USHORT i,j,n;                         // counters
  47.   char   c;                             // option letter
  48.  
  49.   DosGetCtryInfo(sizeof(struct _COUNTRYINFO),&c_code,&c_info,&i);
  50.                                         // for date format, etc
  51.   sys_date(today);                      // start timestamp
  52.  
  53.   for (i=1; i<k; ++i) {                 // pre-scan
  54.     if (p[i][0]=='@')                   // config filespec
  55.       strncpy(cfg_path,strupr(&p[i][1]),127); // copy filespec
  56.     else if (p[i][0] == '/' || p[i][0] == '-') { // options
  57.       switch(c = toupper(p[i][1])) {
  58.         case VERBOSE   : oper_mode = VERBOSE;   break;
  59.         case QUIET     : oper_mode = QUIET;     break;
  60.         case HELP      : oper_mode = HELP;      break;
  61.         case QMARK     : oper_mode = HELP;      break;
  62.         }
  63.       }
  64.     }
  65.  
  66.   if (oper_mode == HELP)
  67.     show_help();                        // help explicitly requested
  68.   else if (oper_mode != QUIET)
  69.     show_welcome();                     // good-morning msg
  70.   else
  71.     printf("%s %d.%d%c by %s . . . ",   // simple opening
  72.            PROGNAME,VERSION,SUBVERS,SUFFIX,AUTHOR);
  73.  
  74.   read_cfg(cfg_path);                   // process configuration file
  75.  
  76.   for (i=1; i<k; i++) {                 // all commandline parms
  77.     strupr(p[i]);                       // make string upper case
  78.  
  79.     if (strcmp(p[i],"BBS") == 0 ||
  80.         strncmp(p[i],"BBS:",4) == 0) {  // BBS-list requested
  81.       lp[P_BBS].priv[0] = SYSOP;        // default: HIDDEN
  82.       if (p[i][3] == ':')
  83.         if (conv_priv(&p[i][4],lp[P_BBS].priv,1) <= 0)   // convert
  84.           oper_mode = HELP;
  85.       }
  86.  
  87.     else if (strcmp(p[i],"NEW") == 0 ||
  88.              strncmp(p[i],"NEW:",4) == 0) { // NEW-list requested
  89.       lp[P_NEW].priv[0] = SYSOP;        // first/only default: SYSOP
  90.       if (p[i][3] == ':')
  91.         if (conv_priv(&p[i][4],lp[P_NEW].priv,10) <= 0)   // convert to int
  92.           oper_mode = HELP;
  93.       }
  94.  
  95.     else if (strcmp(p[i],"ALL") == 0 ||
  96.              strncmp(p[i],"ALL:",4) == 0) { // ALL-list requested
  97.       lp[P_ALL].priv[0] = SYSOP;        // first/only default: SYSOP
  98.       if (p[i][3] == ':')
  99.         if (conv_priv(&p[i][4],lp[P_ALL].priv,10) <= 0)   // convert to int
  100.           oper_mode = HELP;
  101.       }
  102.  
  103.     else if (strcmp(p[i],"GBL") == 0 ||
  104.              strncmp(p[i],"GBL:",4) == 0) { // GBL-list requested
  105.       lp[P_GBL].priv[0] = SYSOP;        // first/only default: SYSOP
  106.       if (p[i][3] == ':')
  107.         if (conv_priv(&p[i][4],lp[3].priv,10) <= 0)   // convert to int
  108.           oper_mode = HELP;
  109.       }
  110.  
  111.     else if (strcmp(p[i],"FIL") == 0 ||
  112.              strncmp(p[i],"FIL:",4) == 0) { // FILES.BBS to be generated
  113.       lp[P_FIL].priv[0] = SYSOP;              //
  114.       if (p[i][3] == ':') {             // path specified?
  115.         strncpy(filesbbs_path,&p[i][4],79);
  116.         j = strlen(filesbbs_path);
  117.         if (j>0 && filesbbs_path[j-1] != '\\')
  118.           filesbbs_path[j] = '\\';      // add backslash if needed
  119.         }
  120.       }
  121.  
  122.     else if (p[i][0] == '/' || p[i][0] == '-') { // option flag
  123.       switch(c = toupper(p[i][1])) {
  124.         case TRUNC     : for (j=0; j<P_MAX; ++j)
  125.                            lp[j].wrapflag = TRUNC;
  126.                          break;
  127.         case WRAP      : for (j=0; j<P_MAX; ++j)
  128.                            lp[j].wrapflag = WRAP;
  129.                          break;
  130.         case ALPHA     : for (j=0; j<P_MAX; ++j)
  131.                            lp[j].sortflag = ALPHA;
  132.                          break;
  133.         case TIMESTAMP : for (j=0; j<P_MAX; ++j)
  134.                            lp[j].sortflag = TIMESTAMP;
  135.                          break;
  136.         case QUIET     : oper_mode = QUIET;     break;
  137.         case VERBOSE   : oper_mode = VERBOSE;   break;
  138.         case HELP      : oper_mode = HELP;      break;
  139.         case QMARK     : oper_mode = HELP;      break;
  140.         default        : oper_mode = HELP;      break;
  141.         }
  142.       }
  143.  
  144.     else if (0 < (n = atoi(p[i])))      // numeric: NEW-list length
  145.       for (j=0; j<P_MAX; ++j)
  146.         lp[j].max_fil = n;              // new value for all
  147.  
  148.     else if (p[i][0] == '@')            // config filespec
  149.       ;                                 // skip
  150.  
  151.     else
  152.       printf("\nUnknown Parameter: %-50.50s",p[i]);
  153.     }
  154.   }
  155.  
  156. /* --------------------------------- */
  157. /* Process privilege parameterstring */
  158. /* --------------------------------- */
  159. int conv_priv(c,p,n)
  160. char   *c;                              // parameter string (uppercase)
  161. int    p[];                             // pointer to privilege array
  162. USHORT n;                               // maximum number of privileges
  163. {
  164.   USHORT i,j,k;                         // counters
  165.  
  166.   for (i=j=0; i<n && c[i]!='\0' && c[i]!=' '; ++i) {
  167.     if (c[i] == '*')                    // asterisk specified?
  168.       p[j] = SYSOP;                     // system default
  169.     else {
  170.       for (k=0; k<HIDDEN-TWIT+1 &&      // search table
  171.                 priv_name[k][0]!=toupper(c[i]); k++);
  172.       p[j] = k + TWIT;                  // store real privilege
  173.       }                                 // endif
  174.     if (p[j]<=HIDDEN)                   // hidden or below?
  175.       ++j;                              // count only valid privs
  176.     }                                   // endfor
  177.   for (i=j; i<n; ++i)                   // remaining priv-values
  178.     p[i] = HIDDEN + 1;                  // undo any previous settings
  179.   return(j);                            // number of valid privs
  180.   }
  181.  
  182. /* ------------------ */
  183. /* Produce time stamp */
  184. /* ------------------ */
  185. char *sys_date(t)
  186. char t[];                               // output buffer
  187. {
  188.   long  secs_now;                       // relative time value
  189.   char *buf;                            // pointer to time string
  190.  
  191.   time(&secs_now);                      // get current time
  192.   buf = ctime(&secs_now);               // convert to char string
  193.   strcpy(t,buf);                        // copy string
  194.   t[16] = '\0';                         // undo secs, year and newline
  195.   return(t);                            // pointer to buffer
  196.   }
  197.  
  198. /* =================================== */
  199. /* Process DOWNSORT Configuration File */
  200. /* =================================== */
  201. void read_cfg(ds_cfg)
  202. char ds_cfg[];
  203. {
  204.   FILE *prm;
  205.   char buf[255];
  206.   char *value;                          // ptr to parameter value
  207.   int  i,j,t;
  208.  
  209.   if ((prm = fopen(ds_cfg,"r")) == NULL )
  210.     printf(OPEN_FAIL,ds_cfg);
  211.  
  212.   else {
  213.     printf("\nReading configuration file: %s",cfg_path);
  214.  
  215.     while (fgets(buf,255,prm)) {        // process a line at a time
  216.  
  217.       switch(parse_keyword(buf,&value)) {
  218.  
  219.         case K_CMT:                     // Comment and empty lines
  220.           break;
  221.  
  222.         case K_TIT:                     // list title (ALL, NEW, GBL)
  223.           for (j=0; j<20 && value[j]!='\0'; j++)
  224.             if (value[j] == '~')        // replace tilde by blank
  225.               value[j] = ' ';
  226.           strncpy(list_title,value,20);
  227.           break;
  228.  
  229.         case K_PRE:                     // pre-title
  230.           title_line(value,pre_title);
  231.           break;
  232.  
  233.         case K_SUB:                     // sub-title
  234.           title_line(value,sub_title);
  235.           break;
  236.  
  237.         case K_BOT:                     // bottom line
  238.           title_line(value,bot_lines);
  239.           break;
  240.  
  241.         case K_ODS:                     // Orphan Description
  242.           strncpy(ORPHAN,value,45);     // copy file text
  243.           break;
  244.  
  245.         case K_NDS:                     // Orphan Description
  246.           strncpy(NDS,value,45);        // copy file text
  247.           break;
  248.  
  249.         case K_FNT:                     // Font for all lists
  250.           t = atoi(value);              // convert to integer
  251.           if (t < FONT0 || t > FONT4)   // range check
  252.             printf("\n!Error: TitleFont out of range");
  253.           else
  254.             for (i=0; i<P_MAX; i++)
  255.               lp[i].tfont = t;           // to all parmlist entries
  256.           break;
  257.  
  258.         case K_DAT:                     // Area.Dat
  259.           strncpy(areadat_path,strupr(value),80);  // copy file specification
  260.           break;
  261.  
  262.         case K_NNN:
  263.           if (0 < (t = atoi(value)))    // NEW/BBS-list length
  264.             for (i=0; i<P_MAX; ++i)
  265.               lp[i].max_fil = t;        // new value for all lists
  266.           break;
  267.  
  268.         case K_ALL:                     // create ALL-list(s)
  269.           list_parm(P_ALL,value,10);
  270.           break;
  271.  
  272.         case K_BBS:                     // create BBS-list
  273.           list_parm(P_BBS,value,1);
  274.           break;
  275.  
  276.         case K_GBL:                     // create GBL-list
  277.           list_parm(P_GBL,value,10);
  278.           break;
  279.  
  280.         case K_NEW:                     // create NEW-list(s)
  281.           list_parm(P_NEW,value,10);
  282.           break;
  283.  
  284.         case K_ORP:                     // naming of ORP-list
  285.           list_parm(P_ORP,value,1);
  286.           break;
  287.  
  288.         case K_FIL:                     // create FILES.bbs files
  289.           strupr(value);                // all upper case
  290.           conv_priv(value,lp[P_FIL].priv,1);
  291.           if ((value = next_word(value)) != NULL &&
  292.                strcmp(value,"*") != 0)
  293.             strncpy(filesbbs_path,asciiz(value),80);
  294.           break;
  295.  
  296.         case K_END:                     // Keyword not found
  297.         default:                        // undefined
  298.           printf("\nUnknown Config Parameter: %-50.50s",buf);
  299.           break;
  300.         }
  301.       }
  302.     }
  303.   }
  304.  
  305. /* =============================== */
  306. /* Process xxxFileList parameters. */
  307. /* =============================== */
  308. void list_parm(k,v,n)
  309. int  k;                                 // appropriate list-parm index
  310. char *v;                                // parameter string pointer
  311. int  n;                                 // max number of privileges
  312. {
  313.   char *nv;                             // moving string pointer
  314.   int  t;                               // intermediate int value
  315.  
  316.   strupr(v);                            // whole string uppercase
  317.   conv_priv(v,lp[k].priv,n);            // privilege string
  318.   if ((nv = next_word(v)) != NULL  &&   // 1st expected: filename
  319.        strcmp(nv,"*") != 0)             // not asterisk
  320.     strncpy(lp[k].name,asciiz(nv),8);   // customised filename
  321.   while ((nv = next_word(nv)) != NULL) { // remaining parm(s)
  322.     if (nv[0] == '/' || nv[0] == '-') { // option flag
  323.       switch(nv[1]) {
  324.         case TRUNC     : lp[k].wrapflag = TRUNC;     break;
  325.         case WRAP      : lp[k].wrapflag = WRAP;      break;
  326.         case ALPHA     : lp[k].sortflag = ALPHA;     break;
  327.         case TIMESTAMP : lp[k].sortflag = TIMESTAMP; break;
  328.         case FONT      : t = atoi(nv+2);
  329.                          if (t >= FONT0 && t <= FONT3) // range check
  330.                            lp[k].tfont = t;
  331.                          break;
  332.         default        : break;
  333.         }
  334.       }
  335.     else if (0 < atoi(nv))              // numeric: NEW-list length
  336.       lp[k].max_fil = atoi(nv);
  337.     }
  338.   }
  339.  
  340. /* ============================ */
  341. /* Process xxxTitle parameters. */
  342. /* ============================ */
  343. void  title_line(v,t)
  344. char *v;                                // parameter string pointer
  345. char *t[];                              // pointer to title ptr array
  346. {
  347.   int i,j;                              // counters
  348.  
  349.   for (i=0; i<MAXTIT && t[i]!=NULL; ++i);  // search 1st free place
  350.   if (i<MAXTIT) {                       // not too many subtitles?
  351.     t[i] = malloc(strlen(v)+1);         // obtain memory
  352.     if (t[i] == NULL) {
  353.       printf(MSG_MEM,PROGNAME);         // not enough memory
  354.       exit(14);
  355.       }
  356.     else {
  357.       for (j=0; v[j]; j++)              // copy whole line
  358.         if (v[j] == '~')                // tilde
  359.           t[i][j] = ' ';                // translate into blank
  360.         else
  361.           t[i][j] = v[j];               // copy
  362.       t[i][j] = '\0';                   // end of string
  363.       }
  364.     }
  365.   }
  366.  
  367. /* ===================================== */
  368. /* Find the number of the config options */
  369. /* Returns the keyword symbolic number,  */
  370. /* and pointer to the keyword value.     */
  371. /* ===================================== */
  372. int  parse_keyword(line,value)
  373. char line[];                            // input line config file
  374. char **value;                           // return: ptr to value string
  375.                                         // (NULL) if not found
  376. {
  377.   int i,p;                              // counters
  378.  
  379.   static struct parse_config {          // Keyword Parameter Spec
  380.        unsigned char id;                // parameter identifier
  381.        unsigned char len;               // keyword length
  382.        char *key;                       // keyword
  383.        } cfg[] = {                      // table of keyword parameters
  384.                                         // NOTE: most significant first!
  385.            {K_ALL, 11, "AllFileList"},
  386.            {K_DAT,  7, "AreaDat"},
  387.            {K_BBS, 11, "BbsFileList"},
  388.            {K_BOT, 10, "BottomLine"},
  389.            {K_FIL, 11, "FilFilePath"},
  390.            {K_GBL, 11, "GblFileList"},
  391.            {K_NNN, 11, "MaxNewFiles"},
  392.            {K_NEW, 11, "NewFileList"},
  393.            {K_NDS, 12, "NotFoundDesc"},
  394.            {K_ORP, 11, "OrpFileList"},
  395.            {K_ODS, 10, "OrphanDesc"},
  396.            {K_PRE,  8, "PreTitle"},
  397.            {K_SUB,  8, "SubTitle"},
  398.            {K_FNT,  9, "TitleFont"},
  399.            {K_TIT,  5, "Title"},
  400.            {K_END,  0, ""},             // end of table: keyw. not found
  401.              };
  402.  
  403.   *value = NULL;                        // init: default return
  404.  
  405.   for (i=0; line[i]==' '; ++i);         // skip leading blanks
  406.   line = line+i;                        // new local pointer
  407.  
  408.   if (line[0] == '%'  ||                // comment
  409.       line[0] == ';'  ||                // comment
  410.       line[0] == '*'  ||                // comment
  411.       line[0] == '\n' ||                // end of line
  412.       line[0] == '\0')                  // end of string
  413.     return(K_CMT);                      // return as comment line
  414.  
  415.   for (i=0; cfg[i].id < K_END &&         // not end of table
  416.            strnicmp(line,cfg[i].key,cfg[i].len) != 0 ; i++);
  417.   p = cfg[i].id;                        // return value
  418.  
  419.   *value = next_word(line);             // search value string
  420.   if (*value == NULL)                   // no keyword value
  421.     return(K_CMT);                      // treat as comment
  422.  
  423.   i = strlen(*value);                   // length of value string
  424.   if ((*value)[i-1] == '\n')            // replace end of line
  425.     (*value)[i-1] = '\0';               // by end of string
  426.  
  427.   return(p);                            // return the keyword number
  428.   }
  429.  
  430.