home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The World of Computer Software
/
World_Of_Computer_Software-02-387-Vol-3of3.iso
/
h
/
hldevkit.zip
/
HL2TEXT.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-04-28
|
15KB
|
422 lines
/*
*
* hl2text.c - Output a HotLink'ed text file to an ASCII file
*
*/
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/hotlinks.h>
#include <exec/memory.h>
#include <dos/dos.h>
#include <lattice/stdio.h>
#include <hotlinks/hotlinks.h>
/* hotlink library base pointer */
struct HotLinksBase *HotLinksBase = 0;
/* hotlinks publication block pointer */
struct PubBlock *pb = 0;
/* hotlinks handle */
int hlh = 0;
/* version string */
char VERSTAG[]="\0$VER: hl2text B5 (12.20.91)";
/* forward declarations */
int __asm filterproc(register __a0 struct PubBlock *);
int getcompnum();
void shutdown(), processtext(), processcommand();
int main(argc, argv)
int argc;
char *argv[];
{
int stilldata, chunksize, error, fo;
unsigned int chunktype;
if(argc!=2)
{
printf("USAGE: hl2text <filename>\n");
exit(0);
}
/* try to open the hotlink.library.
* The library will not open unless hotlinks is running.
*/
if((HotLinksBase=(struct HotLinksBase *)OpenLibrary("hotlinks.library", 0))==0)
{
printf("ERROR - could not open the hotlinks.library\n");
exit(20);
}
/* register this program with the hotlinks system */
hlh = HLRegister(1,0,0);
/* get a PubBlock pointer */
pb=AllocPBlock(hlh);
/* check for errors */
if((pb==(struct PubBlock *)NOMEMORY)||(pb==(struct PubBlock *)NOPRIV))
{
printf("ERROR - AllocPBlock call failed: error=%d\n", pb);
shutdown();
exit(0);
}
/* get a publication using the publication requester provided by the
* hotlink.library.
*/
error = GetPub(pb, &filterproc);
/* check for errors */
if(error!=NOERROR)
{
/* check for errors */
switch(error)
{
case NOPRIV: printf("ERROR: privalge violation\n");
break;
case INVPARAM: printf("ERROR: invaild parameters\n");
break;
case IOERROR: /* user canceled requester */
break;
}
shutdown();
exit(0);
}
/* open the publication */
if((error=OpenPub(pb, OPEN_READ))!=NOERROR)
{
printf("ERROR - could not open the publication for reading\n");
shutdown();
exit(0);
}
/* open the output file */
if((fo=Open(argv[1], MODE_NEWFILE))==0)
{
printf("ERROR - could not open output file for writing\n");
ClosePub(pb);
shutdown();
exit(0);
}
ReadPub(pb, (char *)&chunktype, 4); /* get the FORM tag */
ReadPub(pb, (char *)&stilldata, 4); /* get the FORM size */
ReadPub(pb, (char *)&chunktype, 4); /* get the FORM type (DTXT) */
/* process the chunks */
stilldata -= 4;
while(stilldata>0)
{
ReadPub(pb, (char *)&chunktype, 4);
ReadPub(pb, (char *)&chunksize, 4);
switch(chunktype)
{
case DTXT: /* process the DTXT chunk data */
processtext(pb, fo, chunksize);
/* adjust the chunklength for an odd length */
if(chunksize&0x00000001)
{
chunksize++;
}
break;
case DTAG: /* process the DTAG chunk */
default: /* adjust the length if it is an odd length */
if(chunksize&0x00000001)
{
chunksize++;
}
/* does the chunk have any data in it? */
if(chunksize)
{
/* skip the chunk data */
SeekPub(pb, chunksize, SEEK_CURRENT);
}
break;
}
stilldata -= (chunksize+8);
}
/* close the output file */
Close(fo);
/* close the publication */
ClosePub(pb);
shutdown();
}
void shutdown()
{
if(pb)
{
/* free the publication block pointer */
FreePBlock(pb);
}
if(hlh)
{
/* unregister this program from hotlinks */
UnRegister(hlh);
}
if(HotLinksBase)
{
/* close the library */
CloseLibrary((struct Library *)HotLinksBase);
}
}
/* this is the filter procedure that gets called by GetPub.
* the PubBlock pointer is passed in register a0,
* the return value is passed back in d0 and must be either ACCEPT or NOACCEPT.
*/
int __asm filterproc(register __a0 struct PubBlock *pb)
{
if(pb->PRec.Type==DTXT)
{
return(ACCEPT);
}
else
{
return(NOACCEPT);
}
}
/* process the DTXT chunk from the HotLink'ed file */
void processtext(pb, fo, size)
struct PubBlock *pb;
int fo, size;
{
int clen, cflag, command;
unsigned char input;
while(size>0)
{
ReadPub(pb, &input, 1);
size--;
/* is it a command (signaled by a leading 0) */
if(input==0)
{
size -= getcompnum(pb, &command);
size -= getcompnum(pb, &cflag);
size -= getcompnum(pb, &clen);
processcommand(command, cflag, clen, pb, fo);
size -= clen;
}
else
{
/* else it must be text so write it out */
Write(fo, &input, 1);
}
}
}
int getcompnum(pb, clen)
struct PubBlock *pb;
int *clen;
{
int clen2, count;
unsigned char len;
/* init clen to 0 */
clen2 = 0;
count = 0;
/* read in the first command length byte */
ReadPub(pb, &len, 1);
count++;
/* check for "compressed" numeric form (indicated by the high bit being set) */
while(len&0x80)
{
/* mask off the upper bit (indicator bit) */
len&=0x7f;
/* shift the current command length up by seven bits */
clen2<<=7;
/* add in the new length byte */
clen2+=len;
/* get the next len byte */
ReadPub(pb, &len, 1);
count++;
}
clen2+=len;
*clen=clen2;
return(count);
}
void processcommand(com, flag, len, pb, fo)
int com, flag, len;
struct PubBlock *pb;
int fo;
{
/*
int x;
char input;
*/
char output;
switch(com)
{
case TEXT_TAB: output = 9;
Write(fo, &output, 1);
break;
case TEXT_NEWLINE: output = 10;
Write(fo, &output, 1);
break;
case TEXT_TAG: /*
output = 10;
Write(fo, &output, 1);
Write(fo, "TEXT_TAG: ", 10);
for(x=0; x<len; x++)
{
ReadPub(pb, &input, 1);
Write(fo, &input, 1);
}
output = 10;
Write(fo, &output, 1);
break;
*/
case TEXT_FONT: /*
output = 10;
Write(fo, &output, 1);
Write(fo, "TEXT_FONT: ", 11);
for(x=0; x<len; x++)
{
ReadPub(pb, &input, 1);
Write(fo, &input, 1);
}
output = 10;
Write(fo, &output, 1);
break;
*/
case TEXT_ATTRB: /*
output = 10;
Write(fo, &output, 1);
Write(fo, "TEXT_ATTRB: ", 12);
for(x=0; x<len; x++)
{
ReadPub(pb, &input, 1);
switch(input)
{
case ATTRB_NORMAL: Write(fo, "Normal ", 7);
break;
case ATTRB_BOLD: Write(fo, "Bold ", 5);
break;
case ATTRB_LIGHT: Write(fo, "Light ", 6);
break;
case ATTRB_ITALIC: Write(fo, "Italic ", 7);
break;
case ATTRB_SHADOW: Write(fo, "Shadow ", 7);
break;
case ATTRB_OUTLINE: Write(fo, "OutLine ", 8);
break;
case ATTRB_UNDERLINE: Write(fo, "Underline ", 10);
break;
case ATTRB_WEIGHT: Write(fo, "Weight=", 7);
ReadPub(pb, &input, 1);
Write(fo, &input, 1);
output=' ';
Write(fo, &output, 1);
break;
}
}
output = 10;
Write(fo, &output, 1);
break;
*/
case TEXT_JUSTIFY: /*
output = 10;
Write(fo, &output, 1);
Write(fo, "TEXT_JUSTIFY: ", 14);
for(x=0; x<len; x++)
{
ReadPub(pb, &input, 1);
switch(input)
{
case JUSTIFY_LEFT: Write(fo, "Left ", 5);
break;
case JUSTIFY_CENTER: Write(fo, "Center ", 7);
break;
case JUSTIFY_RIGHT: Write(fo, "Right ", 6);
break;
case JUSTIFY_CHAR: Write(fo, "Char ", 5);
break;
case JUSTIFY_WORD: Write(fo, "Word ", 5);
break;
case JUSTIFY_AUTO: Write(fo, "Auto ", 5);
break;
}
}
output = 10;
Write(fo, &output, 1);
break;
*/
case TEXT_EOC:
case TEXT_EOP:
case TEXT_BCCB:
case TEXT_ECCB:
case TEXT_BCPB:
case TEXT_ECPB:
case TEXT_PAGENUM:
case TEXT_MARK:
case TEXT_BRANGE:
case TEXT_ERANGE:
case TEXT_FOOTNOTE:
case TEXT_RULER:
case TEXT_BAKERN:
case TEXT_EAKERN:
case TEXT_BAHYPHEN:
case TEXT_EAHYPHEN:
case TEXT_TRACKRANGE:
case TEXT_DROPCAP:
case TEXT_POINT:
case TEXT_PARAGRAPH:
case TEXT_INDENT:
case TEXT_LEADING:
case TEXT_PARALEAD:
case TEXT_TRACKING:
case TEXT_BASELINE:
case TEXT_MKERN:
case TEXT_AKERN:
case TEXT_MHYPHEN:
case TEXT_AHYPHEN:
default: SeekPub(pb, len, SEEK_CURRENT);
break;
}
}