remove obsolete references to Redmine wiki things
[xonotic/xonotic.wiki.git] / NewQC.md
1 New QC Syntax
2 =============
3
4 It is possible that at some point we decide to switch QC-compiler which requires some changes to the code.
5
6 **For more information see** http://dev.xonotic.org/projects/bocc
7
8 Clean syntax:
9 -------------
10
11 In fteqcc there are some ambiguities regarding fieldpointers, function pointers, and field-return-types etc.
12 A clean syntax is needed, the current implementation uses the following:
13
14 |definition|meaning|
15 |----------|-------|
16 |<code>float foo</code>|global variable|
17 |<code>float .foo</code>|entity field|
18 |<code>.float foo</code>|fieldpointer|
19 |<code>.float .foo</code>|entity field of type fieldpointer|
20 |<code>float foo(void)</code>|function|
21 |<code>float foo\*(void)</code>|function pointer|
22 |<code>.float foo(void)</code>|function returning a fieldpointer .float|
23 |<code>.float foo\*(void)</code>|function pointer, returning a fieldpointer .float|
24 |<code>float .foo(void)</code>|entity field of type function returning float|
25 |<code>.float .foo(void)</code>|entity field of type function returning fieldpointer|
26
27 Function definitions:
28 ---------------------
29
30 The old-style QC way of defining functions will not be supported, so
31
32     void(float x) something = { ... }
33
34 becomes
35
36     void something(float x) { ... }
37
38 which is the most common way to define functions in the xonotic code already anyway.
39
40 Constants:
41 ----------
42
43 From now on, the code
44
45     float x = 3
46
47 does what the first instinct tells you: it creates a global with the initial value 3. Contrary to old QC, where it created a constant.
48 To create a constant use:
49
50     const float x = 3
51
52 Extendable functions:
53 ---------------------
54
55 Since menuQC has some funny macro: ACCUMULATE\_FUNCTIONS, it seemed like a nice syntactical sugar to allow the following:
56
57     float myfunc() extendable
58     {
59         float mylocal = 3;
60     }
61
62     /* other code */
63
64     float myfunc()
65     {
66         mylocal += 5;
67         if (mylocal > 20)
68             return mylocal;
69     }
70
71     /* optionally: */
72     float myfunc() final
73     {
74         return 3;
75     }
76
77 Variadic parameters (do not use yet)
78 ------------------------------------
79
80 (This might get changed to be more flexible so do not rely on this syntax…)
81
82 Another “enhancement” is the possibility to have functions with variadic parameter lists. However, the only way to sanely access them (until pointers are allowed) is via a recursive way.
83 Here’s an example that assumes float parameters and prints them one after the other:
84
85     void printfloats(float count, float first, ...)
86     {
87         if (count <= 0) // if there are no parameters, return
88             return;
89         if (count == 1) { // If there's one parameter, print it, plus a new-line
90             print(strcat(ftos(first), "\n"));
91             return;
92         }
93         // Otherwise we have multiple parameters left, so print the float, and add a comma
94         print(strcat(ftos(first), ", "));
95         myprint(count-1, ...);
96     }
97
98 So <code>myprint(4, 1, 2, 3, 4)</code> would print <code>“1, 2, 3, 4\\n”</code>
99