home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
World of A1200
/
World_Of_A1200.iso
/
programs
/
text
/
adformat
/
adformat.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-02-27
|
9KB
|
273 lines
/****************************************************************************
* *
* Program : ADFormat *
* Revision : 1.0 *
* Version : $VER: ADFormat.c *
* Copyright : © 1993 DIgital DImensions *
* Author : Hans-Jörg Frieden, of DIgital DImensions *
* *
* Revision History *
* Date Revision Comment *
* ---------------------------------------------------------------------- *
* 15-Aug-93 1.0 Created file. First working version *
* *
****************************************************************************/
#include "global.h"
static char *version = "$VER: ADFormat 1.0";
static char *BackLinkChars = " @{\" Back to Autodoc-it \" Link \"Autodoc-it/main\"}\n"
"---------------------------------------------------------------------\n";
char in[256],out[256];
int col;
BOOL verbose;
BOOL backlink;
BOOL NormConv;
#define TEMPLATE (APTR)"FROM/A,TO/K,COL/K/N,VERBOSE/S,BACKLINK/S"
#define T_FROM 0
#define T_TO 1
#define T_COL 2
#define T_VERBOSE 3
#define T_BACKLINK 4
#define T_COUNT 5
LONG opts[T_COUNT];
#define GETNEXT c=FGetC(fhi); x=c; Write(fho,&x,1);
struct ADEntry {
struct ADEntry *next;
char Title[80];
UWORD TLeng;
char Link[80];
UWORD LLeng;
};
struct ADEntry root,*list;
struct ADEntry *MakeEntry(char *title, char *link) {
struct ADEntry *ret;
ret=(struct ADEntry *)AllocVec(sizeof(struct ADEntry),MEMF_ANY);
if (ret) {
ret->next=NULL;
strncpy(ret->Title,title,80);
ret->TLeng=strlen(title);
strncpy(ret->Link,link,80);
ret->LLeng=strlen(link);
return ret;
} else return ret;
}
BOOL BuildList(BPTR fh) {
ULONG c;
char title[80]; char link[80];
int t,l;
struct ADEntry *ad;
list=&root; root.next=NULL;
do {
c=0;
do {
while (c!='@') c=FGetC(fh);
c=FGetC(fh);
if (c=='e' || c=='E') {
c=FGetC(fh);
if (c=='n' || c=='N') {
c=FGetC(fh);
if (c=='d' || c=='D') {
c=FGetC(fh);
if (c=='n' || c=='N') {
c=FGetC(fh);
if (c=='o' || c=='O') {
c=FGetC(fh);
if (c=='d' || c=='D') {
c=FGetC(fh);
if (c=='e' || c=='E') {
return TRUE;
}
}
}
}
}
}
} else {
while (c!='"') c=FGetC(fh);
t=0;
c=FGetC(fh);
while (c!='"') {
title[t++]=(char)c;
c=FGetC(fh);
}
title[t]=0;
c=FGetC(fh); c=FGetC(fh);
while (c!='"') c=FGetC(fh);
l=0;
c=FGetC(fh);
while (c!='"') {
link[l++]=(char)c;
c=FGetC(fh);
}
link[l]=0;
ad=MakeEntry(title,link);
if (!ad) return FALSE;
list->next=ad;
list=list->next;
}
} while (c!=-1);
} while (c!=-1);
if (c==-1) return FALSE;
else return TRUE;
}
BOOL SeekMainNode(BPTR fhi, BPTR fho) {
ULONG c;
char x;
BOOL ret=FALSE;
do {
GETNEXT
if (c=='@') {
GETNEXT
if (c=='N' || c=='n') {
GETNEXT
if (c=='O' || c=='o') {
GETNEXT
if (c=='D' || c=='d') {
GETNEXT
if (c=='E' || c=='e') {
GETNEXT
while (c==' ') GETNEXT
if (c=='M' || c=='m') {
GETNEXT
if (c=='A' || c=='a') {
GETNEXT
if (c=='I' || c=='i') {
GETNEXT
if (c=='N' || c=='n') {
ret=TRUE;
while (c!='\n') {GETNEXT}
}
}
}
}
}
}
}
}
}
if (c==-1) {
ret=FALSE;
break;
}
} while (ret!=TRUE);
return ret;
}
void CopyRest(BPTR fhi, BPTR fho) {
ULONG c=0;
while (c!=-1) {
c=FGetC(fhi);
FPutC(fho,(char)c);
}
}
void DoConvert(char *in, char *out) {
BPTR fhi,fho;
BOOL bl;
struct ADEntry *max;
struct ADEntry *ad;
char buffer[256];
ULONG ColWidth;
ULONG colnr;
fhi=Open((APTR)in,MODE_OLDFILE);
if (fhi) {
fho=Open((APTR)out,MODE_NEWFILE);
if (fho) {
bl=SeekMainNode(fhi,fho);
if (bl) {
if (backlink) Write(fho,BackLinkChars,strlen(BackLinkChars));
bl=BuildList(fhi);
if (bl) {
ad=root.next;
root.TLeng=0;
max=&root;
while (ad->next) {
if ( (ad->TLeng) > (max->TLeng) ) max=ad;
ad=ad->next;
}
ColWidth=max->TLeng+1;
if (verbose==TRUE) printf("Longest: %s\n",max->Title);
ad=root.next;
colnr=0;
while (ad->next) {
sprintf(buffer," @{\"%-*s\" Link \"%s\"}",ColWidth,ad->Title,ad->Link);
FWrite(fho,buffer,strlen(buffer),1);
colnr++;
if (colnr==col) {
FPutC(fho,'\n');
colnr=0;
}
ad=ad->next;
}
FPutC(fho,'\n');
FWrite(fho,(APTR)"@ENDNODE\n",8,1);
CopyRest(fhi,fho);
} else printf("Error reading %s\n",in);
} else printf("Cannot locate MAIN node\n");
Close(fho);
} else printf("Cannot open Output file\n");
Close(fhi);
} else printf("File %s not found\n",in);
}
void CopyFile(char *to, char *from) {
BPTR fhi,fho;
ULONG c=0;
fhi=Open((APTR)to,MODE_OLDFILE);
if (verbose) printf("Copying: %s -> %s\n",to,from);
if (fhi) {
fho=Open((APTR)from,MODE_NEWFILE);
if (fho) {
while (c!=-1) {
c=FGetC(fhi);
FPutC(fho,(char)c);
}
Close(fho);
} else printf("Cannot overwrite/create %s\n",to);
Close(fhi);
} else printf("File %s not found\n",from);
}
void main(void) {
struct RDArgs *rda;
rda=ReadArgs(TEMPLATE,opts,NULL);
NormConv=TRUE;
if (rda) {
if (opts[T_COL]) col=*(LONG *)(opts[T_COL]); else col=1;
strncpy(in,(char *)opts[T_FROM],256);
if (opts[T_VERBOSE]) verbose=TRUE; else verbose=FALSE;
if (opts[T_BACKLINK]) backlink=TRUE; else backlink=FALSE;
if (opts[T_TO]) strncpy(out,(char *)opts[T_TO],256);
else {
strcpy(out,"adfXXX.XXX");
mktemp(out);
NormConv=FALSE;
}
FreeArgs(rda);
if (strcmp(in,out)==0) {
strcpy(out,"adfXXX.XXX");
mktemp(out);
NormConv=FALSE;
}
DoConvert(in,out);
if (NormConv==FALSE) {
CopyFile(out,in);
DeleteFile((APTR)out);
}
} else {
PrintFault(IoErr(),NULL);
exit(IoErr());
}
exit(0);
}