| 10103 | } |
| 10104 | |
| 10105 | int iiArithAddCmd( |
| 10106 | const char *szName, |
| 10107 | short nAlias, |
| 10108 | short nTokval, |
| 10109 | short nToktype, |
| 10110 | short nPos |
| 10111 | ) |
| 10112 | { |
| 10113 | //printf("AddCmd(%s, %d, %d, %d, %d)\n", szName, nAlias, |
| 10114 | // nTokval, nToktype, nPos); |
| 10115 | if(nPos>=0) |
| 10116 | { |
| 10117 | // no checks: we rely on a correct generated code in iparith.inc |
| 10118 | assume((unsigned)nPos < sArithBase.nCmdAllocated); |
| 10119 | assume(szName!=NULL); |
| 10120 | sArithBase.sCmds[nPos].name = omStrDup(szName); |
| 10121 | sArithBase.sCmds[nPos].alias = nAlias; |
| 10122 | sArithBase.sCmds[nPos].tokval = nTokval; |
| 10123 | sArithBase.sCmds[nPos].toktype = nToktype; |
| 10124 | sArithBase.nCmdUsed++; |
| 10125 | //if(nTokval>0) sArithBase.nLastIdentifier++; |
| 10126 | } |
| 10127 | else |
| 10128 | { |
| 10129 | if(szName==NULL) return -1; |
| 10130 | int nIndex = iiArithFindCmd(szName); |
| 10131 | if(nIndex>=0) |
| 10132 | { |
| 10133 | Print("'%s' already exists at %d\n", szName, nIndex); |
| 10134 | return -1; |
| 10135 | } |
| 10136 | |
| 10137 | if(sArithBase.nCmdUsed>=sArithBase.nCmdAllocated) |
| 10138 | { |
| 10139 | /* needs to create new slots */ |
| 10140 | unsigned long nSize = (sArithBase.nCmdAllocated+1)*sizeof(cmdnames); |
| 10141 | sArithBase.sCmds = (cmdnames *)omRealloc(sArithBase.sCmds, nSize); |
| 10142 | if(sArithBase.sCmds==NULL) return -1; |
| 10143 | sArithBase.nCmdAllocated++; |
| 10144 | } |
| 10145 | /* still free slots available */ |
| 10146 | sArithBase.sCmds[sArithBase.nCmdUsed].name = omStrDup(szName); |
| 10147 | sArithBase.sCmds[sArithBase.nCmdUsed].alias = nAlias; |
| 10148 | sArithBase.sCmds[sArithBase.nCmdUsed].tokval = nTokval; |
| 10149 | sArithBase.sCmds[sArithBase.nCmdUsed].toktype = nToktype; |
| 10150 | sArithBase.nCmdUsed++; |
| 10151 | |
| 10152 | qsort(sArithBase.sCmds, sArithBase.nCmdUsed, sizeof(cmdnames), |
| 10153 | (&_gentable_sort_cmds)); |
| 10154 | for(sArithBase.nLastIdentifier=sArithBase.nCmdUsed-1; |
| 10155 | sArithBase.nLastIdentifier>0; sArithBase.nLastIdentifier--) |
| 10156 | { |
| 10157 | if(sArithBase.sCmds[sArithBase.nLastIdentifier].tokval>=0) break; |
| 10158 | } |
| 10159 | //Print("L=%d\n", sArithBase.nLastIdentifier); |
| 10160 | } |
| 10161 | return 0; |
| 10162 | } |