wine-wine/programs/winhelp/hlp2sgml.c

332 lines
5.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* 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: */