summaryrefslogtreecommitdiffhomepage
path: root/Stars45/Term.cpp
blob: acd2c7443528ba47174d1b9ea09c330db15a9fea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/*  Starshatter: The Open Source Project
    Copyright (c) 2021-2022, Starshatter: The Open Source Project Contributors
    Copyright (c) 2011-2012, Starshatter OpenSource Distribution Contributors
    Copyright (c) 1997-2006, Destroyer Studios LLC.

     AUTHOR:       John DiCamillo


     OVERVIEW
     ========
     Implementation of the Term class
*/


#include "Term.h"
#include "Utils.h"

// +-------------------------------------------------------------------+

Term*
error(char* s1, char* s2)
{
    Print("ERROR: ");
    if (s1) Print(s1);
    if (s2) Print(s2);
    Print("\n\n");
    return 0;
}

// +-------------------------------------------------------------------+

void TermBool::print(int level)  { if (level > 0) Print(val? "true" : "false"); else Print("..."); }
void TermNumber::print(int level){ if (level > 0) Print("%g", val);     else Print("..."); }
void TermText::print(int level)  { if (level > 0) Print("\"%s\"", val.data()); else Print("..."); }

// +-------------------------------------------------------------------+

TermArray::TermArray(TermList* elist)
{
    elems = elist;
}

TermArray::~TermArray()
{
    if (elems) elems->destroy();
    delete elems;
}

void
TermArray::print(int level)
{
    if (level > 1) {
        Print("(");

        if (elems) {
            for (int i = 0; i < elems->size(); i++) {
                elems->at(i)->print(level-1);
                if (i < elems->size() -1)
                    Print(", ");
            }
        }

        Print(") ");
    }
    else Print("(...) ");
}

// +-------------------------------------------------------------------+

TermStruct::TermStruct(TermList* elist)
{
    elems = elist;
}

TermStruct::~TermStruct()
{
    if (elems) elems->destroy();
    delete elems;
}

void
TermStruct::print(int level)
{
    if (level > 1) {
        Print("{");

        if (elems) {
            for (int i = 0; i < elems->size(); i++) {
                elems->at(i)->print(level-1);
                if (i < elems->size() -1)
                    Print(", ");
            }
        }

        Print("} ");
    }
    else Print("{...} ");
}

// +-------------------------------------------------------------------+

TermDef::~TermDef()
{
    delete mname;
    delete mval;
}

void
TermDef::print(int level)
{
    if (level >= 0) {
        mname->print(level);
        Print(": ");
        mval->print(level-1);
    }
    else Print("...");
}

// +-------------------------------------------------------------------+