From ee7051c5a471dbf201eea6ab7444c71894403a51 Mon Sep 17 00:00:00 2001 From: Wolfgang Bumiller Date: Sun, 23 Dec 2012 19:22:38 +0100 Subject: [PATCH] strcmp and strncmp builtins --- doc/qcvm.1 | 48 ++++++++++++++++++++++++++++++++++++++---------- exec.c | 45 +++++++++++++++++++++++++++++++++++---------- 2 files changed, 73 insertions(+), 20 deletions(-) diff --git a/doc/qcvm.1 b/doc/qcvm.1 index 1d89595..b018a8f 100644 --- a/doc/qcvm.1 +++ b/doc/qcvm.1 @@ -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 , or see on how to contact us. diff --git a/exec.c b/exec.c index ca98675..dc5980d 100644 --- 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]); -- 2.39.2