fopen.c 1.9 KB

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