*/
List<string> extraCode;
+ /*
+ * 'extraCodeDefer' is for C code that is to be added in the C
+ * output _after_ the data and code blocks.
+ */
+ List<string> extraCodeDefer;
+
/*
* 'dataBlock' is the data block in which constant data bytes
* are accumulated.
StringComparer.Ordinal);
compiling = false;
extraCode = new List<string>();
+ extraCodeDefer = new List<string>();
enableFlowAnalysis = true;
/*
extraCode.Add(ParseCCode());
});
+ /*
+ * postamble
+ * Parses a C code snippet, then adds it to the generated
+ * output after the data and code blocks.
+ */
+ AddNative("postamble", false, SType.BLANK, cpu => {
+ extraCodeDefer.Add(ParseCCode());
+ });
+
/*
* make-CX
* Expects two integers and a string, and makes a
#define T0_INT4(x) T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
#define T0_INT5(x) T0_SBYTE(x), T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
-static const uint8_t t0_datablock[];
+/* static const unsigned char t0_datablock[]; */
");
/*
BlobWriter bw;
tw.WriteLine();
- tw.Write("static const uint8_t t0_datablock[] = {");
+ tw.Write("static const unsigned char"
+ + " t0_datablock[] = {");
bw = new BlobWriter(tw, 78, 1);
bw.Append((byte)0);
foreach (ConstData cd in blocks.Values) {
tw.WriteLine("};");
tw.WriteLine();
- tw.Write("static const uint8_t t0_codeblock[] = {");
+ tw.Write("static const unsigned char"
+ + " t0_codeblock[] = {");
bw = new BlobWriter(tw, 78, 1);
foreach (CodeElement ce in gcode) {
ce.Encode(bw, oneByteCode);
((t0_context *)t0ctx)->rp = rp;
((t0_context *)t0ctx)->ip = ip;
}");
+
+ /*
+ * Add the "postamblr" elements here. These are
+ * elements that may need access to the data
+ * block or code block, so they must occur after
+ * their definition.
+ */
+ foreach (string pp in extraCodeDefer) {
+ tw.WriteLine();
+ tw.WriteLine("{0}", pp);
+ }
}
int codeLen = 0;