mangle.c \
preprocessor.c \
printer.c \
+ string_rep.c \
symbol_table.c \
token.c \
type.c \
*/
static ir_node *string_to_firm(source_position_t const *const src_pos, char const *const id_prefix, string_encoding_t const enc, string_t const *const value)
{
- size_t slen;
- ir_type *elem_type;
- ir_initializer_t *initializer;
+ size_t const slen = get_string_len(enc, value) + 1;
+ ir_initializer_t *const initializer = create_initializer_compound(slen);
+ ir_type * elem_type;
switch (enc) {
case STRING_ENCODING_CHAR: {
- slen = value->size + 1;
- elem_type = ir_type_char;
- initializer = create_initializer_compound(slen);
+ elem_type = ir_type_char;
ir_mode *const mode = get_type_mode(elem_type);
char const *p = value->begin;
}
case STRING_ENCODING_WIDE: {
- slen = wstrlen(value) + 1;
- elem_type = ir_type_wchar_t;
- initializer = create_initializer_compound(slen);
+ elem_type = ir_type_wchar_t;
ir_mode *const mode = get_type_mode(elem_type);
char const *p = value->begin;
break;
case INITIALIZER_STRING:
- size = result->string.string.size + 1;
+ size = get_string_len(result->string.encoding, &result->string.string) + 1;
break;
case INITIALIZER_DESIGNATOR:
literal->string_literal.encoding = token.string.encoding;
literal->string_literal.value = token.string.string;
+ size_t const size = get_string_len(token.string.encoding, &token.string.string);
switch (token.string.encoding) {
case STRING_ENCODING_CHAR:
literal->base.type = c_mode & _CXX ? type_char : type_int;
- if (literal->string_literal.value.size > 1) {
+ if (size > 1) {
if (!GNU_MODE && !(c_mode & _C99)) {
errorf(HERE, "more than 1 character in character constant");
} else {
case STRING_ENCODING_WIDE:
literal->base.type = type_int;
- if (wstrlen(&literal->string_literal.value) > 1) {
+ if (size > 1) {
warningf(WARN_MULTICHAR, HERE, "multi-character character constant");
}
break;
}
case EXPR_STRING_LITERAL: {
- size_t const size = expression->string_literal.value.size + 1;
+ size_t const size = get_string_len(expression->string_literal.encoding, &expression->string_literal.value) + 1;
type_t *const elem = get_unqualified_type(expression->base.type->pointer.points_to);
return make_array_type(elem, size, TYPE_QUALIFIER_NONE);
}
--- /dev/null
+#include "adt/error.h"
+#include "string_rep.h"
+
+static inline size_t wstrlen(const string_t *string)
+{
+ size_t result = 0;
+ const char *p = string->begin;
+ const char *end = p + string->size;
+ while (p < end) {
+ read_utf8_char(&p);
+ ++result;
+ }
+ return result;
+}
+
+size_t get_string_len(string_encoding_t const enc, string_t const *const str)
+{
+ switch (enc) {
+ case STRING_ENCODING_CHAR: return str->size;
+ case STRING_ENCODING_WIDE: return wstrlen(str);
+ }
+ panic("invalid string encoding");
+}
#include <stdlib.h>
#include "unicode.h"
+enum string_encoding_t {
+ STRING_ENCODING_CHAR,
+ STRING_ENCODING_WIDE
+};
+typedef enum string_encoding_t string_encoding_t;
+
typedef struct string_t {
const char *begin; /**< UTF-8 encoded string, the last character is
* guaranteed to be 0 */
size_t size; /**< size of string in bytes (not characters) */
} string_t;
-static inline size_t wstrlen(const string_t *string)
-{
- size_t result = 0;
- const char *p = string->begin;
- const char *end = p + string->size;
- while (p < end) {
- read_utf8_char(&p);
- ++result;
- }
- return result;
-}
+size_t get_string_len(string_encoding_t enc, string_t const *str);
#endif
symbol_t *symbol;
};
-enum string_encoding_t {
- STRING_ENCODING_CHAR,
- STRING_ENCODING_WIDE
-};
-typedef enum string_encoding_t string_encoding_t;
-
struct string_literal_t {
token_base_t base;
string_encoding_t encoding;