/************************************************************************************************** * Db puller - used to pull data from a MUX flatfile and dump it into a file in @decompile format * * Version: 1.01 * * By: Ashen-Shugar (08/16/2005) * * Modifications: List modifications below * * 11/02/05 : filenames are now saved with _<dbref> extensions. * * the name of the object starts the file with a '@@' comment prefix. * * * **************************************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> /* Standard MUX 2.x definitions */ /* This should be over twice the size of the LBUF. If it's not, it'll misbehave */ #define MALSIZE 16535 /* This should be SBUF_SIZE + 1. If it's not, it'll coredump*/ #define SBUFSIZE 65 stricmp(char *buf1, char *buf2) { char *p1, *p2; p1 = buf1; p2 = buf2; while ((*p1 != '\0') && (*p2 != '\0') && (tolower(*p1) == tolower(*p2))) { p1++; p2++; } if ((*p1 == '\0') && (*p2 == '\0')) return 0; if (*p1 == '\0') return -1; if (*p2 == '\0') return 1; if (*p1 < *p2) return -1; return 1; } int main(int argc, char **argv) { FILE *f_muxflat, *f_mymuxfile, *f_muxattrs, *f_muxout, *f_muxlock; char *pt1, *spt2, *spt3, *pt2, *pt3, s_attrib[SBUFSIZE], s_filename[80], s_attrval[SBUFSIZE], s_attr[SBUFSIZE], s_finattr[SBUFSIZE]; int i_chk = 0, i_lck = 1, i_atrcntr = 0, i_atrcntr2 = 0, i_pullname = 0; if ( argc < 3 ) { fprintf(stderr, "Syntax: %s mux-flatfile dbref# (no preceeding # character) [optional attribute-name]\r\n", argv[0]); exit(1); } if ( (f_muxflat = fopen(argv[1], "r")) == NULL ) { fprintf(stderr, "ERROR: Unable to open %s for reading.", argv[1]); exit(1); } pt1 = argv[2]; while (*pt1) { if ( !isdigit(*pt1) ) { fprintf(stderr, "ERROR: Dbref# must be an integer (no # preceeding) [optional attribute-name]\r\n"); fclose(f_muxflat); exit(1); } pt1++; } if ( (f_mymuxfile = fopen("mymuxfile.dat", "w")) == NULL ) { fprintf(stderr, "ERROR: Unable to open output file for attribute header information (mymuxfile.dat)\r\n"); fclose(f_muxflat); exit(1); } memset(s_attrib, '\0', sizeof(s_attrib)); if ( (argc >= 4) && *argv[3] ) strncpy(s_attrib, argv[3], SBUFSIZE-1); spt2=malloc(MALSIZE); memset(spt2, '\0', MALSIZE); memset(s_attr, '\0', sizeof(s_attr)); memset(s_attrval, '\0', sizeof(s_attr)); while ( !feof(f_muxflat) ) { fgets(spt2, (MALSIZE-2), f_muxflat); pt2 = spt2; if ( i_chk ) { i_chk = 0; strtok(pt2, ":"); sprintf(s_attr, "%s", strtok(NULL, ":")); s_attr[strlen(s_attr)-2]='\0'; fprintf(f_mymuxfile, "%s %d \r\n", s_attr, atoi(s_attrval)); } if ( (strlen(pt2) > 3) && (*pt2 == '+') && (*(pt2+1) == 'A') && isdigit(*(pt2+2)) ) { i_chk = 1; sprintf(s_attrval, "%s", pt2+2); } if ( *pt2 == '!' ) break; } fclose(f_mymuxfile); if ( (f_mymuxfile = fopen("mymuxfile.dat", "r")) == NULL ) { fclose(f_muxflat); fprintf(stderr, "ERROR: Unable to open attribute header information (mymuxfile.dat)\r\n"); free(spt2); exit(1); } if ( (f_muxattrs = fopen("muxattrs.dat", "r")) == NULL ) { fclose(f_muxflat); fclose(f_mymuxfile); fprintf(stderr, "ERROR: Unable to open attribute header information (muxattrs.dat)\r\n"); free(spt2); exit(1); } memset(s_filename, '\0', sizeof(s_filename)); sprintf(s_filename, "muxout_%d.txt", atoi(argv[2])); if ( (f_muxout = fopen(s_filename, "w")) == NULL ) { fclose(f_muxflat); fclose(f_mymuxfile); fclose(f_muxattrs); fprintf(stderr, "ERROR: Unable to open output file (%s)\r\n", s_filename); free(spt2); exit(1); } if ( (f_muxlock = fopen("muxlocks.dat", "r")) == NULL ) { fclose(f_muxflat); fclose(f_mymuxfile); fclose(f_muxattrs); fclose(f_muxout); fprintf(stderr, "ERROR: Unable to open mux lock file (muxlocks.dat)\r\n"); free(spt2); exit(1); } memset(spt2, '\0', MALSIZE); spt3=malloc(MALSIZE); memset(spt3, '\0', MALSIZE); pt3 = spt3; fseek(f_muxflat, 0L, SEEK_SET); fprintf(stderr, "Step 1: Quering for dbref #%d\n", atoi(argv[2])); i_chk = 0; while ( !feof(f_muxflat) ) { fgets(spt2, (MALSIZE-2), f_muxflat); if ( i_pullname ) { i_pullname = 0; fprintf(f_muxout, "@@ %s\n", spt2); } pt2 = spt2; if ( (*pt2 == '<') && i_chk ) { break; } if ( *pt2 == '!' && (atoi(pt2+1) == atoi(argv[2])) ) { i_chk = 1; i_pullname = 1; continue; } if ( i_chk && *pt2 == '>' && isdigit(*(pt2+1)) ) { i_chk = 2; i_atrcntr++; sprintf(s_attrval, " %d ", atoi(pt2+1)); memset(spt2, '\0', MALSIZE); memset(s_finattr, '\0', sizeof(s_finattr)); fseek(f_muxattrs, 0L, SEEK_SET); while ( !feof(f_muxattrs) ) { fgets(spt2, (MALSIZE-2), f_muxattrs); if ( strstr(spt2, s_attrval) != NULL ) { strcpy(s_finattr, (char *)strtok(spt2, " ")); break; } } if ( strlen(s_finattr) == 0 ) { fseek(f_mymuxfile, 0L, SEEK_SET); while ( !feof(f_mymuxfile) ) { fgets(spt2, (MALSIZE-2), f_mymuxfile); if ( strstr(spt2, s_attrval) != NULL ) { strcpy(s_finattr, (char *)strtok(spt2, " ")); break; } } } if ( strlen(s_finattr) == 0 ) { fprintf(stderr, "ERROR: Unknown error in attribute handler."); exit(1); } fseek(f_muxlock, 0L, SEEK_SET); i_lck = 0; while ( !feof(f_muxlock) ) { fgets(spt2, (MALSIZE-2), f_muxlock); if ( strstr(spt2, s_attrval) != NULL ) { i_lck = 1; break; } } if ( !*s_attrib || !stricmp(s_finattr, s_attrib) || strstr(s_finattr, s_attrib) ) { i_atrcntr2++; if ( i_lck ) fprintf(f_muxout, "@lock/%s #%s=", s_finattr, argv[2]); else if ( atoi(s_attrval) < 256 ) fprintf(f_muxout, "@%s #%s=", s_finattr, argv[2]); else fprintf(f_muxout, "&%s #%s=", s_finattr, argv[2]); } } else if ( i_chk == 2) { if ( *pt2 == '"' ) pt2++; if ( *pt2 == '\001' ) { while ( *pt2 && *pt2 != ':' ) pt2++; pt2++; while ( *pt2 && *pt2 != ':' ) pt2++; pt2++; } memset(spt3, '\0', MALSIZE); pt3 = spt3; while ( *pt2 ) { if ( *pt2 == '\\' ) { pt2++; } if ( *pt2 == '\t' ) { pt2++; *pt3 = '%'; pt3++; *pt3 = 't'; pt3++; } *pt3 = *pt2; pt2++; pt3++; } *pt3 = '\0'; if ( strlen(spt3) > 2) { if ( *(pt3-2) == '"' ) { *(pt3-2) = '\n'; *(pt3-1) = '\0'; } else if ( *(pt3-2) == '\r' ) { *(pt3-2) = '%'; *(pt3-1) = 'r'; *pt3 = '\0'; } } if ( *spt3 == '\r' && (strlen(spt3) <= 2) ) { strcpy(spt3, "%r"); } if ( !*s_attrib || !stricmp(s_finattr, s_attrib) || strstr(s_finattr, s_attrib) ) fprintf(f_muxout, "%s", spt3); } } if ( !*s_attrib ) fprintf(stderr, "Step 2: Writing %d attributes\n", i_atrcntr); else fprintf(stderr, "Step 2: Writing %d (of %d) attributes\n", i_atrcntr2, i_atrcntr); fclose(f_muxlock); fclose(f_muxout); fclose(f_muxattrs); fclose(f_mymuxfile); fclose(f_muxflat); free(spt2); free(spt3); fprintf(stderr, "Step 3: Completed (file is: %s).\n", s_filename); return 0; }