]> git.evergreen-ils.org Git - OpenSRF.git/blob - src/libopensrf/md5.c
Switch to setuptools to enable dependency installs as well
[OpenSRF.git] / src / libopensrf / 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 #include "opensrf/md5.h"
134
135
136 /* --- The MD5 routines --- */
137
138 /* MD5 routines, after Ron Rivest */
139 /* Written by David Madore <david.madore@ens.fr>, with code taken in
140  * part from Colin Plumb. */
141 /* Public domain (1999/11/24) */
142
143 /* Note: these routines do not depend on endianness. */
144
145 /* === The header === */
146
147 /* Put this in md5.h if you don't like having everything in one big
148  * file. */
149
150
151 #define F1(x, y, z) (z ^ (x & (y ^ z)))
152 #define F2(x, y, z) F1(z, x, y)
153 #define F3(x, y, z) (x ^ y ^ z)
154 #define F4(x, y, z) (y ^ (x | ~z))
155
156 #define MD5STEP(f, w, x, y, z, data, s) \
157         { w += f (x, y, z) + data;  w = w<<s | (w&0xffffffffUL)>>(32-s); \
158           w += x; }
159
160 void
161 MD5_transform (unsigned long buf[4], const unsigned long in[16])
162 {
163   register unsigned long a, b, c, d;
164
165   a = buf[0];  b = buf[1];  c = buf[2];  d = buf[3];
166   MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478UL, 7);
167   MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756UL, 12);
168   MD5STEP(F1, c, d, a, b, in[2] + 0x242070dbUL, 17);
169   MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceeeUL, 22);
170   MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0fafUL, 7);
171   MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62aUL, 12);
172   MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613UL, 17);
173   MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501UL, 22);
174   MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8UL, 7);
175   MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7afUL, 12);
176   MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1UL, 17);
177   MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7beUL, 22);
178   MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122UL, 7);
179   MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193UL, 12);
180   MD5STEP(F1, c, d, a, b, in[14] + 0xa679438eUL, 17);
181   MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821UL, 22);
182   MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562UL, 5);
183   MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340UL, 9);
184   MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51UL, 14);
185   MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aaUL, 20);
186   MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105dUL, 5);
187   MD5STEP(F2, d, a, b, c, in[10] + 0x02441453UL, 9);
188   MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681UL, 14);
189   MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8UL, 20);
190   MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6UL, 5);
191   MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6UL, 9);
192   MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87UL, 14);
193   MD5STEP(F2, b, c, d, a, in[8] + 0x455a14edUL, 20);
194   MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905UL, 5);
195   MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8UL, 9);
196   MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9UL, 14);
197   MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8aUL, 20);
198   MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942UL, 4);
199   MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681UL, 11);
200   MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122UL, 16);
201   MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380cUL, 23);
202   MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44UL, 4);
203   MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9UL, 11);
204   MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60UL, 16);
205   MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70UL, 23);
206   MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6UL, 4);
207   MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127faUL, 11);
208   MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085UL, 16);
209   MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05UL, 23);
210   MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039UL, 4);
211   MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5UL, 11);
212   MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8UL, 16);
213   MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665UL, 23);
214   MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244UL, 6);
215   MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97UL, 10);
216   MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7UL, 15);
217   MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039UL, 21);
218   MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3UL, 6);
219   MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92UL, 10);
220   MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47dUL, 15);
221   MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1UL, 21);
222   MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4fUL, 6);
223   MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0UL, 10);
224   MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314UL, 15);
225   MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1UL, 21);
226   MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82UL, 6);
227   MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235UL, 10);
228   MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bbUL, 15);
229   MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391UL, 21);
230   buf[0] += a;  buf[1] += b;  buf[2] += c;  buf[3] += d;
231 }
232
233 #undef F1
234 #undef F2
235 #undef F3
236 #undef F4
237 #undef MD5STEP
238
239 void
240 MD5_start (struct md5_ctx *ctx)
241 {
242   int i;
243
244   ctx->buf[0] = 0x67452301UL;
245   ctx->buf[1] = 0xefcdab89UL;
246   ctx->buf[2] = 0x98badcfeUL;
247   ctx->buf[3] = 0x10325476UL;
248   ctx->bits[0] = 0;
249   ctx->bits[1] = 0;
250   for ( i=0 ; i<16 ; i++ )
251     ctx->in[i] = 0;
252   ctx->b = 0;
253 }
254
255 void
256 MD5_feed (struct md5_ctx *ctx, unsigned char inb)
257 {
258   int i;
259   unsigned long temp;
260
261   ctx->in[ctx->b/4] |= ((unsigned long)inb) << ((ctx->b%4)*8);
262   if ( ++ctx->b >= 64 )
263     {
264       MD5_transform (ctx->buf, ctx->in);
265       ctx->b = 0;
266       for ( i=0 ; i<16 ; i++ )
267         ctx->in[i] = 0;
268     }
269   temp = ctx->bits[0];
270   ctx->bits[0] += 8;
271   if ( (temp&0xffffffffUL) > (ctx->bits[0]&0xffffffffUL) )
272     ctx->bits[1]++;
273 }
274
275 void
276 MD5_stop (struct md5_ctx *ctx, unsigned char digest[16])
277 {
278   int i;
279   unsigned long bits[2];
280
281   for ( i=0 ; i<2 ; i++ )
282     bits[i] = ctx->bits[i];
283   MD5_feed (ctx, 0x80);
284   for ( ; ctx->b!=56 ; )
285     MD5_feed (ctx, 0);
286   for ( i=0 ; i<2 ; i++ )
287     {
288       MD5_feed (ctx, bits[i]&0xff);
289       MD5_feed (ctx, (bits[i]>>8)&0xff);
290       MD5_feed (ctx, (bits[i]>>16)&0xff);
291       MD5_feed (ctx, (bits[i]>>24)&0xff);
292     }
293   for ( i=0 ; i<4 ; i++ )
294     {
295       digest[4*i] = ctx->buf[i]&0xff;
296       digest[4*i+1] = (ctx->buf[i]>>8)&0xff;
297       digest[4*i+2] = (ctx->buf[i]>>16)&0xff;
298       digest[4*i+3] = (ctx->buf[i]>>24)&0xff;
299     }
300 }
301 \f
302 /* --- The core of the program --- */
303
304 #include <stdio.h>
305 #include <string.h>
306
307 #define LARGE_ENOUGH 16384
308
309 char buffer[LARGE_ENOUGH];
310
311 /*
312 int
313 main (int argc, char *argv[])
314 {
315   unsigned int i;
316
317   buffer[0] = 0;
318   strcat (buffer, \n\n");
319   strcat (buffer, "const char data[] =");
320   for ( i=0 ; data[i] ; i++ )
321     {
322       if ( i%60 == 0 )
323         strcat (buffer, "\n\"");
324       switch ( data[i] )
325         {
326         case '\\':
327         case '"':
328           strcat (buffer, "\\");
329           buffer[strlen(buffer)+1] = 0;
330           buffer[strlen(buffer)] = data[i];
331           break;
332         case '\n':
333           strcat (buffer, "\\n");
334           break;
335         case '\t':
336           strcat (buffer, "\\t");
337           break;
338         case '\f':
339           strcat (buffer, "\\f");
340           break;
341         default:
342           buffer[strlen(buffer)+1] = 0;
343           buffer[strlen(buffer)] = data[i];
344         }
345       if ( i%60 == 59 || !data[i+1] )
346         strcat (buffer, "\"");
347     }
348   strcat (buffer, ";\n\f\n");
349   strcat (buffer, data);
350   if ( argc >= 2 && strcmp (argv[1], "xyzzy") == 0 )
351     printf ("%s", buffer);
352   else
353     {
354       struct md5_ctx ctx;
355       unsigned char digest[16];
356
357       MD5_start (&ctx);
358       for ( i=0 ; buffer[i] ; i++ )
359         MD5_feed (&ctx, buffer[i]);
360       MD5_stop (&ctx, digest);
361       for ( i=0 ; i<16 ; i++ )
362         printf ("%02x", digest[i]);
363       printf ("\n");
364     }
365   return 0;
366 }
367 */