backspac.c 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #include "f2c.h"
  2. #include "fio.h"
  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif
  6. #ifdef KR_headers
  7. integer f_back(a) alist *a;
  8. #else
  9. integer f_back(alist *a)
  10. #endif
  11. { unit *b;
  12. OFF_T v, w, x, y, z;
  13. uiolen n;
  14. FILE *f;
  15. f__curunit = b = &f__units[a->aunit]; /* curunit for error messages */
  16. if(a->aunit >= MXUNIT || a->aunit < 0)
  17. err(a->aerr,101,"backspace")
  18. if(b->useek==0) err(a->aerr,106,"backspace")
  19. if(b->ufd == NULL) {
  20. fk_open(1, 1, a->aunit);
  21. return(0);
  22. }
  23. if(b->uend==1)
  24. { b->uend=0;
  25. return(0);
  26. }
  27. if(b->uwrt) {
  28. t_runc(a);
  29. if (f__nowreading(b))
  30. err(a->aerr,errno,"backspace")
  31. }
  32. f = b->ufd; /* may have changed in t_runc() */
  33. if(b->url>0)
  34. {
  35. x=FTELL(f);
  36. y = x % b->url;
  37. if(y == 0) x--;
  38. x /= b->url;
  39. x *= b->url;
  40. (void) FSEEK(f,x,SEEK_SET);
  41. return(0);
  42. }
  43. if(b->ufmt==0)
  44. { FSEEK(f,-(OFF_T)sizeof(uiolen),SEEK_CUR);
  45. if(fread((char *)&n,sizeof(uiolen),1,f));
  46. return (1);
  47. FSEEK(f,-(OFF_T)n-2*sizeof(uiolen),SEEK_CUR);
  48. return(0);
  49. }
  50. w = x = FTELL(f);
  51. z = 0;
  52. loop:
  53. while(x) {
  54. x -= x < 64 ? x : 64;
  55. FSEEK(f,x,SEEK_SET);
  56. for(y = x; y < w; y++) {
  57. if (getc(f) != '\n')
  58. continue;
  59. v = FTELL(f);
  60. if (v == w) {
  61. if (z)
  62. goto break2;
  63. goto loop;
  64. }
  65. z = v;
  66. }
  67. err(a->aerr,(EOF),"backspace")
  68. }
  69. break2:
  70. FSEEK(f, z, SEEK_SET);
  71. return 0;
  72. }
  73. #ifdef __cplusplus
  74. }
  75. #endif