static meMacro * createMacro(meUByte *name) { meUByte buff[meBUF_SIZE_MAX] ; register meMacro *mac ; register meLine *hlp ; register int idx ; /* If the macro name has not been give then try and get one */ if((name == NULL) && (meGetString((meUByte *)"Macro name",MLCOMMAND|MLEXECNOUSER, 0, buff, meBUF_SIZE_MAX) > 0) && (buff[0] != '\0')) name = buff ; if((name == NULL) || ((hlp = meLineMalloc(0,0)) == NULL)) return NULL ; /* if it already exists */ if((idx = decode_fncname(name,1)) >= 0) { /* if function return error, else clear the buffer */ if(idx < CK_MAX) { mlwrite(MWABORT|MWPAUSE,(meUByte *)"Error! can't re-define a base function") ; meFree(hlp) ; return NULL ; } mac = getMacro(idx) ; if(!(mac->hlp->flag & meMACRO_EXEC)) { #if MEOPT_EXTENDED if(mac->hlp->flag & meMACRO_FILE) { if(meNullFree(mac->fname)) mac->fname = NULL ; } #endif meLineLoopFree(mac->hlp,1) ; } } else { meCommand **cmd ; if((cmdTableSize & 0x1f) == 0) { /* run out of room in the command table, malloc more */ meCommand **nt ; if((nt = (meCommand **) meMalloc((cmdTableSize+0x20)*sizeof(meCommand *))) == NULL) return NULL ; memcpy(nt,cmdTable,cmdTableSize*sizeof(meCommand *)) ; if(cmdTable != __cmdTable) free(cmdTable) ; cmdTable = nt ; } if(((mac = (meMacro *) meMalloc(sizeof(meMacro))) == NULL) || ((mac->name = meStrdup(name)) == NULL)) { meFree(hlp) ; return NULL ; } mac->id = cmdTableSize ; #if MEOPT_EXTENDED mac->varList.head = NULL ; mac->varList.count = 0 ; mac->fname = NULL ; mac->callback = -1 ; #endif cmdTable[cmdTableSize++] = (meCommand *) mac ; /* insert macro into the alphabetic list */ cmd = &(cmdHead) ; while((*cmd != NULL) && (meStrcmp((*cmd)->name,name) < 0)) cmd = &((*cmd)->anext) ; mac->anext = *cmd ; *cmd = (meCommand *) mac ; #if MEOPT_CMDHASH /* insert macro into the hash table */ { meUInt key ; mac->hnext = NULL ; key = cmdHashFunc(name) ; cmd = &(cmdHash[key]) ; while(*cmd != NULL) cmd = &((*cmd)->hnext) ; *cmd = (meCommand *) mac ; } #endif } mac->hlp = hlp ; hlp->next = hlp ; hlp->prev = hlp ; return mac ; }
/* * regRead * Open the specified registory. * Mode options are:- * * default - Exists in memory * meREGMODE_RELOAD - Delete the existing file, * meREGMODE_MERGE - Merge the existing file. */ meRegNode * regRead(meUByte *rname, meUByte *fname, int mode) { meLine hlp, *lp ; meUByte *fn ; meRegNode *rnp; /* Root node pointer */ meUInt flags ; /* Find the registry entry */ if(*rname == '/') rname++; if ((rnp = rnodeFind (&root, rname)) != NULL) { /* if not merging or reloading then we've can use the existing node */ if (!(mode & (meREGMODE_MERGE|meREGMODE_RELOAD))) goto finished; fn = rnp->value ; } else fn = NULL ; if(mode & meREGMODE_FROOT) { /* find the registry file */ /* have we been given a valid file name ? */ if ((fname != NULL) && (fname [0] != '\0')) { meUByte filename[meBUF_SIZE_MAX] ; /* Filename */ if(fileLookup(fname,(meUByte *)".erf",meFL_CHECKDOT|meFL_USESRCHPATH,filename)) fn = meStrdup(filename) ; else fn = meStrdup(fname) ; } /* else use the old file name (if there is one) else fail */ else if(fn == NULL) { mlwrite(MWABORT|MWWAIT,(meUByte *)"[No file name given to load]") ; return NULL ; } /* Load in the registry file */ flags = meRWFLAG_SILENT ; hlp.next = &hlp ; hlp.prev = &hlp ; if(mode & meREGMODE_CRYPT) { meUByte s1[meBUF_SIZE_MAX], *s2 ; int len ; meCrypt(NULL,0); meStrcpy(s1,getFileBaseName(fn)) ; len = meStrlen(s1) + 1 ; meCrypt(s1,len) ; if((s2=meUserName) == NULL) s2 = (meUByte *) "" ; meStrcpy(s1+len,s2) ; meCrypt(s1,len+meStrlen(s1+len)+1) ; flags |= meRWFLAG_CRYPT ; } if((ffReadFile(fn,flags,NULL,&hlp,0,0,0) == meABORT) && !(mode & meREGMODE_CREATE)) { mlwrite (MWABORT|MWWAIT,(meUByte *)"[Cannot load registry file %s]", fname); return NULL ; } lp = &hlp ; } else lp = frameCur->bufferCur->baseLine ; if ((rnp != NULL) && (mode & meREGMODE_RELOAD)) { /* Want to replace with new one. so delete old */ if(fn == rnp->value) rnp->value = NULL ; rnodeUnlink (rnp); rnodeDelete (rnp); rnp = NULL; } /* Construct the node for the file node */ if (rnp == NULL) { /* Construct the node */ if((rnp = regSet (&root, rname, NULL)) == NULL) return NULL ; rnp->mode = 0; } /* set the new file name */ if(rnp->value != fn) { meNullFree(rnp->value) ; rnp->value = fn ; } /* Now parse the registry file */ parseFile(rnp, lp) ; if(mode & meREGMODE_FROOT) meLineLoopFree(lp,0) ; finished: rnp->mode |= mode & meREGMODE_STORE_MASK ; return rnp ; }