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, 1 month 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

# Content
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 }