ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/ambient.c
(Generate patch)

Comparing ray/src/rt/ambient.c (file contents):
Revision 2.9 by greg, Thu Jul 16 15:53:42 1992 UTC vs.
Revision 2.10 by greg, Thu Jul 16 16:47:28 1992 UTC

# Line 41 | Line 41 | double  minarad;               /* minimum ambient radius */
41   static AMBTREE  atrunk;         /* our ambient trunk node */
42  
43   static FILE  *ambfp = NULL;     /* ambient file pointer */
44 static char  *afname;           /* ambient file name */
44  
45   #define  AMBFLUSH       (BUFSIZ/AMBVALSIZ)
46  
# Line 50 | Line 49 | static char  *afname;          /* ambient file name */
49   #define  newambtree()   (AMBTREE *)calloc(8, sizeof(AMBTREE))
50  
51   extern long  ftell(), lseek();
52 + static int  initambfile(), avsave(), avinsert(), ambsync();
53  
54  
55   setambres(ar)                           /* set ambient resolution */
# Line 78 | Line 78 | char  *afile;
78                                                  /* init ambient limits */
79          setambres(ambres);
80                                                  /* open ambient file */
81 <        if ((afname = afile) != NULL)
81 >        if (afile != NULL)
82                  if ((ambfp = fopen(afile, "r+")) != NULL) {
83                          initambfile(0);
84                          headlen = ftell(ambfp);
# Line 87 | Line 87 | char  *afile;
87                                                  thescene.cusize);
88                                                          /* align */
89                          fseek(ambfp, -((ftell(ambfp)-headlen)%AMBVALSIZ), 1);
90 <                } else if ((ambfp = fopen(afile, "w")) != NULL)
90 >                } else if ((ambfp = fopen(afile, "w+")) != NULL)
91                          initambfile(1);
92                  else {
93                          sprintf(errmsg, "cannot open ambient file \"%s\"",
# Line 324 | Line 324 | int  creat;
324                  putc('\n', ambfp);
325                  putambmagic(ambfp);
326                  fflush(ambfp);
327 <        } else if (checkheader(ambfp, AMBFMT, NULL) < 0
328 <                        || !hasambmagic(ambfp)) {
329 <                sprintf(errmsg, "\"%s\" is not an ambient file", afname);
330 <                error(USER, errmsg);
331 <        }
327 >        } else if (checkheader(ambfp, AMBFMT, NULL) < 0 || !hasambmagic(ambfp))
328 >                error(USER, "bad ambient file");
329   }
330  
331  
# Line 391 | Line 388 | memerr:
388   }
389  
390  
391 < #include  <fcntl.h>
391 > #ifdef  NIX
392  
393 + static
394 + ambsync()                       /* flush ambient file */
395 + {
396 +        return(fflush(ambfp));
397 + }
398  
399 + #else
400 +
401 + #include  <fcntl.h>
402 + #include  <sys/types.h>
403 + #include  <sys/stat.h>
404 +
405   static
406   ambsync()                       /* synchronize ambient file */
407   {
408          static FILE  *ambinp = NULL;
409          struct flock  fls;
410 +        struct stat  sts;
411          AMBVAL  avs;
412          long  lastpos, flen;
413          register int  n;
# Line 411 | Line 420 | ambsync()                      /* synchronize ambient file */
420                  error(SYSTEM, "cannot lock ambient file");
421                                  /* see if file has grown */
422          lastpos = lseek(fileno(ambfp), 0L, 1);  /* get previous position */
423 <        flen = lseek(fileno(ambfp), 0L, 2);     /* new(?) file length */
424 <        if (n = (flen - lastpos)%AMBVALSIZ)     /* assure alignment */
425 <                lseek(fileno(ambfp), (long)-n, 1);
423 >        if (fstat(fileno(ambfp), &sts) < 0)     /* get current length */
424 >                error(SYSTEM, "cannot stat ambient file");
425 >        flen = sts.st_size;
426          if (n = (flen - lastpos)/AMBVALSIZ) {   /* file has grown */
427 <                if (ambinp == NULL && (ambinp = fopen(afname, "r")) == NULL)
428 <                        error(SYSTEM, "cannot reopen ambient file");
420 <                fseek(ambinp, lastpos, 0);      /* go to previous position */
427 >                if (ambinp == NULL)             /* use duplicate file */
428 >                        ambinp = fdopen(dup(fileno(ambfp)), "r");
429                  while (n--) {                   /* load contributed values */
430                          readambval(&avs, ambinp);
431                          avinsert(&avs,&atrunk,thescene.cuorg,thescene.cusize);
432 <                }
432 >                }                               /* moves shared file pointer */
433 >                if (n = (flen - lastpos)%AMBVALSIZ)     /* alignment */
434 >                        lseek(fileno(ambfp), flen-n, 0);
435          }
436          n = fflush(ambfp);                      /* calls write() at last */
437          fls.l_type = F_UNLCK;                   /* release file */
438          fcntl(fileno(ambfp), F_SETLKW, &fls);
439          return(n);
440   }
441 +
442 + #endif

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines