-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCGOperandSensor.cpp
132 lines (108 loc) · 4.01 KB
/
CGOperandSensor.cpp
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
120
121
122
123
124
125
126
127
128
129
130
131
132
/****************************************************************************
* Modul: $RCSfile: CGOperandSensor.cpp,v $
*
* $Author: md $
* $Date: 1998/01/14 10:59:58 $
* $Revision: 1.2 $
*
* Aufgabe: Dieses Modul enthaelt Hilfsfunktionen
* Funktionen:
****************************************************************************/
#ifdef USE_PRAGMA
#pragma interface
#endif
/****************************************************************************
* Konstanten
****************************************************************************/
/****************************************************************************
* Include-Anweisungen
****************************************************************************/
#include <DS/DSSensor.h>
#include <DS/DSMachine.h>
#include <DS/DSBlock.h>
#include "CGFile.h"
#include "CGOperandSensor.h"
#ifdef DEBUG
#include <dmalloc.h>
#endif
/****************************************************************************
* Externe Variablen
****************************************************************************/
/****************************************************************************
* Globale Variablen
****************************************************************************/
/****************************************************************************
* Konstruktoren
****************************************************************************/
CGOperandSensor::CGOperandSensor(DSObject *father,
DSSensorRef sen_ref) :
DSOperandSensor(father, sen_ref)
{
}
/****************************************************************************
* Destruktor
****************************************************************************/
CGOperandSensor::~CGOperandSensor(void)
{
}
DSObject *CGOperandSensor::New(DSObject *father) const
{
return new CGOperandSensor(father);
}
/****************************************************************************
* Write(): Oberfunktion der Codegenerierung fuer OperandSensor
* -> writer
* -> what
* Ergebnis: DS_OK oder DS_ERROR
* Seiteneffekte: Anlegen und Fuellen der .h und .cc-Files
****************************************************************************/
DSResult CGOperandSensor::Write(DSWriter *writer, DSCardinal what) const
{
DSResult result;
(void)what;
result = WriteImplementation((CGWriter *)writer);
if (result != DS_OK) return result;
return DS_OK;
}
/****************************************************************************
* WriteImplementation(): schreibt einen als Sensor gespeicherten Operanden
* -> writer
* -> what
* Ergebnis: DS_OK,falls Aktion erfolgreich war, sonst DS_ERROR
* Seiteneffekte: Zieldatei wird gefuellt
****************************************************************************/
DSResult CGOperandSensor::WriteImplementation(CGWriter *writer) const
{
DSSensorRef sensor;
DSResult result;
CGFile *out;
CGPos pos;
DSObject *father;
DSMachineRef machine_ref;
DSBlock *block;
out = writer->CGGetFilePointer();
assert(out);
pos = writer->CGGetIndentPos();
sensor = GetSensorRef();
assert(sensor);
father = sensor->GetParent();
assert(father);
if (father->GetType() == DS_MACHINE) // process or atom is accessing
{ // a machine sensor!
InsertString(*out, "((", 0, CG_NO_EOL);
machine_ref = (DSMachineRef)father;
writer->CGSetIndentPos(0);
machine_ref->Write(writer, CG_WRITE_IDENTIFIER);
InsertString(*out, " *)", 0, CG_NO_EOL);
block = (DSBlock *)machine_ref->GetParent();
assert(block);
block->Write(writer, CG_WRITE_IDENTIFIER); // needed for atoms!
InsertString(*out, "::", 0, CG_NO_EOL);
InsertString(*out, PREFIX_MACHINE, 0, CG_NO_EOL);
InsertString(*out, machine_ref->GetName(), 0, CG_NO_EOL);
InsertString(*out, ")->", 0, CG_NO_EOL);
writer->CGSetIndentPos(pos);
}
result = sensor->Write(writer, CG_WRITE_IDENTIFIER);
return result;
}