1 // Librería para obtener mmap
2 // caddr_t mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);
4 // size/length -> stat()
12 // fd = int open(const char *camino, int flags);
15 // int fstat(int filedes, struct stat *buf);
16 // Total_Size = buf->st_size
29 void *libsplit_handle
;
30 void (*libsplit_init
)();
31 int (*libsplit_loadbuffer
)(char *buff
, int size
, int nfile
);
32 int (*libsplit_split
)(int nfile
,int *pblocks
);
36 int loadsplitplugin(void) {
38 libsplit_handle
= dlopen ("./plugin-split-lines.so", RTLD_LAZY
);
39 if (!libsplit_handle
) {
40 fputs (dlerror(), stderr
);
44 libsplit_init
= dlsym(libsplit_handle
, "init");
45 libsplit_loadbuffer
= dlsym(libsplit_handle
, "loadbuffer");
46 libsplit_split
= dlsym(libsplit_handle
, "split");
47 if ((error
= dlerror()) != NULL
) {
54 int unloadsplitplugin(void) {
55 dlclose(libsplit_handle
);
59 char *loadfile(char *filename
, int *size
) {
61 int fd
= open(filename
, O_RDONLY
);
66 if (fstat(fd
, &buf
)==-1) return NULL
;
68 int filesize
= buf
.st_size
;
69 char *data
=mmap(0, filesize
, PROT_READ
, MAP_SHARED
, fd
, 0);
70 if ((int) data
==-1) return NULL
;
77 unsigned int *hash_loadfile(char *filename
, int *size
) {
78 char *nombre
=filename
, linea
[MAX_LINE
];
80 fichero
= fopen( nombre
, "r" );
83 printf( "Error (NO ABIERTO)\n" );
89 for (lines
=0;fgets(linea
, MAX_LINE
, fichero
); lines
++);
92 unsigned int *data
=malloc(lines
*sizeof(unsigned int*));
94 while (txt
=fgets(linea
, MAX_LINE
, fichero
)) {
96 data
[line
++]=ihash(txt
);
99 if( fclose(fichero
)!=0 ) {
100 printf( "\nError: fichero NO CERRADO\n" );
108 // ihash calcula un hash de 32 bits para un texto.
109 unsigned int ihash(char *txt
) {
110 // Longitud del mensaje a cifrar
111 int msg_len
= strlen( txt
);
113 // Longitud del hash resultante - gcry_md_get_algo_dlen
114 // devuelve la longitud del resumen hash para un algoritmo
115 int hash_len
= gcry_md_get_algo_dlen( HASH_TYPE
);
117 // Salida del hash SHA1 - esto serán datos binarios
118 unsigned char hash
[ hash_len
];
120 // Calcular el resumen SHA1. Esto es una especie de función-atajo,
121 // ya que la mayoría de funciones gcrypt requieren
122 // la creación de un handle, etc.
123 gcry_md_hash_buffer( HASH_TYPE
, hash
, txt
, msg_len
);
125 // unsigned int ihash=*((unsigned int *)hash);
126 return *((unsigned int *)hash
);
130 void reducetext(char * txt
) {
136 char type
=0; // Tipos de palabras o grupos:
137 // a -> texto, variable.
138 // 1 -> números, con, sin decimales.
139 // % -> símbolos unarios, binarios.
140 // 0 -> huecos y espacios
142 for (n
=0;n
<MAX_LINE
;n
++) {
143 c
=tolower(txt
[n
]); // Captura del carácter en minúscula.
145 // Traducción del carácter.
148 // Retonos de carro y fin de fichero: salir de la función.
152 n
=MAX_LINE
; continue;
153 // Tabuladores y espacios: cuentan como espacio.
159 case 'á': c='a'; break;
160 case 'é': c='e'; break;
161 case 'í': c='i'; break;
162 case 'ó': c='o'; break;
163 case 'ú': c='u'; break;
167 switch(type
) // Cambios de tipos según algunos datos.
169 case 0: // Segun si estábamos en un espacio.
170 if (c
>='0' && c
<='9') {
172 } else if (isalpha(c
)) {
176 case '1': // Segun si estábamos en un espacio.
177 if (c
>='0' && c
<='9') {
181 } else if (isalpha(c
)) {
185 case 'a': // Segun si estábamos en un espacio.
186 if (c
>='0' && c
<='9') {
188 } else if (isalpha(c
)) {
197 if (c
>='0' && c
<='9') {
199 } else if (isalpha(c
)) {
205 if (!nn
&& c
==' ') continue; // Si está tabulando al inicio, tampoco tiene efecto.
206 if (c
==lastc
&& (type
=='a' || type
==0)) continue; // Desperdiciar letras repetidas.
208 if (type
=='%' && newline
[nn
-1]==' ') nn
--;
220 int compare2hashvectors(int *Bvector
, int Bsize
, int *Mvector
, int Msize
,
221 int MaxPassSize
, hashblock
*blocks
, int blocksize
)
223 // Bvector: vector of hashes of Base, original or unmodified file.
224 // Mvector: vector of hashes of modified file.
225 // Bsize and Msize: Stores the size of their arrays.
226 // MaxPassSize: (default: 256) Which is the maximum block-size of algorithm
228 int line_base
,line_local
,size
;
229 int maxsize
=1,total
=0;
231 hashblock
*bloque
=blocks
;
234 int conf_pasada
[]={256,128,64,32,16,8,4,2,1,0};
237 for (p
=0;min_bloque
=conf_pasada
[p
];p
++)
239 if (conf_pasada
[p
]>MaxPassSize
) continue;
241 for (i
=0;i
<Bsize
;i
+=maxsize
) {
244 for (j
=0;j
<nbloques
;j
++)
246 if (i
>=bloque
[j
].line1
&& i
<=bloque
[j
].line1
+bloque
[j
].size
) break;
250 i
=bloque
[j
].line1
+bloque
[j
].size
; continue;
254 for (k
=0;k
<Msize
;k
++)
257 for (j
=0;j
<nbloques
;j
++)
259 if (k
>=bloque
[j
].line2
&& k
<=bloque
[j
].line2
+bloque
[j
].size
) break;
263 k
=bloque
[j
].line2
+bloque
[j
].size
; continue;
266 if (Bvector
[i
]==Mvector
[k
])
270 for(m
=0;k
+m
<Msize
&& i
+m
<Bsize
;m
++)
272 for (j
=0;j
<nbloques
;j
++)
274 if (k
+m
>=bloque
[j
].line2
&& k
+m
<=bloque
[j
].line2
+bloque
[j
].size
) break;
275 if (i
+m
>=bloque
[j
].line1
&& i
+m
<=bloque
[j
].line1
+bloque
[j
].size
) break;
277 if (j
<nbloques
) break;
278 if (Bvector
[i
+m
]!=Mvector
[k
+m
])
281 if (nz
>size
/4) break;
306 if (maxsize
>min_bloque
)
308 if (nbloques
<blocksize
)
310 bloque
[nbloques
].line1
=line_base
;
311 bloque
[nbloques
].line2
=line_local
;
312 bloque
[nbloques
].size
=maxsize
;
314 } else printf( "Error: OUT OF BLOCKS. \n");
317 lbb
=line_base
+maxsize
;
327 hashblock auxbloque
[blocksize
];
328 int minline
=0, min_j
=0;
329 for (p
=0;p
<nbloques
;p
++)
332 for (j
=0;j
<64 && j
<nbloques
;j
++)
334 if (bloque
[j
].line1
<minline
)
336 minline
=bloque
[j
].line1
;
340 auxbloque
[p
]=bloque
[min_j
];
341 bloque
[min_j
].line1
=Bsize
;
343 memcpy(bloque
,auxbloque
,blocksize
*sizeof(hashblock
));