src/share/tools/ProjectCreator/WinGammaPlatform.java

Thu, 29 Mar 2012 16:43:21 +0200

author
neliasso
date
Thu, 29 Mar 2012 16:43:21 +0200
changeset 4112
1a9b9cfcef41
parent 2675
74e790c48cd4
child 4153
b9a9ed0f8eeb
permissions
-rw-r--r--

7163863: Updated projectcreator
Summary: Enable source browsing for all platform dependent code
Reviewed-by: brutisso, coleenp

duke@435 1 /*
sla@2540 2 * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
duke@435 22 *
duke@435 23 */
duke@435 24
sla@2369 25 import java.io.File;
sla@2369 26 import java.io.IOException;
sla@2369 27 import java.io.PrintWriter;
sla@2369 28 import java.util.Enumeration;
sla@2369 29 import java.util.Hashtable;
sla@2369 30 import java.util.Iterator;
sla@2369 31 import java.util.List;
neliasso@4112 32 import java.util.Stack;
sla@2369 33 import java.util.TreeSet;
sla@2369 34 import java.util.Vector;
duke@435 35
duke@435 36 abstract class HsArgHandler extends ArgHandler {
duke@435 37 static final int STRING = 1;
duke@435 38 static final int VECTOR = 2;
duke@435 39 static final int HASH = 3;
duke@435 40
duke@435 41 boolean nextNotKey(ArgIterator it) {
duke@435 42 if (it.next()) {
duke@435 43 String s = it.get();
duke@435 44 return (s.length() == 0) || (s.charAt(0) != '-');
duke@435 45 } else {
duke@435 46 return false;
duke@435 47 }
duke@435 48 }
duke@435 49
duke@435 50 void empty(String key, String message) {
duke@435 51 if (key != null) {
duke@435 52 System.err.println("** Error: empty " + key);
duke@435 53 }
duke@435 54 if (message != null) {
duke@435 55 System.err.println(message);
duke@435 56 }
duke@435 57 WinGammaPlatform.usage();
duke@435 58 }
duke@435 59
duke@435 60 static String getCfg(String val) {
duke@435 61 int under = val.indexOf('_');
duke@435 62 int len = val.length();
duke@435 63 if (under != -1 && under < len - 1) {
duke@435 64 return val.substring(under+1, len);
duke@435 65 } else {
duke@435 66 return null;
duke@435 67 }
duke@435 68 }
duke@435 69 }
duke@435 70
duke@435 71 class ArgRuleSpecific extends ArgRule {
duke@435 72 ArgRuleSpecific(String arg, ArgHandler handler) {
duke@435 73 super(arg, handler);
duke@435 74 }
duke@435 75
duke@435 76 boolean match(String rulePattern, String arg) {
duke@435 77 return rulePattern.startsWith(arg);
duke@435 78 }
duke@435 79 }
duke@435 80
duke@435 81
duke@435 82 class SpecificHsArgHandler extends HsArgHandler {
duke@435 83
duke@435 84 String message, argKey, valKey;
duke@435 85 int type;
duke@435 86
duke@435 87 public void handle(ArgIterator it) {
duke@435 88 String cfg = getCfg(it.get());
duke@435 89 if (nextNotKey(it)) {
duke@435 90 String val = it.get();
duke@435 91 switch (type) {
duke@435 92 case VECTOR:
duke@435 93 BuildConfig.addFieldVector(cfg, valKey, val);
duke@435 94 break;
duke@435 95 case HASH:
duke@435 96 BuildConfig.putFieldHash(cfg, valKey, val, "1");
duke@435 97 break;
duke@435 98 case STRING:
duke@435 99 BuildConfig.putField(cfg, valKey, val);
duke@435 100 break;
duke@435 101 default:
duke@435 102 empty(valKey, "Unknown type: "+type);
duke@435 103 }
duke@435 104 it.next();
duke@435 105
duke@435 106 } else {
duke@435 107 empty(argKey, message);
duke@435 108 }
duke@435 109 }
duke@435 110
duke@435 111 SpecificHsArgHandler(String argKey, String valKey, String message, int type) {
duke@435 112 this.argKey = argKey;
duke@435 113 this.valKey = valKey;
duke@435 114 this.message = message;
duke@435 115 this.type = type;
duke@435 116 }
duke@435 117 }
duke@435 118
duke@435 119
duke@435 120 class HsArgRule extends ArgRuleSpecific {
duke@435 121
duke@435 122 HsArgRule(String argKey, String valKey, String message, int type) {
duke@435 123 super(argKey, new SpecificHsArgHandler(argKey, valKey, message, type));
duke@435 124 }
duke@435 125
duke@435 126 }
duke@435 127
stefank@2314 128 public abstract class WinGammaPlatform {
duke@435 129
duke@435 130 public boolean fileNameStringEquality(String s1, String s2) {
duke@435 131 return s1.equalsIgnoreCase(s2);
duke@435 132 }
duke@435 133
duke@435 134 static void usage() throws IllegalArgumentException {
duke@435 135 System.err.println("WinGammaPlatform platform-specific options:");
duke@435 136 System.err.println(" -sourceBase <path to directory (workspace) " +
duke@435 137 "containing source files; no trailing slash>");
duke@435 138 System.err.println(" -projectFileName <full pathname to which project file " +
duke@435 139 "will be written; all parent directories must " +
duke@435 140 "already exist>");
duke@435 141 System.err.println(" If any of the above are specified, "+
duke@435 142 "they must all be.");
duke@435 143 System.err.println(" Additional, optional arguments, which can be " +
duke@435 144 "specified multiple times:");
duke@435 145 System.err.println(" -absoluteInclude <string containing absolute " +
duke@435 146 "path to include directory>");
duke@435 147 System.err.println(" -relativeInclude <string containing include " +
duke@435 148 "directory relative to -sourceBase>");
duke@435 149 System.err.println(" -define <preprocessor flag to be #defined " +
duke@435 150 "(note: doesn't yet support " +
duke@435 151 "#define (flag) (value))>");
duke@435 152 System.err.println(" -startAt <subdir of sourceBase>");
duke@435 153 System.err.println(" -additionalFile <file not in database but " +
stefank@2314 154 "which should show up in project file>");
duke@435 155 System.err.println(" -additionalGeneratedFile <absolute path to " +
duke@435 156 "directory containing file; no trailing slash> " +
duke@435 157 "<name of file generated later in the build process>");
duke@435 158 throw new IllegalArgumentException();
duke@435 159 }
duke@435 160
duke@435 161
duke@435 162 public void addPerFileLine(Hashtable table,
duke@435 163 String fileName,
duke@435 164 String line) {
duke@435 165 Vector v = (Vector) table.get(fileName);
duke@435 166 if (v != null) {
duke@435 167 v.add(line);
duke@435 168 } else {
duke@435 169 v = new Vector();
duke@435 170 v.add(line);
duke@435 171 table.put(fileName, v);
duke@435 172 }
duke@435 173 }
duke@435 174
duke@435 175 protected static class PerFileCondData {
duke@435 176 public String releaseString;
duke@435 177 public String debugString;
duke@435 178 }
duke@435 179
duke@435 180 protected void addConditionalPerFileLine(Hashtable table,
duke@435 181 String fileName,
duke@435 182 String releaseLine,
duke@435 183 String debugLine) {
duke@435 184 PerFileCondData data = new PerFileCondData();
duke@435 185 data.releaseString = releaseLine;
duke@435 186 data.debugString = debugLine;
duke@435 187 Vector v = (Vector) table.get(fileName);
duke@435 188 if (v != null) {
duke@435 189 v.add(data);
duke@435 190 } else {
duke@435 191 v = new Vector();
duke@435 192 v.add(data);
duke@435 193 table.put(fileName, v);
duke@435 194 }
duke@435 195 }
duke@435 196
duke@435 197 protected static class PrelinkCommandData {
duke@435 198 String description;
duke@435 199 String commands;
duke@435 200 }
duke@435 201
duke@435 202 protected void addPrelinkCommand(Hashtable table,
duke@435 203 String build,
duke@435 204 String description,
duke@435 205 String commands) {
duke@435 206 PrelinkCommandData data = new PrelinkCommandData();
duke@435 207 data.description = description;
duke@435 208 data.commands = commands;
duke@435 209 table.put(build, data);
duke@435 210 }
duke@435 211
duke@435 212 public boolean findString(Vector v, String s) {
duke@435 213 for (Iterator iter = v.iterator(); iter.hasNext(); ) {
duke@435 214 if (((String) iter.next()).equals(s)) {
duke@435 215 return true;
duke@435 216 }
duke@435 217 }
duke@435 218
duke@435 219 return false;
duke@435 220 }
duke@435 221
duke@435 222 String getProjectName(String fullPath, String extension)
duke@435 223 throws IllegalArgumentException, IOException {
duke@435 224 File file = new File(fullPath).getCanonicalFile();
duke@435 225 fullPath = file.getCanonicalPath();
duke@435 226 String parent = file.getParent();
duke@435 227
duke@435 228 if (!fullPath.endsWith(extension)) {
duke@435 229 throw new IllegalArgumentException("project file name \"" +
duke@435 230 fullPath +
duke@435 231 "\" does not end in "+extension);
duke@435 232 }
duke@435 233
duke@435 234 if ((parent != null) &&
duke@435 235 (!fullPath.startsWith(parent))) {
duke@435 236 throw new RuntimeException(
duke@435 237 "Internal error: parent of file name \"" + parent +
duke@435 238 "\" does not match file name \"" + fullPath + "\""
duke@435 239 );
duke@435 240 }
duke@435 241
duke@435 242 int len = parent.length();
duke@435 243 if (!parent.endsWith(Util.sep)) {
duke@435 244 len += Util.sep.length();
duke@435 245 }
duke@435 246
duke@435 247 int end = fullPath.length() - extension.length();
duke@435 248
duke@435 249 if (len == end) {
duke@435 250 throw new RuntimeException(
duke@435 251 "Internal error: file name was empty"
duke@435 252 );
duke@435 253 }
duke@435 254
duke@435 255 return fullPath.substring(len, end);
duke@435 256 }
duke@435 257
duke@435 258 protected abstract String getProjectExt();
duke@435 259
stefank@2314 260 public void createVcproj(String[] args)
duke@435 261 throws IllegalArgumentException, IOException {
duke@435 262
duke@435 263 parseArguments(args);
duke@435 264
duke@435 265 String projectFileName = BuildConfig.getFieldString(null, "ProjectFileName");
duke@435 266 String ext = getProjectExt();
duke@435 267
duke@435 268 String projectName = getProjectName(projectFileName, ext);
duke@435 269
sla@2540 270 writeProjectFile(projectFileName, projectName, createAllConfigs(BuildConfig.getFieldString(null, "PlatformName")));
duke@435 271 }
duke@435 272
duke@435 273 protected void writePrologue(String[] args) {
duke@435 274 System.err.println("WinGammaPlatform platform-specific arguments:");
duke@435 275 for (int i = 0; i < args.length; i++) {
duke@435 276 System.err.print(args[i] + " ");
duke@435 277 }
duke@435 278 System.err.println();
duke@435 279 }
duke@435 280
duke@435 281
duke@435 282 void parseArguments(String[] args) {
duke@435 283 new ArgsParser(args,
duke@435 284 new ArgRule[]
duke@435 285 {
sla@2369 286 new ArgRule("-sourceBase",
sla@2369 287 new HsArgHandler() {
sla@2369 288 public void handle(ArgIterator it) {
sla@2369 289 String cfg = getCfg(it.get());
sla@2369 290 if (nextNotKey(it)) {
sla@2369 291 String sb = (String) it.get();
sla@2369 292 if (sb.endsWith(Util.sep)) {
sla@2369 293 sb = sb.substring(0, sb.length() - 1);
sla@2369 294 }
sla@2369 295 BuildConfig.putField(cfg, "SourceBase", sb);
sla@2369 296 it.next();
sla@2369 297 } else {
sla@2369 298 empty("-sourceBase", null);
sla@2369 299 }
sla@2369 300 }
sla@2369 301 }
sla@2369 302 ),
duke@435 303
duke@435 304 new HsArgRule("-buildBase",
duke@435 305 "BuildBase",
duke@435 306 " (Did you set the HotSpotBuildSpace environment variable?)",
duke@435 307 HsArgHandler.STRING
duke@435 308 ),
duke@435 309
neliasso@4112 310 new HsArgRule("-buildSpace",
neliasso@4112 311 "BuildSpace",
neliasso@4112 312 null,
neliasso@4112 313 HsArgHandler.STRING
neliasso@4112 314 ),
neliasso@4112 315
sla@2540 316 new HsArgRule("-platformName",
sla@2540 317 "PlatformName",
sla@2540 318 null,
sla@2540 319 HsArgHandler.STRING
sla@2540 320 ),
sla@2540 321
sla@2540 322 new HsArgRule("-projectFileName",
duke@435 323 "ProjectFileName",
duke@435 324 null,
duke@435 325 HsArgHandler.STRING
duke@435 326 ),
duke@435 327
duke@435 328 new HsArgRule("-jdkTargetRoot",
duke@435 329 "JdkTargetRoot",
duke@435 330 " (Did you set the HotSpotJDKDist environment variable?)",
duke@435 331 HsArgHandler.STRING
duke@435 332 ),
duke@435 333
duke@435 334 new HsArgRule("-compiler",
duke@435 335 "CompilerVersion",
duke@435 336 " (Did you set the VcVersion correctly?)",
duke@435 337 HsArgHandler.STRING
duke@435 338 ),
duke@435 339
duke@435 340 new HsArgRule("-absoluteInclude",
duke@435 341 "AbsoluteInclude",
duke@435 342 null,
duke@435 343 HsArgHandler.VECTOR
duke@435 344 ),
duke@435 345
duke@435 346 new HsArgRule("-relativeInclude",
duke@435 347 "RelativeInclude",
duke@435 348 null,
duke@435 349 HsArgHandler.VECTOR
duke@435 350 ),
duke@435 351
neliasso@4112 352 new HsArgRule("-absoluteSrcInclude",
neliasso@4112 353 "AbsoluteSrcInclude",
neliasso@4112 354 null,
neliasso@4112 355 HsArgHandler.VECTOR
neliasso@4112 356 ),
neliasso@4112 357
neliasso@4112 358 new HsArgRule("-relativeSrcInclude",
neliasso@4112 359 "RelativeSrcInclude",
neliasso@4112 360 null,
neliasso@4112 361 HsArgHandler.VECTOR
neliasso@4112 362 ),
neliasso@4112 363
duke@435 364 new HsArgRule("-define",
duke@435 365 "Define",
duke@435 366 null,
duke@435 367 HsArgHandler.VECTOR
duke@435 368 ),
duke@435 369
duke@435 370 new HsArgRule("-useToGeneratePch",
duke@435 371 "UseToGeneratePch",
duke@435 372 null,
duke@435 373 HsArgHandler.STRING
duke@435 374 ),
duke@435 375
duke@435 376 new ArgRuleSpecific("-perFileLine",
duke@435 377 new HsArgHandler() {
duke@435 378 public void handle(ArgIterator it) {
duke@435 379 String cfg = getCfg(it.get());
duke@435 380 if (nextNotKey(it)) {
duke@435 381 String fileName = it.get();
duke@435 382 if (nextNotKey(it)) {
duke@435 383 String line = it.get();
duke@435 384 BuildConfig.putFieldHash(cfg, "PerFileLine", fileName, line);
duke@435 385 it.next();
duke@435 386 return;
duke@435 387 }
duke@435 388 }
duke@435 389 empty(null, "** Error: wrong number of args to -perFileLine");
duke@435 390 }
duke@435 391 }
duke@435 392 ),
duke@435 393
duke@435 394 new ArgRuleSpecific("-conditionalPerFileLine",
duke@435 395 new HsArgHandler() {
duke@435 396 public void handle(ArgIterator it) {
duke@435 397 String cfg = getCfg(it.get());
duke@435 398 if (nextNotKey(it)) {
duke@435 399 String fileName = it.get();
duke@435 400 if (nextNotKey(it)) {
duke@435 401 String productLine = it.get();
duke@435 402 if (nextNotKey(it)) {
duke@435 403 String debugLine = it.get();
duke@435 404 BuildConfig.putFieldHash(cfg+"_debug", "CondPerFileLine",
duke@435 405 fileName, debugLine);
duke@435 406 BuildConfig.putFieldHash(cfg+"_product", "CondPerFileLine",
duke@435 407 fileName, productLine);
duke@435 408 it.next();
duke@435 409 return;
duke@435 410 }
duke@435 411 }
duke@435 412 }
duke@435 413
duke@435 414 empty(null, "** Error: wrong number of args to -conditionalPerFileLine");
duke@435 415 }
duke@435 416 }
duke@435 417 ),
duke@435 418
duke@435 419 new HsArgRule("-disablePch",
duke@435 420 "DisablePch",
duke@435 421 null,
duke@435 422 HsArgHandler.HASH
duke@435 423 ),
duke@435 424
duke@435 425 new ArgRule("-startAt",
duke@435 426 new HsArgHandler() {
duke@435 427 public void handle(ArgIterator it) {
duke@435 428 if (BuildConfig.getField(null, "StartAt") != null) {
duke@435 429 empty(null, "** Error: multiple -startAt");
duke@435 430 }
duke@435 431 if (nextNotKey(it)) {
duke@435 432 BuildConfig.putField(null, "StartAt", it.get());
duke@435 433 it.next();
duke@435 434 } else {
duke@435 435 empty("-startAt", null);
duke@435 436 }
duke@435 437 }
duke@435 438 }
duke@435 439 ),
duke@435 440
duke@435 441 new HsArgRule("-ignoreFile",
duke@435 442 "IgnoreFile",
duke@435 443 null,
duke@435 444 HsArgHandler.HASH
duke@435 445 ),
duke@435 446
stefank@2314 447 new HsArgRule("-ignorePath",
stefank@2314 448 "IgnorePath",
stefank@2314 449 null,
stefank@2314 450 HsArgHandler.VECTOR
stefank@2314 451 ),
stefank@2314 452
neliasso@4112 453 new HsArgRule("-hidePath",
neliasso@4112 454 "HidePath",
neliasso@4112 455 null,
neliasso@4112 456 HsArgHandler.VECTOR
neliasso@4112 457 ),
neliasso@4112 458
duke@435 459 new HsArgRule("-additionalFile",
duke@435 460 "AdditionalFile",
duke@435 461 null,
duke@435 462 HsArgHandler.VECTOR
duke@435 463 ),
duke@435 464
duke@435 465 new ArgRuleSpecific("-additionalGeneratedFile",
duke@435 466 new HsArgHandler() {
duke@435 467 public void handle(ArgIterator it) {
duke@435 468 String cfg = getCfg(it.get());
duke@435 469 if (nextNotKey(it)) {
duke@435 470 String dir = it.get();
duke@435 471 if (nextNotKey(it)) {
duke@435 472 String fileName = it.get();
duke@435 473 BuildConfig.putFieldHash(cfg, "AdditionalGeneratedFile",
duke@435 474 Util.normalize(dir + Util.sep + fileName),
duke@435 475 fileName);
duke@435 476 it.next();
duke@435 477 return;
duke@435 478 }
duke@435 479 }
duke@435 480 empty(null, "** Error: wrong number of args to -additionalGeneratedFile");
duke@435 481 }
duke@435 482 }
duke@435 483 ),
duke@435 484
duke@435 485 new ArgRule("-prelink",
duke@435 486 new HsArgHandler() {
duke@435 487 public void handle(ArgIterator it) {
duke@435 488 if (nextNotKey(it)) {
duke@435 489 if (nextNotKey(it)) {
duke@435 490 String description = it.get();
duke@435 491 if (nextNotKey(it)) {
duke@435 492 String command = it.get();
duke@435 493 BuildConfig.putField(null, "PrelinkDescription", description);
duke@435 494 BuildConfig.putField(null, "PrelinkCommand", command);
duke@435 495 it.next();
duke@435 496 return;
duke@435 497 }
duke@435 498 }
duke@435 499 }
duke@435 500
duke@435 501 empty(null, "** Error: wrong number of args to -prelink");
duke@435 502 }
duke@435 503 }
sla@2369 504 ),
sla@2369 505
sla@2369 506 new ArgRule("-postbuild",
sla@2369 507 new HsArgHandler() {
sla@2369 508 public void handle(ArgIterator it) {
sla@2369 509 if (nextNotKey(it)) {
sla@2369 510 if (nextNotKey(it)) {
sla@2369 511 String description = it.get();
sla@2369 512 if (nextNotKey(it)) {
sla@2369 513 String command = it.get();
sla@2369 514 BuildConfig.putField(null, "PostbuildDescription", description);
sla@2369 515 BuildConfig.putField(null, "PostbuildCommand", command);
sla@2369 516 it.next();
sla@2369 517 return;
sla@2369 518 }
sla@2369 519 }
sla@2369 520 }
sla@2369 521
sla@2369 522 empty(null, "** Error: wrong number of args to -postbuild");
sla@2369 523 }
sla@2369 524 }
sla@2369 525 ),
duke@435 526 },
duke@435 527 new ArgHandler() {
duke@435 528 public void handle(ArgIterator it) {
duke@435 529
duke@435 530 throw new RuntimeException("Arg Parser: unrecognized option "+it.get());
duke@435 531 }
duke@435 532 }
duke@435 533 );
duke@435 534 if (BuildConfig.getField(null, "SourceBase") == null ||
duke@435 535 BuildConfig.getField(null, "BuildBase") == null ||
duke@435 536 BuildConfig.getField(null, "ProjectFileName") == null ||
duke@435 537 BuildConfig.getField(null, "CompilerVersion") == null) {
duke@435 538 usage();
duke@435 539 }
duke@435 540
duke@435 541 if (BuildConfig.getField(null, "UseToGeneratePch") == null) {
duke@435 542 throw new RuntimeException("ERROR: need to specify one file to compute PCH, with -useToGeneratePch flag");
duke@435 543 }
duke@435 544
duke@435 545 BuildConfig.putField(null, "PlatformObject", this);
duke@435 546 }
duke@435 547
sla@2540 548 Vector createAllConfigs(String platform) {
duke@435 549 Vector allConfigs = new Vector();
duke@435 550
duke@435 551 allConfigs.add(new C1DebugConfig());
sla@2540 552 allConfigs.add(new C1FastDebugConfig());
sla@2540 553 allConfigs.add(new C1ProductConfig());
duke@435 554
sla@2540 555 allConfigs.add(new C2DebugConfig());
sla@2540 556 allConfigs.add(new C2FastDebugConfig());
sla@2540 557 allConfigs.add(new C2ProductConfig());
duke@435 558
sla@2540 559 allConfigs.add(new TieredDebugConfig());
sla@2540 560 allConfigs.add(new TieredFastDebugConfig());
sla@2540 561 allConfigs.add(new TieredProductConfig());
duke@435 562
sla@2540 563 allConfigs.add(new CoreDebugConfig());
sla@2540 564 allConfigs.add(new CoreFastDebugConfig());
sla@2540 565 allConfigs.add(new CoreProductConfig());
duke@435 566
sla@2540 567 if (platform.equals("Win32")) {
duke@435 568 allConfigs.add(new KernelDebugConfig());
duke@435 569 allConfigs.add(new KernelFastDebugConfig());
duke@435 570 allConfigs.add(new KernelProductConfig());
duke@435 571 }
duke@435 572
duke@435 573 return allConfigs;
duke@435 574 }
duke@435 575
duke@435 576 PrintWriter printWriter;
duke@435 577
duke@435 578 public void writeProjectFile(String projectFileName, String projectName,
sla@2675 579 Vector<BuildConfig> allConfigs) throws IOException {
duke@435 580 throw new RuntimeException("use compiler version specific version");
duke@435 581 }
neliasso@4112 582
neliasso@4112 583 int indent;
neliasso@4112 584 private Stack<String> tagStack = new Stack<String>();
neliasso@4112 585
neliasso@4112 586 private void startTagPrim(String name, String[] attrs, boolean close) {
neliasso@4112 587 startTagPrim(name, attrs, close, true);
neliasso@4112 588 }
neliasso@4112 589
neliasso@4112 590 private void startTagPrim(String name, String[] attrs, boolean close,
neliasso@4112 591 boolean newline) {
neliasso@4112 592 doIndent();
neliasso@4112 593 printWriter.print("<" + name);
neliasso@4112 594 indent++;
neliasso@4112 595
neliasso@4112 596 if (attrs != null && attrs.length > 0) {
neliasso@4112 597 for (int i = 0; i < attrs.length; i += 2) {
neliasso@4112 598 printWriter.print(" " + attrs[i] + "=\"" + attrs[i + 1] + "\"");
neliasso@4112 599 if (i < attrs.length - 2) {
neliasso@4112 600 }
neliasso@4112 601 }
neliasso@4112 602 }
neliasso@4112 603
neliasso@4112 604 if (close) {
neliasso@4112 605 indent--;
neliasso@4112 606 printWriter.print(" />");
neliasso@4112 607 } else {
neliasso@4112 608 // TODO push tag name, and change endTag to pop and print.
neliasso@4112 609 tagStack.push(name);
neliasso@4112 610 printWriter.print(">");
neliasso@4112 611 }
neliasso@4112 612 if (newline) {
neliasso@4112 613 printWriter.println();
neliasso@4112 614 }
neliasso@4112 615 }
neliasso@4112 616
neliasso@4112 617 void startTag(String name, String... attrs) {
neliasso@4112 618 startTagPrim(name, attrs, false);
neliasso@4112 619 }
neliasso@4112 620
neliasso@4112 621 void startTagV(String name, Vector attrs) {
neliasso@4112 622 String s[] = new String[attrs.size()];
neliasso@4112 623 for (int i = 0; i < attrs.size(); i++) {
neliasso@4112 624 s[i] = (String) attrs.elementAt(i);
neliasso@4112 625 }
neliasso@4112 626 startTagPrim(name, s, false);
neliasso@4112 627 }
neliasso@4112 628
neliasso@4112 629 void endTag() {
neliasso@4112 630 String name = tagStack.pop();
neliasso@4112 631 indent--;
neliasso@4112 632 doIndent();
neliasso@4112 633 printWriter.println("</" + name + ">");
neliasso@4112 634 }
neliasso@4112 635
neliasso@4112 636 private void endTagNoIndent() {
neliasso@4112 637 String name = tagStack.pop();
neliasso@4112 638 indent--;
neliasso@4112 639 printWriter.println("</" + name + ">");
neliasso@4112 640 }
neliasso@4112 641
neliasso@4112 642 void tag(String name, String... attrs) {
neliasso@4112 643 startTagPrim(name, attrs, true);
neliasso@4112 644 }
neliasso@4112 645
neliasso@4112 646 void tagData(String name, String data) {
neliasso@4112 647 startTagPrim(name, null, false, false);
neliasso@4112 648 printWriter.print(data);
neliasso@4112 649 endTagNoIndent();
neliasso@4112 650 }
neliasso@4112 651
neliasso@4112 652 void tagData(String name, String data, String... attrs) {
neliasso@4112 653 startTagPrim(name, attrs, false, false);
neliasso@4112 654 printWriter.print(data);
neliasso@4112 655 endTagNoIndent();
neliasso@4112 656 }
neliasso@4112 657
neliasso@4112 658 void tagV(String name, Vector attrs) {
neliasso@4112 659 String s[] = new String[attrs.size()];
neliasso@4112 660 for (int i = 0; i < attrs.size(); i++) {
neliasso@4112 661 s[i] = (String) attrs.elementAt(i);
neliasso@4112 662 }
neliasso@4112 663 startTagPrim(name, s, true);
neliasso@4112 664 }
neliasso@4112 665
neliasso@4112 666 void doIndent() {
neliasso@4112 667 for (int i = 0; i < indent; i++) {
neliasso@4112 668 printWriter.print(" ");
neliasso@4112 669 }
neliasso@4112 670 }
neliasso@4112 671
neliasso@4112 672
duke@435 673 }

mercurial