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

Comparing ray/src/common/savqstr.c (file contents):
Revision 1.1 by greg, Mon Jul 22 14:32:39 1991 UTC vs.
Revision 2.10 by greg, Fri Jun 1 19:17:17 2012 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines