Provide a bunch of the implementation for updating the style information.
This commit is contained in:
parent
6f5cefe417
commit
2d31af9b45
|
@ -7,12 +7,12 @@
|
||||||
<key>Binary.xcscheme_^#shared#^_</key>
|
<key>Binary.xcscheme_^#shared#^_</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>orderHint</key>
|
<key>orderHint</key>
|
||||||
<integer>1</integer>
|
<integer>2</integer>
|
||||||
</dict>
|
</dict>
|
||||||
<key>doNotBuild.xcscheme_^#shared#^_</key>
|
<key>doNotBuild.xcscheme_^#shared#^_</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>orderHint</key>
|
<key>orderHint</key>
|
||||||
<integer>2</integer>
|
<integer>1</integer>
|
||||||
</dict>
|
</dict>
|
||||||
<key>md2teach.xcscheme_^#shared#^_</key>
|
<key>md2teach.xcscheme_^#shared#^_</key>
|
||||||
<dict>
|
<dict>
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
static IORecGS writeRec;
|
static IORecGS writeRec;
|
||||||
static char writeBuffer[4096];
|
static char writeBuffer[4096];
|
||||||
static int32_t writeBufferOffset = 0;
|
static int32_t writeBufferOffset = 0;
|
||||||
|
static MD_SIZE writePos = 0;
|
||||||
|
|
||||||
|
|
||||||
// Implementation
|
// Implementation
|
||||||
|
@ -94,6 +95,7 @@ void writeChar(MD_CHAR ch)
|
||||||
ch = '\r';
|
ch = '\r';
|
||||||
writeBuffer[writeBufferOffset] = ch;
|
writeBuffer[writeBufferOffset] = ch;
|
||||||
writeBufferOffset++;
|
writeBufferOffset++;
|
||||||
|
writePos++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -106,6 +108,12 @@ void writeString(const MD_CHAR * str, MD_SIZE size)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MD_SIZE outputPos(void)
|
||||||
|
{
|
||||||
|
return writePos;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void closeOutputFile(void)
|
void closeOutputFile(void)
|
||||||
{
|
{
|
||||||
RefNumRecGS closeRec;
|
RefNumRecGS closeRec;
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
extern int openOutputFile(const char * filename);
|
extern int openOutputFile(const char * filename);
|
||||||
extern void writeChar(MD_CHAR ch);
|
extern void writeChar(MD_CHAR ch);
|
||||||
extern void writeString(const MD_CHAR * str, MD_SIZE size);
|
extern void writeString(const MD_CHAR * str, MD_SIZE size);
|
||||||
|
extern MD_SIZE outputPos(void);
|
||||||
extern void closeOutputFile(void);
|
extern void closeOutputFile(void);
|
||||||
|
|
||||||
extern const MD_CHAR * readInputFile(const char * filename, MD_SIZE * bufferSize);
|
extern const MD_CHAR * readInputFile(const char * filename, MD_SIZE * bufferSize);
|
||||||
|
|
|
@ -47,7 +47,11 @@
|
||||||
// GS_SPECIFIC - This was just unsigned but on a GS, we need this to be unsigned
|
// GS_SPECIFIC - This was just unsigned but on a GS, we need this to be unsigned
|
||||||
// long to support > 64K sizes and offsets. Also, rather than create a dependency
|
// long to support > 64K sizes and offsets. Also, rather than create a dependency
|
||||||
// on stdint.h which doesn't exist in the base ORCA/C distribution, I am defining
|
// on stdint.h which doesn't exist in the base ORCA/C distribution, I am defining
|
||||||
// int32_t and uint32_t here:
|
// int32_t, uint32_t and some other similar defines here:
|
||||||
|
typedef signed char int8_t;
|
||||||
|
typedef unsigned char uint8_t;
|
||||||
|
typedef int int16_t;
|
||||||
|
typedef unsigned int uint16_t;
|
||||||
typedef long int32_t;
|
typedef long int32_t;
|
||||||
typedef unsigned long uint32_t;
|
typedef unsigned long uint32_t;
|
||||||
|
|
||||||
|
|
188
md2teach/style.c
188
md2teach/style.c
|
@ -6,13 +6,34 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <font.h>
|
||||||
#include <textedit.h>
|
#include <textedit.h>
|
||||||
|
|
||||||
|
#include "io.h"
|
||||||
|
#include "main.h"
|
||||||
#include "style.h"
|
#include "style.h"
|
||||||
|
|
||||||
|
|
||||||
|
// 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_TEXT_STYLES NUM_TEXT_FORMATS
|
||||||
|
#define NUM_QUOTE_STYLES NUM_TEXT_FORMATS
|
||||||
|
#define NUM_CODE_STYLES 1
|
||||||
|
|
||||||
|
#define TOTAL_STYLES (NUM_HEADER_STYLES + NUM_TEXT_STYLES + NUM_QUOTE_STYLES + NUM_CODE_STYLES)
|
||||||
|
|
||||||
|
#define STARTING_STYLE_ITEMS 32
|
||||||
|
|
||||||
|
|
||||||
// Typedefs
|
// Typedefs
|
||||||
|
|
||||||
typedef struct tWindowPos
|
typedef struct tWindowPos
|
||||||
|
@ -56,8 +77,6 @@ typedef struct tFormat
|
||||||
StyleItem styleItems[1];
|
StyleItem styleItems[1];
|
||||||
} tFormat;
|
} tFormat;
|
||||||
|
|
||||||
//typedef struct tStyle
|
|
||||||
|
|
||||||
|
|
||||||
// Globals
|
// Globals
|
||||||
|
|
||||||
|
@ -86,3 +105,166 @@ static uint8_t headerFontSizes[NUM_HEADER_SIZES] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static tFormat * formatPtr = NULL;
|
static tFormat * formatPtr = NULL;
|
||||||
|
static uint32_t allocStyleItems = 0;
|
||||||
|
static MD_SIZE styleChangedAt = 0;
|
||||||
|
|
||||||
|
|
||||||
|
// Implementation
|
||||||
|
|
||||||
|
void growStyleItems(void)
|
||||||
|
{
|
||||||
|
uint32_t newAllocStyleItems = 2 * allocStyleItems;
|
||||||
|
|
||||||
|
formatPtr = realloc(formatPtr, sizeof(formatPtr->header) + newAllocStyleItems * sizeof(StyleItem));
|
||||||
|
if (formatPtr == NULL) {
|
||||||
|
fprintf(stderr, "%s: Out of memory\n", commandName);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
allocStyleItems = newAllocStyleItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int addStyle(int styleListNum, uint16_t fontFamily, uint8_t fontSize, uint8_t fontStyle, uint16_t backgroundColour)
|
||||||
|
{
|
||||||
|
formatPtr->header.styleList[styleListNum].styleFontID.fidRec.famNum = fontFamily;
|
||||||
|
formatPtr->header.styleList[styleListNum].styleFontID.fidRec.fontSize = fontSize;
|
||||||
|
formatPtr->header.styleList[styleListNum].styleFontID.fidRec.fontStyle = fontStyle;
|
||||||
|
formatPtr->header.styleList[styleListNum].foreColor = 0x00;
|
||||||
|
formatPtr->header.styleList[styleListNum].backColor = backgroundColour;
|
||||||
|
formatPtr->header.styleList[styleListNum].userData = 0x00;
|
||||||
|
|
||||||
|
return styleListNum + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int styleInit(void)
|
||||||
|
{
|
||||||
|
int styleListNum;
|
||||||
|
int headerSize;
|
||||||
|
|
||||||
|
formatPtr = malloc(sizeof(formatPtr->header) + STARTING_STYLE_ITEMS * sizeof(StyleItem));
|
||||||
|
if (formatPtr == NULL) {
|
||||||
|
fprintf(stderr, "%s: Out of memory\n", commandName);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
allocStyleItems = STARTING_STYLE_ITEMS;
|
||||||
|
|
||||||
|
formatPtr->header.version = 0x0000;
|
||||||
|
|
||||||
|
formatPtr->header.rulerSize = sizeof(formatPtr->header.ruler);
|
||||||
|
formatPtr->header.ruler.leftMargin = 0x00;
|
||||||
|
formatPtr->header.ruler.leftIndent = 0x00;
|
||||||
|
formatPtr->header.ruler.rightMargin = 0x0221;
|
||||||
|
formatPtr->header.ruler.just = leftJust;
|
||||||
|
formatPtr->header.ruler.extraLS = 0x00;
|
||||||
|
formatPtr->header.ruler.flags = 0x00;
|
||||||
|
formatPtr->header.ruler.userData = 0x00;
|
||||||
|
formatPtr->header.ruler.tabType = stdTabs;
|
||||||
|
formatPtr->header.ruler.tabTerminator = 0x40;
|
||||||
|
|
||||||
|
formatPtr->header.styleListLength = sizeof(formatPtr->header.styleList);
|
||||||
|
|
||||||
|
styleListNum = 0;
|
||||||
|
|
||||||
|
// Add header styles
|
||||||
|
for (headerSize = 0; headerSize < NUM_HEADER_SIZES; headerSize++) {
|
||||||
|
styleListNum = addStyle(styleListNum, helvetica, headerFontSizes[headerSize], plainMask, 0xffff);
|
||||||
|
styleListNum = addStyle(styleListNum, helvetica, headerFontSizes[headerSize], boldMask, 0xffff);
|
||||||
|
styleListNum = addStyle(styleListNum, helvetica, headerFontSizes[headerSize], italicMask, 0xffff);
|
||||||
|
styleListNum = addStyle(styleListNum, helvetica, headerFontSizes[headerSize], boldMask | italicMask, 0xffff);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add test styles - Also default the first text format to plain.
|
||||||
|
formatPtr->header.numberOfStyles = 1;
|
||||||
|
formatPtr->styleItems[0].dataOffset = 0;
|
||||||
|
formatPtr->styleItems[0].dataOffset = styleListNum * sizeof(formatPtr->header.styleList[0]);
|
||||||
|
|
||||||
|
styleListNum = addStyle(styleListNum, helvetica, 12, plainMask, 0xffff);
|
||||||
|
styleListNum = addStyle(styleListNum, helvetica, 12, boldMask, 0xffff);
|
||||||
|
styleListNum = addStyle(styleListNum, helvetica, 12, italicMask, 0xffff);
|
||||||
|
styleListNum = addStyle(styleListNum, helvetica, 12, boldMask | italicMask, 0xffff);
|
||||||
|
|
||||||
|
// Add quote styles
|
||||||
|
styleListNum = addStyle(styleListNum, helvetica, 12, plainMask, 0xeeee);
|
||||||
|
styleListNum = addStyle(styleListNum, helvetica, 12, boldMask, 0xeeee);
|
||||||
|
styleListNum = addStyle(styleListNum, helvetica, 12, italicMask, 0xeeee);
|
||||||
|
styleListNum = addStyle(styleListNum, helvetica, 12, boldMask | italicMask, 0xeeee);
|
||||||
|
|
||||||
|
// Add code style
|
||||||
|
styleListNum = addStyle(styleListNum, courier, 12, plainMask, 0xffff);
|
||||||
|
|
||||||
|
if (styleListNum != TOTAL_STYLES)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: Expected %d styles but created %d styles.\n", commandName);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void setStyle(tStyleType styleType, uint16_t textMask, uint16_t headerSize)
|
||||||
|
{
|
||||||
|
int32_t styleOffset;
|
||||||
|
MD_SIZE currentPos;
|
||||||
|
int lastStyleIndex = formatPtr->header.numberOfStyles - 1;
|
||||||
|
|
||||||
|
switch (styleType) {
|
||||||
|
case STYLE_TYPE_HEADER:
|
||||||
|
styleOffset = ((headerSize - 1) * NUM_TEXT_FORMATS) + textMask;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STYLE_TYPE_TEXT:
|
||||||
|
styleOffset = NUM_HEADER_STYLES + textMask;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STYLE_TYPE_QUOTE:
|
||||||
|
styleOffset = NUM_HEADER_STYLES + NUM_TEXT_STYLES + textMask;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STYLE_TYPE_CODE:
|
||||||
|
styleOffset = NUM_HEADER_STYLES + NUM_TEXT_STYLES + NUM_QUOTE_STYLES;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "%s: Unexpected style type (%u)\n", commandName, (uint16_t)styleType);
|
||||||
|
}
|
||||||
|
|
||||||
|
styleOffset *= sizeof(formatPtr->header.styleList[0]);
|
||||||
|
|
||||||
|
// If the offset requested is the same as the one we already have, then just return.
|
||||||
|
// Nothing has changed.
|
||||||
|
if (formatPtr->styleItems[lastStyleIndex].dataOffset == styleOffset)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Check to see if the previous style actually emitted any characters and if not,
|
||||||
|
// then just overwrite it with this new style.
|
||||||
|
currentPos = outputPos();
|
||||||
|
if (styleChangedAt == currentPos) {
|
||||||
|
formatPtr->styleItems[lastStyleIndex].dataOffset = styleOffset;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
formatPtr->styleItems[lastStyleIndex].dataLength = currentPos - styleChangedAt;
|
||||||
|
styleChangedAt = currentPos;
|
||||||
|
|
||||||
|
if (formatPtr->header.numberOfStyles == allocStyleItems)
|
||||||
|
growStyleItems();
|
||||||
|
|
||||||
|
lastStyleIndex++;
|
||||||
|
formatPtr->header.numberOfStyles++;
|
||||||
|
formatPtr->styleItems[lastStyleIndex].dataOffset = styleOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
void closeStyle(void)
|
||||||
|
{
|
||||||
|
MD_SIZE currentPos = outputPos();
|
||||||
|
int lastStyleIndex = formatPtr->header.numberOfStyles - 1;
|
||||||
|
|
||||||
|
// If the final style was not used, then remove it. Otherwise, update the length of the
|
||||||
|
// final style.
|
||||||
|
if (styleChangedAt == currentPos) {
|
||||||
|
formatPtr->header.numberOfStyles--;
|
||||||
|
} else {
|
||||||
|
formatPtr->styleItems[lastStyleIndex]. dataLength = currentPos - styleChangedAt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -9,19 +9,31 @@
|
||||||
#ifndef _GUARD_PROJECTmd2teach_FILEstyle_
|
#ifndef _GUARD_PROJECTmd2teach_FILEstyle_
|
||||||
#define _GUARD_PROJECTmd2teach_FILEstyle_
|
#define _GUARD_PROJECTmd2teach_FILEstyle_
|
||||||
|
|
||||||
|
#include "md4c.h"
|
||||||
|
|
||||||
|
|
||||||
// Defines
|
// Defines
|
||||||
|
|
||||||
#define NUM_HEADER_SIZES 6
|
#define STYLE_TEXT_PLAIN 0u
|
||||||
|
#define STYLE_TEXT_MASK_STRONG 1u
|
||||||
|
#define STYLE_TEXT_MASK_EMPHASIZED 2u
|
||||||
|
|
||||||
// This is plain, emphasized, strong or strong+empasized
|
|
||||||
#define NUM_TEXT_FORMATS 4
|
|
||||||
|
|
||||||
#define NUM_HEADER_STYLES (NUM_HEADER_SIZES * NUM_TEXT_FORMATS)
|
// Typedefs
|
||||||
#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)
|
typedef enum tStyleType {
|
||||||
|
STYLE_TYPE_HEADER,
|
||||||
|
STYLE_TYPE_TEXT,
|
||||||
|
STYLE_TYPE_QUOTE,
|
||||||
|
STYLE_TYPE_CODE
|
||||||
|
} tStyleType;
|
||||||
|
|
||||||
|
|
||||||
|
// API
|
||||||
|
|
||||||
|
extern int styleInit(void);
|
||||||
|
extern void setStyle(tStyleType styleType, uint16_t textMask, uint16_t headerSize);
|
||||||
|
extern void closeStyle(void);
|
||||||
|
|
||||||
|
|
||||||
#endif /* define _GUARD_PROJECTmd2teach_FILEstyle_ */
|
#endif /* define _GUARD_PROJECTmd2teach_FILEstyle_ */
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include "translate.h"
|
#include "translate.h"
|
||||||
#include "io.h"
|
#include "io.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
#include "style.h"
|
||||||
|
|
||||||
|
|
||||||
// Typedefs
|
// Typedefs
|
||||||
|
@ -720,5 +721,14 @@ static void debugLogHook(const char * message, void * userdata)
|
||||||
|
|
||||||
int parse(const MD_CHAR* text, MD_SIZE size)
|
int parse(const MD_CHAR* text, MD_SIZE size)
|
||||||
{
|
{
|
||||||
return md_parse(text, size, &parser, NULL);
|
int result;
|
||||||
|
|
||||||
|
if (styleInit() != 0)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
result = md_parse(text, size, &parser, NULL);
|
||||||
|
|
||||||
|
closeStyle();
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue