
ij.macro.Program Maven / Gradle / Ivy
package ij.macro;
import ij.*;
import java.util.Hashtable;
/** An object of this type is a tokenized macro file and the associated symbol table. */
public class Program implements MacroConstants {
private int maxSymbols = 800; // will be increased as needed
private int maxProgramSize = 2000; // well be increased as needed
private int pc = -1;
int stLoc = -1;
int symTabLoc;
Symbol[] table = new Symbol[maxSymbols];
static Symbol[] systemTable;
int[] code = new int[maxProgramSize];
int[] lineNumbers = new int[maxProgramSize];
Variable[] globals;
boolean hasVars, hasFunctions;
int macroCount;
Hashtable menus;
// run keyboard shortcut macros on event dispatch thread?
boolean queueCommands;
Hashtable extensionRegistry;
public Program() {
if (systemTable!=null) {
stLoc = systemTable.length - 1;
for (int i=0; i<=stLoc; i++)
table[i] = systemTable[i];
} else {
//IJ.log("make table");
addKeywords();
addFunctions();
addNumericFunctions();
addStringFunctions();
addArrayFunctions();
systemTable = new Symbol[stLoc+1];
for (int i=0; i<=stLoc; i++)
systemTable[i] = table[i];
IJ.register(Program.class);
}
}
public int[] getCode() {
return code;
}
public Symbol[] getSymbolTable() {
return table;
}
void addKeywords() {
for (int i=0; i>TOK_SHIFT);
}
String decodeToken(int token, int address) {
String str;
switch (token) {
case WORD:
case PREDEFINED_FUNCTION:
case NUMERIC_FUNCTION:
case STRING_FUNCTION:
case ARRAY_FUNCTION:
case USER_FUNCTION:
str = table[address].str;
break;
case STRING_CONSTANT:
str = "\""+table[address].str+"\"";
break;
case NUMBER:
double v = table[address].value;
if ((int)v==v)
str = IJ.d2s(v,0);
else
str = ""+v;
break;
case EOF:
str = "EOF";
break;
default:
if (token<32) {
switch (token) {
case PLUS_PLUS:
str="++";
break;
case MINUS_MINUS:
str="--";
break;
case PLUS_EQUAL:
str="+=";
break;
case MINUS_EQUAL:
str="-=";
break;
case MUL_EQUAL:
str="*=";
break;
case DIV_EQUAL:
str="/=";
break;
case LOGICAL_AND:
str="&&";
break;
case LOGICAL_OR:
str="||";
break;
case EQ:
str="==";
break;
case NEQ:
str="!=";
break;
case GT:
str=">";
break;
case GTE:
str=">=";
break;
case LT:
str="<";
break;
case LTE:
str="<=";
break;
default:
str="";
break;
}
} else if (token>=200) {
str = table[address].str;
} else {
char s[] = new char[1];
s[0] = (char)token;
str = new String(s);
}
break;
}
return str;
}
public Hashtable getMenus() {
return menus;
}
// Returns 'true' if this macro program contains the specified word. */
public boolean hasWord(String word) {
int token, tokenAddress;
for (int i=0; i>TOK_SHIFT;
String str = table[tokenAddress].str;
if (str!=null && str.equals(word)) return true;
}
return false;
}
public int getSize() {
return pc;
}
} // Program
© 2015 - 2025 Weber Informatics LLC | Privacy Policy