read.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #include "bc_string.h"
  2. #include "bc_io.h"
  3. #include <ctype.h>
  4. /* $Id$ */
  5. _readln()
  6. {
  7. register int c;
  8. while( (c=fgetc(_chanrd)) != EOF && c!= '\n')
  9. ;
  10. }
  11. readskip()
  12. {
  13. register int c;
  14. #ifdef DEBUG
  15. printf("readskip\n");
  16. #endif
  17. while( (c=fgetc(_chanrd)) != EOF && c!= ',' && c!= '\n')
  18. ;
  19. }
  20. _readint(addr)
  21. int *addr;
  22. {
  23. int i;
  24. char buf[1024];
  25. #ifdef DEBUG
  26. printf("read int from %d\n",_chann);
  27. #endif
  28. _asschn();
  29. if( fscanf(_chanrd,"%d",&i) != 1)
  30. {
  31. if( ferror(_chanrd)) error(29);
  32. if( feof(_chanrd)) error(2);
  33. if( _chann == -1)
  34. {
  35. _asschn(); /* may be closed by now */
  36. fgets(buf,1024,_chanrd);
  37. printf("?Redo ");
  38. _readint(addr);
  39. return;
  40. }
  41. error(40);
  42. }else { readskip(); *addr=i;}
  43. }
  44. _readflt(addr)
  45. double *addr;
  46. {
  47. double f;
  48. char buf[1024];
  49. #ifdef DEBUG
  50. printf("read flt from %d\n",_chann);
  51. #endif
  52. _asschn();
  53. if( fscanf(_chanrd,"%lf",&f) != 1)
  54. {
  55. if( ferror(_chanrd)) error(29);
  56. if( feof(_chanrd)) error(2);
  57. if( _chann == -1)
  58. {
  59. fgets(buf,1024,_chanrd);
  60. printf("?Redo ");
  61. _readflt(addr);
  62. return;
  63. }
  64. error(40);
  65. }else { readskip(); *addr=f;}
  66. }
  67. _readstr(s)
  68. String **s;
  69. {
  70. char buffer[1024];
  71. register int kar ;
  72. char *c;
  73. #ifdef DEBUG
  74. printf("read str from %d\n",_chann);
  75. #endif
  76. _asschn();
  77. c= buffer;
  78. kar= fgetc(_chanrd);
  79. while(isspace(kar) && kar!= EOF)
  80. kar= fgetc(_chanrd);
  81. *c=kar ;
  82. if( kar== '"')
  83. {
  84. /* read quoted string */
  85. #ifdef DEBUG
  86. printf("qouted string\n");
  87. #endif
  88. while ( (kar= fgetc(_chanrd)) != EOF && kar!='"' ) *c++ = kar ;
  89. ungetc(kar,_chanrd);
  90. *c=0;
  91. }else
  92. if( isalpha(*c))
  93. {
  94. /* read normal string */
  95. c++;
  96. #ifdef DEBUG
  97. printf("non-qouted string\n");
  98. #endif
  99. while( (kar= fgetc(_chanrd)) != ',' && kar!= EOF &&
  100. !isspace(kar) && kar!='\n')
  101. *c++= kar ;
  102. ungetc(kar,_chanrd);
  103. *c=0;
  104. }else{
  105. if( ferror(_chanrd)) error(29);
  106. if( feof(_chanrd)) error(2);
  107. if( _chann == -1)
  108. {
  109. fgets(buffer,1024,_chanrd);
  110. printf("?Redo ");
  111. _rdline(s);
  112. return;
  113. }
  114. error(40);
  115. }
  116. #ifdef DEBUG
  117. printf("string read: %s\n",buffer);
  118. #endif
  119. readskip();
  120. /* save value read */
  121. _decstr(*s);
  122. *s= (String *) _newstr(buffer);
  123. }
  124. extern int _seektab[];
  125. _restore(line)
  126. int line;
  127. {
  128. int nr;
  129. char buffer[1024];
  130. #ifdef DEBUG
  131. printf("seek to %d",line);
  132. #endif
  133. fseek(_chanrd,0l,0);
  134. if( line)
  135. {
  136. /* search number of lines to skip */
  137. for(nr=0; _seektab[nr] && _seektab[nr]< line; nr+=2)
  138. #ifdef DEBUG
  139. printf("test %d %d\n",_seektab[nr], _seektab[nr+1]);
  140. #endif
  141. ;
  142. nr /= 2;
  143. #ifdef DEBUG
  144. printf(" %d lines to skip\n",nr);
  145. #endif
  146. while(nr-- >0 ) fgets(buffer,1024,_chanrd);
  147. }
  148. }
  149. _rdline(s)
  150. String **s;
  151. {
  152. char buffer[1024];
  153. if( fgets(buffer,1024,_chanrd) == 0)
  154. {
  155. if( _chann == -1)
  156. {
  157. printf("?Redo ");
  158. _rdline(s);
  159. return;
  160. }
  161. error(40);
  162. }
  163. _decstr(*s);
  164. *s= (String *) _newstr(buffer);
  165. }