| | 1 | /* $Header: d:/cvsroot/tads/tads3/TCUNAS.H,v 1.3 1999/07/11 00:46:58 MJRoberts Exp $ */ |
| | 2 | |
| | 3 | /* |
| | 4 | * Copyright (c) 1999, 2002 Michael J. Roberts. All Rights Reserved. |
| | 5 | * |
| | 6 | * Please see the accompanying license file, LICENSE.TXT, for information |
| | 7 | * on using and copying this software. |
| | 8 | */ |
| | 9 | /* |
| | 10 | Name |
| | 11 | tcunas.h - TADS 3 Compiler Unassembler |
| | 12 | Function |
| | 13 | |
| | 14 | Notes |
| | 15 | |
| | 16 | Modified |
| | 17 | 05/10/99 MJRoberts - Creation |
| | 18 | */ |
| | 19 | |
| | 20 | #ifndef TCUNAS_H |
| | 21 | #define TCUNAS_H |
| | 22 | |
| | 23 | #include <stdio.h> |
| | 24 | #include <stdarg.h> |
| | 25 | |
| | 26 | #include "t3std.h" |
| | 27 | #include "tcgen.h" |
| | 28 | |
| | 29 | |
| | 30 | /* ------------------------------------------------------------------------ */ |
| | 31 | /* |
| | 32 | * byte-code source for unassembler |
| | 33 | */ |
| | 34 | class CTcUnasSrc |
| | 35 | { |
| | 36 | public: |
| | 37 | /* |
| | 38 | * read the next byte; returns zero on success, non-zero at the end |
| | 39 | * of the byte stream |
| | 40 | */ |
| | 41 | virtual int next_byte(char *ch) = 0; |
| | 42 | |
| | 43 | /* get the current offset */ |
| | 44 | virtual ulong get_ofs() const = 0; |
| | 45 | }; |
| | 46 | |
| | 47 | /* |
| | 48 | * code stream implementation of byte code source |
| | 49 | */ |
| | 50 | class CTcUnasSrcCodeStr: public CTcUnasSrc |
| | 51 | { |
| | 52 | public: |
| | 53 | CTcUnasSrcCodeStr(CTcCodeStream *str) |
| | 54 | { |
| | 55 | /* remember our underlying code stream */ |
| | 56 | str_ = str; |
| | 57 | |
| | 58 | /* start at the first byte of the code stream */ |
| | 59 | ofs_ = 0; |
| | 60 | } |
| | 61 | |
| | 62 | /* read from the code stream */ |
| | 63 | int next_byte(char *ch) |
| | 64 | { |
| | 65 | /* if there's anything left, return the byte and bump the pointer */ |
| | 66 | if (ofs_ < str_->get_ofs()) |
| | 67 | { |
| | 68 | *ch = str_->get_byte_at(ofs_); |
| | 69 | ++ofs_; |
| | 70 | return 0; |
| | 71 | } |
| | 72 | |
| | 73 | /* indicate end of file */ |
| | 74 | return 1; |
| | 75 | } |
| | 76 | |
| | 77 | /* get the current offset */ |
| | 78 | ulong get_ofs() const |
| | 79 | { |
| | 80 | return ofs_; |
| | 81 | } |
| | 82 | |
| | 83 | protected: |
| | 84 | /* underlying code stream object */ |
| | 85 | CTcCodeStream *str_; |
| | 86 | |
| | 87 | /* current read offset in code stream */ |
| | 88 | ulong ofs_; |
| | 89 | }; |
| | 90 | |
| | 91 | /* ------------------------------------------------------------------------ */ |
| | 92 | /* |
| | 93 | * output stream for unassembler |
| | 94 | */ |
| | 95 | class CTcUnasOut |
| | 96 | { |
| | 97 | public: |
| | 98 | virtual ~CTcUnasOut() { } |
| | 99 | |
| | 100 | /* write a line of text to the output, printf-style */ |
| | 101 | virtual void print(const char *fmt, ...) = 0; |
| | 102 | }; |
| | 103 | |
| | 104 | /* |
| | 105 | * stdio implementation of output stream - writes data to standard |
| | 106 | * output |
| | 107 | */ |
| | 108 | class CTcUnasOutStdio: public CTcUnasOut |
| | 109 | { |
| | 110 | public: |
| | 111 | void print(const char *fmt, ...) |
| | 112 | { |
| | 113 | va_list va; |
| | 114 | |
| | 115 | /* display the data on the standard output */ |
| | 116 | va_start(va, fmt); |
| | 117 | vprintf(fmt, va); |
| | 118 | va_end(va); |
| | 119 | } |
| | 120 | }; |
| | 121 | |
| | 122 | /* |
| | 123 | * Text file (osfildef) implementation of output stream. The file handle |
| | 124 | * is managed by the caller. |
| | 125 | */ |
| | 126 | class CTcUnasOutFile: public CTcUnasOut |
| | 127 | { |
| | 128 | public: |
| | 129 | CTcUnasOutFile(osfildef *fp) { fp_ = fp; } |
| | 130 | |
| | 131 | void print(const char *fmt, ...) |
| | 132 | { |
| | 133 | char buf[1024]; |
| | 134 | va_list va; |
| | 135 | |
| | 136 | /* format the text */ |
| | 137 | va_start(va, fmt); |
| | 138 | t3vsprintf(buf, sizeof(buf), fmt, va); |
| | 139 | va_end(va); |
| | 140 | |
| | 141 | /* write the formatted text to the file */ |
| | 142 | os_fprintz(fp_, buf); |
| | 143 | } |
| | 144 | |
| | 145 | protected: |
| | 146 | /* our file handle */ |
| | 147 | osfildef *fp_; |
| | 148 | }; |
| | 149 | |
| | 150 | #endif /* TCUNAS_H */ |
| | 151 | |