📄 sds_object.c
字号:
#include "Sds/sdsgen.h"#include "Sds/sds_externs.h"#include "Sds/sds_object.h"#include <malloc.h>#if defined(__STDC__)sds_instance sds_makeobject(sds_code,sds_defined, char *, int, void *);#elsesds_instance sds_makeobject();#endif/*********************************************************************/inttlen(tlist)struct type_list *tlist;/*********************************************************************/{ int len = 0; if (tlist == TNULL) return 0; while ((tlist++)->elemcod != SDS_ENDLIST) len++; return ++len;}voidsds_delete_odef(odef)sds_odef odef;{ if (odef->tlist != (struct type_list *)0) free((char *)odef->tlist); free((char *)odef);}/*********************************************************************/sds_odefsds_new_odef()/*********************************************************************/{ sds_odef o = (sds_odef)sds_malloc(sizeof(struct sds_odef)); o->tlist = (struct type_list *)0; o->tllength = 0; o->gennames = (char *)0; return o;}sds_instancesds_instantiate(def, name, number, pointer)sds_defined def;char *name;int number;void *pointer;{ return sds_makeobject(0,def, name, number, pointer); }sds_instancesds_array(code, name, number, pointer)sds_code code;char *name;int number;void *pointer;{ return sds_makeobject(code,0, name, number, pointer); }sds_instancesds_makeobject(code,def, name, number, pointer)sds_code code;sds_defined def;char *name;int number;void *pointer;{ sds_treecon *stc = sds_treec(); int itree = stc->inst_tree; sds_tnode *ctnode = sds_get_top(itree)->down; struct sds_inst *i = malloc(sizeof(struct sds_inst)); i->name = name; i->def = def; i->code = code; i->number = number; i->pointer = pointer; i->refcount = (char)1; if (i->pointer == (void *)0) { if (i->def) { sds_desc *d = (sds_desc *)(def->data); i->pointer = sds_malloc(i->number * d->size); } else { i->pointer = sds_malloc(i->number * sds_psize(code)); } i->was_allocated = 1; } else { i->was_allocated = 0; } if (!ctnode) ctnode = sds_down_tnode(sds_get_top(itree),i); else { while(ctnode->next) ctnode = ctnode->next; ctnode = sds_next_tnode(ctnode,i); } return (sds_instance)ctnode;}/*********************************************************************/sds_defined sds_def_object(name,tlist,namelist)struct type_list *tlist;char *name,*namelist;/*********************************************************************/{ sds_tnode *n; sds_treecon *stc = sds_treec(); char *tmp; sds_odef o = sds_new_odef(); int otree = stc->odef_tree; int ncount = 0; o->tllength = tlen(tlist) + 2; o->tlist = (struct type_list *) sds_malloc(o->tllength * sizeof(struct type_list)); o->tlist_malloced = 1;/* (A size/namelist pair will be added:, and the size/alignment type pair:hence the '+2' */ o->tlist[0].elemcod = SDS_LENLIST; o->tlist[0].nelems = 0; o->tlist[1].elemcod = SDS_SIZE_ALIGN; o->tlist[1].nelems = 0; /* size of the bloody thing! */ memcpy((char *)&o->tlist[2],(char *)tlist, (o->tllength - 2) * sizeof(struct type_list)); o->gennames = sds_malloc(strlen(namelist) + 1); strcpy(o->gennames, namelist); tmp = o->gennames; while (*tmp != (char)0) { if (*tmp ==',') { *tmp = (char)0; ncount++; } tmp++; } if (ncount != o->tllength - 5) { char temp[256]; sprintf(temp,"Defining object '%s'",name); sds_push_error(SDS_NAMELIST,SDS_ERROR,temp); } n = maketree(o->tlist, SDS_INDLIST, otree, sds_get_top(otree), o->gennames, 1, name, SDS_SUN3ARC); sds_delete_odef(o); sds_start_tree(otree, n); sds_makeaddr(stc->odef_tree,0,0); return n;} sds_codesds_nelements(inst)sds_instance inst;{ sds_treecon *stc = sds_treec(); if (inst->ntree == stc->inst_tree - 1) { struct sds_inst *i = (struct sds_inst *)inst->data; return i->number; } else { struct sds_desc * d = (struct sds_desc *)inst->data; return d->nelems; }}char *sds_object_name(inst)sds_instance inst;{ sds_treecon *stc = sds_treec(); if (inst->ntree == stc->inst_tree - 1) { struct sds_inst *i = (struct sds_inst *)inst->data; return i->name; } else { struct sds_desc *d = (struct sds_desc *)inst->data; return d->name; }}char *sds_type_name(inst)sds_instance inst;{ struct sds_desc *d; sds_treecon *stc = sds_treec(); if (inst->ntree == stc->inst_tree - 1) { struct sds_inst *i = (struct sds_inst *)inst->data; d = (struct sds_desc *)i->def->data; } else d = (struct sds_desc *)inst->data; return d->name;}sds_codesds_type_code(inst)sds_instance inst;{ struct sds_desc *d; sds_treecon *stc = sds_treec(); if (inst->ntree == stc->inst_tree - 1) { struct sds_inst *i = (struct sds_inst *)inst->data; d = (struct sds_desc *)i->def->data; } else d = (struct sds_desc *)inst->data; return d->type;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -