Changeset 5101


Ignore:
Timestamp:
12/12/03 17:28:24 (18 years ago)
Author:
piso
Message:

format()

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/j/src/org/armedbear/lisp/Lisp.java

    r5074 r5101  
    33 *
    44 * Copyright (C) 2002-2003 Peter Graves
    5  * $Id: Lisp.java,v 1.186 2003-12-11 20:37:22 piso Exp $
     5 * $Id: Lisp.java,v 1.187 2003-12-12 17:28:24 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    10961096    }
    10971097
     1098    public static final String format(LispObject formatControl, LispObject formatArguments)
     1099        throws ConditionThrowable
     1100    {
     1101        final LispThread thread = LispThread.currentThread();
     1102        String control = LispString.getValue(formatControl);
     1103        LispObject[] args = formatArguments.copyToArray();
     1104        StringBuffer sb = new StringBuffer();
     1105        final int limit = control.length();
     1106        int j = 0;
     1107        final int NEUTRAL = 0;
     1108        final int TILDE = 1;
     1109        int state = NEUTRAL;
     1110        for (int i = 0; i < limit; i++) {
     1111            char c = control.charAt(i);
     1112            if (state == NEUTRAL) {
     1113                if (c == '~')
     1114                    state = TILDE;
     1115                else
     1116                    sb.append(c);
     1117            } else if (state == TILDE) {
     1118                if (c == 'A' || c == 'a') {
     1119                    if (j < args.length) {
     1120                        LispObject obj = args[j++];
     1121                        Environment oldDynEnv = thread.getDynamicEnvironment();
     1122                        thread.bindSpecial(_PRINT_ESCAPE_, NIL);
     1123                        sb.append(String.valueOf(obj));
     1124                        thread.setDynamicEnvironment(oldDynEnv);
     1125                    }
     1126                } else if (c == 'S' || c == 's') {
     1127                    if (j < args.length) {
     1128                        LispObject obj = args[j++];
     1129                        Environment oldDynEnv = thread.getDynamicEnvironment();
     1130                        thread.bindSpecial(_PRINT_ESCAPE_, T);
     1131                        sb.append(String.valueOf(obj));
     1132                        thread.setDynamicEnvironment(oldDynEnv);
     1133                    }
     1134                } else if (c == 'D' || c == 'd') {
     1135                    if (j < args.length) {
     1136                        LispObject obj = args[j++];
     1137                        Environment oldDynEnv = thread.getDynamicEnvironment();
     1138                        thread.bindSpecial(_PRINT_ESCAPE_, NIL);
     1139                        thread.bindSpecial(_PRINT_RADIX_, NIL);
     1140                        thread.bindSpecial(_PRINT_BASE_, new Fixnum(10));
     1141                        sb.append(String.valueOf(obj));
     1142                        thread.setDynamicEnvironment(oldDynEnv);
     1143                    }
     1144                } else if (c == 'X' || c == 'x') {
     1145                    if (j < args.length) {
     1146                        LispObject obj = args[j++];
     1147                        Environment oldDynEnv = thread.getDynamicEnvironment();
     1148                        thread.bindSpecial(_PRINT_ESCAPE_, NIL);
     1149                        thread.bindSpecial(_PRINT_RADIX_, NIL);
     1150                        thread.bindSpecial(_PRINT_BASE_, new Fixnum(16));
     1151                        sb.append(String.valueOf(obj));
     1152                        thread.setDynamicEnvironment(oldDynEnv);
     1153                    }
     1154                } else if (c == '%') {
     1155                    sb.append(System.getProperty("line.separator"));
     1156                }
     1157                state = NEUTRAL;
     1158            } else {
     1159                // There are no other valid states.
     1160                Debug.assertTrue(false);
     1161            }
     1162        }
     1163        return sb.toString();
     1164    }
     1165
    10981166    public static final Symbol intern(String name, Package pkg)
    10991167    {
Note: See TracChangeset for help on using the changeset viewer.