~ubuntu-branches/ubuntu/wily/gargoyle-free/wily-proposed

« back to all changes in this revision

Viewing changes to tads/tads3/tcunas.h

  • Committer: Bazaar Package Importer
  • Author(s): Sylvain Beucler
  • Date: 2009-09-11 20:09:43 UTC
  • Revision ID: james.westby@ubuntu.com-20090911200943-idgzoyupq6650zpn
Tags: upstream-2009-08-25
ImportĀ upstreamĀ versionĀ 2009-08-25

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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