1 ////////////////////////////////////////////////////////////////////////////////
2 // MillScript: an Open Spice interpreter and batch website creation tool
3 // Copyright (C) 2001-2004 Open World Ltd
4 // Copyright (C) 2005 Kevin Rogers
5 //
6 // This file is part of MillScript.
7 //
8 // MillScript is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU General Public License as published by the Free
10 // Software Foundation; either version 2 of the License, or (at your option)
11 // any later version.
12 //
13 // MillScript is distributed in the hope that it will be useful, but WITHOUT
14 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16 // more details.
17 //
18 // You should have received a copy of the GNU General Public License along with
19 // MillScript; if not, write to the Free Software Foundation, Inc., 59 Temple
20 // Place, Suite 330, Boston, MA 02111-1307 USA
21 ////////////////////////////////////////////////////////////////////////////////
22 package org.millscript.millscript.functions;
23
24 import org.millscript.commons.util.IList;
25 import org.millscript.millscript.alert.Alerts;
26 import org.millscript.millscript.datatypes.XmlComment;
27 import org.millscript.millscript.tools.FormatPrint;
28 import org.millscript.millscript.vm.Machine;
29
30 import java.io.PrintWriter;
31 import java.io.StringWriter;
32
33 /**
34 * This class implements the MillScript <code>format</code> function.
35 */
36 public class FormatFunction extends Function {
37
38 /**
39 * @see org.millscript.millscript.functions.Function#apply(org.millscript.millscript.vm.Machine, int)
40 */
41 @Override
42 public void apply( final Machine mc, final int nargs ) {
43
44 final IList< Object > list = mc.popArgsList( nargs - 1, false );
45
46 StringWriter sw = new StringWriter();
47 PrintWriter out = new PrintWriter( sw );
48
49 // Get the control object.
50 // (it contains the %p, etc)
51 Object control = mc.popObject();
52
53 // We can format a String or an XmlComment.
54 if ( control instanceof String ) {
55 // Pass the String straight through to FormatPrint.
56 FormatPrint.print( out, (String)control, list );
57 // Return the formatted String.
58 mc.pushObject( sw.toString() );
59 } else if ( control instanceof XmlComment ) {
60 // Pass the XML comment's contents to FormatPrint.
61 FormatPrint.print( out, ((XmlComment)control).getText(), list );
62 // Return a new formatted XmlComment.
63 mc.pushObject( new XmlComment( sw.toString() ) );
64 } else {
65 throw(
66 Alerts.eval(
67 "Cannot format object",
68 "Only Strings and XML comments can be formatted"
69 ).culprit( "object", control ).mishap()
70 );
71 }
72 }
73
74 }