cfad47cfa3/t3compiler/tads3/tcunas.h

4b825dc642cb6eb9a060e54bf8d69288fbee4904cfad47cfa334b206c65f22086bcc5d63e6f70944
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