diff --git a/common/Makefile b/common/Makefile index 594892ae9650c4875f6713ef686e3d45e6274950..9baaf6c5b70d055d2830faf1f145e2b15d55ac9e 100644 --- a/common/Makefile +++ b/common/Makefile @@ -35,7 +35,8 @@ GENERATED_SOURCES := pattern_la.cc pattern_p.cc pattern_uni.cc config_preproc_la # Sources in the CVS -STATIC_SOURCES := memory.c new.cc userinfo.c path.c config_preproc.cc Quadruple.cc Path2.cc ModuleVersion.cc JSON_Tokenizer.cc +STATIC_SOURCES := memory.c new.cc userinfo.c path.c config_preproc.cc Quadruple.cc \ + Path2.cc ModuleVersion.cc JSON_Tokenizer.cc UnicharPattern.cc ifndef MINGW STATIC_SOURCES += NetworkHandler.cc diff --git a/common/Quadruple.cc b/common/Quadruple.cc index d3d9dcd4b6d11b758bbd237f8d8b85d2c448d4e0..0a6677a4bacded197a6b67aa7fbfa944dfa38ddf 100644 --- a/common/Quadruple.cc +++ b/common/Quadruple.cc @@ -7,6 +7,7 @@ * * Contributors: * Balasko, Jeno + * Baranyi, Botond * Raduly, Csaba * Zalanyi, Balazs Andor * @@ -64,6 +65,13 @@ void Quad::set(unsigned char group, unsigned char plane, unsigned char row, u.comp.cell = cell; } +void Quad::set_hexrepr(const char* hex_repr) { + u.comp.group = ((hex_repr[0] - 'A') << 4) + (hex_repr[1] - 'A'); + u.comp.plane = ((hex_repr[2] - 'A') << 4) + (hex_repr[3] - 'A'); + u.comp.row = ((hex_repr[4] - 'A') << 4) + (hex_repr[5] - 'A'); + u.comp.cell = ((hex_repr[6] - 'A') << 4) + (hex_repr[7] - 'A'); +} + const Quad Quad::operator-(const Quad& rhs) const { return Quad(u.value - rhs.u.value); } diff --git a/common/Quadruple.hh b/common/Quadruple.hh index 6b146af45616a526c009c12d8c6ef791432765fb..c4a472470077eadae90cd04ce20f3968918ce4e0 100644 --- a/common/Quadruple.hh +++ b/common/Quadruple.hh @@ -7,6 +7,7 @@ * * Contributors: * Balasko, Jeno + * Baranyi, Botond * Raduly, Csaba * Zalanyi, Balazs Andor * @@ -72,6 +73,8 @@ public: * @param c Value to set. */ void set(int field, unsigned char c); + + void set_hexrepr(const char* hex_repr); const Quad operator-(const Quad& rhs) const; const Quad& operator=(const Quad& rhs); diff --git a/common/UnicharPattern.cc b/common/UnicharPattern.cc new file mode 100644 index 0000000000000000000000000000000000000000..8ba957e39533c1ddea933692c3f523a9ed888e66 --- /dev/null +++ b/common/UnicharPattern.cc @@ -0,0 +1,224 @@ +/****************************************************************************** + * Copyright (c) 2000-2016 Ericsson Telecom AB + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Baranyi, Botond – initial implementation + * + ******************************************************************************/ + +#include "UnicharPattern.hh" +#include "pattern.hh" +#include "memory.h" +#include <stdio.h> +#include <ctype.h> +#include <string.h> +#include <stdlib.h> + +////////////////////////////////////////////// +//////////// the global instance ///////////// +////////////////////////////////////////////// +UnicharPattern unichar_pattern; + +////////////////////////////////////////////// +////////////// helper functions ////////////// +////////////////////////////////////////////// + +/** removes spaces from the beginning and end of the input string and returns + * the result */ +static char* remove_spaces(char* str) +{ + if (str == NULL) { + return NULL; + } + size_t len = strlen(str); + size_t start = 0; + while (isspace(str[start])) { + ++start; + } + size_t end = len - 1; + while (isspace(str[end])) { + str[end] = '\0'; + --end; + } + return str + start; +} + +/** Exception class + * + * Thrown when one of the characters processed by hexchar_to_char or + * hexstr_to_char is not a hexadecimal digit */ +class NotHexException {}; + +/** converts a character containing a hexadecimal digit to its numeric value */ +static unsigned char hexchar_to_char(const char c) +{ + if (c >= '0' && c <= '9') { + return c - '0'; + } + else if (c >= 'A' && c <= 'F') { + return c + 10 - 'A'; + } + else if (c >= 'a' && c <= 'f') { + return c + 10 - 'a'; + } + throw NotHexException(); +} + +/** converts a string of two hexadecimal digits to the character the digits + * represent */ +static unsigned char hexstr_to_char(const char* hex_str) +{ + return (hexchar_to_char(hex_str[0]) << 4) | hexchar_to_char(hex_str[1]); +} + +////////////////////////////////////////////// +// member functions of class UnicharPattern // +////////////////////////////////////////////// +UnicharPattern::UnicharPattern() : mappings_head(NULL) +{ + // if anything goes wrong while parsing the case mappings file, just delete the + // partial results, display a warning, and treat all patterns as case-sensitive + const char* ttcn3_dir = getenv("TTCN3_DIR"); + if (ttcn3_dir == NULL) { + TTCN_pattern_warning("Environment variable TTCN3_DIR not present. " + "Case-insensitive universal charstring patterns are disabled.\n"); + return; + } + size_t ttcn3_dir_len = strlen(ttcn3_dir); + bool ends_with_slash = ttcn3_dir_len > 0 && ttcn3_dir[ttcn3_dir_len - 1] == '/'; + char* mappings_file = mprintf("%s%setc/CaseFolding.txt", ttcn3_dir, + ends_with_slash ? "" : "/"); + FILE* fp = fopen(mappings_file, "r"); + if (fp == NULL) { + TTCN_pattern_warning("Cannot open file '%s' for reading. " + "Case-insensitive universal charstring patterns are disabled.\n", mappings_file); + return; + } + + // this always points to the last element of the list + mapping_t* mappings_tail = NULL; + + // read one line at a time + char line[1024]; + while (fgets(line, sizeof(line), fp) != NULL) { + // ignore everything after the '#' (this is the 'comment' indicator) + char* line_end = strchr(line, '#'); + if (line_end != NULL) { + *line_end = '\0'; + } + // each column ends with a ';', use that as the separator for strtok + char* from_str = remove_spaces(strtok(line, ";")); + size_t from_str_len = from_str != NULL ? strlen(from_str) : 0; + if (from_str_len == 0) { + // nothing but comments and spaces in this line + continue; + } + // all character codes are 4 or 5 digits long + if (from_str_len < 4 || from_str_len > 5) { + TTCN_pattern_warning("Invalid format of case folding file (code column). " + "Case-insensitive universal charstring patterns are disabled.\n"); + clean_up(); + return; + } + char* status = remove_spaces(strtok(NULL, ";")); + // the status is one character long + if (status == NULL || strlen(status) != 1) { + TTCN_pattern_warning("Invalid format of case folding file (status column). " + "Case-insensitive universal charstring patterns are disabled.\n"); + clean_up(); + return; + } + else if (status[0] != 'C' && status[0] != 'S') { + // only use the lines with statuses 'C' and 'S', ignore the rest + continue; + } + char* to_str = remove_spaces(strtok(NULL, ";")); + size_t to_str_len = to_str != NULL ? strlen(to_str) : 0; + if (to_str_len < 4 || to_str_len > 5) { + TTCN_pattern_warning("Invalid format of case folding file (mapping column). " + "Case-insensitive universal charstring patterns are disabled.\n"); + clean_up(); + return; + } + + // create the new element + if (mappings_tail == NULL) { + mappings_head = new mapping_t; + mappings_tail = mappings_head; + } + else { + mappings_tail->next = new mapping_t; + mappings_tail = mappings_tail->next; + } + mappings_tail->next = NULL; + + // try to convert the extracted tokens to their character codes + try { + mappings_tail->from.set(0, from_str_len == 5 ? from_str[0] : 0, + hexstr_to_char(from_str + from_str_len - 4), + hexstr_to_char(from_str + from_str_len - 2)); + mappings_tail->to.set(0, to_str_len == 5 ? to_str[0] : 0, + hexstr_to_char(to_str + to_str_len - 4), + hexstr_to_char(to_str + to_str_len - 2)); + } + catch (NotHexException) { + // one of the tokens contained a non-hex character + TTCN_pattern_warning("Invalid format of case folding file (character code). " + "Case-insensitive universal charstring patterns are disabled.\n"); + clean_up(); + return; + } + } +} + +void UnicharPattern::clean_up() +{ + while (mappings_head != NULL) { + mapping_t* temp = mappings_head; + mappings_head = mappings_head->next; + delete temp; + } +} + +UnicharPattern::mapping_t* UnicharPattern::find_mapping(const Quad& q) const +{ + mapping_t* ptr = mappings_head; + while (ptr != NULL) { + if (ptr->from == q) { + return ptr; + } + ptr = ptr->next; + } + return NULL; +} + +Quad UnicharPattern::convert_quad_to_lowercase(const Quad& q) const +{ + mapping_t* mapping = find_mapping(q); + if (mapping != NULL) { + return mapping->to; + } + return q; +} + +void UnicharPattern::convert_regex_str_to_lowercase(char* str) const +{ + if (mappings_head != NULL) { + size_t len = strlen(str) / 8; + for (size_t i = 0; i < len; ++i) { + // the class 'Quad' contains the logic to convert to and from regex strings + Quad q; + q.set_hexrepr(str + 8 * i); + mapping_t* mapping = find_mapping(q); + if (mapping != NULL) { + // this call actually saves the specified Quad's regex string to the + // specified location in the string + Quad::get_hexrepr(mapping->to, str + 8 * i); + } + } + } +} diff --git a/common/UnicharPattern.hh b/common/UnicharPattern.hh new file mode 100644 index 0000000000000000000000000000000000000000..aa5f1c5a959266d02f9524a9ce6195034d5e9d6a --- /dev/null +++ b/common/UnicharPattern.hh @@ -0,0 +1,80 @@ +/****************************************************************************** + * Copyright (c) 2000-2016 Ericsson Telecom AB + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Baranyi, Botond – initial implementation + * + ******************************************************************************/ + +#ifndef UNICHARPATTERN_HH +#define UNICHARPATTERN_HH + +#include "Quadruple.hh" + +/** Helper class for handling case-insensitive universal charstring patterns + * (this includes all patterns used in universal charstring templates and + * universal charstring subtypes, and the universal charstring version of + * the predefined function 'regexp', as long as they have the '@nocase' modifier) + * + * Only one (global) instance of this class is created, which is used to convert + * the uppercase letters in patterns and the strings matched by the patterns + * to lowercase. + * + * The instance is initialized with a table at its construction, which contains + * the case mappings of Unicode characters (read from the file CaseFolding.txt, + * from the official Unicode site). + * + * This class does simple case foldings (from the folding types described in + * CaseFolding.txt), so only the mappings with statuses 'C' and 'S' are used. */ +class UnicharPattern { + + /** structure containing one character's mapping (linked list) */ + struct mapping_t { + /** character mapped from (uppercase letter) */ + Quad from; + /** character mapped to (lowercase letter) */ + Quad to; + /** pointer to the next element in the list */ + mapping_t* next; + }; + + /** pointer to the head of the linked list of mappings */ + mapping_t* mappings_head; + + /** deletes the mappings list */ + void clean_up(); + + /** finds and returns the mapping list element with the 'from' character + * equivalent to the parameter */ + mapping_t* find_mapping(const Quad& q) const; + +public: + + /** constructor - reads the case mappings from a text file and stores them + * in the linked list */ + UnicharPattern(); + + /** destructor - deletes the list */ + ~UnicharPattern() { clean_up(); } + + /** converts the specified character to lowercase (if it's an uppercase letter), + * and returns the result */ + Quad convert_quad_to_lowercase(const Quad& q) const; + + /** goes through the null-terminated regex string parameter and changes each + * uppercase letter to its lowercase equivalent + * @param str a universal charstring in regex format (meaning that every universal + * character is coded as 8 characters from 'A' to 'P', each representing a + * hexadecimal digit in the universal character's code) */ + void convert_regex_str_to_lowercase(char* str) const; +}; + +/** The one instance of the universal charstring pattern helper class. */ +extern UnicharPattern unichar_pattern; + +#endif /* UNICHARPATTERN_HH */ + diff --git a/common/pattern.hh b/common/pattern.hh index d87ef376e2b96e4728a7ee2564508f4ccfcee13c..ef0bbf8dab203a4fddb90da0d0544d1ee7fe623e 100644 --- a/common/pattern.hh +++ b/common/pattern.hh @@ -36,7 +36,7 @@ * to true, so no errors are reported for the extended ASCII characters. */ extern char* TTCN_pattern_to_regexp(const char* p_pattern, bool utf8 = false); -extern char* TTCN_pattern_to_regexp_uni(const char* p_pattern, +extern char* TTCN_pattern_to_regexp_uni(const char* p_pattern, bool p_nocase, int** groups = 0); /* defined elsewhere (can be different in compiler/runtime) */ diff --git a/common/pattern_uni.y b/common/pattern_uni.y index e98cc60964a9d47fb78ec7f39d460fb7bbaffb93..e882a1ce775edee120d1e832af60a6fa9a82b3e1 100644 --- a/common/pattern_uni.y +++ b/common/pattern_uni.y @@ -45,6 +45,7 @@ #include "pattern.hh" #include "Quadruple.hh" +#include "UnicharPattern.hh" union YYSTYPE; /* defined in lexer c-file: */ @@ -66,6 +67,8 @@ static int user_groups; + static bool nocase; + #define YYERROR_VERBOSE static void yyprint(FILE *file, int type, const YYSTYPE& value); @@ -381,12 +384,13 @@ RE_OneCharPos: { unsigned char c = $1; if ($1 <= 0) TTCN_pattern_error("Character with code %u " - "(0x%02x) cannot be used in a pattern for type charstring.", $1, $1); - $$ = Quad::get_hexrepr(c); + "(0x%02x) cannot be used in a pattern for type universal charstring.", $1, $1); + $$ = Quad::get_hexrepr(nocase ? tolower(c) : c); } | RE_Quadruple { - $$ = Quad::get_hexrepr($1.value); + $$ = Quad::get_hexrepr(nocase ? + unichar_pattern.convert_quad_to_lowercase($1.value).get_value() : $1.value); } | RE_Set { @@ -513,10 +517,11 @@ RE_Set_Range_Char: | TOK_Char { if ($1 <= 0) TTCN_pattern_error("Character with code %u " - "(0x%02x) cannot be used in a pattern for type charstring.", $1, $1); - $$.value = $1; + "(0x%02x) cannot be used in a pattern for type universal charstring.", $1, $1); + $$.value = nocase ? tolower($1) : $1; } -| RE_Quadruple { $$.value = $1.value; } +| RE_Quadruple { $$.value = nocase ? + unichar_pattern.convert_quad_to_lowercase($1.value).get_value() : $1.value; } ; RE_Set_NoRange_Char: @@ -582,13 +587,14 @@ RE_Quadruple: * Interface *********************************************************************/ -char* TTCN_pattern_to_regexp_uni(const char* p_pattern, int** groups) +char* TTCN_pattern_to_regexp_uni(const char* p_pattern, bool p_nocase, int** groups) { /* if you want to debug */ //pattern_unidebug=1; ret_val=NULL; user_groups = 0; + nocase = p_nocase; yy_buffer_state *flex_buffer = pattern_yy_scan_string(p_pattern); if(flex_buffer == NULL) { diff --git a/compiler2/Makefile b/compiler2/Makefile index a2789d57a5d100302f73a5b7bf6c3402518d95b7..9ee5cd08e9f819676ce0bbf68b8ac375fd6c730f 100644 --- a/compiler2/Makefile +++ b/compiler2/Makefile @@ -107,7 +107,7 @@ TCOV2LCOV_OBJECTS := $(patsubst %.cc,%.o,$(patsubst %.c,%.o,$(TCOV2LCOV_SOURCES) OBJECTS := $(COMPILER_OBJECTS) $(MFGEN_OBJECTS) $(TCOV2LCOV_OBJECTS) # Used by both the compiler and makefilegen -COMMON_OBJECTS := $(addprefix ../common/, memory.o path.o userinfo.o JSON_Tokenizer.o) +COMMON_OBJECTS := $(addprefix ../common/, memory.o path.o userinfo.o) TCOV2LCOV_COMMON_OBJECTS := ../common/memory.o @@ -121,7 +121,8 @@ ifdef REGEX_DIR endif COMPILER_COMMON_OBJECTS := $(COMMON_OBJECTS) \ -$(addprefix ../common/, new.o pattern_la.o pattern_p.o pattern_uni.o Quadruple.o ModuleVersion.o) +$(addprefix ../common/, new.o pattern_la.o pattern_p.o pattern_uni.o Quadruple.o \ +ModuleVersion.o JSON_Tokenizer.o UnicharPattern.o) ifeq ($(USAGE_STATS), yes) COMPILER_COMMON_OBJECTS += ../common/usage_stats.o diff --git a/compiler2/PredefFunc.cc b/compiler2/PredefFunc.cc index 2a36c8877af3bc6c47c4acfd0a01ab20aae21442..e91ee3f8b0e7d1396de88a2d98ab93b5f01c6ed6 100644 --- a/compiler2/PredefFunc.cc +++ b/compiler2/PredefFunc.cc @@ -28,6 +28,7 @@ #include <stdint.h> #include "../common/memory.h" #include "../common/pattern.hh" +#include "../common/UnicharPattern.hh" #include <iostream> // used by regex @@ -606,7 +607,7 @@ namespace Common { } string* regexp(const string& instr, const string& expression, - const Int& groupno) + const Int& groupno, bool nocase) { string *retval=0; @@ -627,7 +628,8 @@ namespace Common { } regex_t posix_regexp; - int ret_val=regcomp(&posix_regexp, posix_str, REG_EXTENDED); + int ret_val=regcomp(&posix_regexp, posix_str, REG_EXTENDED | + (nocase ? REG_ICASE : 0)); Free(posix_str); if(ret_val!=0) { /* regexp error */ @@ -671,7 +673,7 @@ namespace Common { } ustring* regexp(const ustring& instr, const ustring& expression, - const Int& groupno) + const Int& groupno, bool nocase) { ustring *retval=0; @@ -685,7 +687,7 @@ namespace Common { verb_level &= ~(1|2); int* user_groups; char *posix_str = TTCN_pattern_to_regexp_uni( - expression.get_stringRepr_for_pattern().c_str(), &user_groups); + expression.get_stringRepr_for_pattern().c_str(), nocase, &user_groups); if (user_groups == 0) FATAL_ERROR("regexp(): Cannot find any groups in the second argument."); verb_level = orig_verb_level; @@ -718,15 +720,18 @@ namespace Common { regmatch_t* pmatch = (regmatch_t*)Malloc((nmatch+1)*sizeof(regmatch_t)); char* tmp = instr.convert_to_regexp_form(); + + if (nocase) { + unichar_pattern.convert_regex_str_to_lowercase(tmp); + } + string instr_conv(tmp); Free(tmp); ret_val = regexec(&posix_regexp, instr_conv.c_str(), nmatch+1, pmatch, 0); if(ret_val == 0) { if(pmatch[nmatch].rm_so != -1 && pmatch[nmatch].rm_eo != -1) { - retval = new ustring( - instr_conv.substr(pmatch[nmatch].rm_so, - pmatch[nmatch].rm_eo - pmatch[nmatch].rm_so) - .convert_stringRepr_for_pattern()); + retval = new ustring(instr.extract_matched_section(pmatch[nmatch].rm_so, + pmatch[nmatch].rm_eo)); } else { retval = new ustring(); } } Free(pmatch); diff --git a/compiler2/PredefFunc.hh b/compiler2/PredefFunc.hh index 5416cb5b919cb1f74b444c82d61c508a917b54f5..c9d393f7441fb3ed188f790f99e6efcc49d34f02 100644 --- a/compiler2/PredefFunc.hh +++ b/compiler2/PredefFunc.hh @@ -62,9 +62,9 @@ namespace Common { extern int_val_t* float2int(const Real& value, const Location& loc); extern string* float2str(const Real& value); extern string* regexp(const string& instr, const string& expression, - const Int& groupno); + const Int& groupno, bool nocase); extern ustring* regexp(const ustring& instr, const ustring& expression, - const Int& groupno); + const Int& groupno, bool nocase); extern string* remove_bom(const string& encoded_value); extern string* get_stringencoding(const string& encoded_value); extern ustring decode_utf8(const string & ostr, CharCoding::CharCodingType expected_coding); diff --git a/compiler2/Value.cc b/compiler2/Value.cc index 5191ff06d06e52e2bc43e36e153b9d875248cec7..17831849f84c68dd0adc9744aa9c130cd6325602 100644 --- a/compiler2/Value.cc +++ b/compiler2/Value.cc @@ -262,6 +262,7 @@ namespace Common { u.expr.ti1=p.u.expr.ti1->clone(); u.expr.t2=p.u.expr.t2->clone(); u.expr.v3=p.u.expr.v3->clone(); + u.expr.b4=p.u.expr.b4; break; case OPTYPE_DECOMP: // v1 v2 v3 u.expr.v1=p.u.expr.v1->clone(); @@ -1184,8 +1185,9 @@ namespace Common { } // switch } - // ti1 t2 v3 - Value::Value(operationtype_t p_optype, TemplateInstance *p_ti1, TemplateInstance *p_t2, Value *p_v3) + // ti1 t2 v3 b4 + Value::Value(operationtype_t p_optype, TemplateInstance *p_ti1, + TemplateInstance *p_t2, Value *p_v3, bool p_b4) : GovernedSimple(S_V), valuetype(V_EXPR), my_governor(0) { u.expr.v_optype=p_optype; @@ -1195,7 +1197,8 @@ namespace Common { if(!p_ti1 || !p_t2 || !p_v3) FATAL_ERROR("Value::Value()"); u.expr.ti1 = p_ti1; u.expr.t2 = p_t2; - u.expr.v3=p_v3; + u.expr.v3 = p_v3; + u.expr.b4 = p_b4; break; default: FATAL_ERROR("Value::Value()"); @@ -8128,14 +8131,14 @@ error: if (v1->valuetype == V_CSTR) { const string& s1 = v1->get_val_str(); const string& s2 = v2->get_val_str(); - string *result = regexp(s1, s2, i3); + string *result = regexp(s1, s2, i3, u.expr.b4); clean_up(); valuetype = V_CSTR; set_val_str(result); } if (v1->valuetype == V_USTR) { const ustring& s1 = v1->get_val_ustr(); const ustring& s2 = v2->get_val_ustr(); - ustring *result = regexp(s1, s2, i3); + ustring *result = regexp(s1, s2, i3, u.expr.b4); clean_up(); valuetype = V_USTR; set_val_ustr(result); @@ -10783,7 +10786,11 @@ error: return ret_val; } case OPTYPE_REGEXP: { - string ret_val("regexp("); + string ret_val("regexp"); + if (u.expr.b4) { + ret_val += " @nocase "; + } + ret_val += "("; u.expr.ti1->append_stringRepr(ret_val); ret_val += ", "; u.expr.t2->append_stringRepr(ret_val); @@ -12545,7 +12552,7 @@ error: else u.expr.t2->generate_code(expr); expr->expr = mputstr(expr->expr, ", "); u.expr.v3->generate_code_expr_mandatory(expr); - expr->expr = mputc(expr->expr, ')'); + expr->expr = mputprintf(expr->expr, ", %s)", u.expr.b4 ? "TRUE" : "FALSE"); } void Value::generate_code_expr_replace(expression_struct *expr) diff --git a/compiler2/Value.hh b/compiler2/Value.hh index 5ee2d21a307dcf8ae890c5405c3771a13fae591e..79f3d868f0253f595d15f520db224deee6285192 100644 --- a/compiler2/Value.hh +++ b/compiler2/Value.hh @@ -213,7 +213,7 @@ namespace Common { OPTYPE_DECODE, // r1 r2 OPTYPE_SUBSTR, // ti1 v2 v3 - OPTYPE_REGEXP, // ti1 t2 v3 + OPTYPE_REGEXP, // ti1 t2 v3 b4 OPTYPE_DECOMP, // v1 v2 v3 66 OPTYPE_REPLACE, // ti1 v2 v3 ti4 @@ -428,8 +428,9 @@ namespace Common { Value(operationtype_t p_optype, TemplateInstance *p_ti1, Value *p_v2); /** Constructor used by V_EXPR "ti1 v2 v3" */ Value(operationtype_t p_optype, TemplateInstance *p_ti1, Value *p_v2, Value *p_v3); - /** Constructor used by V_EXPR "ti1 t2 v3" */ - Value(operationtype_t p_optype, TemplateInstance *p_ti1, TemplateInstance *p_t2, Value *p_v3); + /** Constructor used by V_EXPR "ti1 t2 v3 b4" */ + Value(operationtype_t p_optype, TemplateInstance *p_ti1, TemplateInstance *p_t2, + Value *p_v3, bool p_b4); /** Constructor used by V_EXPR "ti1 v2 v3 ti4" */ Value(operationtype_t p_optype, TemplateInstance *p_ti1, Value *p_v2, Value *p_v3, TemplateInstance *p_ti4); diff --git a/compiler2/string.cc b/compiler2/string.cc index 37275cbcc01de28edf956516a12ea8956a154875..ce9dea8913cee2e52b412e91ac15f0a794dc2e9b 100644 --- a/compiler2/string.cc +++ b/compiler2/string.cc @@ -405,31 +405,6 @@ string string::get_stringRepr() const return ret_val; } -ustring string::convert_stringRepr_for_pattern() const { - ustring ret_val; - - if (val_ptr->n_chars % 8 != 0) - FATAL_ERROR("string::convert_stringRepr_for_pattern(): Cannot create" - "universal string. Length must be a multiple of 8."); - - unsigned char c1, c2; - unsigned char array[4]; - size_t index = 0; - while (index < val_ptr->n_chars) { - for (size_t j = 0; j < 4; j++) { - c1 = (unsigned char)val_ptr->chars_ptr[index++]; - c2 = (unsigned char)val_ptr->chars_ptr[index++]; - if (c1 >= 'A' && c1 <= 'P' && c2 >= 'A' && c2 <= 'P') { - array[j] = ((c1 - 'A') << 4) | (c2 - 'A'); - } else - FATAL_ERROR("string::convert_stringRepr_for_pattern(): Cannot create" - "universal string. Source contains illegal character."); - } - ret_val += ustring(array[0], array[1], array[2], array[3]); - } - return ret_val; -} - string& string::operator=(const string& s) { if (&s != this) { diff --git a/compiler2/string.hh b/compiler2/string.hh index 8d13dac0f5e2a5785dc4f6b5df8a3c08a5bd843b..351c06698e5c7147e70ec1d59a5e8d7a59aa658c 100644 --- a/compiler2/string.hh +++ b/compiler2/string.hh @@ -160,11 +160,6 @@ public: * returned string. */ string get_stringRepr() const; - /** Creates universal string from pattern form: ([A-P]{8})* - * - */ - ustring convert_stringRepr_for_pattern() const; - /** Assignment operator. */ string& operator=(const string&); diff --git a/compiler2/subtypestuff.cc b/compiler2/subtypestuff.cc index ac5bb4644d9ef7e67af1abcf5e6bd95e4eb2ba41..4209f2e4363ac25f0bd00da5fe2372acb1d3f43f 100644 --- a/compiler2/subtypestuff.cc +++ b/compiler2/subtypestuff.cc @@ -508,7 +508,7 @@ tribool StringPatternConstraint::match(const string& str) const { string patt = pattern->get_full_str(); if (patt.size()==0) return TRIBOOL(str.size()==0); - string *result = regexp(str, string('(')+patt+string(')'), 0); + string *result = regexp(str, string('(')+patt+string(')'), 0, pattern->get_nocase()); bool rv = (result->size()!=0); delete result; return TRIBOOL(rv); @@ -517,7 +517,11 @@ tribool StringPatternConstraint::match(const string& str) const string StringPatternConstraint::to_string() const { string ret_val; - ret_val += "pattern("; + ret_val += "pattern "; + if (pattern->get_nocase()) { + ret_val += "@nocase "; + } + ret_val += "("; ret_val += pattern->get_full_str(); ret_val += ')'; return ret_val; diff --git a/compiler2/ttcn3/PatternString.cc b/compiler2/ttcn3/PatternString.cc index ad8c78fb4888978375f0c34cd02b9c5460ff5a4b..3feb9093094ceb6b0380f79a93b55bb2eebb2abf 100644 --- a/compiler2/ttcn3/PatternString.cc +++ b/compiler2/ttcn3/PatternString.cc @@ -380,7 +380,7 @@ namespace Ttcn { posix_str = TTCN_pattern_to_regexp(str.c_str()); break; case USTR_PATTERN: - posix_str = TTCN_pattern_to_regexp_uni(str.c_str()); + posix_str = TTCN_pattern_to_regexp_uni(str.c_str(), nocase); } Free(posix_str); } @@ -496,12 +496,17 @@ namespace Ttcn { // empty pattern: create an empty string literal for it s += p_mod->add_charstring_literal(string()); } + s += ", "; + s += nocase ? "TRUE" : "FALSE"; s += ')'; return s; } void PatternString::dump(unsigned level) const { + if (nocase) { + DEBUG(level, "@nocase"); + } DEBUG(level, "%s", get_full_str().c_str()); } diff --git a/compiler2/ttcn3/PatternString.hh b/compiler2/ttcn3/PatternString.hh index 70ae58b89bb2bb0f7c925b6bf9f839a135c11774..e8876b5cdf1d5b2807af1e078d3439a829301eb8 100644 --- a/compiler2/ttcn3/PatternString.hh +++ b/compiler2/ttcn3/PatternString.hh @@ -54,10 +54,12 @@ namespace Ttcn { Value* cstr_value; pstr_type_t pattern_type; + + bool nocase; public: PatternString(): Node(), my_scope(0), cstr_value(0), - pattern_type(CSTR_PATTERN) { } + pattern_type(CSTR_PATTERN), nocase(false) { } virtual ~PatternString(); virtual PatternString* clone() const; virtual void set_fullname(const string& p_fullname); @@ -94,6 +96,10 @@ namespace Ttcn { /** Converts this string pattern into a JSON schema string pattern. */ char* convert_to_json(); + + void set_nocase(bool p_nocase) { nocase = p_nocase; } + + bool get_nocase() const { return nocase; } }; } // namespace Ttcn diff --git a/compiler2/ttcn3/TtcnTemplate.cc b/compiler2/ttcn3/TtcnTemplate.cc index 73c1fb939a930fab4845be6788fab58323298a7e..300e4515b2160ee39a68d2bf7c23731e5983c48f 100644 --- a/compiler2/ttcn3/TtcnTemplate.cc +++ b/compiler2/ttcn3/TtcnTemplate.cc @@ -279,7 +279,11 @@ namespace Ttcn { break; case CSTR_PATTERN: case USTR_PATTERN: - ret_val += "pattern \""; + ret_val += "pattern "; + if (u.pstring->get_nocase()) { + ret_val += "@nocase "; + } + ret_val += "\""; ret_val += u.pstring->get_full_str(); ret_val += "\""; break; diff --git a/compiler2/ttcn3/compiler.y b/compiler2/ttcn3/compiler.y index 9ac8d7292c161b52296cee072d00f65fedf5ed3f..fd7592fc70d9eae591f0062edb1a2d8284f9cd1e 100644 --- a/compiler2/ttcn3/compiler.y +++ b/compiler2/ttcn3/compiler.y @@ -3524,9 +3524,9 @@ CharStringMatch: // 124 } | PatternKeyword NocaseKeyword PatternChunkList { - // @nocase is ignored for now Location loc(infile, @3); $$ = parse_pattern($3, loc); + $$->set_nocase(true); Free($3); } ; @@ -8862,13 +8862,13 @@ PredefinedOps: | regexpKeyword '(' optError TemplateInstance optError ',' optError TemplateInstance optError ',' optError Expression optError ')' { - $$ = new Value(Value::OPTYPE_REGEXP, $4, $8, $12); + $$ = new Value(Value::OPTYPE_REGEXP, $4, $8, $12, false); $$->set_location(infile, @$); } | regexpKeyword NocaseKeyword '(' optError TemplateInstance optError ',' optError TemplateInstance optError ',' optError Expression optError ')' { - $$ = new Value(Value::OPTYPE_REGEXP, $5, $9, $13); + $$ = new Value(Value::OPTYPE_REGEXP, $5, $9, $13, true); $$->set_location(infile, @$); } | regexpKeyword '(' error ')' @@ -8883,7 +8883,7 @@ PredefinedOps: ti2->set_location(infile, @3); Value *v3 = new Value(Value::V_ERROR); v3->set_location(infile, @3); - $$ = new Value(Value::OPTYPE_REGEXP, ti1, ti2, v3); + $$ = new Value(Value::OPTYPE_REGEXP, ti1, ti2, v3, false); $$->set_location(infile, @$); } | regexpKeyword NocaseKeyword '(' error ')' @@ -8898,7 +8898,7 @@ PredefinedOps: ti2->set_location(infile, @4); Value *v3 = new Value(Value::V_ERROR); v3->set_location(infile, @4); - $$ = new Value(Value::OPTYPE_REGEXP, ti1, ti2, v3); + $$ = new Value(Value::OPTYPE_REGEXP, ti1, ti2, v3, true); $$->set_location(infile, @$); } | encvalueKeyword '(' optError TemplateInstance optError ')' diff --git a/compiler2/ustring.cc b/compiler2/ustring.cc index 5669b604e603c3652aa798cd763b5e290b3a051e..6849aa7a8d86f67ffb72ed863061e1e9595b3e18 100644 --- a/compiler2/ustring.cc +++ b/compiler2/ustring.cc @@ -350,6 +350,18 @@ char* ustring::convert_to_regexp_form() const { return res; } +ustring ustring::extract_matched_section(int start, int end) const +{ + // the indexes refer to the string's regexp form, which contains 8 characters + // for every universal character in the original string + start /= 8; + end /= 8; + ustring ret_val(end - start); + memcpy(ret_val.val_ptr->uchars_ptr, val_ptr->uchars_ptr + start, (end - start) * + sizeof(universal_char)); + return ret_val; +} + ustring& ustring::operator=(const ustring& s) { if(&s != this) { diff --git a/compiler2/ustring.hh b/compiler2/ustring.hh index e24279210ee01630796ef97bbf5f1f60926380b7..fc574d97930eab21a1569fbf56f8b619cdf53397 100644 --- a/compiler2/ustring.hh +++ b/compiler2/ustring.hh @@ -118,6 +118,11 @@ public: */ char* convert_to_regexp_form() const; + /** extracts the section matched by a regexp and returns it + * (the starting and ending indexes refer to the hex representation of the + * string, which is 8 times longer) */ + ustring extract_matched_section(int start, int end) const; + /** Assignment operator. */ ustring& operator=(const ustring&); diff --git a/conformance_test/core_language_tests/negative_tests/05_basic_language_elements.script b/conformance_test/core_language_tests/negative_tests/05_basic_language_elements.script index 298b71194e9e1c3b44f847b0731cc3be55dbee73..396f175a6c8a4b25275c3d9d24be86f3c03a7d56 100644 --- a/conformance_test/core_language_tests/negative_tests/05_basic_language_elements.script +++ b/conformance_test/core_language_tests/negative_tests/05_basic_language_elements.script @@ -310,6 +310,320 @@ error: There is no local or imported definition with name `v_statement' <END_TC> :exmp +*---------------------------------------------------------------------* +:h3. NegSem_050202_Uniqueness_001 negative test +.*---------------------------------------------------------------------* +:xmp tab=0. + +<TC - Ensure that the IUT correctly handles the uniqueness of variable names in its scope > + +<COMPILE> + +<MODULE TTCN NegSem_050202_Uniqueness_001 NegSem_050202_Uniqueness_001.ttcn > +/****************************************************************************** + ** @version 0.0.1 + ** @purpose 1:5.2.2, Ensure that the IUT correctly handles the uniqueness of variable names in its scope + ** @verdict pass reject + ***************************************************/ +module NegSem_050202_Uniqueness_001 { + type component GeneralComp { + const integer cl_int := 0; + } + + testcase TC_NegSem_050202_Uniqueness_001() runs on GeneralComp { + const integer cl_int := 0; + } + control { + execute(TC_NegSem_050202_Uniqueness_001()); + } +} +<END_MODULE> + +<RESULT COUNT 1> +error: Definition with identifier `cl_int' is not unique in the scope hierarchy +<END_RESULT> + +<END_TC> +:exmp + +*---------------------------------------------------------------------* +:h3. NegSem_050202_Uniqueness_004 negative test +.*---------------------------------------------------------------------* +:xmp tab=0. + +<TC - Ensure that the IUT correctly handles the uniqueness of variable names in its scope > + +<COMPILE> + +<MODULE TTCN NegSem_050202_Uniqueness_004 NegSem_050202_Uniqueness_004.ttcn > +/****************************************************************************** + ** @version 0.0.1 + ** @purpose 1:5.2.2, Ensure that the IUT correctly handles the uniqueness of variable names in its scope + ** @verdict pass reject + ***************************************************/ +module NegSem_050202_Uniqueness_004 { + const integer c_int := 0; + + type component GeneralComp { + } + + function f_funcScope() {} + + testcase TC_NegSem_050202_Uniqueness_004() runs on GeneralComp { + const integer c_int := 0; + f_funcScope(); + } + control { + execute(TC_NegSem_050202_Uniqueness_004()); + } +} +<END_MODULE> + +<RESULT COUNT 1> +error: Definition with identifier `c_int' is not unique in the scope hierarchy +<END_RESULT> + +<END_TC> +:exmp + +*---------------------------------------------------------------------* +:h3. NegSem_050202_Uniqueness_005 negative test +.*---------------------------------------------------------------------* +:xmp tab=0. + +<TC - Ensure that the IUT correctly handles the uniqueness of variable names in its scope > + +<COMPILE> + +<MODULE TTCN NegSem_050202_Uniqueness_005 NegSem_050202_Uniqueness_005.ttcn > +/****************************************************************************** + ** @version 0.0.1 + ** @purpose 1:5.2.2, Ensure that the IUT correctly handles the uniqueness of variable names in its scope + ** @verdict pass reject + ***************************************************/ +module NegSem_050202_Uniqueness_005 { + const integer c_int := 0; + + type component GeneralComp { + } + + function f_funcScope() { + const integer c_int := 0; + } + + testcase TC_NegSem_050202_Uniqueness_005() runs on GeneralComp { + f_funcScope(); + } + control { + execute(TC_NegSem_050202_Uniqueness_005()); + } +} +<END_MODULE> + +<RESULT COUNT 1> +error: Definition with identifier `c_int' is not unique in the scope hierarchy +<END_RESULT> + +<END_TC> +:exmp + +*---------------------------------------------------------------------* +:h3. NegSem_050202_Uniqueness_006 negative test +.*---------------------------------------------------------------------* +:xmp tab=0. + +<TC - Ensure that the IUT correctly handles the uniqueness of variable names in its scope > + +<COMPILE> + +<MODULE TTCN NegSem_050202_Uniqueness_006 NegSem_050202_Uniqueness_006.ttcn > +/****************************************************************************** + ** @version 0.0.1 + ** @purpose 1:5.2.2, Ensure that the IUT correctly handles the uniqueness of variable names in its scope + ** @verdict pass reject + ***************************************************/ +module NegSem_050202_Uniqueness_006 { + type component GeneralComp { + const integer repeatedIdentifier := 0; + } + + testcase TC_NegSem_050202_Uniqueness_006() runs on GeneralComp { + var boolean repeatedIdentifier := true; + } + control { + execute(TC_NegSem_050202_Uniqueness_006()); + } +} +<END_MODULE> + +<RESULT COUNT 1> +error: Definition with identifier `repeatedIdentifier' is not unique in the scope hierarchy +<END_RESULT> + +<END_TC> +:exmp + +*---------------------------------------------------------------------* +:h3. NegSem_050202_Uniqueness_007 negative test +.*---------------------------------------------------------------------* +:xmp tab=0. + +<TC - Ensure that the IUT correctly handles the uniqueness of variable names in its scope > + +<COMPILE> + +<MODULE TTCN NegSem_050202_Uniqueness_007 NegSem_050202_Uniqueness_007.ttcn > +/****************************************************************************** + ** @version 0.0.1 + ** @purpose 1:5.2.2, Ensure that the IUT correctly handles the uniqueness of variable names in its scope + ** @verdict pass reject + ***************************************************/ +module NegSem_050202_Uniqueness_007 { + type component GeneralComp { + const integer repeatedIdentifier := 0; + } + + function f_funcScope() runs on GeneralComp { + var boolean repeatedIdentifier := true; + } + + testcase TC_NegSem_050202_Uniqueness_007() runs on GeneralComp { + f_funcScope(); + } + control { + execute(TC_NegSem_050202_Uniqueness_007()); + } +} +<END_MODULE> + +<RESULT COUNT 1> +error: Definition with identifier `repeatedIdentifier' is not unique in the scope hierarchy +<END_RESULT> + +<END_TC> +:exmp + +*---------------------------------------------------------------------* +:h3. NegSem_050202_Uniqueness_008 negative test +.*---------------------------------------------------------------------* +:xmp tab=0. + +<TC - Ensure that the IUT correctly handles the uniqueness of variable names in its scope > + +<COMPILE> + +<MODULE TTCN NegSem_050202_Uniqueness_008 NegSem_050202_Uniqueness_008.ttcn > +/****************************************************************************** + ** @version 0.0.1 + ** @purpose 1:5.2.2, Ensure that the IUT correctly handles the uniqueness of variable names in its scope + ** @verdict pass reject + ***************************************************/ +module NegSem_050202_Uniqueness_008 { + type component GeneralComp { + } + + function f_funcScope(boolean repeatedIdentifier) { + const integer repeatedIdentifier := 0; + } + + testcase TC_NegSem_050202_Uniqueness_008() runs on GeneralComp { + var boolean v_boolean := true; + f_funcScope(v_boolean); + } + control { + execute(TC_NegSem_050202_Uniqueness_008()); + } +} +<END_MODULE> + +<RESULT COUNT 1> +error: Definition with identifier `repeatedIdentifier' is not unique in the scope hierarchy +<END_RESULT> + +<END_TC> +:exmp + +*---------------------------------------------------------------------* +:h3. NegSem_050202_Uniqueness_009 negative test +.*---------------------------------------------------------------------* +:xmp tab=0. + +<TC - Ensure that the IUT correctly handles the uniqueness of variable names in its scope > + +<COMPILE> + +<MODULE TTCN NegSem_050202_Uniqueness_009 NegSem_050202_Uniqueness_009.ttcn > +/****************************************************************************** + ** @version 0.0.1 + ** @purpose 1:5.2.2, Ensure that the IUT correctly handles the uniqueness of variable names in its scope + ** @verdict pass reject + ***************************************************/ +module NegSem_050202_Uniqueness_009 { + const integer repeatedIdentifier := 0; + + type component GeneralComp { + } + + function f_funcScope() {} + + testcase TC_NegSem_050202_Uniqueness_009() runs on GeneralComp { + var boolean repeatedIdentifier := true; + f_funcScope(); + } + control { + execute(TC_NegSem_050202_Uniqueness_009()); + } +} +<END_MODULE> + +<RESULT COUNT 1> +error: Definition with identifier `repeatedIdentifier' is not unique in the scope hierarchy +<END_RESULT> + +<END_TC> +:exmp + +*---------------------------------------------------------------------* +:h3. NegSem_050202_Uniqueness_010 negative test +.*---------------------------------------------------------------------* +:xmp tab=0. + +<TC - Ensure that the IUT correctly handles the uniqueness of variable names in its scope > + +<COMPILE> + +<MODULE TTCN NegSem_050202_Uniqueness_010 NegSem_050202_Uniqueness_010.ttcn > +/****************************************************************************** + ** @version 0.0.1 + ** @purpose 1:5.2.2, Ensure that the IUT correctly handles the uniqueness of variable names in its scope + ** @verdict pass reject + ***************************************************/ +module NegSem_050202_Uniqueness_010 { + const integer repeatedIdentifier := 0; + + type component GeneralComp { + } + + function f_funcScope() { + var boolean repeatedIdentifier := true; + } + + testcase TC_NegSem_050202_Uniqueness_010() runs on GeneralComp { + f_funcScope(); + } + control { + execute(TC_NegSem_050202_Uniqueness_010()); + } +} +<END_MODULE> + +<RESULT COUNT 1> +error: Definition with identifier `repeatedIdentifier' is not unique in the scope hierarchy +<END_RESULT> + +<END_TC> +:exmp + .*---------------------------------------------------------------------* :h2. 0503_ordering_of_declarations folder .*---------------------------------------------------------------------* diff --git a/conformance_test/core_language_tests/negative_tests/06_types_and_values.script b/conformance_test/core_language_tests/negative_tests/06_types_and_values.script index c558531cf5cbf8e534f5c2386c61cc1d11505a21..9195c4ef5b87d325af0a2c322fb89bae04f79714 100644 --- a/conformance_test/core_language_tests/negative_tests/06_types_and_values.script +++ b/conformance_test/core_language_tests/negative_tests/06_types_and_values.script @@ -54,7 +54,7 @@ This TD contains negative tests from ETSI TTCN3 Conformance Test's 06_types_and_ .*---------------------------------------------------------------------* *---------------------------------------------------------------------* -:h3. NegSem_0501_Identifier_001 negative test +:h3. NegSyn_060100_SimpleBasicTypes_001 negative test .*---------------------------------------------------------------------* :xmp tab=0. @@ -62,7 +62,7 @@ This TD contains negative tests from ETSI TTCN3 Conformance Test's 06_types_and_ <COMPILE> -<MODULE TTCN NegSem_0501_Identifier_001 NegSem_0501_Identifier_001.ttcn > +<MODULE TTCN NegSyn_060100_SimpleBasicTypes_001 NegSyn_060100_SimpleBasicTypes_001.ttcn > /*************************************************** ** @version 0.0.1 ** @purpose 1:6.1.0, Assign float to integer values @@ -81,7 +81,7 @@ error: integer value was expected :exmp *---------------------------------------------------------------------* -:h3. NegSem_0501_Identifier_002 negative test +:h3. NegSyn_060100_SimpleBasicTypes_002 negative test .*---------------------------------------------------------------------* :xmp tab=0. @@ -89,7 +89,7 @@ error: integer value was expected <COMPILE> -<MODULE TTCN NegSem_0501_Identifier_002 NegSem_0501_Identifier_002.ttcn > +<MODULE TTCN NegSyn_060100_SimpleBasicTypes_002 NegSyn_060100_SimpleBasicTypes_002.ttcn > /*************************************************** ** @version 0.0.1 ** @purpose 1:6.1.0, Assign boolean to integer values @@ -108,7 +108,7 @@ error: integer value was expected :exmp *---------------------------------------------------------------------* -:h3. NegSem_0501_Identifier_003 negative test +:h3. NegSyn_060100_SimpleBasicTypes_003 negative test .*---------------------------------------------------------------------* :xmp tab=0. @@ -116,7 +116,7 @@ error: integer value was expected <COMPILE> -<MODULE TTCN NegSem_0501_Identifier_003 NegSem_0501_Identifier_003.ttcn > +<MODULE TTCN NegSyn_060100_SimpleBasicTypes_003 NegSyn_060100_SimpleBasicTypes_003.ttcn > /*************************************************** ** @version 0.0.1 ** @purpose 1:6.1.0, Assign integer to float values @@ -135,7 +135,7 @@ error: float value was expected :exmp *---------------------------------------------------------------------* -:h3. NegSem_0501_Identifier_004 negative test +:h3. NegSyn_060100_SimpleBasicTypes_004 negative test .*---------------------------------------------------------------------* :xmp tab=0. @@ -143,7 +143,7 @@ error: float value was expected <COMPILE> -<MODULE TTCN NegSem_0501_Identifier_004 NegSem_0501_Identifier_004.ttcn > +<MODULE TTCN NegSyn_060100_SimpleBasicTypes_004 NegSyn_060100_SimpleBasicTypes_004.ttcn > /*************************************************** ** @version 0.0.1 ** @purpose 1:6.1.0, Assign boolean to float values @@ -162,7 +162,7 @@ error: float value was expected :exmp *---------------------------------------------------------------------* -:h3. NegSem_0501_Identifier_005 negative test +:h3. NegSyn_060100_SimpleBasicTypes_005 negative test .*---------------------------------------------------------------------* :xmp tab=0. @@ -170,7 +170,7 @@ error: float value was expected <COMPILE> -<MODULE TTCN NegSem_0501_Identifier_005 NegSem_0501_Identifier_005.ttcn > +<MODULE TTCN NegSyn_060100_SimpleBasicTypes_005 NegSyn_060100_SimpleBasicTypes_005.ttcn > /*************************************************** ** @version 0.0.1 ** @purpose 1:6.1.0, Assign verdicttype to float values @@ -189,7 +189,7 @@ error: float value was expected :exmp *---------------------------------------------------------------------* -:h3. NegSem_0501_Identifier_006 negative test +:h3. NegSyn_060100_SimpleBasicTypes_006 negative test .*---------------------------------------------------------------------* :xmp tab=0. @@ -197,7 +197,7 @@ error: float value was expected <COMPILE> -<MODULE TTCN NegSem_0501_Identifier_006 NegSem_0501_Identifier_006.ttcn > +<MODULE TTCN NegSyn_060100_SimpleBasicTypes_006 NegSyn_060100_SimpleBasicTypes_006.ttcn > /*************************************************** ** @version 0.0.1 ** @purpose 1:6.1.0, Assign integer to verdicttype values @@ -2142,6 +2142,45 @@ error: "abcyz" is not a valid value for type `charstring' which has subtype patt <END_TC> :exmp +*---------------------------------------------------------------------* +:h3. NegSyn_06010205_StringPattern_001 negative test +.*---------------------------------------------------------------------* +:xmp tab=0. + +<TC - Assign values to pattern restricted character strings without @nocase modifier. > + +<COMPILE> + +<MODULE TTCN NegSyn_06010205_StringPattern_001 NegSyn_06010205_StringPattern_001.ttcn > +/****************************************************************************** + ** @version 0.0.1 + ** @purpose 1:6.1.2.5, Assign values to pattern restricted character strings without @nocase modifier. + ** @verdict pass reject, noexecution + ***************************************************/ + +module NegSyn_06010205_StringPattern_001 { + type charstring MyString (pattern "abc*xyz"); //without @nocase + + type component GeneralComp {} + + testcase TC_NegSyn_06010205_StringPattern_001() runs on GeneralComp { + var MyString v_c; + v_c := "ABc1234xYz"; //error value is out of constraint: ABc + } + + control{ + execute(TC_NegSyn_06010205_StringPattern_001()); + } +} +<END_MODULE> + +<RESULT COUNT 1> +error: "ABc1234xYz" is not a valid value for type `charstring' which has subtype pattern\(abc\*xyz\) +<END_RESULT> + +<END_TC> +:exmp + *---------------------------------------------------------------------* :h3. NegSyn_06010205_StringPattern_002 negative test .*---------------------------------------------------------------------* @@ -4409,7 +4448,7 @@ error: union value was expected for type `@NegSem_060205_top_level_005.U' :exmp *---------------------------------------------------------------------* -:h3. NegSem_060205_top_level_005 negative test +:h3. NegSyn_060205_top_level_001 negative test .*---------------------------------------------------------------------* :xmp tab=0. @@ -5009,7 +5048,7 @@ error: Type `address' is not defined in this module :exmp *---------------------------------------------------------------------* -:h3. NegSem_060206_anytype_002 negative test +:h3. NegSyn_060206_anytype_002 negative test .*---------------------------------------------------------------------* :xmp tab=0. @@ -5017,7 +5056,7 @@ error: Type `address' is not defined in this module <COMPILE> -<MODULE TTCN NegSem_060206_anytype_002 NegSem_060206_anytype_002.ttcn > +<MODULE TTCN NegSyn_060206_anytype_002 NegSyn_060206_anytype_002.ttcn > /**************************************************** ** @version 0.0.1 ** @purpose 1:6.2.0.6, ensure that anytype cannot be port type diff --git a/conformance_test/core_language_tests/negative_tests/07-14_folder.script b/conformance_test/core_language_tests/negative_tests/07-14_folder.script index a201d676795802b6f51d613e7693f409195ab79c..1e59ff9fe51619d0f743d79d1755f51d0b37cd93 100644 --- a/conformance_test/core_language_tests/negative_tests/07-14_folder.script +++ b/conformance_test/core_language_tests/negative_tests/07-14_folder.script @@ -1103,6 +1103,54 @@ error: Incompatible explicit type specification: `integer' was expected instead <END_TC> :exmp +*---------------------------------------------------------------------* +:h3. NegSem_08020301_GeneralFormatOfImport_038 negative test +.*---------------------------------------------------------------------* +:xmp tab=0. + +<TC - Verify that definition from inside an imported function cannot be referenced > + +<COMPILE> + +<MODULE TTCN NegSem_08020301_GeneralFormatOfImport_038 NegSem_08020301_GeneralFormatOfImport_038.ttcn > +/****************************************************************************** + ** @version 0.0.1 + ** @purpose 1:8.2.3.1, Verify that definition from inside an imported function cannot be referenced + ** @verdict pass reject + *****************************************************************/ + +// The following requirements are tested: +// Restriction f: +// When importing a function, altstep or test case the corresponding behaviour +// specifications and all definitions used inside the behaviour specifications +// remain invisible for the importing module. + +module NegSem_08020301_GeneralFormatOfImport_038 { + import from NegSem_08020301_GeneralFormatOfImport_038_import { function f_test }; + // c_test should be undefined, because it is invisible for the importing module + const integer c_test2 := c_test; +} + +<END_MODULE> + +<MODULE TTCN NegSem_08020301_GeneralFormatOfImport_038_import NegSem_08020301_GeneralFormatOfImport_038_import.ttcn > + +module NegSem_08020301_GeneralFormatOfImport_038_import { + function f_test() { + const integer c_test := 1; + } +} + +<END_MODULE> + + +<RESULT COUNT 1> +error: There is no local or imported definition with name `c_test' +<END_RESULT> + +<END_TC> +:exmp + *---------------------------------------------------------------------* :h3. NegSyn_08020301_GeneralFormatOfImport_001 negative test .*---------------------------------------------------------------------* @@ -1715,7 +1763,7 @@ error: There is no local or imported definition with name `c_myconst' :exmp *---------------------------------------------------------------------* -:h3. NegSem_080205_VisibilityOfDefinitions_005 negative test +:h3. NegSyn_0803_ModuleControlPart_001 negative test .*---------------------------------------------------------------------* :xmp tab=0. @@ -1723,7 +1771,7 @@ error: There is no local or imported definition with name `c_myconst' <COMPILE> -<MODULE TTCN NegSem_080205_VisibilityOfDefinitions_005 NegSem_080205_VisibilityOfDefinitions_005.ttcn > +<MODULE TTCN NegSyn_0803_ModuleControlPart_001 NegSyn_0803_ModuleControlPart_001.ttcn > /***************************************************************** ** @version 0.0.1 ** @purpose 1:8.3, Ensure that there is not more than one control part. @@ -2936,7 +2984,7 @@ error: at or before token `1.0': syntax error, unexpected FloatValue, expecting :h2. 14_procedure_signatures folder .*---------------------------------------------------------------------* *---------------------------------------------------------------------* -:h3. egSem_1400_procedure_signatures_001 negative test +:h3. NegSem_1400_procedure_signatures_001 negative test .*---------------------------------------------------------------------* :xmp tab=0. @@ -2944,7 +2992,7 @@ error: at or before token `1.0': syntax error, unexpected FloatValue, expecting <COMPILE> -<MODULE TTCN egSem_1400_procedure_signatures_001 egSem_1400_procedure_signatures_001.ttcn > +<MODULE TTCN NegSem_1400_procedure_signatures_001 NegSem_1400_procedure_signatures_001.ttcn > /***************************************************************** ** @version 0.0.1 ** @purpose 1:22.3.1, Ensure that nonblocking signature contains in parameter @@ -3006,7 +3054,7 @@ error: A non-blocking signature cannot have `out' parameter :exmp *---------------------------------------------------------------------* -:h3. egSem_1400_procedure_signatures_002 negative test +:h3. NegSem_1400_procedure_signatures_002 negative test .*---------------------------------------------------------------------* :xmp tab=0. @@ -3014,7 +3062,7 @@ error: A non-blocking signature cannot have `out' parameter <COMPILE> -<MODULE TTCN egSem_1400_procedure_signatures_002 egSem_1400_procedure_signatures_002.ttcn > +<MODULE TTCN NegSem_1400_procedure_signatures_002 NegSem_1400_procedure_signatures_002.ttcn > /***************************************************************** ** @version 0.0.1 ** @purpose 1:14, Ensure that blocking calls needs response or exception handling diff --git a/conformance_test/core_language_tests/negative_tests/08_empty_modules.script b/conformance_test/core_language_tests/negative_tests/08_empty_modules.script index fb0a096652f7ddc15969579b8f708f6e782b6cfc..0acfb85f9769d12bd204a5178604b6abbd8d4a34 100644 --- a/conformance_test/core_language_tests/negative_tests/08_empty_modules.script +++ b/conformance_test/core_language_tests/negative_tests/08_empty_modules.script @@ -276,6 +276,38 @@ error <END_TC> :exmp +*---------------------------------------------------------------------* +:h3. Syn_0803_ModuleControlPart_003 negative test +.*---------------------------------------------------------------------* +:xmp tab=0. + +<TC - Ensure that an empty control part is accepted. > + +<COMPILE> + +<MODULE TTCN Syn_0803_ModuleControlPart_003 Syn_0803_ModuleControlPart_003.ttcn > +/****************************************************************************** + ** @version 0.0.1 + ** @purpose 1:8.3, Ensure that an empty control part is accepted. + ** @verdict pass accept, noexecution + *****************************************************************/ + +module Syn_0803_ModuleControlPart_003 { + + control { + + } + +} +<END_MODULE> + +<RESULT IF_PASS NEGATIVE> +error +<END_RESULT> + +<END_TC> +:exmp + .*---------------------------------------------------------------------* :h1.References .*---------------------------------------------------------------------* diff --git a/conformance_test/core_language_tests/negative_tests/15_templates.script b/conformance_test/core_language_tests/negative_tests/15_templates.script index 536a2f8ff62b48e7426c5e059ef7c7680a32e3c3..0b98d15806ed42e68bb199edc0aa1498c702faa1 100644 --- a/conformance_test/core_language_tests/negative_tests/15_templates.script +++ b/conformance_test/core_language_tests/negative_tests/15_templates.script @@ -1071,60 +1071,7 @@ Dynamic test case error: Accessing field f1 of a non-specific template of type @ :exmp *---------------------------------------------------------------------* -:h3. NegSem_150602_ReferencingRecordAndSetFields_006 negative test -.*---------------------------------------------------------------------* -:xmp tab=0. - -<TC - Ensure that referencing a field of an address type, which actual value is null shall cause rejection. > - -<COMPILE> - -<MODULE TTCN NegSem_150602_ReferencingRecordAndSetFields_006 NegSem_150602_ReferencingRecordAndSetFields_006.ttcn > -/***************************************************************** - ** @version 0.0.1 - ** @purpose 1:15.6.2, Ensure that referencing a field of an address type, which actual value is null shall cause rejection. - ** @verdict pass reject - *****************************************************************/ - -//Restriction d) -/*Special value null: referencing a field of an address type, which actual value is null shall cause an error.*/ - -module NegSem_150602_ReferencingRecordAndSetFields_006 { - - type component GeneralComp { } - - type integer address; - - type record MyRecordOne { - address f1 - } - - testcase TC_NegSem_150602_ReferencingRecordAndSetFields_006() runs on GeneralComp { - var template MyRecordOne m_R1 := { - f1 := null - } - var template MyRecordOne m_R2 := { - f1 := m_R1.f1 // access to a field with null shall cause an error! - } - setverdict(pass); - } - - control{ - execute(TC_NegSem_150602_ReferencingRecordAndSetFields_006()); - } - -} -<END_MODULE> - -<RESULT COUNT 1> -error: integer value was expected -<END_RESULT> - -<END_TC> -:exmp - -*---------------------------------------------------------------------* -:h3. NegSem_150602_ReferencingRecordAndSetFields_001 negative test +:h3. NegSem_150603_ReferencingRecordOfAndSetElements_001 negative test .*---------------------------------------------------------------------* :xmp tab=0. @@ -1173,7 +1120,7 @@ Dynamic test case error: Accessing an element of a non-specific template for typ :exmp *---------------------------------------------------------------------* -:h3. NegSem_150602_ReferencingRecordAndSetFields_002 negative test +:h3. NegSem_150603_ReferencingRecordOfAndSetElements_002 negative test .*---------------------------------------------------------------------* :xmp tab=0. @@ -1221,7 +1168,7 @@ Dynamic test case error: Performing a valueof or send operation on a non-specifi :exmp *---------------------------------------------------------------------* -:h3. NegSem_150602_ReferencingRecordAndSetFields_003 negative test +:h3. NegSem_150603_ReferencingRecordOfAndSetElements_003 negative test .*---------------------------------------------------------------------* :xmp tab=0. @@ -1268,7 +1215,7 @@ Dynamic test case error: Performing a valueof or send operation on a non-specifi :exmp *---------------------------------------------------------------------* -:h3. NegSem_150602_ReferencingRecordAndSetFields_004 negative test +:h3. NegSem_150603_ReferencingRecordOfAndSetElements_004 negative test .*---------------------------------------------------------------------* :xmp tab=0. @@ -1315,7 +1262,7 @@ Dynamic test case error: Performing a valueof or send operation on a non-specifi :exmp *---------------------------------------------------------------------* -:h3. NegSem_150602_ReferencingRecordAndSetFields_005 negative test +:h3. NegSem_150603_ReferencingRecordOfAndSetElements_005 negative test .*---------------------------------------------------------------------* :xmp tab=0. @@ -1370,7 +1317,7 @@ Dynamic test case error: Performing a valueof or send operation on a non-specifi :exmp *---------------------------------------------------------------------* -:h3. NegSem_150602_ReferencingRecordAndSetFields_006 negative test +:h3. NegSem_150603_ReferencingRecordOfAndSetElements_006 negative test .*---------------------------------------------------------------------* :xmp tab=0. @@ -1423,7 +1370,7 @@ Dynamic test case error: Performing a valueof or send operation on a non-specifi :exmp *---------------------------------------------------------------------* -:h3. NegSem_150602_ReferencingRecordAndSetFields_008 negative test +:h3. NegSem_150603_ReferencingRecordOfAndSetElements_008 negative test .*---------------------------------------------------------------------* :xmp tab=0. @@ -1470,7 +1417,7 @@ Dynamic test case error: Performing a valueof or send operation on a non-specifi :exmp *---------------------------------------------------------------------* -:h3. NegSem_150602_ReferencingRecordAndSetFields_009 negative test +:h3. NegSem_150603_ReferencingRecordOfAndSetElements_009 negative test .*---------------------------------------------------------------------* :xmp tab=0. @@ -1519,7 +1466,7 @@ Dynamic test case error: Performing a valueof or send operation on a non-specifi :exmp *---------------------------------------------------------------------* -:h3. NegSem_150602_ReferencingRecordAndSetFields_010 negative test +:h3. NegSem_150603_ReferencingRecordOfAndSetElements_010 negative test .*---------------------------------------------------------------------* :xmp tab=0. @@ -1578,7 +1525,7 @@ Dynamic test case error: Matching with an uninitialized/unsupported integer temp :exmp *---------------------------------------------------------------------* -:h3. NegSem_150602_ReferencingRecordAndSetFields_011 negative test +:h3. NegSem_150603_ReferencingRecordOfAndSetElements_011 negative test .*---------------------------------------------------------------------* :xmp tab=0. @@ -1636,7 +1583,7 @@ Dynamic test case error: Copying an uninitialized/unsupported integer template. :exmp *---------------------------------------------------------------------* -:h3. NegSem_150602_ReferencingRecordAndSetFields_012 negative test +:h3. NegSem_150603_ReferencingRecordOfAndSetElements_012 negative test .*---------------------------------------------------------------------* :xmp tab=0. @@ -1694,7 +1641,7 @@ Dynamic test case error: Copying an uninitialized/unsupported integer template. :exmp *---------------------------------------------------------------------* -:h3. NegSem_150602_ReferencingRecordAndSetFields_013 negative test +:h3. NegSem_150603_ReferencingRecordOfAndSetElements_013 negative test .*---------------------------------------------------------------------* :xmp tab=0. @@ -1751,7 +1698,7 @@ Dynamic test case error: Assignment of an unbound integer value. :exmp *---------------------------------------------------------------------* -:h3. NegSem_150602_ReferencingRecordAndSetFields_014 negative test +:h3. NegSem_150603_ReferencingRecordOfAndSetElements_014 negative test .*---------------------------------------------------------------------* :xmp tab=0. @@ -1799,56 +1746,6 @@ Dynamic test case error: Accessing an element of a non-specific template for typ <END_TC> :exmp -*---------------------------------------------------------------------* -:h3. NegSem_150602_ReferencingRecordAndSetFields_015 negative test -.*---------------------------------------------------------------------* -:xmp tab=0. - -<TC - Ensure that referencing an element of an address type, which actual value is null shall cause an error. > - -<COMPILE> - -<MODULE TTCN NegSem_150603_ReferencingRecordOfAndSetElements_015 NegSem_150603_ReferencingRecordOfAndSetElements_015.ttcn > -/***************************************************************** - ** @version 0.0.1 - ** @purpose 1:15.6.3, Ensure that referencing an element of an address type, which actual value is null shall cause an error. - ** @verdict pass reject - *****************************************************************/ - - //Restriction h) -/*Special value null: referencing an element of an address type, which actual value is null shall cause an error.*/ - -module NegSem_150603_ReferencingRecordOfAndSetElements_015 { - - type component GeneralComp { } - - type set of integer RoI; - type integer address; - - testcase TC_NegSem_150603_ReferencingRecordOfAndSetElements_015() runs on GeneralComp { - var address v_add := null; - var template RoI m_one; - - - m_one := {v_add, 1}; // // shall cause an error as we access a value list - - setverdict(pass); - } - - control{ - execute(TC_NegSem_150603_ReferencingRecordOfAndSetElements_015()); - } - -} -<END_MODULE> - -<RESULT COUNT 1> -error: integer value was expected -<END_RESULT> - -<END_TC> -:exmp - *---------------------------------------------------------------------* :h3. NegSem_150605_Referencing_union_alternatives_001 negative test .*---------------------------------------------------------------------* diff --git a/conformance_test/core_language_tests/negative_tests/16-20_folders.script b/conformance_test/core_language_tests/negative_tests/16-20_folders.script index 81d42d379987d138feb5927be4bc13fafcd24e8c..9fe703ddb1c970a07283adddab448b9b0b0b7f2a 100644 --- a/conformance_test/core_language_tests/negative_tests/16-20_folders.script +++ b/conformance_test/core_language_tests/negative_tests/16-20_folders.script @@ -1481,6 +1481,60 @@ Dynamic test case error: Performing a valueof or send operation on a non-specifi <END_TC> :exmp +*---------------------------------------------------------------------* +:h3. NegSem_160102_predefined_functions_034 negative test +.*---------------------------------------------------------------------* +:xmp tab=0. + +<TC - Ensure that an error is detected when the parameter of the encvalue function contains a partially initialized value > + +<COMPILE> +<EXECUTE_PARALLEL> + +<MODULE TTCN NegSem_160102_predefined_functions_034 NegSem_160102_predefined_functions_034.ttcn > +/****************************************************************************** + ** @version 0.0.1 + ** @purpose 1:16.1.2, Ensure that an error is detected when the parameter of the encvalue function contains a partially initialized value + ** @verdict pass reject + ***************************************************/ + +// The following requirements are tested: +// 16.1.2, restriction a.3: all actual in and inout parameters shall be initialized + +module NegSem_160102_predefined_functions_034 { + + type record R + { + integer field1, + integer field2 + } with { variant "" } + + type component GeneralComp { + } + + + testcase TC_NegSem_160102_predefined_functions_034 () runs on GeneralComp { + template R v_test := { field1 := 1, field2 := - } + var bitstring v_res := encvalue(v_test); + setverdict(fail, "The previous encvalue call should have caused an error"); + } + + control{ + + execute(TC_NegSem_160102_predefined_functions_034()); + + } + +} with { encode "RAW"} +<END_MODULE> + +<RESULT COUNT 1> +Dynamic test case error: While RAW-encoding type '@NegSem_160102_predefined_functions_034.R': Encoding an unbound value. +<END_RESULT> + +<END_TC> +:exmp + *---------------------------------------------------------------------* :h3. NegSem_160102_predefined_functions_035 negative test .*---------------------------------------------------------------------* @@ -2435,6 +2489,313 @@ error: at or before token `setverdict': syntax error, unexpected SetVerdictKeywo <END_TC> :exmp +*---------------------------------------------------------------------* +:h3. NegSem_190302_select_union_statement_001 negative test +.*---------------------------------------------------------------------* +:xmp tab=0. + +<TC - verify that header part of select-union statements cannot contain anything else than union instances > + +<COMPILE> + +<MODULE TTCN NegSem_190302_select_union_statement_001 NegSem_190302_select_union_statement_001.ttcn > +/****************************************************************************** + ** @version 0.0.1 + ** @purpose 1:19.3.2, verify that header part of select-union statements cannot contain anything else than union instances + ** @verdict pass reject + ***************************************************/ + +// The following requirement is tested: +// In the header part of the select union statement a template instance of union +// type shall be given. + +module NegSem_190302_select_union_statement_001 { + + type component GeneralComp { + } + + type record R { + integer intOption optional, + charstring strOption optional, + boolean boolOption optional + } + + testcase TC_NegSem_190302_select_union_statement_001() runs on GeneralComp { + var R v_rec := { intOption := omit, strOption := "abc", boolOption := omit } + + select union (v_rec) { + case (intOption) { + setverdict(pass); + } case (strOption) { + setverdict(pass); + } case (boolOption) { + setverdict(pass); + } + } + } + + control { + execute(TC_NegSem_190302_select_union_statement_001()); + } +} +<END_MODULE> + +<RESULT COUNT 1> +error: The head must be of a union type or anytype +<END_RESULT> + +<END_TC> +:exmp + +*---------------------------------------------------------------------* +:h3. NegSem_190302_select_union_statement_002 negative test +.*---------------------------------------------------------------------* +:xmp tab=0. + +<TC - verify that uninitialized value cannot be used in select union header > + +<COMPILE> +<EXECUTE_PARALLEL> + +<MODULE TTCN NegSem_190302_select_union_statement_002 NegSem_190302_select_union_statement_002.ttcn > +/****************************************************************************** + ** @version 0.0.1 + ** @purpose 1:19.3.2, verify that uninitialized value cannot be used in select union header + ** @verdict pass reject + ***************************************************/ + +// The following requirement is tested: +// [The TemplateInstance in the header of the select union statement] shall be +// at least partially initialized. + +module NegSem_190302_select_union_statement_002 { + + type component GeneralComp { + } + + type union U { + integer intOption, + charstring strOption, + record { + integer field1, + integer field2 + } recOption + } + + type record R { + U field1, + integer field2 + } + + testcase TC_NegSem_190302_select_union_statement_002() runs on GeneralComp { + var R v_rec; + v_rec.field2 := 3; + select union (v_rec.field1) { + case (intOption) { + setverdict(fail); + } case (strOption) { + setverdict(fail); + } case (recOption) { + setverdict(pass); + } + } + } + + control { + execute(TC_NegSem_190302_select_union_statement_002()); + } +} +<END_MODULE> + +<RESULT COUNT 1> +Dynamic test case error: The union in the head shall be initialized +<END_RESULT> + +<END_TC> +:exmp + +*---------------------------------------------------------------------* +:h3. NegSem_190302_select_union_statement_003 negative test +.*---------------------------------------------------------------------* +:xmp tab=0. + +<TC - verify that unknown alternatives cannot be use in case statements > + +<COMPILE> + +<MODULE TTCN NegSem_190302_select_union_statement_003 NegSem_190302_select_union_statement_003.ttcn > +/****************************************************************************** + ** @version 0.0.1 + ** @purpose 1:19.3.2, verify that unknown alternatives cannot be use in case statements + ** @verdict pass reject + ***************************************************/ + +// The following requirement is tested: +// Every Identifier in a case of the select union statement shall be an identifier +// of an alternative of the union type of the template instance given to the +// statement's header. + +module NegSem_190302_select_union_statement_003 { + + type component GeneralComp { + } + + type union U { + integer intOption, + charstring strOption, + record { + integer field1, + integer field2 + } recOption + } + + testcase TC_NegSem_190302_select_union_statement_003() runs on GeneralComp { + var U v_un := { intOption := 5 } + select union (v_un) { + case (intOption) { + setverdict(pass); + } case (strOption) { + setverdict(fail); + } case (recOption) { + setverdict(fail); + } case (boolOption) { + setverdict(fail); + } + } + } + + control { + execute(TC_NegSem_190302_select_union_statement_003()); + } +} +<END_MODULE> + +<RESULT COUNT 1> +error: In the 4. branch: 'boolOption' is not an alternative of union type '@NegSem_190302_select_union_statement_003.U' +<END_RESULT> + +<END_TC> +:exmp + +*---------------------------------------------------------------------* +:h3. NegSem_190302_select_union_statement_004 negative test +.*---------------------------------------------------------------------* +:xmp tab=0. + +<TC - verify that the same alternative cannot be used in two case statements (simple case) > + +<COMPILE> + +<MODULE TTCN NegSem_190302_select_union_statement_004 NegSem_190302_select_union_statement_004.ttcn > +/****************************************************************************** + ** @version 0.0.1 + ** @purpose 1:19.3.2, verify that the same alternative cannot be used in two case statements (simple case) + ** @verdict pass reject + ***************************************************/ + +// The following requirement is tested: +// No two cases in a select union statement shall have the same case Identifier. + +module NegSem_190302_select_union_statement_004 { + + type component GeneralComp { + } + + type union U { + integer intOption, + charstring strOption, + record { + integer field1, + integer field2 + } recOption + } + + testcase TC_NegSem_190302_select_union_statement_004() runs on GeneralComp { + var U v_un := { recOption := { field1 := 1, field2 := 2 } } + + select union (v_un) { + case (intOption) { + setverdict(pass); + } case (strOption) { + setverdict(fail); + } case (recOption) { + setverdict(fail); + } case (intOption) { + setverdict(pass); + } + } + } + + control { + execute(TC_NegSem_190302_select_union_statement_004()); + } +} +<END_MODULE> + +<RESULT COUNT 1> +error: The 'intOption' is already present in the 1. branch of select union +<END_RESULT> + +<END_TC> +:exmp + +*---------------------------------------------------------------------* +:h3. NegSem_190302_select_union_statement_005 negative test +.*---------------------------------------------------------------------* +:xmp tab=0. + +<TC - verify that the same alternative cannot be used in two case statements (list item) > + +<COMPILE> + +<MODULE TTCN NegSem_190302_select_union_statement_005 NegSem_190302_select_union_statement_005.ttcn > +/****************************************************************************** + ** @version 0.0.1 + ** @purpose 1:19.3.2, verify that the same alternative cannot be used in two case statements (list item) + ** @verdict pass reject + ***************************************************/ + +// The following requirement is tested: +// No two cases in a select union statement shall have the same case Identifier. + +module NegSem_190302_select_union_statement_005 { + + type component GeneralComp { + } + + type union U { + integer intOption, + charstring strOption, + record { + integer field1, + integer field2 + } recOption + } + + testcase TC_NegSem_190302_select_union_statement_005() runs on GeneralComp { + var U v_un := { intOption := 10 } + select union (v_un) { + case (intOption, strOption) { + setverdict(pass); + } case (recOption, intOption) { + setverdict(fail); + } + } + } + + control { + execute(TC_NegSem_190302_select_union_statement_005()); + } +} +<END_MODULE> + +<RESULT COUNT 1> +error: The 'intOption' is already present in the 1. branch of select union +<END_RESULT> + +<END_TC> +:exmp + *---------------------------------------------------------------------* :h3. NegSem_1904_for_statement_001 negative test .*---------------------------------------------------------------------* diff --git a/conformance_test/core_language_tests/negative_tests/21_configuration_operations.script b/conformance_test/core_language_tests/negative_tests/21_configuration_operations.script index c470a634c88180e50e1ef42897a62705f37002aa..bf3f61b39f4257260e3be39fe0314239a3b0b78f 100644 --- a/conformance_test/core_language_tests/negative_tests/21_configuration_operations.script +++ b/conformance_test/core_language_tests/negative_tests/21_configuration_operations.script @@ -53,7 +53,7 @@ This TD contains negative tests from ETSI TTCN3 Conformance Test's 21_configurat :h2. 2101_connection_operations folder .*---------------------------------------------------------------------* *---------------------------------------------------------------------* -:h3. NegSem_1601_toplevel_001 negative test +:h3. NegSem_2101_TopLevel_001 negative test .*---------------------------------------------------------------------* :xmp tab=0. @@ -61,7 +61,7 @@ This TD contains negative tests from ETSI TTCN3 Conformance Test's 21_configurat <COMPILE> -<MODULE TTCN NegSem_1601_toplevel_001 NegSem_1601_toplevel_001.ttcn > +<MODULE TTCN NegSem_2101_TopLevel_001 NegSem_2101_TopLevel_001.ttcn > /*************************************************** ** @version 0.0.1 ** @purpose 1:21.1, Verify that connect operation cannot contain a system port @@ -99,7 +99,7 @@ error: The `system' component reference shall not be used in `connect' operation :exmp *---------------------------------------------------------------------* -:h3. NegSem_1601_toplevel_002 negative test +:h3. NegSem_2101_TopLevel_002 negative test .*---------------------------------------------------------------------* :xmp tab=0. @@ -108,7 +108,7 @@ error: The `system' component reference shall not be used in `connect' operation <COMPILE> <EXECUTE_PARALLEL> -<MODULE TTCN NegSem_1601_toplevel_002 NegSem_1601_toplevel_002.ttcn > +<MODULE TTCN NegSem_2101_TopLevel_002 NegSem_2101_TopLevel_002.ttcn > /*************************************************** ** @version 0.0.1 ** @purpose 1:21.1, Verify that map operation fails if both operands are component ports @@ -684,7 +684,7 @@ error: The connection between port types `@NegSem_210101_connect_operation_001.m :exmp *---------------------------------------------------------------------* -:h3. NegSem_210101_connect_operation_001 negative test +:h3. NegSem_210101_map_operation_002 negative test .*---------------------------------------------------------------------* :xmp tab=0. @@ -692,7 +692,7 @@ error: The connection between port types `@NegSem_210101_connect_operation_001.m <COMPILE> -<MODULE TTCN NegSem_210101_connect_operation_001 NegSem_210101_connect_operation_001.ttcn > +<MODULE TTCN NegSem_210101_map_operation_002 NegSem_210101_map_operation_002.ttcn > /*************************************************** ** @version 0.0.1 ** @purpose 1:21.1.1, Ensure that IUT cannot map input port with output port diff --git a/conformance_test/core_language_tests/negative_tests/22_communication_operations.script b/conformance_test/core_language_tests/negative_tests/22_communication_operations.script index 05f05a454b53e3ee32d4564e2993ae703f599101..a828c4b688ef8985631c64dc652bba94eaac641d 100644 --- a/conformance_test/core_language_tests/negative_tests/22_communication_operations.script +++ b/conformance_test/core_language_tests/negative_tests/22_communication_operations.script @@ -941,6 +941,72 @@ error: Type mismatch in value redirect: A variable of type `integer' was expecte <END_TC> :exmp +*---------------------------------------------------------------------* +:h3. NegSem_220202_ReceiveOperation_005 negative test +.*---------------------------------------------------------------------* +:xmp tab=0. + +<TC - applying @decoded to a forbidden field > + +<COMPILE> + +<MODULE TTCN NegSem_220202_ReceiveOperation_005 NegSem_220202_ReceiveOperation_005.ttcn > +/****************************************************************************** + ** @version 0.0.1 + ** @purpose 1:22.2.2, applying @decoded to a forbidden field + ** @verdict pass reject + *****************************************************************/ + +// The following requirements are tested: +// When assigning individual fields of a message, encoded payload fields can be +// decoded prior to assignment using the @decoded modifier. In this case, the +// referenced field on the right hand sided of the assignment shall be one of the +// bitstring, hexstring, octetstring, charstring or universal charstring types. It +// shall be decoded into a value of the same type as the variable on the left hand +// side of the assignment. + +module NegSem_220202_ReceiveOperation_005 { + type record R { + integer id, + record of integer payload (0..255) + } + + type port P message { + inout R; + } with {extension "internal"} + + type component GeneralComp { + port P p; + } + + testcase TC_NegSem_220202_ReceiveOperation_005() runs on GeneralComp { + var integer v_res; + + connect(self:p, self:p); + + p.send(R:{ id := 1, payload := {0, 0, 0, 0} }); + + alt { + [] p.receive(R:?) -> value (v_res := @decoded payload) { + setverdict (pass); + } + [] p.receive { setverdict(pass); } + } + } + + control { + execute(TC_NegSem_220202_ReceiveOperation_005(), 5.0); + } +} with {encode "RAW"} +<END_MODULE> + +<RESULT COUNT> +error: The '@decoded' modifier is only available to value redirects of string types +<END_RESULT> + +<END_TC> +:exmp + *---------------------------------------------------------------------* :h3. NegSem_220202_ReceiveOperation_006 negative test .*---------------------------------------------------------------------* @@ -1743,6 +1809,71 @@ error: Type mismatch in value redirect: A variable of type `integer' was expecte <END_RESULT> +<END_TC> +:exmp + +*---------------------------------------------------------------------* +:h3. NegSem_220203_TriggerOperation_005 negative test +.*---------------------------------------------------------------------* +:xmp tab=0. + +<TC - applying @decoded to a forbidden field > + +<COMPILE> + +<MODULE TTCN NegSem_220203_TriggerOperation_005 NegSem_220203_TriggerOperation_005.ttcn > +/****************************************************************************** + ** @version 0.0.1 + ** @purpose 1:22.2.3, applying @decoded to a forbidden field + ** @verdict pass reject + *****************************************************************/ + +// The following requirements are tested: +// Rules in clause 22.2.2 shall apply. +// When assigning individual fields of a message, encoded payload fields can be +// decoded prior to assignment using the @decoded modifier. In this case, the +// referenced field on the right hand sided of the assignment shall be one of the +// bitstring, hexstring, octetstring, charstring or universal charstring types. It +// shall be decoded into a value of the same type as the variable on the left hand +// side of the assignment. + +module NegSem_220203_TriggerOperation_005 { + type record R { + integer id, + record of integer payload (0..255) + } + + type port P message { + inout R; + } with {extension "internal"} + + type component GeneralComp { + port P p; + } + + testcase TC_NegSem_220203_TriggerOperation_005() runs on GeneralComp { + var integer v_res; + + connect(self:p, self:p); + p.send(R:{ id := 1, payload := {0, 0, 0, 0} }); + alt { + [] p.trigger(R:?) -> value (v_res := @decoded payload) { + setverdict (pass); + } + } + } + + control { + execute(TC_NegSem_220203_TriggerOperation_005(), 5.0); + } +} with {encode "RAW"} +<END_MODULE> + +<RESULT COUNT 1> +error: The '@decoded' modifier is only available to value redirects of string types +<END_RESULT> + + <END_TC> :exmp @@ -3014,6 +3145,76 @@ Dynamic test case error: The second argument of connect operation contains the n <END_TC> :exmp +*---------------------------------------------------------------------* +:h3. NegSem_220302_GetcallOperation_011 negative test +.*---------------------------------------------------------------------* +:xmp tab=0. + +<TC - applying @decoded to a forbidden field > + +<COMPILE> + +<MODULE TTCN NegSem_220302_GetcallOperation_011 NegSem_220302_GetcallOperation_011.ttcn > +/****************************************************************************** + ** @version 0.0.1 + ** @purpose 1:22.3.2, applying @decoded to a forbidden field + ** @verdict pass reject + *****************************************************************/ + +// The following requirements are tested: +// When assigning individual fields of a message, encoded payload fields can be +// decoded prior to assignment using the @decoded modifier. In this case, the +// referenced field on the right hand sided of the assignment shall be one of the +// bitstring, hexstring, octetstring, charstring or universal charstring types. It +// shall be decoded into a value of the same type as the variable on the left hand +// side of the assignment. + +module NegSem_220302_GetcallOperation_011 { + type record of integer RoI (0..255); + + signature S(RoI p_par); + + type port P procedure { + inout S; + } with {extension "internal"} + + type component GeneralComp { + port P p; + } + + function f_server() runs on GeneralComp { + var integer v_res; + alt { + [] p.getcall(S: {p_par := ?} ) -> param (v_res := @decoded p_par) { + setverdict (pass); + } + [] p.getcall { setverdict(fail); } + } + } + + testcase TC_NegSem_220302_GetcallOperation_011() runs on GeneralComp system GeneralComp { + var GeneralComp v_ptc := GeneralComp.create("PTC"); + connect(self:p, v_ptc:p); + v_ptc.start(f_server()); + p.call(S:{ p_par := { 0, 0, 0, 0 } }, nowait); + v_ptc.done; + setverdict(pass); + } + + control { + execute(TC_NegSem_220302_GetcallOperation_011(), 5.0); + } +} with {encode "RAW"} +<END_MODULE> + +<RESULT COUNT> +error: The '@decoded' modifier is only available to parameter redirects of string types. +<END_RESULT> + +<END_TC> +:exmp + + *---------------------------------------------------------------------* :h3. NegSem_220302_GetcallOperation_012 negative test .*---------------------------------------------------------------------* diff --git a/conformance_test/core_language_tests/negative_tests/23-27-B_folders.script b/conformance_test/core_language_tests/negative_tests/23-27-B_folders.script index 93fb64cd467ebbdc4d4acef4d5f534e5aab65f73..7e837009746872bb1f3a3178522a29a20935e1a5 100644 --- a/conformance_test/core_language_tests/negative_tests/23-27-B_folders.script +++ b/conformance_test/core_language_tests/negative_tests/23-27-B_folders.script @@ -6221,10 +6221,6 @@ error: permutation match cannot be used for type `integer' <END_TC> :exmp -*---------------------------------------------------------------------* -:h3. B0104_matching_attributes_of_values folder -.*---------------------------------------------------------------------* - *---------------------------------------------------------------------* :h3. NegSem_B010401_length_restrictions_002 negative test .*---------------------------------------------------------------------* diff --git a/conformance_test/core_language_tests/positive_tests/16_functions_altsteps_testcases/1601_functions/160102_predefined_functions/Sem_160102_predefined_functions_034.ttcn b/conformance_test/core_language_tests/positive_tests/16_functions_altsteps_testcases/1601_functions/160102_predefined_functions/Sem_160102_predefined_functions_034.ttcn index e98e3a690534ccc66229f0c0318b26e1809c8ff4..50d4dba5997e8054c964ec98153091925381f090 100755 --- a/conformance_test/core_language_tests/positive_tests/16_functions_altsteps_testcases/1601_functions/160102_predefined_functions/Sem_160102_predefined_functions_034.ttcn +++ b/conformance_test/core_language_tests/positive_tests/16_functions_altsteps_testcases/1601_functions/160102_predefined_functions/Sem_160102_predefined_functions_034.ttcn @@ -45,4 +45,4 @@ module Sem_160102_predefined_functions_034 { control{ execute(TC_Sem_160102_predefined_functions_034()); } -} +} diff --git a/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190301_select_union_statement_001.ttcn b/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190302_select_union_statement_001.ttcn similarity index 88% rename from conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190301_select_union_statement_001.ttcn rename to conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190302_select_union_statement_001.ttcn index bef7d3b8cfe11c4ad12551d03151b99debeac838..c44b0c5cac573b931faa53b64b24ba9317b69d41 100644 --- a/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190301_select_union_statement_001.ttcn +++ b/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190302_select_union_statement_001.ttcn @@ -17,7 +17,7 @@ // In the header part of the select union statement a template instance of union // type shall be given. -module NegSem_190301_select_union_statement_001 { +module NegSem_190302_select_union_statement_001 { type component GeneralComp { } @@ -28,7 +28,7 @@ module NegSem_190301_select_union_statement_001 { boolean boolOption optional } - testcase TC_NegSem_190301_select_union_statement_001() runs on GeneralComp { + testcase TC_NegSem_190302_select_union_statement_001() runs on GeneralComp { var R v_rec := { intOption := omit, strOption := "abc", boolOption := omit } select union (v_rec) { @@ -43,6 +43,6 @@ module NegSem_190301_select_union_statement_001 { } control { - execute(TC_NegSem_190301_select_union_statement_001()); + execute(TC_NegSem_190302_select_union_statement_001()); } } diff --git a/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190301_select_union_statement_002.ttcn b/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190302_select_union_statement_002.ttcn similarity index 89% rename from conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190301_select_union_statement_002.ttcn rename to conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190302_select_union_statement_002.ttcn index 39142cbe53b5b7813396708520140f189cf2fb17..c4d0844c4dc8db3e1fce4085db662f83501897ec 100644 --- a/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190301_select_union_statement_002.ttcn +++ b/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190302_select_union_statement_002.ttcn @@ -17,7 +17,7 @@ // [The TemplateInstance in the header of the select union statement] shall be // at least partially initialized. -module NegSem_190301_select_union_statement_002 { +module NegSem_190302_select_union_statement_002 { type component GeneralComp { } @@ -36,7 +36,7 @@ module NegSem_190301_select_union_statement_002 { integer field2 } - testcase TC_NegSem_190301_select_union_statement_002() runs on GeneralComp { + testcase TC_NegSem_190302_select_union_statement_002() runs on GeneralComp { var R v_rec; v_rec.field2 := 3; select union (v_rec.field1) { @@ -51,6 +51,6 @@ module NegSem_190301_select_union_statement_002 { } control { - execute(TC_NegSem_190301_select_union_statement_002()); + execute(TC_NegSem_190302_select_union_statement_002()); } } diff --git a/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190301_select_union_statement_003.ttcn b/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190302_select_union_statement_003.ttcn similarity index 89% rename from conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190301_select_union_statement_003.ttcn rename to conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190302_select_union_statement_003.ttcn index 8d8a8f05c59f154241a8f98bd8bcf000db0e1d66..033cff13c9d13551b598f9a7dc4cfe79b7654ee8 100644 --- a/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190301_select_union_statement_003.ttcn +++ b/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190302_select_union_statement_003.ttcn @@ -18,7 +18,7 @@ // of an alternative of the union type of the template instance given to the // statement's header. -module NegSem_190301_select_union_statement_003 { +module NegSem_190302_select_union_statement_003 { type component GeneralComp { } @@ -32,7 +32,7 @@ module NegSem_190301_select_union_statement_003 { } recOption } - testcase TC_NegSem_190301_select_union_statement_003() runs on GeneralComp { + testcase TC_NegSem_190302_select_union_statement_003() runs on GeneralComp { var U v_un := { intOption := 5 } select union (v_un) { case (intOption) { @@ -48,6 +48,6 @@ module NegSem_190301_select_union_statement_003 { } control { - execute(TC_NegSem_190301_select_union_statement_003()); + execute(TC_NegSem_190302_select_union_statement_003()); } } diff --git a/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190301_select_union_statement_004.ttcn b/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190302_select_union_statement_004.ttcn similarity index 89% rename from conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190301_select_union_statement_004.ttcn rename to conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190302_select_union_statement_004.ttcn index b99240c37c7b9ffd0e54d5004fab3a187db1629b..a3b073d3fd52f4e2dd180cd68280e4125b0d1d50 100644 --- a/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190301_select_union_statement_004.ttcn +++ b/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190302_select_union_statement_004.ttcn @@ -16,7 +16,7 @@ // The following requirement is tested: // No two cases in a select union statement shall have the same case Identifier. -module NegSem_190301_select_union_statement_004 { +module NegSem_190302_select_union_statement_004 { type component GeneralComp { } @@ -30,7 +30,7 @@ module NegSem_190301_select_union_statement_004 { } recOption } - testcase TC_NegSem_190301_select_union_statement_004() runs on GeneralComp { + testcase TC_NegSem_190302_select_union_statement_004() runs on GeneralComp { var U v_un := { recOption := { field1 := 1, field2 := 2 } } select union (v_un) { @@ -47,6 +47,6 @@ module NegSem_190301_select_union_statement_004 { } control { - execute(TC_NegSem_190301_select_union_statement_004()); + execute(TC_NegSem_190302_select_union_statement_004()); } } diff --git a/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190301_select_union_statement_005.ttcn b/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190302_select_union_statement_005.ttcn similarity index 88% rename from conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190301_select_union_statement_005.ttcn rename to conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190302_select_union_statement_005.ttcn index a4735c9a3321b504a4aa874f1dab9f7e9c6950df..02d815ece7abb569945189c37c0cca915a16b31b 100644 --- a/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190301_select_union_statement_005.ttcn +++ b/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190302_select_union_statement_005.ttcn @@ -16,7 +16,7 @@ // The following requirement is tested: // No two cases in a select union statement shall have the same case Identifier. -module NegSem_190301_select_union_statement_005 { +module NegSem_190302_select_union_statement_005 { type component GeneralComp { } @@ -30,7 +30,7 @@ module NegSem_190301_select_union_statement_005 { } recOption } - testcase TC_NegSem_190301_select_union_statement_005() runs on GeneralComp { + testcase TC_NegSem_190302_select_union_statement_005() runs on GeneralComp { var U v_un := { intOption := 10 } select union (v_un) { case (intOption, strOption) { @@ -42,6 +42,6 @@ module NegSem_190301_select_union_statement_005 { } control { - execute(TC_NegSem_190301_select_union_statement_005()); + execute(TC_NegSem_190302_select_union_statement_005()); } } diff --git a/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_001.ttcn b/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_001.ttcn similarity index 88% rename from conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_001.ttcn rename to conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_001.ttcn index 5adbd1ecc84cd8a0cf15a7617f0f70d239e41e98..9ec571708641e7ce1179d574f90d49b9491991c7 100644 --- a/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_001.ttcn +++ b/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_001.ttcn @@ -16,7 +16,7 @@ // The following requirement is tested: // The statement contains a header part and zero or more branches. -module Sem_190301_select_union_statement_001 { +module Sem_190302_select_union_statement_001 { type component GeneralComp { } @@ -27,7 +27,7 @@ module Sem_190301_select_union_statement_001 { boolean boolOption } - testcase TC_Sem_190301_select_union_statement_001() runs on GeneralComp { + testcase TC_Sem_190302_select_union_statement_001() runs on GeneralComp { var U v_un := { strOption := "abc" } select union (v_un) { case (intOption) { @@ -41,6 +41,6 @@ module Sem_190301_select_union_statement_001 { } control { - execute(TC_Sem_190301_select_union_statement_001()); + execute(TC_Sem_190302_select_union_statement_001()); } } diff --git a/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_002.ttcn b/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_002.ttcn similarity index 89% rename from conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_002.ttcn rename to conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_002.ttcn index cae4aa7801a734d48c9d6f4ed2a9d362405991f0..05bf92e301b8b16b7cf67497bc91554ab47b87cd 100644 --- a/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_002.ttcn +++ b/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_002.ttcn @@ -18,7 +18,7 @@ // of the alternatives (fields) of the union type (a list branch) or the else keyword // (an else branch) and a statement block. -module Sem_190301_select_union_statement_002 { +module Sem_190302_select_union_statement_002 { type component GeneralComp { } @@ -30,7 +30,7 @@ module Sem_190301_select_union_statement_002 { bitstring bitOption } - testcase TC_Sem_190301_select_union_statement_002() runs on GeneralComp { + testcase TC_Sem_190302_select_union_statement_002() runs on GeneralComp { var U v_un := { strOption := "abc" } select union (v_un) { case (intOption, boolOption, strOption) { @@ -42,6 +42,6 @@ module Sem_190301_select_union_statement_002 { } control { - execute(TC_Sem_190301_select_union_statement_002()); + execute(TC_Sem_190302_select_union_statement_002()); } } diff --git a/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_003.ttcn b/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_003.ttcn similarity index 89% rename from conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_003.ttcn rename to conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_003.ttcn index 0fc88d1c23989d8d52e81c62ee494d7dd1cde847..f578b962261e49622c0e120acbcc522bddd81c80 100644 --- a/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_003.ttcn +++ b/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_003.ttcn @@ -18,7 +18,7 @@ // of the alternatives (fields) of the union type (a list branch) or the else keyword // (an else branch) and a statement block. -module Sem_190301_select_union_statement_003 { +module Sem_190302_select_union_statement_003 { type component GeneralComp { } @@ -30,7 +30,7 @@ module Sem_190301_select_union_statement_003 { bitstring bitOption } - testcase TC_Sem_190301_select_union_statement_003() runs on GeneralComp { + testcase TC_Sem_190302_select_union_statement_003() runs on GeneralComp { var U v_un := { strOption := "abc" } select union (v_un) { case (strOption) { @@ -44,6 +44,6 @@ module Sem_190301_select_union_statement_003 { } control { - execute(TC_Sem_190301_select_union_statement_003()); + execute(TC_Sem_190302_select_union_statement_003()); } } diff --git a/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_004.ttcn b/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_004.ttcn similarity index 88% rename from conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_004.ttcn rename to conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_004.ttcn index 65a5300b3a098c5b0e9323cba8c915d281739338..8054aadfd5e3794f082ae9b4893985a3a2b757f8 100644 --- a/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_004.ttcn +++ b/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_004.ttcn @@ -17,7 +17,7 @@ // If no case exists for the chosen alternative, the StatementBlock of the else // branch, if it is present, is executed. -module Sem_190301_select_union_statement_004 { +module Sem_190302_select_union_statement_004 { type component GeneralComp { } @@ -29,7 +29,7 @@ module Sem_190301_select_union_statement_004 { bitstring bitOption } - testcase TC_Sem_190301_select_union_statement_004() runs on GeneralComp { + testcase TC_Sem_190302_select_union_statement_004() runs on GeneralComp { var U v_un := { strOption := "abc" } select union (v_un) { case (intOption) { @@ -43,6 +43,6 @@ module Sem_190301_select_union_statement_004 { } control { - execute(TC_Sem_190301_select_union_statement_004()); + execute(TC_Sem_190302_select_union_statement_004()); } } diff --git a/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_005.ttcn b/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_005.ttcn similarity index 88% rename from conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_005.ttcn rename to conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_005.ttcn index c3ce1438d7baecbf6ddf20e1d24e3c4e65d1311f..9118f5bd2c00fdfbc4e1999c07238d3119617559 100644 --- a/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_005.ttcn +++ b/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_005.ttcn @@ -17,7 +17,7 @@ // Otherwise [if no case exists for the chosen alternative and the else branch // is not present], the select union statement has no effect. -module Sem_190301_select_union_statement_005 { +module Sem_190302_select_union_statement_005 { type component GeneralComp { } @@ -29,7 +29,7 @@ module Sem_190301_select_union_statement_005 { bitstring bitOption } - testcase TC_Sem_190301_select_union_statement_005() runs on GeneralComp { + testcase TC_Sem_190302_select_union_statement_005() runs on GeneralComp { var U v_un := { strOption := "abc" } select union (v_un) { case (intOption) { @@ -42,6 +42,6 @@ module Sem_190301_select_union_statement_005 { } control { - execute(TC_Sem_190301_select_union_statement_005()); + execute(TC_Sem_190302_select_union_statement_005()); } } diff --git a/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_006.ttcn b/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_006.ttcn similarity index 89% rename from conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_006.ttcn rename to conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_006.ttcn index 4b1f30cdd3135eafe804c29fe6fc804d588bdc11..67a347dea60a085b56a6968dbdf24566f391d2c6 100644 --- a/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_006.ttcn +++ b/conformance_test/core_language_tests/positive_tests/19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_006.ttcn @@ -17,7 +17,7 @@ // [The TemplateInstance in the header of the select union statement] shall be // at least partially initialized. -module Sem_190301_select_union_statement_006 { +module Sem_190302_select_union_statement_006 { type component GeneralComp { } @@ -31,7 +31,7 @@ module Sem_190301_select_union_statement_006 { } recOption } - testcase TC_Sem_190301_select_union_statement_006() runs on GeneralComp { + testcase TC_Sem_190302_select_union_statement_006() runs on GeneralComp { var U v_un := { recOption := { field1 := 1, field2 := - } } select union (v_un) { case (intOption) { @@ -45,6 +45,6 @@ module Sem_190301_select_union_statement_006 { } control { - execute(TC_Sem_190301_select_union_statement_006()); + execute(TC_Sem_190302_select_union_statement_006()); } } diff --git a/conformance_test/core_language_tests/positive_tests/22_communication_operations/2202_message_based_communication/220202_receive_operation/NegSem_220202_ReceiveOperation_005.ttcn b/conformance_test/core_language_tests/positive_tests/22_communication_operations/2202_message_based_communication/220202_receive_operation/NegSem_220202_ReceiveOperation_005.ttcn index 189663e29b4eba96e48e0eab586f4358e6ac0c3e..9abfc98ab510e37980a4126ce7f6844a00727fd8 100644 --- a/conformance_test/core_language_tests/positive_tests/22_communication_operations/2202_message_based_communication/220202_receive_operation/NegSem_220202_ReceiveOperation_005.ttcn +++ b/conformance_test/core_language_tests/positive_tests/22_communication_operations/2202_message_based_communication/220202_receive_operation/NegSem_220202_ReceiveOperation_005.ttcn @@ -53,4 +53,4 @@ module NegSem_220202_ReceiveOperation_005 { control { execute(TC_NegSem_220202_ReceiveOperation_005(), 5.0); } -} +} with {encode "RAW"} diff --git a/conformance_test/core_language_tests/positive_tests/22_communication_operations/2202_message_based_communication/220202_receive_operation/NegSem_220202_ReceiveOperation_023.ttcn b/conformance_test/core_language_tests/positive_tests/22_communication_operations/2202_message_based_communication/220202_receive_operation/NegSem_220202_ReceiveOperation_023.ttcn index 80aa5d0fbad4d139a23e96b25cc5844f95de4668..6e2a6bcb612234b43b309fe8f54b0b3b911bf47d 100644 --- a/conformance_test/core_language_tests/positive_tests/22_communication_operations/2202_message_based_communication/220202_receive_operation/NegSem_220202_ReceiveOperation_023.ttcn +++ b/conformance_test/core_language_tests/positive_tests/22_communication_operations/2202_message_based_communication/220202_receive_operation/NegSem_220202_ReceiveOperation_023.ttcn @@ -30,7 +30,7 @@ module NegSem_220202_ReceiveOperation_023 { type record Wrapped { integer num - } + } with { variant ""} type port P message { inout R; @@ -45,11 +45,14 @@ module NegSem_220202_ReceiveOperation_023 { var Wrapped v_res; var R v_rec := { id := 0, payload := bit2oct(encvalue(input)) }; + + connect(self:p, self:p); + p.send(v_rec); alt { - [] p.receive(R:{ id := ?, payload := decmatch integer:? }) -> value (v_res := @decoded payload) {} + [] p.receive(R:{ id := ?, payload := decmatch I:? }) -> value (v_res := @decoded payload) {} [] p.receive {} - } + } setverdict(pass); } diff --git a/conformance_test/core_language_tests/positive_tests/22_communication_operations/2202_message_based_communication/220203_trigger_operation/NegSem_220203_TriggerOperation_005.ttcn b/conformance_test/core_language_tests/positive_tests/22_communication_operations/2202_message_based_communication/220203_trigger_operation/NegSem_220203_TriggerOperation_005.ttcn index 42705c9a5a5e1d9a1240fc877d37b7ab3084a979..942a3de18c4a2878c52cf7e05fb65772a918d49f 100644 --- a/conformance_test/core_language_tests/positive_tests/22_communication_operations/2202_message_based_communication/220203_trigger_operation/NegSem_220203_TriggerOperation_005.ttcn +++ b/conformance_test/core_language_tests/positive_tests/22_communication_operations/2202_message_based_communication/220203_trigger_operation/NegSem_220203_TriggerOperation_005.ttcn @@ -51,4 +51,4 @@ module NegSem_220203_TriggerOperation_005 { control { execute(TC_NegSem_220203_TriggerOperation_005(), 5.0); } -} +} with {encode "RAW"} diff --git a/conformance_test/core_language_tests/positive_tests/22_communication_operations/2202_message_based_communication/220203_trigger_operation/NegSem_220203_TriggerOperation_023.ttcn b/conformance_test/core_language_tests/positive_tests/22_communication_operations/2202_message_based_communication/220203_trigger_operation/NegSem_220203_TriggerOperation_023.ttcn index 0640ac187278a1a45c8681de7e7d9af3efb968bb..ffd4f90389a1845a354bfe839fe43f25fdc87940 100644 --- a/conformance_test/core_language_tests/positive_tests/22_communication_operations/2202_message_based_communication/220203_trigger_operation/NegSem_220203_TriggerOperation_023.ttcn +++ b/conformance_test/core_language_tests/positive_tests/22_communication_operations/2202_message_based_communication/220203_trigger_operation/NegSem_220203_TriggerOperation_023.ttcn @@ -30,7 +30,7 @@ module NegSem_220203_TriggerOperation_023 { type record Wrapped { integer num - } + } with { variant ""}; type port P message { inout R; @@ -49,7 +49,7 @@ module NegSem_220203_TriggerOperation_023 { connect(self:p, self:p); p.send(v_rec); alt { - [] p.trigger(R:{ id := ?, payload := decmatch integer:? }) -> value (v_res := @decoded payload) {} + [] p.trigger(R:{ id := ?, payload := decmatch I:? }) -> value (v_res := @decoded payload) {} [else] {} } setverdict(pass); diff --git a/conformance_test/core_language_tests/positive_tests/22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_011.ttcn b/conformance_test/core_language_tests/positive_tests/22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_011.ttcn index 24d1db46db03c447a58999efc2258fd0f37e10a3..8c4b55ed9b52e40f5c87119fdf37bdf7ffde8506 100644 --- a/conformance_test/core_language_tests/positive_tests/22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_011.ttcn +++ b/conformance_test/core_language_tests/positive_tests/22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_011.ttcn @@ -56,4 +56,4 @@ module NegSem_220302_GetcallOperation_011 { control { execute(TC_NegSem_220302_GetcallOperation_011(), 5.0); } -} +} with {encode "RAW"} diff --git a/conformance_test/core_language_tests/positive_tests/22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_017.ttcn b/conformance_test/core_language_tests/positive_tests/22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_017.ttcn index 100d9496a237c9d0f59d0e90795727eec89eb3fc..f07b0637902e9183254de8d698c227d42e83bad2 100644 --- a/conformance_test/core_language_tests/positive_tests/22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_017.ttcn +++ b/conformance_test/core_language_tests/positive_tests/22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_017.ttcn @@ -35,12 +35,12 @@ module NegSem_220302_GetcallOperation_017 { type record Wrapped { integer num - } + } with { variant "" } function f_server() runs on GeneralComp { var Wrapped v_res; alt { - [] p.getcall(S:{ p_par := decmatch integer:? }) -> param (v_res := @decoded p_par) { + [] p.getcall(S:{ p_par := decmatch I:? }) -> param (v_res := @decoded p_par) { setverdict (pass); } [] p.getcall { setverdict(pass); } diff --git a/conformance_test/core_language_tests/positive_tests/22_communication_operations/2203_procedure_based_communication/220304_getreply_operation/NegSem_220304_getreply_operation_014.ttcn b/conformance_test/core_language_tests/positive_tests/22_communication_operations/2203_procedure_based_communication/220304_getreply_operation/NegSem_220304_getreply_operation_014.ttcn index 1fcf5927ba96ae5ffe49e9f116179d967c2eb288..6714a74fb0ccc83d377e4228a525e8c0945fc5b7 100644 --- a/conformance_test/core_language_tests/positive_tests/22_communication_operations/2203_procedure_based_communication/220304_getreply_operation/NegSem_220304_getreply_operation_014.ttcn +++ b/conformance_test/core_language_tests/positive_tests/22_communication_operations/2203_procedure_based_communication/220304_getreply_operation/NegSem_220304_getreply_operation_014.ttcn @@ -35,7 +35,7 @@ module NegSem_220304_getreply_operation_014 { type record Wrapped { integer num - } + } with {variant ""} function f_server() runs on GeneralComp { var I v_src := 5; @@ -52,7 +52,7 @@ module NegSem_220304_getreply_operation_014 { v_ptc.start(f_server()); p.call(S:{ p_par := - }) { - [] p.getreply(S:{ p_par := decmatch integer:? }) -> param (v_res := @decoded p_par) { + [] p.getreply(S:{ p_par := decmatch I:? }) -> param (v_res := @decoded p_par) { setverdict (pass); } [] p.getreply { setverdict(pass); } diff --git a/conformance_test/core_language_tests/positive_tests/22_communication_operations/2203_procedure_based_communication/220304_getreply_operation/NegSem_220304_getreply_operation_020.ttcn b/conformance_test/core_language_tests/positive_tests/22_communication_operations/2203_procedure_based_communication/220304_getreply_operation/NegSem_220304_getreply_operation_020.ttcn index f6a50e76478a1af82cac58ae8c5c66e09361dd36..e69bbb7da9f6521d7825b0943ff0f3f037484fe5 100644 --- a/conformance_test/core_language_tests/positive_tests/22_communication_operations/2203_procedure_based_communication/220304_getreply_operation/NegSem_220304_getreply_operation_020.ttcn +++ b/conformance_test/core_language_tests/positive_tests/22_communication_operations/2203_procedure_based_communication/220304_getreply_operation/NegSem_220304_getreply_operation_020.ttcn @@ -27,7 +27,7 @@ module NegSem_220304_getreply_operation_020 { } signature S() return R; - type integer I with {variant ""}; + type integer I with {variant "32 bit"}; type port P procedure { inout S; @@ -39,7 +39,7 @@ module NegSem_220304_getreply_operation_020 { type record Wrapped { integer num - } + } with { variant ""} function f_server() runs on GeneralComp { var I v_src := 5; @@ -54,7 +54,7 @@ module NegSem_220304_getreply_operation_020 { connect(self:p, v_ptc:p); v_ptc.start(f_server()); p.call(S:{}) { - [] p.getreply(S:{} value R:{ id := ?, payload := decmatch integer:? }) -> value (v_res := @decoded payload) { + [] p.getreply(S:{} value R:{ id := ?, payload := decmatch I:? }) -> value (v_res := @decoded payload) { setverdict (pass); } [] p.getreply { setverdict(pass); } diff --git a/conformance_test/core_language_tests/positive_tests/22_communication_operations/2203_procedure_based_communication/220304_getreply_operation/Sem_220304_getreply_operation_014.ttcn b/conformance_test/core_language_tests/positive_tests/22_communication_operations/2203_procedure_based_communication/220304_getreply_operation/Sem_220304_getreply_operation_014.ttcn index df473b7b13aef02dfa5ad884655dc9a83fadb886..8ce8fa60ef35f364059bb5dab23b1e06c4c7af1a 100644 --- a/conformance_test/core_language_tests/positive_tests/22_communication_operations/2203_procedure_based_communication/220304_getreply_operation/Sem_220304_getreply_operation_014.ttcn +++ b/conformance_test/core_language_tests/positive_tests/22_communication_operations/2203_procedure_based_communication/220304_getreply_operation/Sem_220304_getreply_operation_014.ttcn @@ -35,7 +35,7 @@ module Sem_220304_getreply_operation_014 { function f_server() runs on GeneralComp { var I v_src := 1953719668; var universal charstring v_str := encvalue_unichar(v_src, "UTF-16LE"); - p.getcall(S: {}); + p.getcall(S: { p_par := -}); p.reply(S:{ p_par := v_str }); } diff --git a/conformance_test/core_language_tests/positive_tests/22_communication_operations/2203_procedure_based_communication/220306_catch_operation/NegSem_220306_catch_operation_014.ttcn b/conformance_test/core_language_tests/positive_tests/22_communication_operations/2203_procedure_based_communication/220306_catch_operation/NegSem_220306_catch_operation_014.ttcn index 417accc5e45e335db94dbb2da0e72b7d1562e122..dc11cd3aa617114e6632ab1418b0b1cbe4106946 100644 --- a/conformance_test/core_language_tests/positive_tests/22_communication_operations/2203_procedure_based_communication/220306_catch_operation/NegSem_220306_catch_operation_014.ttcn +++ b/conformance_test/core_language_tests/positive_tests/22_communication_operations/2203_procedure_based_communication/220306_catch_operation/NegSem_220306_catch_operation_014.ttcn @@ -25,7 +25,7 @@ module NegSem_220306_catch_operation_014 { integer id, bitstring payload } - signature S() return R; + signature S() exception (R); type integer I with {variant "32 bit"}; @@ -39,13 +39,13 @@ module NegSem_220306_catch_operation_014 { type record Wrapped { integer num - } + } with { variant ""} function f_server() runs on GeneralComp { var I v_src := 5; var R v_rec := { id := 1, payload := encvalue(v_src) }; p.getcall(S:{}); - p.reply(S:{} value v_rec); + p.raise(S, v_rec); } testcase TC_NegSem_220306_catch_operation_014() runs on GeneralComp system GeneralComp { @@ -53,11 +53,12 @@ module NegSem_220306_catch_operation_014 { var GeneralComp v_ptc := GeneralComp.create("PTC"); connect(self:p, v_ptc:p); v_ptc.start(f_server()); + p.call(S:{}) { - [] p.getreply(S:{} value R:{ id := ?, payload := decmatch integer:? }) -> value (v_res := @decoded payload) { + [] p.catch(S, R:{ id := ?, payload := decmatch I:? }) -> value (v_res := @decoded payload) { setverdict (pass); } - [] p.getreply { setverdict(pass); } + [] p.catch { setverdict(pass); } } } diff --git a/conformance_test/core_language_tests/positive_tests/README.txt b/conformance_test/core_language_tests/positive_tests/README.txt index 6d5c11eb90d4338c6171de052c59d824046e4f92..49636fc93e770535c24dc7d5310001e3b6197666 100644 --- a/conformance_test/core_language_tests/positive_tests/README.txt +++ b/conformance_test/core_language_tests/positive_tests/README.txt @@ -1,17 +1,11 @@ // README to positive conformance tests How to run: -A. -1. Create bin folder in positive_tests and copy XML_tests.cfg into it -2. Use the Makefile in positive tests folder - -B. (Without the Makefile) 1. Generate a Makefile from pos_conf_test.tpd in positive_tests folder: ttcn3_makefilegen -f -t pos_conf_tests.tpd -2. Create bin folder in positive_tests and copy pos_conf_tests.cfg into it -3. Compile Makefile in bin folder: +2. Compile Makefile in bin folder: make -4. Run tests in bin folder: - ttcn3_start pos_conf_tests pos_conf_tests.cfg -5. Clean everything in bin folder: +3. Run tests in bin folder: + ttcn3_start pos_conf_tests +4. Clean everything in bin folder: make clean diff --git a/conformance_test/core_language_tests/positive_tests/pos_conf_tests.cfg b/conformance_test/core_language_tests/positive_tests/pos_conf_tests.cfg index b0a29786f30fd05ece11f91abac4cb99903e4c5a..9171b677af88c5626b04dfa12ba474d0b9d3c770 100644 --- a/conformance_test/core_language_tests/positive_tests/pos_conf_tests.cfg +++ b/conformance_test/core_language_tests/positive_tests/pos_conf_tests.cfg @@ -809,6 +809,12 @@ Sem_190301_select_case_statement_001.control Sem_190301_select_case_statement_002.control Sem_190301_select_case_statement_003.control Sem_190301_select_case_statement_004.control +Sem_190302_select_union_statement_001.control +Sem_190302_select_union_statement_002.control +Sem_190302_select_union_statement_003.control +Sem_190302_select_union_statement_004.control +Sem_190302_select_union_statement_005.control +Sem_190302_select_union_statement_006.control Sem_1904_for_statement_001.control Sem_1904_for_statement_002.control Sem_1904_for_statement_003.control @@ -1283,7 +1289,6 @@ Syn_0802_ModuleDefinitionsPart_001.control Syn_0802_ModuleDefinitionsPart_002.control Syn_0803_ModuleControlPart_001.control Syn_0803_ModuleControlPart_002.control -Syn_0803_ModuleControlPart_003.control Syn_0902_Communication_ports_001.control Syn_10_Constants_001.control Syn_10_Constants_002.control diff --git a/conformance_test/core_language_tests/positive_tests/pos_conf_tests.tpd b/conformance_test/core_language_tests/positive_tests/pos_conf_tests.tpd index 0c068e6ba8148480b68ae9618f5267e80e620267..d6e73eb03c35ca0b14c64a1d1234ad6e1ccb4030 100644 --- a/conformance_test/core_language_tests/positive_tests/pos_conf_tests.tpd +++ b/conformance_test/core_language_tests/positive_tests/pos_conf_tests.tpd @@ -411,7 +411,7 @@ <!-- <FileResource projectRelativePath="05_basic_language_elements/0504_parametrization/050401_formal_parameters/050401_top_level/NegSem_050401_top_level_002.ttcn" relativeURI="05_basic_language_elements/0504_parametrization/050401_formal_parameters/050401_top_level/NegSem_050401_top_level_002.ttcn"/>--> <!-- <FileResource projectRelativePath="05_basic_language_elements/0504_parametrization/050401_formal_parameters/050401_top_level/NegSem_050401_top_level_003.ttcn" relativeURI="05_basic_language_elements/0504_parametrization/050401_formal_parameters/050401_top_level/NegSem_050401_top_level_003.ttcn"/>--> <FileResource projectRelativePath="05_basic_language_elements/0504_parametrization/050401_formal_parameters/050401_top_level/Sem_050401_top_level_001.ttcn" relativeURI="05_basic_language_elements/0504_parametrization/050401_formal_parameters/050401_top_level/Sem_050401_top_level_001.ttcn"/> - <FileResource projectRelativePath="05_basic_language_elements/0504_parametrization/050401_formal_parameters/050401_top_level/Sem_050401_top_level_002.ttcn" relativeURI="05_basic_language_elements/0504_parametrization/050401_formal_parameters/050401_top_level/Sem_050401_top_level_002.ttcn"/> +<!-- <FileResource projectRelativePath="05_basic_language_elements/0504_parametrization/050401_formal_parameters/050401_top_level/Sem_050401_top_level_002.ttcn" relativeURI="05_basic_language_elements/0504_parametrization/050401_formal_parameters/050401_top_level/Sem_050401_top_level_002.ttcn"/>--> <FileResource projectRelativePath="05_basic_language_elements/0504_parametrization/050401_formal_parameters/050401_top_level/Sem_050401_top_level_003.ttcn" relativeURI="05_basic_language_elements/0504_parametrization/050401_formal_parameters/050401_top_level/Sem_050401_top_level_003.ttcn"/> <FileResource projectRelativePath="05_basic_language_elements/0504_parametrization/050401_formal_parameters/050401_top_level/Sem_050401_top_level_004.ttcn" relativeURI="05_basic_language_elements/0504_parametrization/050401_formal_parameters/050401_top_level/Sem_050401_top_level_004.ttcn"/> <FileResource projectRelativePath="05_basic_language_elements/0504_parametrization/050401_formal_parameters/050401_top_level/Sem_050401_top_level_005.ttcn" relativeURI="05_basic_language_elements/0504_parametrization/050401_formal_parameters/050401_top_level/Sem_050401_top_level_005.ttcn"/> @@ -1685,7 +1685,7 @@ <FileResource projectRelativePath="08_modules/0803_module_control_part/Sem_0803_ModuleControlPart_001.ttcn" relativeURI="08_modules/0803_module_control_part/Sem_0803_ModuleControlPart_001.ttcn"/> <FileResource projectRelativePath="08_modules/0803_module_control_part/Syn_0803_ModuleControlPart_001.ttcn" relativeURI="08_modules/0803_module_control_part/Syn_0803_ModuleControlPart_001.ttcn"/> <FileResource projectRelativePath="08_modules/0803_module_control_part/Syn_0803_ModuleControlPart_002.ttcn" relativeURI="08_modules/0803_module_control_part/Syn_0803_ModuleControlPart_002.ttcn"/> - <FileResource projectRelativePath="08_modules/0803_module_control_part/Syn_0803_ModuleControlPart_003.ttcn" relativeURI="08_modules/0803_module_control_part/Syn_0803_ModuleControlPart_003.ttcn"/> +<!-- <FileResource projectRelativePath="08_modules/0803_module_control_part/Syn_0803_ModuleControlPart_003.ttcn" relativeURI="08_modules/0803_module_control_part/Syn_0803_ModuleControlPart_003.ttcn"/>--> <!-- <FileResource projectRelativePath="09_test_configurations/0901_communication_ports/NegSem_0901_Communication_ports_001.ttcn" relativeURI="09_test_configurations/0901_communication_ports/NegSem_0901_Communication_ports_001.ttcn"/>--> <!-- <FileResource projectRelativePath="09_test_configurations/0901_communication_ports/NegSem_0901_Communication_ports_002.ttcn" relativeURI="09_test_configurations/0901_communication_ports/NegSem_0901_Communication_ports_002.ttcn"/>--> <!-- <FileResource projectRelativePath="09_test_configurations/0901_communication_ports/NegSem_0901_Communication_ports_003.ttcn" relativeURI="09_test_configurations/0901_communication_ports/NegSem_0901_Communication_ports_003.ttcn"/>--> @@ -2234,17 +2234,17 @@ <FileResource projectRelativePath="19_basic_program_statements/1903_select_statements/190301_select_case_statement/Sem_190301_select_case_statement_002.ttcn" relativeURI="19_basic_program_statements/1903_select_statements/190301_select_case_statement/Sem_190301_select_case_statement_002.ttcn"/> <FileResource projectRelativePath="19_basic_program_statements/1903_select_statements/190301_select_case_statement/Sem_190301_select_case_statement_003.ttcn" relativeURI="19_basic_program_statements/1903_select_statements/190301_select_case_statement/Sem_190301_select_case_statement_003.ttcn"/> <FileResource projectRelativePath="19_basic_program_statements/1903_select_statements/190301_select_case_statement/Sem_190301_select_case_statement_004.ttcn" relativeURI="19_basic_program_statements/1903_select_statements/190301_select_case_statement/Sem_190301_select_case_statement_004.ttcn"/> -<!-- <FileResource projectRelativePath="19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190301_select_union_statement_001.ttcn" relativeURI="19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190301_select_union_statement_001.ttcn"/>--> -<!-- <FileResource projectRelativePath="19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190301_select_union_statement_002.ttcn" relativeURI="19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190301_select_union_statement_002.ttcn"/>--> -<!-- <FileResource projectRelativePath="19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190301_select_union_statement_003.ttcn" relativeURI="19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190301_select_union_statement_003.ttcn"/>--> -<!-- <FileResource projectRelativePath="19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190301_select_union_statement_004.ttcn" relativeURI="19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190301_select_union_statement_004.ttcn"/>--> -<!-- <FileResource projectRelativePath="19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190301_select_union_statement_005.ttcn" relativeURI="19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190301_select_union_statement_005.ttcn"/>--> -<!-- <FileResource projectRelativePath="19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_001.ttcn" relativeURI="19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_001.ttcn"/>--> -<!-- <FileResource projectRelativePath="19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_002.ttcn" relativeURI="19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_002.ttcn"/>--> -<!-- <FileResource projectRelativePath="19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_003.ttcn" relativeURI="19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_003.ttcn"/>--> -<!-- <FileResource projectRelativePath="19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_004.ttcn" relativeURI="19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_004.ttcn"/>--> -<!-- <FileResource projectRelativePath="19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_005.ttcn" relativeURI="19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_005.ttcn"/>--> -<!-- <FileResource projectRelativePath="19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_006.ttcn" relativeURI="19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190301_select_union_statement_006.ttcn"/>--> +<!-- <FileResource projectRelativePath="19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190302_select_union_statement_001.ttcn" relativeURI="19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190302_select_union_statement_001.ttcn"/>--> +<!-- <FileResource projectRelativePath="19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190302_select_union_statement_002.ttcn" relativeURI="19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190302_select_union_statement_002.ttcn"/>--> +<!-- <FileResource projectRelativePath="19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190302_select_union_statement_003.ttcn" relativeURI="19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190302_select_union_statement_003.ttcn"/>--> +<!-- <FileResource projectRelativePath="19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190302_select_union_statement_004.ttcn" relativeURI="19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190302_select_union_statement_004.ttcn"/>--> +<!-- <FileResource projectRelativePath="19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190302_select_union_statement_005.ttcn" relativeURI="19_basic_program_statements/1903_select_statements/190302_select_union_statement/NegSem_190302_select_union_statement_005.ttcn"/>--> + <FileResource projectRelativePath="19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_001.ttcn" relativeURI="19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_001.ttcn"/> + <FileResource projectRelativePath="19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_002.ttcn" relativeURI="19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_002.ttcn"/> + <FileResource projectRelativePath="19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_003.ttcn" relativeURI="19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_003.ttcn"/> + <FileResource projectRelativePath="19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_004.ttcn" relativeURI="19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_004.ttcn"/> + <FileResource projectRelativePath="19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_005.ttcn" relativeURI="19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_005.ttcn"/> + <FileResource projectRelativePath="19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_006.ttcn" relativeURI="19_basic_program_statements/1903_select_statements/190302_select_union_statement/Sem_190302_select_union_statement_006.ttcn"/> <!-- <FileResource projectRelativePath="19_basic_program_statements/1904_for_statement/NegSem_1904_for_statement_001.ttcn" relativeURI="19_basic_program_statements/1904_for_statement/NegSem_1904_for_statement_001.ttcn"/>--> <FileResource projectRelativePath="19_basic_program_statements/1904_for_statement/Sem_1904_for_statement_001.ttcn" relativeURI="19_basic_program_statements/1904_for_statement/Sem_1904_for_statement_001.ttcn"/> <FileResource projectRelativePath="19_basic_program_statements/1904_for_statement/Sem_1904_for_statement_002.ttcn" relativeURI="19_basic_program_statements/1904_for_statement/Sem_1904_for_statement_002.ttcn"/> @@ -2727,22 +2727,22 @@ <!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_001.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_001.ttcn"/>--> <!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_002.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_002.ttcn"/>--> <!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_003.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_003.ttcn"/>--> -<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_getcall_operation_004.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_getcall_operation_004.ttcn"/>--> -<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_getcall_operation_005.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_getcall_operation_005.ttcn"/>--> -<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_getcall_operation_006.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_getcall_operation_006.ttcn"/>--> -<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_getcall_operation_007.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_getcall_operation_007.ttcn"/>--> -<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_getcall_operation_008.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_getcall_operation_008.ttcn"/>--> -<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_getcall_operation_009.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_getcall_operation_009.ttcn"/>--> -<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_getcall_operation_010.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_getcall_operation_010.ttcn"/>--> -<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_getcall_operation_011.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_getcall_operation_011.ttcn"/>--> -<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_getcall_operation_012.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_getcall_operation_012.ttcn"/>--> -<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_getcall_operation_013.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_getcall_operation_013.ttcn"/>--> -<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_getcall_operation_014.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_getcall_operation_014.ttcn"/>--> -<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_getcall_operation_015.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_getcall_operation_015.ttcn"/>--> -<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_getcall_operation_016.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_getcall_operation_016.ttcn"/>--> -<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_getcall_operation_017.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_getcall_operation_017.ttcn"/>--> -<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSyn_220302_getcall_operation_001.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSyn_220302_getcall_operation_001.ttcn"/>--> -<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSyn_220302_getcall_operation_002.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSyn_220302_getcall_operation_002.ttcn"/>--> +<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_004.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_004.ttcn"/>--> +<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_005.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_005.ttcn"/>--> +<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_006.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_006.ttcn"/>--> +<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_007.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_007.ttcn"/>--> +<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_008.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_008.ttcn"/>--> +<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_009.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_009.ttcn"/>--> +<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_010.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_010.ttcn"/>--> +<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_011.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_011.ttcn"/>--> +<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_012.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_012.ttcn"/>--> +<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_013.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_013.ttcn"/>--> +<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_014.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_014.ttcn"/>--> +<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_015.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_015.ttcn"/>--> +<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_016.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_016.ttcn"/>--> +<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_017.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSem_220302_GetcallOperation_017.ttcn"/>--> +<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSyn_220302_GetcallOperation_001.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSyn_220302_GetcallOperation_001.ttcn"/>--> +<!-- <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSyn_220302_GetcallOperation_002.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/NegSyn_220302_GetcallOperation_002.ttcn"/>--> <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/Sem_220302_GetcallOperation_001.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/Sem_220302_GetcallOperation_001.ttcn"/> <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/Sem_220302_GetcallOperation_002.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/Sem_220302_GetcallOperation_002.ttcn"/> <FileResource projectRelativePath="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/Sem_220302_GetcallOperation_003.ttcn" relativeURI="22_communication_operations/2203_procedure_based_communication/220302_getcall_operation/Sem_220302_GetcallOperation_003.ttcn"/> diff --git a/core/Addfunc.cc b/core/Addfunc.cc index b428d4fbfa6ca2170a275c0f49bf5df628313c1a..457f79f04c0ca0edfa36f64ac7d67744295f8da2 100644 --- a/core/Addfunc.cc +++ b/core/Addfunc.cc @@ -33,6 +33,7 @@ #include "Logger.hh" #include "Snapshot.hh" #include "TitanLoggerApi.hh" +#include "../common/UnicharPattern.hh" #include <openssl/bn.h> @@ -1355,7 +1356,7 @@ double str2float(const CHARSTRING& value) // C.33 - regexp CHARSTRING regexp(const CHARSTRING& instr, const CHARSTRING& expression, - int groupno) + int groupno, boolean nocase) { instr.must_bound("The first argument (instr) of function regexp() is an " "unbound charstring value."); @@ -1402,13 +1403,14 @@ CHARSTRING regexp(const CHARSTRING& instr, const CHARSTRING& expression, if (TTCN_Logger::log_this_event(TTCN_Logger::DEBUG_UNQUALIFIED)) { TTCN_Logger::begin_event(TTCN_Logger::DEBUG_UNQUALIFIED); TTCN_Logger::log_event_str("regexp(): POSIX ERE equivalent of "); - CHARSTRING_template(STRING_PATTERN, expression).log(); + CHARSTRING_template(STRING_PATTERN, expression, nocase).log(); TTCN_Logger::log_event_str(" is: "); CHARSTRING(posix_str).log(); TTCN_Logger::end_event(); } regex_t posix_regexp; - int ret_val = regcomp(&posix_regexp, posix_str, REG_EXTENDED); + int ret_val = regcomp(&posix_regexp, posix_str, REG_EXTENDED | + (nocase ? REG_ICASE : 0)); Free(posix_str); if (ret_val != 0) { char msg[ERRMSG_BUFSIZE]; @@ -1464,42 +1466,17 @@ CHARSTRING regexp(const CHARSTRING& instr, const CHARSTRING& expression, } CHARSTRING regexp(const CHARSTRING& instr, const CHARSTRING& expression, - const INTEGER& groupno) + const INTEGER& groupno, boolean nocase) { groupno.must_bound("The third argument (groupno) of function regexp() is an " "unbound integer value."); - return regexp(instr, expression, (int)groupno); -} - -/* Needed by regexp() */ -UNIVERSAL_CHARSTRING convert_from_pattern_form(char* str, int num) { - if (num % 8 != 0) - TTCN_error("Internal error: Cannot convert string from pattern form."); - - unsigned char c1, c2; - universal_char * const res = new universal_char[num/8]; - unsigned char* ptr = (unsigned char*)res; - int index = 0; - while (index < num) { - for (int j = 0; j < 4; j++) { - c1 = str[index++]; - c2 = str[index++]; - if (c1 >= 'A' && c1 <= 'P' && c2 >= 'A' && c2 <= 'P') { - *(ptr++) = ((c1 - 'A') << 4) | (c2 - 'A'); - } else - TTCN_error("Internal error: Cannot convert string containing illegal " - "character."); - } - } - UNIVERSAL_CHARSTRING retval(num / 8, res); - delete[] res; - return retval; + return regexp(instr, expression, (int)groupno, nocase); } UNIVERSAL_CHARSTRING regexp(const UNIVERSAL_CHARSTRING& instr, const UNIVERSAL_CHARSTRING* expression_val, const UNIVERSAL_CHARSTRING_template* expression_tmpl, - int groupno) + int groupno, boolean nocase) { if ( (expression_val && expression_tmpl) || (!expression_val && !expression_tmpl) ) @@ -1524,7 +1501,7 @@ UNIVERSAL_CHARSTRING regexp(const UNIVERSAL_CHARSTRING& instr, else expression_str = expression_tmpl->get_single_value(); char *posix_str = TTCN_pattern_to_regexp_uni((const char*)expression_str, - &user_groups); + nocase, &user_groups); if (user_groups == 0) { Free(user_groups); Free(posix_str); @@ -1540,12 +1517,12 @@ UNIVERSAL_CHARSTRING regexp(const UNIVERSAL_CHARSTRING& instr, if (TTCN_Logger::log_this_event(TTCN_Logger::DEBUG_UNQUALIFIED)) { TTCN_Logger::begin_event(TTCN_Logger::DEBUG_UNQUALIFIED); TTCN_Logger::log_event_str("regexp(): POSIX ERE equivalent of "); - CHARSTRING_template(STRING_PATTERN, expression_str).log(); + CHARSTRING_template(STRING_PATTERN, expression_str, nocase).log(); TTCN_Logger::log_event_str(" is: "); CHARSTRING(posix_str).log(); TTCN_Logger::end_event(); } - + regex_t posix_regexp; int ret_val = regcomp(&posix_regexp, posix_str, REG_EXTENDED); Free(posix_str); @@ -1588,8 +1565,13 @@ UNIVERSAL_CHARSTRING regexp(const UNIVERSAL_CHARSTRING& instr, char* instr_conv = instr.convert_to_regexp_form(); int instr_len = instr.lengthof() * 8; + + if (nocase) { + unichar_pattern.convert_regex_str_to_lowercase(instr_conv); + } ret_val = regexec(&posix_regexp, instr_conv, nmatch + 1, pmatch, 0); + Free(instr_conv); if (ret_val == 0) { int begin_index = pmatch[nmatch].rm_so, end_index = pmatch[nmatch].rm_eo; Free(pmatch); @@ -1600,12 +1582,8 @@ UNIVERSAL_CHARSTRING regexp(const UNIVERSAL_CHARSTRING& instr, if (begin_index > end_index) TTCN_error("Internal error: The start index " "of the substring (%d) to be returned in function regexp() is greater " "than the end index (%d).", begin_index, end_index); - UNIVERSAL_CHARSTRING res = convert_from_pattern_form( - instr_conv + begin_index, end_index - begin_index); - Free(instr_conv); - return res; + return instr.extract_matched_section(begin_index, end_index); } else { - Free(instr_conv); Free(pmatch); if (ret_val != REG_NOMATCH) { char msg[ERRMSG_BUFSIZE]; @@ -1619,65 +1597,66 @@ UNIVERSAL_CHARSTRING regexp(const UNIVERSAL_CHARSTRING& instr, } UNIVERSAL_CHARSTRING regexp(const UNIVERSAL_CHARSTRING& instr, - const UNIVERSAL_CHARSTRING& expression, int groupno) + const UNIVERSAL_CHARSTRING& expression, int groupno, boolean nocase) { - return regexp(instr, &expression, NULL, groupno); + return regexp(instr, &expression, NULL, groupno, nocase); } UNIVERSAL_CHARSTRING regexp(const UNIVERSAL_CHARSTRING& instr, - const UNIVERSAL_CHARSTRING& expression, const INTEGER& groupno) + const UNIVERSAL_CHARSTRING& expression, const INTEGER& groupno, boolean nocase) { groupno.must_bound("The third argument (groupno) of function regexp() is an " "unbound integer value."); - return regexp(instr, expression, (int)groupno); + return regexp(instr, expression, (int)groupno, nocase); } // regexp() on templates CHARSTRING regexp(const CHARSTRING_template& instr, - const CHARSTRING_template& expression, int groupno) + const CHARSTRING_template& expression, int groupno, boolean nocase) { if (!instr.is_value()) TTCN_error("The first argument of function regexp() is a " "template with non-specific value."); if (expression.is_value()) - return regexp(instr.valueof(), expression.valueof(), groupno); + return regexp(instr.valueof(), expression.valueof(), groupno, nocase); // pattern matching to specific value if (expression.get_selection()==STRING_PATTERN) - return regexp(instr.valueof(), expression.get_single_value(), groupno); + return regexp(instr.valueof(), expression.get_single_value(), groupno, nocase); TTCN_error("The second argument of function regexp() should be " "specific value or pattern matching template."); } CHARSTRING regexp(const CHARSTRING_template& instr, - const CHARSTRING_template& expression, const INTEGER& groupno) + const CHARSTRING_template& expression, const INTEGER& groupno, boolean nocase) { groupno.must_bound("The third argument (groupno) of function regexp() is an " "unbound integer value."); - return regexp(instr, expression, (int)groupno); + return regexp(instr, expression, (int)groupno, nocase); } UNIVERSAL_CHARSTRING regexp(const UNIVERSAL_CHARSTRING_template& instr, - const UNIVERSAL_CHARSTRING_template& expression, int groupno) + const UNIVERSAL_CHARSTRING_template& expression, int groupno, boolean nocase) { if (!instr.is_value()) TTCN_error("The first argument of function regexp() is a " "template with non-specific value."); if (expression.is_value()) - return regexp(instr.valueof(), expression.valueof(), groupno); + return regexp(instr.valueof(), expression.valueof(), groupno, nocase); // pattern matching to specific value if (expression.get_selection()==STRING_PATTERN) - return regexp(instr.valueof(), NULL, &expression, groupno); + return regexp(instr.valueof(), NULL, &expression, groupno, nocase); TTCN_error("The second argument of function regexp() should be " "specific value or pattern matching template."); } UNIVERSAL_CHARSTRING regexp(const UNIVERSAL_CHARSTRING_template& instr, - const UNIVERSAL_CHARSTRING_template& expression, const INTEGER& groupno) + const UNIVERSAL_CHARSTRING_template& expression, const INTEGER& groupno, + boolean nocase) { groupno.must_bound("The third argument (groupno) of function regexp() is an " "unbound integer value."); - return regexp(instr, expression, (int)groupno); + return regexp(instr, expression, (int)groupno, nocase); } // C.34 - substr diff --git a/core/Addfunc.hh b/core/Addfunc.hh index c2a7dc073eaca7ea0fa5c27792bf6808bd294c94..e10d34ba303904e70b1e0863e511a66d4f2bcbbb 100644 --- a/core/Addfunc.hh +++ b/core/Addfunc.hh @@ -173,26 +173,30 @@ extern double str2float(const CHARSTRING& value); // C.33 - regexp extern CHARSTRING regexp(const CHARSTRING& instr, const CHARSTRING& expression, - int groupno); + int groupno, boolean nocase); extern CHARSTRING regexp(const CHARSTRING& instr, const CHARSTRING& expression, - const INTEGER& groupno); + const INTEGER& groupno, boolean nocase); extern UNIVERSAL_CHARSTRING regexp(const UNIVERSAL_CHARSTRING& instr, const UNIVERSAL_CHARSTRING* expression_val, const UNIVERSAL_CHARSTRING_template* expression_tmpl, - int groupno); + int groupno, boolean nocase); extern UNIVERSAL_CHARSTRING regexp(const UNIVERSAL_CHARSTRING& instr, - const UNIVERSAL_CHARSTRING& expression, int groupno); + const UNIVERSAL_CHARSTRING& expression, int groupno, boolean nocase); extern UNIVERSAL_CHARSTRING regexp(const UNIVERSAL_CHARSTRING& instr, - const UNIVERSAL_CHARSTRING& expression, const INTEGER& groupno); + const UNIVERSAL_CHARSTRING& expression, const INTEGER& groupno, + boolean nocase); // regexp on templates extern CHARSTRING regexp(const CHARSTRING_template& instr, - const CHARSTRING_template& expression, int groupno); + const CHARSTRING_template& expression, int groupno, boolean nocase); extern CHARSTRING regexp(const CHARSTRING_template& instr, - const CHARSTRING_template& expression, const INTEGER& groupno); + const CHARSTRING_template& expression, const INTEGER& groupno, + boolean nocase); extern UNIVERSAL_CHARSTRING regexp(const UNIVERSAL_CHARSTRING_template& instr, - const UNIVERSAL_CHARSTRING_template& expression, int groupno); + const UNIVERSAL_CHARSTRING_template& expression, int groupno, + boolean nocase); extern UNIVERSAL_CHARSTRING regexp(const UNIVERSAL_CHARSTRING_template& instr, - const UNIVERSAL_CHARSTRING_template& expression, const INTEGER& groupno); + const UNIVERSAL_CHARSTRING_template& expression, const INTEGER& groupno, + boolean nocase); // C.34 - substr extern void check_substr_arguments(int value_length, int index, diff --git a/core/Charstring.cc b/core/Charstring.cc index 286b4f246ece70cf2c92d03ab9eaa0b107d95ec4..49924ddab0ecd45c3fbf3b7c180c8043cc9356f2 100644 --- a/core/Charstring.cc +++ b/core/Charstring.cc @@ -644,7 +644,8 @@ void CHARSTRING::log() const } } -boolean CHARSTRING::set_param_internal(Module_Param& param, boolean allow_pattern) { +boolean CHARSTRING::set_param_internal(Module_Param& param, boolean allow_pattern, + boolean* is_nocase_pattern) { boolean is_pattern = FALSE; param.basic_check(Module_Param::BC_VALUE|Module_Param::BC_LIST, "charstring value"); Module_Param_Ptr mp = ¶m; @@ -697,7 +698,8 @@ boolean CHARSTRING::set_param_internal(Module_Param& param, boolean allow_patter if (mp->get_expr_type() == Module_Param::EXPR_CONCATENATE) { // only allow string patterns for the first operand CHARSTRING operand1, operand2; - is_pattern = operand1.set_param_internal(*mp->get_operand1(), allow_pattern); + is_pattern = operand1.set_param_internal(*mp->get_operand1(), allow_pattern, + is_nocase_pattern); operand2.set_param(*mp->get_operand2()); if (param.get_operation_type() == Module_Param::OT_CONCAT) { *this = *this + operand1 + operand2; @@ -714,6 +716,9 @@ boolean CHARSTRING::set_param_internal(Module_Param& param, boolean allow_patter if (allow_pattern) { *this = CHARSTRING(mp->get_pattern()); is_pattern = TRUE; + if (is_nocase_pattern != NULL) { + *is_nocase_pattern = mp->get_nocase(); + } break; } // else fall through @@ -2031,6 +2036,7 @@ void CHARSTRING_template::copy_template(const CHARSTRING_template& other_value) switch (other_value.template_selection) { case STRING_PATTERN: pattern_value.regexp_init = FALSE; + pattern_value.nocase = other_value.pattern_value.nocase; /* no break */ case SPECIFIC_VALUE: single_value = other_value.single_value; @@ -2101,13 +2107,15 @@ CHARSTRING_template::CHARSTRING_template(const OPTIONAL<CHARSTRING>& other_value } CHARSTRING_template::CHARSTRING_template(template_sel p_sel, - const CHARSTRING& p_str) + const CHARSTRING& p_str, + boolean p_nocase) : Restricted_Length_Template(STRING_PATTERN), single_value(p_str) { if(p_sel!=STRING_PATTERN) TTCN_error("Internal error: Initializing a charstring pattern template " "with invalid selection."); pattern_value.regexp_init=FALSE; + pattern_value.nocase = p_nocase; } CHARSTRING_template::CHARSTRING_template(const CHARSTRING_template& other_value) @@ -2233,8 +2241,11 @@ boolean CHARSTRING_template::match(const CHARSTRING& other_value, TTCN_Logger::log_event(" is: \"%s\"", posix_str); //TTCN_Logger::end_event(); */ - int ret_val=regcomp(&pattern_value.posix_regexp, posix_str, - REG_EXTENDED|REG_NOSUB); + int flags = REG_EXTENDED|REG_NOSUB; + if (pattern_value.nocase) { + flags |= REG_ICASE; + } + int ret_val=regcomp(&pattern_value.posix_regexp, posix_str, flags); Free(posix_str); if(ret_val!=0) { /* regexp error */ @@ -2463,9 +2474,14 @@ const TTCN_Typedescriptor_t* CHARSTRING_template::get_decmatch_type_descr() cons return dec_match->instance->get_type_descr(); } -void CHARSTRING_template::log_pattern(int n_chars, const char *chars_ptr) +void CHARSTRING_template::log_pattern(int n_chars, const char *chars_ptr, + boolean nocase) { - TTCN_Logger::log_event_str("pattern \""); + TTCN_Logger::log_event_str("pattern "); + if (nocase) { + TTCN_Logger::log_event_str("@nocase "); + } + TTCN_Logger::log_event_str("\""); enum { INITIAL, BACKSLASH, BACKSLASH_Q, QUADRUPLE, HASHMARK, REPETITIONS } state = INITIAL; for (int i = 0; i < n_chars; i++) { @@ -2590,7 +2606,8 @@ void CHARSTRING_template::log() const { switch (template_selection) { case STRING_PATTERN: - log_pattern(single_value.lengthof(), (const char*)single_value); + log_pattern(single_value.lengthof(), (const char*)single_value, + pattern_value.nocase); break; case SPECIFIC_VALUE: single_value.log(); @@ -2698,19 +2715,23 @@ void CHARSTRING_template::set_param(Module_Param& param) { clean_up(); single_value = CHARSTRING(mp->get_pattern()); pattern_value.regexp_init = FALSE; + pattern_value.nocase = mp->get_nocase(); set_selection(STRING_PATTERN); break; case Module_Param::MP_Expression: if (mp->get_expr_type() == Module_Param::EXPR_CONCATENATE) { // only allow string patterns for the first operand CHARSTRING operand1, operand2, result; - boolean is_pattern = operand1.set_param_internal(*mp->get_operand1(), TRUE); + boolean nocase; + boolean is_pattern = operand1.set_param_internal(*mp->get_operand1(), + TRUE, &nocase); operand2.set_param(*mp->get_operand2()); result = operand1 + operand2; if (is_pattern) { clean_up(); single_value = result; pattern_value.regexp_init = FALSE; + pattern_value.nocase = nocase; set_selection(STRING_PATTERN); } else { @@ -2770,7 +2791,7 @@ Module_Param* CHARSTRING_template::get_param(Module_Param_Name& param_name) cons mp = new Module_Param_StringRange(lower_bound, upper_bound); break; } case STRING_PATTERN: - mp = new Module_Param_Pattern(mcopystr(single_value)); + mp = new Module_Param_Pattern(mcopystr(single_value), pattern_value.nocase); break; case DECODE_MATCH: mp->error("Referencing a decoded content matching template is not supported."); @@ -2793,8 +2814,10 @@ void CHARSTRING_template::encode_text(Text_Buf& text_buf) const case ANY_VALUE: case ANY_OR_OMIT: break; - case SPECIFIC_VALUE: case STRING_PATTERN: + text_buf.push_int(pattern_value.nocase); + // no break; + case SPECIFIC_VALUE: single_value.encode_text(text_buf); break; case VALUE_LIST: @@ -2828,6 +2851,7 @@ void CHARSTRING_template::decode_text(Text_Buf& text_buf) break; case STRING_PATTERN: pattern_value.regexp_init=FALSE; + pattern_value.nocase = text_buf.pull_int().get_val(); /* no break */ case SPECIFIC_VALUE: single_value.decode_text(text_buf); diff --git a/core/Charstring.hh b/core/Charstring.hh index a74ae9ea75484d583a788dc1a380b7cec31f7237..90cf64e215d284c1af05c445e2ae743330b48cb5 100644 --- a/core/Charstring.hh +++ b/core/Charstring.hh @@ -106,7 +106,8 @@ class CHARSTRING : public Base_Type { * the second parameter is set (needed by CHARSTRING_template to concatenate * string patterns). * @return TRUE, if the module parameter was a string pattern, otherwise FALSE */ - boolean set_param_internal(Module_Param& param, boolean allow_pattern); + boolean set_param_internal(Module_Param& param, boolean allow_pattern, + boolean* is_nocase_pattern = NULL); public: /** Construct an unbound CHARSTRING object */ @@ -368,12 +369,13 @@ private: mutable struct { boolean regexp_init; regex_t posix_regexp; + boolean nocase; } pattern_value; unichar_decmatch_struct* dec_match; }; void copy_template(const CHARSTRING_template& other_value); - static void log_pattern(int n_chars, const char *chars_ptr); + static void log_pattern(int n_chars, const char *chars_ptr, boolean nocase); public: CHARSTRING_template(); @@ -400,7 +402,7 @@ public: * @param p_sel must be STRING_PATTERN or else Dynamic Testcase Error * @param p_str pattern string */ - CHARSTRING_template(template_sel p_sel, const CHARSTRING& p_str); + CHARSTRING_template(template_sel p_sel, const CHARSTRING& p_str, boolean p_nocase); /// Copy constructor CHARSTRING_template(const CHARSTRING_template& other_value); diff --git a/core/Makefile b/core/Makefile index 138423bf5aba8c94e2c29dc68690e3c07781372c..5466bf80693cec3774f61c76667cc4d10e7fcdec 100644 --- a/core/Makefile +++ b/core/Makefile @@ -160,7 +160,7 @@ PROFMERGE_OBJECTS := ProfMerge_main.o ProfilerTools.profmerge.o \ COMMON_OBJECTS := $(addprefix ../common/, memory.o pattern_la.o pattern_p.o \ config_preproc.o config_preproc_la.o config_preproc_p.tab.o \ path.o pattern_uni.o Quadruple.o NetworkHandler.o Path2.o \ - ModuleVersion.o JSON_Tokenizer.o) + ModuleVersion.o JSON_Tokenizer.o UnicharPattern.o) ifeq ($(DEBUG), yes) COMMON_OBJECTS += ../common/new.o diff --git a/core/Param_Types.cc b/core/Param_Types.cc index 8926f32baa14a1d6e61edee7c71fb33b23f0aa45..0b8a2bfc6b6fc4c2aa9f2e3f5b2528536d0313ca 100644 --- a/core/Param_Types.cc +++ b/core/Param_Types.cc @@ -245,6 +245,11 @@ char* Module_Param::get_pattern() const { return NULL; } +boolean Module_Param::get_nocase() const { + TTCN_error("Internal error: Module_Param::get_nocase()"); + return FALSE; +} + verdicttype Module_Param::get_verdict() const { TTCN_error("Internal error: Module_Param::get_verdict()"); return NONE; @@ -542,7 +547,11 @@ void Module_Param_StringRange::log_value() const { } void Module_Param_Pattern::log_value() const { - TTCN_Logger::log_event_str("pattern \""); + TTCN_Logger::log_event_str("pattern "); + if (nocase) { + TTCN_Logger::log_event_str("@nocase "); + } + TTCN_Logger::log_event_str("\""); TTCN_Logger::log_event_str(pattern); TTCN_Logger::log_event_str("\""); } diff --git a/core/Param_Types.hh b/core/Param_Types.hh index d85ab420294881afc6d7afdc496421183f860cac..b677c3fe257b8527ecb6db45a91e134edf2fa675 100644 --- a/core/Param_Types.hh +++ b/core/Param_Types.hh @@ -281,6 +281,7 @@ public: virtual int_val_t* get_integer() const; virtual double get_float() const; virtual char* get_pattern() const; + virtual boolean get_nocase() const; virtual verdicttype get_verdict() const; virtual char* get_enumerated() const; virtual Module_Param_Ptr get_referenced_param() const; @@ -573,11 +574,13 @@ public: class Module_Param_Pattern : public Module_Param { char* pattern; + boolean nocase; public: type_t get_type() const { return MP_Pattern; } - Module_Param_Pattern(char* p_p): pattern(p_p) {} + Module_Param_Pattern(char* p_p, boolean p_nc): pattern(p_p), nocase(p_nc) {} ~Module_Param_Pattern() { Free(pattern); } char* get_pattern() const { return pattern; } + boolean get_nocase() const { return nocase; } const char* get_type_str() const { return "pattern"; } void log_value() const; }; diff --git a/core/Universal_charstring.cc b/core/Universal_charstring.cc index c8668206e341921a740566a037d63d247b0e18e8..8f25162a8755bc9d63cf23d38a312c5d55efd57a 100644 --- a/core/Universal_charstring.cc +++ b/core/Universal_charstring.cc @@ -27,6 +27,7 @@ #include "../common/memory.h" #include "../common/pattern.hh" #include "../common/Quadruple.hh" +#include "../common/UnicharPattern.hh" #include "Integer.hh" #include "Octetstring.hh" #include "String_struct.hh" @@ -817,6 +818,18 @@ static inline boolean is_printable(const universal_char& uchar) TTCN_Logger::is_printable(uchar.uc_cell); } +UNIVERSAL_CHARSTRING UNIVERSAL_CHARSTRING::extract_matched_section(int start, int end) const +{ + // the indexes refer to the string's regexp form, which contains 8 characters + // for every universal character in the original string + start /= 8; + end /= 8; + if (charstring) { + return UNIVERSAL_CHARSTRING(end - start, cstr.val_ptr->chars_ptr + start); + } + return UNIVERSAL_CHARSTRING(end - start, val_ptr->uchars_ptr + start); +} + CHARSTRING UNIVERSAL_CHARSTRING::get_stringRepr_for_pattern() const { must_bound("Performing pattern conversion operation on an unbound" "universal charstring value."); @@ -949,7 +962,8 @@ UNIVERSAL_CHARSTRING UNIVERSAL_CHARSTRING::from_UTF8_buffer(TTCN_Buffer& p_buff) } } -boolean UNIVERSAL_CHARSTRING::set_param_internal(Module_Param& param, boolean allow_pattern) { +boolean UNIVERSAL_CHARSTRING::set_param_internal(Module_Param& param, boolean allow_pattern, + boolean* is_nocase_pattern) { boolean is_pattern = FALSE; param.basic_check(Module_Param::BC_VALUE|Module_Param::BC_LIST, "universal charstring value"); Module_Param_Ptr mp = ¶m; @@ -994,7 +1008,8 @@ boolean UNIVERSAL_CHARSTRING::set_param_internal(Module_Param& param, boolean al case Module_Param::MP_Expression: if (mp->get_expr_type() == Module_Param::EXPR_CONCATENATE) { UNIVERSAL_CHARSTRING operand1, operand2; - is_pattern = operand1.set_param_internal(*mp->get_operand1(), allow_pattern); + is_pattern = operand1.set_param_internal(*mp->get_operand1(), allow_pattern, + is_nocase_pattern); operand2.set_param(*mp->get_operand2()); if (param.get_operation_type() == Module_Param::OT_CONCAT) { *this = *this + operand1 + operand2; @@ -1011,6 +1026,9 @@ boolean UNIVERSAL_CHARSTRING::set_param_internal(Module_Param& param, boolean al if (allow_pattern) { *this = CHARSTRING(mp->get_pattern()); is_pattern = TRUE; + if (is_nocase_pattern != NULL) { + *is_nocase_pattern = mp->get_nocase(); + } break; } // else fall through @@ -3664,6 +3682,7 @@ void UNIVERSAL_CHARSTRING_template::copy_template case STRING_PATTERN: pattern_string = new CHARSTRING(other_value.single_value); pattern_value.regexp_init=FALSE; + pattern_value.nocase = other_value.pattern_value.nocase; break; case DECODE_MATCH: dec_match = other_value.dec_match; @@ -3706,6 +3725,7 @@ void UNIVERSAL_CHARSTRING_template::copy_template case STRING_PATTERN: pattern_string = new CHARSTRING(*(other_value.pattern_string)); pattern_value.regexp_init=FALSE; + pattern_value.nocase = other_value.pattern_value.nocase; break; case DECODE_MATCH: dec_match = other_value.dec_match; @@ -3802,7 +3822,7 @@ UNIVERSAL_CHARSTRING_template::UNIVERSAL_CHARSTRING_template } UNIVERSAL_CHARSTRING_template::UNIVERSAL_CHARSTRING_template - (template_sel p_sel, const CHARSTRING& p_str) + (template_sel p_sel, const CHARSTRING& p_str, boolean p_nocase) : Restricted_Length_Template(STRING_PATTERN) { if(p_sel!=STRING_PATTERN) @@ -3810,6 +3830,7 @@ UNIVERSAL_CHARSTRING_template::UNIVERSAL_CHARSTRING_template "pattern template with invalid selection."); pattern_string = new CHARSTRING(p_str); pattern_value.regexp_init=FALSE; + pattern_value.nocase = p_nocase; } UNIVERSAL_CHARSTRING_template::~UNIVERSAL_CHARSTRING_template() @@ -3993,7 +4014,8 @@ boolean UNIVERSAL_CHARSTRING_template::match case STRING_PATTERN: { if (!pattern_value.regexp_init) { char *posix_str = - TTCN_pattern_to_regexp_uni((const char*)(*pattern_string)); + TTCN_pattern_to_regexp_uni((const char*)(*pattern_string), + pattern_value.nocase); if(posix_str==NULL) { TTCN_error("Cannot convert pattern \"%s\" to POSIX-equivalent.", (const char*)(*pattern_string)); @@ -4011,6 +4033,9 @@ boolean UNIVERSAL_CHARSTRING_template::match pattern_value.regexp_init=TRUE; } char* other_value_converted = other_value.convert_to_regexp_form(); + if (pattern_value.nocase) { + unichar_pattern.convert_regex_str_to_lowercase(other_value_converted); + } int ret_val=regexec(&pattern_value.posix_regexp, other_value_converted, 0, NULL, 0); Free(other_value_converted); @@ -4237,7 +4262,7 @@ void UNIVERSAL_CHARSTRING_template::log() const switch (template_selection) { case STRING_PATTERN: CHARSTRING_template::log_pattern(pattern_string->lengthof(), - (const char*)*pattern_string); + (const char*)*pattern_string, pattern_value.nocase); break; case SPECIFIC_VALUE: single_value.log(); @@ -4382,12 +4407,15 @@ void UNIVERSAL_CHARSTRING_template::set_param(Module_Param& param) { clean_up(); pattern_string = new CHARSTRING(mp->get_pattern()); pattern_value.regexp_init = FALSE; + pattern_value.nocase = mp->get_nocase(); set_selection(STRING_PATTERN); break; case Module_Param::MP_Expression: if (mp->get_expr_type() == Module_Param::EXPR_CONCATENATE) { UNIVERSAL_CHARSTRING operand1, operand2, result; - boolean is_pattern = operand1.set_param_internal(*mp->get_operand1(), TRUE); + boolean nocase; + boolean is_pattern = operand1.set_param_internal(*mp->get_operand1(), + TRUE, &nocase); operand2.set_param(*mp->get_operand2()); result = operand1 + operand2; if (is_pattern) { @@ -4399,6 +4427,7 @@ void UNIVERSAL_CHARSTRING_template::set_param(Module_Param& param) { pattern_string = new CHARSTRING(result.get_stringRepr_for_pattern()); } pattern_value.regexp_init = FALSE; + pattern_value.nocase = nocase; set_selection(STRING_PATTERN); } else { @@ -4456,7 +4485,7 @@ Module_Param* UNIVERSAL_CHARSTRING_template::get_param(Module_Param_Name& param_ mp = new Module_Param_StringRange(value_range.min_value, value_range.max_value); break; case STRING_PATTERN: - mp = new Module_Param_Pattern(mcopystr(*pattern_string)); + mp = new Module_Param_Pattern(mcopystr(*pattern_string), pattern_value.nocase); break; case DECODE_MATCH: mp->error("Referencing a decoded content matching template is not supported."); @@ -4504,6 +4533,10 @@ void UNIVERSAL_CHARSTRING_template::encode_text(Text_Buf& text_buf) const buf[7] = value_range.max_value.uc_cell; text_buf.push_raw(8, buf); break; } + case STRING_PATTERN: + text_buf.push_int(pattern_value.nocase); + pattern_string->encode_text(text_buf); + break; default: TTCN_error("Text encoder: Encoding an uninitialized/unsupported universal " "charstring template."); @@ -4547,6 +4580,12 @@ void UNIVERSAL_CHARSTRING_template::decode_text(Text_Buf& text_buf) value_range.min_is_set = TRUE; value_range.max_is_set = TRUE; break; } + case STRING_PATTERN: + pattern_value.regexp_init = FALSE; + pattern_value.nocase = text_buf.pull_int().get_val(); + pattern_string = new CHARSTRING; + pattern_string->decode_text(text_buf); + break; default: TTCN_error("Text decoder: An unknown/unsupported selection was " "received for a universal charstring template."); diff --git a/core/Universal_charstring.hh b/core/Universal_charstring.hh index 8a48df6b45a64c64cadf4cce4d97ac17e766f46c..fc1d56882f55a172183295a011c2617ef15c1a25 100644 --- a/core/Universal_charstring.hh +++ b/core/Universal_charstring.hh @@ -80,7 +80,7 @@ class UNIVERSAL_CHARSTRING : public Base_Type { friend UNIVERSAL_CHARSTRING regexp(const UNIVERSAL_CHARSTRING& instr, const UNIVERSAL_CHARSTRING* expression_val, const UNIVERSAL_CHARSTRING_template* expression_tmpl, - int groupno); + int groupno, boolean nocase); friend boolean operator==(const universal_char& uchar_value, const UNIVERSAL_CHARSTRING& other_value); @@ -113,7 +113,8 @@ class UNIVERSAL_CHARSTRING : public Base_Type { * the second parameter is set (needed by UNIVERSAL_CHARSTRING_template to * concatenate string patterns). * @return TRUE, if the module parameter was a string pattern, otherwise FALSE */ - boolean set_param_internal(Module_Param& param, boolean allow_pattern); + boolean set_param_internal(Module_Param& param, boolean allow_pattern, + boolean* is_nocase_pattern = NULL); public: @@ -266,6 +267,8 @@ public: private: // convert this string to character string for pattern matching: ([A-P]{8})* char* convert_to_regexp_form() const; + + UNIVERSAL_CHARSTRING extract_matched_section(int start, int end) const; /* returns the CHARSTRING representation of this. Quadruples are converted into the form: \q{group,plane,row,cell} */ @@ -548,6 +551,7 @@ private: mutable struct { boolean regexp_init; regex_t posix_regexp; + boolean nocase; } pattern_value; unichar_decmatch_struct* dec_match; }; @@ -570,7 +574,8 @@ public: (const CHARSTRING_template& other_value); UNIVERSAL_CHARSTRING_template (const UNIVERSAL_CHARSTRING_template& other_value); - UNIVERSAL_CHARSTRING_template(template_sel p_sel, const CHARSTRING& p_str); + UNIVERSAL_CHARSTRING_template(template_sel p_sel, const CHARSTRING& p_str, + boolean p_nocase); ~UNIVERSAL_CHARSTRING_template(); void clean_up(); diff --git a/core/config_process.l b/core/config_process.l index a0396e971df43aabccb45920e189158761201dbf..bf2acbd460fc7b973cd5ad9bb7b4d86457d39593 100644 --- a/core/config_process.l +++ b/core/config_process.l @@ -566,6 +566,7 @@ permutation return PermutationKeyword; length return LengthKeyword; ifpresent return IfpresentKeyword; infinity return InfinityKeyword; +"@nocase" return NocaseKeyword; } <SC_MODULE_PARAMETERS,SC_LOGGING,SC_PROFILER> diff --git a/core/config_process.y b/core/config_process.y index f9bc7948882e7f8d46b2b5d6a895d162953c93ac..d08b1a45f7d3dec5fc6abee921b79bd27ff5d2db 100644 --- a/core/config_process.y +++ b/core/config_process.y @@ -183,6 +183,7 @@ string_map_t *config_defines; %token LengthKeyword "length" %token IfpresentKeyword "ifpresent" %token InfinityKeyword "infinity" +%token NocaseKeyword "@nocase" %token AssignmentChar ":= or =" %token ConcatChar "&=" %token LogFile "LogFile or FileName" @@ -658,7 +659,11 @@ SimpleParameterValue: } | PatternKeyword PatternChunk { - $$ = new Module_Param_Pattern($2); + $$ = new Module_Param_Pattern($2, FALSE); + } +| PatternKeyword NocaseKeyword PatternChunk + { + $$ = new Module_Param_Pattern($3, TRUE); } | BstringMatch { diff --git a/etc/CaseFolding.txt b/etc/CaseFolding.txt new file mode 100644 index 0000000000000000000000000000000000000000..5c811a889e16170af528b5fa94392a1715775468 --- /dev/null +++ b/etc/CaseFolding.txt @@ -0,0 +1,1495 @@ +# CaseFolding-9.0.0.txt +# Date: 2016-03-02, 18:54:54 GMT +# © 2016 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see http://www.unicode.org/reports/tr44/ +# +# Case Folding Properties +# +# This file is a supplement to the UnicodeData file. +# It provides a case folding mapping generated from the Unicode Character Database. +# If all characters are mapped according to the full mapping below, then +# case differences (according to UnicodeData.txt and SpecialCasing.txt) +# are eliminated. +# +# The data supports both implementations that require simple case foldings +# (where string lengths don't change), and implementations that allow full case folding +# (where string lengths may grow). Note that where they can be supported, the +# full case foldings are superior: for example, they allow "MASSE" and "Maße" to match. +# +# All code points not listed in this file map to themselves. +# +# NOTE: case folding does not preserve normalization formats! +# +# For information on case folding, including how to have case folding +# preserve normalization formats, see Section 3.13 Default Case Algorithms in +# The Unicode Standard. +# +# ================================================================================ +# Format +# ================================================================================ +# The entries in this file are in the following machine-readable format: +# +# <code>; <status>; <mapping>; # <name> +# +# The status field is: +# C: common case folding, common mappings shared by both simple and full mappings. +# F: full case folding, mappings that cause strings to grow in length. Multiple characters are separated by spaces. +# S: simple case folding, mappings to single characters where different from F. +# T: special case for uppercase I and dotted uppercase I +# - For non-Turkic languages, this mapping is normally not used. +# - For Turkic languages (tr, az), this mapping can be used instead of the normal mapping for these characters. +# Note that the Turkic mappings do not maintain canonical equivalence without additional processing. +# See the discussions of case mapping in the Unicode Standard for more information. +# +# Usage: +# A. To do a simple case folding, use the mappings with status C + S. +# B. To do a full case folding, use the mappings with status C + F. +# +# The mappings with status T can be used or omitted depending on the desired case-folding +# behavior. (The default option is to exclude them.) +# +# ================================================================= + +# Property: Case_Folding + +# All code points not explicitly listed for Case_Folding +# have the value C for the status field, and the code point itself for the mapping field. + +# ================================================================= +0041; C; 0061; # LATIN CAPITAL LETTER A +0042; C; 0062; # LATIN CAPITAL LETTER B +0043; C; 0063; # LATIN CAPITAL LETTER C +0044; C; 0064; # LATIN CAPITAL LETTER D +0045; C; 0065; # LATIN CAPITAL LETTER E +0046; C; 0066; # LATIN CAPITAL LETTER F +0047; C; 0067; # LATIN CAPITAL LETTER G +0048; C; 0068; # LATIN CAPITAL LETTER H +0049; C; 0069; # LATIN CAPITAL LETTER I +0049; T; 0131; # LATIN CAPITAL LETTER I +004A; C; 006A; # LATIN CAPITAL LETTER J +004B; C; 006B; # LATIN CAPITAL LETTER K +004C; C; 006C; # LATIN CAPITAL LETTER L +004D; C; 006D; # LATIN CAPITAL LETTER M +004E; C; 006E; # LATIN CAPITAL LETTER N +004F; C; 006F; # LATIN CAPITAL LETTER O +0050; C; 0070; # LATIN CAPITAL LETTER P +0051; C; 0071; # LATIN CAPITAL LETTER Q +0052; C; 0072; # LATIN CAPITAL LETTER R +0053; C; 0073; # LATIN CAPITAL LETTER S +0054; C; 0074; # LATIN CAPITAL LETTER T +0055; C; 0075; # LATIN CAPITAL LETTER U +0056; C; 0076; # LATIN CAPITAL LETTER V +0057; C; 0077; # LATIN CAPITAL LETTER W +0058; C; 0078; # LATIN CAPITAL LETTER X +0059; C; 0079; # LATIN CAPITAL LETTER Y +005A; C; 007A; # LATIN CAPITAL LETTER Z +00B5; C; 03BC; # MICRO SIGN +00C0; C; 00E0; # LATIN CAPITAL LETTER A WITH GRAVE +00C1; C; 00E1; # LATIN CAPITAL LETTER A WITH ACUTE +00C2; C; 00E2; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +00C3; C; 00E3; # LATIN CAPITAL LETTER A WITH TILDE +00C4; C; 00E4; # LATIN CAPITAL LETTER A WITH DIAERESIS +00C5; C; 00E5; # LATIN CAPITAL LETTER A WITH RING ABOVE +00C6; C; 00E6; # LATIN CAPITAL LETTER AE +00C7; C; 00E7; # LATIN CAPITAL LETTER C WITH CEDILLA +00C8; C; 00E8; # LATIN CAPITAL LETTER E WITH GRAVE +00C9; C; 00E9; # LATIN CAPITAL LETTER E WITH ACUTE +00CA; C; 00EA; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX +00CB; C; 00EB; # LATIN CAPITAL LETTER E WITH DIAERESIS +00CC; C; 00EC; # LATIN CAPITAL LETTER I WITH GRAVE +00CD; C; 00ED; # LATIN CAPITAL LETTER I WITH ACUTE +00CE; C; 00EE; # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +00CF; C; 00EF; # LATIN CAPITAL LETTER I WITH DIAERESIS +00D0; C; 00F0; # LATIN CAPITAL LETTER ETH +00D1; C; 00F1; # LATIN CAPITAL LETTER N WITH TILDE +00D2; C; 00F2; # LATIN CAPITAL LETTER O WITH GRAVE +00D3; C; 00F3; # LATIN CAPITAL LETTER O WITH ACUTE +00D4; C; 00F4; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +00D5; C; 00F5; # LATIN CAPITAL LETTER O WITH TILDE +00D6; C; 00F6; # LATIN CAPITAL LETTER O WITH DIAERESIS +00D8; C; 00F8; # LATIN CAPITAL LETTER O WITH STROKE +00D9; C; 00F9; # LATIN CAPITAL LETTER U WITH GRAVE +00DA; C; 00FA; # LATIN CAPITAL LETTER U WITH ACUTE +00DB; C; 00FB; # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +00DC; C; 00FC; # LATIN CAPITAL LETTER U WITH DIAERESIS +00DD; C; 00FD; # LATIN CAPITAL LETTER Y WITH ACUTE +00DE; C; 00FE; # LATIN CAPITAL LETTER THORN +00DF; F; 0073 0073; # LATIN SMALL LETTER SHARP S +0100; C; 0101; # LATIN CAPITAL LETTER A WITH MACRON +0102; C; 0103; # LATIN CAPITAL LETTER A WITH BREVE +0104; C; 0105; # LATIN CAPITAL LETTER A WITH OGONEK +0106; C; 0107; # LATIN CAPITAL LETTER C WITH ACUTE +0108; C; 0109; # LATIN CAPITAL LETTER C WITH CIRCUMFLEX +010A; C; 010B; # LATIN CAPITAL LETTER C WITH DOT ABOVE +010C; C; 010D; # LATIN CAPITAL LETTER C WITH CARON +010E; C; 010F; # LATIN CAPITAL LETTER D WITH CARON +0110; C; 0111; # LATIN CAPITAL LETTER D WITH STROKE +0112; C; 0113; # LATIN CAPITAL LETTER E WITH MACRON +0114; C; 0115; # LATIN CAPITAL LETTER E WITH BREVE +0116; C; 0117; # LATIN CAPITAL LETTER E WITH DOT ABOVE +0118; C; 0119; # LATIN CAPITAL LETTER E WITH OGONEK +011A; C; 011B; # LATIN CAPITAL LETTER E WITH CARON +011C; C; 011D; # LATIN CAPITAL LETTER G WITH CIRCUMFLEX +011E; C; 011F; # LATIN CAPITAL LETTER G WITH BREVE +0120; C; 0121; # LATIN CAPITAL LETTER G WITH DOT ABOVE +0122; C; 0123; # LATIN CAPITAL LETTER G WITH CEDILLA +0124; C; 0125; # LATIN CAPITAL LETTER H WITH CIRCUMFLEX +0126; C; 0127; # LATIN CAPITAL LETTER H WITH STROKE +0128; C; 0129; # LATIN CAPITAL LETTER I WITH TILDE +012A; C; 012B; # LATIN CAPITAL LETTER I WITH MACRON +012C; C; 012D; # LATIN CAPITAL LETTER I WITH BREVE +012E; C; 012F; # LATIN CAPITAL LETTER I WITH OGONEK +0130; F; 0069 0307; # LATIN CAPITAL LETTER I WITH DOT ABOVE +0130; T; 0069; # LATIN CAPITAL LETTER I WITH DOT ABOVE +0132; C; 0133; # LATIN CAPITAL LIGATURE IJ +0134; C; 0135; # LATIN CAPITAL LETTER J WITH CIRCUMFLEX +0136; C; 0137; # LATIN CAPITAL LETTER K WITH CEDILLA +0139; C; 013A; # LATIN CAPITAL LETTER L WITH ACUTE +013B; C; 013C; # LATIN CAPITAL LETTER L WITH CEDILLA +013D; C; 013E; # LATIN CAPITAL LETTER L WITH CARON +013F; C; 0140; # LATIN CAPITAL LETTER L WITH MIDDLE DOT +0141; C; 0142; # LATIN CAPITAL LETTER L WITH STROKE +0143; C; 0144; # LATIN CAPITAL LETTER N WITH ACUTE +0145; C; 0146; # LATIN CAPITAL LETTER N WITH CEDILLA +0147; C; 0148; # LATIN CAPITAL LETTER N WITH CARON +0149; F; 02BC 006E; # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +014A; C; 014B; # LATIN CAPITAL LETTER ENG +014C; C; 014D; # LATIN CAPITAL LETTER O WITH MACRON +014E; C; 014F; # LATIN CAPITAL LETTER O WITH BREVE +0150; C; 0151; # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +0152; C; 0153; # LATIN CAPITAL LIGATURE OE +0154; C; 0155; # LATIN CAPITAL LETTER R WITH ACUTE +0156; C; 0157; # LATIN CAPITAL LETTER R WITH CEDILLA +0158; C; 0159; # LATIN CAPITAL LETTER R WITH CARON +015A; C; 015B; # LATIN CAPITAL LETTER S WITH ACUTE +015C; C; 015D; # LATIN CAPITAL LETTER S WITH CIRCUMFLEX +015E; C; 015F; # LATIN CAPITAL LETTER S WITH CEDILLA +0160; C; 0161; # LATIN CAPITAL LETTER S WITH CARON +0162; C; 0163; # LATIN CAPITAL LETTER T WITH CEDILLA +0164; C; 0165; # LATIN CAPITAL LETTER T WITH CARON +0166; C; 0167; # LATIN CAPITAL LETTER T WITH STROKE +0168; C; 0169; # LATIN CAPITAL LETTER U WITH TILDE +016A; C; 016B; # LATIN CAPITAL LETTER U WITH MACRON +016C; C; 016D; # LATIN CAPITAL LETTER U WITH BREVE +016E; C; 016F; # LATIN CAPITAL LETTER U WITH RING ABOVE +0170; C; 0171; # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +0172; C; 0173; # LATIN CAPITAL LETTER U WITH OGONEK +0174; C; 0175; # LATIN CAPITAL LETTER W WITH CIRCUMFLEX +0176; C; 0177; # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +0178; C; 00FF; # LATIN CAPITAL LETTER Y WITH DIAERESIS +0179; C; 017A; # LATIN CAPITAL LETTER Z WITH ACUTE +017B; C; 017C; # LATIN CAPITAL LETTER Z WITH DOT ABOVE +017D; C; 017E; # LATIN CAPITAL LETTER Z WITH CARON +017F; C; 0073; # LATIN SMALL LETTER LONG S +0181; C; 0253; # LATIN CAPITAL LETTER B WITH HOOK +0182; C; 0183; # LATIN CAPITAL LETTER B WITH TOPBAR +0184; C; 0185; # LATIN CAPITAL LETTER TONE SIX +0186; C; 0254; # LATIN CAPITAL LETTER OPEN O +0187; C; 0188; # LATIN CAPITAL LETTER C WITH HOOK +0189; C; 0256; # LATIN CAPITAL LETTER AFRICAN D +018A; C; 0257; # LATIN CAPITAL LETTER D WITH HOOK +018B; C; 018C; # LATIN CAPITAL LETTER D WITH TOPBAR +018E; C; 01DD; # LATIN CAPITAL LETTER REVERSED E +018F; C; 0259; # LATIN CAPITAL LETTER SCHWA +0190; C; 025B; # LATIN CAPITAL LETTER OPEN E +0191; C; 0192; # LATIN CAPITAL LETTER F WITH HOOK +0193; C; 0260; # LATIN CAPITAL LETTER G WITH HOOK +0194; C; 0263; # LATIN CAPITAL LETTER GAMMA +0196; C; 0269; # LATIN CAPITAL LETTER IOTA +0197; C; 0268; # LATIN CAPITAL LETTER I WITH STROKE +0198; C; 0199; # LATIN CAPITAL LETTER K WITH HOOK +019C; C; 026F; # LATIN CAPITAL LETTER TURNED M +019D; C; 0272; # LATIN CAPITAL LETTER N WITH LEFT HOOK +019F; C; 0275; # LATIN CAPITAL LETTER O WITH MIDDLE TILDE +01A0; C; 01A1; # LATIN CAPITAL LETTER O WITH HORN +01A2; C; 01A3; # LATIN CAPITAL LETTER OI +01A4; C; 01A5; # LATIN CAPITAL LETTER P WITH HOOK +01A6; C; 0280; # LATIN LETTER YR +01A7; C; 01A8; # LATIN CAPITAL LETTER TONE TWO +01A9; C; 0283; # LATIN CAPITAL LETTER ESH +01AC; C; 01AD; # LATIN CAPITAL LETTER T WITH HOOK +01AE; C; 0288; # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK +01AF; C; 01B0; # LATIN CAPITAL LETTER U WITH HORN +01B1; C; 028A; # LATIN CAPITAL LETTER UPSILON +01B2; C; 028B; # LATIN CAPITAL LETTER V WITH HOOK +01B3; C; 01B4; # LATIN CAPITAL LETTER Y WITH HOOK +01B5; C; 01B6; # LATIN CAPITAL LETTER Z WITH STROKE +01B7; C; 0292; # LATIN CAPITAL LETTER EZH +01B8; C; 01B9; # LATIN CAPITAL LETTER EZH REVERSED +01BC; C; 01BD; # LATIN CAPITAL LETTER TONE FIVE +01C4; C; 01C6; # LATIN CAPITAL LETTER DZ WITH CARON +01C5; C; 01C6; # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON +01C7; C; 01C9; # LATIN CAPITAL LETTER LJ +01C8; C; 01C9; # LATIN CAPITAL LETTER L WITH SMALL LETTER J +01CA; C; 01CC; # LATIN CAPITAL LETTER NJ +01CB; C; 01CC; # LATIN CAPITAL LETTER N WITH SMALL LETTER J +01CD; C; 01CE; # LATIN CAPITAL LETTER A WITH CARON +01CF; C; 01D0; # LATIN CAPITAL LETTER I WITH CARON +01D1; C; 01D2; # LATIN CAPITAL LETTER O WITH CARON +01D3; C; 01D4; # LATIN CAPITAL LETTER U WITH CARON +01D5; C; 01D6; # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +01D7; C; 01D8; # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE +01D9; C; 01DA; # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON +01DB; C; 01DC; # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE +01DE; C; 01DF; # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON +01E0; C; 01E1; # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON +01E2; C; 01E3; # LATIN CAPITAL LETTER AE WITH MACRON +01E4; C; 01E5; # LATIN CAPITAL LETTER G WITH STROKE +01E6; C; 01E7; # LATIN CAPITAL LETTER G WITH CARON +01E8; C; 01E9; # LATIN CAPITAL LETTER K WITH CARON +01EA; C; 01EB; # LATIN CAPITAL LETTER O WITH OGONEK +01EC; C; 01ED; # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON +01EE; C; 01EF; # LATIN CAPITAL LETTER EZH WITH CARON +01F0; F; 006A 030C; # LATIN SMALL LETTER J WITH CARON +01F1; C; 01F3; # LATIN CAPITAL LETTER DZ +01F2; C; 01F3; # LATIN CAPITAL LETTER D WITH SMALL LETTER Z +01F4; C; 01F5; # LATIN CAPITAL LETTER G WITH ACUTE +01F6; C; 0195; # LATIN CAPITAL LETTER HWAIR +01F7; C; 01BF; # LATIN CAPITAL LETTER WYNN +01F8; C; 01F9; # LATIN CAPITAL LETTER N WITH GRAVE +01FA; C; 01FB; # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE +01FC; C; 01FD; # LATIN CAPITAL LETTER AE WITH ACUTE +01FE; C; 01FF; # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE +0200; C; 0201; # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE +0202; C; 0203; # LATIN CAPITAL LETTER A WITH INVERTED BREVE +0204; C; 0205; # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE +0206; C; 0207; # LATIN CAPITAL LETTER E WITH INVERTED BREVE +0208; C; 0209; # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE +020A; C; 020B; # LATIN CAPITAL LETTER I WITH INVERTED BREVE +020C; C; 020D; # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE +020E; C; 020F; # LATIN CAPITAL LETTER O WITH INVERTED BREVE +0210; C; 0211; # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE +0212; C; 0213; # LATIN CAPITAL LETTER R WITH INVERTED BREVE +0214; C; 0215; # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE +0216; C; 0217; # LATIN CAPITAL LETTER U WITH INVERTED BREVE +0218; C; 0219; # LATIN CAPITAL LETTER S WITH COMMA BELOW +021A; C; 021B; # LATIN CAPITAL LETTER T WITH COMMA BELOW +021C; C; 021D; # LATIN CAPITAL LETTER YOGH +021E; C; 021F; # LATIN CAPITAL LETTER H WITH CARON +0220; C; 019E; # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG +0222; C; 0223; # LATIN CAPITAL LETTER OU +0224; C; 0225; # LATIN CAPITAL LETTER Z WITH HOOK +0226; C; 0227; # LATIN CAPITAL LETTER A WITH DOT ABOVE +0228; C; 0229; # LATIN CAPITAL LETTER E WITH CEDILLA +022A; C; 022B; # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON +022C; C; 022D; # LATIN CAPITAL LETTER O WITH TILDE AND MACRON +022E; C; 022F; # LATIN CAPITAL LETTER O WITH DOT ABOVE +0230; C; 0231; # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON +0232; C; 0233; # LATIN CAPITAL LETTER Y WITH MACRON +023A; C; 2C65; # LATIN CAPITAL LETTER A WITH STROKE +023B; C; 023C; # LATIN CAPITAL LETTER C WITH STROKE +023D; C; 019A; # LATIN CAPITAL LETTER L WITH BAR +023E; C; 2C66; # LATIN CAPITAL LETTER T WITH DIAGONAL STROKE +0241; C; 0242; # LATIN CAPITAL LETTER GLOTTAL STOP +0243; C; 0180; # LATIN CAPITAL LETTER B WITH STROKE +0244; C; 0289; # LATIN CAPITAL LETTER U BAR +0245; C; 028C; # LATIN CAPITAL LETTER TURNED V +0246; C; 0247; # LATIN CAPITAL LETTER E WITH STROKE +0248; C; 0249; # LATIN CAPITAL LETTER J WITH STROKE +024A; C; 024B; # LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL +024C; C; 024D; # LATIN CAPITAL LETTER R WITH STROKE +024E; C; 024F; # LATIN CAPITAL LETTER Y WITH STROKE +0345; C; 03B9; # COMBINING GREEK YPOGEGRAMMENI +0370; C; 0371; # GREEK CAPITAL LETTER HETA +0372; C; 0373; # GREEK CAPITAL LETTER ARCHAIC SAMPI +0376; C; 0377; # GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA +037F; C; 03F3; # GREEK CAPITAL LETTER YOT +0386; C; 03AC; # GREEK CAPITAL LETTER ALPHA WITH TONOS +0388; C; 03AD; # GREEK CAPITAL LETTER EPSILON WITH TONOS +0389; C; 03AE; # GREEK CAPITAL LETTER ETA WITH TONOS +038A; C; 03AF; # GREEK CAPITAL LETTER IOTA WITH TONOS +038C; C; 03CC; # GREEK CAPITAL LETTER OMICRON WITH TONOS +038E; C; 03CD; # GREEK CAPITAL LETTER UPSILON WITH TONOS +038F; C; 03CE; # GREEK CAPITAL LETTER OMEGA WITH TONOS +0390; F; 03B9 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +0391; C; 03B1; # GREEK CAPITAL LETTER ALPHA +0392; C; 03B2; # GREEK CAPITAL LETTER BETA +0393; C; 03B3; # GREEK CAPITAL LETTER GAMMA +0394; C; 03B4; # GREEK CAPITAL LETTER DELTA +0395; C; 03B5; # GREEK CAPITAL LETTER EPSILON +0396; C; 03B6; # GREEK CAPITAL LETTER ZETA +0397; C; 03B7; # GREEK CAPITAL LETTER ETA +0398; C; 03B8; # GREEK CAPITAL LETTER THETA +0399; C; 03B9; # GREEK CAPITAL LETTER IOTA +039A; C; 03BA; # GREEK CAPITAL LETTER KAPPA +039B; C; 03BB; # GREEK CAPITAL LETTER LAMDA +039C; C; 03BC; # GREEK CAPITAL LETTER MU +039D; C; 03BD; # GREEK CAPITAL LETTER NU +039E; C; 03BE; # GREEK CAPITAL LETTER XI +039F; C; 03BF; # GREEK CAPITAL LETTER OMICRON +03A0; C; 03C0; # GREEK CAPITAL LETTER PI +03A1; C; 03C1; # GREEK CAPITAL LETTER RHO +03A3; C; 03C3; # GREEK CAPITAL LETTER SIGMA +03A4; C; 03C4; # GREEK CAPITAL LETTER TAU +03A5; C; 03C5; # GREEK CAPITAL LETTER UPSILON +03A6; C; 03C6; # GREEK CAPITAL LETTER PHI +03A7; C; 03C7; # GREEK CAPITAL LETTER CHI +03A8; C; 03C8; # GREEK CAPITAL LETTER PSI +03A9; C; 03C9; # GREEK CAPITAL LETTER OMEGA +03AA; C; 03CA; # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +03AB; C; 03CB; # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +03B0; F; 03C5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +03C2; C; 03C3; # GREEK SMALL LETTER FINAL SIGMA +03CF; C; 03D7; # GREEK CAPITAL KAI SYMBOL +03D0; C; 03B2; # GREEK BETA SYMBOL +03D1; C; 03B8; # GREEK THETA SYMBOL +03D5; C; 03C6; # GREEK PHI SYMBOL +03D6; C; 03C0; # GREEK PI SYMBOL +03D8; C; 03D9; # GREEK LETTER ARCHAIC KOPPA +03DA; C; 03DB; # GREEK LETTER STIGMA +03DC; C; 03DD; # GREEK LETTER DIGAMMA +03DE; C; 03DF; # GREEK LETTER KOPPA +03E0; C; 03E1; # GREEK LETTER SAMPI +03E2; C; 03E3; # COPTIC CAPITAL LETTER SHEI +03E4; C; 03E5; # COPTIC CAPITAL LETTER FEI +03E6; C; 03E7; # COPTIC CAPITAL LETTER KHEI +03E8; C; 03E9; # COPTIC CAPITAL LETTER HORI +03EA; C; 03EB; # COPTIC CAPITAL LETTER GANGIA +03EC; C; 03ED; # COPTIC CAPITAL LETTER SHIMA +03EE; C; 03EF; # COPTIC CAPITAL LETTER DEI +03F0; C; 03BA; # GREEK KAPPA SYMBOL +03F1; C; 03C1; # GREEK RHO SYMBOL +03F4; C; 03B8; # GREEK CAPITAL THETA SYMBOL +03F5; C; 03B5; # GREEK LUNATE EPSILON SYMBOL +03F7; C; 03F8; # GREEK CAPITAL LETTER SHO +03F9; C; 03F2; # GREEK CAPITAL LUNATE SIGMA SYMBOL +03FA; C; 03FB; # GREEK CAPITAL LETTER SAN +03FD; C; 037B; # GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL +03FE; C; 037C; # GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL +03FF; C; 037D; # GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL +0400; C; 0450; # CYRILLIC CAPITAL LETTER IE WITH GRAVE +0401; C; 0451; # CYRILLIC CAPITAL LETTER IO +0402; C; 0452; # CYRILLIC CAPITAL LETTER DJE +0403; C; 0453; # CYRILLIC CAPITAL LETTER GJE +0404; C; 0454; # CYRILLIC CAPITAL LETTER UKRAINIAN IE +0405; C; 0455; # CYRILLIC CAPITAL LETTER DZE +0406; C; 0456; # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +0407; C; 0457; # CYRILLIC CAPITAL LETTER YI +0408; C; 0458; # CYRILLIC CAPITAL LETTER JE +0409; C; 0459; # CYRILLIC CAPITAL LETTER LJE +040A; C; 045A; # CYRILLIC CAPITAL LETTER NJE +040B; C; 045B; # CYRILLIC CAPITAL LETTER TSHE +040C; C; 045C; # CYRILLIC CAPITAL LETTER KJE +040D; C; 045D; # CYRILLIC CAPITAL LETTER I WITH GRAVE +040E; C; 045E; # CYRILLIC CAPITAL LETTER SHORT U +040F; C; 045F; # CYRILLIC CAPITAL LETTER DZHE +0410; C; 0430; # CYRILLIC CAPITAL LETTER A +0411; C; 0431; # CYRILLIC CAPITAL LETTER BE +0412; C; 0432; # CYRILLIC CAPITAL LETTER VE +0413; C; 0433; # CYRILLIC CAPITAL LETTER GHE +0414; C; 0434; # CYRILLIC CAPITAL LETTER DE +0415; C; 0435; # CYRILLIC CAPITAL LETTER IE +0416; C; 0436; # CYRILLIC CAPITAL LETTER ZHE +0417; C; 0437; # CYRILLIC CAPITAL LETTER ZE +0418; C; 0438; # CYRILLIC CAPITAL LETTER I +0419; C; 0439; # CYRILLIC CAPITAL LETTER SHORT I +041A; C; 043A; # CYRILLIC CAPITAL LETTER KA +041B; C; 043B; # CYRILLIC CAPITAL LETTER EL +041C; C; 043C; # CYRILLIC CAPITAL LETTER EM +041D; C; 043D; # CYRILLIC CAPITAL LETTER EN +041E; C; 043E; # CYRILLIC CAPITAL LETTER O +041F; C; 043F; # CYRILLIC CAPITAL LETTER PE +0420; C; 0440; # CYRILLIC CAPITAL LETTER ER +0421; C; 0441; # CYRILLIC CAPITAL LETTER ES +0422; C; 0442; # CYRILLIC CAPITAL LETTER TE +0423; C; 0443; # CYRILLIC CAPITAL LETTER U +0424; C; 0444; # CYRILLIC CAPITAL LETTER EF +0425; C; 0445; # CYRILLIC CAPITAL LETTER HA +0426; C; 0446; # CYRILLIC CAPITAL LETTER TSE +0427; C; 0447; # CYRILLIC CAPITAL LETTER CHE +0428; C; 0448; # CYRILLIC CAPITAL LETTER SHA +0429; C; 0449; # CYRILLIC CAPITAL LETTER SHCHA +042A; C; 044A; # CYRILLIC CAPITAL LETTER HARD SIGN +042B; C; 044B; # CYRILLIC CAPITAL LETTER YERU +042C; C; 044C; # CYRILLIC CAPITAL LETTER SOFT SIGN +042D; C; 044D; # CYRILLIC CAPITAL LETTER E +042E; C; 044E; # CYRILLIC CAPITAL LETTER YU +042F; C; 044F; # CYRILLIC CAPITAL LETTER YA +0460; C; 0461; # CYRILLIC CAPITAL LETTER OMEGA +0462; C; 0463; # CYRILLIC CAPITAL LETTER YAT +0464; C; 0465; # CYRILLIC CAPITAL LETTER IOTIFIED E +0466; C; 0467; # CYRILLIC CAPITAL LETTER LITTLE YUS +0468; C; 0469; # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS +046A; C; 046B; # CYRILLIC CAPITAL LETTER BIG YUS +046C; C; 046D; # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS +046E; C; 046F; # CYRILLIC CAPITAL LETTER KSI +0470; C; 0471; # CYRILLIC CAPITAL LETTER PSI +0472; C; 0473; # CYRILLIC CAPITAL LETTER FITA +0474; C; 0475; # CYRILLIC CAPITAL LETTER IZHITSA +0476; C; 0477; # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +0478; C; 0479; # CYRILLIC CAPITAL LETTER UK +047A; C; 047B; # CYRILLIC CAPITAL LETTER ROUND OMEGA +047C; C; 047D; # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO +047E; C; 047F; # CYRILLIC CAPITAL LETTER OT +0480; C; 0481; # CYRILLIC CAPITAL LETTER KOPPA +048A; C; 048B; # CYRILLIC CAPITAL LETTER SHORT I WITH TAIL +048C; C; 048D; # CYRILLIC CAPITAL LETTER SEMISOFT SIGN +048E; C; 048F; # CYRILLIC CAPITAL LETTER ER WITH TICK +0490; C; 0491; # CYRILLIC CAPITAL LETTER GHE WITH UPTURN +0492; C; 0493; # CYRILLIC CAPITAL LETTER GHE WITH STROKE +0494; C; 0495; # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK +0496; C; 0497; # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER +0498; C; 0499; # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER +049A; C; 049B; # CYRILLIC CAPITAL LETTER KA WITH DESCENDER +049C; C; 049D; # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE +049E; C; 049F; # CYRILLIC CAPITAL LETTER KA WITH STROKE +04A0; C; 04A1; # CYRILLIC CAPITAL LETTER BASHKIR KA +04A2; C; 04A3; # CYRILLIC CAPITAL LETTER EN WITH DESCENDER +04A4; C; 04A5; # CYRILLIC CAPITAL LIGATURE EN GHE +04A6; C; 04A7; # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK +04A8; C; 04A9; # CYRILLIC CAPITAL LETTER ABKHASIAN HA +04AA; C; 04AB; # CYRILLIC CAPITAL LETTER ES WITH DESCENDER +04AC; C; 04AD; # CYRILLIC CAPITAL LETTER TE WITH DESCENDER +04AE; C; 04AF; # CYRILLIC CAPITAL LETTER STRAIGHT U +04B0; C; 04B1; # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE +04B2; C; 04B3; # CYRILLIC CAPITAL LETTER HA WITH DESCENDER +04B4; C; 04B5; # CYRILLIC CAPITAL LIGATURE TE TSE +04B6; C; 04B7; # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER +04B8; C; 04B9; # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE +04BA; C; 04BB; # CYRILLIC CAPITAL LETTER SHHA +04BC; C; 04BD; # CYRILLIC CAPITAL LETTER ABKHASIAN CHE +04BE; C; 04BF; # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER +04C0; C; 04CF; # CYRILLIC LETTER PALOCHKA +04C1; C; 04C2; # CYRILLIC CAPITAL LETTER ZHE WITH BREVE +04C3; C; 04C4; # CYRILLIC CAPITAL LETTER KA WITH HOOK +04C5; C; 04C6; # CYRILLIC CAPITAL LETTER EL WITH TAIL +04C7; C; 04C8; # CYRILLIC CAPITAL LETTER EN WITH HOOK +04C9; C; 04CA; # CYRILLIC CAPITAL LETTER EN WITH TAIL +04CB; C; 04CC; # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE +04CD; C; 04CE; # CYRILLIC CAPITAL LETTER EM WITH TAIL +04D0; C; 04D1; # CYRILLIC CAPITAL LETTER A WITH BREVE +04D2; C; 04D3; # CYRILLIC CAPITAL LETTER A WITH DIAERESIS +04D4; C; 04D5; # CYRILLIC CAPITAL LIGATURE A IE +04D6; C; 04D7; # CYRILLIC CAPITAL LETTER IE WITH BREVE +04D8; C; 04D9; # CYRILLIC CAPITAL LETTER SCHWA +04DA; C; 04DB; # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS +04DC; C; 04DD; # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS +04DE; C; 04DF; # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS +04E0; C; 04E1; # CYRILLIC CAPITAL LETTER ABKHASIAN DZE +04E2; C; 04E3; # CYRILLIC CAPITAL LETTER I WITH MACRON +04E4; C; 04E5; # CYRILLIC CAPITAL LETTER I WITH DIAERESIS +04E6; C; 04E7; # CYRILLIC CAPITAL LETTER O WITH DIAERESIS +04E8; C; 04E9; # CYRILLIC CAPITAL LETTER BARRED O +04EA; C; 04EB; # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS +04EC; C; 04ED; # CYRILLIC CAPITAL LETTER E WITH DIAERESIS +04EE; C; 04EF; # CYRILLIC CAPITAL LETTER U WITH MACRON +04F0; C; 04F1; # CYRILLIC CAPITAL LETTER U WITH DIAERESIS +04F2; C; 04F3; # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE +04F4; C; 04F5; # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS +04F6; C; 04F7; # CYRILLIC CAPITAL LETTER GHE WITH DESCENDER +04F8; C; 04F9; # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS +04FA; C; 04FB; # CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK +04FC; C; 04FD; # CYRILLIC CAPITAL LETTER HA WITH HOOK +04FE; C; 04FF; # CYRILLIC CAPITAL LETTER HA WITH STROKE +0500; C; 0501; # CYRILLIC CAPITAL LETTER KOMI DE +0502; C; 0503; # CYRILLIC CAPITAL LETTER KOMI DJE +0504; C; 0505; # CYRILLIC CAPITAL LETTER KOMI ZJE +0506; C; 0507; # CYRILLIC CAPITAL LETTER KOMI DZJE +0508; C; 0509; # CYRILLIC CAPITAL LETTER KOMI LJE +050A; C; 050B; # CYRILLIC CAPITAL LETTER KOMI NJE +050C; C; 050D; # CYRILLIC CAPITAL LETTER KOMI SJE +050E; C; 050F; # CYRILLIC CAPITAL LETTER KOMI TJE +0510; C; 0511; # CYRILLIC CAPITAL LETTER REVERSED ZE +0512; C; 0513; # CYRILLIC CAPITAL LETTER EL WITH HOOK +0514; C; 0515; # CYRILLIC CAPITAL LETTER LHA +0516; C; 0517; # CYRILLIC CAPITAL LETTER RHA +0518; C; 0519; # CYRILLIC CAPITAL LETTER YAE +051A; C; 051B; # CYRILLIC CAPITAL LETTER QA +051C; C; 051D; # CYRILLIC CAPITAL LETTER WE +051E; C; 051F; # CYRILLIC CAPITAL LETTER ALEUT KA +0520; C; 0521; # CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK +0522; C; 0523; # CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK +0524; C; 0525; # CYRILLIC CAPITAL LETTER PE WITH DESCENDER +0526; C; 0527; # CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER +0528; C; 0529; # CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK +052A; C; 052B; # CYRILLIC CAPITAL LETTER DZZHE +052C; C; 052D; # CYRILLIC CAPITAL LETTER DCHE +052E; C; 052F; # CYRILLIC CAPITAL LETTER EL WITH DESCENDER +0531; C; 0561; # ARMENIAN CAPITAL LETTER AYB +0532; C; 0562; # ARMENIAN CAPITAL LETTER BEN +0533; C; 0563; # ARMENIAN CAPITAL LETTER GIM +0534; C; 0564; # ARMENIAN CAPITAL LETTER DA +0535; C; 0565; # ARMENIAN CAPITAL LETTER ECH +0536; C; 0566; # ARMENIAN CAPITAL LETTER ZA +0537; C; 0567; # ARMENIAN CAPITAL LETTER EH +0538; C; 0568; # ARMENIAN CAPITAL LETTER ET +0539; C; 0569; # ARMENIAN CAPITAL LETTER TO +053A; C; 056A; # ARMENIAN CAPITAL LETTER ZHE +053B; C; 056B; # ARMENIAN CAPITAL LETTER INI +053C; C; 056C; # ARMENIAN CAPITAL LETTER LIWN +053D; C; 056D; # ARMENIAN CAPITAL LETTER XEH +053E; C; 056E; # ARMENIAN CAPITAL LETTER CA +053F; C; 056F; # ARMENIAN CAPITAL LETTER KEN +0540; C; 0570; # ARMENIAN CAPITAL LETTER HO +0541; C; 0571; # ARMENIAN CAPITAL LETTER JA +0542; C; 0572; # ARMENIAN CAPITAL LETTER GHAD +0543; C; 0573; # ARMENIAN CAPITAL LETTER CHEH +0544; C; 0574; # ARMENIAN CAPITAL LETTER MEN +0545; C; 0575; # ARMENIAN CAPITAL LETTER YI +0546; C; 0576; # ARMENIAN CAPITAL LETTER NOW +0547; C; 0577; # ARMENIAN CAPITAL LETTER SHA +0548; C; 0578; # ARMENIAN CAPITAL LETTER VO +0549; C; 0579; # ARMENIAN CAPITAL LETTER CHA +054A; C; 057A; # ARMENIAN CAPITAL LETTER PEH +054B; C; 057B; # ARMENIAN CAPITAL LETTER JHEH +054C; C; 057C; # ARMENIAN CAPITAL LETTER RA +054D; C; 057D; # ARMENIAN CAPITAL LETTER SEH +054E; C; 057E; # ARMENIAN CAPITAL LETTER VEW +054F; C; 057F; # ARMENIAN CAPITAL LETTER TIWN +0550; C; 0580; # ARMENIAN CAPITAL LETTER REH +0551; C; 0581; # ARMENIAN CAPITAL LETTER CO +0552; C; 0582; # ARMENIAN CAPITAL LETTER YIWN +0553; C; 0583; # ARMENIAN CAPITAL LETTER PIWR +0554; C; 0584; # ARMENIAN CAPITAL LETTER KEH +0555; C; 0585; # ARMENIAN CAPITAL LETTER OH +0556; C; 0586; # ARMENIAN CAPITAL LETTER FEH +0587; F; 0565 0582; # ARMENIAN SMALL LIGATURE ECH YIWN +10A0; C; 2D00; # GEORGIAN CAPITAL LETTER AN +10A1; C; 2D01; # GEORGIAN CAPITAL LETTER BAN +10A2; C; 2D02; # GEORGIAN CAPITAL LETTER GAN +10A3; C; 2D03; # GEORGIAN CAPITAL LETTER DON +10A4; C; 2D04; # GEORGIAN CAPITAL LETTER EN +10A5; C; 2D05; # GEORGIAN CAPITAL LETTER VIN +10A6; C; 2D06; # GEORGIAN CAPITAL LETTER ZEN +10A7; C; 2D07; # GEORGIAN CAPITAL LETTER TAN +10A8; C; 2D08; # GEORGIAN CAPITAL LETTER IN +10A9; C; 2D09; # GEORGIAN CAPITAL LETTER KAN +10AA; C; 2D0A; # GEORGIAN CAPITAL LETTER LAS +10AB; C; 2D0B; # GEORGIAN CAPITAL LETTER MAN +10AC; C; 2D0C; # GEORGIAN CAPITAL LETTER NAR +10AD; C; 2D0D; # GEORGIAN CAPITAL LETTER ON +10AE; C; 2D0E; # GEORGIAN CAPITAL LETTER PAR +10AF; C; 2D0F; # GEORGIAN CAPITAL LETTER ZHAR +10B0; C; 2D10; # GEORGIAN CAPITAL LETTER RAE +10B1; C; 2D11; # GEORGIAN CAPITAL LETTER SAN +10B2; C; 2D12; # GEORGIAN CAPITAL LETTER TAR +10B3; C; 2D13; # GEORGIAN CAPITAL LETTER UN +10B4; C; 2D14; # GEORGIAN CAPITAL LETTER PHAR +10B5; C; 2D15; # GEORGIAN CAPITAL LETTER KHAR +10B6; C; 2D16; # GEORGIAN CAPITAL LETTER GHAN +10B7; C; 2D17; # GEORGIAN CAPITAL LETTER QAR +10B8; C; 2D18; # GEORGIAN CAPITAL LETTER SHIN +10B9; C; 2D19; # GEORGIAN CAPITAL LETTER CHIN +10BA; C; 2D1A; # GEORGIAN CAPITAL LETTER CAN +10BB; C; 2D1B; # GEORGIAN CAPITAL LETTER JIL +10BC; C; 2D1C; # GEORGIAN CAPITAL LETTER CIL +10BD; C; 2D1D; # GEORGIAN CAPITAL LETTER CHAR +10BE; C; 2D1E; # GEORGIAN CAPITAL LETTER XAN +10BF; C; 2D1F; # GEORGIAN CAPITAL LETTER JHAN +10C0; C; 2D20; # GEORGIAN CAPITAL LETTER HAE +10C1; C; 2D21; # GEORGIAN CAPITAL LETTER HE +10C2; C; 2D22; # GEORGIAN CAPITAL LETTER HIE +10C3; C; 2D23; # GEORGIAN CAPITAL LETTER WE +10C4; C; 2D24; # GEORGIAN CAPITAL LETTER HAR +10C5; C; 2D25; # GEORGIAN CAPITAL LETTER HOE +10C7; C; 2D27; # GEORGIAN CAPITAL LETTER YN +10CD; C; 2D2D; # GEORGIAN CAPITAL LETTER AEN +13F8; C; 13F0; # CHEROKEE SMALL LETTER YE +13F9; C; 13F1; # CHEROKEE SMALL LETTER YI +13FA; C; 13F2; # CHEROKEE SMALL LETTER YO +13FB; C; 13F3; # CHEROKEE SMALL LETTER YU +13FC; C; 13F4; # CHEROKEE SMALL LETTER YV +13FD; C; 13F5; # CHEROKEE SMALL LETTER MV +1C80; C; 0432; # CYRILLIC SMALL LETTER ROUNDED VE +1C81; C; 0434; # CYRILLIC SMALL LETTER LONG-LEGGED DE +1C82; C; 043E; # CYRILLIC SMALL LETTER NARROW O +1C83; C; 0441; # CYRILLIC SMALL LETTER WIDE ES +1C84; C; 0442; # CYRILLIC SMALL LETTER TALL TE +1C85; C; 0442; # CYRILLIC SMALL LETTER THREE-LEGGED TE +1C86; C; 044A; # CYRILLIC SMALL LETTER TALL HARD SIGN +1C87; C; 0463; # CYRILLIC SMALL LETTER TALL YAT +1C88; C; A64B; # CYRILLIC SMALL LETTER UNBLENDED UK +1E00; C; 1E01; # LATIN CAPITAL LETTER A WITH RING BELOW +1E02; C; 1E03; # LATIN CAPITAL LETTER B WITH DOT ABOVE +1E04; C; 1E05; # LATIN CAPITAL LETTER B WITH DOT BELOW +1E06; C; 1E07; # LATIN CAPITAL LETTER B WITH LINE BELOW +1E08; C; 1E09; # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE +1E0A; C; 1E0B; # LATIN CAPITAL LETTER D WITH DOT ABOVE +1E0C; C; 1E0D; # LATIN CAPITAL LETTER D WITH DOT BELOW +1E0E; C; 1E0F; # LATIN CAPITAL LETTER D WITH LINE BELOW +1E10; C; 1E11; # LATIN CAPITAL LETTER D WITH CEDILLA +1E12; C; 1E13; # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW +1E14; C; 1E15; # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE +1E16; C; 1E17; # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE +1E18; C; 1E19; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW +1E1A; C; 1E1B; # LATIN CAPITAL LETTER E WITH TILDE BELOW +1E1C; C; 1E1D; # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE +1E1E; C; 1E1F; # LATIN CAPITAL LETTER F WITH DOT ABOVE +1E20; C; 1E21; # LATIN CAPITAL LETTER G WITH MACRON +1E22; C; 1E23; # LATIN CAPITAL LETTER H WITH DOT ABOVE +1E24; C; 1E25; # LATIN CAPITAL LETTER H WITH DOT BELOW +1E26; C; 1E27; # LATIN CAPITAL LETTER H WITH DIAERESIS +1E28; C; 1E29; # LATIN CAPITAL LETTER H WITH CEDILLA +1E2A; C; 1E2B; # LATIN CAPITAL LETTER H WITH BREVE BELOW +1E2C; C; 1E2D; # LATIN CAPITAL LETTER I WITH TILDE BELOW +1E2E; C; 1E2F; # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE +1E30; C; 1E31; # LATIN CAPITAL LETTER K WITH ACUTE +1E32; C; 1E33; # LATIN CAPITAL LETTER K WITH DOT BELOW +1E34; C; 1E35; # LATIN CAPITAL LETTER K WITH LINE BELOW +1E36; C; 1E37; # LATIN CAPITAL LETTER L WITH DOT BELOW +1E38; C; 1E39; # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON +1E3A; C; 1E3B; # LATIN CAPITAL LETTER L WITH LINE BELOW +1E3C; C; 1E3D; # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW +1E3E; C; 1E3F; # LATIN CAPITAL LETTER M WITH ACUTE +1E40; C; 1E41; # LATIN CAPITAL LETTER M WITH DOT ABOVE +1E42; C; 1E43; # LATIN CAPITAL LETTER M WITH DOT BELOW +1E44; C; 1E45; # LATIN CAPITAL LETTER N WITH DOT ABOVE +1E46; C; 1E47; # LATIN CAPITAL LETTER N WITH DOT BELOW +1E48; C; 1E49; # LATIN CAPITAL LETTER N WITH LINE BELOW +1E4A; C; 1E4B; # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW +1E4C; C; 1E4D; # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE +1E4E; C; 1E4F; # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS +1E50; C; 1E51; # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE +1E52; C; 1E53; # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE +1E54; C; 1E55; # LATIN CAPITAL LETTER P WITH ACUTE +1E56; C; 1E57; # LATIN CAPITAL LETTER P WITH DOT ABOVE +1E58; C; 1E59; # LATIN CAPITAL LETTER R WITH DOT ABOVE +1E5A; C; 1E5B; # LATIN CAPITAL LETTER R WITH DOT BELOW +1E5C; C; 1E5D; # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON +1E5E; C; 1E5F; # LATIN CAPITAL LETTER R WITH LINE BELOW +1E60; C; 1E61; # LATIN CAPITAL LETTER S WITH DOT ABOVE +1E62; C; 1E63; # LATIN CAPITAL LETTER S WITH DOT BELOW +1E64; C; 1E65; # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE +1E66; C; 1E67; # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE +1E68; C; 1E69; # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE +1E6A; C; 1E6B; # LATIN CAPITAL LETTER T WITH DOT ABOVE +1E6C; C; 1E6D; # LATIN CAPITAL LETTER T WITH DOT BELOW +1E6E; C; 1E6F; # LATIN CAPITAL LETTER T WITH LINE BELOW +1E70; C; 1E71; # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW +1E72; C; 1E73; # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW +1E74; C; 1E75; # LATIN CAPITAL LETTER U WITH TILDE BELOW +1E76; C; 1E77; # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW +1E78; C; 1E79; # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE +1E7A; C; 1E7B; # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS +1E7C; C; 1E7D; # LATIN CAPITAL LETTER V WITH TILDE +1E7E; C; 1E7F; # LATIN CAPITAL LETTER V WITH DOT BELOW +1E80; C; 1E81; # LATIN CAPITAL LETTER W WITH GRAVE +1E82; C; 1E83; # LATIN CAPITAL LETTER W WITH ACUTE +1E84; C; 1E85; # LATIN CAPITAL LETTER W WITH DIAERESIS +1E86; C; 1E87; # LATIN CAPITAL LETTER W WITH DOT ABOVE +1E88; C; 1E89; # LATIN CAPITAL LETTER W WITH DOT BELOW +1E8A; C; 1E8B; # LATIN CAPITAL LETTER X WITH DOT ABOVE +1E8C; C; 1E8D; # LATIN CAPITAL LETTER X WITH DIAERESIS +1E8E; C; 1E8F; # LATIN CAPITAL LETTER Y WITH DOT ABOVE +1E90; C; 1E91; # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX +1E92; C; 1E93; # LATIN CAPITAL LETTER Z WITH DOT BELOW +1E94; C; 1E95; # LATIN CAPITAL LETTER Z WITH LINE BELOW +1E96; F; 0068 0331; # LATIN SMALL LETTER H WITH LINE BELOW +1E97; F; 0074 0308; # LATIN SMALL LETTER T WITH DIAERESIS +1E98; F; 0077 030A; # LATIN SMALL LETTER W WITH RING ABOVE +1E99; F; 0079 030A; # LATIN SMALL LETTER Y WITH RING ABOVE +1E9A; F; 0061 02BE; # LATIN SMALL LETTER A WITH RIGHT HALF RING +1E9B; C; 1E61; # LATIN SMALL LETTER LONG S WITH DOT ABOVE +1E9E; F; 0073 0073; # LATIN CAPITAL LETTER SHARP S +1E9E; S; 00DF; # LATIN CAPITAL LETTER SHARP S +1EA0; C; 1EA1; # LATIN CAPITAL LETTER A WITH DOT BELOW +1EA2; C; 1EA3; # LATIN CAPITAL LETTER A WITH HOOK ABOVE +1EA4; C; 1EA5; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE +1EA6; C; 1EA7; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE +1EA8; C; 1EA9; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +1EAA; C; 1EAB; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE +1EAC; C; 1EAD; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW +1EAE; C; 1EAF; # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE +1EB0; C; 1EB1; # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE +1EB2; C; 1EB3; # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE +1EB4; C; 1EB5; # LATIN CAPITAL LETTER A WITH BREVE AND TILDE +1EB6; C; 1EB7; # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW +1EB8; C; 1EB9; # LATIN CAPITAL LETTER E WITH DOT BELOW +1EBA; C; 1EBB; # LATIN CAPITAL LETTER E WITH HOOK ABOVE +1EBC; C; 1EBD; # LATIN CAPITAL LETTER E WITH TILDE +1EBE; C; 1EBF; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE +1EC0; C; 1EC1; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE +1EC2; C; 1EC3; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +1EC4; C; 1EC5; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE +1EC6; C; 1EC7; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW +1EC8; C; 1EC9; # LATIN CAPITAL LETTER I WITH HOOK ABOVE +1ECA; C; 1ECB; # LATIN CAPITAL LETTER I WITH DOT BELOW +1ECC; C; 1ECD; # LATIN CAPITAL LETTER O WITH DOT BELOW +1ECE; C; 1ECF; # LATIN CAPITAL LETTER O WITH HOOK ABOVE +1ED0; C; 1ED1; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE +1ED2; C; 1ED3; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE +1ED4; C; 1ED5; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +1ED6; C; 1ED7; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE +1ED8; C; 1ED9; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW +1EDA; C; 1EDB; # LATIN CAPITAL LETTER O WITH HORN AND ACUTE +1EDC; C; 1EDD; # LATIN CAPITAL LETTER O WITH HORN AND GRAVE +1EDE; C; 1EDF; # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE +1EE0; C; 1EE1; # LATIN CAPITAL LETTER O WITH HORN AND TILDE +1EE2; C; 1EE3; # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW +1EE4; C; 1EE5; # LATIN CAPITAL LETTER U WITH DOT BELOW +1EE6; C; 1EE7; # LATIN CAPITAL LETTER U WITH HOOK ABOVE +1EE8; C; 1EE9; # LATIN CAPITAL LETTER U WITH HORN AND ACUTE +1EEA; C; 1EEB; # LATIN CAPITAL LETTER U WITH HORN AND GRAVE +1EEC; C; 1EED; # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE +1EEE; C; 1EEF; # LATIN CAPITAL LETTER U WITH HORN AND TILDE +1EF0; C; 1EF1; # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW +1EF2; C; 1EF3; # LATIN CAPITAL LETTER Y WITH GRAVE +1EF4; C; 1EF5; # LATIN CAPITAL LETTER Y WITH DOT BELOW +1EF6; C; 1EF7; # LATIN CAPITAL LETTER Y WITH HOOK ABOVE +1EF8; C; 1EF9; # LATIN CAPITAL LETTER Y WITH TILDE +1EFA; C; 1EFB; # LATIN CAPITAL LETTER MIDDLE-WELSH LL +1EFC; C; 1EFD; # LATIN CAPITAL LETTER MIDDLE-WELSH V +1EFE; C; 1EFF; # LATIN CAPITAL LETTER Y WITH LOOP +1F08; C; 1F00; # GREEK CAPITAL LETTER ALPHA WITH PSILI +1F09; C; 1F01; # GREEK CAPITAL LETTER ALPHA WITH DASIA +1F0A; C; 1F02; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA +1F0B; C; 1F03; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA +1F0C; C; 1F04; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA +1F0D; C; 1F05; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA +1F0E; C; 1F06; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI +1F0F; C; 1F07; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI +1F18; C; 1F10; # GREEK CAPITAL LETTER EPSILON WITH PSILI +1F19; C; 1F11; # GREEK CAPITAL LETTER EPSILON WITH DASIA +1F1A; C; 1F12; # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA +1F1B; C; 1F13; # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA +1F1C; C; 1F14; # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA +1F1D; C; 1F15; # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F28; C; 1F20; # GREEK CAPITAL LETTER ETA WITH PSILI +1F29; C; 1F21; # GREEK CAPITAL LETTER ETA WITH DASIA +1F2A; C; 1F22; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA +1F2B; C; 1F23; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA +1F2C; C; 1F24; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA +1F2D; C; 1F25; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA +1F2E; C; 1F26; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI +1F2F; C; 1F27; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI +1F38; C; 1F30; # GREEK CAPITAL LETTER IOTA WITH PSILI +1F39; C; 1F31; # GREEK CAPITAL LETTER IOTA WITH DASIA +1F3A; C; 1F32; # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA +1F3B; C; 1F33; # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA +1F3C; C; 1F34; # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA +1F3D; C; 1F35; # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA +1F3E; C; 1F36; # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI +1F3F; C; 1F37; # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI +1F48; C; 1F40; # GREEK CAPITAL LETTER OMICRON WITH PSILI +1F49; C; 1F41; # GREEK CAPITAL LETTER OMICRON WITH DASIA +1F4A; C; 1F42; # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA +1F4B; C; 1F43; # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA +1F4C; C; 1F44; # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA +1F4D; C; 1F45; # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50; F; 03C5 0313; # GREEK SMALL LETTER UPSILON WITH PSILI +1F52; F; 03C5 0313 0300; # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA +1F54; F; 03C5 0313 0301; # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA +1F56; F; 03C5 0313 0342; # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI +1F59; C; 1F51; # GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B; C; 1F53; # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D; C; 1F55; # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F; C; 1F57; # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F68; C; 1F60; # GREEK CAPITAL LETTER OMEGA WITH PSILI +1F69; C; 1F61; # GREEK CAPITAL LETTER OMEGA WITH DASIA +1F6A; C; 1F62; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA +1F6B; C; 1F63; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA +1F6C; C; 1F64; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA +1F6D; C; 1F65; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA +1F6E; C; 1F66; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI +1F6F; C; 1F67; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI +1F80; F; 1F00 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI +1F81; F; 1F01 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI +1F82; F; 1F02 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F83; F; 1F03 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F84; F; 1F04 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F85; F; 1F05 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F86; F; 1F06 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F87; F; 1F07 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F88; F; 1F00 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +1F88; S; 1F80; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +1F89; F; 1F01 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +1F89; S; 1F81; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +1F8A; F; 1F02 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F8A; S; 1F82; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F8B; F; 1F03 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F8B; S; 1F83; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F8C; F; 1F04 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F8C; S; 1F84; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F8D; F; 1F05 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F8D; S; 1F85; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F8E; F; 1F06 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F8E; S; 1F86; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F8F; F; 1F07 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F8F; S; 1F87; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F90; F; 1F20 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI +1F91; F; 1F21 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI +1F92; F; 1F22 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F93; F; 1F23 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F94; F; 1F24 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F95; F; 1F25 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F96; F; 1F26 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F97; F; 1F27 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F98; F; 1F20 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +1F98; S; 1F90; # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +1F99; F; 1F21 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +1F99; S; 1F91; # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +1F9A; F; 1F22 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F9A; S; 1F92; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F9B; F; 1F23 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F9B; S; 1F93; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F9C; F; 1F24 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F9C; S; 1F94; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F9D; F; 1F25 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F9D; S; 1F95; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F9E; F; 1F26 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F9E; S; 1F96; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F9F; F; 1F27 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F9F; S; 1F97; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FA0; F; 1F60 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI +1FA1; F; 1F61 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI +1FA2; F; 1F62 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1FA3; F; 1F63 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1FA4; F; 1F64 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1FA5; F; 1F65 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1FA6; F; 1F66 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1FA7; F; 1F67 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1FA8; F; 1F60 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +1FA8; S; 1FA0; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +1FA9; F; 1F61 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +1FA9; S; 1FA1; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +1FAA; F; 1F62 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1FAA; S; 1FA2; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1FAB; F; 1F63 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1FAB; S; 1FA3; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1FAC; F; 1F64 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1FAC; S; 1FA4; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1FAD; F; 1F65 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1FAD; S; 1FA5; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1FAE; F; 1F66 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1FAE; S; 1FA6; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1FAF; F; 1F67 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FAF; S; 1FA7; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FB2; F; 1F70 03B9; # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI +1FB3; F; 03B1 03B9; # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI +1FB4; F; 03AC 03B9; # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6; F; 03B1 0342; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI +1FB7; F; 03B1 0342 03B9; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI +1FB8; C; 1FB0; # GREEK CAPITAL LETTER ALPHA WITH VRACHY +1FB9; C; 1FB1; # GREEK CAPITAL LETTER ALPHA WITH MACRON +1FBA; C; 1F70; # GREEK CAPITAL LETTER ALPHA WITH VARIA +1FBB; C; 1F71; # GREEK CAPITAL LETTER ALPHA WITH OXIA +1FBC; F; 03B1 03B9; # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBC; S; 1FB3; # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBE; C; 03B9; # GREEK PROSGEGRAMMENI +1FC2; F; 1F74 03B9; # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI +1FC3; F; 03B7 03B9; # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI +1FC4; F; 03AE 03B9; # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6; F; 03B7 0342; # GREEK SMALL LETTER ETA WITH PERISPOMENI +1FC7; F; 03B7 0342 03B9; # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI +1FC8; C; 1F72; # GREEK CAPITAL LETTER EPSILON WITH VARIA +1FC9; C; 1F73; # GREEK CAPITAL LETTER EPSILON WITH OXIA +1FCA; C; 1F74; # GREEK CAPITAL LETTER ETA WITH VARIA +1FCB; C; 1F75; # GREEK CAPITAL LETTER ETA WITH OXIA +1FCC; F; 03B7 03B9; # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FCC; S; 1FC3; # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FD2; F; 03B9 0308 0300; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA +1FD3; F; 03B9 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6; F; 03B9 0342; # GREEK SMALL LETTER IOTA WITH PERISPOMENI +1FD7; F; 03B9 0308 0342; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI +1FD8; C; 1FD0; # GREEK CAPITAL LETTER IOTA WITH VRACHY +1FD9; C; 1FD1; # GREEK CAPITAL LETTER IOTA WITH MACRON +1FDA; C; 1F76; # GREEK CAPITAL LETTER IOTA WITH VARIA +1FDB; C; 1F77; # GREEK CAPITAL LETTER IOTA WITH OXIA +1FE2; F; 03C5 0308 0300; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA +1FE3; F; 03C5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA +1FE4; F; 03C1 0313; # GREEK SMALL LETTER RHO WITH PSILI +1FE6; F; 03C5 0342; # GREEK SMALL LETTER UPSILON WITH PERISPOMENI +1FE7; F; 03C5 0308 0342; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI +1FE8; C; 1FE0; # GREEK CAPITAL LETTER UPSILON WITH VRACHY +1FE9; C; 1FE1; # GREEK CAPITAL LETTER UPSILON WITH MACRON +1FEA; C; 1F7A; # GREEK CAPITAL LETTER UPSILON WITH VARIA +1FEB; C; 1F7B; # GREEK CAPITAL LETTER UPSILON WITH OXIA +1FEC; C; 1FE5; # GREEK CAPITAL LETTER RHO WITH DASIA +1FF2; F; 1F7C 03B9; # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI +1FF3; F; 03C9 03B9; # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI +1FF4; F; 03CE 03B9; # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6; F; 03C9 0342; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI +1FF7; F; 03C9 0342 03B9; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI +1FF8; C; 1F78; # GREEK CAPITAL LETTER OMICRON WITH VARIA +1FF9; C; 1F79; # GREEK CAPITAL LETTER OMICRON WITH OXIA +1FFA; C; 1F7C; # GREEK CAPITAL LETTER OMEGA WITH VARIA +1FFB; C; 1F7D; # GREEK CAPITAL LETTER OMEGA WITH OXIA +1FFC; F; 03C9 03B9; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +1FFC; S; 1FF3; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +2126; C; 03C9; # OHM SIGN +212A; C; 006B; # KELVIN SIGN +212B; C; 00E5; # ANGSTROM SIGN +2132; C; 214E; # TURNED CAPITAL F +2160; C; 2170; # ROMAN NUMERAL ONE +2161; C; 2171; # ROMAN NUMERAL TWO +2162; C; 2172; # ROMAN NUMERAL THREE +2163; C; 2173; # ROMAN NUMERAL FOUR +2164; C; 2174; # ROMAN NUMERAL FIVE +2165; C; 2175; # ROMAN NUMERAL SIX +2166; C; 2176; # ROMAN NUMERAL SEVEN +2167; C; 2177; # ROMAN NUMERAL EIGHT +2168; C; 2178; # ROMAN NUMERAL NINE +2169; C; 2179; # ROMAN NUMERAL TEN +216A; C; 217A; # ROMAN NUMERAL ELEVEN +216B; C; 217B; # ROMAN NUMERAL TWELVE +216C; C; 217C; # ROMAN NUMERAL FIFTY +216D; C; 217D; # ROMAN NUMERAL ONE HUNDRED +216E; C; 217E; # ROMAN NUMERAL FIVE HUNDRED +216F; C; 217F; # ROMAN NUMERAL ONE THOUSAND +2183; C; 2184; # ROMAN NUMERAL REVERSED ONE HUNDRED +24B6; C; 24D0; # CIRCLED LATIN CAPITAL LETTER A +24B7; C; 24D1; # CIRCLED LATIN CAPITAL LETTER B +24B8; C; 24D2; # CIRCLED LATIN CAPITAL LETTER C +24B9; C; 24D3; # CIRCLED LATIN CAPITAL LETTER D +24BA; C; 24D4; # CIRCLED LATIN CAPITAL LETTER E +24BB; C; 24D5; # CIRCLED LATIN CAPITAL LETTER F +24BC; C; 24D6; # CIRCLED LATIN CAPITAL LETTER G +24BD; C; 24D7; # CIRCLED LATIN CAPITAL LETTER H +24BE; C; 24D8; # CIRCLED LATIN CAPITAL LETTER I +24BF; C; 24D9; # CIRCLED LATIN CAPITAL LETTER J +24C0; C; 24DA; # CIRCLED LATIN CAPITAL LETTER K +24C1; C; 24DB; # CIRCLED LATIN CAPITAL LETTER L +24C2; C; 24DC; # CIRCLED LATIN CAPITAL LETTER M +24C3; C; 24DD; # CIRCLED LATIN CAPITAL LETTER N +24C4; C; 24DE; # CIRCLED LATIN CAPITAL LETTER O +24C5; C; 24DF; # CIRCLED LATIN CAPITAL LETTER P +24C6; C; 24E0; # CIRCLED LATIN CAPITAL LETTER Q +24C7; C; 24E1; # CIRCLED LATIN CAPITAL LETTER R +24C8; C; 24E2; # CIRCLED LATIN CAPITAL LETTER S +24C9; C; 24E3; # CIRCLED LATIN CAPITAL LETTER T +24CA; C; 24E4; # CIRCLED LATIN CAPITAL LETTER U +24CB; C; 24E5; # CIRCLED LATIN CAPITAL LETTER V +24CC; C; 24E6; # CIRCLED LATIN CAPITAL LETTER W +24CD; C; 24E7; # CIRCLED LATIN CAPITAL LETTER X +24CE; C; 24E8; # CIRCLED LATIN CAPITAL LETTER Y +24CF; C; 24E9; # CIRCLED LATIN CAPITAL LETTER Z +2C00; C; 2C30; # GLAGOLITIC CAPITAL LETTER AZU +2C01; C; 2C31; # GLAGOLITIC CAPITAL LETTER BUKY +2C02; C; 2C32; # GLAGOLITIC CAPITAL LETTER VEDE +2C03; C; 2C33; # GLAGOLITIC CAPITAL LETTER GLAGOLI +2C04; C; 2C34; # GLAGOLITIC CAPITAL LETTER DOBRO +2C05; C; 2C35; # GLAGOLITIC CAPITAL LETTER YESTU +2C06; C; 2C36; # GLAGOLITIC CAPITAL LETTER ZHIVETE +2C07; C; 2C37; # GLAGOLITIC CAPITAL LETTER DZELO +2C08; C; 2C38; # GLAGOLITIC CAPITAL LETTER ZEMLJA +2C09; C; 2C39; # GLAGOLITIC CAPITAL LETTER IZHE +2C0A; C; 2C3A; # GLAGOLITIC CAPITAL LETTER INITIAL IZHE +2C0B; C; 2C3B; # GLAGOLITIC CAPITAL LETTER I +2C0C; C; 2C3C; # GLAGOLITIC CAPITAL LETTER DJERVI +2C0D; C; 2C3D; # GLAGOLITIC CAPITAL LETTER KAKO +2C0E; C; 2C3E; # GLAGOLITIC CAPITAL LETTER LJUDIJE +2C0F; C; 2C3F; # GLAGOLITIC CAPITAL LETTER MYSLITE +2C10; C; 2C40; # GLAGOLITIC CAPITAL LETTER NASHI +2C11; C; 2C41; # GLAGOLITIC CAPITAL LETTER ONU +2C12; C; 2C42; # GLAGOLITIC CAPITAL LETTER POKOJI +2C13; C; 2C43; # GLAGOLITIC CAPITAL LETTER RITSI +2C14; C; 2C44; # GLAGOLITIC CAPITAL LETTER SLOVO +2C15; C; 2C45; # GLAGOLITIC CAPITAL LETTER TVRIDO +2C16; C; 2C46; # GLAGOLITIC CAPITAL LETTER UKU +2C17; C; 2C47; # GLAGOLITIC CAPITAL LETTER FRITU +2C18; C; 2C48; # GLAGOLITIC CAPITAL LETTER HERU +2C19; C; 2C49; # GLAGOLITIC CAPITAL LETTER OTU +2C1A; C; 2C4A; # GLAGOLITIC CAPITAL LETTER PE +2C1B; C; 2C4B; # GLAGOLITIC CAPITAL LETTER SHTA +2C1C; C; 2C4C; # GLAGOLITIC CAPITAL LETTER TSI +2C1D; C; 2C4D; # GLAGOLITIC CAPITAL LETTER CHRIVI +2C1E; C; 2C4E; # GLAGOLITIC CAPITAL LETTER SHA +2C1F; C; 2C4F; # GLAGOLITIC CAPITAL LETTER YERU +2C20; C; 2C50; # GLAGOLITIC CAPITAL LETTER YERI +2C21; C; 2C51; # GLAGOLITIC CAPITAL LETTER YATI +2C22; C; 2C52; # GLAGOLITIC CAPITAL LETTER SPIDERY HA +2C23; C; 2C53; # GLAGOLITIC CAPITAL LETTER YU +2C24; C; 2C54; # GLAGOLITIC CAPITAL LETTER SMALL YUS +2C25; C; 2C55; # GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL +2C26; C; 2C56; # GLAGOLITIC CAPITAL LETTER YO +2C27; C; 2C57; # GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS +2C28; C; 2C58; # GLAGOLITIC CAPITAL LETTER BIG YUS +2C29; C; 2C59; # GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS +2C2A; C; 2C5A; # GLAGOLITIC CAPITAL LETTER FITA +2C2B; C; 2C5B; # GLAGOLITIC CAPITAL LETTER IZHITSA +2C2C; C; 2C5C; # GLAGOLITIC CAPITAL LETTER SHTAPIC +2C2D; C; 2C5D; # GLAGOLITIC CAPITAL LETTER TROKUTASTI A +2C2E; C; 2C5E; # GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +2C60; C; 2C61; # LATIN CAPITAL LETTER L WITH DOUBLE BAR +2C62; C; 026B; # LATIN CAPITAL LETTER L WITH MIDDLE TILDE +2C63; C; 1D7D; # LATIN CAPITAL LETTER P WITH STROKE +2C64; C; 027D; # LATIN CAPITAL LETTER R WITH TAIL +2C67; C; 2C68; # LATIN CAPITAL LETTER H WITH DESCENDER +2C69; C; 2C6A; # LATIN CAPITAL LETTER K WITH DESCENDER +2C6B; C; 2C6C; # LATIN CAPITAL LETTER Z WITH DESCENDER +2C6D; C; 0251; # LATIN CAPITAL LETTER ALPHA +2C6E; C; 0271; # LATIN CAPITAL LETTER M WITH HOOK +2C6F; C; 0250; # LATIN CAPITAL LETTER TURNED A +2C70; C; 0252; # LATIN CAPITAL LETTER TURNED ALPHA +2C72; C; 2C73; # LATIN CAPITAL LETTER W WITH HOOK +2C75; C; 2C76; # LATIN CAPITAL LETTER HALF H +2C7E; C; 023F; # LATIN CAPITAL LETTER S WITH SWASH TAIL +2C7F; C; 0240; # LATIN CAPITAL LETTER Z WITH SWASH TAIL +2C80; C; 2C81; # COPTIC CAPITAL LETTER ALFA +2C82; C; 2C83; # COPTIC CAPITAL LETTER VIDA +2C84; C; 2C85; # COPTIC CAPITAL LETTER GAMMA +2C86; C; 2C87; # COPTIC CAPITAL LETTER DALDA +2C88; C; 2C89; # COPTIC CAPITAL LETTER EIE +2C8A; C; 2C8B; # COPTIC CAPITAL LETTER SOU +2C8C; C; 2C8D; # COPTIC CAPITAL LETTER ZATA +2C8E; C; 2C8F; # COPTIC CAPITAL LETTER HATE +2C90; C; 2C91; # COPTIC CAPITAL LETTER THETHE +2C92; C; 2C93; # COPTIC CAPITAL LETTER IAUDA +2C94; C; 2C95; # COPTIC CAPITAL LETTER KAPA +2C96; C; 2C97; # COPTIC CAPITAL LETTER LAULA +2C98; C; 2C99; # COPTIC CAPITAL LETTER MI +2C9A; C; 2C9B; # COPTIC CAPITAL LETTER NI +2C9C; C; 2C9D; # COPTIC CAPITAL LETTER KSI +2C9E; C; 2C9F; # COPTIC CAPITAL LETTER O +2CA0; C; 2CA1; # COPTIC CAPITAL LETTER PI +2CA2; C; 2CA3; # COPTIC CAPITAL LETTER RO +2CA4; C; 2CA5; # COPTIC CAPITAL LETTER SIMA +2CA6; C; 2CA7; # COPTIC CAPITAL LETTER TAU +2CA8; C; 2CA9; # COPTIC CAPITAL LETTER UA +2CAA; C; 2CAB; # COPTIC CAPITAL LETTER FI +2CAC; C; 2CAD; # COPTIC CAPITAL LETTER KHI +2CAE; C; 2CAF; # COPTIC CAPITAL LETTER PSI +2CB0; C; 2CB1; # COPTIC CAPITAL LETTER OOU +2CB2; C; 2CB3; # COPTIC CAPITAL LETTER DIALECT-P ALEF +2CB4; C; 2CB5; # COPTIC CAPITAL LETTER OLD COPTIC AIN +2CB6; C; 2CB7; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE +2CB8; C; 2CB9; # COPTIC CAPITAL LETTER DIALECT-P KAPA +2CBA; C; 2CBB; # COPTIC CAPITAL LETTER DIALECT-P NI +2CBC; C; 2CBD; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI +2CBE; C; 2CBF; # COPTIC CAPITAL LETTER OLD COPTIC OOU +2CC0; C; 2CC1; # COPTIC CAPITAL LETTER SAMPI +2CC2; C; 2CC3; # COPTIC CAPITAL LETTER CROSSED SHEI +2CC4; C; 2CC5; # COPTIC CAPITAL LETTER OLD COPTIC SHEI +2CC6; C; 2CC7; # COPTIC CAPITAL LETTER OLD COPTIC ESH +2CC8; C; 2CC9; # COPTIC CAPITAL LETTER AKHMIMIC KHEI +2CCA; C; 2CCB; # COPTIC CAPITAL LETTER DIALECT-P HORI +2CCC; C; 2CCD; # COPTIC CAPITAL LETTER OLD COPTIC HORI +2CCE; C; 2CCF; # COPTIC CAPITAL LETTER OLD COPTIC HA +2CD0; C; 2CD1; # COPTIC CAPITAL LETTER L-SHAPED HA +2CD2; C; 2CD3; # COPTIC CAPITAL LETTER OLD COPTIC HEI +2CD4; C; 2CD5; # COPTIC CAPITAL LETTER OLD COPTIC HAT +2CD6; C; 2CD7; # COPTIC CAPITAL LETTER OLD COPTIC GANGIA +2CD8; C; 2CD9; # COPTIC CAPITAL LETTER OLD COPTIC DJA +2CDA; C; 2CDB; # COPTIC CAPITAL LETTER OLD COPTIC SHIMA +2CDC; C; 2CDD; # COPTIC CAPITAL LETTER OLD NUBIAN SHIMA +2CDE; C; 2CDF; # COPTIC CAPITAL LETTER OLD NUBIAN NGI +2CE0; C; 2CE1; # COPTIC CAPITAL LETTER OLD NUBIAN NYI +2CE2; C; 2CE3; # COPTIC CAPITAL LETTER OLD NUBIAN WAU +2CEB; C; 2CEC; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI +2CED; C; 2CEE; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA +2CF2; C; 2CF3; # COPTIC CAPITAL LETTER BOHAIRIC KHEI +A640; C; A641; # CYRILLIC CAPITAL LETTER ZEMLYA +A642; C; A643; # CYRILLIC CAPITAL LETTER DZELO +A644; C; A645; # CYRILLIC CAPITAL LETTER REVERSED DZE +A646; C; A647; # CYRILLIC CAPITAL LETTER IOTA +A648; C; A649; # CYRILLIC CAPITAL LETTER DJERV +A64A; C; A64B; # CYRILLIC CAPITAL LETTER MONOGRAPH UK +A64C; C; A64D; # CYRILLIC CAPITAL LETTER BROAD OMEGA +A64E; C; A64F; # CYRILLIC CAPITAL LETTER NEUTRAL YER +A650; C; A651; # CYRILLIC CAPITAL LETTER YERU WITH BACK YER +A652; C; A653; # CYRILLIC CAPITAL LETTER IOTIFIED YAT +A654; C; A655; # CYRILLIC CAPITAL LETTER REVERSED YU +A656; C; A657; # CYRILLIC CAPITAL LETTER IOTIFIED A +A658; C; A659; # CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS +A65A; C; A65B; # CYRILLIC CAPITAL LETTER BLENDED YUS +A65C; C; A65D; # CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS +A65E; C; A65F; # CYRILLIC CAPITAL LETTER YN +A660; C; A661; # CYRILLIC CAPITAL LETTER REVERSED TSE +A662; C; A663; # CYRILLIC CAPITAL LETTER SOFT DE +A664; C; A665; # CYRILLIC CAPITAL LETTER SOFT EL +A666; C; A667; # CYRILLIC CAPITAL LETTER SOFT EM +A668; C; A669; # CYRILLIC CAPITAL LETTER MONOCULAR O +A66A; C; A66B; # CYRILLIC CAPITAL LETTER BINOCULAR O +A66C; C; A66D; # CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O +A680; C; A681; # CYRILLIC CAPITAL LETTER DWE +A682; C; A683; # CYRILLIC CAPITAL LETTER DZWE +A684; C; A685; # CYRILLIC CAPITAL LETTER ZHWE +A686; C; A687; # CYRILLIC CAPITAL LETTER CCHE +A688; C; A689; # CYRILLIC CAPITAL LETTER DZZE +A68A; C; A68B; # CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK +A68C; C; A68D; # CYRILLIC CAPITAL LETTER TWE +A68E; C; A68F; # CYRILLIC CAPITAL LETTER TSWE +A690; C; A691; # CYRILLIC CAPITAL LETTER TSSE +A692; C; A693; # CYRILLIC CAPITAL LETTER TCHE +A694; C; A695; # CYRILLIC CAPITAL LETTER HWE +A696; C; A697; # CYRILLIC CAPITAL LETTER SHWE +A698; C; A699; # CYRILLIC CAPITAL LETTER DOUBLE O +A69A; C; A69B; # CYRILLIC CAPITAL LETTER CROSSED O +A722; C; A723; # LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF +A724; C; A725; # LATIN CAPITAL LETTER EGYPTOLOGICAL AIN +A726; C; A727; # LATIN CAPITAL LETTER HENG +A728; C; A729; # LATIN CAPITAL LETTER TZ +A72A; C; A72B; # LATIN CAPITAL LETTER TRESILLO +A72C; C; A72D; # LATIN CAPITAL LETTER CUATRILLO +A72E; C; A72F; # LATIN CAPITAL LETTER CUATRILLO WITH COMMA +A732; C; A733; # LATIN CAPITAL LETTER AA +A734; C; A735; # LATIN CAPITAL LETTER AO +A736; C; A737; # LATIN CAPITAL LETTER AU +A738; C; A739; # LATIN CAPITAL LETTER AV +A73A; C; A73B; # LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR +A73C; C; A73D; # LATIN CAPITAL LETTER AY +A73E; C; A73F; # LATIN CAPITAL LETTER REVERSED C WITH DOT +A740; C; A741; # LATIN CAPITAL LETTER K WITH STROKE +A742; C; A743; # LATIN CAPITAL LETTER K WITH DIAGONAL STROKE +A744; C; A745; # LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE +A746; C; A747; # LATIN CAPITAL LETTER BROKEN L +A748; C; A749; # LATIN CAPITAL LETTER L WITH HIGH STROKE +A74A; C; A74B; # LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY +A74C; C; A74D; # LATIN CAPITAL LETTER O WITH LOOP +A74E; C; A74F; # LATIN CAPITAL LETTER OO +A750; C; A751; # LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER +A752; C; A753; # LATIN CAPITAL LETTER P WITH FLOURISH +A754; C; A755; # LATIN CAPITAL LETTER P WITH SQUIRREL TAIL +A756; C; A757; # LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER +A758; C; A759; # LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE +A75A; C; A75B; # LATIN CAPITAL LETTER R ROTUNDA +A75C; C; A75D; # LATIN CAPITAL LETTER RUM ROTUNDA +A75E; C; A75F; # LATIN CAPITAL LETTER V WITH DIAGONAL STROKE +A760; C; A761; # LATIN CAPITAL LETTER VY +A762; C; A763; # LATIN CAPITAL LETTER VISIGOTHIC Z +A764; C; A765; # LATIN CAPITAL LETTER THORN WITH STROKE +A766; C; A767; # LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER +A768; C; A769; # LATIN CAPITAL LETTER VEND +A76A; C; A76B; # LATIN CAPITAL LETTER ET +A76C; C; A76D; # LATIN CAPITAL LETTER IS +A76E; C; A76F; # LATIN CAPITAL LETTER CON +A779; C; A77A; # LATIN CAPITAL LETTER INSULAR D +A77B; C; A77C; # LATIN CAPITAL LETTER INSULAR F +A77D; C; 1D79; # LATIN CAPITAL LETTER INSULAR G +A77E; C; A77F; # LATIN CAPITAL LETTER TURNED INSULAR G +A780; C; A781; # LATIN CAPITAL LETTER TURNED L +A782; C; A783; # LATIN CAPITAL LETTER INSULAR R +A784; C; A785; # LATIN CAPITAL LETTER INSULAR S +A786; C; A787; # LATIN CAPITAL LETTER INSULAR T +A78B; C; A78C; # LATIN CAPITAL LETTER SALTILLO +A78D; C; 0265; # LATIN CAPITAL LETTER TURNED H +A790; C; A791; # LATIN CAPITAL LETTER N WITH DESCENDER +A792; C; A793; # LATIN CAPITAL LETTER C WITH BAR +A796; C; A797; # LATIN CAPITAL LETTER B WITH FLOURISH +A798; C; A799; # LATIN CAPITAL LETTER F WITH STROKE +A79A; C; A79B; # LATIN CAPITAL LETTER VOLAPUK AE +A79C; C; A79D; # LATIN CAPITAL LETTER VOLAPUK OE +A79E; C; A79F; # LATIN CAPITAL LETTER VOLAPUK UE +A7A0; C; A7A1; # LATIN CAPITAL LETTER G WITH OBLIQUE STROKE +A7A2; C; A7A3; # LATIN CAPITAL LETTER K WITH OBLIQUE STROKE +A7A4; C; A7A5; # LATIN CAPITAL LETTER N WITH OBLIQUE STROKE +A7A6; C; A7A7; # LATIN CAPITAL LETTER R WITH OBLIQUE STROKE +A7A8; C; A7A9; # LATIN CAPITAL LETTER S WITH OBLIQUE STROKE +A7AA; C; 0266; # LATIN CAPITAL LETTER H WITH HOOK +A7AB; C; 025C; # LATIN CAPITAL LETTER REVERSED OPEN E +A7AC; C; 0261; # LATIN CAPITAL LETTER SCRIPT G +A7AD; C; 026C; # LATIN CAPITAL LETTER L WITH BELT +A7AE; C; 026A; # LATIN CAPITAL LETTER SMALL CAPITAL I +A7B0; C; 029E; # LATIN CAPITAL LETTER TURNED K +A7B1; C; 0287; # LATIN CAPITAL LETTER TURNED T +A7B2; C; 029D; # LATIN CAPITAL LETTER J WITH CROSSED-TAIL +A7B3; C; AB53; # LATIN CAPITAL LETTER CHI +A7B4; C; A7B5; # LATIN CAPITAL LETTER BETA +A7B6; C; A7B7; # LATIN CAPITAL LETTER OMEGA +AB70; C; 13A0; # CHEROKEE SMALL LETTER A +AB71; C; 13A1; # CHEROKEE SMALL LETTER E +AB72; C; 13A2; # CHEROKEE SMALL LETTER I +AB73; C; 13A3; # CHEROKEE SMALL LETTER O +AB74; C; 13A4; # CHEROKEE SMALL LETTER U +AB75; C; 13A5; # CHEROKEE SMALL LETTER V +AB76; C; 13A6; # CHEROKEE SMALL LETTER GA +AB77; C; 13A7; # CHEROKEE SMALL LETTER KA +AB78; C; 13A8; # CHEROKEE SMALL LETTER GE +AB79; C; 13A9; # CHEROKEE SMALL LETTER GI +AB7A; C; 13AA; # CHEROKEE SMALL LETTER GO +AB7B; C; 13AB; # CHEROKEE SMALL LETTER GU +AB7C; C; 13AC; # CHEROKEE SMALL LETTER GV +AB7D; C; 13AD; # CHEROKEE SMALL LETTER HA +AB7E; C; 13AE; # CHEROKEE SMALL LETTER HE +AB7F; C; 13AF; # CHEROKEE SMALL LETTER HI +AB80; C; 13B0; # CHEROKEE SMALL LETTER HO +AB81; C; 13B1; # CHEROKEE SMALL LETTER HU +AB82; C; 13B2; # CHEROKEE SMALL LETTER HV +AB83; C; 13B3; # CHEROKEE SMALL LETTER LA +AB84; C; 13B4; # CHEROKEE SMALL LETTER LE +AB85; C; 13B5; # CHEROKEE SMALL LETTER LI +AB86; C; 13B6; # CHEROKEE SMALL LETTER LO +AB87; C; 13B7; # CHEROKEE SMALL LETTER LU +AB88; C; 13B8; # CHEROKEE SMALL LETTER LV +AB89; C; 13B9; # CHEROKEE SMALL LETTER MA +AB8A; C; 13BA; # CHEROKEE SMALL LETTER ME +AB8B; C; 13BB; # CHEROKEE SMALL LETTER MI +AB8C; C; 13BC; # CHEROKEE SMALL LETTER MO +AB8D; C; 13BD; # CHEROKEE SMALL LETTER MU +AB8E; C; 13BE; # CHEROKEE SMALL LETTER NA +AB8F; C; 13BF; # CHEROKEE SMALL LETTER HNA +AB90; C; 13C0; # CHEROKEE SMALL LETTER NAH +AB91; C; 13C1; # CHEROKEE SMALL LETTER NE +AB92; C; 13C2; # CHEROKEE SMALL LETTER NI +AB93; C; 13C3; # CHEROKEE SMALL LETTER NO +AB94; C; 13C4; # CHEROKEE SMALL LETTER NU +AB95; C; 13C5; # CHEROKEE SMALL LETTER NV +AB96; C; 13C6; # CHEROKEE SMALL LETTER QUA +AB97; C; 13C7; # CHEROKEE SMALL LETTER QUE +AB98; C; 13C8; # CHEROKEE SMALL LETTER QUI +AB99; C; 13C9; # CHEROKEE SMALL LETTER QUO +AB9A; C; 13CA; # CHEROKEE SMALL LETTER QUU +AB9B; C; 13CB; # CHEROKEE SMALL LETTER QUV +AB9C; C; 13CC; # CHEROKEE SMALL LETTER SA +AB9D; C; 13CD; # CHEROKEE SMALL LETTER S +AB9E; C; 13CE; # CHEROKEE SMALL LETTER SE +AB9F; C; 13CF; # CHEROKEE SMALL LETTER SI +ABA0; C; 13D0; # CHEROKEE SMALL LETTER SO +ABA1; C; 13D1; # CHEROKEE SMALL LETTER SU +ABA2; C; 13D2; # CHEROKEE SMALL LETTER SV +ABA3; C; 13D3; # CHEROKEE SMALL LETTER DA +ABA4; C; 13D4; # CHEROKEE SMALL LETTER TA +ABA5; C; 13D5; # CHEROKEE SMALL LETTER DE +ABA6; C; 13D6; # CHEROKEE SMALL LETTER TE +ABA7; C; 13D7; # CHEROKEE SMALL LETTER DI +ABA8; C; 13D8; # CHEROKEE SMALL LETTER TI +ABA9; C; 13D9; # CHEROKEE SMALL LETTER DO +ABAA; C; 13DA; # CHEROKEE SMALL LETTER DU +ABAB; C; 13DB; # CHEROKEE SMALL LETTER DV +ABAC; C; 13DC; # CHEROKEE SMALL LETTER DLA +ABAD; C; 13DD; # CHEROKEE SMALL LETTER TLA +ABAE; C; 13DE; # CHEROKEE SMALL LETTER TLE +ABAF; C; 13DF; # CHEROKEE SMALL LETTER TLI +ABB0; C; 13E0; # CHEROKEE SMALL LETTER TLO +ABB1; C; 13E1; # CHEROKEE SMALL LETTER TLU +ABB2; C; 13E2; # CHEROKEE SMALL LETTER TLV +ABB3; C; 13E3; # CHEROKEE SMALL LETTER TSA +ABB4; C; 13E4; # CHEROKEE SMALL LETTER TSE +ABB5; C; 13E5; # CHEROKEE SMALL LETTER TSI +ABB6; C; 13E6; # CHEROKEE SMALL LETTER TSO +ABB7; C; 13E7; # CHEROKEE SMALL LETTER TSU +ABB8; C; 13E8; # CHEROKEE SMALL LETTER TSV +ABB9; C; 13E9; # CHEROKEE SMALL LETTER WA +ABBA; C; 13EA; # CHEROKEE SMALL LETTER WE +ABBB; C; 13EB; # CHEROKEE SMALL LETTER WI +ABBC; C; 13EC; # CHEROKEE SMALL LETTER WO +ABBD; C; 13ED; # CHEROKEE SMALL LETTER WU +ABBE; C; 13EE; # CHEROKEE SMALL LETTER WV +ABBF; C; 13EF; # CHEROKEE SMALL LETTER YA +FB00; F; 0066 0066; # LATIN SMALL LIGATURE FF +FB01; F; 0066 0069; # LATIN SMALL LIGATURE FI +FB02; F; 0066 006C; # LATIN SMALL LIGATURE FL +FB03; F; 0066 0066 0069; # LATIN SMALL LIGATURE FFI +FB04; F; 0066 0066 006C; # LATIN SMALL LIGATURE FFL +FB05; F; 0073 0074; # LATIN SMALL LIGATURE LONG S T +FB06; F; 0073 0074; # LATIN SMALL LIGATURE ST +FB13; F; 0574 0576; # ARMENIAN SMALL LIGATURE MEN NOW +FB14; F; 0574 0565; # ARMENIAN SMALL LIGATURE MEN ECH +FB15; F; 0574 056B; # ARMENIAN SMALL LIGATURE MEN INI +FB16; F; 057E 0576; # ARMENIAN SMALL LIGATURE VEW NOW +FB17; F; 0574 056D; # ARMENIAN SMALL LIGATURE MEN XEH +FF21; C; FF41; # FULLWIDTH LATIN CAPITAL LETTER A +FF22; C; FF42; # FULLWIDTH LATIN CAPITAL LETTER B +FF23; C; FF43; # FULLWIDTH LATIN CAPITAL LETTER C +FF24; C; FF44; # FULLWIDTH LATIN CAPITAL LETTER D +FF25; C; FF45; # FULLWIDTH LATIN CAPITAL LETTER E +FF26; C; FF46; # FULLWIDTH LATIN CAPITAL LETTER F +FF27; C; FF47; # FULLWIDTH LATIN CAPITAL LETTER G +FF28; C; FF48; # FULLWIDTH LATIN CAPITAL LETTER H +FF29; C; FF49; # FULLWIDTH LATIN CAPITAL LETTER I +FF2A; C; FF4A; # FULLWIDTH LATIN CAPITAL LETTER J +FF2B; C; FF4B; # FULLWIDTH LATIN CAPITAL LETTER K +FF2C; C; FF4C; # FULLWIDTH LATIN CAPITAL LETTER L +FF2D; C; FF4D; # FULLWIDTH LATIN CAPITAL LETTER M +FF2E; C; FF4E; # FULLWIDTH LATIN CAPITAL LETTER N +FF2F; C; FF4F; # FULLWIDTH LATIN CAPITAL LETTER O +FF30; C; FF50; # FULLWIDTH LATIN CAPITAL LETTER P +FF31; C; FF51; # FULLWIDTH LATIN CAPITAL LETTER Q +FF32; C; FF52; # FULLWIDTH LATIN CAPITAL LETTER R +FF33; C; FF53; # FULLWIDTH LATIN CAPITAL LETTER S +FF34; C; FF54; # FULLWIDTH LATIN CAPITAL LETTER T +FF35; C; FF55; # FULLWIDTH LATIN CAPITAL LETTER U +FF36; C; FF56; # FULLWIDTH LATIN CAPITAL LETTER V +FF37; C; FF57; # FULLWIDTH LATIN CAPITAL LETTER W +FF38; C; FF58; # FULLWIDTH LATIN CAPITAL LETTER X +FF39; C; FF59; # FULLWIDTH LATIN CAPITAL LETTER Y +FF3A; C; FF5A; # FULLWIDTH LATIN CAPITAL LETTER Z +10400; C; 10428; # DESERET CAPITAL LETTER LONG I +10401; C; 10429; # DESERET CAPITAL LETTER LONG E +10402; C; 1042A; # DESERET CAPITAL LETTER LONG A +10403; C; 1042B; # DESERET CAPITAL LETTER LONG AH +10404; C; 1042C; # DESERET CAPITAL LETTER LONG O +10405; C; 1042D; # DESERET CAPITAL LETTER LONG OO +10406; C; 1042E; # DESERET CAPITAL LETTER SHORT I +10407; C; 1042F; # DESERET CAPITAL LETTER SHORT E +10408; C; 10430; # DESERET CAPITAL LETTER SHORT A +10409; C; 10431; # DESERET CAPITAL LETTER SHORT AH +1040A; C; 10432; # DESERET CAPITAL LETTER SHORT O +1040B; C; 10433; # DESERET CAPITAL LETTER SHORT OO +1040C; C; 10434; # DESERET CAPITAL LETTER AY +1040D; C; 10435; # DESERET CAPITAL LETTER OW +1040E; C; 10436; # DESERET CAPITAL LETTER WU +1040F; C; 10437; # DESERET CAPITAL LETTER YEE +10410; C; 10438; # DESERET CAPITAL LETTER H +10411; C; 10439; # DESERET CAPITAL LETTER PEE +10412; C; 1043A; # DESERET CAPITAL LETTER BEE +10413; C; 1043B; # DESERET CAPITAL LETTER TEE +10414; C; 1043C; # DESERET CAPITAL LETTER DEE +10415; C; 1043D; # DESERET CAPITAL LETTER CHEE +10416; C; 1043E; # DESERET CAPITAL LETTER JEE +10417; C; 1043F; # DESERET CAPITAL LETTER KAY +10418; C; 10440; # DESERET CAPITAL LETTER GAY +10419; C; 10441; # DESERET CAPITAL LETTER EF +1041A; C; 10442; # DESERET CAPITAL LETTER VEE +1041B; C; 10443; # DESERET CAPITAL LETTER ETH +1041C; C; 10444; # DESERET CAPITAL LETTER THEE +1041D; C; 10445; # DESERET CAPITAL LETTER ES +1041E; C; 10446; # DESERET CAPITAL LETTER ZEE +1041F; C; 10447; # DESERET CAPITAL LETTER ESH +10420; C; 10448; # DESERET CAPITAL LETTER ZHEE +10421; C; 10449; # DESERET CAPITAL LETTER ER +10422; C; 1044A; # DESERET CAPITAL LETTER EL +10423; C; 1044B; # DESERET CAPITAL LETTER EM +10424; C; 1044C; # DESERET CAPITAL LETTER EN +10425; C; 1044D; # DESERET CAPITAL LETTER ENG +10426; C; 1044E; # DESERET CAPITAL LETTER OI +10427; C; 1044F; # DESERET CAPITAL LETTER EW +104B0; C; 104D8; # OSAGE CAPITAL LETTER A +104B1; C; 104D9; # OSAGE CAPITAL LETTER AI +104B2; C; 104DA; # OSAGE CAPITAL LETTER AIN +104B3; C; 104DB; # OSAGE CAPITAL LETTER AH +104B4; C; 104DC; # OSAGE CAPITAL LETTER BRA +104B5; C; 104DD; # OSAGE CAPITAL LETTER CHA +104B6; C; 104DE; # OSAGE CAPITAL LETTER EHCHA +104B7; C; 104DF; # OSAGE CAPITAL LETTER E +104B8; C; 104E0; # OSAGE CAPITAL LETTER EIN +104B9; C; 104E1; # OSAGE CAPITAL LETTER HA +104BA; C; 104E2; # OSAGE CAPITAL LETTER HYA +104BB; C; 104E3; # OSAGE CAPITAL LETTER I +104BC; C; 104E4; # OSAGE CAPITAL LETTER KA +104BD; C; 104E5; # OSAGE CAPITAL LETTER EHKA +104BE; C; 104E6; # OSAGE CAPITAL LETTER KYA +104BF; C; 104E7; # OSAGE CAPITAL LETTER LA +104C0; C; 104E8; # OSAGE CAPITAL LETTER MA +104C1; C; 104E9; # OSAGE CAPITAL LETTER NA +104C2; C; 104EA; # OSAGE CAPITAL LETTER O +104C3; C; 104EB; # OSAGE CAPITAL LETTER OIN +104C4; C; 104EC; # OSAGE CAPITAL LETTER PA +104C5; C; 104ED; # OSAGE CAPITAL LETTER EHPA +104C6; C; 104EE; # OSAGE CAPITAL LETTER SA +104C7; C; 104EF; # OSAGE CAPITAL LETTER SHA +104C8; C; 104F0; # OSAGE CAPITAL LETTER TA +104C9; C; 104F1; # OSAGE CAPITAL LETTER EHTA +104CA; C; 104F2; # OSAGE CAPITAL LETTER TSA +104CB; C; 104F3; # OSAGE CAPITAL LETTER EHTSA +104CC; C; 104F4; # OSAGE CAPITAL LETTER TSHA +104CD; C; 104F5; # OSAGE CAPITAL LETTER DHA +104CE; C; 104F6; # OSAGE CAPITAL LETTER U +104CF; C; 104F7; # OSAGE CAPITAL LETTER WA +104D0; C; 104F8; # OSAGE CAPITAL LETTER KHA +104D1; C; 104F9; # OSAGE CAPITAL LETTER GHA +104D2; C; 104FA; # OSAGE CAPITAL LETTER ZA +104D3; C; 104FB; # OSAGE CAPITAL LETTER ZHA +10C80; C; 10CC0; # OLD HUNGARIAN CAPITAL LETTER A +10C81; C; 10CC1; # OLD HUNGARIAN CAPITAL LETTER AA +10C82; C; 10CC2; # OLD HUNGARIAN CAPITAL LETTER EB +10C83; C; 10CC3; # OLD HUNGARIAN CAPITAL LETTER AMB +10C84; C; 10CC4; # OLD HUNGARIAN CAPITAL LETTER EC +10C85; C; 10CC5; # OLD HUNGARIAN CAPITAL LETTER ENC +10C86; C; 10CC6; # OLD HUNGARIAN CAPITAL LETTER ECS +10C87; C; 10CC7; # OLD HUNGARIAN CAPITAL LETTER ED +10C88; C; 10CC8; # OLD HUNGARIAN CAPITAL LETTER AND +10C89; C; 10CC9; # OLD HUNGARIAN CAPITAL LETTER E +10C8A; C; 10CCA; # OLD HUNGARIAN CAPITAL LETTER CLOSE E +10C8B; C; 10CCB; # OLD HUNGARIAN CAPITAL LETTER EE +10C8C; C; 10CCC; # OLD HUNGARIAN CAPITAL LETTER EF +10C8D; C; 10CCD; # OLD HUNGARIAN CAPITAL LETTER EG +10C8E; C; 10CCE; # OLD HUNGARIAN CAPITAL LETTER EGY +10C8F; C; 10CCF; # OLD HUNGARIAN CAPITAL LETTER EH +10C90; C; 10CD0; # OLD HUNGARIAN CAPITAL LETTER I +10C91; C; 10CD1; # OLD HUNGARIAN CAPITAL LETTER II +10C92; C; 10CD2; # OLD HUNGARIAN CAPITAL LETTER EJ +10C93; C; 10CD3; # OLD HUNGARIAN CAPITAL LETTER EK +10C94; C; 10CD4; # OLD HUNGARIAN CAPITAL LETTER AK +10C95; C; 10CD5; # OLD HUNGARIAN CAPITAL LETTER UNK +10C96; C; 10CD6; # OLD HUNGARIAN CAPITAL LETTER EL +10C97; C; 10CD7; # OLD HUNGARIAN CAPITAL LETTER ELY +10C98; C; 10CD8; # OLD HUNGARIAN CAPITAL LETTER EM +10C99; C; 10CD9; # OLD HUNGARIAN CAPITAL LETTER EN +10C9A; C; 10CDA; # OLD HUNGARIAN CAPITAL LETTER ENY +10C9B; C; 10CDB; # OLD HUNGARIAN CAPITAL LETTER O +10C9C; C; 10CDC; # OLD HUNGARIAN CAPITAL LETTER OO +10C9D; C; 10CDD; # OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE +10C9E; C; 10CDE; # OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE +10C9F; C; 10CDF; # OLD HUNGARIAN CAPITAL LETTER OEE +10CA0; C; 10CE0; # OLD HUNGARIAN CAPITAL LETTER EP +10CA1; C; 10CE1; # OLD HUNGARIAN CAPITAL LETTER EMP +10CA2; C; 10CE2; # OLD HUNGARIAN CAPITAL LETTER ER +10CA3; C; 10CE3; # OLD HUNGARIAN CAPITAL LETTER SHORT ER +10CA4; C; 10CE4; # OLD HUNGARIAN CAPITAL LETTER ES +10CA5; C; 10CE5; # OLD HUNGARIAN CAPITAL LETTER ESZ +10CA6; C; 10CE6; # OLD HUNGARIAN CAPITAL LETTER ET +10CA7; C; 10CE7; # OLD HUNGARIAN CAPITAL LETTER ENT +10CA8; C; 10CE8; # OLD HUNGARIAN CAPITAL LETTER ETY +10CA9; C; 10CE9; # OLD HUNGARIAN CAPITAL LETTER ECH +10CAA; C; 10CEA; # OLD HUNGARIAN CAPITAL LETTER U +10CAB; C; 10CEB; # OLD HUNGARIAN CAPITAL LETTER UU +10CAC; C; 10CEC; # OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE +10CAD; C; 10CED; # OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE +10CAE; C; 10CEE; # OLD HUNGARIAN CAPITAL LETTER EV +10CAF; C; 10CEF; # OLD HUNGARIAN CAPITAL LETTER EZ +10CB0; C; 10CF0; # OLD HUNGARIAN CAPITAL LETTER EZS +10CB1; C; 10CF1; # OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN +10CB2; C; 10CF2; # OLD HUNGARIAN CAPITAL LETTER US +118A0; C; 118C0; # WARANG CITI CAPITAL LETTER NGAA +118A1; C; 118C1; # WARANG CITI CAPITAL LETTER A +118A2; C; 118C2; # WARANG CITI CAPITAL LETTER WI +118A3; C; 118C3; # WARANG CITI CAPITAL LETTER YU +118A4; C; 118C4; # WARANG CITI CAPITAL LETTER YA +118A5; C; 118C5; # WARANG CITI CAPITAL LETTER YO +118A6; C; 118C6; # WARANG CITI CAPITAL LETTER II +118A7; C; 118C7; # WARANG CITI CAPITAL LETTER UU +118A8; C; 118C8; # WARANG CITI CAPITAL LETTER E +118A9; C; 118C9; # WARANG CITI CAPITAL LETTER O +118AA; C; 118CA; # WARANG CITI CAPITAL LETTER ANG +118AB; C; 118CB; # WARANG CITI CAPITAL LETTER GA +118AC; C; 118CC; # WARANG CITI CAPITAL LETTER KO +118AD; C; 118CD; # WARANG CITI CAPITAL LETTER ENY +118AE; C; 118CE; # WARANG CITI CAPITAL LETTER YUJ +118AF; C; 118CF; # WARANG CITI CAPITAL LETTER UC +118B0; C; 118D0; # WARANG CITI CAPITAL LETTER ENN +118B1; C; 118D1; # WARANG CITI CAPITAL LETTER ODD +118B2; C; 118D2; # WARANG CITI CAPITAL LETTER TTE +118B3; C; 118D3; # WARANG CITI CAPITAL LETTER NUNG +118B4; C; 118D4; # WARANG CITI CAPITAL LETTER DA +118B5; C; 118D5; # WARANG CITI CAPITAL LETTER AT +118B6; C; 118D6; # WARANG CITI CAPITAL LETTER AM +118B7; C; 118D7; # WARANG CITI CAPITAL LETTER BU +118B8; C; 118D8; # WARANG CITI CAPITAL LETTER PU +118B9; C; 118D9; # WARANG CITI CAPITAL LETTER HIYO +118BA; C; 118DA; # WARANG CITI CAPITAL LETTER HOLO +118BB; C; 118DB; # WARANG CITI CAPITAL LETTER HORR +118BC; C; 118DC; # WARANG CITI CAPITAL LETTER HAR +118BD; C; 118DD; # WARANG CITI CAPITAL LETTER SSUU +118BE; C; 118DE; # WARANG CITI CAPITAL LETTER SII +118BF; C; 118DF; # WARANG CITI CAPITAL LETTER VIYO +1E900; C; 1E922; # ADLAM CAPITAL LETTER ALIF +1E901; C; 1E923; # ADLAM CAPITAL LETTER DAALI +1E902; C; 1E924; # ADLAM CAPITAL LETTER LAAM +1E903; C; 1E925; # ADLAM CAPITAL LETTER MIIM +1E904; C; 1E926; # ADLAM CAPITAL LETTER BA +1E905; C; 1E927; # ADLAM CAPITAL LETTER SINNYIIYHE +1E906; C; 1E928; # ADLAM CAPITAL LETTER PE +1E907; C; 1E929; # ADLAM CAPITAL LETTER BHE +1E908; C; 1E92A; # ADLAM CAPITAL LETTER RA +1E909; C; 1E92B; # ADLAM CAPITAL LETTER E +1E90A; C; 1E92C; # ADLAM CAPITAL LETTER FA +1E90B; C; 1E92D; # ADLAM CAPITAL LETTER I +1E90C; C; 1E92E; # ADLAM CAPITAL LETTER O +1E90D; C; 1E92F; # ADLAM CAPITAL LETTER DHA +1E90E; C; 1E930; # ADLAM CAPITAL LETTER YHE +1E90F; C; 1E931; # ADLAM CAPITAL LETTER WAW +1E910; C; 1E932; # ADLAM CAPITAL LETTER NUN +1E911; C; 1E933; # ADLAM CAPITAL LETTER KAF +1E912; C; 1E934; # ADLAM CAPITAL LETTER YA +1E913; C; 1E935; # ADLAM CAPITAL LETTER U +1E914; C; 1E936; # ADLAM CAPITAL LETTER JIIM +1E915; C; 1E937; # ADLAM CAPITAL LETTER CHI +1E916; C; 1E938; # ADLAM CAPITAL LETTER HA +1E917; C; 1E939; # ADLAM CAPITAL LETTER QAAF +1E918; C; 1E93A; # ADLAM CAPITAL LETTER GA +1E919; C; 1E93B; # ADLAM CAPITAL LETTER NYA +1E91A; C; 1E93C; # ADLAM CAPITAL LETTER TU +1E91B; C; 1E93D; # ADLAM CAPITAL LETTER NHA +1E91C; C; 1E93E; # ADLAM CAPITAL LETTER VA +1E91D; C; 1E93F; # ADLAM CAPITAL LETTER KHA +1E91E; C; 1E940; # ADLAM CAPITAL LETTER GBE +1E91F; C; 1E941; # ADLAM CAPITAL LETTER ZAL +1E920; C; 1E942; # ADLAM CAPITAL LETTER KPO +1E921; C; 1E943; # ADLAM CAPITAL LETTER SHA +# +# EOF diff --git a/etc/Makefile b/etc/Makefile index f0e55f84aa4d37d28f6430c88cd7025b713bdfe9..e72e1e0f21c3ce79a651efe2c55a4722dcd95beb 100644 --- a/etc/Makefile +++ b/etc/Makefile @@ -38,6 +38,8 @@ import_part module_param port_type signature template testcase ttcn3_module)) XSD_FILES := $(addprefix xsd/, TPD.xsd) +CASE_FOLDINGS := CaseFolding.txt + install: ifdef MINGW @echo Skipped ${CURDIR} for MinGW @@ -48,4 +50,5 @@ else # cp asciiart/*.txt $(ETCDIR)/asciiart mkdir -p $(ETCDIR)/scripts cp scripts/*.py $(ETCDIR)/scripts + cp $(CASE_FOLDINGS) $(ETCDIR) endif diff --git a/mctr2/cli/config_read.l b/mctr2/cli/config_read.l index 59a8e8f87c2fabcfb1987e6bb1e5f08821604c73..18b8de8af3ee69f7a3f8c9df8c821cc543f45e34 100644 --- a/mctr2/cli/config_read.l +++ b/mctr2/cli/config_read.l @@ -441,6 +441,7 @@ permutation RETURN(PermutationKeyword); length RETURN(LengthKeyword); ifpresent RETURN(IfpresentKeyword); infinity RETURN(InfinityKeyword); +"@nocase" RETURN(NocaseKeyword); } <SC_MODULE_PARAMETERS,SC_LOGGING,SC_PROFILER> diff --git a/mctr2/cli/config_read.y b/mctr2/cli/config_read.y index 4acf98185d63aa7bb2b3016d3f24ee1b3e65a23b..e1833084cbbab3f7f35e99b02330f1e8a6882621 100644 --- a/mctr2/cli/config_read.y +++ b/mctr2/cli/config_read.y @@ -123,6 +123,7 @@ static void yyprint(FILE *file, int type, const YYSTYPE& value); %token LengthKeyword "length" %token IfpresentKeyword "ifpresent" %token InfinityKeyword "infinity" +%token NocaseKeyword "@nocase" %token LogFile "LogFile of FileName" %token EmergencyLogging @@ -347,6 +348,7 @@ SimpleParameterValue: | FloatRange | StringRange | PatternKeyword PatternChunk +| PatternKeyword NocaseKeyword PatternChunk | BstringMatch | HstringMatch | OstringMatch diff --git a/regression_test/pattern_quadruples/config.cfg b/regression_test/pattern_quadruples/config.cfg index 9aa6d0cc917fe0ecf9fe304162e249eb665eb347..4c20da60c9d784b4849d30307a7c08277387ac84 100644 --- a/regression_test/pattern_quadruples/config.cfg +++ b/regression_test/pattern_quadruples/config.cfg @@ -11,6 +11,7 @@ # ############################################################################### [MODULE_PARAMETERS] +mpt_ucs := pattern @nocase "A" & char(0,0,0,225) & "[" & char(0,0,0,201) & "-" & char(0,0,1,113) & "]"; [LOGGING] Logfile := "pattern_quadruples.log" FileMask := LOG_ALL diff --git a/regression_test/pattern_quadruples/pattern_quadruples.ttcn b/regression_test/pattern_quadruples/pattern_quadruples.ttcn index 7ef73ffafbb0f54193dd6f925024cd94052e4879..439d0239b95e58e6ff707e40135bb77c28a647fc 100644 --- a/regression_test/pattern_quadruples/pattern_quadruples.ttcn +++ b/regression_test/pattern_quadruples/pattern_quadruples.ttcn @@ -94,11 +94,52 @@ module pattern_quadruples if (not match(foobar_u, t_us)) { setverdict(fail, "ustr mismatch,", match(foobar_u, t_us)); } setverdict(pass); } + + const universal charstring c_ucs_val := "AÃ"; + const universal charstring c_ucs_pattern := "([abc][é-ű])"; + + // case-insensitive regexp + testcase univ_regexp_nocase() runs on univchar_comp { + // regexp with constants (calculated at compile-time) + var universal charstring v_res_const := regexp @nocase (c_ucs_val, c_ucs_pattern, 0); + if (v_res_const != c_ucs_val) { + setverdict(fail, "Const regexp failed. Got: ", v_res_const, ", expected: ", c_ucs_val); + } + + // regexp with variables (calculated at runtime) + var universal charstring v_ucs_val := "aÃű"; + var universal charstring v_ucs_pattern := "(Aá[É-Ű])"; + var universal charstring v_res_var := regexp @nocase (v_ucs_val, v_ucs_pattern, 0); + if (v_res_var != v_ucs_val) { + setverdict(fail, "Var regexp failed. Got: ", v_res_var, ", expected: ", v_ucs_val); + } + setverdict(pass); + } + + modulepar template universal charstring mpt_ucs; + + // case-insensitive pattern + testcase univ_pattern_nocase() runs on univchar_comp { + // pattern in template variable + var template universal charstring vt_ucs := pattern @nocase "A\q{0,0,0,225}[\q{0,0,0,201}-\q{0,0,1,113}]"; // "Aá[É-ű]" + var universal charstring val := "aÃű"; + if (not match(val, vt_ucs)) { + setverdict(fail, "Var template pattern failed: ", match(val, vt_ucs)); + } + + // pattern in template module parameter + if (not match(val, mpt_ucs)) { + setverdict(fail, "Var template pattern failed: ", match(val, mpt_ucs)); + } + setverdict(pass); + } control { execute(univ_match()); execute(univ_match_neg()); execute(univ_regexp()); execute(univ_from_charstr_pattern()); + execute(univ_regexp_nocase()); + execute(univ_pattern_nocase()); } } diff --git a/regression_test/predefFunction/regex_OK.ttcn b/regression_test/predefFunction/regex_OK.ttcn index d76663f7475f2f3fd1edaef43042eaf0b66b17bb..a95fe2f4930da433d16c005adcbae8ba66803e3a 100644 --- a/regression_test/predefFunction/regex_OK.ttcn +++ b/regression_test/predefFunction/regex_OK.ttcn @@ -153,9 +153,31 @@ testcase regexp_degen() runs on PDTestComponent { } } +const charstring c_cs_val := "aBc5XYz"; +const charstring c_cs_pattern := "(abc?xyz)"; + +// case-insensitive regexp +testcase regexp_nocase() runs on PDTestComponent { + // regexp with constants (calculated at compile-time) + var charstring v_res_const := regexp @nocase (c_cs_val, c_cs_pattern, 0); + if (v_res_const != c_cs_val) { + setverdict(fail, "Const regexp failed. Got: ", v_res_const, ", expected: ", c_cs_val); + } + + // regexp with variables (calculated at runtime) + var charstring v_cs_val := "aBE5XYz"; + var charstring v_cs_pattern := "(ab[A-e]?xyz)"; + var charstring v_res_var := regexp @nocase (v_cs_val, v_cs_pattern, 0); + if (v_res_var != v_cs_val) { + setverdict(fail, "Var regexp failed. Got: ", v_res_var, ", expected: ", v_cs_val); + } + setverdict(pass); +} + control { execute (regexp_char()); execute (regexp_degen()); + execute (regexp_nocase()); } } diff --git a/regression_test/templateCharstr/TtemplateCharstr.ttcn b/regression_test/templateCharstr/TtemplateCharstr.ttcn index a9fa8c274cce2f3d3c63583b8038ef014766cf43..0e295445a10f093412b44688a49768b2c42b12bd 100644 --- a/regression_test/templateCharstr/TtemplateCharstr.ttcn +++ b/regression_test/templateCharstr/TtemplateCharstr.ttcn @@ -848,6 +848,24 @@ testcase templateCharstrDecmatchSelfRef() runs on templateCharstr_mycomp { else { setverdict(fail, 5); } } +modulepar template charstring mpt_cs; + +// case-insensitive pattern +testcase templateCharstrPatternNocase() runs on templateCharstr_mycomp { + // pattern in template variable + var template charstring vt_cs := pattern @nocase "ab[A-e]?xyz"; + var charstring val := "aBE5XYz"; + if (not match(val, vt_cs)) { + setverdict(fail, "Var template pattern failed: ", match(val, vt_cs)); + } + + // pattern in template module parameter + if (not match(val, mpt_cs)) { + setverdict(fail, "Var template pattern failed: ", match(val, mpt_cs)); + } + setverdict(pass); +} + control { execute(templateCharstrSpec()); execute(templateCharstrList()); @@ -881,5 +899,6 @@ control { execute(CR_TR00018474()); execute(templateCharstrDecmatch()); execute(templateCharstrDecmatchSelfRef()); + execute(templateCharstrPatternNocase()); } } diff --git a/regression_test/templateCharstr/config.cfg b/regression_test/templateCharstr/config.cfg index 9b8081fa3445a7dc629cdc1adc5f6f5e20065391..5479c9829878ba597355f2d16bf8b8eedb762f1a 100644 --- a/regression_test/templateCharstr/config.cfg +++ b/regression_test/templateCharstr/config.cfg @@ -11,6 +11,7 @@ # ############################################################################### [MODULE_PARAMETERS] +mpt_cs := pattern @nocase "ab[A-e]" & "?xyz"; [LOGGING] Logfile := "templateCharstr.log" FileMask := LOG_ALL diff --git a/usrguide/SoC_TITAN.docx b/usrguide/SoC_TITAN.docx index 8440f723587ff955bc3f02c08563384533892b51..ae1c21fa1c1739ae2357e092483185cdeb3e5def 100644 Binary files a/usrguide/SoC_TITAN.docx and b/usrguide/SoC_TITAN.docx differ