/******************** * fact_values ********************/ static int fact_values(context_t *ctx, OhmFact *fact, term_t *pl_values) { int n = ctx->nfield; term_t list = PL_new_term_ref(); term_t item = PL_new_term_ref(); #ifdef __STRING_ONLY_FIELDS__ char value[64]; #endif PL_put_nil(list); while (n-- > 0) { #ifdef __STRING_ONLY_FIELDS__ if (!fact_field_value(fact, ctx->fields[n], value, sizeof(value))) return EINVAL; PL_put_atom_chars(item, value); #else if (!fact_field_term(fact, ctx->fields[n], item)) return EINVAL; #endif PL_cons_list(list, item, list); } *pl_values = list; return 0; }
/******************** * swi_list_new ********************/ term_t swi_list_new(char **items, int n, term_t result) { term_t list = PL_new_term_ref(); term_t item = PL_new_term_ref(); if (n < 0) { /* NULL-terminated list, calculate items */ n = 0; if (items) while (items[n]) n++; } PL_put_nil(list); while (n-- > 0) { PL_put_atom_chars(item, items[n]); PL_cons_list(list, item, list); } if (result && PL_is_variable(result)) PL_unify(list, result); return list; }
int get_raw_form_data(char **data, size_t *lenp, int *must_free) { char *method; char *s; if ( (method = getenv("REQUEST_METHOD")) && strcmp(method, "POST") == 0 ) { char *lenvar = getenv("CONTENT_LENGTH"); char *q; long len; if ( !lenvar ) { term_t env = PL_new_term_ref(); PL_put_atom_chars(env, "CONTENT_LENGTH"); return pl_error(NULL, 0, NULL, ERR_EXISTENCE, "environment", env); } len = atol(lenvar); if ( len < 0 ) { term_t t = PL_new_term_ref(); if ( !PL_put_integer(t, len) ) return FALSE; return pl_error(NULL, 0, "< 0", ERR_DOMAIN, t, "content_length"); } if ( lenp ) { if ( *lenp && (size_t)len > *lenp ) { term_t t = PL_new_term_ref(); char msg[100]; if ( !PL_put_integer(t, len) ) return FALSE; sprintf(msg, "> %ld", (long)*lenp); return pl_error(NULL, 0, msg, ERR_DOMAIN, t, "content_length"); } *lenp = len; } q = s = malloc(len+1); if ( !q ) return pl_error(NULL, 0, NULL, ERR_RESOURCE, "memory"); while(len > 0) { int done; while( (done=read(fileno(stdin), q, len)) > 0 ) { q+=done; len-=done; } if ( done < 0 ) { int e; term_t obj; no_data: e = errno; obj = PL_new_term_ref(); free(s); PL_put_nil(obj); return pl_error(NULL, 0, NULL, ERR_ERRNO, e, "read", "cgi_data", obj); } } if ( len == 0 ) { *q = '\0'; *data = s; *must_free = TRUE; return TRUE; } else goto no_data; } else if ( (s = getenv("QUERY_STRING")) ) { if ( lenp ) *lenp = strlen(s); *data = s; *must_free = FALSE; return TRUE; } else { term_t env = PL_new_term_ref(); PL_put_atom_chars(env, "QUERY_STRING"); return pl_error(NULL, 0, NULL, ERR_EXISTENCE, "environment", env); } }