001: /*
002: * $Id: Source.java,v 1.2 2002/09/16 08:05:02 jkl Exp $
003: *
004: * Copyright (c) 2002 Njet Communications Ltd. All Rights Reserved.
005: *
006: * Use is subject to license terms, as defined in
007: * Anvil Sofware License, Version 1.1. See LICENSE
008: * file, or http://njet.org/license-1.1.txt
009: */
010: package anvil.codec;
011:
012: import java.util.ArrayList;
013:
014: public class Source {
015:
016: protected static class Entry {
017: protected int _address;
018: protected int _index;
019:
020: public Entry(int a, int i) {
021: _address = a;
022: _index = i;
023: }
024:
025: public void bind(Code code) {
026: code
027: .writeShort(_index,
028: (short) (code.address() - _address));
029: }
030:
031: public void bind(Code code, int address) {
032: code.writeShort(_index, (short) (address - _address));
033: }
034: }
035:
036: protected static class Entry4 extends Entry {
037:
038: public Entry4(int a, int i) {
039: super (a, i);
040: }
041:
042: public void bind(Code code) {
043: code.writeInt(_index, (code.address() - _address));
044: }
045:
046: public void bind(Code code, int address) {
047: code.writeInt(_index, (address - _address));
048: }
049: }
050:
051: protected Code _code;
052: protected ArrayList _sources = new ArrayList();
053: protected int _boundaddress = 0xffff;
054:
055: public Source(Code code) {
056: _code = code;
057: }
058:
059: public Source(Code code, int address, int index) {
060: _code = code;
061: add(address, index);
062: }
063:
064: public void add(int address, int index) {
065: _sources.add(new Entry(address, index));
066: }
067:
068: public void add4(int address, int index) {
069: _sources.add(new Entry4(address, index));
070: }
071:
072: public int getBoundAddress() {
073: return _boundaddress;
074: }
075:
076: public void bind() {
077: Code code = _code;
078: _boundaddress = code.address();
079: int size = _sources.size();
080: for (int i = 0; i < size; i++) {
081: ((Entry) _sources.get(i)).bind(code);
082: }
083: }
084:
085: public void bind(Target target) {
086: _boundaddress = target.getAddress();
087: int size = _sources.size();
088: for (int i = 0; i < size; i++) {
089: ((Entry) _sources.get(i)).bind(_code, target.getAddress());
090: }
091: }
092:
093: public void bind(int address) {
094: _boundaddress = address;
095: int size = _sources.size();
096: for (int i = 0; i < size; i++) {
097: ((Entry) _sources.get(i)).bind(_code, address);
098: }
099: }
100: }
|