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

编译器/解释器

开发平台:

C/C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "rdoff.h"
  4. #include "rdlib.h"
  5. int rdl_error = 0;
  6. char *rdl_errors[3] = {
  7.     "no error","could not open file", "invalid file structure",
  8. };
  9. int rdl_searchlib (struct librarynode * lib,
  10.    const char * label, rdffile * f)
  11. {
  12.     char buf[257];
  13.     int i;
  14.     void * hdr;
  15.     rdfheaderrec * r;
  16.     rdl_error = 0;
  17.     lib->referenced ++;
  18.     if (! lib->fp)
  19.     {
  20. lib->fp = fopen(lib->name,"rb");
  21. if (! lib->fp) {
  22.     rdl_error = 1;
  23.     return 0;
  24. }
  25.     }
  26.     else
  27. rewind(lib->fp);
  28.     while (! feof(lib->fp) )
  29.     {
  30. i = 1;
  31. while (fread(buf + i,1,1,lib->fp) == 1 && buf[i] && i < 257)
  32.     i++;
  33. buf[0] = ':';
  34. if (feof(lib->fp)) break;
  35. if ( rdfopenhere(f,lib->fp,&lib->referenced,buf) ) {
  36.     rdl_error = 2;
  37.     return 0;
  38. }
  39. hdr = malloc(f->header_len);
  40. rdfloadseg(f,RDOFF_HEADER,hdr);
  41. while ((r = rdfgetheaderrec(f)))
  42. {
  43.     if (r->type != 3) /* not an export */
  44. continue;
  45.     if (! strcmp(r->e.label, label) ) /* match! */
  46.     {
  47. free(hdr); /* reset to 'just open' */
  48. f->header_loc = NULL; /* state... */
  49. f->header_fp = 0;
  50. return 1;
  51.     }
  52. }
  53. /* find start of next module... */
  54. i = f->data_ofs + f->data_len;
  55. rdfclose(f);
  56. fseek(lib->fp,i,SEEK_SET);
  57.     }
  58.     lib->referenced --;
  59.     if (! lib->referenced)
  60.     {
  61. fclose(lib->fp);
  62. lib->fp = NULL;
  63.     }
  64.     return 0;
  65. }
  66. void rdl_perror(const char *apname, const char *filename)
  67. {
  68.     fprintf(stderr,"%s:%s:%sn",apname,filename,rdl_errors[rdl_error]);
  69. }