ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/savqstr.c
Revision: 2.4
Committed: Tue Feb 25 02:47:22 2003 UTC (21 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.3: +1 -56 lines
Log Message:
Replaced inline copyright notice with #include "copyright.h"

File Contents

# User Rev Content
1 greg 1.1 #ifndef lint
2 greg 2.3 static const char RCSid[] = "$Id$";
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     extern void eputs();
15     extern void quit();
16    
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     free((void *)s);
44     }
45    
46     #else
47 greg 1.1
48     /*
49 greg 2.2 * Save unshared strings, packing them together into
50     * large blocks to optimize paging in VM environments.
51 greg 1.1 */
52    
53 greg 2.2 #ifdef BIGMEM
54     #ifndef MINBLOCK
55     #define MINBLOCK (1<<12) /* minimum allocation block size */
56     #endif
57     #ifndef MAXBLOCK
58     #define MAXBLOCK (1<<16) /* maximum allocation block size */
59     #endif
60     #else
61     #ifndef MINBLOCK
62     #define MINBLOCK (1<<10) /* minimum allocation block size */
63     #endif
64     #ifndef MAXBLOCK
65     #define MAXBLOCK (1<<14) /* maximum allocation block size */
66     #endif
67     #endif
68 greg 1.1
69 greg 2.2 extern char *bmalloc();
70 greg 1.1
71 greg 2.2
72 greg 1.1 char *
73     savqstr(s) /* save a private string */
74 greg 2.2 register char *s;
75 greg 1.1 {
76 greg 2.2 static char *curp = NULL; /* allocated memory pointer */
77     static unsigned nrem = 0; /* bytes remaining in block */
78     static unsigned nextalloc = MINBLOCK; /* next block size */
79 greg 1.1 register char *cp;
80 greg 2.2 register unsigned n;
81 greg 1.1
82 greg 2.2 for (cp = s; *cp++; ) /* compute strlen()+1 */
83     ;
84     if ((n = cp-s) > nrem) { /* do we need more core? */
85     bfree(curp, nrem); /* free remnant */
86     while (n > nextalloc)
87     nextalloc <<= 1;
88     if ((curp = bmalloc(nrem=nextalloc)) == NULL) {
89     eputs("out of memory in savqstr");
90     quit(1);
91     }
92     if ((nextalloc <<= 1) > MAXBLOCK) /* double block size */
93     nextalloc = MAXBLOCK;
94 greg 1.1 }
95 greg 2.2 for (cp = curp; *cp++ = *s++; ) /* inline strcpy() */
96     ;
97     s = curp; /* update allocation info. */
98     curp = cp;
99     nrem -= n;
100     return(s); /* return new location */
101 greg 1.1 }
102    
103    
104 greg 2.3 void
105 greg 2.2 freeqstr(s) /* free a private string (not recommended) */
106 greg 1.1 char *s;
107     {
108     bfree(s, strlen(s)+1);
109     }
110 greg 2.3
111     #endif