Added GetProcessHeap definition in case it's not inlined.
[wine] / programs / winhelp / hlp2sgml.c
1 /*
2  * Copyright 1996 Ulrich Schmid
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  */
18
19 #include <stdio.h>
20 #include <stdlib.h>
21 #include <string.h>
22 #include <time.h>
23 #include <ctype.h>
24 #include <fcntl.h>
25 #include <assert.h>
26 #include "windows.h"
27 #include "hlpfile.h"
28
29 typedef struct
30 {
31     const char *header1;
32     const char *header2;
33     const char *section;
34     const char *first_paragraph;
35     const char *newline;
36     const char *next_paragraph;
37     const char *special_char;
38     const char *begin_italic;
39     const char *end_italic;
40     const char *begin_boldface;
41     const char *end_boldface;
42     const char *begin_typewriter;
43     const char *end_typewriter;
44     const char *tail;
45 } FORMAT;
46
47 typedef struct
48 {
49     const char ch;
50     const char *subst;
51 } CHARMAP[];
52
53
54 FORMAT format =
55 {
56     "<!doctype linuxdoc system>\n"
57     "<article>\n"
58     "<title>\n",
59
60     "\n<author>\n%s\n"
61     "<date>\n%s\n",
62
63     "\n<sect>\n",
64     "\n<p>\n",
65     "\n<newline>\n",
66     "\n\n",
67
68     "&%s;",
69
70     "<em>",
71     "</em>",
72     "<bf>",
73     "</bf>",
74     "<tt>",
75     "</tt>",
76
77     "\n</article>\n"
78 };
79
80 CHARMAP charmap =
81 {{'Æ', "AElig"},
82  {'Á', "Aacute"},
83  {'Â', "Acirc"},
84  {'À', "Agrave"},
85  {'Ã', "Atilde"},
86  {'Ç', "Ccedil"},
87  {'É', "Eacute"},
88  {'È', "Egrave"},
89  {'Ë', "Euml"},
90  {'Í', "Iacute"},
91  {'Î', "Icirc"},
92  {'Ì', "Igrave"},
93  {'Ï', "Iuml"},
94  {'Ñ', "Ntilde"},
95  {'Ó', "Oacute"},
96  {'Ô', "Ocirc"},
97  {'Ò', "Ograve"},
98  {'Ø', "Oslash"},
99  {'Ú', "Uacute"},
100  {'Ù', "Ugrave"},
101  {'Ý', "Yacute"},
102  {'á', "aacute"},
103  {'â', "acirc"},
104  {'æ', "aelig"},
105  {'à', "agrave"},
106  {'å', "aring"},
107  {'ã', "atilde"},
108  {'ç', "ccedil"},
109  {'é', "eacute"},
110  {'ê', "ecirc"},
111  {'è', "egrave"},
112  {'ë', "euml"},
113  {'í', "iacute"},
114  {'î', "icirc"},
115  {'ì', "igrave"},
116  {'ï', "iuml"},
117  {'ñ', "ntilde"},
118  {'ó', "oacute"},
119  {'ÿ', "yuml"},
120  {'ô', "ocirc"},
121  {'ò', "ograve"},
122  {'ø', "oslash"},
123  {'õ', "otilde"},
124  {'ú', "uacute"},
125  {'û', "ucirc"},
126  {'ù', "ugrave"},
127  {'ý', "yacute"},
128  {'<', "lt"},
129  {'&', "amp"},
130  {'"', "dquot"},
131  {'#', "num"},
132  {'%', "percnt"},
133  {'\'', "quot"},
134 #if 0
135  {'(', "lpar"},
136  {')', "rpar"},
137  {'*', "ast"},
138  {'+', "plus"},
139  {',', "comma"},
140  {'-', "hyphen"},
141  {':', "colon"},
142  {';', "semi"},
143  {'=', "equals"},
144  {'@', "commat"},
145  {'[', "lsqb"},
146  {']', "rsqb"},
147  {'^', "circ"},
148  {'_', "lowbar"},
149  {'{', "lcub"},
150  {'|', "verbar"},
151  {'}', "rcub"},
152  {'~', "tilde"},
153 #endif
154  {'\\', "bsol"},
155  {'$', "dollar"},
156  {'Ä', "Auml"},
157  {'ä', "auml"},
158  {'Ö', "Ouml"},
159  {'ö', "ouml"},
160  {'Ü', "Uuml"},
161  {'ü', "uuml"},
162  {'ß', "szlig"},
163  {'>', "gt"},
164  {'§', "sect"},
165  {'¶', "para"},
166  {'©', "copy"},
167  {'¡', "iexcl"},
168  {'¿', "iquest"},
169  {'¢', "cent"},
170  {'£', "pound"},
171  {'×', "times"},
172  {'±', "plusmn"},
173  {'÷', "divide"},
174  {'¬', "not"},
175  {'µ', "mu"},
176  {0,0}};
177
178 /***********************************************************************
179  *
180  *           print_text
181  */
182
183 static void print_text(const char *p)
184 {
185     int i;
186
187     for (; *p; p++)
188     {
189         for (i = 0; charmap[i].ch; i++)
190             if (*p == charmap[i].ch)
191             {
192                 printf(format.special_char, charmap[i].subst);
193                 break;
194             }
195         if (!charmap[i].ch)
196             printf("%c", *p);
197     }
198 }
199
200 /***********************************************************************
201  *
202  *           main
203  */
204
205 int main(int argc, char **argv)
206 {
207     HLPFILE   *hlpfile;
208     HLPFILE_PAGE *page;
209     HLPFILE_PARAGRAPH *paragraph;
210     time_t t;
211     char date[50];
212     char *filename;
213
214     hlpfile = HLPFILE_ReadHlpFile(argc > 1 ? argv[1] : "");
215
216     if (!hlpfile) return 2;
217
218     time(&t);
219     strftime(date, sizeof(date), "%x", localtime(&t));
220     filename = strrchr(hlpfile->lpszPath, '/');
221     if (filename) filename++;
222     else filename = hlpfile->lpszPath;
223
224     /* Header */
225     printf(format.header1);
226     print_text(hlpfile->lpszTitle);
227     printf(format.header2, filename, date);
228
229     for (page = hlpfile->first_page; page; page = page->next)
230     {
231         paragraph = page->first_paragraph;
232         if (!paragraph) continue;
233
234         /* Section */
235         printf(format.section);
236         for (; paragraph && !paragraph->u.text.wVSpace; paragraph = paragraph->next)
237             print_text(paragraph->u.text.lpszText);
238         printf(format.first_paragraph);
239
240         for (; paragraph; paragraph = paragraph->next)
241         {
242             switch (paragraph->cookie)
243             {
244             case para_normal_text:
245             case para_debug_text:
246                 /* New line; new paragraph */
247                 if (paragraph->u.text.wVSpace == 1)
248                     printf(format.newline);
249                 else if (paragraph->u.text.wVSpace > 1)
250                     printf(format.next_paragraph);
251
252                 if (paragraph->u.text.wFont)
253                     printf(format.begin_boldface);
254
255                 print_text(paragraph->u.text.lpszText);
256
257                 if (paragraph->u.text.wFont)
258                     printf(format.end_boldface);
259                 break;
260             case para_image:
261                 break;
262             }
263         }
264     }
265
266     printf(format.tail);
267
268     return 0;
269 }
270
271 /***********************************************************************
272  *
273  *           Substitutions for some WINELIB functions
274  */
275
276 static FILE *file = 0;
277
278 HFILE WINAPI OpenFile( LPCSTR path, OFSTRUCT *ofs, UINT mode )
279 {
280     file = *path ? fopen(path, "r") : stdin;
281     return file ? (HFILE)1 : HFILE_ERROR;
282 }
283
284 HFILE WINAPI _lclose( HFILE hFile )
285 {
286     fclose(file);
287     return 0;
288 }
289
290 LONG WINAPI _hread( HFILE hFile, LPVOID buffer, LONG count )
291 {
292     return fread(buffer, 1, count, file);
293 }
294
295 HANDLE WINAPI GetProcessHeap(void)
296 {
297     return 0;
298 }
299
300 void* WINAPI HeapAlloc( HANDLE heap, DWORD flags, DWORD size )
301 {
302     assert(flags == 0);
303     return malloc(size);
304 }
305
306 void* WINAPI HeapReAlloc( HANDLE heap, DWORD flags, void* ptr, DWORD size)
307 {
308     assert(flags == 0);
309     return realloc(ptr, size);
310 }
311
312 BOOL WINAPI HeapFree( HGLOBAL handle, DWORD flags, void* ptr )
313 {
314     free(ptr);
315     return TRUE;
316 }
317
318 char __wine_dbch_winhelp[] = "\003winhelp";
319
320 static char * const debug_channels[1] =
321 {
322     __wine_dbch_winhelp
323 };
324
325 int wine_dbg_log( int cls, const char *channel, const char *func, const char *format, ... )
326 {
327     return 1;
328 }
329
330 HBITMAP WINAPI CreateDIBitmap(HDC hdc, CONST BITMAPINFOHEADER* bih, DWORD a, CONST void* ptr, CONST BITMAPINFO* bi, UINT c)
331 {
332     return 0;
333 }
334
335 HDC WINAPI GetDC(HWND h)
336 {
337     return 0;
338 }
339
340 BOOL WINAPI DeleteObject(HGDIOBJ h)
341 {
342     return TRUE;
343 }
344 /*
345  * String functions
346  *
347  * Copyright 1993 Yngvi Sigurjonsson (yngvi@hafro.is)
348  */
349
350 INT WINAPI lstrcmp( LPCSTR str1, LPCSTR str2 )
351 {
352     return strcmp( str1, str2 );
353 }
354
355 INT WINAPI lstrcmpi( LPCSTR str1, LPCSTR str2 )
356 {
357     INT res;
358
359     while (*str1)
360     {
361         if ((res = toupper(*str1) - toupper(*str2)) != 0) return res;
362         str1++;
363         str2++;
364     }
365     return toupper(*str1) - toupper(*str2);
366 }
367
368 INT WINAPI lstrlen( LPCSTR str )
369 {
370     return strlen(str);
371 }
372
373 LPSTR WINAPI lstrcpyA( LPSTR dst, LPCSTR src )
374 {
375     if (!src || !dst) return NULL;
376     strcpy( dst, src );
377     return dst;
378 }