prefix = (String) parameters.get ("prefix"); suffix = (String) parameters.get ("suffix");
	public Macro (int start, int end) {	    this.start = start;	    this.end = end;	    parameters = new HashMap ();	    int state = HANDLER;	    boolean escape = false;	    char quotechar = '\u0000';	    String lastParamName = null;	    StringBuffer b = new StringBuffer();	    for (int i=start+2; i<end-2; i++) {	        switch (source[i]) {	            case '.':	                if (state == HANDLER) {	                    handler = b.toString ().trim();	                    b.setLength (0);	                    state = MACRO;	                } else	                    b.append (source[i]);	                break;	            case '\\':	                if (escape)	                    b.append (source[i]);	                escape = !escape;	                break;	            case '"':	            case '\'':	                if (!escape && state == PARAMVALUE) {	                    if (quotechar == source[i]) {	                        parameters.put (lastParamName, b.toString());	                        lastParamName = null;	                        b.setLength (0);	                        state = PARAMNAME;	                        quotechar = '\u0000';	                    } else if (quotechar == '\u0000') {	                        quotechar = source[i];	                        b.setLength (0);	                    } else	                        b.append (source[i]);	                } else	                    b.append (source[i]);	                escape = false;	                break;	            case ' ':	            case '\t':	            case '\n':	            case '\r':	            case '\f':	                if (state == MACRO || (state == HANDLER && b.length() > 0)) {	                    name = b.toString().trim();	                    b.setLength (0);	                    state = PARAMNAME;	                } else if (state == PARAMVALUE && quotechar == '\u0000') {	                    parameters.put (lastParamName, b.toString());	                    lastParamName = null;	                    b.setLength (0);	                    state = PARAMNAME;	                } else if (state == PARAMVALUE)	                    b.append (source[i]);	                else	                    b.setLength (0);	                break;	            case '=':	                if (state == PARAMNAME) {	                    lastParamName = b.toString().trim();	                    b.setLength (0);	                    state = PARAMVALUE;	                } else	                    b.append (source[i]);	                break;	            default:	                b.append (source[i]);	                escape = false;	        }	    }	    if (b.length() > 0) {	        if (lastParamName != null && b.length() > 0)	            parameters.put (lastParamName, b.toString());	        else if (state <= MACRO)	            name = b.toString().trim();	    }	}