home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume23 / trn / part13 / backpage.c < prev    next >
C/C++ Source or Header  |  1991-08-22  |  2KB  |  118 lines

  1. /* $Header: backpage.c,v 4.3.3.2 91/01/16 02:29:46 davison Trn $
  2.  *
  3.  * $Log:    backpage.c,v $
  4.  * Revision 4.3.3.2  91/01/16  02:29:46  davison
  5.  * Integrated rn patches 48-54.
  6.  * 
  7.  * Revision 4.3.3.1  90/06/20  22:36:17  davison
  8.  * Initial Trn Release
  9.  * 
  10.  * Revision 4.3.2.1  90/11/22  16:08:00  sob
  11.  * Made changes to accomodate picky C precompilers
  12.  * 
  13.  * Revision 4.3  85/05/01  11:36:03  lwall
  14.  * Baseline for release with 4.3bsd.
  15.  * 
  16.  */
  17.  
  18. #include "EXTERN.h"
  19. #include "common.h"
  20. #include "intrp.h"
  21. #include "final.h"
  22. #include "INTERN.h"
  23. #include "backpage.h"
  24.  
  25. ART_LINE maxindx = -1;
  26. long lseek();
  27.  
  28. void
  29. backpage_init()
  30. {
  31.     char *varyname;
  32.     
  33.     varyname = filexp(VARYNAME);
  34.     close(creat(varyname,0600));
  35.     varyfd = open(varyname,2);
  36.     UNLINK(varyname);
  37.     if (varyfd < 0) {
  38.     printf(cantopen,varyname) FLUSH;
  39.     sig_catcher(0);
  40.     }
  41.     
  42. }
  43.  
  44. /* virtual array read */
  45.  
  46. ART_POS
  47. vrdary(indx)
  48. ART_LINE indx;
  49. {
  50.     int subindx;
  51.     long offset;
  52.  
  53. #ifdef DEBUGGING
  54.     if (indx > maxindx) {
  55.     printf("vrdary(%ld) > %ld\n",(long)indx, (long)maxindx) FLUSH;
  56.     return 0;
  57.     }
  58. #endif
  59.     if (indx < 0)
  60.     return 0;
  61.     subindx = indx % VARYSIZE;
  62.     offset = (indx - subindx) * sizeof(varybuf[0]);
  63.     if (offset != oldoffset) {
  64.     if (oldoffset >= 0) {
  65. #ifndef lint
  66.         (void)lseek(varyfd,oldoffset,0);
  67.         write(varyfd, (char *)varybuf,sizeof(varybuf));
  68. #endif /* lint */
  69.     }
  70. #ifndef lint
  71.     (void)lseek(varyfd,offset,0);
  72.     read(varyfd,(char *)varybuf,sizeof(varybuf));
  73. #endif /* lint */
  74.     oldoffset = offset;
  75.     }
  76.     return varybuf[subindx];
  77. }
  78.  
  79. /* write to virtual array */
  80.  
  81. void
  82. vwtary(indx,newvalue)
  83. ART_LINE indx;
  84. ART_POS newvalue;
  85. {
  86.     int subindx;
  87.     long offset;
  88.  
  89. #ifdef DEBUGGING
  90.     if (indx < 0)
  91.     printf("vwtary(%ld)\n",(long)indx) FLUSH;
  92.     if (!indx)
  93.     maxindx = 0;
  94.     if (indx > maxindx) {
  95.     if (indx != maxindx + 1)
  96.         printf("indx skipped %d-%d\n",maxindx+1,indx-1) FLUSH;
  97.     maxindx = indx;
  98.     }
  99. #endif
  100.     subindx = indx % VARYSIZE;
  101.     offset = (indx - subindx) * sizeof(varybuf[0]);
  102.     if (offset != oldoffset) {
  103.     if (oldoffset >= 0) {
  104. #ifndef lint
  105.         (void)lseek(varyfd,oldoffset,0);
  106.         write(varyfd,(char *)varybuf,sizeof(varybuf));
  107. #endif /* lint */
  108.     }
  109. #ifndef lint
  110.     (void)lseek(varyfd,offset,0);
  111.     read(varyfd,(char *)varybuf,sizeof(varybuf));
  112. #endif /* lint */
  113.     oldoffset = offset;
  114.     }
  115.     varybuf[subindx] = newvalue;
  116. }
  117.  
  118.