📄 mal_atom.c
字号:
#line 122 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/mal/mal_atom.mx"#include "mal_config.h"#include "mal_atom.h"#include "mal_namespace.h"#include "mal_exception.h"#ifndef MAXPATHLEN#define MAXPATHLEN 1024#endifvoid setAtomName(InstrPtr pci){ char buf[MAXPATHLEN]; snprintf(buf,MAXPATHLEN,"#%s", getFunctionId(pci)); setFunctionId(pci, putName(buf,strlen(buf)));#ifdef MAL_ATOM_DEBUG stream_printf(GDKout,"replaced the function %s.%s\n", getModuleId(pci),getFunctionId(pci));#endif}int malAtomProperty(MalBlkPtr mb, InstrPtr pci){ str name= getFunctionId(pci); int tpe = getTypeIndex(getModuleId(pci), strlen(getModuleId(pci)), TYPE_any); (void) mb; /* fool compilers */#ifdef MAL_ATOM_DEBUG stream_printf(GDKout,"Atomproperty %s.%s\n", getModuleId(pci),getFunctionId(pci));#endif if( pci->fcn == 0) GDKwarning("malAtomProperty:function not bound\n"); if( tpe<0 || tpe>= GDKatomcnt) GDKfatal("malAtomProperty:illegal type name:%s",name); switch(name[0]){ case 'd': if( idcmp("del",name)==0 && pci->argc==1){ BATatoms[tpe].atomDel= (void (*)(Heap *, var_t *)) pci->fcn; setAtomName(pci); return 1; } break; case 'c': if( idcmp("cmp",name)==0 && pci->argc==1){ BATatoms[tpe].atomCmp= (int (*)(ptr, ptr)) pci->fcn; setAtomName(pci); return 1; } if( idcmp("convert",name)==0 && pci->argc==1){ BATatoms[tpe].atomConvert= (void (*)(ptr, int)) pci->fcn; setAtomName(pci); return 1; } break; case 'f': if( idcmp("fromstr",name)==0 && pci->argc==1){ BATatoms[tpe].atomFromStr= (int (*)(str, int *, ptr *)) pci->fcn; setAtomName(pci); return 1; } if( idcmp("fix",name)==0 && pci->argc==1){ BATatoms[tpe].atomFix= (int (*)(ptr)) pci->fcn; setAtomName(pci); return 1; } break; case 'h': if( idcmp("heap",name)==0 && pci->argc==1){ /* heap function makes an atom varsized */ BATatoms[tpe].size = sizeof(var_t); BATatoms[tpe].varsized = 1; BATatoms[tpe].align = sizeof(var_t); BATatoms[tpe].atomHeap= (void (*)(Heap *, size_t)) pci->fcn; setAtomName(pci); return 1; } if( idcmp("heapconvert",name)==0 && pci->argc==1){ BATatoms[tpe].atomHeapConvert= (void (*)(Heap *, int)) pci->fcn; setAtomName(pci); return 1; } if( idcmp("hash",name)==0 && pci->argc==1){ BATatoms[tpe].atomHash= (hash_t (*)(ptr)) pci->fcn; setAtomName(pci); return 1; } if( idcmp("heapcheck",name)==0 && pci->argc==1){ BATatoms[tpe].atomHeapCheck= (int (*)(Heap *, HeapRepair *)) pci->fcn; setAtomName(pci); return 1; } break; case 'l': if( idcmp("length",name)==0 && pci->argc==1){ BATatoms[tpe].atomLen= (int (*)(ptr)) pci->fcn; setAtomName(pci); return 1; } break; case 'n': if( idcmp("null",name)==0 && pci->argc==1){ ptr atmnull = ((ptr (*)(void)) pci->fcn) (); BATatoms[tpe].atomNull= atmnull; setAtomName(pci); return 1; } if( idcmp("nequal",name)==0 && pci->argc==1){ BATatoms[tpe].atomCmp= (int (*)(ptr, ptr)) pci->fcn; setAtomName(pci); return 1; } break; case 'p': if( idcmp("put",name)==0 && pci->argc==1){ BATatoms[tpe].atomPut= (var_t (*)(Heap *, var_t *, ptr)) pci->fcn; setAtomName(pci); return 1; } break; case 's': #line 98 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/mal/mal_atom.mx"if( idcmp("storage",name) || pci->argc != 1) return 0;else{#ifdef MAL_ATOM_DEBUG stream_printf(GDKout,"set the atom property %s.%s\n", getModuleId(pci),getFunctionId(pci));#endif BATatoms[tpe].storage= (long) (*pci->fcn)(); setAtomName(pci); return 1;}#line 240 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/mal/mal_atom.mx"; break; case 't': if( idcmp("tostr",name)==0 && pci->argc==1){ BATatoms[tpe].atomToStr= (int (*)(str *, int *, ptr)) pci->fcn; setAtomName(pci); return 1; } break; case 'u': if( idcmp("unfix",name)==0 && pci->argc==1){ BATatoms[tpe].atomUnfix= (int (*)(ptr)) pci->fcn; setAtomName(pci); return 1; } break; case 'v': #line 98 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/mal/mal_atom.mx"if( idcmp("varsized",name) || pci->argc != 1) return 0;else{#ifdef MAL_ATOM_DEBUG stream_printf(GDKout,"set the atom property %s.%s\n", getModuleId(pci),getFunctionId(pci));#endif BATatoms[tpe].varsized= (long) (*pci->fcn)(); setAtomName(pci); return 1;}#line 257 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/mal/mal_atom.mx" break; case 'r': if( idcmp("read",name)==0 && pci->argc==1){ BATatoms[tpe].atomRead= (void *(*)(void *, stream *, size_t)) pci->fcn; setAtomName(pci); return 1; } break; case 'w': if( idcmp("write",name)==0 && pci->argc==1){ BATatoms[tpe].atomWrite= (int (*)(void *, stream *, size_t)) pci->fcn; setAtomName(pci); return 1; } break; } return 0;}#line 283 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/mal/mal_atom.mx"void malAtomDefinition(str name, int tpe){ int i; if(strlen(name) >= IDLENGTH){ showException(SYNTAX,"atomDefinition", "Atom name '%s' too long", name); return; } if( ATOMindex(name)>=0){ showException(TYPE,"atomDefinition", "Redefinition of atom '%s'", name); return; } if( tpe<0 || tpe >=GDKatomcnt){ showException(TYPE,"atomDefinition", "Undefined atom inheritance '%s'", name); return; }#ifdef MAL_ATOM_DEBUG stream_printf(GDKout,"introduce a new atom type '%s' %d\n",name,tpe);#endif ATOMproperty(name,"", (int (*)()) 0); i= ATOMindex(name); /* overload atom ? */ if (tpe) { memcpy((char*)(BATatoms+i), (char*)(BATatoms+tpe), sizeof(BATatoms[tpe])); strncpy(BATatoms[i].name, name, IDLENGTH); BATatoms[i].storage= BATatoms[tpe].storage; } else { /* cannot overload void atoms */ BATatoms[i].storage = i; }}#line 319 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/mal/mal_atom.mx"int malAtomFixed(int size, int align, char *name){ int i = 0; ATOMproperty(name,"", (int (*)()) 0); i= ATOMindex(name); memcpy((char*)(BATatoms+i), (char*)(BATatoms+TYPE_chr), sizeof(BATatoms[TYPE_chr])); strncpy(BATatoms[i].name, name, IDLENGTH); BATatoms[i].storage= i; BATatoms[i].size = size; BATatoms[i].align = align; BATatoms[i].linear = FALSE; return i;}int malAtomArray(int tpe, int size){ int i; char name[IDLENGTH]; str nme; nme = getTypeName(tpe); stream_printf(GDKout,"enter a new array type definition %s %d\n", nme,size); snprintf(name,IDLENGTH,"%s_", nme); i= strlen(name); snprintf(name+i,IDLENGTH-i,"%d", size); GDKfree(nme); if(strlen(name) >= IDLENGTH){ showException(SYNTAX,"atomArray", "Atom name '%s' too long", name); return -1; /* ERROR! */ }#ifdef MAL_ATOM_DEBUG stream_printf(GDKout,"new type name %s\n",name);#endif ATOMproperty(name,"", (int (*)()) 0); i= ATOMindex(name); memcpy((char*)(BATatoms+i), (char*)(BATatoms+tpe), sizeof(BATatoms[tpe])); strncpy(BATatoms[i].name, name, IDLENGTH); BATatoms[i].storage= tpe; BATatoms[i].size *= size; BATatoms[i].linear = FALSE;#ifdef MAL_ATOM_DEBUG stream_printf(GDKout,"new type %d\n",i);#endif return i;}void showAtoms(stream *fd){ int i; for(i=0;BATatoms[i].name[0] && i<TYPE_any; i++){ stream_printf(fd,"%s", BATatoms[i].name); if( BATatoms[i+1].name[0]) stream_printf(fd,","); } stream_printf(fd,"\n");}#line 375 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/mal/mal_atom.mx"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -