gno/usr.bin/aw30/aw30.c

254 lines
5.7 KiB
C

#pragma keep "AppleWorks"
#pragma stacksize 2048
#pragma optimize -1
#include <stdio.h>
#include <stdlib.h>
#pragma lint -1
#define PROG_VERSION "0.70"
#define DATE "11/21/92"
FILE *f;
char SFMinVers; /* Minimum AppleWorks Version required */
int MultRulers; /* Boolean - Multiple Rulers */
char Ruler[80]; /* Ruler for Tab Stops */
int *input;
int lcv;
int *ID1, *ID2;
char Center; /* Boolean - Centering on */
char Codes; /* Boolean - Special Codes switch */
char NewPage; /* Boolean - Use New Page */
char LeftMargin; /* Size of left margin (tenths of an inch) */
char RightMargin; /* Size of right margin (tenths of an inch) */
char PlatenWidth; /* Width of platen (tenths of an inch) */
char argument;
char ShowNames; /* Boolean - Show names of file being processed */
void usage (void)
{
fprintf (stderr, " Version %s (%s)\n", PROG_VERSION, DATE);
fprintf (stderr, " Robert Hill\n");
fprintf (stderr, " INTERNET: rhill@oread.cc.ukans.edu\n AOL: RobertHill\n\n");
fprintf (stderr, "Usage: appleworks [-cn] filename\n");
}
int initialize (void)
{
fseek (f, 4L, SEEK_SET);
*input = (char) fgetc (f);
if (*input != 79) {
fprintf (stderr, "appleworks: File is not an AppleWorks file.\n");
return -1;
}
for (lcv = 0; lcv < 80; ++lcv) {
Ruler [lcv] = (char) fgetc (f);
if (Ruler[lcv] == EOF) {
fprintf (stderr, "appleworks: File is corrupted.\n");
return -1;
}
}
fseek (f, 177L, SEEK_SET);
MultRulers = (char) fgetc (f);
fseek (f, 184L, SEEK_SET);
SFMinVers = (char) fgetc (f);
fseek (f, 300L, SEEK_SET);
return 0;
}
int TextLine (void)
{
char indent;
int length;
float location;
*input = (char) fgetc (f);
if (*input == EOF)
return -1;
indent = (*input & 127);
for (lcv = 0; lcv < indent; ++ lcv)
printf (" ");
*input = (char) fgetc (f);
if (*input == EOF)
return -1;
length = (*input) & 127;
if (Center) {
location = (((PlatenWidth - RightMargin - LeftMargin) / 10.0) -
length) / 2.0;
for (lcv = 0; lcv < (int) location; ++ lcv)
printf (" ");
}
for (lcv = 0; lcv < length; ++ lcv) {
*input = (char) fgetc (f);
if (*input == EOF)
return -1;
else if (((*input) > 0x18) && ((*input) <= 0x7F))
printf ("%c", *input);
else switch (*input) {
case 0x01 : printf ("%c", 15); /* Boldface on */
break;
case 0x02 : printf ("%c", 14); /* Boldface off */
break;
case 0x07 : printf ("%c", 15); /* Underline on */
break;
case 0x08 : printf ("%c", 14); /* Underline off */
break;
case 0x16 : printf (" ");
++indent;
while ((Ruler[indent]=='=') && (indent < 81)) {
printf (" "); /* Tab */
++indent;
}
break;
}
}
printf("\n");
}
void HandleCommand (int *ID1, int *ID2)
{
switch (*ID2) {
case 0xD8 : PlatenWidth = *ID1;
if (Codes)
printf ("---Platen Width=%.1f inches\n",
(float) (PlatenWidth / 10));
break;
case 0xD9 : LeftMargin = *ID1;
if (Codes)
printf ("---Left Margin=%.1f inches\n",
(float) (LeftMargin / 10));
break;
case 0xDA : RightMargin = *ID1;
if (Codes)
printf ("---Right Margin=%.1f inches\n",
(float) (RightMargin / 10));
break;
case 0xE0 : Center = 0;
if (Codes)
printf ("---Unjustified\n");
break;
case 0xE1 : Center = 1;
if (Codes)
printf ("---Center\n");
break;
case 0xE9 : if (NewPage)
printf ("%c", 12);
break;
}
}
int main (int argc, char **argv)
{
argument = 1;
Codes = NewPage = ShowNames = 0;
input = (int *) malloc (sizeof(int));
ID1 = (int *) malloc (sizeof(int));
ID2 = (int *) malloc (sizeof(int));
if (argc == 1)
usage ();
else {
while (argc > argument) {
Center = 0;
LeftMargin = RightMargin = 10;
PlatenWidth = 80;
if ((argument == 1) && (argv[1][0] == '-')) {
lcv = 1;
while (argv[1][lcv] != 0x00) {
switch (argv[1][lcv]) {
case 'c' : Codes = 1;
break;
case 'n' : NewPage = 1;
break;
case 's' : ShowNames = 1;
break;
}
++lcv;
}
if (argc > 2) {
++argument;
f = fopen (argv[2], "rb");
if (f == NULL) {
fprintf (stderr,
"appleworks: Could not open %s.\n",
argv[2]);
return -1;
}
else if (ShowNames)
printf ("appleworks: %s\n\n", argv[2]);
}
else {
usage ();
return 0;
}
}
else {
f = fopen (argv[argument], "rb");
if (f == NULL) {
fprintf (stderr, "appleworks: Could not open %s.\n",
argv[argument]);
return -1;
}
else if (ShowNames)
printf ("appleworks: %s\n\n", argv[argument]);
}
if (initialize () == -1)
return -1;
while ((!((*ID1==0xFF) && (*ID2==0xFF))) &&
(!((*ID1==EOF) || (*ID2==EOF)))) {
*ID1 = fgetc (f);
*ID2 = fgetc (f);
if ((*ID1 != EOF) && (*ID2 != EOF)) {
if (*ID2==0x00)
if (TextLine () == -1) {
fprintf (stderr,
"appleworks: %s is corrupted.\n",
argv[argument]);
return -1;
}
if (*ID2==0xD0)
printf ("\n");
if ((*ID2) > 0xD0)
HandleCommand (ID1, ID2);
}
}
*ID1 = *ID2 = 0;
++argument;
printf ("\n");
fclose (f);
}
}
return 0;
}