diff --git a/md2teach.xcodeproj/xcshareddata/xcschemes/md2teach.xcscheme b/md2teach.xcodeproj/xcshareddata/xcschemes/md2teach.xcscheme index 7259fc8..b6ba435 100644 --- a/md2teach.xcodeproj/xcshareddata/xcschemes/md2teach.xcscheme +++ b/md2teach.xcodeproj/xcshareddata/xcschemes/md2teach.xcscheme @@ -58,14 +58,22 @@ argument = "$TARGET_BUILD_DIR/md2teach" isEnabled = "YES"> + + + + is_tight, ulDetail->mark); + if (debugEnabled) + fprintf(stderr, "%*sUL (is_tight=%d, mark=%c) {\n", debugIndentLevel, "", ulDetail->is_tight, ulDetail->mark); break; } case MD_BLOCK_OL: { MD_BLOCK_OL_DETAIL * olDetail = (MD_BLOCK_OL_DETAIL *)detail; - printf("%*sOL (start=%u, is_tight=%d, mark_delimiter=%c) {\n", indentLevel, "", olDetail->start, olDetail->is_tight, olDetail->mark_delimiter); + if (debugEnabled) + fprintf(stderr, "%*sOL (start=%u, is_tight=%d, mark_delimiter=%c) {\n", debugIndentLevel, "", olDetail->start, olDetail->is_tight, olDetail->mark_delimiter); break; } case MD_BLOCK_LI: - printf("%*sLI {\n", indentLevel, ""); + if (debugEnabled) + fprintf(stderr, "%*sLI {\n", debugIndentLevel, ""); break; case MD_BLOCK_HR: - printf("%*sHR {\n", indentLevel, ""); + if (debugEnabled) + fprintf(stderr, "%*sHR {\n", debugIndentLevel, ""); + fprintf(outputFile, "\r"); break; case MD_BLOCK_H: { MD_BLOCK_H_DETAIL * hDetail = (MD_BLOCK_H_DETAIL *)detail; - printf("%*sH (level=%u) {\n", indentLevel, "", hDetail->level); + if (debugEnabled) + fprintf(stderr, "%*sH (level=%u) {\n", debugIndentLevel, "", hDetail->level); break; } case MD_BLOCK_CODE: { MD_BLOCK_CODE_DETAIL * codeDetail = (MD_BLOCK_CODE_DETAIL *)detail; - printf("%*sCODE ", indentLevel, ""); - if (codeDetail->fence_char != '\0') { - printf("(fence_char=%c) ", codeDetail->fence_char); + if (debugEnabled) { + fprintf(stderr, "%*sCODE ", debugIndentLevel, ""); + if (codeDetail->fence_char != '\0') { + fprintf(stderr, "(fence_char=%c) ", codeDetail->fence_char); + } + fprintf(stderr, "{\n"); } - printf("{\n"); + + fprintf(outputFile, "\r"); break; } case MD_BLOCK_P: - printf("%*sP {\n", indentLevel, ""); + if (debugEnabled) + fprintf(stderr, "%*sP {\n", debugIndentLevel, ""); + fprintf(outputFile, "\r"); break; default: @@ -125,7 +143,7 @@ static int enterBlockHook(MD_BLOCKTYPE type, void * detail, void * userdata) break; } - indentLevel+=2; + debugIndentLevel+=2; return 0; } @@ -156,12 +174,14 @@ static int leaveBlockHook(MD_BLOCKTYPE type, void * detail, void * userdata) break; case MD_BLOCK_H: + fprintf(outputFile, "\r"); break; case MD_BLOCK_CODE: break; case MD_BLOCK_P: + fprintf(outputFile, "\r"); break; default: @@ -170,8 +190,9 @@ static int leaveBlockHook(MD_BLOCKTYPE type, void * detail, void * userdata) break; } - indentLevel-=2; - printf("%*s}\n", indentLevel, ""); + debugIndentLevel-=2; + if (debugEnabled) + fprintf(stderr, "%*s}\n", debugIndentLevel, ""); return 0; } @@ -185,23 +206,28 @@ static int enterSpanHook(MD_SPANTYPE type, void * detail, void * userdata) switch (type) { case MD_SPAN_EM: - printf("%*sEM {\n", indentLevel, ""); + if (debugEnabled) + fprintf(stderr, "%*sEM {\n", debugIndentLevel, ""); break; case MD_SPAN_STRONG: - printf("%*sSTRONG {\n", indentLevel, ""); + if (debugEnabled) + fprintf(stderr, "%*sSTRONG {\n", debugIndentLevel, ""); break; case MD_SPAN_A: - printf("%*sA {\n", indentLevel, ""); + if (debugEnabled) + fprintf(stderr, "%*sA {\n", debugIndentLevel, ""); break; case MD_SPAN_IMG: - printf("%*sIMG {\n", indentLevel, ""); + if (debugEnabled) + fprintf(stderr, "%*sIMG {\n", debugIndentLevel, ""); break; case MD_SPAN_CODE: - printf("%*sCODE {\n", indentLevel, ""); + if (debugEnabled) + fprintf(stderr, "%*sCODE {\n", debugIndentLevel, ""); break; default: @@ -210,7 +236,7 @@ static int enterSpanHook(MD_SPANTYPE type, void * detail, void * userdata) break; } - indentLevel+=2; + debugIndentLevel+=2; return 0; } @@ -243,8 +269,9 @@ static int leaveSpanHook(MD_SPANTYPE type, void * detail, void * userdata) break; } - indentLevel-=2; - printf("%*s}\n", indentLevel, ""); + debugIndentLevel-=2; + if (debugEnabled) + fprintf(stderr, "%*s}\n", debugIndentLevel, ""); return 0; } @@ -254,7 +281,8 @@ static int textHook(MD_TEXTTYPE type, const MD_CHAR * text, MD_SIZE size, void * { switch (type) { case MD_TEXT_NORMAL: - printf("%*sText: \"", indentLevel, ""); + if (debugEnabled) + fprintf(stderr, "%*sText: \"", debugIndentLevel, ""); break; case MD_TEXT_NULLCHAR: @@ -262,15 +290,30 @@ static int textHook(MD_TEXTTYPE type, const MD_CHAR * text, MD_SIZE size, void * return 1; case MD_TEXT_BR: + if (debugEnabled) + fprintf(stderr, "%*sBR\n", debugIndentLevel, ""); + putchar('\n'); + return 0; + case MD_TEXT_SOFTBR: + if (debugEnabled) + fprintf(stderr, "%*sSOFT BR\n", debugIndentLevel, ""); return 0; case MD_TEXT_ENTITY: - printf("%*sEntity: \"", indentLevel, ""); + if (debugEnabled) + fprintf(stderr, "%*sEntity: \"", debugIndentLevel, ""); + + // GS_TODO - For now, just skip printing anything but it would be best to look + // at the extended character map and do the "right thing" for special characters + // like the copyright symbol. + text = ""; + size = 0; break; case MD_TEXT_CODE: - printf("%*sCode: \"", indentLevel, ""); + if (debugEnabled) + fprintf(stderr, "%*sCode: \"", debugIndentLevel, ""); break; default: @@ -279,8 +322,13 @@ static int textHook(MD_TEXTTYPE type, const MD_CHAR * text, MD_SIZE size, void * break; } - fwrite(text, sizeof(MD_CHAR), size, stdout); - printf("\"\n"); + if (debugEnabled) { + fwrite(text, sizeof(MD_CHAR), size, stderr); + fprintf(stderr, "\"\n"); + } + + if (size > 0) + fwrite(text, sizeof(MD_CHAR), size, outputFile); return 0; } @@ -288,7 +336,49 @@ static int textHook(MD_TEXTTYPE type, const MD_CHAR * text, MD_SIZE size, void * static void debugLogHook(const char * message, void * userdata) { - printf("DEBUG: %s\n", message); + if (debugEnabled) + fprintf(stderr, "DEBUG: %s\n", message); +} + + +static void printUsage(void) +{ + fprintf(stderr, "USAGE: %s [ -d ] inputfile outputfile\n", commandName); + exit(1); +} + + +static int parseArgs(int argc, char * argv[]) +{ + commandName = argv[0]; + + static int index; + static int charOffset; + static int optionLen; + + for (index = 1; index < argc; index++) { + if (argv[index][0] != '-') + break; + + optionLen = strlen(argv[index]); + for (charOffset = 1; charOffset < optionLen; charOffset++) { + switch (argv[index][charOffset]) { + case 'd': + debugEnabled = 1; + break; + + default: + printUsage(); + break; + } + } + } + + if (index + 2 != argc) { + printUsage(); + } + + return index; } @@ -303,20 +393,23 @@ int main(int argc, char * argv[]) static char * outputFileName; + static int index; + lowestStackSeen = &result; - if (argc != 3) { - fprintf(stderr, "USAGE: %s inputfile outputfile\n", argv[0]); + index = parseArgs(argc, argv); + inputFileName = argv[index]; + outputFileName = argv[index + 1]; + + outputFile = fopen(outputFileName, "w"); + if (outputFile == NULL) { + fprintf(stderr, "%s: Unable to open output file %s, %s\n", commandName, outputFileName, strerror(errno)); exit(1); } - commandName = argv[0]; - inputFileName = argv[1]; - outputFileName = argv[2]; - inputFile = fopen(inputFileName, "r"); if (inputFile == NULL) { - fprintf(stderr, "%s: Unable to open file %s, %s\n", commandName, inputFileName, strerror(errno)); + fprintf(stderr, "%s: Unable to open input file %s, %s\n", commandName, inputFileName, strerror(errno)); exit(1); } @@ -355,8 +448,16 @@ int main(int argc, char * argv[]) } result = md_parse(inputBuffer, inputFileLen, &parser, NULL); - printf("Parser result: %d\n", result); - printf("Most stack used: %lu\n", ((unsigned long)&result) - ((unsigned long)lowestStackSeen)); + + putchar('\n'); + + fclose(inputFile); + fclose(outputFile); + + if (debugEnabled) { + fprintf(stderr, "Parser result: %d\n", result); + fprintf(stderr, "Most stack used: %lu\n", ((unsigned long)&result) - ((unsigned long)lowestStackSeen)); + } return 0; }