]> git.evergreen-ils.org Git - OpenSRF.git/blob - src/utils/md5.c
made the logging module fail gracefully when syslog is not present
[OpenSRF.git] / src / utils / md5.c
1 /* --- The data --- */
2
3 const char data[] =
4 "/* --- The MD5 routines --- */\n\n/* MD5 routines, after Ron R"
5 "ivest */\n/* Written by David Madore <david.madore@ens.fr>, w"
6 "ith code taken in\n * part from Colin Plumb. */\n/* Public dom"
7 "ain (1999/11/24) */\n\n/* Note: these routines do not depend o"
8 "n endianness. */\n\n/* === The header === */\n\n/* Put this in m"
9 "d5.h if you don't like having everything in one big\n * file."
10 " */\n\n#ifndef _DMADORE_MD5_H\n#define _DMADORE_MD5_H\n\nstruct m"
11 "d5_ctx {\n  /* The four chaining variables */\n  unsigned long"
12 " buf[4];\n  /* Count number of message bits */\n  unsigned lon"
13 "g bits[2];\n  /* Data being fed in */\n  unsigned long in[16];"
14 "\n  /* Our position within the 512 bits (always between 0 and"
15 " 63) */\n  int b;\n};\n\nvoid MD5_transform (unsigned long buf[4"
16 "], const unsigned long in[16]);\nvoid MD5_start (struct md5_c"
17 "tx *context);\nvoid MD5_feed (struct md5_ctx *context, unsign"
18 "ed char inb);\nvoid MD5_stop (struct md5_ctx *context, unsign"
19 "ed char digest[16]);\n\n#endif /* not defined _DMADORE_MD5_H *"
20 "/\n\n/* === The implementation === */\n\n#define F1(x, y, z) (z "
21 "^ (x & (y ^ z)))\n#define F2(x, y, z) F1(z, x, y)\n#define F3("
22 "x, y, z) (x ^ y ^ z)\n#define F4(x, y, z) (y ^ (x | ~z))\n\n#de"
23 "fine MD5STEP(f, w, x, y, z, data, s) \\\n\t{ w += f (x, y, z) +"
24 " data;  w = w<<s | (w&0xffffffffUL)>>(32-s); \\\n\t  w += x; }\n"
25 "\nvoid\nMD5_transform (unsigned long buf[4], const unsigned lo"
26 "ng in[16])\n{\n  register unsigned long a, b, c, d;\n\n  a = buf"
27 "[0];  b = buf[1];  c = buf[2];  d = buf[3];\n  MD5STEP(F1, a,"
28 " b, c, d, in[0] + 0xd76aa478UL, 7);\n  MD5STEP(F1, d, a, b, c"
29 ", in[1] + 0xe8c7b756UL, 12);\n  MD5STEP(F1, c, d, a, b, in[2]"
30 " + 0x242070dbUL, 17);\n  MD5STEP(F1, b, c, d, a, in[3] + 0xc1"
31 "bdceeeUL, 22);\n  MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0fafU"
32 "L, 7);\n  MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62aUL, 12);\n"
33 "  MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613UL, 17);\n  MD5ST"
34 "EP(F1, b, c, d, a, in[7] + 0xfd469501UL, 22);\n  MD5STEP(F1, "
35 "a, b, c, d, in[8] + 0x698098d8UL, 7);\n  MD5STEP(F1, d, a, b,"
36 " c, in[9] + 0x8b44f7afUL, 12);\n  MD5STEP(F1, c, d, a, b, in["
37 "10] + 0xffff5bb1UL, 17);\n  MD5STEP(F1, b, c, d, a, in[11] + "
38 "0x895cd7beUL, 22);\n  MD5STEP(F1, a, b, c, d, in[12] + 0x6b90"
39 "1122UL, 7);\n  MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193UL,"
40 " 12);\n  MD5STEP(F1, c, d, a, b, in[14] + 0xa679438eUL, 17);\n"
41 "  MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821UL, 22);\n  MD5S"
42 "TEP(F2, a, b, c, d, in[1] + 0xf61e2562UL, 5);\n  MD5STEP(F2, "
43 "d, a, b, c, in[6] + 0xc040b340UL, 9);\n  MD5STEP(F2, c, d, a,"
44 " b, in[11] + 0x265e5a51UL, 14);\n  MD5STEP(F2, b, c, d, a, in"
45 "[0] + 0xe9b6c7aaUL, 20);\n  MD5STEP(F2, a, b, c, d, in[5] + 0"
46 "xd62f105dUL, 5);\n  MD5STEP(F2, d, a, b, c, in[10] + 0x024414"
47 "53UL, 9);\n  MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681UL, 1"
48 "4);\n  MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8UL, 20);\n  M"
49 "D5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6UL, 5);\n  MD5STEP(F"
50 "2, d, a, b, c, in[14] + 0xc33707d6UL, 9);\n  MD5STEP(F2, c, d"
51 ", a, b, in[3] + 0xf4d50d87UL, 14);\n  MD5STEP(F2, b, c, d, a,"
52 " in[8] + 0x455a14edUL, 20);\n  MD5STEP(F2, a, b, c, d, in[13]"
53 " + 0xa9e3e905UL, 5);\n  MD5STEP(F2, d, a, b, c, in[2] + 0xfce"
54 "fa3f8UL, 9);\n  MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9UL,"
55 " 14);\n  MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8aUL, 20);\n"
56 "  MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942UL, 4);\n  MD5STE"
57 "P(F3, d, a, b, c, in[8] + 0x8771f681UL, 11);\n  MD5STEP(F3, c"
58 ", d, a, b, in[11] + 0x6d9d6122UL, 16);\n  MD5STEP(F3, b, c, d"
59 ", a, in[14] + 0xfde5380cUL, 23);\n  MD5STEP(F3, a, b, c, d, i"
60 "n[1] + 0xa4beea44UL, 4);\n  MD5STEP(F3, d, a, b, c, in[4] + 0"
61 "x4bdecfa9UL, 11);\n  MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b"
62 "60UL, 16);\n  MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70UL, "
63 "23);\n  MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6UL, 4);\n  "
64 "MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127faUL, 11);\n  MD5STEP"
65 "(F3, c, d, a, b, in[3] + 0xd4ef3085UL, 16);\n  MD5STEP(F3, b,"
66 " c, d, a, in[6] + 0x04881d05UL, 23);\n  MD5STEP(F3, a, b, c, "
67 "d, in[9] + 0xd9d4d039UL, 4);\n  MD5STEP(F3, d, a, b, c, in[12"
68 "] + 0xe6db99e5UL, 11);\n  MD5STEP(F3, c, d, a, b, in[15] + 0x"
69 "1fa27cf8UL, 16);\n  MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac566"
70 "5UL, 23);\n  MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244UL, 6)"
71 ";\n  MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97UL, 10);\n  MD5"
72 "STEP(F4, c, d, a, b, in[14] + 0xab9423a7UL, 15);\n  MD5STEP(F"
73 "4, b, c, d, a, in[5] + 0xfc93a039UL, 21);\n  MD5STEP(F4, a, b"
74 ", c, d, in[12] + 0x655b59c3UL, 6);\n  MD5STEP(F4, d, a, b, c,"
75 " in[3] + 0x8f0ccc92UL, 10);\n  MD5STEP(F4, c, d, a, b, in[10]"
76 " + 0xffeff47dUL, 15);\n  MD5STEP(F4, b, c, d, a, in[1] + 0x85"
77 "845dd1UL, 21);\n  MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4fU"
78 "L, 6);\n  MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0UL, 10);"
79 "\n  MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314UL, 15);\n  MD5S"
80 "TEP(F4, b, c, d, a, in[13] + 0x4e0811a1UL, 21);\n  MD5STEP(F4"
81 ", a, b, c, d, in[4] + 0xf7537e82UL, 6);\n  MD5STEP(F4, d, a, "
82 "b, c, in[11] + 0xbd3af235UL, 10);\n  MD5STEP(F4, c, d, a, b, "
83 "in[2] + 0x2ad7d2bbUL, 15);\n  MD5STEP(F4, b, c, d, a, in[9] +"
84 " 0xeb86d391UL, 21);\n  buf[0] += a;  buf[1] += b;  buf[2] += "
85 "c;  buf[3] += d;\n}\n\n#undef F1\n#undef F2\n#undef F3\n#undef F4\n"
86 "#undef MD5STEP\n\nvoid\nMD5_start (struct md5_ctx *ctx)\n{\n  int"
87 " i;\n\n  ctx->buf[0] = 0x67452301UL;\n  ctx->buf[1] = 0xefcdab8"
88 "9UL;\n  ctx->buf[2] = 0x98badcfeUL;\n  ctx->buf[3] = 0x1032547"
89 "6UL;\n  ctx->bits[0] = 0;\n  ctx->bits[1] = 0;\n  for ( i=0 ; i"
90 "<16 ; i++ )\n    ctx->in[i] = 0;\n  ctx->b = 0;\n}\n\nvoid\nMD5_fe"
91 "ed (struct md5_ctx *ctx, unsigned char inb)\n{\n  int i;\n  uns"
92 "igned long temp;\n\n  ctx->in[ctx->b/4] |= ((unsigned long)inb"
93 ") << ((ctx->b%4)*8);\n  if ( ++ctx->b >= 64 )\n    {\n      MD5"
94 "_transform (ctx->buf, ctx->in);\n      ctx->b = 0;\n      for "
95 "( i=0 ; i<16 ; i++ )\n\tctx->in[i] = 0;\n    }\n  temp = ctx->bi"
96 "ts[0];\n  ctx->bits[0] += 8;\n  if ( (temp&0xffffffffUL) > (ct"
97 "x->bits[0]&0xffffffffUL) )\n    ctx->bits[1]++;\n}\n\nvoid\nMD5_s"
98 "top (struct md5_ctx *ctx, unsigned char digest[16])\n{\n  int "
99 "i;\n  unsigned long bits[2];\n\n  for ( i=0 ; i<2 ; i++ )\n    b"
100 "its[i] = ctx->bits[i];\n  MD5_feed (ctx, 0x80);\n  for ( ; ctx"
101 "->b!=56 ; )\n    MD5_feed (ctx, 0);\n  for ( i=0 ; i<2 ; i++ )"
102 "\n    {\n      MD5_feed (ctx, bits[i]&0xff);\n      MD5_feed (c"
103 "tx, (bits[i]>>8)&0xff);\n      MD5_feed (ctx, (bits[i]>>16)&0"
104 "xff);\n      MD5_feed (ctx, (bits[i]>>24)&0xff);\n    }\n  for "
105 "( i=0 ; i<4 ; i++ )\n    {\n      digest[4*i] = ctx->buf[i]&0x"
106 "ff;\n      digest[4*i+1] = (ctx->buf[i]>>8)&0xff;\n      diges"
107 "t[4*i+2] = (ctx->buf[i]>>16)&0xff;\n      digest[4*i+3] = (ct"
108 "x->buf[i]>>24)&0xff;\n    }\n}\n\f\n/* --- The core of the progra"
109 "m --- */\n\n#include <stdio.h>\n#include <string.h>\n\n#define LA"
110 "RGE_ENOUGH 16384\n\nchar buffer[LARGE_ENOUGH];\n\nint\nmain (int "
111 "argc, char *argv[])\n{\n  unsigned int i;\n\n  buffer[0] = 0;\n  "
112 "strcat (buffer, \"/* --- The data --- */\\n\\n\");\n  strcat (buf"
113 "fer, \"const char data[] =\");\n  for ( i=0 ; data[i] ; i++ )\n "
114 "   {\n      if ( i%60 == 0 )\n\tstrcat (buffer, \"\\n\\\"\");\n      "
115 "switch ( data[i] )\n\t{\n\tcase '\\\\':\n\tcase '\"':\n\t  strcat (buff"
116 "er, \"\\\\\");\n\t  buffer[strlen(buffer)+1] = 0;\n\t  buffer[strlen"
117 "(buffer)] = data[i];\n\t  break;\n\tcase '\\n':\n\t  strcat (buffer"
118 ", \"\\\\n\");\n\t  break;\n\tcase '\\t':\n\t  strcat (buffer, \"\\\\t\");\n\t"
119 "  break;\n\tcase '\\f':\n\t  strcat (buffer, \"\\\\f\");\n\t  break;\n\td"
120 "efault:\n\t  buffer[strlen(buffer)+1] = 0;\n\t  buffer[strlen(bu"
121 "ffer)] = data[i];\n\t}\n      if ( i%60 == 59 || !data[i+1] )\n\t"
122 "strcat (buffer, \"\\\"\");\n    }\n  strcat (buffer, \";\\n\\f\\n\");\n "
123 " strcat (buffer, data);\n  if ( argc >= 2 && strcmp (argv[1],"
124 " \"xyzzy\") == 0 )\n    printf (\"%s\", buffer);\n  else\n    {\n   "
125 "   struct md5_ctx ctx;\n      unsigned char digest[16];\n\n    "
126 "  MD5_start (&ctx);\n      for ( i=0 ; buffer[i] ; i++ )\n\tMD5"
127 "_feed (&ctx, buffer[i]);\n      MD5_stop (&ctx, digest);\n    "
128 "  for ( i=0 ; i<16 ; i++ )\n\tprintf (\"%02x\", digest[i]);\n    "
129 "  printf (\"\\n\");\n    }\n  return 0;\n}\n";
130
131
132 #include "md5.h"
133
134
135 /* --- The MD5 routines --- */
136
137 /* MD5 routines, after Ron Rivest */
138 /* Written by David Madore <david.madore@ens.fr>, with code taken in
139  * part from Colin Plumb. */
140 /* Public domain (1999/11/24) */
141
142 /* Note: these routines do not depend on endianness. */
143
144 /* === The header === */
145
146 /* Put this in md5.h if you don't like having everything in one big
147  * file. */
148
149
150 #define F1(x, y, z) (z ^ (x & (y ^ z)))
151 #define F2(x, y, z) F1(z, x, y)
152 #define F3(x, y, z) (x ^ y ^ z)
153 #define F4(x, y, z) (y ^ (x | ~z))
154
155 #define MD5STEP(f, w, x, y, z, data, s) \
156         { w += f (x, y, z) + data;  w = w<<s | (w&0xffffffffUL)>>(32-s); \
157           w += x; }
158
159 void
160 MD5_transform (unsigned long buf[4], const unsigned long in[16])
161 {
162   register unsigned long a, b, c, d;
163
164   a = buf[0];  b = buf[1];  c = buf[2];  d = buf[3];
165   MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478UL, 7);
166   MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756UL, 12);
167   MD5STEP(F1, c, d, a, b, in[2] + 0x242070dbUL, 17);
168   MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceeeUL, 22);
169   MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0fafUL, 7);
170   MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62aUL, 12);
171   MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613UL, 17);
172   MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501UL, 22);
173   MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8UL, 7);
174   MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7afUL, 12);
175   MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1UL, 17);
176   MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7beUL, 22);
177   MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122UL, 7);
178   MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193UL, 12);
179   MD5STEP(F1, c, d, a, b, in[14] + 0xa679438eUL, 17);
180   MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821UL, 22);
181   MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562UL, 5);
182   MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340UL, 9);
183   MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51UL, 14);
184   MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aaUL, 20);
185   MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105dUL, 5);
186   MD5STEP(F2, d, a, b, c, in[10] + 0x02441453UL, 9);
187   MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681UL, 14);
188   MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8UL, 20);
189   MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6UL, 5);
190   MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6UL, 9);
191   MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87UL, 14);
192   MD5STEP(F2, b, c, d, a, in[8] + 0x455a14edUL, 20);
193   MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905UL, 5);
194   MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8UL, 9);
195   MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9UL, 14);
196   MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8aUL, 20);
197   MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942UL, 4);
198   MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681UL, 11);
199   MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122UL, 16);
200   MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380cUL, 23);
201   MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44UL, 4);
202   MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9UL, 11);
203   MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60UL, 16);
204   MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70UL, 23);
205   MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6UL, 4);
206   MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127faUL, 11);
207   MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085UL, 16);
208   MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05UL, 23);
209   MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039UL, 4);
210   MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5UL, 11);
211   MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8UL, 16);
212   MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665UL, 23);
213   MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244UL, 6);
214   MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97UL, 10);
215   MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7UL, 15);
216   MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039UL, 21);
217   MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3UL, 6);
218   MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92UL, 10);
219   MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47dUL, 15);
220   MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1UL, 21);
221   MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4fUL, 6);
222   MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0UL, 10);
223   MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314UL, 15);
224   MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1UL, 21);
225   MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82UL, 6);
226   MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235UL, 10);
227   MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bbUL, 15);
228   MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391UL, 21);
229   buf[0] += a;  buf[1] += b;  buf[2] += c;  buf[3] += d;
230 }
231
232 #undef F1
233 #undef F2
234 #undef F3
235 #undef F4
236 #undef MD5STEP
237
238 void
239 MD5_start (struct md5_ctx *ctx)
240 {
241   int i;
242
243   ctx->buf[0] = 0x67452301UL;
244   ctx->buf[1] = 0xefcdab89UL;
245   ctx->buf[2] = 0x98badcfeUL;
246   ctx->buf[3] = 0x10325476UL;
247   ctx->bits[0] = 0;
248   ctx->bits[1] = 0;
249   for ( i=0 ; i<16 ; i++ )
250     ctx->in[i] = 0;
251   ctx->b = 0;
252 }
253
254 void
255 MD5_feed (struct md5_ctx *ctx, unsigned char inb)
256 {
257   int i;
258   unsigned long temp;
259
260   ctx->in[ctx->b/4] |= ((unsigned long)inb) << ((ctx->b%4)*8);
261   if ( ++ctx->b >= 64 )
262     {
263       MD5_transform (ctx->buf, ctx->in);
264       ctx->b = 0;
265       for ( i=0 ; i<16 ; i++ )
266         ctx->in[i] = 0;
267     }
268   temp = ctx->bits[0];
269   ctx->bits[0] += 8;
270   if ( (temp&0xffffffffUL) > (ctx->bits[0]&0xffffffffUL) )
271     ctx->bits[1]++;
272 }
273
274 void
275 MD5_stop (struct md5_ctx *ctx, unsigned char digest[16])
276 {
277   int i;
278   unsigned long bits[2];
279
280   for ( i=0 ; i<2 ; i++ )
281     bits[i] = ctx->bits[i];
282   MD5_feed (ctx, 0x80);
283   for ( ; ctx->b!=56 ; )
284     MD5_feed (ctx, 0);
285   for ( i=0 ; i<2 ; i++ )
286     {
287       MD5_feed (ctx, bits[i]&0xff);
288       MD5_feed (ctx, (bits[i]>>8)&0xff);
289       MD5_feed (ctx, (bits[i]>>16)&0xff);
290       MD5_feed (ctx, (bits[i]>>24)&0xff);
291     }
292   for ( i=0 ; i<4 ; i++ )
293     {
294       digest[4*i] = ctx->buf[i]&0xff;
295       digest[4*i+1] = (ctx->buf[i]>>8)&0xff;
296       digest[4*i+2] = (ctx->buf[i]>>16)&0xff;
297       digest[4*i+3] = (ctx->buf[i]>>24)&0xff;
298     }
299 }
300 \f
301 /* --- The core of the program --- */
302
303 #include <stdio.h>
304 #include <string.h>
305
306 #define LARGE_ENOUGH 16384
307
308 char buffer[LARGE_ENOUGH];
309
310 /*
311 int
312 main (int argc, char *argv[])
313 {
314   unsigned int i;
315
316   buffer[0] = 0;
317   strcat (buffer, \n\n");
318   strcat (buffer, "const char data[] =");
319   for ( i=0 ; data[i] ; i++ )
320     {
321       if ( i%60 == 0 )
322         strcat (buffer, "\n\"");
323       switch ( data[i] )
324         {
325         case '\\':
326         case '"':
327           strcat (buffer, "\\");
328           buffer[strlen(buffer)+1] = 0;
329           buffer[strlen(buffer)] = data[i];
330           break;
331         case '\n':
332           strcat (buffer, "\\n");
333           break;
334         case '\t':
335           strcat (buffer, "\\t");
336           break;
337         case '\f':
338           strcat (buffer, "\\f");
339           break;
340         default:
341           buffer[strlen(buffer)+1] = 0;
342           buffer[strlen(buffer)] = data[i];
343         }
344       if ( i%60 == 59 || !data[i+1] )
345         strcat (buffer, "\"");
346     }
347   strcat (buffer, ";\n\f\n");
348   strcat (buffer, data);
349   if ( argc >= 2 && strcmp (argv[1], "xyzzy") == 0 )
350     printf ("%s", buffer);
351   else
352     {
353       struct md5_ctx ctx;
354       unsigned char digest[16];
355
356       MD5_start (&ctx);
357       for ( i=0 ; buffer[i] ; i++ )
358         MD5_feed (&ctx, buffer[i]);
359       MD5_stop (&ctx, digest);
360       for ( i=0 ; i<16 ; i++ )
361         printf ("%02x", digest[i]);
362       printf ("\n");
363     }
364   return 0;
365 }
366 */