Removed some more trailing whitespace.
[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 "windows.h"
26 #include "hlpfile.h"
27
28 typedef struct
29 {
30   const char *header1;
31   const char *header2;
32   const char *section;
33   const char *first_paragraph;
34   const char *newline;
35   const char *next_paragraph;
36   const char *special_char;
37   const char *begin_italic;
38   const char *end_italic;
39   const char *begin_boldface;
40   const char *end_boldface;
41   const char *begin_typewriter;
42   const char *end_typewriter;
43   const char *tail;
44 } FORMAT;
45
46 typedef struct
47 {
48   const char ch;
49   const char *subst;
50 } CHARMAP[];
51
52
53 FORMAT format =
54 {
55   "<!doctype linuxdoc system>\n"
56   "<article>\n"
57   "<title>\n",
58
59   "\n<author>\n%s\n"
60   "<date>\n%s\n",
61
62   "\n<sect>\n",
63   "\n<p>\n",
64   "\n<newline>\n",
65   "\n\n",
66
67   "&%s;",
68
69   "<em>",
70   "</em>",
71   "<bf>",
72   "</bf>",
73   "<tt>",
74   "</tt>",
75
76   "\n</article>\n"
77 };
78
79 CHARMAP charmap =
80   {{'Æ', "AElig"},
81    {'Á', "Aacute"},
82    {'Â', "Acirc"},
83    {'À', "Agrave"},
84    {'Ã', "Atilde"},
85    {'Ç', "Ccedil"},
86    {'É', "Eacute"},
87    {'È', "Egrave"},
88    {'Ë', "Euml"},
89    {'Í', "Iacute"},
90    {'Î', "Icirc"},
91    {'Ì', "Igrave"},
92    {'Ï', "Iuml"},
93    {'Ñ', "Ntilde"},
94    {'Ó', "Oacute"},
95    {'Ô', "Ocirc"},
96    {'Ò', "Ograve"},
97    {'Ø', "Oslash"},
98    {'Ú', "Uacute"},
99    {'Ù', "Ugrave"},
100    {'Ý', "Yacute"},
101    {'á', "aacute"},
102    {'â', "acirc"},
103    {'æ', "aelig"},
104    {'à', "agrave"},
105    {'å', "aring"},
106    {'ã', "atilde"},
107    {'ç', "ccedil"},
108    {'é', "eacute"},
109    {'ê', "ecirc"},
110    {'è', "egrave"},
111    {'ë', "euml"},
112    {'í', "iacute"},
113    {'î', "icirc"},
114    {'ì', "igrave"},
115    {'ï', "iuml"},
116    {'ñ', "ntilde"},
117    {'ó', "oacute"},
118    {'ÿ', "yuml"},
119    {'ô', "ocirc"},
120    {'ò', "ograve"},
121    {'ø', "oslash"},
122    {'õ', "otilde"},
123    {'ú', "uacute"},
124    {'û', "ucirc"},
125    {'ù', "ugrave"},
126    {'ý', "yacute"},
127    {'<', "lt"},
128    {'&', "amp"},
129    {'"', "dquot"},
130    {'#', "num"},
131    {'%', "percnt"},
132    {'\'', "quot"},
133 #if 0
134    {'(', "lpar"},
135    {')', "rpar"},
136    {'*', "ast"},
137    {'+', "plus"},
138    {',', "comma"},
139    {'-', "hyphen"},
140    {':', "colon"},
141    {';', "semi"},
142    {'=', "equals"},
143    {'@', "commat"},
144    {'[', "lsqb"},
145    {']', "rsqb"},
146    {'^', "circ"},
147    {'_', "lowbar"},
148    {'{', "lcub"},
149    {'|', "verbar"},
150    {'}', "rcub"},
151    {'~', "tilde"},
152 #endif
153    {'\\', "bsol"},
154    {'$', "dollar"},
155    {'Ä', "Auml"},
156    {'ä', "auml"},
157    {'Ö', "Ouml"},
158    {'ö', "ouml"},
159    {'Ü', "Uuml"},
160    {'ü', "uuml"},
161    {'ß', "szlig"},
162    {'>', "gt"},
163    {'§', "sect"},
164    {'¶', "para"},
165    {'©', "copy"},
166    {'¡', "iexcl"},
167    {'¿', "iquest"},
168    {'¢', "cent"},
169    {'£', "pound"},
170    {'×', "times"},
171    {'±', "plusmn"},
172    {'÷', "divide"},
173    {'¬', "not"},
174    {'µ', "mu"},
175    {0,0}};
176
177 /***********************************************************************
178  *
179  *           print_text
180  */
181
182 static void print_text(const char *p)
183 {
184   int i;
185
186   for (; *p; p++)
187     {
188       for (i = 0; charmap[i].ch; i++)
189         if (*p == charmap[i].ch)
190           {
191             printf(format.special_char, charmap[i].subst);
192             break;
193           }
194       if (!charmap[i].ch)
195         printf("%c", *p);
196     }
197 }
198
199 /***********************************************************************
200  *
201  *           main
202  */
203
204 int main(int argc, char **argv)
205 {
206   HLPFILE   *hlpfile;
207   HLPFILE_PAGE *page;
208   HLPFILE_PARAGRAPH *paragraph;
209   time_t t;
210   char date[50];
211   char *filename;
212
213   hlpfile = HLPFILE_ReadHlpFile(argc > 1 ? argv[1] : "");
214
215   if (!hlpfile) return(2);
216
217   time(&t);
218   strftime(date, sizeof(date), "%x", localtime(&t));
219   filename = strrchr(hlpfile->lpszPath, '/');
220   if (filename) filename++;
221   else filename = hlpfile->lpszPath;
222
223   /* Header */
224   printf(format.header1);
225   print_text(hlpfile->lpszTitle);
226   printf(format.header2, filename, date);
227
228   for (page = hlpfile->first_page; page; page = page->next)
229     {
230       paragraph = page->first_paragraph;
231       if (!paragraph) continue;
232
233       /* Section */
234       printf(format.section);
235       for (; paragraph && !paragraph->wVSpace; paragraph = paragraph->next)
236         print_text(paragraph->lpszText);
237       printf(format.first_paragraph);
238
239       for (; paragraph; paragraph = paragraph->next)
240         {
241           /* New line; new paragraph */
242           if (paragraph->wVSpace == 1)
243             printf(format.newline);
244           else if (paragraph->wVSpace > 1)
245             printf(format.next_paragraph);
246
247           if (paragraph->wFont)
248             printf(format.begin_boldface);
249
250           print_text(paragraph->lpszText);
251
252           if (paragraph->wFont)
253             printf(format.end_boldface);
254         }
255     }
256
257   printf(format.tail);
258
259   return(0);
260 }
261
262 /***********************************************************************
263  *
264  *           Substitutions for some WINELIB functions
265  */
266
267 static FILE *file = 0;
268
269 HFILE WINAPI OpenFile( LPCSTR path, OFSTRUCT *ofs, UINT mode )
270 {
271   file = *path ? fopen(path, "r") : stdin;
272   return file ? (HFILE)1 : HFILE_ERROR;
273 }
274
275 HFILE WINAPI _lclose( HFILE hFile )
276 {
277   fclose(file);
278   return 0;
279 }
280
281 LONG WINAPI _hread( HFILE hFile, LPVOID buffer, LONG count )
282 {
283   return fread(buffer, 1, count, file);
284 }
285
286 HGLOBAL WINAPI GlobalAlloc( UINT flags, DWORD size )
287 {
288   return (HGLOBAL) malloc(size);
289 }
290
291 LPVOID WINAPI GlobalLock( HGLOBAL handle )
292 {
293   return (LPVOID) handle;
294 }
295
296 HGLOBAL WINAPI GlobalFree( HGLOBAL handle )
297 {
298   free((VOID*) handle);
299   return(0);
300 }
301
302 /*
303  * String functions
304  *
305  * Copyright 1993 Yngvi Sigurjonsson (yngvi@hafro.is)
306  */
307
308 INT WINAPI lstrcmp(LPCSTR str1,LPCSTR str2)
309 {
310   return strcmp( str1, str2 );
311 }
312
313 INT WINAPI lstrcmpi( LPCSTR str1, LPCSTR str2 )
314 {
315   INT res;
316
317   while (*str1)
318     {
319       if ((res = toupper(*str1) - toupper(*str2)) != 0) return res;
320       str1++;
321       str2++;
322     }
323   return toupper(*str1) - toupper(*str2);
324 }
325
326 INT WINAPI lstrlen(LPCSTR str)
327 {
328   return strlen(str);
329 }
330
331 LPSTR WINAPI lstrcpyA( LPSTR dst, LPCSTR src )
332 {
333     if (!src || !dst) return NULL;
334     strcpy( dst, src );
335     return dst;
336 }
337
338 void WINAPI hmemcpy16(LPVOID hpvDest, LPCVOID hpvSource, LONG cbCopy)
339 {
340   memcpy(hpvDest, hpvSource, cbCopy);
341 }
342
343 /* Local Variables:    */
344 /* c-file-style: "GNU" */
345 /* End:                */