1
0
Fork 0
forked from fte/fteqw

uri_get now transfers self to the callback too. id also has full float precision now.

fix uri_post to not crash.
fix weirdness with double-defined functions when the first was defined noref.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4812 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2014-12-31 06:00:55 +00:00
parent 6268a645ae
commit 232c13caa3
4 changed files with 38 additions and 8 deletions

View file

@ -3648,20 +3648,23 @@ static void PR_uri_get_callback(struct dl_download *dl)
{ {
world_t *w = dl->user_ctx; world_t *w = dl->user_ctx;
pubprogfuncs_t *prinst = w->progs; pubprogfuncs_t *prinst = w->progs;
float id = dl->user_num; float id = dl->user_float;
int selfnum = dl->user_num;
func_t func; func_t func;
if (!prinst) if (!prinst)
return; return;
func = PR_FindFunction(prinst, "URI_Get_Callback", PR_ANY); func = PR_FindFunction(prinst, "URI_Get_Callback", PR_ANY);
if (!func)
if (func) Con_Printf("URI_Get_Callback missing\n");
else if (func)
{ {
int len; int len;
char *buffer; char *buffer;
struct globalvars_s *pr_globals = PR_globals(prinst, PR_CURRENT); struct globalvars_s *pr_globals = PR_globals(prinst, PR_CURRENT);
*w->g.self = selfnum;
G_FLOAT(OFS_PARM0) = id; G_FLOAT(OFS_PARM0) = id;
G_FLOAT(OFS_PARM1) = (dl->replycode!=200)?dl->replycode:0; //for compat with DP, we change any 200s to 0. G_FLOAT(OFS_PARM1) = (dl->replycode!=200)?dl->replycode:0; //for compat with DP, we change any 200s to 0.
G_INT(OFS_PARM2) = 0; G_INT(OFS_PARM2) = 0;
@ -3729,7 +3732,8 @@ void QCBUILTIN PF_uri_get (pubprogfuncs_t *prinst, struct globalvars_s *pr_glob
if (dl) if (dl)
{ {
dl->user_ctx = w; dl->user_ctx = w;
dl->user_num = id; dl->user_float = id;
dl->user_num = *w->g.self;
G_FLOAT(OFS_RETURN) = 1; G_FLOAT(OFS_RETURN) = 1;
} }
else else
@ -5374,7 +5378,7 @@ lh_extension_t QSG_Extensions[] = {
{"DP_QC_UNLIMITEDTEMPSTRINGS"}, {"DP_QC_UNLIMITEDTEMPSTRINGS"},
{"DP_QC_URI_ESCAPE", 2, NULL, {"uri_escape", "uri_unescape"}}, {"DP_QC_URI_ESCAPE", 2, NULL, {"uri_escape", "uri_unescape"}},
{"DP_QC_URI_GET", 1, NULL, {"uri_get"}}, {"DP_QC_URI_GET", 1, NULL, {"uri_get"}},
//test {"DP_QC_URI_POST", 1, NULL, {"uri_get"}}, {"DP_QC_URI_POST", 1, NULL, {"uri_get"}},
{"DP_QC_VECTOANGLES_WITH_ROLL"}, {"DP_QC_VECTOANGLES_WITH_ROLL"},
{"DP_QC_VECTORVECTORS", 1, NULL, {"vectorvectors"}}, {"DP_QC_VECTORVECTORS", 1, NULL, {"vectorvectors"}},
{"DP_QC_WHICHPACK", 1, NULL, {"whichpack"}}, {"DP_QC_WHICHPACK", 1, NULL, {"whichpack"}},

View file

@ -277,7 +277,7 @@ It doesn't use persistant connections.
*/ */
struct http_dl_ctx_s { struct http_dl_ctx_s {
struct dl_download *dlctx; // struct dl_download *dlctx;
#if 1 #if 1
vfsfile_t *sock; vfsfile_t *sock;
@ -801,7 +801,7 @@ void HTTPDL_Establish(struct dl_download *dl)
#endif #endif
if (dl->postdata) if (dl->postdata)
{ {
ExpandBuffer(con, 1024 + strlen(uri) + strlen(server) + strlen(con->dlctx->postmimetype) + dl->postlen); ExpandBuffer(con, 1024 + strlen(uri) + strlen(server) + strlen(dl->postmimetype) + dl->postlen);
Q_snprintfz(con->buffer, con->bufferlen, Q_snprintfz(con->buffer, con->bufferlen,
"POST %s HTTP/1.1\r\n" "POST %s HTTP/1.1\r\n"
"Host: %s\r\n" "Host: %s\r\n"

View file

@ -101,6 +101,7 @@ struct dl_download
{ {
/*not used by anything in the download itself, useful for context*/ /*not used by anything in the download itself, useful for context*/
unsigned int user_num; unsigned int user_num;
float user_float;
void *user_ctx; void *user_ctx;
qdownload_t qdownload; qdownload_t qdownload;

View file

@ -10771,7 +10771,32 @@ void QCC_PR_ParseInitializerType(int arraysize, QCC_def_t *def, QCC_type_t *type
f = NULL; f = NULL;
} }
else else
{
if (def->initialized == 1)
{
//normally this is an error, but to aid supporting new stuff with old, we convert it into a warning if a vanilla(ish) qc function replaces extension builtins.
//the qc function is the one that is used, but there is a warning so you know how to gain efficiency.
int bi = -1;
if (def->type->type == ev_function && !arraysize)
{
if (!strcmp(def->name, "anglemod"))
bi = G_INT(def->ofs);
}
if (bi <= 0 || bi >= numfunctions)
bi = 0;
else
bi = functions[bi].first_statement;
if (bi < 0)
{
QCC_PR_ParseWarning(WARN_NOTSTANDARDBEHAVIOUR, "%s already declared as builtin", def->name);
QCC_PR_ParsePrintDef(WARN_NOTSTANDARDBEHAVIOUR, def);
def->initialized = 3;
}
else
QCC_PR_ParseErrorPrintDef (ERR_REDECLARATION, def, "redeclaration of function body");
}
f = QCC_PR_ParseImmediateStatements (type); f = QCC_PR_ParseImmediateStatements (type);
}
if (!tmp) if (!tmp)
{ {
pr_scope = parentfunc; pr_scope = parentfunc;
@ -10935,7 +10960,7 @@ void QCC_PR_ParseInitializerType(int arraysize, QCC_def_t *def, QCC_type_t *type
void QCC_PR_ParseInitializerDef(QCC_def_t *def) void QCC_PR_ParseInitializerDef(QCC_def_t *def)
{ {
QCC_PR_ParseInitializerType(def->arraysize, def, def->type, def->ofs); QCC_PR_ParseInitializerType(def->arraysize, def, def->type, def->ofs);
if (!def->initialized) if (!def->initialized || def->initialized == 3)
def->initialized = 1; def->initialized = 1;
} }