home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.wwiv.com
/
ftp.wwiv.com.zip
/
ftp.wwiv.com
/
pub
/
MISC
/
MAXMA003.ZIP
/
MAX-MAG.C
< prev
next >
Wrap
C/C++ Source or Header
|
1998-04-13
|
10KB
|
325 lines
//<c> Copyright 1997-1998 by Gerry J. Danen; all rights reserved.
//<t> Generate Maximus Message Areas
// Compiled with Microsoft C 8.00. Requires DANEN library to recompile.
// Source released into the Public Domain.
#define DEBUG 0
// %0 file-in file-out
// file-in format:
// name dlarea desc
// NEW o:\fil\new\ New Files
// =FileDivisionBegin <name> <rest of info>
// =FileDivisionEnd
// =Type
//FileArea NEW
// ACS Demoted *
// Desc New Files
// Download O:\FIL\NEW\ ;
// Upload O:\FIL\UNCHECK\ * ;
//End FileArea
// file-out format:
// see MSGAREA.CTL
#include"gd_tools.h"
#include"gd_extrn.h"
#include"gd_kb.h"
#define pgVERS_ "V2.00"
#define pgTITL_ "Generate Message Area data to update MSGAREA.CTL in Maximus BBS"
#define pgCOPR_ "1997"
#define BUFSIZE 4096
#define MAXDIVS 36 // we can process this many divisions, 0-9, A-Z
FILE *iFh, *oFh ;
UCHAR iFile[FS_LEN], oFile[FS_LEN], work[BUFSIZE+2], *w,
sACSdef[81], sDivACS[81], sACS[81],
sUpload[FS_LEN*2], sDnload[FS_LEN*2], sDesc[256],
sAreaName[81], sDivision[81], sType[256]="" ;
UCHAR *id[MAXDIVS+1], *divName[MAXDIVS+1], *divACS[MAXDIVS+1],
*nod[MAXDIVS+1], *ori[MAXDIVS+1], *sty[MAXDIVS+1] ;
UCHAR divkeys[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;
UCHAR fDiv[256], fNam[256], fTag[256], fPat[256], fDes[256] ;
int sDiv, lDiv=1, sNam, lNam, sTag, lTag, sPat, lPat, sDes, lDes=80,
iThisDiv=-1, iPrevDiv=-2 ;
BOOL inMsgDivision = FALSE, ynDiv[MAXDIVS+1] ;
void ShowHelp( void )
{
logon(1);
printf( "\n\nUsage: %s file_in file_out\n\n",
get_global_program_name() );
exit( GD_ERROR_HELP );
}
void do_MsgDivision( STRING action ) //~~~
{
if ( st_eq(action, "End") )
{
if ( inMsgDivision )
{
inMsgDivision = FALSE ;
fprintf( oFh, "\nMsgDivisionEnd\n" );
}
return ;
}
if ( ! st_eq(action, "Start") )
return ;
if ( inMsgDivision ) // terminate division first
fprintf( oFh, "\nMsgDivisionEnd\n" );
strcpy( sDivision, divName[iThisDiv] );
strupr( sDivision );
strcpy( sDivACS , divACS [iThisDiv] );
if ( strlen(sDivision) )
{
inMsgDivision = TRUE ;
fprintf( oFh, "\nMsgDivisionBegin %s %s %s\n", sDivision, sDivACS, id[iThisDiv] );
strcpy( work, id[iThisDiv] );
strupr( work );
printf( "\n\nDivision %-13s %s", sDivision, work );
iPrevDiv = iThisDiv ;
}
}
int div_number( UCHAR d )
{
int i ;
UCHAR key[2] ;
key[0] = d ;
key[1] = EOS ;
strupr( key );
LOOP( i, 0, ((int)strlen(divkeys)-1), 1 ) // divkeys[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
{
if ( key[0] == divkeys[i] )
return( i );
}
return( -1 );
}
void init( int argc, char *argv[] ) //~~~
{
int i, xcnt ;
char buffer[5120], work[256], b[21], iniFile[FS_LEN], *pIni ;
strcpy( iniFile, argv[0] ); // create .ini file name
pIni = strchr( iniFile, '.' );
if ( pIni != NULL )
*pIni = EOS ;
strcat( iniFile, ".INI" );
LOOP( i, 0, MAXDIVS, 1 )
{
ynDiv[i] = FALSE ;
id[i] = nod[i] = ori[i] = sty[i] = NULPTR ;
}
LOOP( i, 0, ((int)strlen(divkeys)-1), 1 ) // divkeys[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
{
sprintf( b, "%c", divkeys[i] );
fl_parse_ini( iniFile, "divisions", b, buffer, &xcnt );
if ( strlen(buffer) )
{
ynDiv[i] = TRUE ;
st_get_word( work, buffer ); // get division name
st_remove_word( buffer ); // remove word
divName[i] = strdup( work );
if ( strlen(buffer) )
{
st_get_word( work, buffer ); // get ACS
st_remove_word( buffer ); // remove word
divACS[i] = strdup( work );
}
else
divACS[i] = strdup( "" );
if ( strlen(buffer) )
id[i] = strdup( buffer ); // whatever is left
else
id[i] = strdup( "" ); // empty
fl_parse_ini( iniFile, "styles", b, buffer, &xcnt );
sty[i] = strdup( buffer );
fl_parse_ini( iniFile, "nodes", b, buffer, &xcnt );
if ( strlen(buffer) )
{
st_get_word( work, buffer ); // get node address
st_remove_word( buffer ); // remove word
nod[i] = strdup( work );
ori[i] = strdup( buffer );
}
else
{
nod[i] = strdup( "" );
ori[i] = strdup( "" );
}
}
}
#if DEBUG
LOOP( i, 0, ((int)strlen(divkeys)-1), 1 ) // divkeys[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
{
if ( ynDiv[i] )
{
printf( "%s %s %s\n\tN/O=%s %s\n\tSTY=%s\n\n",
divName[i], divACS[i], id[i], nod[i], ori[i], sty[i] );
}
}
#endif
fl_parse_ini( iniFile, "fields", "div", buffer, &xcnt );
st_get_word( work, buffer );
sDiv = atoi( work );
fl_parse_ini( iniFile, "fields", "name", buffer, &xcnt );
st_get_word( work, buffer );
st_remove_word( buffer );
sNam = atoi( work );
st_get_word( work, buffer );
lNam = atoi( work );
fl_parse_ini( iniFile, "fields", "tag", buffer, &xcnt );
st_get_word( work, buffer );
st_remove_word( buffer );
sTag = atoi( work );
st_get_word( work, buffer );
lTag = atoi( work );
fl_parse_ini( iniFile, "fields", "path", buffer, &xcnt );
st_get_word( work, buffer );
st_remove_word( buffer );
sPat = atoi( work );
st_get_word( work, buffer );
lPat = atoi( work );
fl_parse_ini( iniFile, "fields", "desc", buffer, &xcnt );
st_get_word( work, buffer );
sDes = atoi( work );
#if DEBUG
printf( "Div start at %d, length %d\n"
"Name start at %d, length %d\n"
"Tag start at %d, length %d\n"
"Path start at %d, length %d\n"
"Desc start at %d, length %d\n",
sDiv, lDiv, sNam, lNam, sTag, lTag, sPat, lPat, sDes, lDes );
#endif
sDiv -- ; // make 0-offset
lDiv ++ ; // include space for \0
sNam -- ;
lNam ++ ;
sTag -- ;
lTag ++ ;
sPat -- ;
lPat ++ ;
sDes -- ;
lDes ++ ;
}
void main( int argc, char *argv[] )
{
tt_init( SHAREWARE_VERSION, 0, pgVERS_, pgTITL_, pgCOPR_ );
logon(0);
if ( argc != 3 )
ShowHelp();
st_cpy( iFile, (UCHAR *) argv[1], FS_LEN );
st_cpy( oFile, (UCHAR *) argv[2], FS_LEN );
strupr( (char *) iFile );
strupr( (char *) oFile );
if ( ( iFh = fopen( iFile, "r" ) ) == NULL )
{
printf( "\n\nFile %s not found\a\n", iFile );
ShowHelp();
}
oFh = fl_create_or_replace_tty( oFh, oFile, "w", YES, YES );
init( argc, argv );
fprintf( oFh,
";\tGenerated by %s %s on %s %s %s\n"
";\t%s\n\n",
get_global_program_name(), pgm_vers, TodaysDay(), TodaysDate(), TodaysTime(), pgm_copyrite );
fprintf( stderr, "%s: reading %s ...", get_global_program_name(), iFile );
while ( (w = fgets( work, BUFSIZE, iFh )) )
{
st_trim( work );
if ( strlen(work) && (work[0] != ';') )
{
iThisDiv = div_number( work[0] );
st_cpy( fDiv, &work[sDiv], lDiv ); // division
st_cpy( fNam, &work[sNam], lNam ); // name
st_cpy( fTag, &work[sTag], lTag ); // net tag
st_cpy( fPat, &work[sPat], lPat ); // file path
st_cpy( fDes, &work[sDes], lDes ); // description
st_trim( fDiv );
st_trim( fNam );
st_trim( fTag );
st_trim( fPat );
st_trim( fDes );
strupr ( fDiv );
strupr ( fTag );
strupr ( fPat );
if ( iThisDiv != iPrevDiv )
do_MsgDivision( "start" );
strcpy( sACS, "**" );
if ( inMsgDivision )
strcpy( sACS, sDivACS );
fprintf( oFh, "\nMsgArea %s\n"
"\t%-8s%s\n"
"\t%-8s%s: %s\n"
"\t%-8s%s\n"
"\t%-8s%s\n",
fNam, "ACS", sACS, "Desc", fTag, fDes,
"Tag", fTag, "Path", fPat );
if ( inMsgDivision )
{
if ( sty[iThisDiv] && strlen(sty[iThisDiv]) )
fprintf( oFh, "\t%-8s%s\n", "Style", sty[iThisDiv] );
if ( ori[iThisDiv] && strlen(ori[iThisDiv]) )
fprintf( oFh, "\t%-8s%s %s %s\n", "Origin",
nod[iThisDiv], nod[iThisDiv], ori[iThisDiv] );
}
fprintf( oFh, "End MsgArea\n" );
if ( inMsgDivision )
{
sprintf( work, "%s.%s", sDivision, fNam );
printf( "\n %-15s %s", work, fDes );
}
else
printf( "\nArea %-15s %s", fNam, fDes );
}
}
do_MsgDivision( "end" ); // just in case we're in a msg division
_fcloseall();
printf( "\n" );
fprintf( stderr, "\n%s created\n", oFile );
exit( GD_ERROR_NONE );
}