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();
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);
00176 for (i=0;i<fs;i++)
00177 fputc(fgetc(fo),fi);
00178 fclose(fo);
00179 fseek(fi,ftell(fi),SEEK_SET);
00180 printf("done\n");
00181 }
00182 }
00183 else
00184 fseek(fi,fs,SEEK_CUR);
00185 }
00186 fclose(fi);
00187 printf("All done\n");
00188 return 0;
00189 }