ff891f03857356c3002809434825c0e76addee1e
[samba.git] / source3 / utils / debug2html.c
1 /* ========================================================================== **
2  *                                debug2html.c
3  *
4  * Copyright (C) 1998 by Christopher R. Hertel
5  *
6  * Email: crh@ubiqx.mn.org
7  *
8  * -------------------------------------------------------------------------- **
9  * Parse Samba debug logs (2.0 & greater) and output the results as HTML.
10  * -------------------------------------------------------------------------- **
11  *
12  *  This program is free software; you can redistribute it and/or modify
13  *  it under the terms of the GNU General Public License as published by
14  *  the Free Software Foundation; either version 2 of the License, or
15  *  (at your option) any later version.
16  *
17  *  This program is distributed in the hope that it will be useful,
18  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
19  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  *  GNU General Public License for more details.
21  *
22  *  You should have received a copy of the GNU General Public License
23  *  along with this program; if not, write to the Free Software
24  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25  *
26  * -------------------------------------------------------------------------- **
27  * This program provides an example of the use of debugparse.c, and also
28  * does a decent job of converting Samba logs into HTML.
29  * -------------------------------------------------------------------------- **
30  *
31  * $Log: debug2html.c,v $
32  * Revision 1.1  1998/10/26 23:21:37  crh
33  * Here is the simple debug parser and the debug2html converter.  Still to do:
34  *
35  *   * Debug message filtering.
36  *   * I need to add all this to Makefile.in
37  *     (If it looks at all strange I'll ask for help.)
38  *
39  * If you want to compile debug2html, you'll need to do it by hand until I
40  * make the changes to Makefile.in.  Sorry.
41  *
42  * Chris -)-----
43  *
44  * ========================================================================== **
45  */
46
47 #include "debugparse.h"
48
49 /* -------------------------------------------------------------------------- **
50  * The size of the read buffer.
51  */
52
53 #define BSIZE 1024
54
55 /* -------------------------------------------------------------------------- **
56  * Functions...
57  */
58
59 static dbg_Token modechange( dbg_Token new, dbg_Token mode )
60   /* ------------------------------------------------------------------------ **
61    * Handle a switch between header and message printing.
62    *
63    *  Input:  new   - The token value of the current token.  This indicates
64    *                  the lexical item currently being recognized.
65    *          mode  - The current mode.  This is either dbg_null or
66    *                  dbg_message.  It could really be any toggle
67    *                  (true/false, etc.)
68    *
69    *  Output: The new mode.  This will be the same as the input mode unless
70    *          there was a transition in or out of message processing.
71    *
72    *  Notes:  The purpose of the mode value is to mark the beginning and end
73    *          of the message text block.  In order to show the text in its
74    *          correct format, it must be included within a <PRE></PRE> block.
75    *
76    * ------------------------------------------------------------------------ **
77    */
78   {
79   switch( new )
80     {
81     case dbg_null:
82     case dbg_ignore:
83       return( mode );
84     case dbg_message:
85       if( dbg_message != mode )
86         {
87         /* Switching to message mode. */
88         (void)printf( "<PRE>\n" );
89         return( dbg_message );
90         }
91       break;
92     default:
93       if( dbg_message == mode )
94         {
95         /* Switching out of message mode. */
96         (void)printf( "</PRE>\n\n" );
97         return( dbg_null );
98         }
99     }
100
101   return( mode );
102   } /* modechange */
103
104 static void newblock( dbg_Token old, dbg_Token new )
105   /* ------------------------------------------------------------------------ **
106    * Handle the transition between tokens.
107    *
108    *  Input:  old - The previous token.
109    *          new - The current token.
110    *
111    *  Output: none.
112    *
113    *  Notes:  This is called whenever there is a transition from one token
114    *          type to another.  It first prints the markup tags that close
115    *          the previous token, and then the markup tags for the new
116    *          token.
117    *
118    * ------------------------------------------------------------------------ **
119    */
120   {
121   switch( old )
122     {
123     case dbg_timestamp:
124       (void)printf( ", " );
125       break;
126     case dbg_level:
127       (void)printf( "</FONT>]</B>\n   " );
128       break;
129     case dbg_sourcefile:
130       (void)printf( ":" );
131       break;
132     case dbg_lineno:
133       (void)printf( ")" );
134       break;
135     }
136
137   switch( new )
138     {
139     case dbg_timestamp:
140       (void)printf( "<B>[" );
141       break;
142     case dbg_level:
143       (void)printf( "<FONT COLOR=MAROON>" );
144       break;
145     case dbg_lineno:
146       (void)printf( "(" );
147       break;
148     }
149   } /* newblock */
150
151 static void charprint( dbg_Token tok, int c )
152   /* ------------------------------------------------------------------------ **
153    * Filter the input characters to determine what goes to output.
154    *
155    *  Input:  tok - The token value of the current character.
156    *          c   - The current character.
157    *
158    *  Output: none.
159    *
160    * ------------------------------------------------------------------------ **
161    */
162   {
163   switch( tok )
164     {
165     case dbg_ignore:
166     case dbg_header:
167       break;
168     case dbg_null:
169     case dbg_eof:
170       (void)putchar( '\n' );
171       break;
172     default:
173       switch( c )
174         {
175         case '<':
176           (void)printf( "&lt;" );
177           break;
178         case '>':
179           (void)printf( "&gt;" );
180           break;
181         case '&':
182           (void)printf( "&amp;" );
183           break;
184         case '\"':
185           (void)printf( "&#34;" );
186           break;
187         default:
188           (void)putchar( c );
189           break;
190         }
191     }
192   } /* charprint */
193
194 int main( int argc, char *argv[] )
195   /* ------------------------------------------------------------------------ **
196    * This simple program scans and parses Samba debug logs, and produces HTML
197    * output.
198    *
199    *  Input:  argc  - Currently ignored.
200    *          argv  - Currently ignored.
201    *
202    *  Output: Always zero.
203    *
204    *  Notes:  The HTML output is sent to stdout.
205    *
206    * ------------------------------------------------------------------------ **
207    */
208   {
209   int       i;
210   int       len;
211   char      bufr[BSIZE];
212   dbg_Token old   = dbg_null,
213             new   = dbg_null,
214             state = dbg_null,
215             mode  = dbg_null;
216
217   (void)printf( "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">\n" );
218   (void)printf( "<HTML>\n<HEAD>\n" );
219   (void)printf( "  <TITLE>Samba Debug Output</TITLE>\n</HEAD>\n\n<BODY>\n" );
220
221   while( (len = fread( bufr, 1, BSIZE, stdin )) > 0 )
222     {
223     for( i = 0; i < len; i++ )
224       {
225       old = new;
226       new = dbg_char2token( &state, bufr[i] );
227       if( new != old )
228         {
229         mode = modechange( new, mode );
230         newblock( old, new );
231         }
232       charprint( new, bufr[i] );
233       }
234     }
235   (void)modechange( dbg_eof, mode );
236
237   (void)printf( "</BODY>\n</HTML>\n" );
238   return( 0 );
239   } /* main */