source: git/dyn_modules/modgen/proc_setup.cc @ 3c473c

spielwiese
Last change on this file since 3c473c was 3c473c, checked in by Kai Krüger <krueger@…>, 14 years ago
rename directory modules to dyn_modules anticipating "modules" directory for cmake. git-svn-id: file:///usr/local/Singular/svn/trunk@13033 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 4.8 KB
Line 
1/*
2 * $Id$
3 */
4
5#include <stdio.h>
6#include <string.h>
7#include <stdlib.h>
8#include <ctype.h>
9#include "modgen.h"
10#include "typmap.h"
11
12
13#if 1
14#  define logx printf
15#else
16#  define logx
17#endif
18/*#define DEBUG 1*/
19
20static char default_do_typecheck = 1;
21static char default_do_return = 1;
22
23/*========================================================================*/
24int init_proc(
25  procdefv p,
26  char *procname,
27  paramdefv ret,
28  int lineno,
29  language_defs language
30  )
31{
32  int i;
33 
34  if( p == NULL) return -1;
35  if( p->procname != NULL ) free(p->procname);
36 
37  if( p->funcname != NULL ) free(p->funcname);
38  if( p->c_code != NULL ) free(p->c_code);
39  if( p->help_string != NULL) free(p->help_string);
40  if( p->example_string != NULL) free(p->example_string);
41 
42  if( p->paramcnt>0 ) { 
43    //free(p->param);
44  }
45
46  memset((void *)p, 0, sizeof(procdef));
47  p->procname = strdup(procname);
48
49  if( ret != NULL ) {
50    char typname[32];
51
52    decl2str(ret->typ, typname);
53    ret->typname = strdup(typname);
54    memcpy((void *)(&p->return_val), (void *)ret, sizeof(paramdef));
55  } else {
56    p->return_val.name = strdup("NONE");
57    p->return_val.typname = strdup("NONE");
58    p->return_val.typ = NONE;
59  }
60 
61  p->language = language;
62  p->lineno = lineno;
63  p->flags.auto_header = 1;
64 
65  p->flags.do_declaration = 1;
66  p->flags.declaration_done = 0;
67  p->flags.do_typecheck = default_do_typecheck;
68  p->flags.typecheck_done = 0;
69  p->flags.do_return = default_do_return;
70 
71  return 0;
72}
73
74/*========================================================================*/
75void AddParam(
76  procdefv p,
77  paramdefv vnew,
78  char *varname
79  )
80{
81  paramdef pnew;
82  int paramcnt = 0;
83  char typname[32];
84 
85  memset(typname, 0, sizeof(typname));
86  decl2str(vnew->typ, typname);
87 
88#if DEBUG
89  logx("AddParam(%d, %s, %s, %d)\n", p->paramcnt, p->procname,
90       typname, vnew->typ);
91#endif
92
93  memset((void *)&pnew, '\0', sizeof(paramdef));
94  pnew.name = (char *)malloc(strlen(vnew->name)+1);
95  memset(pnew.name, '\0', strlen(vnew->name)+1);
96//   pnew.next = NULL;
97  memcpy(pnew.name, vnew->name, strlen(vnew->name));
98  pnew.typname = (char *)malloc(strlen(typname)+1);
99  memset(pnew.typname, '\0', strlen(typname)+1);
100  memcpy(pnew.typname, typname, strlen(typname));
101  pnew.typ = vnew->typ;
102
103  paramcnt = p->paramcnt;
104  if(varname == NULL) {
105    snprintf(typname, sizeof(typname), "arg%d", paramcnt);
106    pnew.varname = strdup(typname);
107  } else pnew.varname = strdup(varname);
108
109 if(p->paramcnt==0) {
110    p->param = (paramdefv)malloc(sizeof(paramdef));
111 }
112  else {
113    p->param =
114      (paramdefv)realloc(p->param,
115                         (paramcnt+1)*sizeof(paramdef));
116  }
117 
118  memcpy((void *)(&p->param[paramcnt]),
119         (void *)&pnew, sizeof(paramdef));
120  (p->paramcnt)++;
121#if DEBUG
122  logx("AddParam() done\n");
123#endif
124}
125
126/*========================================================================*/
127void proc_set_default_var(
128  var_type type,
129  var_token varid,
130  char *varname,
131  void *varvalue
132  )
133{
134  int *i;
135  char *q;
136
137  switch(type) {
138      case VAR_NUM:
139      case VAR_BOOL:
140        i = (int *)varvalue;
141        switch(varid) {
142            case VAR_TYPECHECK: default_do_typecheck = *i; break;
143            case VAR_RETURN:    default_do_return = *i; break;
144            default:            break;
145        }
146        break;
147      case VAR_STRING:
148        q = (char *)varvalue;
149        switch(varid) {
150        }
151        break;
152      case VAR_FILE:
153        q = (char *)varvalue;
154        printf("'%s'", q);
155        break;
156
157      case VAR_FILES:
158        break;
159  }
160  printf("\n");
161 
162  return;
163}
164
165/*========================================================================*/
166void proc_set_var(
167  procdefv p,
168  var_type type,
169  var_token varid,
170  char *varname,
171  void *varvalue
172  )
173{
174  int *i;
175  char *q;
176 
177 
178//  printf(">>>>>>>>Test 4 %s()[%d] '%s' = ", p->procname, type, varname);
179  fflush(stdout);
180  switch(type) {
181      case VAR_NUM:
182      case VAR_BOOL:
183        i = (int *)varvalue;
184        switch(varid) {
185            case VAR_TYPECHECK: p->flags.do_typecheck = *i; break;
186            case VAR_RETURN:    p->flags.do_return = *i; break;
187            default:            break;
188        }
189        break;
190
191      case VAR_STRING:
192        q = (char *)varvalue;
193        switch(varid) {
194            case VAR_HELP:
195              break;
196        }
197        break;
198
199      case VAR_FILE:
200        q = (char *)varvalue;
201        //printf("'%s'", q);
202        break;
203
204      case VAR_FILES:
205        break;
206  }
207//  printf("\n");
208 
209  return;
210}
211
212/*========================================================================*/
213char *ReservedVarnames[] = {
214  "__v",
215  "__h"
216  "__res",
217  "__v_save"
218  "__tok",
219  "__index",
220  NULL 
221};
222
223int check_reseverd(
224  char *name
225  )
226{
227  int i;
228 
229  for(i=0; ReservedVarnames[i] != NULL; i++)
230    if(strcmp(ReservedVarnames[i], name)==0) return 1;
231  return 0;
232}
233 
234/*========================================================================*/
Note: See TracBrowser for help on using the repository browser.