| /* | |
| * Copyright 1996 Ulrich Schmid | |
| */ | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <string.h> | |
| #include <time.h> | |
| #include <ctype.h> | |
| #include <fcntl.h> | |
| #include "windows.h" | |
| #include "hlpfile.h" | |
| typedef struct | |
| { | |
| const char *header1; | |
| const char *header2; | |
| const char *section; | |
| const char *first_paragraph; | |
| const char *newline; | |
| const char *next_paragraph; | |
| const char *special_char; | |
| const char *begin_italic; | |
| const char *end_italic; | |
| const char *begin_boldface; | |
| const char *end_boldface; | |
| const char *begin_typewriter; | |
| const char *end_typewriter; | |
| const char *tail; | |
| } FORMAT; | |
| typedef struct | |
| { | |
| const char ch; | |
| const char *subst; | |
| } CHARMAP[]; | |
| FORMAT format = | |
| { | |
| "<!doctype linuxdoc system>\n" | |
| "<article>\n" | |
| "<title>\n", | |
| "\n<author>\n%s\n" | |
| "<date>\n%s\n", | |
| "\n<sect>\n", | |
| "\n<p>\n", | |
| "\n<newline>\n", | |
| "\n\n", | |
| "&%s;", | |
| "<em>", | |
| "</em>", | |
| "<bf>", | |
| "</bf>", | |
| "<tt>", | |
| "</tt>", | |
| "\n</article>\n" | |
| }; | |
| CHARMAP charmap = | |
| {{'Æ', "AElig"}, | |
| {'Á', "Aacute"}, | |
| {'Â', "Acirc"}, | |
| {'À', "Agrave"}, | |
| {'Ã', "Atilde"}, | |
| {'Ç', "Ccedil"}, | |
| {'É', "Eacute"}, | |
| {'È', "Egrave"}, | |
| {'Ë', "Euml"}, | |
| {'Í', "Iacute"}, | |
| {'Î', "Icirc"}, | |
| {'Ì', "Igrave"}, | |
| {'Ï', "Iuml"}, | |
| {'Ñ', "Ntilde"}, | |
| {'Ó', "Oacute"}, | |
| {'Ô', "Ocirc"}, | |
| {'Ò', "Ograve"}, | |
| {'Ø', "Oslash"}, | |
| {'Ú', "Uacute"}, | |
| {'Ù', "Ugrave"}, | |
| {'Ý', "Yacute"}, | |
| {'á', "aacute"}, | |
| {'â', "acirc"}, | |
| {'æ', "aelig"}, | |
| {'à', "agrave"}, | |
| {'å', "aring"}, | |
| {'ã', "atilde"}, | |
| {'ç', "ccedil"}, | |
| {'é', "eacute"}, | |
| {'ê', "ecirc"}, | |
| {'è', "egrave"}, | |
| {'ë', "euml"}, | |
| {'í', "iacute"}, | |
| {'î', "icirc"}, | |
| {'ì', "igrave"}, | |
| {'ï', "iuml"}, | |
| {'ñ', "ntilde"}, | |
| {'ó', "oacute"}, | |
| {'ÿ', "yuml"}, | |
| {'ô', "ocirc"}, | |
| {'ò', "ograve"}, | |
| {'ø', "oslash"}, | |
| {'õ', "otilde"}, | |
| {'ú', "uacute"}, | |
| {'û', "ucirc"}, | |
| {'ù', "ugrave"}, | |
| {'ý', "yacute"}, | |
| {'<', "lt"}, | |
| {'&', "amp"}, | |
| {'"', "dquot"}, | |
| {'#', "num"}, | |
| {'%', "percnt"}, | |
| {'\'', "quot"}, | |
| #if 0 | |
| {'(', "lpar"}, | |
| {')', "rpar"}, | |
| {'*', "ast"}, | |
| {'+', "plus"}, | |
| {',', "comma"}, | |
| {'-', "hyphen"}, | |
| {':', "colon"}, | |
| {';', "semi"}, | |
| {'=', "equals"}, | |
| {'@', "commat"}, | |
| {'[', "lsqb"}, | |
| {']', "rsqb"}, | |
| {'^', "circ"}, | |
| {'_', "lowbar"}, | |
| {'{', "lcub"}, | |
| {'|', "verbar"}, | |
| {'}', "rcub"}, | |
| {'~', "tilde"}, | |
| #endif | |
| {'\\', "bsol"}, | |
| {'$', "dollar"}, | |
| {'Ä', "Auml"}, | |
| {'ä', "auml"}, | |
| {'Ö', "Ouml"}, | |
| {'ö', "ouml"}, | |
| {'Ü', "Uuml"}, | |
| {'ü', "uuml"}, | |
| {'ß', "szlig"}, | |
| {'>', "gt"}, | |
| {'§', "sect"}, | |
| {'¶', "para"}, | |
| {'©', "copy"}, | |
| {'¡', "iexcl"}, | |
| {'¿', "iquest"}, | |
| {'¢', "cent"}, | |
| {'£', "pound"}, | |
| {'×', "times"}, | |
| {'±', "plusmn"}, | |
| {'÷', "divide"}, | |
| {'¬', "not"}, | |
| {'µ', "mu"}, | |
| {0,0}}; | |
| /*********************************************************************** | |
| * | |
| * print_text | |
| */ | |
| static void print_text(const char *p) | |
| { | |
| int i; | |
| for (; *p; p++) | |
| { | |
| for (i = 0; charmap[i].ch; i++) | |
| if (*p == charmap[i].ch) | |
| { | |
| printf(format.special_char, charmap[i].subst); | |
| break; | |
| } | |
| if (!charmap[i].ch) | |
| printf("%c", *p); | |
| } | |
| } | |
| /*********************************************************************** | |
| * | |
| * main | |
| */ | |
| int main(int argc, char **argv) | |
| { | |
| HLPFILE *hlpfile; | |
| HLPFILE_PAGE *page; | |
| HLPFILE_PARAGRAPH *paragraph; | |
| time_t t; | |
| char date[50]; | |
| char *filename; | |
| hlpfile = HLPFILE_ReadHlpFile(argc > 1 ? argv[1] : ""); | |
| if (!hlpfile) return(2); | |
| time(&t); | |
| strftime(date, sizeof(date), "%x", localtime(&t)); | |
| filename = strrchr(hlpfile->lpszPath, '/'); | |
| if (filename) filename++; | |
| else filename = hlpfile->lpszPath; | |
| /* Header */ | |
| printf(format.header1); | |
| print_text(hlpfile->lpszTitle); | |
| printf(format.header2, filename, date); | |
| for (page = hlpfile->first_page; page; page = page->next) | |
| { | |
| paragraph = page->first_paragraph; | |
| if (!paragraph) continue; | |
| /* Section */ | |
| printf(format.section); | |
| for (; paragraph && !paragraph->wVSpace; paragraph = paragraph->next) | |
| print_text(paragraph->lpszText); | |
| printf(format.first_paragraph); | |
| for (; paragraph; paragraph = paragraph->next) | |
| { | |
| /* New line; new paragraph */ | |
| if (paragraph->wVSpace == 1) | |
| printf(format.newline); | |
| else if (paragraph->wVSpace > 1) | |
| printf(format.next_paragraph); | |
| if (paragraph->wFont) | |
| printf(format.begin_boldface); | |
| print_text(paragraph->lpszText); | |
| if (paragraph->wFont) | |
| printf(format.end_boldface); | |
| } | |
| } | |
| printf(format.tail); | |
| return(0); | |
| } | |
| /*********************************************************************** | |
| * | |
| * Substitutions for some WINELIB functions | |
| */ | |
| static FILE *file = 0; | |
| HFILE WINAPI OpenFile( LPCSTR path, OFSTRUCT *ofs, UINT mode ) | |
| { | |
| file = *path ? fopen(path, "r") : stdin; | |
| return file ? 1 : HFILE_ERROR; | |
| } | |
| HFILE WINAPI _lclose( HFILE hFile ) | |
| { | |
| fclose(file); | |
| return 0; | |
| } | |
| LONG WINAPI _hread( HFILE hFile, LPVOID buffer, LONG count ) | |
| { | |
| return fread(buffer, 1, count, file); | |
| } | |
| HGLOBAL WINAPI GlobalAlloc( UINT flags, DWORD size ) | |
| { | |
| return (HGLOBAL) malloc(size); | |
| } | |
| LPVOID WINAPI GlobalLock( HGLOBAL handle ) | |
| { | |
| return (LPVOID) handle; | |
| } | |
| HGLOBAL WINAPI GlobalFree( HGLOBAL handle ) | |
| { | |
| free((VOID*) handle); | |
| return(0); | |
| } | |
| /* | |
| * String functions | |
| * | |
| * Copyright 1993 Yngvi Sigurjonsson (yngvi@hafro.is) | |
| */ | |
| INT WINAPI lstrcmp(LPCSTR str1,LPCSTR str2) | |
| { | |
| return strcmp( str1, str2 ); | |
| } | |
| INT WINAPI lstrcmpi( LPCSTR str1, LPCSTR str2 ) | |
| { | |
| INT res; | |
| while (*str1) | |
| { | |
| if ((res = toupper(*str1) - toupper(*str2)) != 0) return res; | |
| str1++; | |
| str2++; | |
| } | |
| return toupper(*str1) - toupper(*str2); | |
| } | |
| INT WINAPI lstrlen(LPCSTR str) | |
| { | |
| return strlen(str); | |
| } | |
| LPSTR WINAPI lstrcpyA( LPSTR dst, LPCSTR src ) | |
| { | |
| if (!src || !dst) return NULL; | |
| strcpy( dst, src ); | |
| return dst; | |
| } | |
| void WINAPI hmemcpy16(LPVOID hpvDest, LPCVOID hpvSource, LONG cbCopy) | |
| { | |
| memcpy(hpvDest, hpvSource, cbCopy); | |
| } | |
| /* Local Variables: */ | |
| /* c-file-style: "GNU" */ | |
| /* End: */ |