static xmlNodePtr guess_array_map(encodeTypePtr type, zval *data, int style);
static xmlNodePtr to_xml_map(encodeTypePtr type, zval *data, int style);
+static xmlNodePtr to_xml_list(encodeTypePtr enc, zval *data, int style);
+static xmlNodePtr to_xml_list1(encodeTypePtr enc, zval *data, int style);
+
/* Datetime encode/decode */
static xmlNodePtr to_xml_datetime_ex(encodeTypePtr type, zval *data, char *format, int style);
static xmlNodePtr to_xml_datetime(encodeTypePtr type, zval *data, int style);
{{XSD_TOKEN, XSD_TOKEN_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
{{XSD_LANGUAGE, XSD_LANGUAGE_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
{{XSD_NMTOKEN, XSD_NMTOKEN_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
- {{XSD_NMTOKENS, XSD_NMTOKENS_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
+ {{XSD_NMTOKENS, XSD_NMTOKENS_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_list1},
{{XSD_NAME, XSD_NAME_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
{{XSD_NCNAME, XSD_NCNAME_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
{{XSD_ID, XSD_ID_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
{{XSD_IDREF, XSD_IDREF_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
- {{XSD_IDREFS, XSD_IDREFS_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
+ {{XSD_IDREFS, XSD_IDREFS_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_list1},
{{XSD_ENTITY, XSD_ENTITY_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
- {{XSD_ENTITIES, XSD_ENTITIES_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
+ {{XSD_ENTITIES, XSD_ENTITIES_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_list1},
{{APACHE_MAP, APACHE_MAP_STRING, APACHE_NAMESPACE, NULL}, to_zval_map, to_xml_map},
if (data && data->children) {
if (data->children->type == XML_TEXT_NODE && data->children->next == NULL) {
- unsigned long val = 0;
- char *s;
whiteSpace_collapse(data->children->content);
- s = data->children->content;
- while (*s >= '0' && *s <= '9') {
- val = (val*10)+(*s-'0');
- s++;
- }
- if ((long)val >= 0) {
- ZVAL_LONG(ret, val);
+ errno = 0;
+ ret->value.lval = strtol(data->children->content, NULL, 0);
+ if (errno == ERANGE) { /* overflow */
+ ret->value.dval = strtod(data->children->content, NULL);
+ ret->type = IS_DOUBLE;
} else {
- ZVAL_STRING(ret, data->children->content, 1);
+ ret->type = IS_LONG;
}
} else {
php_error(E_ERROR,"Violation of encoding rules");
static xmlNodePtr to_xml_ulong(encodeTypePtr type, zval *data, int style)
{
xmlNodePtr ret;
- zval tmp;
ret = xmlNewNode(NULL, "BOGUS");
FIND_ZVAL_NULL(data, ret, style);
- /* TODO: long overflow */
- tmp = *data;
- zval_copy_ctor(&tmp);
- if (Z_TYPE(tmp) != IS_LONG) {
- convert_to_long(&tmp);
+ if (Z_TYPE_P(data) == IS_DOUBLE) {
+ char s[16];
+ sprintf(s, "%0.0F",Z_DVAL_P(data));
+ xmlNodeSetContent(ret, s);
+ } else {
+ zval tmp = *data;
+
+ zval_copy_ctor(&tmp);
+ if (Z_TYPE(tmp) != IS_LONG) {
+ convert_to_long(&tmp);
+ }
+ convert_to_string(&tmp);
+ xmlNodeSetContentLen(ret, Z_STRVAL(tmp), Z_STRLEN(tmp));
+ zval_dtor(&tmp);
}
- convert_to_string(&tmp);
- xmlNodeSetContentLen(ret, Z_STRVAL(tmp), Z_STRLEN(tmp));
- zval_dtor(&tmp);
if (style == SOAP_ENCODED) {
set_ns_and_type(ret, type);
if (Z_TYPE_P(data) == IS_LONG) {
timestamp = Z_LVAL_P(data);
- /*time(×tamp);*/
ta = php_localtime_r(×tamp, &tmbuf);
+ /*ta = php_gmtime_r(×tamp, &tmbuf);*/
buf = (char *) emalloc(buf_len);
while ((real_len = strftime(buf, buf_len, format, ta)) == buf_len || real_len == 0) {
return ret;
}
+static xmlNodePtr to_xml_list1(encodeTypePtr enc, zval *data, int style) {
+ /*FIXME: minLength=1 */
+ return to_xml_list(enc,data,style);
+}
+
static zval* to_zval_union(encodeTypePtr enc, xmlNodePtr data) {
/*FIXME*/
return to_zval_list(enc, data);
sdlTypePtr type;
type = enc->sdl_type;
-
+/*FIXME: restriction support
if (type && type->restrictions &&
data && data->children && data->children->content) {
if (type->restrictions->whiteSpace && type->restrictions->whiteSpace->value) {
php_error(E_WARNING,"Restriction: length is not equal to 'length'");
}
}
+*/
switch (type->kind) {
case XSD_TYPEKIND_SIMPLE:
if (type->encode && enc != &type->encode->details) {
type = enc->sdl_type;
+/*FIXME: restriction support
if (type) {
if (type->restrictions && Z_TYPE_P(data) == IS_STRING) {
if (type->restrictions->enumeration) {
}
}
}
+*/
switch(type->kind) {
case XSD_TYPEKIND_SIMPLE:
if (type->encode && enc != &type->encode->details) {