La verdad es que anteriormente la había hecho para un joiner, pero por lo visto no se hacen así en C... porque el stub sólo con esto ya me sale de 20 kb Si alguien sabe cómo se suele hacer para separar ficheros de stub en C, que me lo diga, porque a mí sólo se me ocurre con un split... tal vez porque sólo desarrollé joiners en VB y ahí sí que se hace así.

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>
typedef struct {
        char **substring_ptr;
        int number_of_substrings;
} split_struct;
int _strlen(char*);
split_struct *split(char *,char *,int,int);
int main() {
    split_struct *str_info;
    char str[] = "STR1#DLM#STR2#DLM#STR3#DLM#STR4";
    char sep[] = "#DLM#";
    str_info = split(str,sep,_strlen(str),_strlen(sep));
    for(int y=0;y<str_info->number_of_substrings;y++) 
    {printf("%s\n", str_info->substring_ptr[y]);}
    getchar();
    return 0;
}    
int _strlen(char *pstr) {
    int i=0;
    while(*(pstr++)!='\0') i++;
    return i;
}
split_struct *split(char *string,char *sep, int str_len, int sep_len) {
     split_struct *retvalue;
     retvalue = (split_struct*)malloc(sizeof(split_struct));
     int ptr_block=0, chr=0, bool_end=0;
     char **buffer = (char**)malloc(sizeof(char*));
     *buffer = (char*)malloc(sizeof(char*));**buffer=0;
     char *tok = (char*)malloc(sep_len*sizeof(char));
     for(int z=0;z<str_len;z++) {
             for(int n=0;n<sep_len&&!bool_end;n++)
             tok[n]=(z+n<str_len)?string[z+n]:bool_end=1;
             int cmp_xy=0;for(int y=0;y<sep_len;y++)if(tok[y]!=sep[y]) cmp_xy=1;
             if (cmp_xy || bool_end) {
                buffer[ptr_block][chr++] = string[z];
                buffer[ptr_block] = (char*)realloc(buffer[ptr_block],chr*sizeof(char*));
                buffer[ptr_block][chr] = 0;
                } else {
                       buffer = (char**)realloc(buffer,(++ptr_block+1)*sizeof(char*));
                       buffer[ptr_block] = (char*)malloc(sizeof(char*));**(buffer+ptr_block)=0;
                       chr=0;z+=sep_len-1;
                       }                           
    }
    free(tok);
    retvalue->substring_ptr = buffer;
    retvalue->number_of_substrings = ptr_block+1;
    return retvalue;
}
Me han dicho hecho la crítica de que el código es bastante ilegible... no me importaría comentarlo bien si hace falta.

Saludos!
Responder

Volver a “Fuentes”