file.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #include "bc_string.h"
  2. #include <stdio.h>
  3. #include "bc_io.h"
  4. /* $Id$ */
  5. Filedesc _fdtable[16];
  6. /* BASIC file descriptor table */
  7. /* Channel assignment:
  8. -1 terminal IO
  9. 0 data file
  10. 1-15 user files
  11. */
  12. int _chann = -1;
  13. FILE *_chanrd = stdin;
  14. FILE *_chanwr = stdout;
  15. _setchan(index)
  16. int index;
  17. {
  18. #ifdef DEBUG
  19. printf("setchannel %d\n",index);
  20. #endif
  21. fflush(_chanwr);
  22. if( index == -1)
  23. {
  24. _chann= -1;
  25. _chanrd= stdin;
  26. _chanwr= stdout;
  27. return;
  28. }
  29. if( index<0 || index>15)
  30. error(27);
  31. _chann=index;
  32. _chanrd= _chanwr= _fdtable[index].fd;
  33. }
  34. _asschn()
  35. {
  36. #ifdef DEBUG
  37. printf("_asschn %d\n",_chann);
  38. #endif
  39. if( _chann == -1) return;
  40. #ifdef DEBUG
  41. printf(" file %d\n", _fdtable[_chann].fd);
  42. #endif
  43. if( _chann<0 || _chann>15)
  44. error(27);
  45. if( _fdtable[_chann].fd== 0)
  46. error(39);
  47. if( feof( _fdtable[_chann].fd))
  48. error(2);
  49. }
  50. _clochn(nr)
  51. int nr;
  52. {
  53. if( nr<1 || nr >15 || _fdtable[nr].fd==0) error(3);
  54. fclose(_fdtable[nr].fd);
  55. _fdtable[nr].fd=0; _fdtable[nr].fname=0;
  56. }
  57. _opnchn(reclen,fname,mode)
  58. String *mode,*fname;
  59. int reclen;
  60. {
  61. /* channel has been set */
  62. FILE *f;
  63. int m;
  64. #ifdef DEBUG
  65. printf("open %d %s %s \n",reclen,mode->strval,fname->strval);
  66. #endif
  67. /* check for opened/closed file */
  68. if(_fdtable[_chann].fd)
  69. error(30);
  70. switch(*mode->strval)
  71. {
  72. case 'O':
  73. case 'o':
  74. if( (f=fopen(fname->strval,"w")) == NULL)
  75. error(28);
  76. m= OMODE;
  77. break;
  78. case 'I':
  79. case 'i':
  80. if( (f=fopen(fname->strval,"r")) == NULL)
  81. error(28);
  82. m= IMODE;
  83. break;
  84. case 'r':
  85. case 'R':
  86. if( (f=fopen(fname->strval,"a")) == NULL)
  87. error(28);
  88. m= RMODE;
  89. break;
  90. default:
  91. printf("file mode %s\n",mode->strval);
  92. error(29);
  93. }
  94. _chanwr= _chanrd= _fdtable[_chann].fd= f;
  95. _fdtable[_chann].fname= fname->strval;
  96. _fdtable[_chann].reclength= reclen;
  97. _fdtable[_chann].mode= m;
  98. #ifdef DEBUG
  99. printf("file descr %d\n",f);
  100. #endif
  101. }
  102. _ioeof(channel)
  103. int channel;
  104. {
  105. FILE *fd;
  106. char c;
  107. if( channel<0 || channel >15) error(3);
  108. fd= _fdtable[channel].fd;
  109. if( fd==0)
  110. error(3);
  111. c=fgetc(fd);
  112. if( feof(_fdtable[channel].fd) ) return(-1);
  113. ungetc(c,fd);
  114. return(0);
  115. }
  116. _close()
  117. {
  118. /* close all open files */
  119. int i;
  120. for(i=1;i<16;i++)
  121. if( _fdtable[i].fd)
  122. _clochn(i);
  123. }