Write the file as a teach file even though the resources aren't there yet. Add a bunch of infrastructure to start tracking the format of the text.

This commit is contained in:
Jeremy Rand 2021-04-23 00:20:27 -04:00
parent 3456321b23
commit 72da5a8db2
1 changed files with 107 additions and 17 deletions

View File

@ -15,6 +15,8 @@
#include <string.h> #include <string.h>
#include <gsos.h> #include <gsos.h>
#include <resources.h>
#include <textedit.h>
#include "md4c.h" #include "md4c.h"
@ -34,6 +36,20 @@
// Leaving the stack very big for now at 32K. // Leaving the stack very big for now at 32K.
#pragma stacksize 32768 #pragma stacksize 32768
// Defines
#define NUM_HEADER_SIZES 6
// This is plain, emphasized, strong or strong+empasized
#define NUM_TEXT_FORMATS 4
#define NUM_HEADER_STYLES (NUM_HEADER_SIZES * NUM_TEXT_FORMATS)
#define NUM_CODE_STYLES 1
#define NUM_TEXT_STYLES NUM_TEXT_FORMATS
#define NUM_QUOTE_STYLES NUM_TEXT_FORMATS
#define TOTAL_STYLES (NUM_HEADER_STYLES + NUM_CODE_STYLES + NUM_TEXT_STYLES + NUM_QUOTE_STYLES)
// Typedefs // Typedefs
typedef struct tBlockListItem typedef struct tBlockListItem
@ -57,6 +73,49 @@ typedef struct tEntity
uint32_t unicodeChar; uint32_t unicodeChar;
} tEntity; } tEntity;
typedef struct tWindowPos
{
int16_t height;
int16_t width;
int16_t top;
int16_t left;
int32_t version;
} tWindowPos;
// I wish I could use the structure definition from textedit.h but TERuler contains optional
// fields in the definition and Teach isn't expecting them it seems (array of theTabs). So,
// I need my own struct which omits them.
typedef struct tRuler
{
int16_t leftMargin;
int16_t leftIndent;
int16_t rightMargin;
int16_t just;
int16_t extraLS;
int16_t flags;
int32_t userData;
int16_t tabType;
int16_t tabTerminator;
} tRuler;
typedef struct tFormatHeader
{
int16_t version;
int32_t rulerSize;
tRuler ruler;
int32_t styleListLength;
TEStyle styleList[TOTAL_STYLES];
LongWord numberOfStyles;
} tFormatHeader;
typedef struct tFormat
{
tFormatHeader header;
StyleItem styleItems[1];
} tFormat;
//typedef struct tStyle
// Forward declarations // Forward declarations
static int enterBlockHook(MD_BLOCKTYPE type, void * detail, void * userdata); static int enterBlockHook(MD_BLOCKTYPE type, void * detail, void * userdata);
@ -93,6 +152,32 @@ IORecGS writeRec;
char writeBuffer[4096]; char writeBuffer[4096];
int writeBufferOffset = 0; int writeBufferOffset = 0;
tWindowPos windowPos = {
0xad, // height
0x27c, // width
0x1a, // top
0x02, // left
0x0 // version
};
// For the 6 header sizes, we are going with:
// 1 -> Helvetica 36
// 2 -> Helvetica 30
// 3 -> Helvetica 27
// 4 -> Helvetica 24
// 5 -> Helvetica 20
// 6 -> Helvetica 18
uint8_t headerFontSizes[NUM_HEADER_SIZES] = {
36,
30,
27,
24,
20,
18
};
tFormat * formatPtr = NULL;
tEntity entities[] = { tEntity entities[] = {
{ "&Tab;", 0x9, 0x9 }, { "&Tab;", 0x9, 0x9 },
{ "&NewLine;", 0x13, 0x10 }, { "&NewLine;", 0x13, 0x10 },
@ -337,6 +422,8 @@ void writeChar(MD_CHAR ch)
if (writeBufferOffset == sizeof(writeBuffer)) if (writeBufferOffset == sizeof(writeBuffer))
flushBuffer(); flushBuffer();
if (ch == '\n')
ch = '\r';
writeBuffer[writeBufferOffset] = ch; writeBuffer[writeBufferOffset] = ch;
writeBufferOffset++; writeBufferOffset++;
} }
@ -823,8 +910,9 @@ int main(int argc, char * argv[])
static char * inputBuffer; static char * inputBuffer;
static GSString255 outputFileName; static GSString255 outputFileName;
static CreateRecGS createRec;
static NameRecGS destroyRec;
static OpenRecGS openRec; static OpenRecGS openRec;
static SetPositionRecGS setEofRec;
static RefNumRecGS closeRec; static RefNumRecGS closeRec;
static int index; static int index;
@ -841,27 +929,29 @@ int main(int argc, char * argv[])
} }
strcpy(outputFileName.text, argv[index + 1]); strcpy(outputFileName.text, argv[index + 1]);
openRec.pCount = 7; destroyRec.pCount = 1;
openRec.refNum = 0; destroyRec.pathname = &outputFileName;
openRec.pathname = &outputFileName; DestroyGS(&destroyRec);
openRec.requestAccess = writeEnable;
openRec.resourceNumber = 0; createRec.pCount = 7;
openRec.access = destroyEnable | renameEnable | readWriteEnable; createRec.pathname = &outputFileName;
openRec.fileType = 0x04; // This is for text, it is 0x50 for Teach createRec.access = destroyEnable | renameEnable | readWriteEnable;
openRec.auxType = 0x0000; createRec.fileType = 0x50; // Type for Teach file
OpenGS(&openRec); createRec.auxType = 0x5445; // Aux type for Teach file
createRec.storageType = extendedFile;
CreateGS(&createRec);
if (toolerror()) { if (toolerror()) {
fprintf(stderr, "%s: Unable to open output file %s\n", commandName, outputFileName.text); fprintf(stderr, "%s: Unable to create output file %s\n", commandName, outputFileName.text);
exit(1); exit(1);
} }
setEofRec.pCount = 3; openRec.pCount = 3;
setEofRec.refNum = openRec.refNum; openRec.refNum = 0;
setEofRec.base = startPlus; openRec.pathname = &outputFileName;
setEofRec.displacement = 0; openRec.requestAccess = writeEnable;
SetEOFGS(&setEofRec); OpenGS(&openRec);
if (toolerror()) { if (toolerror()) {
fprintf(stderr, "%s: Unable to truncate output file %s\n", commandName, outputFileName.text); fprintf(stderr, "%s: Unable to open output file %s\n", commandName, outputFileName.text);
exit(1); exit(1);
} }