// By Codr_joe
// Bajo la licencia GPLv3
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Cambiar lo que hay entre parentesis para cambiar los caracteres que se buscaran por defecto
#define default_chars "abcdefghijklmnñopqrstuvwxyzABCDEFGHIJKLMNÑOPQRSTUVWXYZ0123456789 \n!?\0" // El \0 hace falta para indicar el fin del string
// Cambiar para distinto numero minimo de caracteres
#define default_chnum 4
int chnum; // Numero de caracteres necesarios para considerarlo un string
void rmv_jmp(char *str);
void rmv_strs(char *str,char * tgt);
void add_strs(char *str,char * tgt);
long f_getsize(char *fname);
int exist(char *fname);
void string_find(char * selected);
int es_char(char ch,char* str);
main(int argc,char* argv[]){
chnum=default_chnum;
char selected_chars[256]; // 255 Caracteres + 1 para el \0 (vamos, digo yo que ese no
// va a ser parte de un string, no?)
char opt;
strcpy(selected_chars
,default_chars
); while (1){
printf("\n\n\t\tString Finder\n\n"); printf("Selecciona una opcion:\n"); printf("\ta) Cambiar caracteres a buscar\n"); printf("\tb) Mostrar caracteres a buscar\n"); printf("\tc) Cambiar numero caracteres a buscar (%i)\n",chnum
); printf("\td) Iniciar busqueda\n"); getchar(); // Uno para recojer la variable y otro para sacar el [Enter] del medio switch (opt){
case ('a'):
printf("\n\nSelecciona una opcion:\n"); printf("\ta) Añadir a la lista\n"); printf("\tb) Eliminar de la lista\n"); printf("La lista es:\n%s\n",selected_chars
); if ((opt=='a') || (opt=='b')){
char new_str[256];
fgets(new_str
,256,stdin
); rmv_jmp(new_str);
if (opt=='a')
add_strs(new_str,selected_chars);
else
rmv_strs(new_str,selected_chars);
}
else {
}
break;
case ('b'):
printf("Caracteres:%s\n",selected_chars
); break;
case ('c'):
printf("Introduce el nuevo numero: "); break;
case ('d'):
string_find(selected_chars);
break;
case ('x'):
break;
default:
printf("Opcion [%c] no valida.\n",opt
); }
}
}
void string_find(char * selected_chars){
char new_char;
char in_fname [256];
FILE * fin;
char out_fname [256];
FILE * fout;
while (1){
printf("Introduce un archivo donde buscar: ");fflush(stdout
); fgets(in_fname
,256,stdin
); rmv_jmp(in_fname);
if (exist(in_fname))
break;
else
printf("El archivo no existe o no tienes permisos de lectura\n"); }
fin
=fopen(in_fname
,"rb"); if (fin==NULL)
while (1){
printf("Introduce un archivo donde guardar los resultados (o stdout para mostrar por pantalla): ");fflush(stdout
); fgets(out_fname
,256,stdin
); rmv_jmp(out_fname);
if ((strcmp(out_fname
,"stdout")==0) || (!exist
(out_fname
))) break;
else{
printf("El archivo ya existe, los resultados se añadiran al final (S/n)\n"); if (new_char!='n')
break;
}
}
if (strcmp(out_fname
,"stdout")==0) fout=stdout;
else
fout
=fopen(out_fname
,"ab"); if (fout==NULL)
char chars[256];
int i=0;
int es_ch;
long str_start;
long count=0;
long e=count;
long fsize=f_getsize(in_fname);
long refresh_rate=fsize/100;
es_ch=es_char(new_char,selected_chars);
if (es_ch){
if (i==0)
chars[i]=new_char;
i++;
}
if ((!es_ch && i>=chnum) || i>=255){
chars[i]='\0';
fprintf(fout
,"%li--> %s\n",str_start
,chars
); i=0;
}
count++;
if (e<count-refresh_rate){
if (fout!=stdout){
printf("%li / %li",count
,fsize
); }
e=count;
}
}
if (fout!=stdout){
printf("%li / %li\n",fsize
,fsize
); close(fout);
}
close(fin);
}
int es_char(char ch,char* lista){
int es_char=0;
int i;
for (i
=0;i
<strlen(lista
);i
++){
if (lista[i]==ch){
es_char=1;
break;
}
}
return es_char;
}
void rmv_strs(char *str,char * tgt){
int i,j;
for (j=0;j<len;j++){
if (tgt[j]==str[i]){
tgt[j]=0;
break;
}
}
}
int clean=0;
while (clean==0){
clean=1;
for (i=0;i<len;i++){
if (tgt[i]=='\0'){
for (j=i+1;j<len;j++){
if (tgt[j]!='\0'){
clean=0;
tgt[j-1]=tgt[j];
tgt[j]='\0';
break;
}
}
}
}
}
}
void add_strs(char *str,char * tgt){
int i,j;
for (j=0;j<len;j++){
if (tgt[j]==str[i]){
break;
}
}
if ((tgt[j]!=str[i]) && (len<255)){
tgt[len]=str[i];
len++;
tgt[len]='\0';
}
}
}
void rmv_jmp(char *str){ //Limpia los saltos de linea que puede dejar el fgets
int i;
if (str[i]=='\n')
str[i]='\0';
else if (str[i]!='\0')
continue;
break;
}
}
long f_getsize(char *fname){ //Devuelve el tamaño de un archivo
FILE *f;
long size;
if (f!=NULL){
fseek(f
,0,SEEK_END
); // Vamos al final size
=ftell(f
); // Y guardamos la posicion close(f);
}
else
size=-1;
return size;
}
int exist(char *fname){ //Devuelve 0 si un archivo no existe (o no se puede leer)
FILE *f; // o 1 si existe
int exist;
f
=fopen(fname
,"rb"); // Ya se que el metodo no es muy preciso if (f!=NULL){ // pero si no se puede leer para que seguir?
exist=1;
close(f);
}
else
exist=0;
return exist;
}