X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=prvm_cmds.c;h=a819196f4a0a74933b9dbb50efa33aa781d6f18c;hb=68df12c14ca723e8cca3d0c0ce21a11cdb12fe2c;hp=63f17f2909a97d1fdebe64bdd97ebbdd0adfb492;hpb=50f3f558108be1cf9e79f516bfdb257d2b50e2c5;p=xonotic%2Fdarkplaces.git diff --git a/prvm_cmds.c b/prvm_cmds.c index 63f17f29..a819196f 100644 --- a/prvm_cmds.c +++ b/prvm_cmds.c @@ -439,6 +439,7 @@ float CVAR_TYPEFLAG_SAVED = 2; float CVAR_TYPEFLAG_PRIVATE = 4; float CVAR_TYPEFLAG_ENGINE = 8; float CVAR_TYPEFLAG_HASDESCRIPTION = 16; +float CVAR_TYPEFLAG_READONLY = 32; ================= */ void VM_cvar_type (void) @@ -466,8 +467,10 @@ void VM_cvar_type (void) ret |= 4; // CVAR_TYPE_PRIVATE if(!(cvar->flags & CVAR_ALLOCATED)) ret |= 8; // CVAR_TYPE_ENGINE - if(strcmp(cvar->description, "custom cvar")) // has to match Cvar_Get's placeholder string + if(cvar->description != cvar_dummy_description) ret |= 16; // CVAR_TYPE_HASDESCRIPTION + if(cvar->flags & CVAR_READONLY) + ret |= 32; // CVAR_TYPE_READONLY PRVM_G_FLOAT(OFS_RETURN) = ret; } @@ -504,6 +507,22 @@ void VM_cvar_defstring (void) VM_CheckEmptyString(string); PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(Cvar_VariableDefString(string)); } + +/* +======================== +VM_cvar_defstring + +const string VM_cvar_description (string, ...) +======================== +*/ +void VM_cvar_description (void) +{ + char string[VM_STRINGTEMP_LENGTH]; + VM_SAFEPARMCOUNTRANGE(1,8,VM_cvar_description); + VM_VarString(0, string, sizeof(string)); + VM_CheckEmptyString(string); + PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(Cvar_VariableDescription(string)); +} /* ================= VM_cvar_set @@ -1439,7 +1458,7 @@ void VM_registercvar (void) return; } - Cvar_Get(name, value, flags); + Cvar_Get(name, value, flags, NULL); PRVM_G_FLOAT(OFS_RETURN) = 1; // success } @@ -1922,7 +1941,7 @@ void VM_putentityfieldstring(void) } // parse the string into the value - PRVM_G_FLOAT(OFS_RETURN) = ( PRVM_ED_ParseEpair(ent, d, PRVM_G_STRING(OFS_PARM2)) ) ? 1.0f : 0.0f; + PRVM_G_FLOAT(OFS_RETURN) = ( PRVM_ED_ParseEpair(ent, d, PRVM_G_STRING(OFS_PARM2), false) ) ? 1.0f : 0.0f; } /* @@ -2274,15 +2293,15 @@ static int num_tokens = 0; static int tokens[256]; static int tokens_startpos[256]; static int tokens_endpos[256]; +static char tokenize_string[VM_STRINGTEMP_LENGTH]; void VM_tokenize (void) { const char *p; - const char *string; VM_SAFEPARMCOUNT(1,VM_tokenize); - string = PRVM_G_STRING(OFS_PARM0); - p = string; + strlcpy(tokenize_string, PRVM_G_STRING(OFS_PARM0), sizeof(tokenize_string)); + p = tokenize_string; num_tokens = 0; for(;;) @@ -2294,10 +2313,10 @@ void VM_tokenize (void) while(*p && ISWHITESPACE(*p)) ++p; - tokens_startpos[num_tokens] = p - string; + tokens_startpos[num_tokens] = p - tokenize_string; if(!COM_ParseToken_VM_Tokenize(&p, false)) break; - tokens_endpos[num_tokens] = p - string; + tokens_endpos[num_tokens] = p - tokenize_string; tokens[num_tokens] = PRVM_SetTempString(com_token); ++num_tokens; } @@ -2309,12 +2328,11 @@ void VM_tokenize (void) void VM_tokenize_console (void) { const char *p; - const char *string; VM_SAFEPARMCOUNT(1,VM_tokenize); - string = PRVM_G_STRING(OFS_PARM0); - p = string; + strlcpy(tokenize_string, PRVM_G_STRING(OFS_PARM0), sizeof(tokenize_string)); + p = tokenize_string; num_tokens = 0; for(;;) @@ -2326,10 +2344,10 @@ void VM_tokenize_console (void) while(*p && ISWHITESPACE(*p)) ++p; - tokens_startpos[num_tokens] = p - string; + tokens_startpos[num_tokens] = p - tokenize_string; if(!COM_ParseToken_Console(&p)) break; - tokens_endpos[num_tokens] = p - string; + tokens_endpos[num_tokens] = p - tokenize_string; tokens[num_tokens] = PRVM_SetTempString(com_token); ++num_tokens; } @@ -2360,12 +2378,11 @@ void VM_tokenizebyseparator (void) const char *p; const char *token; char tokentext[MAX_INPUTLINE]; - const char *string; VM_SAFEPARMCOUNTRANGE(2, 8,VM_tokenizebyseparator); - string = PRVM_G_STRING(OFS_PARM0); - p = string; + strlcpy(tokenize_string, PRVM_G_STRING(OFS_PARM0), sizeof(tokenize_string)); + p = tokenize_string; numseparators = 0; for (j = 1;j < prog->argc;j++) @@ -2385,7 +2402,7 @@ void VM_tokenizebyseparator (void) while (num_tokens < (int)(sizeof(tokens)/sizeof(tokens[0]))) { token = tokentext + j; - tokens_startpos[num_tokens] = p - string; + tokens_startpos[num_tokens] = p - tokenize_string; while (*p) { for (k = 0;k < numseparators;k++) @@ -2402,7 +2419,7 @@ void VM_tokenizebyseparator (void) tokentext[j++] = *p; p++; } - tokens_endpos[num_tokens] = p - string; + tokens_endpos[num_tokens] = p - tokenize_string; if (j >= (int)sizeof(tokentext)) break; tokentext[j++] = 0; @@ -2895,7 +2912,7 @@ dp_font_t *getdrawfont() { if(prog->globaloffsets.drawfont >= 0) { - int f = PRVM_G_FLOAT(prog->globaloffsets.drawfont); + int f = (int) PRVM_G_FLOAT(prog->globaloffsets.drawfont); if(f < 0 || f >= MAX_FONTS) return FONT_DEFAULT; return &dp_fonts[f]; @@ -3576,7 +3593,7 @@ void VM_gecko_keyevent( void ) { return; } - PRVM_G_FLOAT( OFS_RETURN ) = (CL_Gecko_Event_Key( instance, key, eventtype ) == true); + PRVM_G_FLOAT( OFS_RETURN ) = (CL_Gecko_Event_Key( instance, (keynum_t) key, eventtype ) == true); } /* @@ -3629,7 +3646,7 @@ void VM_gecko_resize( void ) { if( !instance ) { return; } - CL_Gecko_Resize( instance, w, h ); + CL_Gecko_Resize( instance, (int) w, (int) h ); } @@ -3962,7 +3979,7 @@ static void BufStr_Expand(prvm_stringbuffer_t *stringbuffer, int strindex) stringbuffer->max_strings = max(stringbuffer->max_strings * 2, 128); while (stringbuffer->max_strings <= strindex) stringbuffer->max_strings *= 2; - stringbuffer->strings = Mem_Alloc(prog->progs_mempool, stringbuffer->max_strings * sizeof(stringbuffer->strings[0])); + stringbuffer->strings = (char **) Mem_Alloc(prog->progs_mempool, stringbuffer->max_strings * sizeof(stringbuffer->strings[0])); if (stringbuffer->num_strings > 0) memcpy(stringbuffer->strings, oldstrings, stringbuffer->num_strings * sizeof(stringbuffer->strings[0])); if (oldstrings) @@ -4018,7 +4035,7 @@ void VM_buf_create (void) prvm_stringbuffer_t *stringbuffer; int i; VM_SAFEPARMCOUNT(0, VM_buf_create); - stringbuffer = Mem_ExpandableArray_AllocRecord(&prog->stringbuffersarray); + stringbuffer = (prvm_stringbuffer_t *) Mem_ExpandableArray_AllocRecord(&prog->stringbuffersarray); for (i = 0;stringbuffer != Mem_ExpandableArray_RecordAtIndex(&prog->stringbuffersarray, i);i++); stringbuffer->origin = PRVM_AllocationOrigin(); PRVM_G_FLOAT(OFS_RETURN) = i; @@ -4368,6 +4385,91 @@ void VM_bufstr_free (void) BufStr_Shrink(stringbuffer); } + + + + + + +void VM_buf_cvarlist(void) +{ + cvar_t *cvar; + const char *partial, *antipartial; + size_t len, antilen; + size_t alloclen; + qboolean ispattern, antiispattern; + int n; + prvm_stringbuffer_t *stringbuffer; + VM_SAFEPARMCOUNTRANGE(2, 3, VM_buf_cvarlist); + + stringbuffer = (prvm_stringbuffer_t *)Mem_ExpandableArray_RecordAtIndex(&prog->stringbuffersarray, (int)PRVM_G_FLOAT(OFS_PARM0)); + if(!stringbuffer) + { + VM_Warning("VM_bufstr_free: invalid buffer %i used in %s\n", (int)PRVM_G_FLOAT(OFS_PARM0), PRVM_NAME); + return; + } + + partial = PRVM_G_STRING(OFS_PARM1); + if(!partial) + len = 0; + else + len = strlen(partial); + + if(prog->argc == 3) + antipartial = PRVM_G_STRING(OFS_PARM2); + else + antipartial = NULL; + if(!antipartial) + antilen = 0; + else + antilen = strlen(antipartial); + + for (n = 0;n < stringbuffer->num_strings;n++) + if (stringbuffer->strings[n]) + Mem_Free(stringbuffer->strings[n]); + if (stringbuffer->strings) + Mem_Free(stringbuffer->strings); + stringbuffer->strings = NULL; + + ispattern = partial && (strchr(partial, '*') || strchr(partial, '?')); + antiispattern = antipartial && (strchr(antipartial, '*') || strchr(antipartial, '?')); + + n = 0; + for(cvar = cvar_vars; cvar; cvar = cvar->next) + { + if(len && (ispattern ? !matchpattern_with_separator(cvar->name, partial, false, "", false) : strncmp(partial, cvar->name, len))) + continue; + + if(antilen && (antiispattern ? matchpattern_with_separator(cvar->name, antipartial, false, "", false) : !strncmp(antipartial, cvar->name, antilen))) + continue; + + ++n; + } + + stringbuffer->max_strings = stringbuffer->num_strings = n; + if (stringbuffer->max_strings) + stringbuffer->strings = (char **)Mem_Alloc(prog->progs_mempool, sizeof(stringbuffer->strings[0]) * stringbuffer->max_strings); + + n = 0; + for(cvar = cvar_vars; cvar; cvar = cvar->next) + { + if(len && (ispattern ? !matchpattern_with_separator(cvar->name, partial, false, "", false) : strncmp(partial, cvar->name, len))) + continue; + + if(antilen && (antiispattern ? matchpattern_with_separator(cvar->name, antipartial, false, "", false) : !strncmp(antipartial, cvar->name, antilen))) + continue; + + alloclen = strlen(cvar->name) + 1; + stringbuffer->strings[n] = (char *)Mem_Alloc(prog->progs_mempool, alloclen); + memcpy(stringbuffer->strings[n], cvar->name, alloclen); + + ++n; + } +} + + + + //============= /* @@ -4515,7 +4617,7 @@ void VM_strstrofs (void) VM_SAFEPARMCOUNTRANGE(2, 3, VM_strstrofs); instr = PRVM_G_STRING(OFS_PARM0); match = PRVM_G_STRING(OFS_PARM1); - firstofs = (prog->argc > 2)?PRVM_G_FLOAT(OFS_PARM2):0; + firstofs = (prog->argc > 2)?(int)PRVM_G_FLOAT(OFS_PARM2):0; if (firstofs && (firstofs < 0 || firstofs > (int)strlen(instr))) { @@ -4644,9 +4746,9 @@ void VM_strconv (void) VM_SAFEPARMCOUNTRANGE(3, 8, VM_strconv); - ccase = PRVM_G_FLOAT(OFS_PARM0); //0 same, 1 lower, 2 upper - redalpha = PRVM_G_FLOAT(OFS_PARM1); //0 same, 1 white, 2 red, 5 alternate, 6 alternate-alternate - rednum = PRVM_G_FLOAT(OFS_PARM2); //0 same, 1 white, 2 red, 3 redspecial, 4 whitespecial, 5 alternate, 6 alternate-alternate + ccase = (int) PRVM_G_FLOAT(OFS_PARM0); //0 same, 1 lower, 2 upper + redalpha = (int) PRVM_G_FLOAT(OFS_PARM1); //0 same, 1 white, 2 red, 5 alternate, 6 alternate-alternate + rednum = (int) PRVM_G_FLOAT(OFS_PARM2); //0 same, 1 white, 2 red, 3 redspecial, 4 whitespecial, 5 alternate, 6 alternate-alternate VM_VarString(3, (char *) resbuf, sizeof(resbuf)); len = strlen((char *) resbuf); @@ -4689,7 +4791,7 @@ void VM_strpad (void) char destbuf[VM_STRINGTEMP_LENGTH]; int pad; VM_SAFEPARMCOUNTRANGE(1, 8, VM_strpad); - pad = PRVM_G_FLOAT(OFS_PARM0); + pad = (int) PRVM_G_FLOAT(OFS_PARM0); VM_VarString(1, src, sizeof(src)); // note: < 0 = left padding, > 0 = right padding, @@ -4944,7 +5046,7 @@ uri_to_prog_t; static void uri_to_string_callback(int status, size_t length_received, unsigned char *buffer, void *cbdata) { - uri_to_prog_t *handle = cbdata; + uri_to_prog_t *handle = (uri_to_prog_t *) cbdata; if(!PRVM_ProgLoaded(handle->prognr)) { @@ -4987,7 +5089,7 @@ void VM_uri_get (void) url = PRVM_G_STRING(OFS_PARM0); id = PRVM_G_FLOAT(OFS_PARM1); - handle = Z_Malloc(sizeof(*handle)); // this can't be the prog's mem pool, as curl may call the callback later! + handle = (uri_to_prog_t *) Z_Malloc(sizeof(*handle)); // this can't be the prog's mem pool, as curl may call the callback later! handle->prognr = PRVM_GetProgNr(); handle->starttime = prog->starttime; @@ -5016,7 +5118,7 @@ void VM_netaddress_resolve (void) ip = PRVM_G_STRING(OFS_PARM0); port = 0; if(prog->argc > 1) - port = PRVM_G_FLOAT(OFS_PARM1); + port = (int) PRVM_G_FLOAT(OFS_PARM1); if(LHNETADDRESS_FromString(&addr, ip, port) && LHNETADDRESS_ToString(&addr, normalized, sizeof(normalized), prog->argc > 1)) PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(normalized);