+/*
+ +--------------------------------------------------------------------+
+ | PECL :: http |
+ +--------------------------------------------------------------------+
+ | Redistribution and use in source and binary forms, with or without |
+ | modification, are permitted provided that the conditions mentioned |
+ | in the accompanying LICENSE file are met. |
+ +--------------------------------------------------------------------+
+ | Copyright (c) 2004-2014, Michael Wallner <mike@php.net> |
+ +--------------------------------------------------------------------+
+*/
+
+#include "php_http_api.h"
+
+php_http_version_t *php_http_version_init(php_http_version_t *v, unsigned major, unsigned minor TSRMLS_DC)
+{
+ if (!v) {
+ v = emalloc(sizeof(*v));
+ }
+
+ v->major = major;
+ v->minor = minor;
+
+ return v;
+}
+
+php_http_version_t *php_http_version_parse(php_http_version_t *v, const char *str TSRMLS_DC)
+{
+ long major, minor;
+ char separator = 0;
+ register const char *ptr = str;
+
+ switch (*ptr) {
+ case 'h':
+ case 'H':
+ ++ptr; if (*ptr != 't' && *ptr != 'T') break;
+ ++ptr; if (*ptr != 't' && *ptr != 'T') break;
+ ++ptr; if (*ptr != 'p' && *ptr != 'P') break;
+ ++ptr; if (*ptr != '/') break;
+ ++ptr;
+ /* no break */
+ default:
+ /* rfc7230#2.6 The HTTP version number consists of two decimal digits separated by a "." (period or decimal point) */
+ major = *ptr++ - '0';
+ if (major >= 0 && major <= 9) {
+ separator = *ptr++;
+ if (separator) {
+ if (separator != '.' && separator != ',') {
+ php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Non-standard version separator '%c' in HTTP protocol version '%s'", separator, ptr - 2);
+ }
+ minor = *ptr - '0';
+ if (minor >= 0 && minor <= 9) {
+ return php_http_version_init(v, major, minor TSRMLS_CC);
+ }
+ }
+ }
+ }
+
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not parse HTTP protocol version '%s'", str);
+ return NULL;
+}
+
+void php_http_version_to_string(php_http_version_t *v, char **str, size_t *len, const char *pre, const char *post TSRMLS_DC)
+{
+ *len = spprintf(str, 0, "%s%u.%u%s", pre ? pre : "", v->major, v->minor, post ? post : "");
+}
+
+void php_http_version_dtor(php_http_version_t *v)
+{
+ (void) v;
+}
+
+void php_http_version_free(php_http_version_t **v)
+{
+ if (*v) {
+ php_http_version_dtor(*v);
+ efree(*v);
+ *v = NULL;
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */
+