home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
534.lha
/
AutoRev_v1.1r
/
AutoRev.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-08-08
|
9KB
|
305 lines
/*-- AutoRev header do NOT edit!
*
* Program : AutoRev.c
* Copyright : © 1991 Jaba Development
* Author : Jan van den Baard
* Creation Date : 04-Apr-91
* Current version : 1.1r
* Translator : DICE
*
* REVISION HISTORY
*
* Date Version Comment
* --------- ------- ------------------------------------------
* 03-May-91 1.1r Uses '__regargs' now. 4924 bytes!
* 14-Apr-91 1.1 Added top/bottom choice and args shortcuts
* 04-Apr-91 1.0 Initial version! Requires kickstart 2.0!
*
*-- REV_END --*/
/*
* COMPILING: dcc -r -mRR AutoRev.c -o AutoRev
*/
#include <exec/types.h>
#include <exec/memory.h>
#include <exec/libraries.h>
#include <dos/dos.h>
#include <dos/stdio.h>
#include <string.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#define TEMPLATE "File/a,ASS=ASSEM/s,MOD=MODULA/s,UPD=UPDATE/s,BOT=BOTTOM/s,AUT=AUTHOR/k,COP=COPYRIGHT/k,REV=REVISION/k,COM=COMMENT/k,TRA=TRANSLATOR/k"
#define USAGE "Usage: AutoRev <filename> [ASSEM] [MODULA] [UPDATE] [BOTTOM]\n"\
" [AUTHOR <name>] [COPYRIGHT <string>]\n"\
" [REVISION <string>] [COMMENT <string>]\n"\
" [TRANSLATOR <string>]\n\n"\
"With: filename : The name of the header you want to create/update.\n"\
" ASSEM :\n MODULA : The target language of the header.\n"\
" UPDATE : Update source header.\n"\
" BOTTOM : History at the bottom.\n"\
" AUTHOR : Optional author name.\n"\
" COPYRIGHT : Optional copyright string.\n"\
" REVISION : Optional revision specifier. (e.g. 1.0 or 1.1a etc.)\n"\
" COMMENT : Optional comment string\n"\
" TRANSLATOR : Optional name and version of your compiler/assembler.\n"
#define COPYR "\r\033[0;1;33mAutoRev v1.1r\033[0m - © 1991 Jaba Development\n"\
" \033[1mWritten by Jan van den Baard.\033[0m\n"
#define PUT(m) Write(stdout,m,strlen(m))
struct RDArgs *RArgs = 0L;
struct RDArgs IArgs = { 0,0,0,0,0,0,USAGE,0 };
ULONG size, Args[10];
BPTR infile = 0L, outfile = 0L, stdout;
UBYTE Language = 0L; /* 0=C, 1=Assem, 2=Modula */
UBYTE *Name, *Mem = 0L, Revision[9];
char *lines[] = { "*-- AutoRev header do NOT edit!\n*\n",
"* Program : %-52.52ls\n",
"* Copyright : %-52.52ls\n",
"* Author : %-52.52ls\n",
"* Creation Date : ",
"* Current version : %-7.7ls\n",
"* Translator : %-52.52ls\n*\n",
"* REVISION HISTORY\n*\n",
"* Date Version Comment\n",
"* --------- ------- ------------------------------------------\n",
"*-- REV_END --*" };
extern struct Library *SysBase;
int _main( void );
__regargs void cleanup( char *, long );
void create( void );
__regargs void writecomm( BOOL );
void endheader( void );
void revline( void );
long getrev( void );
void loadold( void );
void update( void );
extern __stkargs void _exit( int );
__regargs void writecomm(BOOL how)
{
if(!Language)
FPutC(outfile,'/');
else if(Language == 2) {
if(how)
FPutC(outfile,'(');
else
FPutC(outfile,')');
}
}
void endheader(void)
{
VFPrintf(outfile,lines[10],0);
if(Language != 1)
writecomm(FALSE);
VFPrintf(outfile,"\n\n",0);
}
void dodate(void)
{
struct DateTime dt;
char date[10];
DateStamp((struct DateStamp *)&dt);
dt.dat_Format = FORMAT_DOS;
dt.dat_StrDate = &date[0];
dt.dat_Flags = 0;
dt.dat_StrDay = 0;
dt.dat_StrTime = 0;
DateToStr(&dt);
VFPrintf(outfile,&date[0],0);
}
void revline(void)
{
VFPrintf(outfile,"* ",0);
dodate();
VFPrintf(outfile," %-7.7ls",&Args[7]);
VFPrintf(outfile," %-42.42ls\n",&Args[8]);
}
long getrev(void)
{
UBYTE *m = Mem, *m2, i = 0;
m2 = Mem+(size-15);
while((strncmp(m++,"Current version",15)) && (m <= m2));
if(m > m2) return(FALSE);
m += 19;
while(*m != 0x0a) Revision[i++] = *m++;
Revision[i++] = 0x0a;
Revision[i] = 0;
return(TRUE);
}
void create(void)
{
UBYTE c = 'y';
if((infile = Open(Name,MODE_OLDFILE))) {
Close(infile);
infile = 0L;
PUT("File already exists! Overwrite ? (y/n) : ");
c = ReadChar();
}
if(c == 'y' || c == 'Y') {
if((outfile = Open(Name,MODE_NEWFILE))) {
SetIoErr(0L);
writecomm(TRUE);
VFPrintf(outfile,lines[0],0);
VFPrintf(outfile,lines[1],&Name);
VFPrintf(outfile,lines[2],&Args[6]);
VFPrintf(outfile,lines[3],&Args[5]);
VFPrintf(outfile,lines[4],0);
dodate();
FPutC(outfile,0x0a);
VFPrintf(outfile,lines[5],&Args[7]);
VFPrintf(outfile,lines[6],&Args[9]);
VFPrintf(outfile,lines[7],0);
VFPrintf(outfile,lines[8],0);
VFPrintf(outfile,lines[9],0);
revline();
VFPrintf(outfile,"*\n",0);
endheader();
Close(outfile);
outfile = 0L;
if(IoErr())
cleanup("Write error!\n",20L);
} else
cleanup("Can't open output file!\n",20L);
} else
cleanup("Header not created!\n",5L);
}
void update(void)
{
char old_name[32];
ULONG curcnt = 0L, hiscnt = 0L;
UBYTE *cm,*hm;
loadold();
if(!getrev())
cleanup("No revision header found!\n",20L);
if(!Args[7])
Args[7] = &Revision[0];
else {
strcpy(&Revision[0],(char *)Args[7]);
strcat(&Revision[0],"\n");
Args[7] = &Revision[0];
}
strncpy(old_name,Name,27);
strcat(old_name,".old");
Rename(Name,(char *)&old_name[0]);
if(!(outfile = Open(Name,MODE_NEWFILE)))
cleanup("Can't open output file!\n",20L);
SetIoErr(0L);
cm = Mem;
while(strncmp(cm++,"Current version",15))
curcnt++;
cm += 20;
curcnt += 20;
FWrite(outfile,Mem,curcnt,1);
FWrite(outfile,(char *)Args[7],strlen((char *)Args[7]),1);
Revision[strlen((char *)Args[7])-1] = 0;
while(*cm++ != 0x0a) curcnt++;;
hm = cm;
if(!Args[4]) {
while(strncmp(cm++,"REVISION HISTORY",16))
hiscnt++;
cm += 138;
hiscnt += 138;
FWrite(outfile,hm,hiscnt,1);
} else {
while(strncmp(cm++,"*-- REV_END",11))
hiscnt++;
cm -= 2;
hiscnt -= 2;
FWrite(outfile,hm,hiscnt,1);
}
revline();
FWrite(outfile,cm-1,(size-(curcnt+hiscnt)-2),1);
Close(outfile);
outfile = 0L;
if(IoErr())
cleanup("Write error!\n",20L);
}
void loadold(void)
{
if((infile = Open(Name,MODE_OLDFILE))) {
Seek(infile,0,OFFSET_END);
size = Seek(infile,0,OFFSET_BEGINNING);
if((Mem = AllocMem(size,MEMF_PUBLIC))) {
if(Read(infile,Mem,size) < size)
cleanup("Read error!\n",20L);
Close(infile);
infile = 0L;
} else
cleanup("Out of memory!\n",20L);
} else
cleanup("Can't open input file!\n",20L);
}
__regargs void cleanup(char *msg, long code)
{
if(infile) Close(infile);
if(outfile) Close(outfile);
if(Mem) FreeMem(Mem,size);
if(RArgs) FreeArgs(RArgs);
if(msg) PUT(msg);
_exit(code);
}
int _main( void )
{
stdout = Output();
if(SysBase->lib_Version < 36)
cleanup("You need kickstart 2.0!\n",20L);
setmem(&Args[0],40L,0);
if((RArgs = ReadArgs(TEMPLATE,&Args[0],&IArgs))) {
PUT(COPYR);
Name = (char *)Args[0];
if(Args[1]) Language = 1;
else if(Args[2]) Language = 2;
else Language = 0;
} else
cleanup("Bad args for AutoRev.\n",20L);
if(!Args[3]) create();
else update();
cleanup(NULL,NULL);
return(0L);
}