rdflib.c
上传用户:yuppie_zhu
上传日期:2007-01-08
资源大小:535k
文件大小:5k
源码类别:

编译器/解释器

开发平台:

C/C++

  1. /* rdflib - manipulate RDOFF library files (.rdl) */
  2. /* an rdoff library is simply a sequence of RDOFF object files, each
  3.    preceded by the name of the module, an ASCII string of up to 255
  4.    characters, terminated by a zero.  There may be an optional
  5.    directory placed on the end of the file. The format of the
  6.    directory will be 'RDL' followed by a version number, followed by
  7.    the length of the directory, and then the directory, the format of
  8.    which has not yet been designed. */
  9. #include <stdio.h>
  10. #include <errno.h>
  11. #include <string.h>
  12. /* functions supported:
  13.      create a library (no extra operands required)
  14.      add a module from a library (requires filename and name to give mod.)
  15.      remove a module from a library (requires given name)
  16.      extract a module from the library (requires given name and filename)
  17.      list modules */
  18. const char *usage = 
  19.    "usage:n"
  20.    "  rdflib x libname [extra operands]nn"
  21.    "  where x is one of:n"
  22.    "    c - create libraryn"
  23.    "    a - add module (operands = filename module-name)n"
  24.    "    r - remove                (module-name)n"
  25.    "    x - extract               (module-name filename)n"
  26.    "    t - listn";
  27. char **_argv;
  28. #define _ENDIANNESS 0 /* 0 for little, 1 for big */
  29. static void longtolocal(long * l)
  30. {
  31. #if _ENDIANNESS
  32.     unsigned char t;
  33.     unsigned char * p = (unsigned char *) l;
  34.     t = p[0];
  35.     p[0] = p[3];
  36.     p[3] = t;
  37.     t = p[1];
  38.     p[1] = p[2];
  39.     p[2] = p[1];
  40. #endif
  41. }
  42. void copybytes(FILE *fp, FILE *fp2, int n)
  43. {
  44.     int i,t;
  45.     for (i = 0 ; i < n; i++ )
  46.     {
  47. t = fgetc(fp);
  48. if (t == EOF)
  49. {
  50.     fprintf(stderr,"ldrdf: premature end of file in '%s'n",
  51.     _argv[2]);
  52.     exit(1);
  53. }
  54. if (fp2) 
  55.     if (fputc(t, fp2) == EOF)
  56.     {
  57. fprintf(stderr,"ldrdf: write errorn");
  58. exit(1);
  59.     }
  60.     }
  61. }
  62. long copylong(FILE *fp, FILE *fp2)
  63. {
  64.     long l;
  65.     int i,t;
  66.     unsigned char * p = (unsigned char *) &l;
  67.     for (i = 0 ; i < 4; i++ ) /* skip magic no */
  68.     {
  69. t = fgetc(fp);
  70. if (t == EOF)
  71. {
  72.     fprintf(stderr,"ldrdf: premature end of file in '%s'n",
  73.     _argv[2]);
  74.     exit(1);
  75. }
  76. if (fp2) 
  77.     if (fputc(t, fp2) == EOF)
  78.     {
  79. fprintf(stderr,"ldrdf: write errorn");
  80. exit(1);
  81.     }
  82. *p++ = t;
  83.     }
  84.     longtolocal (&l);
  85.     return l;
  86. }
  87. int main(int argc, char **argv)
  88. {
  89.     FILE *fp, *fp2;
  90.     char *p, buf[256];
  91.     int i;
  92.     _argv = argv;
  93.     if (argc < 3 || !strncmp(argv[1],"-h",2) || !strncmp(argv[1],"--h",3))
  94.     {
  95. printf(usage);
  96. exit(1);
  97.     }
  98.     switch(argv[1][0])
  99.     {
  100.     case 'c': /* create library */
  101. fp = fopen(argv[2],"wb");
  102. if (! fp) {
  103.     fprintf(stderr,"ldrdf: could not open '%s'n",argv[2]);
  104.     perror("ldrdf");
  105.     exit(1);
  106. }
  107. fclose(fp);
  108. break;
  109.     case 'a': /* add module */
  110. if (argc < 5) {
  111.     fprintf(stderr,"ldrdf: required parameter missingn");
  112.     exit(1);
  113. }
  114. fp = fopen(argv[2],"ab");
  115. if (! fp)
  116. {
  117.     fprintf(stderr,"ldrdf: could not open '%s'n",argv[2]);
  118.     perror("ldrdf");
  119.     exit(1);
  120. }
  121. fp2 = fopen(argv[3],"rb");
  122. if (! fp)
  123. {
  124.     fprintf(stderr,"ldrdf: could not open '%s'n",argv[3]);
  125.     perror("ldrdf");
  126.     exit(1);
  127. }
  128. p = argv[4];
  129. do {
  130.     if ( fputc(*p,fp) == EOF ) {
  131. fprintf(stderr,"ldrdf: write errorn");
  132. exit(1);
  133.     }
  134. } while (*p++);
  135. while (! feof (fp2) ) {
  136.     i = fgetc (fp2);
  137.     if (i == EOF) {
  138. break;
  139.     }
  140.     if ( fputc(i, fp) == EOF ) {
  141. fprintf(stderr,"ldrdf: write errorn");
  142. exit(1);
  143.     }
  144. }
  145. fclose(fp2);
  146. fclose(fp);
  147. break;
  148.     case 'x':
  149. if (argc < 5) {
  150.     fprintf(stderr,"ldrdf: required parameter missingn");
  151.     exit(1);
  152. }
  153. fp = fopen(argv[2],"rb");
  154. if (! fp)
  155. {
  156.     fprintf(stderr,"ldrdf: could not open '%s'n",argv[2]);
  157.     perror("ldrdf");
  158.     exit(1);
  159. }
  160. fp2 = NULL;
  161. while (! feof(fp) ) {
  162.     /* read name */
  163.     p = buf;
  164.     while( ( *(p++) = (char) fgetc(fp) ) )  
  165. if (feof(fp)) break;
  166.     if (feof(fp)) break;
  167.     /* check against desired name */
  168.     if (! strcmp(buf,argv[3]) )
  169.     {
  170. fp2 = fopen(argv[4],"wb");
  171. if (! fp2)
  172. {
  173.     fprintf(stderr,"ldrdf: could not open '%s'n", argv[4]);
  174.     perror("ldrdf");
  175.     exit(1);
  176. }
  177.     }
  178.     else
  179. fp2 = NULL;
  180.     /* step over the RDOFF file, copying it if fp2 != NULL */
  181.     copybytes(fp,fp2,6); /* magic number */
  182.     copybytes(fp,fp2, copylong(fp,fp2)); /* header */
  183.     copybytes(fp,fp2, copylong(fp,fp2)); /* text */
  184.     copybytes(fp,fp2, copylong(fp,fp2)); /* data */
  185.     if (fp2)
  186. break;
  187. }
  188. fclose(fp);
  189. if (fp2)
  190.     fclose(fp2);
  191. else
  192. {
  193.     fprintf(stderr,"ldrdf: module '%s' not found in '%s'n",
  194.     argv[3],argv[2]);
  195.     exit(1);
  196. }
  197. break;
  198.     default:
  199. fprintf(stderr,"ldrdf: command '%c' not recognisedn",
  200. argv[1][0]);
  201. exit(1);
  202.     }
  203.     return 0;
  204. }