]> git.xonotic.org Git - xonotic/gmqcc.git/commitdiff
strcmp and strncmp builtins
authorWolfgang Bumiller <blub@speed.at>
Sun, 23 Dec 2012 18:22:38 +0000 (19:22 +0100)
committerWolfgang Bumiller <blub@speed.at>
Sun, 23 Dec 2012 18:22:38 +0000 (19:22 +0100)
doc/qcvm.1
exec.c

index 1d895956ef7963fd016a3fc1b43b67d5ffe26286..b018a8f811b66c9f8dffa9043426d97be3e436aa 100644 (file)
@@ -56,36 +56,64 @@ Append a float parameter to be passed to \fImain\fR.
 Append a string parameter to be passed to \fImain\fR.
 .SH BUILTINS
 The following builtin functions are available:
-.TP
+.fi
+
 .RI "1) " void " print(" string... ") = " "#1" ;
+.in +8
 Print the passed strings to stdout. At most 8 strings are allowed.
-.TP
+.in
+
 .RI "2) " string " ftos(" float ") = " "#2" ;
+.in +8
 Convert a float to a string.
-.TP
+.in
+
 .RI "3) " entity " spawn() = " "#3" ;
+.in +8
 Spawn an entity.
-.TP
+.in
+
 .RI "4) " void " remove(" entity ") = " "#4" ;
+.in +8
 Remove an entity.
-.TP
+.in
+
 .RI "5) " string " vtos(" vector ") = " "#5" ;
+.in +8
 Convert a vector to a string.
-.TP
+.in
+
 .RI "6) " void " error(" string... ") = " "#6" ;
+.in +8
 Print at most 8 strings to stdout and then exit with an error.
-.TP
+.in
+
 .RI "7) " float " vlen(" vector ") = " "#7" ;
+.in +8
 Get the length of a vector.
-.TP
+.in
+
 .RI "8) " string " etos(" entity ") = " "#8" ;
+.in +8
 Get the entity ID as string.
-.TP
+.in
+
 .RI "9) " float " stof(" string ") = " "#9" ;
+.in +8
 Convert a string to a float.
-.TP
+.in
+
 .RI "10) " string " strcat(" string ", " string ") = " "#10" ;
+.in +8
 Concatenate two strings, returning a tempstring.
+.in
+
+.RI "11) " float " strcmp (" string ", " string ") = " "#11" ;
+.fi
+.RI "    " float " strncmp(" string ", " string ", " float ") = " "#11" ;
+.in +8
+Compare two strings. Returns the same as the corresponding C functions.
+.in
 .SH BUGS
 Please report bugs on <http://github.com/graphitemaster/gmqcc/issues>,
 or see <http://graphitemaster.github.com/gmqcc> on how to contact us.
diff --git a/exec.c b/exec.c
index ca98675945bf89ea007185324cac333f43bd412f..dc5980dc4e27cde690c81c58e92a1bb2032124dc 100644 (file)
--- a/exec.c
+++ b/exec.c
@@ -768,18 +768,43 @@ static int qc_strcat(qc_program *prog)
     return 0;
 }
 
+static int qc_strcmp(qc_program *prog)
+{
+    char  *cstr1, *cstr2;
+    qcany *str1,  *str2;
+    qcany out;
+
+    if (prog->argc != 2 && prog->argc != 3) {
+        printf("ERROR: invalid number of arguments for strcmp/strncmp: %i, expected 2 or 3\n",
+               prog->argc);
+        return -1;
+    }
+
+    str1 = GetArg(0);
+    str2 = GetArg(1);
+    cstr1 = prog_getstring(prog, str1->string);
+    cstr2 = prog_getstring(prog, str2->string);
+    if (prog->argc == 3)
+        out._float = strncmp(cstr1, cstr2, GetArg(2)->_float);
+    else
+        out._float = strcmp(cstr1, cstr2);
+    Return(out);
+    return 0;
+}
+
 static prog_builtin qc_builtins[] = {
     NULL,
-    &qc_print, /*   1   */
-    &qc_ftos,  /*   2   */
-    &qc_spawn, /*   3   */
-    &qc_kill,  /*   4   */
-    &qc_vtos,  /*   5   */
-    &qc_error, /*   6   */
-    &qc_vlen,  /*   7   */
-    &qc_etos,  /*   8   */
-    &qc_stof,  /*   9   */
-    &qc_strcat /*   10  */
+    &qc_print,  /*   1   */
+    &qc_ftos,   /*   2   */
+    &qc_spawn,  /*   3   */
+    &qc_kill,   /*   4   */
+    &qc_vtos,   /*   5   */
+    &qc_error,  /*   6   */
+    &qc_vlen,   /*   7   */
+    &qc_etos,   /*   8   */
+    &qc_stof,   /*   9   */
+    &qc_strcat, /*   10  */
+    &qc_strcmp  /*   11  */
 };
 static size_t qc_builtins_count = sizeof(qc_builtins) / sizeof(qc_builtins[0]);