From 3d37c5ab719bf7038e242f8b542dee6bb1908831 Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Sun, 26 Oct 2008 23:58:06 +0000 Subject: Function to extract an integer from a css_string. Use this in font-weight parsing. TODO: NUMBER tokens may contain [-+]? ([0-9]+ | [0-9]* '.' [0-9]+). The lexer currently doesn't cater for the [-+]? part. This is a bug (inherited from the grammar in the spec), and must be fixed. TODO: integer_from_css_string probably wants to pass out the number of characters processed so that the client can determine if the input was valid for their context. svn path=/trunk/libcss/; revision=5645 --- src/utils/utils.h | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) (limited to 'src/utils/utils.h') diff --git a/src/utils/utils.h b/src/utils/utils.h index ac19e59..85a4f9e 100644 --- a/src/utils/utils.h +++ b/src/utils/utils.h @@ -2,12 +2,14 @@ * This file is part of LibCSS. * Licensed under the MIT License, * http://www.opensource.org/licenses/mit-license.php - * Copyright 2007 John-Mark Bell + * Copyright 2007-8 John-Mark Bell */ #ifndef css_utils_h_ #define css_utils_h_ +#include + #ifndef max #define max(a,b) ((a)>(b)?(a):(b)) #endif @@ -25,4 +27,44 @@ #define UNUSED(x) ((x)=(x)) #endif +static inline int32_t integer_from_css_string(const css_string *string) +{ + size_t len; + const uint8_t *ptr; + int sign = 1; + int32_t val = 0; + + if (string == NULL || string->len == 0) + return 0; + + len = string->len; + ptr = string->ptr; + + /* Extract sign, if any */ + if (ptr[0] == '-') { + sign = -1; + len--; + ptr++; + } else if (ptr[0] == '+') { + len--; + ptr++; + } + + /** \todo check for overflow */ + + /* Now extract value, assuming base 10 */ + while (len > 0) { + /* Stop on first non-digit */ + if (ptr[0] <= '0' || '9' <= ptr[0]) + break; + + val *= 10; + val += ptr[0] - '0'; + ptr++; + len--; + } + + return val * sign; +} + #endif -- cgit v1.2.3