ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/mgf_object.c
Revision: 3.1
Committed: Fri Feb 18 00:40:25 2011 UTC (13 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R4, rad5R2, rad4R2P2, rad5R0, rad5R1, rad4R2, rad4R1, rad4R2P1, rad5R3, HEAD
Log Message:
Major code reorg, moving mgflib to common and introducing BSDF material

File Contents

# User Rev Content
1 greg 3.1 #ifndef lint
2     static const char RCSid[] = "$Id: object.c,v 1.7 2011/01/14 05:46:12 greg Exp $";
3     #endif
4     /*
5     * Header file for tracking hierarchical object names
6     */
7    
8     #include <stdio.h>
9     #include <stdlib.h>
10     #include <string.h>
11     #include "mgf_parser.h"
12    
13    
14     int obj_nnames; /* depth of name hierarchy */
15     char **obj_name; /* name list */
16    
17     static int obj_maxname; /* allocated list size */
18    
19     #define ALLOC_INC 16 /* list increment ( > 1 ) */
20    
21    
22     int
23     obj_handler(int ac, char **av) /* handle an object entity statement */
24     {
25     if (ac == 1) { /* just pop top object */
26     if (obj_nnames < 1)
27     return(MG_ECNTXT);
28     free(obj_name[--obj_nnames]);
29     obj_name[obj_nnames] = NULL;
30     return(MG_OK);
31     }
32     if (ac != 2)
33     return(MG_EARGC);
34     if (!isname(av[1]))
35     return(MG_EILL);
36     if (obj_nnames >= obj_maxname-1) { /* enlarge array */
37     if (!obj_maxname)
38     obj_name = (char **)malloc(
39     (obj_maxname=ALLOC_INC)*sizeof(char *));
40     else
41     obj_name = (char **)realloc(obj_name,
42     (obj_maxname+=ALLOC_INC)*sizeof(char *));
43     if (obj_name == NULL)
44     return(MG_EMEM);
45     }
46     /* allocate new entry */
47     obj_name[obj_nnames] = (char *)malloc(strlen(av[1])+1);
48     if (obj_name[obj_nnames] == NULL)
49     return(MG_EMEM);
50     strcpy(obj_name[obj_nnames++], av[1]);
51     obj_name[obj_nnames] = NULL;
52     return(MG_OK);
53     }
54    
55    
56     void
57     obj_clear(void) /* clear object stack */
58     {
59     while (obj_nnames)
60     free(obj_name[--obj_nnames]);
61     if (obj_maxname) {
62     free(obj_name);
63     obj_maxname = 0;
64     }
65     }