X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=NewQC.md;h=b2fd90d86f6ef9fe3d570b27a6deff7259406322;hb=f6927c544ad57975866405c5c6dc65c48d71874a;hp=915a2750cd673cefbf2bc6b36eb5d7f583347b5e;hpb=ab458cf870e3ca2cc8add65895be2f428879ac16;p=xonotic%2Fxonotic.wiki.git
diff --git a/NewQC.md b/NewQC.md
index 915a275..b2fd90d 100644
--- a/NewQC.md
+++ b/NewQC.md
@@ -1,85 +1,102 @@
-h1. New QC Syntax
-
-{{>toc}}
+New QC Syntax
+=============
It is possible that at some point we decide to switch QC-compiler which requires some changes to the code.
-*For more information see* http://dev.xonotic.org/projects/bocc
+~~For more information see http://dev.xonotic.org/projects/bocc~~
+
+(Update: Blub's bocc compiler didn't make it, but someone else came along, both devs [joined forces](https://github.com/graphitemaster/gmqcc/graphs/contributors) and brought us [GMQCC](https://graphitemaster.github.io/gmqcc/doc.html).
+ This is now the QuakeC compiler used by the Xonotic project.)
-h2. Clean syntax:
+Clean syntax:
+-------------
In fteqcc there are some ambiguities regarding fieldpointers, function pointers, and field-return-types etc.
A clean syntax is needed, the current implementation uses the following:
-|_.definition|_.meaning|
-|float foo
| global variable|
-|float .foo
| entity field|
-|.float foo
| fieldpointer|
-|.float .foo
| entity field of type fieldpointer|
-|float foo(void)
| function|
-|float foo*(void)
| function pointer|
-|.float foo(void)
| function returning a fieldpointer .float|
-|.float foo*(void)
| function pointer, returning a fieldpointer .float|
-|float .foo(void)
| entity field of type function returning float|
-|.float .foo(void)
| entity field of type function returning fieldpointer|
-
-h2. Function definitions:
+|definition|meaning|
+|----------|-------|
+|`float foo`|global variable|
+|`float .foo`|entity field|
+|`.float foo`|fieldpointer|
+|`.float .foo`|entity field of type fieldpointer|
+|`float foo(void)`|function|
+|`float foo*(void)`|function pointer|
+|`.float foo(void)`|function returning a fieldpointer .float|
+|`.float foo*(void)`|function pointer, returning a fieldpointer .float|
+|`float .foo(void)`|entity field of type function returning float|
+|`.float .foo(void)`|entity field of type function returning fieldpointer|
+
+Function definitions:
+---------------------
The old-style QC way of defining functions will not be supported, so
-
void(float x) something = { ... }+ + void(float x) something = { ... } + becomes -
void something(float x) { ... }+ + void something(float x) { ... } + which is the most common way to define functions in the xonotic code already anyway. -h2. Constants: +Constants: +---------- From now on, the code -
float x = 3+ + float x = 3 + 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. To create a constant use: -
const float x = 3- -h2. Extendable functions: - -Since menuQC has some funny macro: ACCUMULATE_FUNCTIONS, it seemed like a nice syntactical sugar to allow the following: - -
float myfunc() extendable -{ - float mylocal = 3; -} - -/* other code */ - -float myfunc() -{ - mylocal += 5; - if (mylocal > 20) - return mylocal; -} - -/* optionally: */ -float myfunc() final -{ - return 3; -} -- -h2. Variadic parameters (do not use yet) - -(This might get changed to be more flexible so do not rely on this syntax...) - -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. -Here's an example that assumes float parameters and prints them one after the other: -
void printfloats(float count, float first, ...) -{ - if (count <= 0) // if there are no parameters, return - return; - if (count == 1) { // If there's one parameter, print it, plus a new-line - print(strcat(ftos(first), "\n")); - return; + + const float x = 3 + +Extendable functions: +--------------------- + +Since menuQC has some funny macro: ACCUMULATE\_FUNCTIONS, it seemed like a nice syntactical sugar to allow the following: + + float myfunc() extendable + { + float mylocal = 3; + } + + /* other code */ + + float myfunc() + { + mylocal += 5; + if (mylocal > 20) + return mylocal; } - // Otherwise we have multiple parameters left, so print the float, and add a comma - print(strcat(ftos(first), ", ")); - myprint(count-1, ...); -}-So
myprint(4, 1, 2, 3, 4)
would print "1, 2, 3, 4\n"
+
+ /* optionally: */
+ float myfunc() final
+ {
+ return 3;
+ }
+
+Variadic parameters (do not use yet)
+------------------------------------
+
+(This might get changed to be more flexible so do not rely on this syntaxâ¦)
+
+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.
+Hereâs an example that assumes float parameters and prints them one after the other:
+
+ void printfloats(float count, float first, ...)
+ {
+ if (count <= 0) // if there are no parameters, return
+ return;
+ if (count == 1) { // If there's one parameter, print it, plus a new-line
+ print(strcat(ftos(first), "\n"));
+ return;
+ }
+ // Otherwise we have multiple parameters left, so print the float, and add a comma
+ print(strcat(ftos(first), ", "));
+ myprint(count-1, ...);
+ }
+
+So `myprint(4, 1, 2, 3, 4)` would print "1, 2, 3, 4\\n"
+