home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Professional
/
OS2PRO194.ISO
/
os2
/
com
/
bbs
/
downsrt
/
source
/
downpar.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-06-06
|
20KB
|
498 lines
/* ============================================================= */
/* Rob Hamerling's MAXIMUS download file scan and sort utility. */
/* -> Parameter processing routines for DOWNSORT. */
/* ============================================================= */
// #define DEBUG_MODE
#define INCL_BASE
#include <os2.h>
#include <ctype.h>
#include <memory.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "downsort.h"
/* Symbolic names of keyword parameters */
#define K_CMT 0
#define K_TIT 1
#define K_FNT 2
#define K_DAT 3
#define K_ALL 4
#define K_NEW 5
#define K_GBL 6
#define K_BBS 7
#define K_FIL 8
#define K_ORP 9
#define K_NNN 10
#define K_PRE 11
#define K_SUB 12
#define K_BOT 13
#define K_NDS 14
#define K_ODS 15
#define K_IPF 16
#define K_END 255
/* ----------------------------------------- */
/* Process commandline and system parameters */
/* ----------------------------------------- */
void get_parm(k,p)
int k; // parm count
char *p[]; // pointer array
{
USHORT i,j,n; // counters
char c; // option letter
DosGetCtryInfo(sizeof(struct _COUNTRYINFO),&c_code,&c_info,&i);
// for date format, etc
sys_date(today); // start timestamp
for (i=1; i<k; ++i) { // pre-scan
if (p[i][0]=='@') // config filespec
strncpy(cfg_path,strupr(&p[i][1]),127); // copy filespec
else if (p[i][0] == '/' || p[i][0] == '-') { // options
switch(c = toupper(p[i][1])) {
case VERBOSE : oper_mode = VERBOSE; break;
case QUIET : oper_mode = QUIET; break;
case HELP : oper_mode = HELP; break;
case QMARK : oper_mode = HELP; break;
}
}
}
if (oper_mode == HELP)
show_help(); // help explicitly requested
else if (oper_mode != QUIET)
show_welcome(); // good-morning msg
else
printf("%s %d.%d%c by %s . . . ", // simple opening
PROGNAME,VERSION,SUBVERS,SUFFIX,AUTHOR);
read_cfg(cfg_path); // process configuration file
for (i=1; i<k; i++) { // all commandline parms
strupr(p[i]); // make string upper case
if (strcmp(p[i],"ORP") == 0) // ORP-list requested
lp[P_ORP].priv[0] = SYSOP; // first/only default: SYSOP
else if (strcmp(p[i],"BBS") == 0 ||
strncmp(p[i],"BBS:",4) == 0) { // BBS-list requested
lp[P_BBS].priv[0] = SYSOP; // default: HIDDEN
if (p[i][3] == ':')
if (conv_priv(&p[i][4],lp[P_BBS].priv,1) <= 0) // convert
oper_mode = HELP;
}
else if (strcmp(p[i],"NEW") == 0 ||
strncmp(p[i],"NEW:",4) == 0) { // NEW-list requested
lp[P_NEW].priv[0] = SYSOP; // first/only default: SYSOP
if (p[i][3] == ':')
if (conv_priv(&p[i][4],lp[P_NEW].priv,10) <= 0) // convert to int
oper_mode = HELP;
}
else if (strcmp(p[i],"ALL") == 0 ||
strncmp(p[i],"ALL:",4) == 0) { // ALL-list requested
lp[P_ALL].priv[0] = SYSOP; // first/only default: SYSOP
if (p[i][3] == ':')
if (conv_priv(&p[i][4],lp[P_ALL].priv,10) <= 0) // convert to int
oper_mode = HELP;
}
else if (strcmp(p[i],"IPF") == 0 ||
strncmp(p[i],"IPF:",4) == 0) { // IPF-list requested
lp[P_IPF].priv[0] = SYSOP; // first/only default: SYSOP
if (p[i][3] == ':')
if (conv_priv(&p[i][4],lp[P_IPF].priv,10) <= 0) // convert to int
oper_mode = HELP;
}
else if (strcmp(p[i],"GBL") == 0 ||
strncmp(p[i],"GBL:",4) == 0) { // GBL-list requested
lp[P_GBL].priv[0] = SYSOP; // first/only default: SYSOP
if (p[i][3] == ':')
if (conv_priv(&p[i][4],lp[3].priv,10) <= 0) // convert to int
oper_mode = HELP;
}
else if (strcmp(p[i],"FIL") == 0 ||
strncmp(p[i],"FIL:",4) == 0) { // FILES.BBS to be generated
lp[P_FIL].priv[0] = SYSOP; //
if (p[i][3] == ':') { // path specified?
strncpy(filesbbs_path,&p[i][4],79);
j = strlen(filesbbs_path);
if (j>0 && filesbbs_path[j-1] != '\\')
filesbbs_path[j] = '\\'; // add backslash if needed
}
}
else if (p[i][0] == '/' || p[i][0] == '-') { // option flag
switch(c = toupper(p[i][1])) {
case TRUNC : for (j=0; j<P_MAX; ++j)
lp[j].wrapflag = TRUNC;
break;
case WRAP : for (j=0; j<P_MAX; ++j)
lp[j].wrapflag = WRAP;
break;
case ALPHA : for (j=0; j<P_MAX; ++j)
lp[j].sortflag = ALPHA;
break;
case TIMESTAMP : for (j=0; j<P_MAX; ++j)
lp[j].sortflag = TIMESTAMP;
break;
case KEEPSEQ : for (j=0; j<P_MAX; ++j)
lp[j].sortflag = KEEPSEQ;
break;
case EXCLPRIV : for (j=0; j<P_MAX; ++j)
lp[j].exclflag = EXCLPRIV;
break;
case QUIET : oper_mode = QUIET; break;
case VERBOSE : oper_mode = VERBOSE; break;
case HELP : oper_mode = HELP; break;
case QMARK : oper_mode = HELP; break;
default : oper_mode = HELP; break;
}
}
else if (0 < (n = atoi(p[i]))) // numeric: NEW-list length
for (j=0; j<P_MAX; ++j)
lp[j].max_fil = n; // new value for all
else if (p[i][0] == '@') // config filespec
; // skip
else
printf("\nUnknown Parameter: %-50.50s",p[i]);
}
for (i=0; i<P_MAX; i++) // all report entries
for (j=0; j<10; j++) // all privilege entries
if (ABS_MAX_priv < lp[i].priv[j] && // higher than before
HIDDEN+1 > lp[i].priv[j]) // but only requested reports
ABS_MAX_priv = lp[i].priv[j]; // revise if needed
}
/* --------------------------------- */
/* Process privilege parameterstring */
/* --------------------------------- */
int conv_priv(c,p,n)
char *c; // parameter string (uppercase)
int p[]; // pointer to privilege array
USHORT n; // maximum number of privileges
{
USHORT i,j,k; // counters
for (i=j=0; i<n && c[i]!='\0' && c[i]!=' '; ++i) {
if (c[i] == '*') // asterisk specified?
p[j] = SYSOP; // system default
else {
for (k=0; k<HIDDEN-TWIT+1 && // search table
priv_name[k][0]!=toupper(c[i]); k++);
p[j] = k + TWIT; // store real privilege
} // endif
if (p[j]<=HIDDEN) // hidden or below?
++j; // count only valid privs
} // endfor
for (i=j; i<n; ++i) // remaining priv-values
p[i] = HIDDEN + 1; // undo any previous settings
return(j); // number of valid privs
}
/* ------------------ */
/* Produce time stamp */
/* ------------------ */
char *sys_date(t)
char t[]; // output buffer
{
long secs_now; // relative time value
char *buf; // pointer to time string
time(&secs_now); // get current time
buf = ctime(&secs_now); // convert to char string
strcpy(t,buf); // copy string
t[16] = '\0'; // undo secs, year and newline
return(t); // pointer to buffer
}
/* =================================== */
/* Process DOWNSORT Configuration File */
/* =================================== */
void read_cfg(ds_cfg)
char ds_cfg[];
{
FILE *prm;
char buf[255];
char *value; // ptr to parameter value
int i,j,t;
if ((prm = fopen(ds_cfg,"r")) == NULL )
printf(OPEN_FAIL,ds_cfg);
else {
printf("\nReading configuration file: %s",cfg_path);
while (fgets(buf,255,prm)) { // process 1 line at a time
switch(parse_keyword(buf,&value)) {
case K_CMT: // Comment and empty lines
break;
case K_TIT: // list title (ALL, NEW, GBL)
for (j=0; j<20 && value[j]!='\0'; j++)
if (value[j] == '~') // replace tilde by blank
value[j] = ' ';
strncpy(list_title,value,20);
break;
case K_PRE: // pre-title
title_line(value,pre_title);
break;
case K_SUB: // sub-title
title_line(value,sub_title);
break;
case K_BOT: // bottom line
title_line(value,bot_lines);
break;
case K_ODS: // Orphan Description
strncpy(ORPHAN,value,45); // copy file text
break;
case K_NDS: // Orphan Description
strncpy(NDS,value,45); // copy file text
break;
case K_FNT: // Font for all lists
t = atoi(value); // convert to integer
if (t < FONT0 || t > FONT4) // range check
printf("\n!Error: TitleFont out of range");
else
for (i=0; i<P_MAX; i++)
lp[i].tfont = t; // to all parmlist entries
break;
case K_DAT: // Area.Dat
strncpy(areadat_path,strupr(value),80); // copy file specification
break;
case K_NNN:
if (0 < (t = atoi(value))) // NEW/BBS-list length
for (i=0; i<P_MAX; ++i)
lp[i].max_fil = t; // new value for all lists
break;
case K_ALL: // create ALL-list(s)
list_parm(P_ALL,value,10);
break;
case K_IPF: // create ALL-list(s)
list_parm(P_IPF,value,10);
break;
case K_BBS: // create BBS-list
list_parm(P_BBS,value,1);
break;
case K_GBL: // create GBL-list
list_parm(P_GBL,value,10);
break;
case K_NEW: // create NEW-list(s)
list_parm(P_NEW,value,10);
break;
case K_ORP: // naming of ORP-list
list_parm(P_ORP,value,1);
break;
case K_FIL: // create FILES.bbs files
strupr(value); // all upper case
conv_priv(value,lp[P_FIL].priv,1);
if ((value = next_word(value)) != NULL &&
strcmp(value,"*") != 0) {
strncpy(filesbbs_path,asciiz(value),80); // spec'd PATH
j = strlen(filesbbs_path);
if (j>0 && filesbbs_path[j-1] != '\\')
filesbbs_path[j] = '\\'; // add backslash if needed
while ((value = next_word(value)) != NULL) { // remaining parm(s)
if (value[0] == '/' || value[0] == '-') { // option flag
switch(value[1]) {
case ALPHA : lp[P_FIL].sortflag = ALPHA; break;
case TIMESTAMP : lp[P_FIL].sortflag = TIMESTAMP; break;
case KEEPSEQ : lp[P_FIL].sortflag = KEEPSEQ; break;
case EXCLPRIV : lp[P_FIL].exclflag = EXCLPRIV; break;
case INCLUDE : lp[P_FIL].incl_fspec =
(char *)malloc(strlen(asciiz(value+2))+1);
if (lp[P_FIL].incl_fspec == NULL) {
printf(MSG_MEM,PROGNAME);
exit(14);
}
else
strcpy(lp[P_FIL].incl_fspec,
asciiz(value+2));
break;
default : break;
}
}
}
}
break;
case K_END: // Keyword not found
default: // undefined
printf("\nUnknown Config Parameter: %-50.50s",buf);
break;
}
}
}
}
/* =============================== */
/* Process xxxFileList parameters. */
/* =============================== */
void list_parm(k,v,n)
int k; // appropriate list-parm index
char *v; // parameter string pointer
int n; // max number of privileges
{
char *nv; // moving string pointer
int t; // intermediate int value
strupr(v); // whole string uppercase
conv_priv(v,lp[k].priv,n); // privilege string
if ((nv = next_word(v)) != NULL && // 1st expected: filename
strcmp(nv,"*") != 0) // not asterisk
strncpy(lp[k].name,asciiz(nv),8); // customised filename
while ((nv = next_word(nv)) != NULL) { // remaining parm(s)
if (nv[0] == '/' || nv[0] == '-') { // option flag
switch(nv[1]) {
case TRUNC : lp[k].wrapflag = TRUNC; break;
case WRAP : lp[k].wrapflag = WRAP; break;
case ALPHA : lp[k].sortflag = ALPHA; break;
case TIMESTAMP : lp[k].sortflag = TIMESTAMP; break;
case KEEPSEQ : lp[k].sortflag = KEEPSEQ; break;
case FONT : t = atoi(nv+2);
if (t >= FONT0 && t <= FONT4) // range check
lp[k].tfont = t;
break;
case EXCLPRIV : lp[k].exclflag = EXCLPRIV; break;
case INCLUDE : lp[k].incl_fspec =
(char *)malloc(strlen(asciiz(nv+2))+1);
if (lp[k].incl_fspec == NULL) {
printf(MSG_MEM,PROGNAME); // not enough memory
exit(14);
}
else
strcpy(lp[k].incl_fspec, asciiz(nv+2));
// printf("\nInclude '%s' / '%s', strlen=%d",
// asciiz(nv+2), lp[k].incl_fspec, strlen(asciiz(nv+2)));
break;
default : break;
}
}
else if (0 < atoi(nv)) // numeric: NEW-list length
lp[k].max_fil = atoi(nv);
}
}
/* ============================ */
/* Process xxxTitle parameters. */
/* ============================ */
void title_line(v,t)
char *v; // parameter string pointer
char *t[]; // pointer to title ptr array
{
int i,j; // counters
for (i=0; i<MAXTIT && t[i]!=NULL; ++i); // search 1st free place
if (i<MAXTIT) { // not too many subtitles?
t[i] = (char *)malloc(strlen(v)+1); // obtain memory
if (t[i] == NULL) {
printf(MSG_MEM,PROGNAME); // not enough memory
exit(14);
}
else {
for (j=0; v[j]; j++) // copy whole line
if (v[j] == '~') // tilde
t[i][j] = ' '; // translate into blank
else
t[i][j] = v[j]; // copy
t[i][j] = '\0'; // end of string
}
}
}
/* ===================================== */
/* Find the number of the config options */
/* Returns the keyword symbolic number, */
/* and pointer to the keyword value. */
/* ===================================== */
int parse_keyword(line,value)
char line[]; // input line config file
char **value; // return: ptr to value string
// (NULL) if not found
{
int i,p; // counters
static struct parse_config { // Keyword Parameter Spec
unsigned char id; // parameter identifier
unsigned char len; // keyword length
char *key; // keyword
} cfg[] = { // table of keyword parameters
// NOTE: most significant first!
{K_ALL, 11, "AllFileList"},
{K_IPF, 11, "IpfFileList"},
{K_DAT, 7, "AreaDat"},
{K_BBS, 11, "BbsFileList"},
{K_BOT, 10, "BottomLine"},
{K_FIL, 11, "FilFilePath"},
{K_GBL, 11, "GblFileList"},
{K_NNN, 11, "MaxNewFiles"},
{K_NEW, 11, "NewFileList"},
{K_NDS, 12, "NotFoundDesc"},
{K_ORP, 11, "OrpFileList"},
{K_ODS, 10, "OrphanDesc"},
{K_PRE, 8, "PreTitle"},
{K_SUB, 8, "SubTitle"},
{K_FNT, 9, "TitleFont"},
{K_TIT, 5, "Title"},
{K_END, 0, ""}, // end of table: keyw. not found
};
*value = NULL; // init: default return
for (i=0; line[i]==' '; ++i); // skip leading blanks
line = line+i; // new local pointer
if (line[0] == '%' || // comment
line[0] == ';' || // comment
line[0] == '*' || // comment
line[0] == '\n' || // end of line
line[0] == '\0') // end of string
return(K_CMT); // return as comment line
for (i=0; cfg[i].id < K_END && // not end of table
strnicmp(line,cfg[i].key,cfg[i].len) != 0 ; i++);
p = cfg[i].id; // return identification value
*value = next_word(line); // search value string
if (*value == NULL) // no keyword value
return(K_CMT); // treat as comment
i = strlen(*value); // length of value string
if ((*value)[i-1] == '\n') // replace end of line
(*value)[i-1] = '\0'; // by end of string
return(p); // return the keyword number
}