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

Comparing ray/src/rt/RtraceSimulManager.cpp (file contents):
Revision 2.12 by greg, Sat Aug 3 01:54:46 2024 UTC vs.
Revision 2.13 by greg, Sat Aug 3 15:38:06 2024 UTC

# Line 26 | Line 26 | RadSimulManager::LoadOctree(const char *octn)
26          if (!octn)              // don't support stdin octree
27                  return false;
28  
29 <        NewHeader(octn);        // load header if we can
29 >        NewHeader(octn);        // get octree header
30          ray_init((char *)octn);
31          return true;
32   }
# Line 46 | Line 46 | add2header(char *str, void *p)
46   // Prepare header from previous input (or clear)
47   // Normally called during octree load
48   bool
49 < RadSimulManager::NewHeader(const char *fname)
49 > RadSimulManager::NewHeader(const char *inspec)
50   {
51 <        if (header) {
52 <                free(header); header = NULL;
51 >        if (hlen) {
52 >                free(header); header = NULL; hlen = 0;
53          }
54 <        if (!fname || fname[0] == '!')
54 >        if (!inspec || !*inspec)
55                  return false;
56 <        FILE    *fp = fopen(fname, "rb");
56 >        if (inspec[0] == '!')           // save command as header?
57 >                return AddHeader(inspec+1);
58 >                                        // attempt to read from file
59 >        FILE    *fp = fopen(inspec, "rb");
60 >        if (!fp) return false;
61          bool    ok = (getheader(fp, add2header, this) >= 0);
62          fclose(fp);
63          return ok;
64   }
65  
66 < // Add a string to header (adds newline if none)
66 > // Add a string to header (adds newline if missing)
67   bool
68   RadSimulManager::AddHeader(const char *str)
69   {
70          if (!str) return false;
71          int     len = strlen(str);
72 <        if (!len || str[0] == '\n') return false;
73 <        int     olen = 0;
74 <        if (header) {
75 <                olen = strlen(header);
76 <                header = (char *)realloc(header, olen+len+2);
77 <        } else
72 >        while (len && str[len-1] == '\n')
73 >                --len;                  // don't copy EOL(s)
74 >        if (!len)
75 >                return false;
76 >        if (hlen)
77 >                header = (char *)realloc(header, hlen+len+2);
78 >        else
79                  header = (char *)malloc(len+2);
80 <        if (!header) return false;
81 <        strcpy(header+olen, str);
82 <        if (str[len-1] != '\n') {
78 <                header[olen+len++] = '\n';
79 <                header[olen+len] = '\0';
80 >        if (!header) {
81 >                hlen = 0;               // XXX should report?
82 >                return false;
83          }
84 +        memcpy(header+hlen, str, len);
85 +        hlen += len;
86 +        header[hlen++] = '\n';          // add single EOL
87 +        header[hlen] = '\0';
88          return true;
89   }
90  
# Line 108 | Line 115 | RadSimulManager::AddHeader(int ac, const char *av[])
115                  if (!av[n]) return false;
116                  len += strlen(av[n]) + 3;
117          }
118 <        int     hlen = 0;
112 <        if (header) {                   // add to header
113 <                hlen = strlen(header);
118 >        if (hlen)                       // add to header
119                  header = (char *)realloc(header, hlen+len+1);
120 <        } else
120 >        else
121                  header = (char *)malloc(len+1);
122 +
123          for (n = 0; n < ac; n++) {
124                  int     c = check_special(av[n]);
125 <                if (c) {                // need to quote argument?
126 <                        if (c == '"') c = '\'';
125 >                len = strlen(av[n]);
126 >                if (c | !len) {         // need to quote argument?
127 >                        if ((c == '"') | (c == '\n')) c = '\'';
128                          else c = '"';
129                          header[hlen++] = c;
130                          strcpy(header+hlen, av[n]);
131 <                        hlen += strlen(av[n]);
131 >                        hlen += len;
132                          header[hlen++] = c;
133                  } else {
134                          strcpy(header+hlen, av[n]);
135 <                        hlen += strlen(av[n]);
135 >                        hlen += len;
136                  }
137                  header[hlen++] = ' ';
138          }
# Line 203 | Line 210 | RadSimulManager::WaitResult(RAY *r)
210   int
211   RadSimulManager::Cleanup(bool everything)
212   {
213 +        NewHeader();
214          if (!ray_pnprocs)
215                  ray_done(everything);
216          else

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines