#include #include #include #define MAX_ARG_SIZE 999 #define MAX_PKG_SIZE 4995 /* MAX_ARG * MAX_PKG_SIZE */ /* * Protoboch by boch xD * */ char *get_size(int size){ char *buff = (char *) malloc( 4 ); memset(buff, 0, 4); if(size < 10){ sprintf(buff, "00%i", size); } else if(size > 9 && size < 100){ sprintf(buff, "0%i", size); } else if(size > 99 && size < 1000){ sprintf(buff, "%i", size); } else { printf("Error: arguments cant be bigger than %i\n", MAX_ARG_SIZE); exit(10); } return buff; } char *pack(int args, ...){ va_list pa; char *arg = (char *) malloc(MAX_ARG_SIZE); char *pkg = (char *) malloc(MAX_PKG_SIZE); memset(pkg, 0, MAX_PKG_SIZE); memset(arg, 0, MAX_ARG_SIZE); va_start (pa, args); while (args--){ arg = va_arg (pa, char *); sprintf(pkg, "%s%s%s", pkg, get_size(strlen(arg)), arg); } va_end (pa); return pkg; } char *unpack(int arg_n, char * pkg){ int c = 0; int i; int p = 0; int carg_n = 0; char b[3]; char *result = (char *) malloc(MAX_ARG_SIZE); memset(b, 0, 3); memset(result, 0, MAX_ARG_SIZE); for(i = 0; i < strlen(pkg); i++) if(p < 3){ sprintf(b, "%s%c", b, pkg[i]); p++; } else { for(c = 0; c < atoi(b); c++) if(carg_n == arg_n) sprintf(result, "%s%c", result, pkg[(c+i)]); p = 0; i += (c-1); memset(b, 0, 3); carg_n++; } return result; }