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

Comparing ray/src/hd/rhoptimize.c (file contents):
Revision 3.2 by gwlarson, Thu Nov 5 14:43:14 1998 UTC vs.
Revision 3.3 by gwlarson, Fri Nov 6 16:54:23 1998 UTC

# Line 12 | Line 12 | static char SCCSid[] = "$SunId$ SGI";
12  
13   #include "holo.h"
14  
15 + #include <signal.h>
16 +
17   #ifndef BKBSIZE
18   #define BKBSIZE         256             /* beam clump size (kilobytes) */
19   #endif
# Line 22 | Line 24 | static char SCCSid[] = "$SunId$ SGI";
24   #define clrfl(p,i)              flgop(p,i,&=~)
25  
26   char    *progname;
27 + char    tempfile[128];
28  
29 + extern char     *rindex();
30 + extern int      quit();
31   extern long     rhinitcopy();
32  
33  
# Line 30 | Line 35 | main(argc, argv)
35   int     argc;
36   char    *argv[];
37   {
33        char    nambuf[128];
38          char    *inpname, *outname;
39          int     hdfd[2];
40          long    nextipos, lastopos, thisopos;
# Line 43 | Line 47 | char   *argv[];
47          inpname = argv[1];
48          if (argc == 3)                  /* use given output file */
49                  outname = argv[2];
50 <        else {                          /* else create temporary file */
51 <                strcpy(nambuf, inpname);
52 <                if ((outname = strrchr(nambuf, '/')) != NULL)
50 >        else {                          /* else use temporary file */
51 >                if (access(inpname, R_OK|W_OK) < 0) {   /* check permissions */
52 >                        sprintf(errmsg, "cannot access \"%s\"", inpname);
53 >                        error(SYSTEM, errmsg);
54 >                }
55 >                strcpy(tempfile, inpname);
56 >                if ((outname = rindex(tempfile, '/')) != NULL)
57                          outname++;
58                  else
59 <                        outname = nambuf;
59 >                        outname = tempfile;
60                  sprintf(outname, "rho%d.hdk", getpid());
61 <                outname = nambuf;
61 >                outname = tempfile;
62          }
63                                          /* copy holodeck file header */
64          nextipos = rhinitcopy(hdfd, inpname, outname);
# Line 75 | Line 83 | char   *argv[];
83                                          /* clean up */
84          close(hdfd[0]);
85          close(hdfd[1]);
86 <        if (argc == 2 && rename(outname, inpname) < 0) {
86 >        if (outname == tempfile && rename(outname, inpname) < 0) {
87                  sprintf(errmsg, "cannot rename \"%s\" to \"%s\"",
88                                  outname, inpname);
89                  error(SYSTEM, errmsg);
# Line 100 | Line 108 | char   *infn, *outfn;
108                  sprintf(errmsg, "cannot open \"%s\" for writing", outfn);
109                  error(SYSTEM, errmsg);
110          }
111 +                                        /* set up signal handling */
112 +        if (signal(SIGINT, quit) == SIG_IGN) signal(SIGINT, SIG_IGN);
113 +        if (signal(SIGHUP, quit) == SIG_IGN) signal(SIGHUP, SIG_IGN);
114 +        if (signal(SIGTERM, quit) == SIG_IGN) signal(SIGTERM, SIG_IGN);
115 + #ifdef SIGXCPU
116 +        if (signal(SIGXCPU, quit) == SIG_IGN) signal(SIGXCPU, SIG_IGN);
117 +        if (signal(SIGXFSZ, quit) == SIG_IGN) signal(SIGXFSZ, SIG_IGN);
118 + #endif
119                                          /* copy and verify header */
120 <        if (checkheader(infp, HOLOFMT, outfp) < 0 ||
105 <                        getw(infp) != HOLOMAGIC)
120 >        if (checkheader(infp, HOLOFMT, outfp) < 0 || getw(infp) != HOLOMAGIC)
121                  error(USER, "input not in holodeck format");
122          fputformat(HOLOFMT, outfp);
123          fputc('\n', outfp);
# Line 115 | Line 130 | char   *infn, *outfn;
130          fclose(infp);
131          if (fclose(outfp) == EOF)
132                  error(SYSTEM, "file flushing error in rhinitcopy");
133 <                                        /* we flush everything manually */
133 >                                        /* flush everything manually hence */
134          hdcachesize = 0;
135                                          /* return input position */
136          return(ifpos);
# Line 185 | Line 200 | int    b;
200          bneighrem = 0;
201          for (i = 9; i--; )
202                  for (j = 9; j--; ) {
203 <                        if (i == 4 & j == 4)
203 >                        if (i == 4 & j == 4)    /* don't copy starting beam */
204                                  continue;
205                          if (wg0[i].w == wg1[j].w)
206                                  continue;
# Line 209 | Line 224 | int    *b1p, *b2p;
224   {
225          register long   pdif = beamdir[*b1p].fo - beamdir[*b2p].fo;
226  
227 <        if (pdif > 0) return(1);
228 <        if (pdif < 0) return(-1);
227 >        if (pdif > 0L) return(1);
228 >        if (pdif < 0L) return(-1);
229          return(0);
230   }
231  
# Line 234 | Line 249 | int    ifd, ofd;
249          hout = hdinit(ofd, (HDGRID *)hinp);
250                                          /* allocate beam queue */
251          bqueue = (int *)malloc(nbeams(hinp)*sizeof(int));
252 <        bflags = (int4 *)calloc((nbeams(hinp)>>3)+1, sizeof(int4));
252 >        bflags = (unsigned int4 *)calloc((nbeams(hinp)>>5)+1,
253 >                        sizeof(unsigned int4));
254          if (bqueue == NULL | bflags == NULL)
255                  error(SYSTEM, "out of memory in copysect");
256                                          /* mark empty beams as done */
257 <        for (i = nbeams(hinp); i-- > 0; )
257 >        for (i = nbeams(hinp); i > 0; i--)
258                  if (!hinp->bi[i].nrd)
259                          setfl(bflags, i);
260                                          /* pick a good prime step size */
# Line 254 | Line 270 | int    ifd, ofd;
270                          continue;
271                  bqueue[0] = bci;                /* initialize queue */
272                  bqlen = 1;
273 <                bqtotal = bnrays(hinp, bci);
273 >                bqtotal = hinp->bi[bci].nrd;
274                  setfl(bflags, bci);
275                                                  /* run through growing queue */
276                  for (bqc = 0; bqc < bqlen; bqc++) {
# Line 264 | Line 280 | int    ifd, ofd;
280                                  if (isset(bflags, i))   /* done already? */
281                                          continue;
282                                  bqueue[bqlen++] = i;    /* add it */
283 <                                bqtotal += bnrays(hinp, i);
283 >                                bqtotal += hinp->bi[i].nrd;
284                                  setfl(bflags, i);
285                                  if (bqtotal >= BKBSIZE*1024/sizeof(RAYVAL))
286                                          break;          /* queue full */
# Line 317 | Line 333 | register char  *s;
333   quit(code)                      /* exit the program gracefully */
334   int     code;
335   {
336 <        hdsync(NULL, 1);        /* write out any buffered data */
336 >        if (tempfile[0])
337 >                unlink(tempfile);
338          exit(code);
339   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines