home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Crawly Crypt Collection 1
/
crawlyvol1.bin
/
program
/
compiler
/
nasm20b
/
nasm_src
/
lib65.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-01-19
|
8KB
|
311 lines
/* ---------------------------------------------------------------------- */
/* Copyright (C) 1992 by Natürlich! */
/* This file is copyrighted! */
/* Refer to the documentation for details. */
/* ---------------------------------------------------------------------- */
#define LIBRARIAN 1
#include "defines.h"
#include "nasm.h"
#include <stdio.h>
#include <string.h>
#include "debug.h"
#include "object.h"
#include "lib.h"
#if STATISTICS
#include <time.h>
#endif
#include OSBIND
#include NMALLOC_H
char *currfile,
outfile[ 256];
static char *infile[ MAXFILES],
linkfile[ 256],
#if OS == TOS
_usage[] =
"Usage: nlib65 [-{tw}][-{aducev}][-b batch] <-l library> <object files>\n",
#else
_usage[] =
"Usage: nlib65 [-w][-{aducev}][-b batch] <-l library> <object files>\n",
# if PORTED
portnoy[] =
{
# if INCOMPATIBLE
'W','a','r','n','i','n','g',':',' ','O','b','j','e','c','t',' ',
'f','i','l','e',' ',
'i','n','c','o','m','p','a','t','i','b','i','l','t','y','.',' ',
# endif
'P','o','r','t','e','d',' ','b','y',' ','t','h','e',' ',
'v','a','l','i','a','n','t',' ',PORTER,'\n',0
},
# endif
#endif
notice[] =
{
'N','l','i','b','6','5',' ',' ','v',VERSION+'0','.',
LIBREVISION/10+'0',LIBREVISION%10+'0',' ',
'b','y',' ',AUTHOR,' ',' ','C','o','p','y','r','i','g','h','t',' ',
'(','c',')',' ','1','9','9','2',' ',ORGANIZATION,'\r','\n',0
};
int operation,
verbose,
laber,
#if OS == TOS
tossable,
#endif
emptyfile,
what_the_fuck, /* cited from "Everybody wants some" */
fdout,
nfiles,
#if STATISTICS
tok_remain,
#endif
maxerrors = 20;
extern int freshflag,
errors;
void main( argc, argv)
int argc;
char **argv;
{
#if STATISTICS
clock_t t_start, t_finish, t_result, t_tmp;
#endif
int i = 0;
ENTER("main");
#if STATISTICS
t_start = clock();
#endif
#if DEBUG
if( argc > 1)
printf("Argc=%d argv[1]=\"%s\"\n", argc, argv[1]);
#endif
while( ++i < argc)
if( *argv[i] == '-')
switch( Xtolower( argv[i][1]))
{
case 'l' :
if( ++i == argc)
default :
goto usage;
strcpy( outfile, argv[i]);
break;
case 'a' :
operation = OP_ADD;
break;
case 'u' :
operation = OP_UPDATE;
break;
case 'd' :
operation = OP_DELETE;
break;
case 'c' :
operation = OP_CREATE; /* not for the faint of heart */
break;
case 'e' :
operation = OP_EXTRACT;
break;
case 'v' :
verbose = argv[i][2];
operation = OP_LIST;
break;
#if OS == TOS
case 't' :
tossable = ! tossable;
break;
#endif
#ifdef __DATE__
case ':' :
fputs( __DATE__, stderr);
# ifdef __TIME__
fprintf( stderr, " %s", __TIME__);
# endif
putc( '\n', stderr);
break;
#endif
case 'w' :
what_the_fuck = 1;
break;
case '_' :
laber = 1;
break;
case 'b' :
{
register char c;
FILE *fp, *fopen();
static char x[256];
if( ++i == argc)
goto usage;
strcpy( linkfile, argv[i]);
complete( linkfile, ".bth", 0);
if( ! (fp = fopen( linkfile, "r")))
nferror("Opening the linkfile failed");
do
switch( c = getc( fp))
{
case '#' :
while( (c = getc( fp)) != '\n' && c != EOF);
break;
default :
{
register int i = 0;
do
x[i++] = c;
while( (c = getc( fp)) != ' ' && c != '\t' &&
c != '\r' && c != '\n' && c != EOF && i < 255);
x[i++] = 0;
infile[ nfiles++] = strcpy( (char *) nmalloc( (long) i), x);
}
case ' ' :
case '\t' :
case '\r' :
case '\n' :
case EOF : ;
}
while( c != EOF);
fclose( fp);
}
}
else
infile[nfiles++] = argv[i];
if( (! infile[0] && operation < OP_LIST) || ! outfile[0])
goto usage;
#if OS == MSDOS
_fmode = O_BINARY;
#endif
Cconws( notice);
#if ! VERSION
Cconws("unfinished - unstable - unsupported -- untested. Don't use it!\r\n");
version0();
#endif
#if PORTED
Cconws( portnoy);
#endif
complete( currfile = outfile, ".l65", 0);
pro_init();
if( operation == OP_CREATE)
{
if( (i = (int) Fopen( outfile, OPEN_W)) >= 0)
{
Fclose( i);
nwarning("Killed an old real existing library");
}
goto doit;
}
if( ! lload( currfile = outfile))
if( operation == OP_ADD)
{
doit:
if( (i = (int) Fkreate( currfile, 0x664)) < 0)
ngferror( i, "Couldn't create library file");
Fclose( i);
emptyfile = 1;
}
else
nferror("Library not found");
if( operation == OP_LIST)
{
if( nfiles)
nwarning("Object files ignored");
list( verbose);
}
else
for( i = 0; i != nfiles; i++)
{
IMESS("Libbing now \"%s\"", (unsigned long) infile[i], 4);
switch( operation)
{
case OP_UPDATE :
delete( infile[ i], 1);
case OP_CREATE :
case OP_ADD :
oload( currfile = infile[i]);
sym_lib();
file_lib( currfile);
wrapup();
break;
case OP_EXTRACT :
extract( infile[ i]);
break;
case OP_DELETE :
delete( infile[ i], 0);
}
}
pro_exit();
if( ! errors || what_the_fuck)
{
extern word gindex, findex;
if( ! (findex && gindex))
nferror("Library would be empty");
if( (fdout = (int) Fopen( currfile = outfile, OPEN_W)) < 0)
nferror("Can't open library file");
write_results( fdout); /* clobbers internal structures !! */
}
MESS("OK JUST ABOUT DONE");
#if STATISTICS
t_finish = clock();
if( t_start > t_finish)
t_tmp = t_start - t_finish;
else
t_tmp = t_finish - t_start;
t_result = (t_finish - t_start) / (int) CLK_TCK;
finalstats(1);
printf("Link took %ld.%lds\n", t_result,
(t_tmp - (t_result * (int) CLK_TCK)) >> 1 );
stats();
#endif
ALEAVE();
nexit( 0);
usage:
fputs( _usage, ESTREAM);
fputs( "\
\t-a : add to library\n\
\t-u : update libraray\n\
\t-d : delete from library\n\
\t-c : create library from scratch\n\
\t-e : extract from library\n\
\t-v : verbose\n\
\t-w : write output file anyway (W.T.F.)\n\
\t-_ : talkative\n\
\t-b <batch>: take input files from batchfile\n\
\t-l <lib> : library to use\n", ESTREAM);
#if OS == TOS
fputs( "\
\t-t : wait for keypress before exit\n", ESTREAM);
#endif
ALEAVE();
nexit( 1);
}