10 /* Insertar un char al final */
11 void push_end(char *s, char c);
12 int esta_en_memoria(char *memoria, char *pal, int *len);
14 void out_ini(char *f);
16 void out_char(char c);
17 void out_data(char len, char pos);
20 unsigned int out_buffer;
24 int main(int argc, char *argv[])
26 int mc, ic; /* Contadores */
28 char inspeccion[SIZE];
29 char c, i; /* caracter leido */
32 /* inicio todo lindo */
33 memset(memoria, 1, SIZE);
34 memset(inspeccion, 1, SIZE);
37 fp = fopen(argv[1], "rt");
39 /* llego INSPECCION */
40 while (((c = fgetc(fp)) != EOF) && (ic < SIZE)) {
41 push_end(inspeccion, c);
48 /* Comienza el juevo */
52 pos = esta_en_memoria(memoria, inspeccion, &len);
54 /* La cadena se repite! */
55 printf("[0,%d,%d]\n", pos, len);
59 /* Tengo que meter caracteres */
60 for(i=0; i<len; i++) {
61 push_end(memoria, inspeccion[0]);
64 push_end(inspeccion, c);
67 /* la cadena no se repite, saco un bit 1 y el codigo ascii*/
68 printf("[1,%c]\n", inspeccion[0]);
70 out_char(inspeccion[0]);
72 push_end(memoria, inspeccion[0]);
73 push_end(inspeccion, c=fgetc(fp));
77 /* llegue al eof, sigo hasta vaciar inspeccion */
81 pos = esta_en_memoria(memoria, inspeccion, &len);
83 /* La cadena se repite! */
84 printf("[0,%d,%d]\n", pos, len);
88 /* Tengo que meter caracteres */
89 for(i=0; i<len; i++) {
90 push_end(memoria, inspeccion[0]);
91 push_end(inspeccion, '\0');
95 /* la cadena no se repite, saco un bit 1 y el codigo ascii*/
96 printf("[1,%c]\n", inspeccion[0]);
98 out_char(inspeccion[0]);
100 push_end(memoria, inspeccion[0]);
101 push_end(inspeccion, '\0');
112 void push_end(char *s, char c)
115 for(i=0; i<SIZE-1; i++)
120 int esta_en_memoria(char *memoria, char *pal, int *len)
123 int len_max, pos_max=-1;
129 if (memoria[i] == pal[j]) {
144 if (len_max >= MIN_LEN) {
154 if (bit_count+1 >= 32) {
155 /* Tengo que hacer lugar! , saco 1 byte*/
156 c = (out_buffer >> (bit_count-8));
158 /* lo grabo en el archivo */
159 fwrite(&c, 1, 1, out);
164 out_buffer |= (0x1&b);
167 void out_char(char c)
170 if (bit_count+8 >= 32) {
171 /* Tengo que hacer lugar! , saco 1 byte */
172 cc = (out_buffer >> (bit_count-8));
174 /* lo grabo en el archivo */
175 fwrite(&cc, 1, 1, out);
183 void out_data(char len, char pos)
187 while (bit_count+BIT_SIZE*2 >= 32) {
188 /* Tengo que hacer lugar! , saco 1 byte */
189 cc = (out_buffer >> (bit_count-8));
191 /* lo grabo en el archivo */
192 fwrite(&cc, 1, 1, out);
196 b = ((0x3|pos)<<3) & ((0x3|len));
197 bit_count+=BIT_SIZE*2;
198 out_buffer <<= BIT_SIZE*2;
202 void out_ini(char *f)
204 out = fopen(f, "wb");
212 /* Saco lo que falte */
213 while (bit_count > 8) {
214 cc = (out_buffer >> (bit_count-8));
216 fwrite(&cc, 1, 1, out);
220 cc = (out_buffer >> bit_count);
221 fwrite(&cc, 1, 1, out);