X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=php_http_api.h;h=f2c53121f5c9e994c719b610a2d6726dd3592831;hp=052fb1e1c817a9cb92bd5e99ff1930b9e724ba70;hb=0e0def98a4ea4463bf8c21c6f161b2b37aa8c49d;hpb=82e177a071d35372367f9f5255b3e2c553c8bffd diff --git a/php_http_api.h b/php_http_api.h index 052fb1e..f2c5312 100644 --- a/php_http_api.h +++ b/php_http_api.h @@ -191,6 +191,27 @@ static inline void _http_sleep(double s) #endif } +#define http_locate_str _http_locate_str +static inline const char *_http_locate_str(const char *h, size_t h_len, const char *n, size_t n_len) +{ + const char *p, *e; + + if (n_len && h_len) { + e = h + h_len; + do { + if (*h == *n) { + for (p = n; *p == h[p-n]; ++p) { + if (p == n+n_len-1) { + return h; + } + } + } + } while (h++ != e); + } + + return NULL; +} + #define http_locate_body _http_locate_body static inline const char *_http_locate_body(const char *message) { @@ -284,6 +305,42 @@ static inline void _zval_free(zval **z) *z = NULL; } +typedef struct _HashKey { + int type; + int dup; + char *str; + uint len; + ulong num; +} HashKey; +#define initHashKey(dup) {0, (dup), NULL, 0, 0} + +#define FOREACH_VAL(pos, array, val) FOREACH_HASH_VAL(pos, Z_ARRVAL_P(array), val) +#define FOREACH_HASH_VAL(pos, hash, val) \ + for ( zend_hash_internal_pointer_reset_ex(hash, &pos); \ + zend_hash_get_current_data_ex(hash, (void *) &val, &pos) == SUCCESS; \ + zend_hash_move_forward_ex(hash, &pos)) + +#define FOREACH_KEY(pos, array, key) FOREACH_HASH_KEY(pos, Z_ARRVAL_P(array), key) +#define FOREACH_HASH_KEY(pos, hash, _key) \ + for ( zend_hash_internal_pointer_reset_ex(hash, &pos); \ + ((_key).type = zend_hash_get_current_key_ex(hash, &(_key).str, &(_key).len, &(_key).num, (_key).dup, &pos)) != HASH_KEY_NON_EXISTANT; \ + zend_hash_move_forward_ex(hash, &pos)) \ + +#define FOREACH_KEYVAL(pos, array, key, val) FOREACH_HASH_KEYVAL(pos, Z_ARRVAL_P(array), key, val) +#define FOREACH_HASH_KEYVAL(pos, hash, _key, val) \ + for ( zend_hash_internal_pointer_reset_ex(hash, &pos); \ + ((_key).type = zend_hash_get_current_key_ex(hash, &(_key).str, &(_key).len, &(_key).num, (_key).dup, &pos)) != HASH_KEY_NON_EXISTANT && \ + zend_hash_get_current_data_ex(hash, (void *) &val, &pos) == SUCCESS; \ + zend_hash_move_forward_ex(hash, &pos)) + +#define array_copy(src, dst) zend_hash_copy(dst, src, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *)) +#define ARRAY_JOIN_STRONLY 1 +#define ARRAY_JOIN_PRETTIFY 2 +#define array_join(src, dst, append, flags) zend_hash_apply_with_arguments(src, (append)?apply_array_append_func:apply_array_merge_func, 2, dst, (int)flags) + +extern int apply_array_append_func(void *pDest, int num_args, va_list args, zend_hash_key *hash_key); +extern int apply_array_merge_func(void *pDest, int num_args, va_list args, zend_hash_key *hash_key); + #endif /*