fopen.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #include <stdio.h>
  2. #include <tigcclib.h>
  3. __ATTR_LIB_C__ FILE *fopen(const char *name, const char *mode)
  4. {
  5. char str[50],*fpos,*epos,*base=0,*sptr=str,chmode=mode[0];
  6. short bmode=(mode[1]=='b'|| mode[2]=='b'),flags=0,ferr;
  7. SYM_ENTRY *sym_entry;
  8. FILE *f;
  9. *sptr=0; while((*++sptr=*name++));
  10. if((sym_entry=DerefSym(SymFind(sptr))))
  11. if(sym_entry->flags.flags_n&0x8218 && strpbrk(mode,"wa+"))
  12. return 0;
  13. if(!(f=malloc(sizeof(FILE)))) return 0;
  14. if(chmode=='r'|| chmode=='a')
  15. {
  16. flags=_F_READ;
  17. if(!sym_entry)
  18. if(chmode=='r')
  19. {
  20. free(f);
  21. return 0;
  22. }
  23. else chmode='w';
  24. else
  25. {
  26. base=HLock(f->handle=sym_entry->handle);
  27. f->alloc=HeapSize(f->handle);
  28. }
  29. }
  30. if(chmode=='w')
  31. {
  32. SCR_STATE scr_state;
  33. flags=_F_WRIT;
  34. SaveScrState(&scr_state);
  35. ferr=!(sym_entry=DerefSym(SymAdd(sptr)));
  36. RestoreScrState(&scr_state);
  37. if(!ferr) ferr=!(f->handle=sym_entry->handle=HeapAlloc(128));
  38. if(ferr)
  39. {
  40. SymDel(sptr);
  41. free(f);
  42. return 0;
  43. }
  44. f->buffincrement=f->alloc=128;
  45. base=HLock(f->handle);
  46. if(bmode) poke_w(base,0);
  47. else
  48. {
  49. poke_l(base,0x00050001);
  50. poke_l(base+4,0x2000E000);
  51. }
  52. }
  53. epos=base+peek_w(base)+(bmode?2:0);
  54. if(chmode=='a') flags=_F_WRIT,fpos=epos;
  55. else fpos=base+(bmode?2:5);
  56. if(epos==fpos) flags|=_F_EOF;
  57. if(mode[1]=='+'||mode[2]=='+') flags|=_F_RDWR;
  58. if(bmode) flags|=_F_BIN;
  59. f->flags=flags; f->base=base; f->fpos=fpos; f->unget=0;
  60. return f;
  61. }