rip.c

Go to the documentation of this file.
00001 #include <stdio.h>
00002 #include <stdlib.h>
00003 #include <string.h>
00004 
00005 void rebuild(void)
00006 {
00007   unsigned int c;
00008   char s[10];
00009   char filename[18];
00010   char *pos;
00011   FILE *fi=fopen("index","r"),*fi2,*fo=fopen("usecode","wb");
00012   if (fi==NULL)
00013     {
00014       printf("Can't open index file.\n");
00015       exit(0);
00016     }
00017   if (fo==NULL)
00018     {
00019       printf("Can't create usecode file.\n");
00020       exit(0);
00021     }
00022   while (!feof(fi)) {
00023     fgets(s,10,fi);
00024     strcpy(filename, s);
00025     pos = strchr(filename, '\n');
00026     if (pos) *pos = '\0';
00027     strcat(filename, ".uco");
00028     if (!feof(fi))
00029       {
00030         s[strlen(s)-1]=0;
00031         printf("Writing function: %s... ",s);
00032         if ((fi2=fopen(filename,"rb"))==NULL)
00033           {
00034             printf("Can't open file %s\n", filename);
00035             exit(0);
00036           }
00037         while(!feof(fi2))
00038           {
00039             c=fgetc(fi2);
00040             if (!feof(fi2))
00041               fputc(c,fo);
00042           }
00043         fclose(fi2);
00044         printf("done\n");
00045       }
00046   }
00047   exit(0);
00048 }
00049 
00050 int main(int argc,char *argv[])
00051 {
00052   unsigned short fn, fnc;
00053   unsigned short temp;
00054   int fs,fsc;
00055   unsigned int i,put=0;
00056   int number;
00057   int extended;
00058   char s[10];
00059   char filename[18];
00060   FILE *fi,*fo,*fo2;
00061   printf("Wody's Rip v0.005\nCopyright (c) 1999 Wody Dragon (a.k.a. Wouter Dijkslag)\n");
00062   if (argc<2||(!strcasecmp(argv[1],"put")&&argc!=3))
00063     {
00064       printf("Syntax: rip <number>\tGets function <number> out of usecode (and"
00065            " index)\n\trip all\t\tGets all functions out of usecode (and index)\n"
00066            "\trip glue\tRecreate usecode file (needs all functions)\n"
00067            "\trip index\tOnly get index\n\trip put <nr>\tInserts function"
00068            " <nr> into the usecode file\n");
00069       exit(0);
00070     }
00071   if (!strcasecmp(argv[1],"all"))
00072     number=-1;
00073   else if (!strcasecmp(argv[1],"glue"))
00074     rebuild(); // note: this doesn't return
00075   else if (!strcasecmp(argv[1],"index"))
00076     number=-2;
00077   else if (!strcasecmp(argv[1],"put"))
00078   {
00079     sscanf(argv[2],"%x",&number);
00080     put=1;
00081   }
00082   else
00083     sscanf(argv[1],"%x",&number);
00084 
00085   if ((fi=fopen("usecode","rb+"))==NULL)
00086   {
00087     printf("Can't open usecode file.\n");
00088     exit(0);
00089   }
00090   if ((fo2=fopen("index","w"))==NULL)
00091   {
00092     printf("Can't create index file.\n");
00093     exit(0);
00094   }
00095   while (1) {
00096     if (fread(&fn,2,1,fi)!=1) break;
00097     if (fn == 0xFFFF) {
00098       extended = 1;
00099       fread(&fn,2,1,fi);
00100       fread(&fs,4,1,fi);
00101     } else {
00102       extended = 0;
00103       fread(&temp,2,1,fi);
00104       fs = temp;
00105     }
00106 
00107     if (number==-1||number==-2||number==fn)
00108     {
00109       sprintf(s,"%04X",fn);
00110       strcpy(filename, s);
00111       strcat(filename, ".uco");
00112       fprintf(fo2,"%s\n",s);
00113     }
00114     if (number==-1||number==fn)
00115     {
00116       if (!put)
00117       {
00118         printf("Writing function: %s... ",s);
00119         if ((fo=fopen(filename,"wb"))==NULL)
00120         {
00121           printf("Can't open file %s\n", filename);
00122           exit(0);
00123         }
00124 
00125         if (extended) {
00126           temp = 0xFFFF;
00127           fwrite(&temp,2,1,fo);
00128           fwrite(&fn,2,1,fo);
00129           fwrite(&fs,4,1,fo);
00130         } else {
00131           fwrite(&fn,2,1,fo);
00132           temp = fs;
00133           fwrite(&temp,2,1,fo);
00134         }
00135 
00136         for (i=0;i<fs;i++)
00137           fputc(fgetc(fi),fo);
00138         fclose(fo);
00139         printf("done\n");
00140       }
00141       else
00142       {
00143         printf("Reading function: %s... ",s);
00144         if ((fo=fopen(filename,"rb"))==NULL)
00145         {
00146           printf("Can't open file %s\n", filename);
00147           exit(0);
00148         }
00149         fread(&fnc,2,1,fo);
00150         if (fnc == 0xFFFF) {
00151           if (extended == 0) {
00152             printf("Wrong header (u7) in object\n");
00153             exit(0);
00154           }
00155           fread(&fnc,2,1,fo);
00156           fread(&fsc,4,1,fo);
00157         } else {
00158           if (extended == 1) {
00159             printf("Wrong header (extended) in object\n");
00160             exit(0);
00161           }
00162           fread(&temp,2,1,fo);
00163           fsc = temp;
00164         }
00165         if (fnc!=fn)
00166         {
00167           printf("Wrong function in object\n");
00168           exit(0);
00169         }
00170         if (fsc!=fs)
00171         {
00172           printf("Wrong size in object\n");
00173           exit(0);
00174         }
00175         fseek(fi,ftell(fi),SEEK_SET); /* These two fseeks force my */
00176         for (i=0;i<fs;i++)    /* Borland C++ 5.02 to read */
00177           fputc(fgetc(fo),fi);  /* write. Without them they */
00178         fclose(fo);     /* don't work as I think */
00179         fseek(fi,ftell(fi),SEEK_SET); /* they should (the writing */
00180         printf("done\n");   /* doesn't work) */
00181       }
00182     }
00183     else            /* Skip function */
00184       fseek(fi,fs,SEEK_CUR);
00185   }
00186   fclose(fi);
00187   printf("All done\n");
00188   return 0;
00189 }

Generated on Mon Jul 9 14:42:50 2007 for ExultEngine by  doxygen 1.5.1