ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/savqstr.c
Revision: 2.7
Committed: Thu Jul 17 09:21:29 2003 UTC (20 years, 9 months ago) by schorsch
Content type: text/plain
Branch: MAIN
Changes since 2.6: +3 -3 lines
Log Message:
Added prototypes and includes from patch by Randolph Fritz.
Added more required includes and reduced other compile warnings.

File Contents

# User Rev Content
1 greg 1.1 #ifndef lint
2 schorsch 2.7 static const char RCSid[] = "$Id: savqstr.c,v 2.6 2003/05/15 05:13:35 greg Exp $";
3 greg 1.1 #endif
4 greg 2.3 /*
5     * Save unshared strings.
6     *
7     * External symbols declared in standard.h
8     */
9    
10 greg 2.4 #include "copyright.h"
11 greg 2.3
12     #include <stdlib.h>
13    
14 schorsch 2.7 #include "rterror.h"
15    
16 greg 2.3
17     #if 1
18    
19     char *
20     savqstr(s) /* save a private string */
21     register char *s;
22     {
23     register char *cp;
24     char *newp;
25    
26     for (cp = s; *cp++; ) /* compute strlen()+1 */
27     ;
28     newp = (char *)malloc(cp-s);
29     if (newp == NULL) {
30     eputs("out of memory in savqstr");
31     quit(1);
32     }
33     for (cp = newp; *cp++ = *s++; ) /* inline strcpy() */
34     ;
35     return(newp); /* return new location */
36     }
37    
38    
39     void
40     freeqstr(s) /* free a private string */
41     char *s;
42     {
43 greg 2.5 if (s != NULL)
44     free((void *)s);
45 greg 2.3 }
46    
47     #else
48 greg 1.1
49     /*
50 greg 2.2 * Save unshared strings, packing them together into
51     * large blocks to optimize paging in VM environments.
52 greg 1.1 */
53    
54 greg 2.6 #ifdef SMLMEM
55 greg 2.2 #ifndef MINBLOCK
56 greg 2.6 #define MINBLOCK (1<<10) /* minimum allocation block size */
57 greg 2.2 #endif
58     #ifndef MAXBLOCK
59 greg 2.6 #define MAXBLOCK (1<<14) /* maximum allocation block size */
60 greg 2.2 #endif
61     #else
62     #ifndef MINBLOCK
63 greg 2.6 #define MINBLOCK (1<<12) /* minimum allocation block size */
64 greg 2.2 #endif
65     #ifndef MAXBLOCK
66 greg 2.6 #define MAXBLOCK (1<<16) /* maximum allocation block size */
67 greg 2.2 #endif
68     #endif
69 greg 1.1
70 greg 2.2 extern char *bmalloc();
71 greg 1.1
72 greg 2.2
73 greg 1.1 char *
74     savqstr(s) /* save a private string */
75 greg 2.2 register char *s;
76 greg 1.1 {
77 greg 2.2 static char *curp = NULL; /* allocated memory pointer */
78     static unsigned nrem = 0; /* bytes remaining in block */
79     static unsigned nextalloc = MINBLOCK; /* next block size */
80 greg 1.1 register char *cp;
81 greg 2.2 register unsigned n;
82 greg 1.1
83 greg 2.2 for (cp = s; *cp++; ) /* compute strlen()+1 */
84     ;
85     if ((n = cp-s) > nrem) { /* do we need more core? */
86     bfree(curp, nrem); /* free remnant */
87     while (n > nextalloc)
88     nextalloc <<= 1;
89     if ((curp = bmalloc(nrem=nextalloc)) == NULL) {
90     eputs("out of memory in savqstr");
91     quit(1);
92     }
93     if ((nextalloc <<= 1) > MAXBLOCK) /* double block size */
94     nextalloc = MAXBLOCK;
95 greg 1.1 }
96 greg 2.2 for (cp = curp; *cp++ = *s++; ) /* inline strcpy() */
97     ;
98     s = curp; /* update allocation info. */
99     curp = cp;
100     nrem -= n;
101     return(s); /* return new location */
102 greg 1.1 }
103    
104    
105 greg 2.3 void
106 greg 2.2 freeqstr(s) /* free a private string (not recommended) */
107 greg 1.1 char *s;
108     {
109     bfree(s, strlen(s)+1);
110     }
111 greg 2.3
112     #endif