├── .gitignore ├── LICENSE ├── README.md ├── samples ├── basics │ ├── basics.c │ └── basics.ini ├── custom_allocators │ ├── custom_allocator.c │ └── custom_allocator.ini ├── duplicates │ ├── duplicates.c │ └── duplicates.ini ├── iterating │ ├── iterating.c │ └── iterating.ini └── warnings │ ├── warnings.c │ └── warnings.ini ├── simple_ini_reader.h ├── tests ├── test1.ini ├── test2.ini ├── test3.ini ├── test4.ini ├── test5.ini ├── test6.ini ├── test7.ini ├── test8.ini └── tests.c └── util ├── README.md └── sir_util.c /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled source # 2 | ################### 3 | *.com 4 | *.class 5 | *.dll 6 | *.exe 7 | *.o 8 | *.so 9 | *.obj 10 | 11 | # OS generated files # 12 | ###################### 13 | .DS_Store 14 | .DS_Store? 15 | ._* 16 | .Spotlight-V100 17 | .Trashes 18 | ehthumbs.db 19 | Thumbs.db 20 | 21 | # Vim Temporary Files # 22 | ####################### 23 | *~ 24 | *.swp 25 | 26 | # Visual Studio # 27 | ################# 28 | [Dd]ebug/ 29 | [Dd]ebugPublic/ 30 | [Rr]elease/ 31 | [Rr]eleases/ 32 | x64/ 33 | x86/ 34 | bld/ 35 | [Bb]in/ 36 | [Oo]bj/ 37 | [Ll]og/ 38 | .vs/ 39 | 40 | # GCC # 41 | ####### 42 | *.out 43 | compile.sh 44 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Simple INI Reader 2 | A fast, simple, public domain INI Reader written in C. This repo includes a 3 | single-file library, and a Unix-style command-line utility that acts as a 4 | complete program example and can also be used to read INI files using shell 5 | scripts. 6 | 7 | ## Why Use This? 8 | * Public domain, so no attribution is required. 9 | * Written using only the C Standard Library, so it should be portable (tested on Windows and Ubuntu). 10 | * Fast and has a small memory footprint, especially if custom allocators are used and warnings and errors are disabled. 11 | * Provides a very simple, user-friendly interface. 12 | 13 | ## Basic Usage 14 | 15 | ### Library 16 | 17 | Simply drop `simple_ini_reader.h` into your source folder and add the following to one of your C/C++ files: 18 | ``` 19 | #define SIMPLE_INI_READER_IMPLEMENTATION 20 | #include "simple_ini_reader.h" 21 | ``` 22 | `simple_ini_reader.h` has basic documentation commented at the top of the file. For more detailed examples check the [samples](samples/) folder. 23 | 24 | ### Utility 25 | 26 | The source code for the command-line utility is located in [util](util/). See the README file in that folder for more infomation. 27 | 28 | ## Contact 29 | You can send feedback to [contact@sebj.co.uk](mailto:contact@sebj.co.uk) 30 | -------------------------------------------------------------------------------- /samples/basics/basics.c: -------------------------------------------------------------------------------- 1 | // Simple INI Reader Samples - Basics 2 | // Author: Sebastian Jones 3 | 4 | #include 5 | 6 | #define SIMPLE_INI_READER_IMPLEMENTATION 7 | #include "../../simple_ini_reader.h" 8 | 9 | int main(int argc, char **argv) 10 | { 11 | SirIni ini = sir_load_from_file("basics.ini", 0, 0); 12 | 13 | if (!ini) // Couldn't malloc the ini struct 14 | return 1; 15 | 16 | if (sir_has_error(ini)) 17 | { 18 | printf("%s\n", ini->error); 19 | return 1; 20 | } 21 | 22 | // Note that you can use the SIR_GLOBAL_SECTION_NAME macro 23 | // instead of "global" 24 | const char *str = sir_section_str(ini, "global", "key"); 25 | if (sir_has_error(ini)) 26 | printf("%s\n", ini->error); 27 | else 28 | printf("key = \"%s\"\n", str); 29 | 30 | str = sir_section_str(ini, "section1", "key1"); 31 | if (sir_has_error(ini)) 32 | printf("%s\n", ini->error); 33 | else 34 | printf("key1 = \"%s\"\n", str); 35 | 36 | // These functions convert using the stdlib functions, and handle stdlib 37 | // errors. 38 | long l = sir_section_long(ini, "section2", "key2"); 39 | if (sir_has_error(ini)) 40 | printf("%s\n", ini->error); 41 | else 42 | printf("key2 = \"%li\"\n", l); 43 | 44 | double d = sir_section_double(ini, "section2", "key3"); 45 | if (sir_has_error(ini)) 46 | printf("%s\n", ini->error); 47 | else 48 | printf("key3 = \"%f\"\n", d); 49 | 50 | char b = sir_section_bool(ini, "section2", "key4"); 51 | if (sir_has_error(ini)) 52 | printf("%s\n", ini->error); 53 | else 54 | printf("key4 = \"%i\"\n", b); 55 | 56 | // _section can be ommitted from the above functions to search all keys in 57 | // the INI file, regardless of what section they belong to 58 | 59 | str = sir_str(ini, "key3"); 60 | if (sir_has_error(ini)) 61 | printf("%s\n", ini->error); 62 | else 63 | printf("\nkey3 = \"%s\"\n", str); 64 | 65 | // Free the INI 66 | sir_free_ini(ini); 67 | 68 | return 0; 69 | } 70 | -------------------------------------------------------------------------------- /samples/basics/basics.ini: -------------------------------------------------------------------------------- 1 | ; Simple INI Reader Samples - Basics 2 | 3 | key = hello 4 | 5 | [ section1 ] 6 | 7 | key1:" world!" # quotes preserve whitespace 8 | 9 | [section2] 10 | 11 | key2 = 4788 12 | 13 | key3 = 3.14 14 | 15 | key4 = True 16 | -------------------------------------------------------------------------------- /samples/custom_allocators/custom_allocator.c: -------------------------------------------------------------------------------- 1 | // Simple INI Reader Samples - Custom Allocators 2 | // Author: Sebastian Jones 3 | // 4 | // A trivial and basically useless custom allocator designed to show 5 | // how to use your custom allocator with SIR. 6 | 7 | #include 8 | #include 9 | #include 10 | 11 | typedef struct AllocatorContext 12 | { 13 | char *mem; 14 | size_t size, pos; 15 | } 16 | AllocatorContext; 17 | 18 | void *custom_alloc(AllocatorContext *ctx, size_t size); 19 | void *custom_realloc(AllocatorContext *ctx, void *mem, size_t size); 20 | void custom_free(AllocatorContext *ctx, void *mem); 21 | 22 | #define SIR_MALLOC(ctx, size) custom_alloc(ctx, size) 23 | #define SIR_FREE(ctx, mem) custom_free(ctx, mem) 24 | #define SIR_REALLOC(ctx, mem, size) custom_realloc(ctx, mem, size) 25 | 26 | #define SIMPLE_INI_READER_IMPLEMENTATION 27 | 28 | #include "../../simple_ini_reader.h" 29 | 30 | void *custom_alloc(AllocatorContext *ctx, size_t size) 31 | { 32 | assert(ctx); 33 | assert(size > 0); 34 | assert(size < ctx->size - ctx->pos); 35 | 36 | void *mem = ctx->mem + ctx->pos; 37 | 38 | ctx->pos += size; 39 | 40 | printf("custom_alloc %3i bytes\n", (int)size); 41 | 42 | return mem; 43 | } 44 | 45 | void *custom_realloc(AllocatorContext *ctx, void *mem, size_t size) 46 | { 47 | void *new_mem = custom_alloc(ctx, size); 48 | 49 | memcpy(new_mem, mem, size); 50 | 51 | return new_mem; 52 | } 53 | 54 | void custom_free(AllocatorContext *ctx, void *mem) 55 | { 56 | return; 57 | } 58 | 59 | int main(int argc, char **argv) 60 | { 61 | AllocatorContext ctx; 62 | ctx.size = 4000000; 63 | ctx.pos = 0; 64 | ctx.mem = malloc(ctx.size); 65 | 66 | SirIni ini = sir_load_from_file("custom_allocator.ini", 0, &ctx); 67 | 68 | if (!ini) // Couldn't malloc the ini struct 69 | return 1; 70 | 71 | if (sir_has_error(ini)) 72 | { 73 | printf("%s\n", ini->error); 74 | return 1; 75 | } 76 | 77 | printf("total bytes used: %i/%i bytes\n", (int)ctx.pos, (int)ctx.size); 78 | 79 | printf("\n"); 80 | 81 | sir_free_ini(ini); 82 | 83 | free(ctx.mem); 84 | 85 | return 0; 86 | } 87 | -------------------------------------------------------------------------------- /samples/custom_allocators/custom_allocator.ini: -------------------------------------------------------------------------------- 1 | ; Simple INI Reader Samples - Custom Allocators 2 | 3 | key1=hello 4 | 5 | [section1] 6 | 7 | key2=world 8 | key3=foo 9 | 10 | [section2] 11 | 12 | key4=bar 13 | key5=baz 14 | 15 | [section3] 16 | 17 | key6=she 18 | key7=sells 19 | key8=sea 20 | key9=shells 21 | key10=on 22 | key11=the 23 | key12=sea 24 | key13=shore 25 | -------------------------------------------------------------------------------- /samples/duplicates/duplicates.c: -------------------------------------------------------------------------------- 1 | // Simple INI Reader Samples - Duplicates 2 | // Author: Sebastian Jones 3 | 4 | #include 5 | 6 | #define SIMPLE_INI_READER_IMPLEMENTATION 7 | #include "../../simple_ini_reader.h" 8 | 9 | int main(int argc, char **argv) 10 | { 11 | printf("\n"); 12 | 13 | SirIni ini = sir_load_from_file("duplicates.ini", 0, 0); 14 | 15 | if (!ini) // Couldn't malloc the ini struct 16 | return 1; 17 | 18 | if (sir_has_error(ini)) 19 | { 20 | printf("%s\n", ini->error); 21 | return 1; 22 | } 23 | 24 | // By Default, if a key is found to have the same name as a previous 25 | // key in the same section, it is ignored. 26 | const char *str = sir_section_str(ini, "section1", "key"); 27 | printf("This should be 'foo': '%s'\n", str); 28 | 29 | // Keys can have the same name as keys in other sections... 30 | str = sir_section_str(ini, "section2", "key"); 31 | printf("This should be 'hello world': '%s'\n", str); 32 | 33 | // ...Unless you are searching through all the keys, in which case 34 | // the duplicate keys are ignored like above. 35 | str = sir_str(ini, "key"); 36 | printf("This should be 'foo': '%s'\n", str); 37 | 38 | sir_free_ini(ini); 39 | 40 | printf("\n"); 41 | 42 | // You can also specify an option to change the behaviour to override 43 | // previous values when duplicates are found: 44 | ini = sir_load_from_file("duplicates.ini", 45 | SIR_OPTION_OVERRIDE_DUPLICATE_KEYS, 0); 46 | 47 | if (!ini) // Couldn't malloc the ini struct 48 | return 1; 49 | 50 | if (sir_has_error(ini)) 51 | { 52 | printf("%s\n", ini->error); 53 | return 1; 54 | } 55 | 56 | str = sir_section_str(ini, "section1", "key"); 57 | printf("This should be 'bar': '%s'\n", str); 58 | 59 | // Like above, this only applies to keys in the same section unless 60 | // you are searching through all keys 61 | str = sir_str(ini, "key"); 62 | printf("This should be 'hello world': '%s'\n", str); 63 | 64 | sir_free_ini(ini); 65 | 66 | printf("\n"); 67 | 68 | return 0; 69 | } 70 | -------------------------------------------------------------------------------- /samples/duplicates/duplicates.ini: -------------------------------------------------------------------------------- 1 | ; Simple INI Reader Samples - Duplicates 2 | 3 | [section1] 4 | 5 | key = foo 6 | key = bar 7 | 8 | [section2] 9 | 10 | key = hello world 11 | -------------------------------------------------------------------------------- /samples/iterating/iterating.c: -------------------------------------------------------------------------------- 1 | // Simple INI Reader Samples - Iterating 2 | // Author: Sebastian Jones 3 | 4 | #include 5 | 6 | #define SIMPLE_INI_READER_IMPLEMENTATION 7 | #include "../../simple_ini_reader.h" 8 | 9 | int main(int argc, char **argv) 10 | { 11 | SirIni ini = sir_load_from_file("iterating.ini", 0, 0); 12 | 13 | if (!ini) // Couldn't malloc the ini struct 14 | return 1; 15 | 16 | if (sir_has_error(ini)) 17 | { 18 | printf("%s\n", ini->error); 19 | return 1; 20 | } 21 | 22 | // Key names and values are stored in parrallel arrays and can be 23 | // iterated over trivially: 24 | printf("\nKEY NAMES:\n"); 25 | for (int i = 0; i < ini->key_count; ++i) 26 | printf("%s\n", ini->key_names[i]); 27 | 28 | printf("\nKEY VALUES:\n"); 29 | for (int i = 0; i < ini->key_count; ++i) 30 | printf("%s\n", ini->key_values[i]); 31 | 32 | // You can also get arrays containing the key names and values from 33 | // a specific section. Note that these functions use malloc due 34 | // to how the keys and sections are stored internally. 35 | int size; 36 | const char **names = sir_section_key_names(ini, "section1", &size); 37 | 38 | printf("\nSECTION 1 KEY NAMES\n"); 39 | for (int i = 0; i < size; ++i) 40 | printf("%s\n", names[i]); 41 | 42 | const char **values = sir_section_key_values(ini, "section2", &size); 43 | 44 | printf("\nSECTION 2 KEY VALUES\n"); 45 | for (int i = 0; i < size; ++i) 46 | printf("%s\n", values[i]); 47 | 48 | // Don't forget to free them! 49 | sir_free(ini, names); 50 | sir_free(ini, values); 51 | 52 | sir_free_ini(ini); 53 | 54 | return 0; 55 | } 56 | -------------------------------------------------------------------------------- /samples/iterating/iterating.ini: -------------------------------------------------------------------------------- 1 | ; Simple INI Reader Samples - Iterating 2 | 3 | key1 = hello 4 | 5 | [section1] 6 | 7 | key2 = world! 8 | 9 | key3 = foo 10 | 11 | [section2] 12 | 13 | key4 = bar 14 | 15 | key5 = baz 16 | -------------------------------------------------------------------------------- /samples/warnings/warnings.c: -------------------------------------------------------------------------------- 1 | // Simple INI Reader Samples - Warnings 2 | // Author: Sebastian Jones 3 | 4 | #include 5 | 6 | #define SIMPLE_INI_READER_IMPLEMENTATION 7 | #include "../../simple_ini_reader.h" 8 | 9 | int main(int argc, char **argv) 10 | { 11 | SirIni ini = sir_load_from_file("warnings.ini", 0, 0); 12 | 13 | if (!ini) // Couldn't malloc the ini struct 14 | return 1; 15 | 16 | if (sir_has_error(ini)) 17 | { 18 | printf("%s\n", ini->error); 19 | return 1; 20 | } 21 | 22 | for (int i = 0; i < ini->warnings_count; ++i) 23 | printf("%s\n", ini->warnings[i]); 24 | 25 | sir_free_ini(ini); 26 | 27 | return 0; 28 | } 29 | -------------------------------------------------------------------------------- /samples/warnings/warnings.ini: -------------------------------------------------------------------------------- 1 | ; Simple INI Reader Samples - Warnings 2 | 3 | key = [ section1 ] 4 | 5 | key1 6 | 7 | [section2] 8 | 9 | key2 = 4788 10 | 11 | [section3=] 12 | key3 = 3.14 13 | 14 | [section4 15 | ] 16 | key4 = True 17 | -------------------------------------------------------------------------------- /simple_ini_reader.h: -------------------------------------------------------------------------------- 1 | // Public Domain, single-file INI reader using only the C Standard Library. 2 | // Author: Sebastian Jones (http://www.sebj.co.uk) 3 | // 4 | // Features 5 | // ======== 6 | // 7 | // Currently Supported: 8 | // - Keys using '=' and ':' 9 | // - Comments using ';' and '#', anywhere on a line 10 | // - Double-quotes to preserve whitespace 11 | // - Reading values as string 12 | // - Converting values to long, unsigned long, double or bool. 13 | // - Converting values to an array of strings, splitting by comma (,). 14 | // - Optional case-insensitivity 15 | // - Options to ignore or override keys with duplicated names 16 | // - Optional warnings to detect probable mistakes in an INI 17 | // - Optional errors 18 | // - Customizable malloc, realloc, free 19 | // 20 | // Currently NOT Supported: 21 | // - Ignoring newlines with '\' 22 | // - Programmatic interpretation of sub-sections/nested sections. You 23 | // can make the illusion of sub-sections by indenting with white- 24 | // space or using a name like [A.B.C] but the parser interprets all 25 | // sections as being on the same level. 26 | // 27 | // UNTESTED, but might work: 28 | // - Unicode 29 | // - Thread-safety. Loading different files in seperate threads should 30 | // be okay in theory, because none of these functions are meant to 31 | // touch any outside state other than their ini pointer parameter. 32 | // - Files bigger than 2GB. Currently we use the 'fseek(END), ftell()' 33 | // trick to get the file size and we use ints to store array sizes most of 34 | // the time. But if you have an INI file bigger than 2GB you might want 35 | // to think about choosing a more appropriate file format. 36 | // 37 | // Terminology 38 | // =========== 39 | // 40 | // This library describes INI files in terms of sections and keys. Sections are 41 | // surrounded by square brackets, e.g.: 42 | // 43 | // [ graphics ] 44 | // 45 | // Keys have a name and a value, delimited by an equals sign (=) or a 46 | // colon (:). You may not have more than one key per line. e.g.: 47 | // 48 | // window_width = 1920 49 | // window_height:1080 50 | // 51 | // Surrounding whitespace is trimmed by default. Key values may be surrounded 52 | // by double-quotes ("") to preserve whitespace. 53 | // 54 | // Comments can be placed anywhere on a line using semi-colon (;) or 55 | // hash (#), e.g.: 56 | // 57 | // ; this is a comment 58 | // window_height = 1080 #this comment is also okay 59 | // 60 | // Any keys define before a section has been defined are said to be in the 61 | // 'global' section. e.g: 62 | // 63 | // this_key=is_global 64 | // 65 | // [ this_is_the_first_section ] 66 | // 67 | // this_key=is_not_global 68 | // 69 | // Basic Usage 70 | // =========== 71 | // 72 | // (For detailed examples, please see the 'samples' folder in the repo) 73 | // 74 | // Define SIMPLE_INI_READER_IMPLEMENTATION in one of your c/c++ files before 75 | // including simple_ini_reader.h, e.g: 76 | // 77 | // #define SIMPLE_INI_READER_IMPLEMENTATION 78 | // #include "simple_ini_reader.h" 79 | // 80 | // Load an INI file and get values from keys, e.g: 81 | // 82 | // SirIni ini = sir_load_from_file("foo.ini", options, 0); 83 | // 84 | // const char *str = sir_str(ini, "key_name"); 85 | // 86 | // sir_free_ini(ini); 87 | // 88 | // You can also get values from keys belonging to specific sections: 89 | // 90 | // str = sir_section_str(ini, "section_name", "key_name"); 91 | // glob_str = sir_section_str(ini, SIR_GLOBAL_SECTION_NAME, "key_name"); 92 | // 93 | // There are some conversion functions for primitive types. All have the same 94 | // parameters: 95 | // 96 | // long l = sir_section_long(ini, "section_name", "key_name"); 97 | // unsigned long ul = sir_section_unsigned_long(); 98 | // double d = sir_section_double(); 99 | // char b = sir_section_bool(); 100 | // 101 | // There is also a function that tries to split a string by commas: 102 | // 103 | // int *csv_size; 104 | // const char **csv = sir_csv(ini, "key_name", &csv_size); 105 | // 106 | // sir_free_csv(csv); 107 | // 108 | // Custom Memory Management 109 | // ======================== 110 | // 111 | // You can override the stdlib malloc, realloc and free by defining the 112 | // following macros: 113 | // 114 | // SIR_MALLOC (ctx, size) 115 | // SIR_FREE (ctx, mem) 116 | // SIR_REALLOC(ctx, mem, size) 117 | // 118 | // You can optionally pass a context as a (void *) to one of the load 119 | // functions: 120 | // 121 | // SirIni sir_load_from_str(char *s, SirOptions options, 122 | // const char *name, void *mem_ctx); 123 | // 124 | // SirIni sir_load_from_file(const char *filename, 125 | // SirOptions options, void *mem_ctx); 126 | // 127 | // By default the malloc, realloc and free macros above expand to the 128 | // stdlib functions and thus ignore the mem_ctx. It is purely optional. 129 | 130 | #ifndef SIMPLE_INI_READER_HEADER 131 | #define SIMPLE_INI_READER_HEADER 132 | 133 | #include 134 | #include 135 | #include 136 | #include 137 | #include 138 | #include 139 | 140 | typedef enum SirOptions 141 | { 142 | SIR_OPTION_NONE = 0x000, 143 | 144 | // Key values that start with a null terminator '\0' are considered empty 145 | SIR_OPTION_IGNORE_EMPTY_VALUES = 0x001, 146 | 147 | // See the 'duplicates' sample for an example of using this 148 | SIR_OPTION_OVERRIDE_DUPLICATE_KEYS = 0x002, 149 | 150 | // Double quotes will be part of the value, rather than being parsed out 151 | SIR_OPTION_DISABLE_QUOTES = 0x004, 152 | 153 | // Only ';' will denote a comment 154 | SIR_OPTION_DISABLE_HASH_COMMENTS = 0x008, 155 | 156 | // Only '=' will be used to seperate key names and values 157 | SIR_OPTION_DISABLE_COLON_ASSIGNMENT = 0x010, 158 | 159 | // A line will only be a comment if '\n' is directly before the comment 160 | SIR_OPTION_DISABLE_COMMENT_ANYWHERE = 0x020, 161 | 162 | // Both section names and key names and values will be case-insensitive 163 | SIR_OPTION_DISABLE_CASE_SENSITIVITY = 0x040, 164 | 165 | // Will save a small amount of memory and may improve performance 166 | SIR_OPTION_DISABLE_ERRORS = 0x080, 167 | 168 | // Disabling warnings may improve performance since an extra pass over 169 | // the string is done to detect warnings, and each warning string is 170 | // 512 bytes by default 171 | SIR_OPTION_DISABLE_WARNINGS = 0x100, 172 | } 173 | SirOptions; 174 | 175 | typedef struct SirSectionRange 176 | { 177 | int start; 178 | int end; 179 | } 180 | SirSectionRange; 181 | 182 | typedef struct SirSection 183 | { 184 | SirSectionRange *ranges; 185 | int ranges_count; 186 | } 187 | SirSection; 188 | 189 | typedef struct SirIniStruct 190 | { 191 | void *mem_ctx; 192 | char *data; 193 | SirSection *sections; 194 | const char **section_names; 195 | const char **key_names; 196 | const char **key_values; 197 | const char *filename; 198 | char *error; 199 | char *error_msg; 200 | const char **warnings; 201 | int section_count; 202 | int key_count; 203 | SirOptions options; 204 | int error_size; 205 | int warnings_count; 206 | int warnings_size; 207 | } 208 | SirIniStruct; 209 | 210 | typedef SirIniStruct * SirIni; 211 | 212 | #ifdef SIR_STATIC 213 | #define SIRDEF static 214 | #else 215 | #define SIRDEF extern 216 | #endif 217 | 218 | // 219 | // 'PUBLIC' FUNCTIONS 220 | // ================== 221 | 222 | // Parse the given string as an INI file. Note that this will modify the 223 | // string 's'. 'options' should be one or more of the SIR_OPTIONS_ defined in 224 | // enum SirOptions bitwise-OR'd together, or 0. 'name' is optional and is used 225 | // when making warnings and errors. 'mem_ctx' is optional and only relevant 226 | // if you use custom memory allocation. 227 | SIRDEF SirIni sir_load_from_str(char *s, SirOptions options, 228 | const char *name, void *mem_ctx); 229 | 230 | // Same as sir_load_from_str(), except that 'filename' is the name of a file 231 | // that will be loaded using stdio functions. 232 | SIRDEF SirIni sir_load_from_file(const char *filename, SirOptions options, 233 | void *mem_ctx); 234 | 235 | // Frees the given ini. 236 | SIRDEF void sir_free_ini(SirIni ini); 237 | 238 | // Retrieves the value of the key 'key_name' in the section 'section_name' as 239 | // a (const char *). 240 | SIRDEF const char *sir_section_str(SirIni ini, const char *section_name, 241 | const char *key_name); 242 | 243 | // Retrieves the value of the key 'key_name' in the section 'section_name' and 244 | // converts it to a long using strtol() 245 | SIRDEF long sir_section_long(SirIni ini, const char *section_name, 246 | const char *key_name); 247 | 248 | // Retrieves the value of the key 'key_name' in the section 'section_name' and 249 | // converts it to a unsigned long using strtoul() 250 | SIRDEF long sir_section_unsigned_long(SirIni ini, const char *section_name, 251 | const char *key_name); 252 | 253 | // Retrieves the value of the key 'key_name' in the section 'section_name' and 254 | // converts it to a double using strtod() 255 | SIRDEF double sir_section_double(SirIni ini, const char *section_name, 256 | const char *key_name); 257 | 258 | // Retrieves the value of the key 'key_name' in the section 'section_name' and 259 | // converts it to 1 if it is non-zero or the string 'true', or 0 if it is zero 260 | // or the string 'false'. Returns -1 if the string couldn't be interpreted in 261 | // one of these ways. Always case-insensitive. 262 | SIRDEF char sir_section_bool(SirIni ini, const char *section_name, 263 | const char *key_name); 264 | 265 | // Retrieves the value of the key 'key_name' in the section 'section_name' and 266 | // converts it to an array of (const char *) by splitting the string at every 267 | // ',' character. The size of the resulting array is stored in the location 268 | // pointed to by 'csv_size_ret'. Note that this function performs a memory 269 | // allocation. 270 | SIRDEF const char **sir_section_csv(const SirIni ini, 271 | const char *section_name, const char *key_name, int *csv_size_ret); 272 | 273 | // Frees a CSV that was returned by the above function. 274 | SIRDEF void sir_free_csv(SirIni ini, const char **csv); 275 | 276 | // Returns an array of all the key names that belong in the section 277 | // 'section_name'. The size of the resulting array is stored in the location 278 | // pointed to by 'values_size_ret'. Note that this function performs a 279 | // memory allocation. 280 | SIRDEF const char **sir_section_key_names(SirIni ini, 281 | const char *section_name, int *names_size_ret); 282 | 283 | // Returns an array of all the key values that belong in the section 284 | // 'section_name'. The size of the resulting array is stored in the location 285 | // pointed to by 'values_size_ret'. Note that this function performs a 286 | // memory allocation. 287 | SIRDEF const char **sir_section_key_values(SirIni ini, 288 | const char *section_name, int *values_size_ret); 289 | 290 | // Used to free the arrays given by sir_section_key_names() and 291 | // sir_section_key_values(). This is simply wrapper for the SIR_FREE() 292 | // macro, but is required to give the macro the memory context. 293 | SIRDEF void sir_free(SirIni ini, void *mem); 294 | 295 | // Returns 1 if there is an error. SIR Functions will always clear the error 296 | // on success. 297 | SIRDEF char sir_has_error(SirIni ini); 298 | 299 | // These macros can be used to search through all the keys in an INI. 300 | #define sir_str(ini, key_name) sir_section_str(ini, 0, key_name) 301 | 302 | #define sir_long(ini, key_name) sir_section_long(ini, 0, key_name) 303 | 304 | #define sir_unsigned_long(ini, key_name) \ 305 | sir_section_unsigned_long(ini, 0, key_name) 306 | 307 | #define sir_double(ini, key_name) sir_section_double(ini, 0, key_name) 308 | 309 | #define sir_bool(ini, key_name) sir_section_bool(ini, 0, key_name) 310 | 311 | #define sir_csv(ini, key_name, csv_size_ret) \ 312 | sir_section_csv(ini, 0, key_name, csv_size_ret) 313 | 314 | #if !(defined(SIR_MALLOC) && defined(SIR_REALLOC) && defined(SIR_FREE)) 315 | #define SIR_MALLOC(ctx, size) malloc(size) 316 | #define SIR_FREE(ctx, mem) free(mem) 317 | #define SIR_REALLOC(ctx, mem, size) realloc(mem, size) 318 | #endif 319 | 320 | // 321 | // CONFIGURATION MACROS 322 | // ==================== 323 | // 324 | // You can define these macros before including this header to override these. 325 | // 326 | #ifndef SIR_ERROR_STRING_SIZE 327 | #define SIR_ERROR_STRING_SIZE 512 328 | #endif 329 | 330 | #ifndef SIR_WARNING_STRING_SIZE 331 | #define SIR_WARNING_STRING_SIZE 512 332 | #endif 333 | 334 | #ifndef SIR_WARNINGS_SIZE_INCR 335 | #define SIR_WARNINGS_SIZE_INCR 5 336 | #endif 337 | 338 | #ifndef SIR_COMMENT_CHAR 339 | #define SIR_COMMENT_CHAR ';' 340 | #endif 341 | 342 | #ifndef SIR_COMMENT_CHAR_ALT 343 | #define SIR_COMMENT_CHAR_ALT '#' 344 | #endif 345 | 346 | #ifndef SIR_KEY_ASSIGNMENT_CHAR 347 | #define SIR_KEY_ASSIGNMENT_CHAR '=' 348 | #endif 349 | 350 | #ifndef SIR_KEY_ASSIGNMENT_CHAR_ALT 351 | #define SIR_KEY_ASSIGNMENT_CHAR_ALT ':' 352 | #endif 353 | 354 | #ifndef SIR_GLOBAL_SECTION_NAME 355 | #define SIR_GLOBAL_SECTION_NAME "global" 356 | #endif 357 | 358 | // 'PRIVATE' FUNCTIONS 359 | // =================== 360 | static char sir__to_lowercase(char c); 361 | static char sir__str_equal_case(const char *s1, 362 | const char *s2, char case_insensitive); 363 | static char sir__str_equal(const SirIni ini, const char *s1, const char *s2); 364 | static char sir__is_comment_char(const SirIni ini, char c); 365 | static char sir__is_assignment_char(const SirIni ini, char c); 366 | static int sir__skip_whitespace(const char *str); 367 | static char *sir__trim_whitespace(char *str); 368 | static int sir__skip_to_char(const char *str, char c); 369 | static int sir__parse_to_char(char *str, char c, char **parsed_str_ret); 370 | static int sir__parse_to_assignment_char(const SirIni ini, char *str, 371 | char **parsed_str_ret); 372 | static void sir__add_to_char_counts(char c, int *line_number, 373 | int *char_number); 374 | static char sir__warnings_enabled(SirIni ini); 375 | static char sir__errors_enabled(SirIni ini); 376 | static void sir__add_warning(SirIni ini, int line_number, int char_number, 377 | const char *msg); 378 | static void sir__set_error(SirIni ini, const char *format, const char *s1, 379 | const char *s2); 380 | static void sir__clear_error_str(SirIni ini); 381 | static SirIni sir__create_ini(char disable_errors, 382 | char disable_warnings, void *mem_ctx); 383 | SIRDEF SirSection *sir__get_section(SirIni ini, const char *section_name); 384 | static const char **sir__section_key_array(SirIni ini, 385 | const char *section_name, int *size_ret, const char **key_array); 386 | 387 | 388 | // 'PRIVATE' MACROS 389 | // ================ 390 | #define SIR__SECTION_NAME_OPEN_CHAR '[' 391 | #define SIR__SECTION_NAME_CLOSE_CHAR ']' 392 | #define SIR__KEY_END_CHAR '\n' 393 | #define SIR__BOOL_TRUE_STRING "true" 394 | #define SIR__BOOL_FALSE_STRING "false" 395 | #define SIR__INI_NO_FILENAME_STRING "ini" 396 | 397 | #endif // SIMPLE_INI_READER_HEADER 398 | 399 | 400 | 401 | #ifdef SIMPLE_INI_READER_IMPLEMENTATION 402 | 403 | static char sir__to_lowercase(char c) 404 | { 405 | if (c >= 'a' && c <= 'z') return c - ('a' - 'A'); 406 | else return c; 407 | } 408 | 409 | static char sir__str_equal_case(const char *s1, 410 | const char *s2, char case_insensitive) 411 | { 412 | if (!s1 && !s2) return 1; 413 | else if (!s1 || !s2) return 0; 414 | 415 | char c1, c2; 416 | 417 | while (*s1 && *s2) 418 | { 419 | c1 = *s1; 420 | c2 = *s2; 421 | 422 | if (case_insensitive) 423 | { 424 | c1 = sir__to_lowercase(c1); 425 | c2 = sir__to_lowercase(c2); 426 | } 427 | 428 | if (c1 != c2) return 0; 429 | 430 | ++s1; 431 | ++s2; 432 | } 433 | 434 | if (*s1 == *s2) return 1; 435 | else return 0; 436 | } 437 | 438 | static char sir__str_equal(const SirIni ini, const char *s1, const char *s2) 439 | { 440 | return sir__str_equal_case(s1, s2, 441 | ini->options & SIR_OPTION_DISABLE_CASE_SENSITIVITY); 442 | } 443 | 444 | static char sir__is_comment_char(const SirIni ini, char c) 445 | { 446 | return (c == SIR_COMMENT_CHAR || 447 | (ini && 448 | (!(ini->options & SIR_OPTION_DISABLE_HASH_COMMENTS)) && 449 | c == SIR_COMMENT_CHAR_ALT)); 450 | } 451 | 452 | static char sir__is_assignment_char(const SirIni ini, char c) 453 | { 454 | return (c == SIR_KEY_ASSIGNMENT_CHAR || 455 | (ini && 456 | (!(ini->options & SIR_OPTION_DISABLE_COLON_ASSIGNMENT)) && 457 | c == SIR_KEY_ASSIGNMENT_CHAR_ALT)); 458 | } 459 | 460 | static int sir__skip_whitespace(const char *str) 461 | { 462 | if (!str) return 0; 463 | 464 | int n = 0; 465 | 466 | while (*str && *str <= ' ') 467 | { 468 | ++str; 469 | ++n; 470 | } 471 | 472 | return n; 473 | } 474 | 475 | static char *sir__trim_whitespace(char *str) 476 | { 477 | if (!str) return 0; 478 | 479 | str += sir__skip_whitespace(str); 480 | 481 | size_t i = strlen(str) - 1; 482 | 483 | while (str[i] <= ' ') --i; 484 | 485 | str[i + 1] = '\0'; 486 | 487 | return str; 488 | } 489 | 490 | static int sir__skip_to_char(const char *str, char c) 491 | { 492 | if (!str) return 0; 493 | 494 | int n = 0; 495 | 496 | while (*str && *str != c) 497 | { 498 | ++str; 499 | ++n; 500 | } 501 | 502 | return n; 503 | } 504 | 505 | static int sir__parse_to_char(char *str, char c, char **parsed_str_ret) 506 | { 507 | if (!str) return 0; 508 | 509 | char *start = str; 510 | 511 | int n = sir__skip_to_char(str, c); 512 | 513 | str += n; 514 | 515 | if (parsed_str_ret) *parsed_str_ret = start; 516 | 517 | if (*str == '\0') 518 | { 519 | return -1; 520 | } 521 | else 522 | { 523 | *str = '\0'; 524 | return n; 525 | } 526 | } 527 | 528 | static int sir__parse_to_assignment_char(const SirIni ini, char *str, 529 | char **parsed_str_ret) 530 | { 531 | if (!ini || !str) return 0; 532 | 533 | if (ini->options & SIR_OPTION_DISABLE_COLON_ASSIGNMENT) 534 | { 535 | return sir__parse_to_char(str, SIR_KEY_ASSIGNMENT_CHAR, 536 | parsed_str_ret); 537 | } 538 | else 539 | { 540 | int a = sir__skip_to_char(str, SIR_KEY_ASSIGNMENT_CHAR); 541 | int b = sir__skip_to_char(str, SIR_KEY_ASSIGNMENT_CHAR_ALT); 542 | 543 | if (a < b) 544 | return sir__parse_to_char(str, SIR_KEY_ASSIGNMENT_CHAR, 545 | parsed_str_ret); 546 | else 547 | return sir__parse_to_char(str, SIR_KEY_ASSIGNMENT_CHAR_ALT, 548 | parsed_str_ret); 549 | } 550 | } 551 | 552 | static void sir__add_to_char_counts(char c, int *line_number, 553 | int *char_number) 554 | { 555 | if (c == '\n') 556 | { 557 | if (line_number) *line_number += 1; 558 | if (char_number) *char_number = 1; 559 | } 560 | else 561 | { 562 | if (char_number) *char_number += 1; 563 | } 564 | } 565 | 566 | static char sir__warnings_enabled(SirIni ini) 567 | { 568 | return (!(ini->options & SIR_OPTION_DISABLE_WARNINGS)); 569 | } 570 | 571 | static char sir__errors_enabled(SirIni ini) 572 | { 573 | return (!(ini->options & SIR_OPTION_DISABLE_ERRORS)); 574 | } 575 | 576 | static void sir__add_warning(SirIni ini, int line_number, int char_number, 577 | const char *msg) 578 | { 579 | if (!ini || !msg || !sir__warnings_enabled(ini)) return; 580 | 581 | // An Int can't be more than 10 digits so these sprintfs should be safe 582 | char ln_str[11], cn_str[11]; 583 | 584 | sprintf(ln_str, "%i", line_number); 585 | ln_str[10] = '\0'; 586 | 587 | sprintf(cn_str, "%i", char_number); 588 | cn_str[10] = '\0'; 589 | 590 | char *str = SIR_MALLOC(ini->mem_ctx, SIR_WARNING_STRING_SIZE); 591 | 592 | size_t n = 0; 593 | 594 | int i = 0; 595 | 596 | const char *read = ini->filename; 597 | char *write = str; 598 | char *warning = ": warning: "; 599 | char *colon = ":"; 600 | 601 | while (*read && n < SIR_WARNING_STRING_SIZE - 1) 602 | { 603 | *write++ = *read++; 604 | ++n; 605 | 606 | if (!*read) 607 | { 608 | if (i == 0) 609 | read = colon; 610 | else if (i == 1) 611 | read = ln_str; 612 | else if (i == 2) 613 | read = colon; 614 | else if (i == 3) 615 | read = cn_str; 616 | else if (i == 4) 617 | read = warning; 618 | else if (i == 5) 619 | read = msg; 620 | 621 | ++i; 622 | } 623 | } 624 | 625 | *write = '\0'; 626 | 627 | ini->warnings[ini->warnings_count] = str; 628 | 629 | ++ini->warnings_count; 630 | 631 | if (ini->warnings_count >= ini->warnings_size) 632 | { 633 | ini->warnings_size = ini->warnings_size + 634 | SIR_WARNINGS_SIZE_INCR; 635 | 636 | ini->warnings = SIR_REALLOC(ini->mem_ctx, (void *)ini->warnings, 637 | sizeof(*ini->warnings) * ini->warnings_size); 638 | } 639 | } 640 | 641 | static void sir__set_error(SirIni ini, const char *format, const char *s1, 642 | const char *s2) 643 | { 644 | if (!ini || !format || !sir__errors_enabled(ini)) return; 645 | 646 | size_t size = ini->error_size; 647 | 648 | char *str = ini->error; 649 | 650 | size_t n = 0; 651 | int i = 0; 652 | 653 | while (*format && n < size - 1) 654 | { 655 | if (*format == '%') 656 | { 657 | if ((i == 0 && s1) || (i == 1 && s2)) 658 | { 659 | const char *s = (i == 0) ? s1 : s2; 660 | 661 | while (*s && n < size - 1) 662 | { 663 | *str = *s; 664 | 665 | ++n; 666 | ++s; 667 | ++str; 668 | } 669 | 670 | ++i; 671 | } 672 | } 673 | else 674 | { 675 | *str = *format; 676 | ++n; 677 | ++str; 678 | } 679 | 680 | ++format; 681 | } 682 | 683 | *str = '\0'; 684 | } 685 | 686 | static void sir__clear_error_str(SirIni ini) 687 | { 688 | if (ini && sir__errors_enabled(ini)) 689 | *ini->error = '\0'; 690 | } 691 | 692 | SIRDEF char sir_has_error(SirIni ini) 693 | { 694 | return (ini && sir__errors_enabled(ini) && *ini->error != '\0'); 695 | } 696 | 697 | static SirIni sir__create_ini(char disable_errors, 698 | char disable_warnings, void *mem_ctx) 699 | { 700 | SirIni ini = SIR_MALLOC(mem_ctx, sizeof(*ini)); 701 | 702 | if (!ini) return 0; 703 | 704 | memset(ini, 0, sizeof(*ini)); 705 | 706 | ini->mem_ctx = mem_ctx; 707 | 708 | if (disable_errors) 709 | { 710 | ini->error_size = 0; 711 | ini->error = SIR_MALLOC(ini->mem_ctx, 1); 712 | *ini->error = '\0'; 713 | } 714 | else 715 | { 716 | ini->error_size = SIR_ERROR_STRING_SIZE; 717 | ini->error = SIR_MALLOC(ini->mem_ctx, ini->error_size); 718 | ini->error_msg = SIR_MALLOC(ini->mem_ctx, ini->error_size); 719 | } 720 | 721 | if (disable_warnings) 722 | { 723 | ini->warnings_size = 0; 724 | } 725 | else 726 | { 727 | ini->warnings_size = SIR_WARNINGS_SIZE_INCR; 728 | ini->warnings = SIR_MALLOC(ini->mem_ctx, 729 | sizeof(*ini->warnings) * ini->warnings_size); 730 | } 731 | 732 | return ini; 733 | } 734 | 735 | SIRDEF void sir_free_ini(SirIni ini) 736 | { 737 | if (ini) 738 | { 739 | int i; 740 | 741 | for (i = 0; i < ini->section_count; ++i) 742 | if (ini->sections[i].ranges) 743 | SIR_FREE(ini->mem_ctx, ini->sections[i].ranges); 744 | 745 | for (i = 0; i < ini->warnings_count; ++i) 746 | if (ini->warnings[i]) 747 | SIR_FREE(ini->mem_ctx, (void *)ini->warnings[i]); 748 | 749 | if (ini->data) SIR_FREE(ini->mem_ctx, ini->data); 750 | if (ini->sections) SIR_FREE(ini->mem_ctx, ini->sections); 751 | if (ini->section_names) SIR_FREE(ini->mem_ctx, 752 | (void *)ini->section_names); 753 | if (ini->key_names) SIR_FREE(ini->mem_ctx, (void *)ini->key_names); 754 | if (ini->key_values) SIR_FREE(ini->mem_ctx, 755 | (void *)ini->key_values); 756 | if (ini->filename) SIR_FREE(ini->mem_ctx, (void *)ini->filename); 757 | if (ini->error) SIR_FREE(ini->mem_ctx, ini->error); 758 | if (ini->error_msg) SIR_FREE(ini->mem_ctx, ini->error_msg); 759 | if (ini->warnings) SIR_FREE(ini->mem_ctx, (void *)ini->warnings); 760 | 761 | SIR_FREE(ini->mem_ctx, ini); 762 | } 763 | } 764 | 765 | SIRDEF SirIni sir_load_from_str(char *s, SirOptions options, 766 | const char *name, void *mem_ctx) 767 | { 768 | SirIni ini = sir__create_ini(options & SIR_OPTION_DISABLE_ERRORS, 769 | options & SIR_OPTION_DISABLE_WARNINGS, mem_ctx); 770 | 771 | if (!ini) return 0; 772 | 773 | if (name) 774 | { 775 | ini->filename = SIR_MALLOC(mem_ctx, strlen(name) + 1); 776 | strcpy((char *)ini->filename, name); 777 | } 778 | else 779 | { 780 | ini->filename = SIR_MALLOC(mem_ctx, 781 | strlen(SIR__INI_NO_FILENAME_STRING) + 1); 782 | strcpy((char *)ini->filename, SIR__INI_NO_FILENAME_STRING); 783 | } 784 | 785 | ini->options = options; 786 | ini->data = s; 787 | 788 | // Remove Comments and Count Sections and Keys 789 | ini->section_count = 1; 790 | 791 | char *str = ini->data; 792 | 793 | while (*str) 794 | { 795 | if (sir__is_comment_char(ini, *str)) 796 | { 797 | if (!(ini->options & SIR_OPTION_DISABLE_COMMENT_ANYWHERE) || 798 | (ini->options & SIR_OPTION_DISABLE_COMMENT_ANYWHERE 799 | && (str == ini->data || (str > ini->data && 800 | *(str - 1) == '\n')))) 801 | { 802 | while (*str && *str != '\n') 803 | { 804 | *str = ' '; 805 | ++str; 806 | } 807 | } 808 | } 809 | 810 | if (*str == SIR__SECTION_NAME_OPEN_CHAR) ++ini->section_count; 811 | else if (sir__is_assignment_char(ini, *str)) ++ini->key_count; 812 | 813 | ++str; 814 | } 815 | 816 | // Check for Warnings 817 | if (!(ini->options & SIR_OPTION_DISABLE_WARNINGS)) 818 | { 819 | int line_number = 1; 820 | int char_number = 1; 821 | str = ini->data; 822 | while (*str) 823 | { 824 | // Skip Whitespace 825 | while (*str && *str <= ' ') 826 | { 827 | sir__add_to_char_counts(*str, &line_number, &char_number); 828 | ++str; 829 | } 830 | 831 | if (*str == SIR__SECTION_NAME_OPEN_CHAR) 832 | { 833 | while (*str && *str != SIR__SECTION_NAME_CLOSE_CHAR) 834 | { 835 | if (*str == '\n') 836 | { 837 | sir__add_warning(ini, line_number, char_number, 838 | "Newline found in section name. Did you " 839 | "forget to close the section name with ']'?"); 840 | } 841 | else if (sir__is_assignment_char(ini, *str)) 842 | { 843 | sir__add_warning(ini, line_number, char_number, 844 | "'=' found in section name. Did you " 845 | "forget to close the section name with ']'?"); 846 | } 847 | 848 | sir__add_to_char_counts(*str, &line_number, &char_number); 849 | 850 | ++str; 851 | } 852 | 853 | sir__add_to_char_counts(*str, &line_number, &char_number); 854 | ++str; 855 | } 856 | else 857 | { 858 | while (*str && !sir__is_assignment_char(ini, *str)) 859 | { 860 | if (*str == SIR__SECTION_NAME_OPEN_CHAR) 861 | { 862 | sir__add_warning(ini, line_number, char_number, 863 | "'[' found in key name"); 864 | } 865 | else if (*str == SIR__SECTION_NAME_CLOSE_CHAR) 866 | { 867 | sir__add_warning(ini, line_number, char_number, 868 | "']' found in key name"); 869 | } 870 | 871 | sir__add_to_char_counts(*str, &line_number, &char_number); 872 | 873 | ++str; 874 | } 875 | 876 | sir__add_to_char_counts(*str, &line_number, &char_number); 877 | ++str; 878 | 879 | while (*str && *str != SIR__KEY_END_CHAR) 880 | { 881 | if (*str == SIR__SECTION_NAME_OPEN_CHAR) 882 | { 883 | sir__add_warning(ini, line_number, char_number, 884 | "'[' found in key value"); 885 | } 886 | else if (*str == SIR__SECTION_NAME_CLOSE_CHAR) 887 | { 888 | sir__add_warning(ini, line_number, char_number, 889 | "']' found in key value"); 890 | } 891 | 892 | sir__add_to_char_counts(*str, &line_number, &char_number); 893 | 894 | ++str; 895 | } 896 | 897 | sir__add_to_char_counts(*str, &line_number, &char_number); 898 | ++str; 899 | } 900 | } 901 | } 902 | 903 | // Parse 904 | str = ini->data; 905 | 906 | ini->sections = SIR_MALLOC(mem_ctx, 907 | sizeof(*ini->sections) * ini->section_count); 908 | ini->section_names = SIR_MALLOC(mem_ctx, 909 | sizeof(*ini->section_names) * ini->section_count); 910 | ini->key_names = SIR_MALLOC(mem_ctx, 911 | sizeof(*ini->key_names) * ini->key_count); 912 | ini->key_values = SIR_MALLOC(mem_ctx, 913 | sizeof(*ini->key_values) * ini->key_count); 914 | 915 | memset(ini->sections, 0, 916 | sizeof(*ini->sections) * ini->section_count); 917 | memset((void *)ini->section_names, 0, 918 | sizeof(*ini->section_names) * ini->section_count); 919 | memset((void *)ini->key_names, 0, 920 | sizeof(*ini->key_names) * ini->key_count); 921 | memset((void *)ini->key_values, 0, 922 | sizeof(*ini->key_values) * ini->key_count); 923 | 924 | for (int i = 0; i < ini->section_count; ++i) 925 | { 926 | ini->sections[i].ranges_count = 1; 927 | ini->sections[i].ranges = SIR_MALLOC(mem_ctx, 928 | sizeof(*ini->sections[i].ranges) * 929 | ini->sections[i].ranges_count); 930 | } 931 | 932 | ini->sections[0].ranges[0].start = 0; 933 | ini->section_names[0] = SIR_GLOBAL_SECTION_NAME; 934 | 935 | int prev_index = 0; 936 | int section_index = 0; 937 | int key_index = 0; 938 | 939 | while (*str) 940 | { 941 | str += sir__skip_whitespace(str); 942 | 943 | // Section 944 | if (*str == SIR__SECTION_NAME_OPEN_CHAR) 945 | { 946 | char *section_name; 947 | 948 | int range_index = ini->sections[prev_index].ranges_count - 1; 949 | 950 | ini->sections[prev_index].ranges[range_index].end = key_index; 951 | 952 | ++str; 953 | 954 | int n = sir__parse_to_char(str, SIR__SECTION_NAME_CLOSE_CHAR, 955 | §ion_name); 956 | 957 | section_name = sir__trim_whitespace(section_name); 958 | 959 | // Check for Duplicates 960 | int duplicate = -1; 961 | { 962 | for (int i = 0; i < section_index + 1; ++i) 963 | { 964 | if (sir__str_equal(ini, 965 | ini->section_names[i], section_name)) 966 | { 967 | duplicate = i; 968 | break; 969 | } 970 | } 971 | } 972 | 973 | if (duplicate != -1) 974 | { 975 | if (duplicate != prev_index) 976 | { 977 | ++ini->sections[duplicate].ranges_count; 978 | 979 | ini->sections[duplicate].ranges = 980 | SIR_REALLOC(mem_ctx, 981 | ini->sections[duplicate].ranges, 982 | sizeof(*ini->sections[duplicate].ranges) * 983 | ini->sections[duplicate].ranges_count); 984 | 985 | range_index = ini->sections[duplicate].ranges_count - 1; 986 | 987 | ini->sections[duplicate].ranges[range_index].start = 988 | key_index; 989 | } 990 | 991 | prev_index = duplicate; 992 | } 993 | else 994 | { 995 | ++section_index; 996 | prev_index = section_index; 997 | 998 | ini->sections[section_index].ranges[0].start = key_index; 999 | ini->section_names[section_index] = section_name; 1000 | } 1001 | 1002 | if (n == -1) 1003 | break; 1004 | else 1005 | str += n + 1; 1006 | } 1007 | // Key 1008 | else if (*str) 1009 | { 1010 | char *key_name; 1011 | char *key_value; 1012 | 1013 | // Parse Name 1014 | int n = sir__parse_to_assignment_char(ini, str, &key_name); 1015 | 1016 | key_name = sir__trim_whitespace(key_name); 1017 | 1018 | // Check for Duplicate Name (-1 means no duplicate) 1019 | int duplicate = -1; 1020 | { 1021 | SirSection *section = &ini->sections[section_index]; 1022 | int end = 0; 1023 | int start = 0; 1024 | 1025 | for (int i = 0; i < section->ranges_count; ++i) 1026 | { 1027 | if (i < section->ranges_count - 1) 1028 | end = section->ranges[i].end; 1029 | else 1030 | end = key_index; 1031 | 1032 | start = section->ranges[i].start; 1033 | 1034 | for (int j = start; j < end; ++j) 1035 | { 1036 | if (sir__str_equal(ini, ini->key_names[j], key_name)) 1037 | { 1038 | duplicate = j; 1039 | break; 1040 | } 1041 | } 1042 | } 1043 | } 1044 | 1045 | // Parse Value 1046 | if (n != -1) 1047 | { 1048 | str += n + 1; 1049 | 1050 | char quoted = 0; 1051 | 1052 | if (!(ini->options & SIR_OPTION_DISABLE_QUOTES)) 1053 | { 1054 | char *quoted_str = str; 1055 | while (*quoted_str && *quoted_str != SIR__KEY_END_CHAR) 1056 | { 1057 | if (*quoted_str == '\"') 1058 | { 1059 | quoted = 1; 1060 | break; 1061 | } 1062 | 1063 | ++quoted_str; 1064 | } 1065 | } 1066 | 1067 | if (quoted) 1068 | { 1069 | str += sir__skip_to_char(str, '\"') + 1; 1070 | 1071 | str += sir__parse_to_char(str, '\"', &key_value) + 1; 1072 | } 1073 | else 1074 | { 1075 | str += sir__parse_to_char(str, SIR__KEY_END_CHAR, 1076 | &key_value) + 1; 1077 | 1078 | key_value = sir__trim_whitespace(key_value); 1079 | } 1080 | } 1081 | else 1082 | { 1083 | key_value = ""; 1084 | } 1085 | 1086 | // Apply Value to Name 1087 | if (!(*key_value == '\0' && 1088 | ini->options & SIR_OPTION_IGNORE_EMPTY_VALUES)) 1089 | { 1090 | if (duplicate != -1) 1091 | { 1092 | if (ini->options & 1093 | SIR_OPTION_OVERRIDE_DUPLICATE_KEYS) 1094 | { 1095 | ini->key_values[duplicate] = key_value; 1096 | } 1097 | } 1098 | else 1099 | { 1100 | 1101 | ini->key_names[key_index] = key_name; 1102 | ini->key_values[key_index] = key_value; 1103 | 1104 | ++key_index; 1105 | } 1106 | } 1107 | 1108 | if (n == -1) break; 1109 | } 1110 | } 1111 | 1112 | ini->sections[prev_index].ranges[ 1113 | ini->sections[prev_index].ranges_count - 1].end = key_index; 1114 | 1115 | // Shrink if necessary 1116 | if (section_index + 1 < ini->section_count) 1117 | { 1118 | ini->section_count = section_index + 1; 1119 | 1120 | ini->sections = SIR_REALLOC(mem_ctx, (void *)ini->sections, 1121 | sizeof(*ini->sections) * ini->section_count); 1122 | ini->section_names = SIR_REALLOC(mem_ctx, 1123 | (void *)ini->section_names, 1124 | sizeof(*ini->section_names) * ini->section_count); 1125 | } 1126 | 1127 | if (key_index < ini->key_count) 1128 | { 1129 | ini->key_count = key_index; 1130 | 1131 | ini->key_names = SIR_REALLOC(mem_ctx, (void *)ini->key_names, 1132 | sizeof(*ini->key_names) * ini->key_count); 1133 | ini->key_values = SIR_REALLOC(mem_ctx, (void *)ini->key_values, 1134 | sizeof(*ini->key_values) * ini->key_count); 1135 | } 1136 | 1137 | sir__clear_error_str(ini); 1138 | 1139 | return ini; 1140 | 1141 | } 1142 | 1143 | SIRDEF SirIni sir_load_from_file(const char *filename, 1144 | SirOptions options, void *mem_ctx) 1145 | { 1146 | // create a temporary ini file in case of errors 1147 | SirIni ini = sir__create_ini(0, 0, mem_ctx); 1148 | 1149 | ini->filename = SIR_MALLOC(mem_ctx, strlen(filename) + 1); 1150 | strcpy((char *)ini->filename, filename); 1151 | 1152 | // Load Entire File 1153 | FILE *file = fopen(filename, "r"); 1154 | 1155 | if (!file) 1156 | { 1157 | sir__set_error(ini, strerror(errno), 0, 0); 1158 | return ini; 1159 | } 1160 | 1161 | if (fseek(file, 0, SEEK_END) == -1) 1162 | { 1163 | fclose(file); 1164 | sir__set_error(ini, strerror(errno), 0, 0); 1165 | return ini; 1166 | } 1167 | 1168 | long size = ftell(file); 1169 | if (size == -1L) 1170 | { 1171 | fclose(file); 1172 | sir__set_error(ini, strerror(errno), 0, 0); 1173 | return ini; 1174 | } 1175 | 1176 | rewind(file); 1177 | 1178 | char *data = SIR_MALLOC(mem_ctx, size + 1); 1179 | if (!data) 1180 | { 1181 | fclose(file); 1182 | sir__set_error(ini, "SIR_MALLOC failed", 0, 0); 1183 | return ini; 1184 | } 1185 | 1186 | size_t bytes_read = fread(data, 1, size, file); 1187 | if (ferror(file)) 1188 | { 1189 | SIR_FREE(mem_ctx, data); 1190 | fclose(file); 1191 | sir__set_error(ini, strerror(errno), 0, 0); 1192 | return ini; 1193 | } 1194 | 1195 | if (bytes_read < (size_t)size) 1196 | { 1197 | size = bytes_read; 1198 | data = SIR_REALLOC(mem_ctx, data, size + 1); 1199 | 1200 | if (!data) 1201 | { 1202 | fclose(file); 1203 | sir__set_error(ini, strerror(errno), 0, 0); 1204 | return ini; 1205 | } 1206 | } 1207 | 1208 | fclose(file); 1209 | 1210 | data[size] = '\0'; 1211 | 1212 | sir_free_ini(ini); 1213 | 1214 | return sir_load_from_str(data, options, filename, mem_ctx); 1215 | } 1216 | 1217 | SIRDEF SirSection *sir__get_section(SirIni ini, const char *section_name) 1218 | { 1219 | if (!ini) return 0; 1220 | 1221 | if (!section_name) 1222 | { 1223 | sir__set_error(ini, 1224 | "the parameter 'section_name' is not optional", 0, 0); 1225 | return 0; 1226 | } 1227 | 1228 | for (int i = 0; i < ini->section_count; ++i) 1229 | { 1230 | if (ini->section_names[i] && 1231 | sir__str_equal(ini, ini->section_names[i], section_name)) 1232 | { 1233 | sir__clear_error_str(ini); 1234 | return &ini->sections[i]; 1235 | } 1236 | } 1237 | 1238 | sir__set_error(ini, "section '%' not found", section_name, 0); 1239 | return 0; 1240 | } 1241 | 1242 | static const char **sir__section_key_array(SirIni ini, 1243 | const char *section_name, int *size_ret, const char **key_array) 1244 | { 1245 | if (!ini) return 0; 1246 | 1247 | if (!section_name) 1248 | { 1249 | sir__set_error(ini, 1250 | "the parameter 'section_name' is not optional", 0, 0); 1251 | return 0; 1252 | } 1253 | 1254 | SirSection *section = sir__get_section(ini, section_name); 1255 | 1256 | if (sir_has_error(ini)) 1257 | return 0; 1258 | 1259 | int i; 1260 | int key_count = 0; 1261 | for (i = 0; i < section->ranges_count; ++i) 1262 | { 1263 | key_count += section->ranges[i].end - section->ranges[i].start; 1264 | } 1265 | 1266 | const char **array = SIR_MALLOC(ini->mem_ctx, 1267 | sizeof(*array) * key_count); 1268 | 1269 | int index = 0; 1270 | 1271 | for (i = 0; i < section->ranges_count; ++i) 1272 | { 1273 | int start = section->ranges[i].start; 1274 | int end = section->ranges[i].end; 1275 | 1276 | for (int j = start; j < end; ++j) 1277 | { 1278 | array[index] = key_array[j]; 1279 | ++index; 1280 | } 1281 | } 1282 | 1283 | if (size_ret) *size_ret = key_count; 1284 | 1285 | sir__clear_error_str(ini); 1286 | 1287 | return array; 1288 | 1289 | } 1290 | 1291 | SIRDEF const char **sir_section_key_names(SirIni ini, 1292 | const char *section_name, int *values_size_ret) 1293 | { 1294 | return sir__section_key_array(ini, section_name, values_size_ret, 1295 | ini->key_names); 1296 | } 1297 | 1298 | SIRDEF const char **sir_section_key_values(SirIni ini, 1299 | const char *section_name, int *values_size_ret) 1300 | { 1301 | return sir__section_key_array(ini, section_name, values_size_ret, 1302 | ini->key_values); 1303 | } 1304 | 1305 | SIRDEF void sir_free(SirIni ini, void *mem) 1306 | { 1307 | SIR_FREE(ini->mem_ctx, (void *)mem); 1308 | } 1309 | 1310 | SIRDEF const char *sir_section_str(SirIni ini, const char *section_name, 1311 | const char *key_name) 1312 | { 1313 | if (!ini) return 0; 1314 | 1315 | if (!key_name) 1316 | { 1317 | sir__set_error(ini, "the parameter 'key_name' is not optional", 1318 | 0, 0); 1319 | return 0; 1320 | } 1321 | 1322 | SirSection *section = 0; 1323 | 1324 | if (section_name) 1325 | { 1326 | section = sir__get_section(ini, section_name); 1327 | 1328 | if (sir_has_error(ini)) 1329 | return 0; 1330 | } 1331 | 1332 | if (section) 1333 | { 1334 | int start; 1335 | int end; 1336 | 1337 | for (int i = 0; i < section->ranges_count; ++i) 1338 | { 1339 | start = section->ranges[i].start; 1340 | end = section->ranges[i].end; 1341 | 1342 | for (int j = start; j < end; ++j) 1343 | { 1344 | if (ini->key_names[j] && sir__str_equal(ini, 1345 | ini->key_names[j], key_name)) 1346 | { 1347 | sir__clear_error_str(ini); 1348 | return ini->key_values[j]; 1349 | } 1350 | } 1351 | } 1352 | 1353 | sir__set_error(ini, "key '%' not found in section '%'", 1354 | key_name, section_name); 1355 | 1356 | return 0; 1357 | } 1358 | else 1359 | { 1360 | const char *key_value = 0; 1361 | 1362 | for (int i = 0; i < ini->key_count; ++i) 1363 | { 1364 | if (ini->key_names[i] && 1365 | sir__str_equal(ini, ini->key_names[i], key_name)) 1366 | { 1367 | if (ini->options & SIR_OPTION_OVERRIDE_DUPLICATE_KEYS) 1368 | { 1369 | key_value = ini->key_values[i]; 1370 | } 1371 | else 1372 | { 1373 | sir__clear_error_str(ini); 1374 | return ini->key_values[i]; 1375 | } 1376 | } 1377 | } 1378 | 1379 | if (key_value) 1380 | { 1381 | sir__clear_error_str(ini); 1382 | return key_value; 1383 | } 1384 | 1385 | sir__set_error(ini, "key '%' not found", key_name, 0); 1386 | return 0; 1387 | } 1388 | } 1389 | 1390 | SIRDEF long sir_section_long(SirIni ini, const char *section_name, 1391 | const char *key_name) 1392 | { 1393 | const char *str = sir_section_str(ini, section_name, key_name); 1394 | 1395 | if (sir_has_error(ini) || !str) return 0; 1396 | 1397 | char *endptr; 1398 | 1399 | errno = 0; 1400 | long l = strtol(str, &endptr, 0); 1401 | 1402 | if (errno == ERANGE) 1403 | { 1404 | if (l == LONG_MAX) 1405 | { 1406 | sir__set_error(ini, 1407 | "'%' is more than the maximum value of a long interger.", 1408 | str, 0); 1409 | } 1410 | else if (l == LONG_MIN) 1411 | { 1412 | sir__set_error(ini, 1413 | "'%' is less than the minimum value of a long interger.", 1414 | str, 0); 1415 | } 1416 | else 1417 | { 1418 | sir__set_error(ini, 1419 | "'%' is outside the range of values of a long integer.", 1420 | str, 0); 1421 | } 1422 | 1423 | return 0; 1424 | } 1425 | else if (endptr == str) 1426 | { 1427 | sir__set_error(ini, 1428 | "'%' could not be converted to a long integer.", str, 0); 1429 | return 0; 1430 | } 1431 | else 1432 | { 1433 | return l; 1434 | } 1435 | } 1436 | 1437 | SIRDEF long sir_section_unsigned_long(SirIni ini, const char *section_name, 1438 | const char *key_name) 1439 | { 1440 | const char *str = sir_section_str(ini, section_name, key_name); 1441 | 1442 | if (sir_has_error(ini) || !str) return 0; 1443 | 1444 | char *endptr; 1445 | 1446 | errno = 0; 1447 | unsigned long ul = strtoul(str, &endptr, 0); 1448 | 1449 | if (errno == ERANGE) 1450 | { 1451 | sir__set_error(ini, 1452 | "'%' is outside the range of values of an unsigned long" 1453 | " integer.", str, 0); 1454 | 1455 | return 0; 1456 | } 1457 | else if (endptr == str) 1458 | { 1459 | sir__set_error(ini, 1460 | "'%' could not be converted to an unsigned long integer.", 1461 | str, 0); 1462 | return 0; 1463 | } 1464 | else 1465 | { 1466 | return ul; 1467 | } 1468 | } 1469 | 1470 | SIRDEF double sir_section_double(SirIni ini, const char *section_name, 1471 | const char *key_name) 1472 | { 1473 | const char *str = sir_section_str(ini, section_name, key_name); 1474 | 1475 | if (sir_has_error(ini) || !str) return 0; 1476 | 1477 | char *endptr; 1478 | 1479 | errno = 0; 1480 | double d = strtod(str, &endptr); 1481 | 1482 | if (errno == ERANGE) 1483 | { 1484 | if (d == HUGE_VAL) 1485 | { 1486 | sir__set_error(ini, 1487 | "'%' is more than the maximum value of a double.", 1488 | str, 0); 1489 | } 1490 | else if (d == -HUGE_VAL) 1491 | { 1492 | sir__set_error(ini, 1493 | "'%' is less than the minimum value of a double.", 1494 | str, 0); 1495 | } 1496 | else 1497 | { 1498 | sir__set_error(ini, 1499 | "'%' is outside the range of values of a double.", 1500 | str, 0); 1501 | } 1502 | 1503 | return 0; 1504 | } 1505 | else if (endptr == str) 1506 | { 1507 | sir__set_error(ini, 1508 | "'%' could not be converted to a double.", str, 0); 1509 | return 0; 1510 | } 1511 | else 1512 | { 1513 | return d; 1514 | } 1515 | } 1516 | 1517 | SIRDEF char sir_section_bool(SirIni ini, const char *section_name, 1518 | const char *key_name) 1519 | { 1520 | long l = sir_section_long(ini, section_name, key_name); 1521 | 1522 | if (!sir_has_error(ini)) 1523 | { 1524 | if (l) return 1; 1525 | else return 0; 1526 | } 1527 | 1528 | const char *str = sir_section_str(ini, section_name, key_name); 1529 | 1530 | if (sir_has_error(ini) || !str) return -1; 1531 | 1532 | str += sir__skip_whitespace(str); 1533 | 1534 | char s[6]; 1535 | size_t len; 1536 | 1537 | len = strlen(SIR__BOOL_TRUE_STRING); 1538 | strncpy(s, str, len); 1539 | s[len] = '\0'; 1540 | 1541 | if (sir__str_equal_case(s, SIR__BOOL_TRUE_STRING, 1)) return 1; 1542 | 1543 | len = strlen(SIR__BOOL_FALSE_STRING); 1544 | strncpy(s, str, len); 1545 | s[len] = '\0'; 1546 | 1547 | if (sir__str_equal_case(s, SIR__BOOL_FALSE_STRING, 1)) return 0; 1548 | 1549 | sir__set_error(ini, "could not parse '%' as a bool", str, 0); 1550 | return -1; 1551 | } 1552 | 1553 | SIRDEF const char **sir_section_csv(const SirIni ini, 1554 | const char *section_name, const char *key_name, int *csv_size_ret) 1555 | { 1556 | const char *str = sir_section_str(ini, section_name, key_name); 1557 | 1558 | if (sir_has_error(ini) || !str) 1559 | return 0; 1560 | 1561 | str += sir__skip_whitespace(str); 1562 | 1563 | char *s = SIR_MALLOC(ini->mem_ctx, strlen(str) + 1); 1564 | strcpy(s, str); 1565 | 1566 | s = sir__trim_whitespace(s); 1567 | 1568 | int csv_size = 1; 1569 | 1570 | int i; 1571 | for (i = 0; s[i]; ++i) 1572 | if (s[i] == ',') 1573 | ++csv_size; 1574 | 1575 | const char **csv = SIR_MALLOC(ini->mem_ctx, sizeof(*csv) * csv_size); 1576 | 1577 | char *start = s; 1578 | char *end = s; 1579 | 1580 | i = 0; 1581 | while (i < csv_size) 1582 | { 1583 | start += sir__skip_whitespace(start); 1584 | 1585 | csv[i] = (const char *)start; 1586 | 1587 | while (*end && *end != ',') ++end; 1588 | 1589 | *end = '\0'; 1590 | 1591 | ++end; 1592 | start = end; 1593 | 1594 | ++i; 1595 | } 1596 | 1597 | if (csv_size_ret) *csv_size_ret = csv_size; 1598 | 1599 | return csv; 1600 | } 1601 | 1602 | SIRDEF void sir_free_csv(SirIni ini, const char **csv) 1603 | { 1604 | if (ini && csv) 1605 | { 1606 | if (*csv) 1607 | SIR_FREE(ini->mem_ctx, (void *)*csv); 1608 | 1609 | SIR_FREE(ini->mem_ctx, (void *)csv); 1610 | } 1611 | } 1612 | 1613 | #endif // SIMPLE_INI_READER_IMPLEMENTATION 1614 | -------------------------------------------------------------------------------- /tests/test1.ini: -------------------------------------------------------------------------------- 1 | ; Test 1: Basic Functions 2 | key1=hello 3 | [section 1] 4 | key2=world 5 | [section 2] 6 | key3=foo 7 | -------------------------------------------------------------------------------- /tests/test2.ini: -------------------------------------------------------------------------------- 1 | long = 70000000 2 | ulong = 2100000 3 | double = 3.14 4 | bool1 = true 5 | bool2 = FALSE 6 | bool3 = 1 7 | bool4 = 0 8 | bool5 = -87 9 | 10 | [ these_will_fail ] 11 | 12 | long_too_big = 1000000000000000000000000000000000000000000000000000000000000 13 | long_too_small = -1000000000000000000000000000000000000000000000000000000000000 14 | long_no_digits = hello 15 | long_blank = " " 16 | double_blank = " " 17 | double_no_digits = foobar 18 | bool_blank = " " 19 | bool_not_parsable = "world" 20 | -------------------------------------------------------------------------------- /tests/test3.ini: -------------------------------------------------------------------------------- 1 | csv = hello, world, foo, bar 2 | 3 | csv2 = meep 4 | 5 | csv3 = " " 6 | 7 | [ another_section ] 8 | 9 | key=goodbye 10 | -------------------------------------------------------------------------------- /tests/test4.ini: -------------------------------------------------------------------------------- 1 | key0 = 2 | 3 | key1=foo 4 | key1=bar 5 | 6 | [ a_section] 7 | key1=baz 8 | 9 | key2 = "hello" 10 | 11 | #thisisacomment 12 | 13 | [another_section] 14 | 15 | key4:colon 16 | 17 | key5=olleh#commentanywhere 18 | 19 | [final_section] 20 | Key = hello 21 | key = "world" 22 | -------------------------------------------------------------------------------- /tests/test5.ini: -------------------------------------------------------------------------------- 1 | key=[ 2 | key2=] 3 | [ open 4 | = ] 5 | 6 | key 7 | [djfksl] 8 | me = jdlsa 9 | -------------------------------------------------------------------------------- /tests/test6.ini: -------------------------------------------------------------------------------- 1 | [UnrealEd.GeneralSettings] 2 | MinimumEditorViewportSizeX=1280 3 | MinimumEditorViewportSizeY=1024 4 | EnableStylusPressure=True 5 | 6 | [AnimSetViewer] 7 | CheckSingleInfluenceLOD=True 8 | AltWeightMaxBoneCountPerChunk=65 9 | 10 | [UnrealEd.KismetBindings] 11 | Bindings=(Key="O",SeqObjClassName="Engine.SeqVar_Object") 12 | Bindings=(Key="S",SeqObjClassName="Engine.SeqAct_PlaySound") 13 | Bindings=(Key="P",SeqObjClassName="Engine.SeqVar_Player") 14 | Bindings=(Key="I",SeqObjClassName="Engine.SeqVar_Int") 15 | Bindings=(Key="I",bControl=true,SeqObjClassName="Engine.SeqCond_CompareInt") 16 | Bindings=(Key="F",SeqObjClassName="Engine.SeqVar_Float") 17 | Bindings=(Key="F",bControl=true,SeqObjClassName="Engine.SeqCond_CompareFloat") 18 | Bindings=(Key="B",SeqObjClassName="Engine.SeqVar_Bool") 19 | Bindings=(Key="B",bControl=true,SeqObjClassName="Engine.SeqCond_CompareBool") 20 | Bindings=(Key="N",SeqObjClassName="Engine.SeqVar_Named") 21 | Bindings=(Key="E",bShift=true,SeqObjClassName="Engine.SeqVar_External") 22 | Bindings=(Key="LeftBracket",SeqObjClassName="Engine.SeqEvent_SequenceActivated") 23 | Bindings=(Key="RightBracket",SeqObjClassName="Engine.SeqAct_FinishSequence") 24 | Bindings=(Key="T",SeqObjClassName="Engine.SeqAct_Toggle") 25 | Bindings=(Key="D",SeqObjClassName="Engine.SeqAct_Delay") 26 | Bindings=(Key="L",SeqObjClassName="Engine.SeqAct_Log") 27 | Bindings=(Key="M",SeqObjClassName="Engine.SeqAct_Interp") 28 | Bindings=(Key="S",bControl=true,SeqObjClassName="Engine.SeqEvent_LevelLoaded") 29 | Bindings=(Key="X",SeqObjClassName="Engine.SeqCond_Increment") 30 | Bindings=(Key="Q",SeqObjClassName="Engine.Sequence") 31 | Bindings=(Key="G",SeqObjClassName="Engine.SeqAct_Gate") 32 | Bindings=(Key="G",bShift=true,SeqObjClassName="Engine.SeqAct_AndGate") 33 | CommentPresets=(PresetName="Default",BorderWidth=1,BorderColor=(R=0,G=0,B=0,A=255),bFilled=true,FillColor=(R=0,G=0,B=0,A=16)) 34 | 35 | 36 | [LogWindow] 37 | MaxNumberOfLogLines=2000 38 | 39 | [UnrealEd.ThumbnailManager] 40 | ArchetypeRenderableThumbnailTypes=(ClassNeedingThumbnailName="Core.Object",RendererClassName="UnrealEd.ArchetypeThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=255,G=192,B=128,A=255),IconName="EditorResources.UnrealEdIcon_Archetype") 41 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.Prefab",RendererClassName="UnrealEd.PrefabThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=255,G=192,B=128,A=255),IconName="EditorResources.UnrealEdIcon_Prefab") 42 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.PhysicsAsset",RendererClassName="UnrealEd.IconThumbnailRenderer",LabelRendererClassName="UnrealEd.PhysicsAssetLabelRenderer",BorderColor=(R=255,G=192,B=128,A=255),IconName="EditorResources.UnrealEdIcon_PhysAsset") 43 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.PhysicalMaterial",RendererClassName="UnrealEd.IconThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(B=255,A=255),IconName="EngineMaterials.UnrealEdIcon_PhysMat") 44 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.AnimTree",RendererClassName="UnrealEd.IconThumbnailRenderer",LabelRendererClassName="UnrealEd.AnimTreeLabelRenderer",BorderColor=(R=255,G=128,B=192,A=255),IconName="EngineMaterials.UnrealEdIcon_AnimTree") 45 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.SoundNodeWave",RendererClassName="UnrealEd.IconThumbnailRenderer",LabelRendererClassName="UnrealEd.SoundLabelRenderer",BorderColor=(R=0,G=0,B=255,A=255),IconName="EditorResources.UnrealEdIcon_Sound") 46 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.SoundCue",RendererClassName="UnrealEd.IconThumbnailRenderer",LabelRendererClassName="UnrealEd.SoundLabelRenderer",BorderColor=(R=0,G=175,B=255,A=255),IconName="EditorResources.UnrealEdIcon_SoundCue") 47 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.SoundClass",RendererClassName="UnrealEd.IconThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=0,G=175,B=255,A=255),IconName="EditorResources.UnrealEdIcon_SoundCue") 48 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.SoundMode",RendererClassName="UnrealEd.IconThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=175,G=0,B=255,A=255),IconName="EditorResources.UnrealEdIcon_SoundCue") 49 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.SpeechRecognition",RendererClassName="UnrealEd.IconThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=0,G=0,B=255,A=255),IconName="EditorResources.UnrealEdIcon_SoundCue") 50 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.Font",RendererClassName="UnrealEd.FontThumbnailRenderer",LabelRendererClassName="UnrealEd.FontThumbnailLabelRenderer",BorderColor=(B=255,A=255),IconName="EditorResources.UnrealEdIcon_Font") 51 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.Sequence",RendererClassName="UnrealEd.IconThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=255,G=255,B=255,A=255),IconName="EngineMaterials.UnrealEdIcon_Sequence") 52 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.AnimSet",RendererClassName="UnrealEd.IconThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=192,G=128,B=255,A=255),IconName="EngineMaterials.UnrealEdIcon_AnimSet") 53 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.TerrainMaterial",RendererClassName="UnrealEd.IconThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=192,G=255,B=192,A=255),IconName="EditorResources.UnrealEdIcon_TerrainMaterial") 54 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.TerrainLayerSetup",RendererClassName="UnrealEd.IconThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=128,G=192,B=255,A=255),IconName="EditorResources.UnrealEdIcon_TerrainLayerSetup") 55 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.Texture2D",RendererClassName="UnrealEd.TextureThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=255,A=255)) 56 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.ShadowMap2D",RendererClassName="UnrealEd.TextureThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=255,A=255)) 57 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.ShadowMapTexture2D",RendererClassName="UnrealEd.TextureThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=255,A=255)) 58 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.TextureRenderTarget",RendererClassName="UnrealEd.TextureThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=255,A=255)) 59 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.TextureRenderTargetCube",RendererClassName="UnrealEd.TextureThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=255,A=255)) 60 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.TextureFlipBook",RendererClassName="UnrealEd.TextureThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=255,A=255)) 61 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.TextureMovie",RendererClassName="UnrealEd.TextureThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=255,A=255)) 62 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.LightMapTexture2D",RendererClassName="UnrealEd.TextureThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=255,A=255)) 63 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.TextureCube",RendererClassName="UnrealEd.TextureCubeThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=255,A=255)) 64 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.Material",RendererClassName="UnrealEd.MaterialInstanceThumbnailRenderer",LabelRendererClassName="UnrealEd.MaterialInstanceLabelRenderer",BorderColor=(R=0,G=255,B=0,A=255)) 65 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.MaterialFunction",RendererClassName="UnrealEd.IconThumbnailRenderer",LabelRendererClassName="UnrealEd.MaterialFunctionLabelRenderer",BorderColor=(R=0,G=175,B=175,A=255)) 66 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.MaterialInterface",RendererClassName="UnrealEd.MaterialInstanceThumbnailRenderer",LabelRendererClassName="UnrealEd.MaterialInstanceLabelRenderer",BorderColor=(R=50,G=50,B=255,A=255)) 67 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.ParticleSystem",RendererClassName="UnrealEd.ParticleSystemThumbnailRenderer",LabelRendererClassName="UnrealEd.ParticleSystemLabelRenderer",BorderColor=(R=255,G=255,B=0,A=255)) 68 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.FracturedStaticMesh",RendererClassName="UnrealEd.StaticMeshThumbnailRenderer",LabelRendererClassName="UnrealEd.FracturedStaticMeshLabelRenderer",BorderColor=(R=96,G=200,B=255,A=255)) 69 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.StaticMesh",RendererClassName="UnrealEd.StaticMeshThumbnailRenderer",LabelRendererClassName="UnrealEd.StaticMeshLabelRenderer",BorderColor=(R=0,G=255,B=255,A=255)) 70 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.SkeletalMesh",RendererClassName="UnrealEd.SkeletalMeshThumbnailRenderer",LabelRendererClassName="UnrealEd.SkeletalMeshLabelRenderer",BorderColor=(R=255,G=0,B=255,A=255)) 71 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.MorphTargetSet",RendererClassName="UnrealEd.IconThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=192,G=128,B=0,A=255),IconName="EngineMaterials.UnrealEdIcon_MorphTargetSet") 72 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.MorphWeightSequence",RendererClassName="UnrealEd.IconThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=128,G=192,B=0,A=255),IconName="EngineMaterials.UnrealEdIcon_MorphWeightSequence") 73 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.PostProcessChain",RendererClassName="UnrealEd.IconThumbnailRenderer",LabelRendererClassName="UnrealEd.PostProcessLabelRenderer",BorderColor=(R=192,G=128,B=255,A=255),IconName="EngineMaterials.UnrealEdIcon_PostProcessChain") 74 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.CurveEdPresetCurve",RendererClassName="UnrealEd.IconThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=30,G=170,B=200,A=255),IconName="EngineMaterials.UnrealEdIcon_CurveEdPresetCurve") 75 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.FaceFXAsset",RendererClassName="UnrealEd.IconThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=255,G=192,B=0,A=255),IconName="EditorResources.UnrealEdIcon_FaceFXAsset") 76 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.FaceFXAnimSet",RendererClassName="UnrealEd.IconThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=128,G=128,B=255,A=255),IconName="EditorResources.UnrealEdIcon_FaceFXAsset") 77 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.CameraAnim",RendererClassName="UnrealEd.IconThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=15,G=125,B=150,A=255),IconName="EditorResources.UnrealEdIcon_Archetype") 78 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.SpeedTree",RendererClassName="UnrealEd.IconThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=64,G=255,B=64,A=255),IconName="EditorResources.SpeedTreeLogoBig") 79 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.LensFlare",RendererClassName="UnrealEd.LensFlareThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=255,G=200,B=64,A=255)) 80 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.PhysXParticleSystem",RendererClassName="UnrealEd.IconThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=255,G=192,B=128,A=255),IconName="EditorResources.UnrealEdIcon_PhysXParticleSystem") 81 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.FractureMaterial",RendererClassName="UnrealEd.IconThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=255,G=192,B=128,A=255)) 82 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.ProcBuildingRuleset",RendererClassName="UnrealEd.IconThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(B=255,A=255),IconName="EditorResources.UnrealEdIcon_ProcBuildRules") 83 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="GFxUI.SwfMovie",RendererClassName="UnrealEd.IconThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=200,G=120,B=200,A=255)) 84 | 85 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.ApexDestructibleAsset",RendererClassName="UnrealEd.ApexDestructibleAssetThumbnailRenderer",LabelRendererClassName="UnrealEd.ApexDestructibleAssetLabelRenderer",BorderColor=(R=255,G=192,B=128,A=255),IconName="EditorResources.UnrealEdIcon_ApexDestructibleAsset") 86 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.ApexClothingAsset",RendererClassName="UnrealEd.IconThumbnailRenderer",LabelRendererClassName="UnrealEd.ApexClothingAssetLabelRenderer",BorderColor=(R=255,G=192,B=128,A=255),IconName="EditorResources.UnrealEdIcon_ApexClothingAsset") 87 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.ApexGenericAsset",RendererClassName="UnrealEd.IconThumbnailRenderer",LabelRendererClassName="UnrealEd.ApexGenericAssetLabelRenderer",BorderColor=(R=255,G=192,B=128,A=255),IconName="EditorResources.UnrealEdIcon_ApexGenericAsset") 88 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="Engine.LandscapeLayerInfoObject",RendererClassName="UnrealEd.IconThumbnailRenderer",LabelRendererClassName="UnrealEd.LandscapeLayerLabelRenderer",BorderColor=(R=255,G=192,B=128,A=255)) 89 | RenderableThumbnailTypes=(ClassNeedingThumbnailName="GFxUI.GfxMoviePlayer",RendererClassName="UnrealEd.IconThumbnailRenderer",LabelRendererClassName="UnrealEd.GenericThumbnailLabelRenderer",BorderColor=(R=150,G=70,B=150,A=255)) 90 | 91 | [UnrealEd.DefaultSizedThumbnailRenderer] 92 | DefaultSizeX=512 93 | DefaultSizeY=512 94 | 95 | 96 | [UnrealEd.BrowserManager] 97 | LastSelectedPaneID=0 98 | BrowserPanes=(PaneID=0,WxWindowClassName="WxContentBrowserHost",FriendlyName="ContentBrowser",CloneOfPaneID=-1,CloneNumber=-1) 99 | BrowserPanes=(PaneID=1,WxWindowClassName="WxActorBrowser",FriendlyName="ActorBrowser",CloneOfPaneID=-1,CloneNumber=-1) 100 | BrowserPanes=(PaneID=2,WxWindowClassName="WxLevelBrowser",FriendlyName="LevelBrowser",CloneOfPaneID=-1,CloneNumber=-1) 101 | BrowserPanes=(PaneID=3,WxWindowClassName="WxSceneManager",FriendlyName="SceneManager",CloneOfPaneID=-1,CloneNumber=-1) 102 | BrowserPanes=(PaneID=4,WxWindowClassName="WxLayerBrowser",FriendlyName="LayerBrowser",CloneOfPaneID=-1,CloneNumber=-1) 103 | BrowserPanes=(PaneID=5,WxWindowClassName="WxAttachmentEditor",FriendlyName="Attachments",bInitiallyHidden=True,CloneOfPaneID=-1,CloneNumber=-1) 104 | BrowserPanes=(PaneID=6,WxWindowClassName="WxReferencedAssetsBrowser",FriendlyName="ReferencedAssetsBrowser",bInitiallyHidden=True,CloneOfPaneID=-1,CloneNumber=-1) 105 | BrowserPanes=(PaneID=7,WxWindowClassName="WxGameStatsVisualizer",FriendlyName="GameStatsVisualizer",bInitiallyHidden=True,CloneOfPaneID=-1,CloneNumber=-1) 106 | BrowserPanes=(PaneID=8,WxWindowClassName="WxPrimitiveStatsBrowser",FriendlyName="PrimitiveStats",bInitiallyHidden=True,CloneOfPaneID=-1,CloneNumber=-1) 107 | BrowserPanes=(PaneID=9,WxWindowClassName="WxBuildingStatsBrowser",FriendlyName="BuildingStats",bInitiallyHidden=True,CloneOfPaneID=-1,CloneNumber=-1) 108 | BrowserPanes=(PaneID=10,WxWindowClassName="WxTextureStatsBrowser",FriendlyName="TextureStats",bInitiallyHidden=True,CloneOfPaneID=-1,CloneNumber=-1) 109 | BrowserPanes=(PaneID=11,WxWindowClassName="WxTaskBrowser",FriendlyName="TaskBrowser",bInitiallyHidden=True,CloneOfPaneID=-1,CloneNumber=-1) 110 | BrowserPanes=(PaneID=12,WxWindowClassName="WxLogBrowser",FriendlyName="LogBrowser",bInitiallyHidden=True,CloneOfPaneID=-1,CloneNumber=-1) 111 | BrowserPanes=(PaneID=13,WxWindowClassName="WxStartPageHost",FriendlyName="StartPage",CloneOfPaneID=-1,CloneNumber=-1) 112 | 113 | [Engine.ActorFactory] 114 | MenuPriority=10 115 | 116 | [Engine.ActorFactoryStaticMesh] 117 | MenuPriority=30 118 | 119 | [Engine.ActorFactoryFracturedStaticMesh] 120 | MenuPriority=35 121 | 122 | [Engine.ActorFactoryInteractiveFoliage] 123 | MenuPriority=26 124 | 125 | [Engine.ActorFactoryMover] 126 | MenuPriority=25 127 | 128 | [Engine.ActorFactoryPlayerStart] 129 | MenuPriority=20 130 | 131 | [Engine.ActorFactoryLight] 132 | MenuPriority=20 133 | 134 | [Engine.ActorFactorySpotLight] 135 | MenuPriority=20 136 | 137 | 138 | [Engine.ActorFactoryRigidBody] 139 | MenuPriority=15 140 | 141 | ;we want the editor to prefer placing decals over placing fog volumes 142 | [Engine.ActorFactoryDecal] 143 | MenuPriority=15 144 | 145 | [Engine.ActorFactoryFogVolumeConstantDensityInfo] 146 | MenuPriority=10 147 | 148 | [Engine.ActorFactorySkeletalMesh] 149 | MenuPriority=13 150 | 151 | [Engine.ActorFactorySkeletalMeshCinematic] 152 | MenuPriority=12 153 | 154 | [Engine.ActorFactorySkeletalMeshMAT] 155 | MenuPriority=12 156 | 157 | [Engine.ActorFactoryAmbientSoundSimpleToggleable] 158 | MenuPriority=10 159 | 160 | [Engine.ActorFactoryAmbientSoundNonLoop] 161 | MenuPriority=10 162 | 163 | [Engine.ActorFactoryAmbientSoundNonLoopingToggleable] 164 | MenuPriority=10 165 | 166 | [Engine.ActorFactoryAmbientSoundSimple] 167 | MenuPriority=11 168 | 169 | [Engine.ActorFactoryAmbientSound] 170 | MenuPriority=11 171 | 172 | [Engine.ActorFactoryAmbientSoundMovable] 173 | MenuPriority=10 174 | 175 | [UnrealEd.CustomPropertyItemBindings] 176 | 177 | CustomPropertyClasses=(PropertyPathName="UnrealEd.MaterialEditorInstanceConstant:LightmassSettings", PropertyItemClassName="WxPropertyWindow_LightmassMaterialParameters", bReplaceArrayHeaders=1) 178 | CustomPropertyClasses=(PropertyPathName="UnrealEd.MaterialEditorInstanceTimeVarying:LightmassSettings", PropertyItemClassName="WxPropertyWindow_LightmassMaterialParameters", bReplaceArrayHeaders=1) 179 | CustomPropertyClasses=(PropertyPathName="UnrealEd.UnrealEdTypes:LightmassScalarParameterValue.ParameterValue", PropertyItemClassName="WxCustomPropertyItem_LightmassMaterialParameter") 180 | ;FIRAXIS ADDITION 181 | CustomPropertyClasses=(PropertyPathName="UnrealEd.UnrealEdTypes:LightmassBooleanParameterValue.ParameterValue", PropertyItemClassName="WxCustomPropertyItem_LightmassMaterialParameter") 182 | ;FIRAXIS END 183 | 184 | 185 | ; new property classes for MIC Property Groups 186 | CustomPropertyClasses=(PropertyPathName="UnrealEd.MaterialEditorInstanceConstant:ParameterGroups", PropertyItemClassName="WxCustomPropertyItem_ParameterGroup", bReplaceArrayHeaders=1) 187 | CustomPropertyClasses=(PropertyPathName="UnrealEd.DEditorVectorParameterValue:ParameterValue",PropertyItemClassName="WxCustomPropertyItem_MIC_Parameter", bReplaceArrayHeaders=1) 188 | CustomPropertyClasses=(PropertyPathName="UnrealEd.DEditorStaticSwitchParameterValue:ParameterValue",PropertyItemClassName="WxCustomPropertyItem_MIC_Parameter", bReplaceArrayHeaders=1) 189 | CustomPropertyClasses=(PropertyPathName="UnrealEd.DEditorStaticComponentMaskParameterValue:ParameterValue",PropertyItemClassName="WxCustomPropertyItem_MIC_Parameter", bReplaceArrayHeaders=1) 190 | CustomPropertyClasses=(PropertyPathName="UnrealEd.DEditorScalarParameterValue:ParameterValue",PropertyItemClassName="WxCustomPropertyItem_MIC_Parameter", bReplaceArrayHeaders=1) 191 | CustomPropertyClasses=(PropertyPathName="UnrealEd.DEditorTextureParameterValue:ParameterValue",PropertyItemClassName="WxCustomPropertyItem_MIC_Parameter", bReplaceArrayHeaders=1) 192 | 193 | ; custom editable combobox for displaying group names in MaterialEditor 194 | CustomPropertyInputProxies=(PropertyPathName="Engine.MaterialExpressionParameter:Group",PropertyItemClassName="UnrealEd.PropertyInput_DynamicCombo", bReplaceArrayHeaders=1) 195 | CustomPropertyInputProxies=(PropertyPathName="Engine.MaterialExpressionTextureSampleParameter:Group",PropertyItemClassName="UnrealEd.PropertyInput_DynamicCombo", bReplaceArrayHeaders=1) 196 | CustomPropertyInputProxies=(PropertyPathName="Engine.MaterialExpressionFontSampleParameter:Group",PropertyItemClassName="UnrealEd.PropertyInput_DynamicCombo", bReplaceArrayHeaders=1) 197 | 198 | ;CustomPropertyClasses=(PropertyPathName="UnrealEd.MaterialEditorInstanceTimeVarying:EditorVectorParameterValueOverTime.ParameterValue",PropertyItemClassName="WxCustomPropertyItem_MaterialInstanceTimeVaryingParameter") 199 | ;CustomPropertyClasses=(PropertyPathName="UnrealEd.MaterialEditorInstanceTimeVarying:EditorStaticSwitchParameterValueOverTime.ParameterValue",PropertyItemClassName="WxCustomPropertyItem_MaterialInstanceTimeVaryingParameter") 200 | ;CustomPropertyClasses=(PropertyPathName="UnrealEd.MaterialEditorInstanceTimeVarying:EditorStaticComponentMaskParameterValueOverTime.ParameterValue",PropertyItemClassName="WxCustomPropertyItem_MaterialInstanceTimeVaryingParameter") 201 | ;CustomPropertyClasses=(PropertyPathName="UnrealEd.MaterialEditorInstanceTimeVarying:EditorScalarParameterValueOverTime.ParameterValue",PropertyItemClassName="WxCustomPropertyItem_MaterialInstanceTimeVaryingParameter") 202 | ;FIRAXIS ADDITION 203 | ;CustomPropertyClasses=(PropertyPathName="UnrealEd.MaterialEditorInstanceTimeVarying:EditorBooleanParameterValueOverTime.ParameterValue",PropertyItemClassName="WxCustomPropertyItem_MaterialInstanceTimeVaryingParameter") 204 | ;FIRAXIS END 205 | ;CustomPropertyClasses=(PropertyPathName="UnrealEd.MaterialEditorInstanceTimeVarying:EditorTextureParameterValueOverTime.ParameterValue",PropertyItemClassName="WxCustomPropertyItem_MaterialInstanceTimeVaryingParameter") 206 | 207 | CustomPropertyClasses=(PropertyPathName="Engine.WorldInfo:LightmassSettings", PropertyItemClassName="WxCustomPropertyItem_LightmassWorldInfoSettingsParameter") 208 | 209 | [UnrealEd.HitProxy] 210 | HitProxySize=5 211 | 212 | [UnrealEd.UnrealEdOptions] 213 | ;EditorCategories=(Name="LevelEditor") 214 | EditorCategories=(Name="Matinee") 215 | ;EditorCategories=(Name="Cascade") 216 | ;EditorCategories=(Name="MaterialEditor") 217 | ;EditorCategories=(Name="Kismet") 218 | EditorCategories=(Name="CurveEditor") 219 | 220 | ;Matinee Commands 221 | EditorCommands=(Parent="Matinee", CommandName="Matinee_PlayForward", Description="Matinee_PlayForward_Desc", ExecCommand="Matinee Play") 222 | EditorCommands=(Parent="Matinee", CommandName="Matinee_PlayReverse", Description="Matinee_PlayReverse_Desc", ExecCommand="Matinee PlayReverse") 223 | EditorCommands=(Parent="Matinee", CommandName="Matinee_Stop", Description="Matinee_Stop_Desc", ExecCommand="Matinee Stop") 224 | EditorCommands=(Parent="Matinee", CommandName="Matinee_TogglePlayPause", Description="Matinee_TogglePlayPause_Desc", ExecCommand="Matinee TogglePlayPause") 225 | EditorCommands=(Parent="Matinee", CommandName="Matinee_ZoomIn", Description="Matinee_ZoomIn_Desc", ExecCommand="Matinee ZoomIn") 226 | EditorCommands=(Parent="Matinee", CommandName="Matinee_ZoomInAlt", Description="Matinee_ZoomInAlt_Desc", ExecCommand="Matinee ZoomIn") 227 | EditorCommands=(Parent="Matinee", CommandName="Matinee_ZoomOut", Description="Matinee_ZoomOut_Desc", ExecCommand="Matinee ZoomOut") 228 | EditorCommands=(Parent="Matinee", CommandName="Matinee_ZoomOutAlt", Description="Matinee_ZoomOutAlt_Desc", ExecCommand="Matinee ZoomOut") 229 | EditorCommands=(Parent="Matinee", CommandName="Matinee_Undo", Description="Matinee_Undo_Desc", ExecCommand="Matinee Undo") 230 | EditorCommands=(Parent="Matinee", CommandName="Matinee_Redo", Description="Matinee_Redo_Desc", ExecCommand="Matinee Redo") 231 | EditorCommands=(Parent="Matinee", CommandName="Matinee_Copy", Description="Matinee_Copy_Desc", ExecCommand="Matinee Copy") 232 | EditorCommands=(Parent="Matinee", CommandName="Matinee_Cut", Description="Matinee_Cut_Desc", ExecCommand="Matinee Cut") 233 | EditorCommands=(Parent="Matinee", CommandName="Matinee_Paste", Description="Matinee_Paste_Desc", ExecCommand="Matinee Paste") 234 | EditorCommands=(Parent="Matinee", CommandName="Matinee_DeleteSelection", Description="Matinee_DeleteSelection_Desc", ExecCommand="Matinee DeleteSelection") 235 | EditorCommands=(Parent="Matinee", CommandName="Matinee_MarkInSection", Description="Matinee_MarkInSection_Desc", ExecCommand="Matinee MarkInSection") 236 | EditorCommands=(Parent="Matinee", CommandName="Matinee_MarkOutSection", Description="Matinee_MarkOutSection_Desc", ExecCommand="Matinee MarkOutSection") 237 | EditorCommands=(Parent="Matinee", CommandName="Matinee_IncrementPosition", Description="Matinee_IncrementPosition_Desc", ExecCommand="Matinee IncrementPosition") 238 | EditorCommands=(Parent="Matinee", CommandName="Matinee_DecrementPosition", Description="Matinee_DecrementPosition_Desc", ExecCommand="Matinee DecrementPosition") 239 | EditorCommands=(Parent="Matinee", CommandName="Matinee_MoveToNextKey", Description="Matinee_MoveToNextKey_Desc", ExecCommand="Matinee MoveToNextKey") 240 | EditorCommands=(Parent="Matinee", CommandName="Matinee_MoveToPrevKey", Description="Matinee_MoveToPrevKey_Desc", ExecCommand="Matinee MoveToPrevKey") 241 | EditorCommands=(Parent="Matinee", CommandName="Matinee_SplitAnimKey", Description="Matinee_SplitAnimKey_Desc", ExecCommand="Matinee SplitAnimKey") 242 | EditorCommands=(Parent="Matinee", CommandName="Matinee_ToggleSnap", Description="Matinee_ToggleSnap_Desc", ExecCommand="Matinee ToggleSnap") 243 | EditorCommands=(Parent="Matinee", CommandName="Matinee_MoveActiveUp", Description="Matinee_MoveActiveUp_Desc", ExecCommand="Matinee MoveActiveUp") 244 | EditorCommands=(Parent="Matinee", CommandName="Matinee_MoveActiveDown", Description="Matinee_MoveActiveDown_Desc", ExecCommand="Matinee MoveActiveDown") 245 | EditorCommands=(Parent="Matinee", CommandName="Matinee_AddKey", Description="Matinee_AddKey_Desc", ExecCommand="Matinee AddKey") 246 | EditorCommands=(Parent="Matinee", CommandName="Matinee_DuplicateSelectedKeys", Description="Matinee_DuplicateSelectedKeys_Desc", ExecCommand="Matinee DuplicateSelectedKeys") 247 | EditorCommands=(Parent="Matinee", CommandName="Matinee_CropAnimationBeginning", Description="Matinee_CropAnimationBeginning_Desc", ExecCommand="Matinee CropAnimationBeginning") 248 | EditorCommands=(Parent="Matinee", CommandName="Matinee_CropAnimationEnd", Description="Matinee_CropAnimationEnd_Desc", ExecCommand="Matinee CropAnimationEnd") 249 | 250 | EditorCommands=(Parent="Matinee", CommandName="Matinee_ViewFitSequence", Description="Matinee_ViewFitSequence_Desc", ExecCommand="Matinee ViewFitSequence") 251 | EditorCommands=(Parent="Matinee", CommandName="Matinee_ViewFitToSelected", Description="Matinee_ViewFitToSelected_Desc", ExecCommand="Matinee ViewFitToSelected") 252 | EditorCommands=(Parent="Matinee", CommandName="Matinee_ViewFitLoop", Description="Matinee_ViewFitLoop_Desc", ExecCommand="Matinee ViewFitLoop") 253 | EditorCommands=(Parent="Matinee", CommandName="Matinee_ViewFitLoopSequence", Description="Matinee_ViewFitLoopSequence_Desc", ExecCommand="Matinee ViewFitLoopSequence") 254 | EditorCommands=(Parent="Matinee", CommandName="Matinee_ViewEndOfTrack", Description="Matinee_ViewEndOfTrack_Desc", ExecCommand="Matinee ViewEndOfTrack") 255 | 256 | EditorCommands=(Parent="Matinee", CommandName="Matinee_ChangeKeyInterpModeAUTO", Description="Matinee_ChangeKeyInterpModeAUTO_Desc", ExecCommand="Matinee ChangeKeyInterpModeAUTO") 257 | EditorCommands=(Parent="Matinee", CommandName="Matinee_ChangeKeyInterpModeUSER", Description="Matinee_ChangeKeyInterpModeUSER_Desc", ExecCommand="Matinee ChangeKeyInterpModeUSER") 258 | EditorCommands=(Parent="Matinee", CommandName="Matinee_ChangeKeyInterpModeBREAK", Description="Matinee_ChangeKeyInterpModeBREAK_Desc", ExecCommand="Matinee ChangeKeyInterpModeBREAK") 259 | EditorCommands=(Parent="Matinee", CommandName="Matinee_ChangeKeyInterpModeLINEAR", Description="Matinee_ChangeKeyInterpModeLINEAR_Desc", ExecCommand="Matinee ChangeKeyInterpModeLINEAR") 260 | EditorCommands=(Parent="Matinee", CommandName="Matinee_ChangeKeyInterpModeCONSTANT", Description="Matinee_ChangeKeyInterpModeCONSTANT_Desc", ExecCommand="Matinee ChangeKeyInterpModeCONSTANT") 261 | 262 | ;Curve Editor Commands 263 | EditorCommands=(Parent="CurveEditor", CommandName="CurveEditor_ChangeInterpModeAUTO", Description="CurveEditor_ChangeInterpModeAUTO_Desc", ExecCommand="CurveEditor ChangeInterpModeAUTO") 264 | EditorCommands=(Parent="CurveEditor", CommandName="CurveEditor_ChangeInterpModeUSER", Description="CurveEditor_ChangeInterpModeUSER_Desc", ExecCommand="CurveEditor ChangeInterpModeUSER") 265 | EditorCommands=(Parent="CurveEditor", CommandName="CurveEditor_ChangeInterpModeBREAK", Description="CurveEditor_ChangeInterpModeBREAK_Desc", ExecCommand="CurveEditor ChangeInterpModeBREAK") 266 | EditorCommands=(Parent="CurveEditor", CommandName="CurveEditor_ChangeInterpModeLINEAR", Description="CurveEditor_ChangeInterpModeLINEAR_Desc", ExecCommand="CurveEditor ChangeInterpModeLINEAR") 267 | EditorCommands=(Parent="CurveEditor", CommandName="CurveEditor_ChangeInterpModeCONSTANT", Description="CurveEditor_ChangeInterpModeCONSTANT_Desc", ExecCommand="CurveEditor ChangeInterpModeCONSTANT") 268 | EditorCommands=(Parent="CurveEditor", CommandName="CurveEditor_FitViewHorizontally", Description="CurveEditor_FitViewHorizontally_Desc", ExecCommand="CurveEditor FitViewHorizontally") 269 | EditorCommands=(Parent="CurveEditor", CommandName="CurveEditor_FitViewVertically", Description="CurveEditor_FitViewVertically_Desc", ExecCommand="CurveEditor FitViewVertically") 270 | EditorCommands=(Parent="CurveEditor", CommandName="CurveEditor_FitViewToAll", Description="CurveEditor_FitViewToAll_Desc", ExecCommand="CurveEditor FitViewToAll") 271 | EditorCommands=(Parent="CurveEditor", CommandName="CurveEditor_FitViewToSelected", Description="CurveEditor_FitViewToSelected_Desc", ExecCommand="CurveEditor FitViewToSelected") 272 | 273 | [TaskBrowser] 274 | EpicDefaultServerName=testtrack.epicgames.net 275 | EpicDefaultServerPort=80 276 | EpicDefaultProjectName=UE3 277 | EpicDefaultDBFilterName=My tasks (open not fixed) 278 | 279 | 280 | [UnrealEd.PerfWarnings_InterpActor_Hidden_DefaultMesh_With_DLE] 281 | +Name=EngineMeshes.Cube 282 | +Name=EditorMeshes.TexPropCube 283 | 284 | [Cooker.GeneralOptions] 285 | bSeparateLightingTFC=true 286 | bSeparateCharacterTFC=true 287 | bCleanupMaterials=true 288 | bCleanStaticMeshMaterials=true 289 | bDisablePMapObjectChecking=false 290 | 291 | [Cooker.MatineeOptions] 292 | bBakeAndPruneDuringCook=true 293 | bAllowBakeAndPruneOverride=true 294 | 295 | [Cooker.FaceFXOptions] 296 | bGeneratePersistentMapAnimSet=true 297 | 298 | [Cooker.ObjectsToNeverCook] 299 | +Name=EngineMaterials.UnrealEdIcon_Sequence 300 | +Name=EngineMaterials.UnrealEdIcon_Prefab 301 | +Name=EngineMaterials.UnrealEdIcon_PostProcessChain 302 | +Name=EngineMaterials.UnrealEdIcon_PhysMat 303 | +Name=EngineMaterials.UnrealEdIcon_MorphWeightSequence 304 | +Name=EngineMaterials.UnrealEdIcon_MorphTargetSet 305 | +Name=EngineMaterials.UnrealEdIcon_CurveEdPresetCurve 306 | +Name=EngineMaterials.UnrealEdIcon_AnimTree 307 | +Name=EngineMaterials.UnrealEdIcon_AnimSet 308 | +Name=EngineMaterials.SoundCue_SpeakerIcon 309 | +Name=EngineResources.WireframeTexture 310 | +Name=EngineMaterials.EditorBrushMaterial 311 | +Name=Engine_MI_Shaders.Textures.DefaultReflectionTexture_IBR 312 | 313 | [Cooker.CleanStaticMeshMtrlSkip] 314 | Class=Engine.ActorFactory 315 | Class=Engine.SequenceObject 316 | StaticMesh=UI_Waypoint.Meshes.largeWaypoint_Floor 317 | 318 | 319 | [CommandletsToForceMinimalShaderCompilation] 320 | AnalyzeReferencedContentCommandlet=True 321 | CheckpointGameAssetDatabaseCommandlet=True 322 | TagReferencedAssetsCommandlet=True 323 | TagCookedReferencedAssetsCommandlet=True 324 | FixupRedirectsCommandlet=True 325 | ResavePackagesCommandlet=True 326 | ConformCommandlet=True 327 | 328 | [UnrealEd.ContentBrowser] 329 | bUseContentBrowser=True 330 | 331 | [GameAssetDatabase] 332 | BranchName= 333 | JournalServer=contentbrowser-db 334 | JournalDatabase=ContentJournal 335 | UseJournalUpdateAlarm=TRUE 336 | 337 | [UnrealEd.GameStatsBrowser] 338 | GameStatsDBClassname="UnrealEd.GameStatsDatabase" 339 | GameStatsDBUploaderClassname="UnrealEd.GameStatsDBUploader" 340 | 341 | [UnrealEd.GameStatsDatabase] 342 | GameStatsFileReaderClassname="UnrealEd.GameStatsFileReader" 343 | GameStateClassname="GameFramework.GameStateObject" 344 | 345 | [UnrealEd.GameStatsReport] 346 | ReportBaseURL="" 347 | GameStatsGameStateClassName="GameFramework.GameStateObject" 348 | GameStatsAggregatorClassName="GameFramework.GameStatsAggregator" 349 | GameStatsReportWriterClassName="GameFramework.GameStatsReport" 350 | 351 | [UnrealEd.BasicStatsVisualizer] 352 | SupportedEvents=102 353 | SupportedEvents=104 354 | SupportedEvents=105 355 | SupportedEvents=108 356 | SupportedEvents=150 357 | SupportedEvents=151 358 | SupportedEvents=152 359 | DrawingProperties=(EventID=0,StatColor=(R=0,G=0,B=0),Size=8,SpriteName="EditorResources.BSPVertex") 360 | 361 | [UnrealEd.PlayerMovementVisualizer] 362 | SupportedEvents=102 363 | SupportedEvents=105 364 | 365 | [UnrealEd.GenericParamListVisualizer] 366 | SupportedEvents=302 367 | 368 | [UnrealEd.PerformanceVisualizer] 369 | SupportedEvents=40 370 | SupportedEvents=41 371 | SupportedEvents=42 372 | SupportedEvents=43 373 | 374 | [UnrealEd.HeatmapVisualizer] 375 | SupportedEvents=102 376 | SupportedEvents=104 377 | SupportedEvents=105 378 | SupportedEvents=108 379 | 380 | [ASEImporter] 381 | ImportVertexCountWarningPercentage=25.0 382 | 383 | [TextureImporter] 384 | AllowNonPowerOfTwoTextures=True 385 | 386 | [DarkTextures] 387 | MinimalBrightness=40.0 388 | bIgnoreBlack=true 389 | bUseGrayScale=false 390 | 391 | [UnrealEd.CascadeConfiguration] 392 | ModuleMenu_ModuleRejections=ParticleModuleTypeDataBase 393 | ModuleMenu_ModuleRejections=ParticleModule 394 | ModuleMenu_ModuleRejections=ParticleModuleRequired 395 | ModuleMenu_ModuleRejections=ParticleModuleSpawn 396 | ModuleMenu_ModuleRejections=ParticleModuleTypeDataBeam 397 | ModuleMenu_ModuleRejections=ParticleModuleTypeDataTrail 398 | ModuleMenu_ModuleRejections=ParticleModuleTypeDataTrail2 399 | ModuleMenu_ModuleRejections=ParticleModuleLocationPrimitiveBase 400 | ModuleMenu_ModuleRejections=ParticleModuleEventReceiverBase 401 | ModuleMenu_TypeDataToBaseModuleRejections=(ObjName=None,InvalidObjNames=(ParticleModuleBeamBase,ParticleModuleTrailBase)) 402 | ModuleMenu_TypeDataToBaseModuleRejections=(ObjName=ParticleModuleTypeDataBeam2,InvalidObjNames=(ParticleModuleTrailBase)) 403 | ModuleMenu_TypeDataToBaseModuleRejections=(ObjName=ParticleModuleTypeDataTrail2,InvalidObjNames=(ParticleModuleBeamBase)) 404 | ModuleMenu_TypeDataToBaseModuleRejections=(ObjName=ParticleModuleTypeDataMesh,InvalidObjNames=(ParticleModuleBeamBase,ParticleModuleTrailBase)) 405 | ModuleMenu_TypeDataToBaseModuleRejections=(ObjName=ParticleModuleTypeDataMeshPhysX,InvalidObjNames=(ParticleModuleBeamBase,ParticleModuleTrailBase,ParticleModuleAccelerationBase,ParticleModuleAttractorBase,ParticleModuleCollisionBase,ParticleModuleEventBase,ParticleModuleEventReceiverBase,ParticleModuleKillBase,ParticleModuleOrbitBase,ParticleModuleSubUVBase,ParticleModuleMaterialBase,ParticleModuleOrientationBase)) 406 | ModuleMenu_TypeDataToBaseModuleRejections=(ObjName=ParticleModuleTypeDataPhysX,InvalidObjNames=(ParticleModuleBeamBase,ParticleModuleTrailBase,ParticleModuleAccelerationBase,ParticleModuleAttractorBase,ParticleModuleCollisionBase,ParticleModuleKillBase,ParticleModuleOrbitBase)) 407 | ModuleMenu_TypeDataToSpecificModuleRejections=(ObjName=None,InvalidObjNames=(ParticleModuleMeshMaterial,ParticleModuleMeshRotation,ParticleModuleMeshRotation_Seeded,ParticleModuleMeshRotationRate,ParticleModuleMeshRotationRate_Seeded,ParticleModuleMeshRotationRateMultiplyLife,ParticleModuleMeshRotationRateOverLife,ParticleModuleTrailSpawnPerUnit)) 408 | ModuleMenu_TypeDataToSpecificModuleRejections=(ObjName=ParticleModuleTypeDataBeam2,InvalidObjNames=(ParticleModuleMeshMaterial,ParticleModuleMeshRotation,ParticleModuleMeshRotation_Seeded,ParticleModuleMeshRotationRate,ParticleModuleMeshRotationRate_Seeded,ParticleModuleMeshRotationRateMultiplyLife,ParticleModuleMeshRotationRateOverLife,ParticleModuleTrailSpawnPerUnit)) 409 | ModuleMenu_TypeDataToSpecificModuleRejections=(ObjName=ParticleModuleTypeDataTrail2,InvalidObjNames=(ParticleModuleMeshMaterial,ParticleModuleMeshRotation,ParticleModuleMeshRotation_Seeded,ParticleModuleMeshRotationRate,ParticleModuleMeshRotationRate_Seeded,ParticleModuleMeshRotationRateMultiplyLife,ParticleModuleMeshRotationRateOverLife,ParticleModuleSpawnPerUnit)) 410 | ModuleMenu_TypeDataToSpecificModuleRejections=(ObjName=ParticleModuleTypeDataRibbon,InvalidObjNames=(ParticleModuleMeshMaterial,ParticleModuleMeshRotation,ParticleModuleMeshRotation_Seeded,ParticleModuleMeshRotationRate,ParticleModuleMeshRotationRate_Seeded,ParticleModuleMeshRotationRateMultiplyLife,ParticleModuleMeshRotationRateOverLife,ParticleModuleLocationEmitterDirect)) 411 | ModuleMenu_TypeDataToSpecificModuleRejections=(ObjName=ParticleModuleTypeDataMeshPhysX,InvalidObjNames=(ParticleModuleColorScaleOverLife,ParticleModuleColorByParameter,ParticleModuleRotation,ParticleModuleRotationOverLifetime,ParticleModuleMeshRotationRateMultiplyLife,ParticleModuleMeshRotationRateOverLife,ParticleModuleRotationRate,ParticleModuleRotationRateMultiplyLife,ParticleModuleVelocityOverLifetime,ParticleModuleSizeScale,ParticleModuleTrailSpawnPerUnit)) 412 | ModuleMenu_TypeDataToSpecificModuleRejections=(ObjName=ParticleModuleTypeDataPhysX,InvalidObjNames=(ParticleModuleMeshMaterial,ParticleModuleMeshRotation,ParticleModuleMeshRotation_Seeded,ParticleModuleMeshRotationRate,ParticleModuleMeshRotationRate_Seeded,ParticleModuleMeshRotationRateMultiplyLife,ParticleModuleMeshRotationRateOverLife,ParticleModuleTrailSpawnPerUnit)) 413 | 414 | [MatineePreview] 415 | AIGroupPreviewAnimTreeName="EditorMeshes.PreviewTree" 416 | DefaultAnimSlotName="Custom_FullBody" 417 | AIGroupPreviewPawnClassName="Engine.MatineePawn" 418 | 419 | [CameraPreview] 420 | DefaultPreviewPawnClassName="Engine.MatineePawn" 421 | DefaultAnimSlotName="Custom_FullBody" 422 | 423 | [CurveEditor] 424 | bShouldPromptOnCurveRemoveAll=TRUE 425 | 426 | [IntrinsicMetaData] 427 | ColladaFactory_bImportAsSkeletalMesh=ToolTip| If enabled, import the mesh as a skeletal mesh; if not enabled, import the mesh as a static mesh 428 | FbxFactory_CombineMeshes=ToolTip| If enabled, combines all meshes into a single mesh 429 | FbxFactory_ImportAnimSet=ToolTip| If enabled, creates a new AnimSet based on all animations available in the file for the mesh 430 | FbxFactory_ImportLOD=ToolTip| If enabled, creates LOD models for Unreal meshes from LODs in the import file; If not enabled, only the base mesh from the LOD group is imported 431 | FbxFactory_ImportMorph=ToolTip| If enabled, creates Unreal morph objects for the imported meshes 432 | FbxFactory_ImportType=ToolTip| The type of mesh being imported 433 | FbxFactory_RemoveNamespace=ToolTip| If enabled, removes the namespaces from meshes and skeletons 434 | FbxFactory_ResampleAnimation=ToolTip| If enabled, resamples all animation curves to 30 FPS 435 | ReimportSkeletalMeshFactory_bAssumeMayaCoordinates=ToolTip| If enabled, the import process will assume the mesh is using the Maya coordinate system and adjust accordingly 436 | ReimportSkeletalMeshFactory_bSuppressSmoothingForCloth=ToolTip| If enabled, changes to vertex tangents will be suppressed 437 | ReimportSoundFactory_bAutoCreateCue=ToolTip| If enabled, a sound cue will automatically be created for the sound 438 | ReimportSoundFactory_bIncludeAttenuationNode=ToolTip| If enabled, the created sound cue will include a attenuation node 439 | ReimportSoundFactory_bIncludeModulatorNode=ToolTip| If enabled, the created sound cue will include a modulator node 440 | ReimportSoundFactory_bIncludeLoopingNode=ToolTip| If enabled, the created sound cue will include a looping node 441 | ReimportSoundFactory_CueVolume=ToolTip| The volume of the created sound cue 442 | ReimportStaticMeshFactory_bOneConvexPerUCXObject=ToolTip| If enabled, each UCX_ object in the mesh will be turned into exactly one primitive 443 | ReimportStaticMeshFactory_bReplaceExistingVertexColors=ToolTip| If enabled, existing vertex colors will be replaced with ones from the imported file 444 | ReimportStaticMeshFactory_bSingleSmoothGroupSingleTangent=ToolTip| If enabled, a single tangent set per vertex will be used in a single smoothing group 445 | ReimportTextureFactory_AlphaToEmissive=ToolTip| If enabled, link the texture's alpha to the created material's emissive color 446 | ReimportTextureFactory_AlphaToOpacity=ToolTip| If enabled, link the texture's alpha to the created material's opacity 447 | ReimportTextureFactory_AlphaToOpacityMask=ToolTip| If enabled, link the texture's alpha to the created material's opacity mask 448 | ReimportTextureFactory_AlphaToSpecular=ToolTip| If enabled, link the texture's alpha to the created material's specular color 449 | ReimportTextureFactory_Blending=ToolTip| The blend mode of the created material 450 | ReimportTextureFactory_CompressionNoAlpha=ToolTip| If enabled, the texture's alpha channel will be discarded during compression 451 | ReimportTextureFactory_CompressionSettings=ToolTip| Compression settings for the texture 452 | ReimportTextureFactory_CreateMaterial=ToolTip| If enabled, a material will automatically be created for the texture 453 | ReimportTextureFactory_DeferCompression=ToolTip| If enabled, compression is deferred until the texture is saved 454 | ReimportTextureFactory_DitherMipmapsalpha=ToolTip| If enabled, mip-map alpha values will be dithered for smooth transitions 455 | ReimportTextureFactory_FlipBook=ToolTip| If enabled, import the texture as a flipbook 456 | ReimportTextureFactory_LightMap=ToolTip| If enabled, import the texture as a lightmap 457 | ReimportTextureFactory_LightingModel=ToolTip| The lighting model of the created material 458 | ReimportTextureFactory_LODGroup=ToolTip| The group the texture belongs to 459 | ReimportTextureFactory_MipGenSettings=ToolTip| The mip-map generation settings for the texture; Allows customization of the content of the mip-map chain 460 | ReimportTextureFactory_PreserveborderA=ToolTip| If enabled, preserve the alpha value of border pixels when creating mip-maps 461 | ReimportTextureFactory_PreserveborderB=ToolTip| If enabled, preserve the blue color value of border pixels when creating mip-maps 462 | ReimportTextureFactory_PreserveborderG=ToolTip| If enabled, preserve the green color value of border pixels when creating mip-maps 463 | ReimportTextureFactory_PreserveborderR=ToolTip| If enabled, preserve the red color value of border pixels when creating mip-maps 464 | ReimportTextureFactory_RGBToDiffuse=ToolTip| If enabled, link the texture to the created material's diffuse color 465 | ReimportTextureFactory_RGBToEmissive=ToolTip| If enabled, link the texture to the created material's emissive color 466 | ReimportTextureFactory_TwoSided=ToolTip| If enabled, the created material will be two-sided 467 | SkeletalMeshFactory_bAssumeMayaCoordinates=ToolTip| If enabled, the import process will assume the mesh is using the Maya coordinate system and adjust accordingly 468 | SkeletalMeshFactory_bSuppressSmoothingForCloth=ToolTip| If enabled, changes to vertex tangents will be suppressed 469 | SoundFactory_bAutoCreateCue=ToolTip| If enabled, a sound cue will automatically be created for the sound 470 | SoundFactory_bIncludeAttenuationNode=ToolTip| If enabled, the created sound cue will include a attenuation node 471 | SoundFactory_bIncludeLoopingNode=ToolTip| If enabled, the created sound cue will include a looping node 472 | SoundFactory_bIncludeModulatorNode=ToolTip| If enabled, the created sound cue will include a modulator node 473 | SoundFactory_CueVolume=ToolTip| The volume of the created sound cue 474 | SoundFactory_CuePackageSuffix=ToolTip| If not empty, generated SoundCues will be placed in PackageCuePackageSuffix, but only if bAutoCreateCue is true 475 | SoundTTSFactory_bAutoCreateCue=ToolTip| If enabled, a sound cue will automatically be created for the sound 476 | SoundTTSFactory_bIncludeAttenuationNode=ToolTip| If enabled, the created sound cue will include a attenuation node 477 | SoundTTSFactory_bIncludeLoopingNode=ToolTip| If enabled, the created sound cue will include a looping node 478 | SoundTTSFactory_bIncludeModulatorNode=ToolTip| If enabled, the created sound cue will include a modulator node 479 | SoundTTSFactory_bUseTTS=ToolTip| If enabled, text to speech will be used 480 | SoundTTSFactory_CueVolume=ToolTip| The volume of the created sound cue 481 | SoundTTSFactory_SpokenText=ToolTip| Text spoken during the sound 482 | StaticMesh_bCanBecomeDynamic=ToolTip|If true, this mesh can become dynamic when shot or otherwise given an impulse. 483 | StaticMesh_bStripComplexCollisionForConsole=ToolTip|If true, strips unwanted complex collision data aka kDOPTree when cooking for consoles. On the Playstation 3 vertex data of this mesh will be stored in video memory. 484 | StaticMesh_bPartitionForEdgeGeometry=ToolTip|If true, this mesh can be processed by the Edge Geometry system on the Playstation 3. 485 | StaticMesh_bUsedForInstancing=ToolTip|If true, use the mesh for instancing 486 | StaticMesh_bUseMaximumStreamingTexelRatio=ToolTip|If true, use a less-conservative method of mip LOD texture factor computation. Requires mesh to be resaved to take effect as algorithm is applied on save 487 | StaticMesh_LightMapCoordinateIndex=ToolTip|The light map coordinate index 488 | StaticMesh_LightMapResolution=ToolTip|The light map resolution|FixedIncrement|4.0 489 | StaticMesh_LODDistanceRatio=ToolTip|LOD distance ratio for this mesh. The default value of 1 means that each transition will happen at increments of LODMaxRange / NumLODs distance from the camera. 490 | StaticMesh_LODMaxRange=ToolTip|Distance in world space units to the end of the LOD transitions 491 | StaticMesh_UseFullPrecisionUVs=ToolTip|If true, use full precision UVs 492 | StaticMesh_UseSimpleBoxCollision=ToolTip|If true, use PhysicsAsset for extent (swept box) collision checks. 493 | StaticMesh_UseSimpleLineCollision=ToolTip|If true, use PhysicsAsset for line collision checks. 494 | StaticMesh_UseSimpleRigidBodyCollision=ToolTip|If true, use simple rigid body collision. FALSE only works on static actors. 495 | StaticMesh_StreamingDistanceMultiplier=ToolTip|Allows adjusting the desired resolution of streaming textures that uses UV 0. 1.0 is the default, whereas a higher value increases the streamed-in resolution. 496 | StaticMesh_bForceFullPrecisionVerts=Tooltip|Forces the mesh to use full precision vertices on the PS3. 497 | StaticMeshFactory_bOneConvexPerUCXObject=ToolTip| If enabled, each UCX_ object in the mesh will be turned into exactly one primitive 498 | StaticMeshFactory_bReplaceExistingVertexColors=ToolTip| If enabled, existing vertex colors will be replaced with ones from the imported file 499 | StaticMeshFactory_bSingleSmoothGroupSingleTangent=ToolTip| If enabled, a single tangent set per vertex will be used in a single smoothing group 500 | TextureFactory_AlphaToEmissive=ToolTip| If enabled, link the texture's alpha to the created material's emissive color 501 | TextureFactory_AlphaToOpacity=ToolTip| If enabled, link the texture's alpha to the created material's opacity 502 | TextureFactory_AlphaToOpacityMask=ToolTip| If enabled, link the texture's alpha to the created material's opacity mask 503 | TextureFactory_AlphaToSpecular=ToolTip| If enabled, link the texture's alpha to the created material's specular color 504 | TextureFactory_Blending=ToolTip| The blend mode of the created material 505 | TextureFactory_CompressionNoAlpha=ToolTip| If enabled, the texture's alpha channel will be discarded during compression 506 | TextureFactory_CompressionSettings=ToolTip| Compression settings for the texture 507 | TextureFactory_CreateMaterial=ToolTip| If enabled, a material will automatically be created for the texture 508 | TextureFactory_DeferCompression=ToolTip| If enabled, compression is deferred until the texture is saved 509 | TextureFactory_DitherMipmapsalpha=ToolTip| If enabled, mip-map alpha values will be dithered for smooth transitions 510 | TextureFactory_FlipBook=ToolTip| If enabled, import the texture as a flipbook 511 | TextureFactory_LightMap=ToolTip| If enabled, import the texture as a lightmap 512 | TextureFactory_LightingModel=ToolTip| The lighting model of the created material 513 | TextureFactory_LODGroup=ToolTip| The group the texture belongs to 514 | TextureFactory_MipGenSettings=ToolTip| The mip-map generation settings for the texture; Allows customization of the content of the mip-map chain 515 | TextureFactory_PreserveborderA=ToolTip| If enabled, preserve the alpha value of border pixels when creating mip-maps 516 | TextureFactory_PreserveborderB=ToolTip| If enabled, preserve the blue color value of border pixels when creating mip-maps 517 | TextureFactory_PreserveborderG=ToolTip| If enabled, preserve the green color value of border pixels when creating mip-maps 518 | TextureFactory_PreserveborderR=ToolTip| If enabled, preserve the red color value of border pixels when creating mip-maps 519 | TextureFactory_RGBToDiffuse=ToolTip| If enabled, link the texture to the created material's diffuse color 520 | TextureFactory_RGBToEmissive=ToolTip| If enabled, link the texture to the created material's emissive color 521 | TextureFactory_TwoSided=ToolTip| If enabled, the created material will be two-sided 522 | TextureMovieFactory_MovieStreamSource=ToolTip| The source of the texture movie stream 523 | TextureRenderTargetCubeFactoryNew_Format=ToolTip| Pixel format of the texture render target 524 | TextureRenderTargetCubeFactoryNew_Width=ToolTip| Width of the texture render target 525 | TextureRenderTargetFactoryNew_Format=ToolTip| Pixel format of the texture render target 526 | TextureRenderTargetFactoryNew_Height=ToolTip| Height of the texture render target 527 | TextureRenderTargetFactoryNew_Width=ToolTip| Width of the texture render target 528 | TrueTypeFontFactory_ImportOptions=ToolTip| Import options for the font 529 | TrueTypeMultiFontFactory_ResFonts=ToolTip| Existing fonts to convert 530 | TrueTypeMultiFontFactory_ResHeights=ToolTip| Font height for each resolution 531 | TrueTypeMultiFontFactory_ResTests=ToolTip| Font resolution tests 532 | -------------------------------------------------------------------------------- /tests/test7.ini: -------------------------------------------------------------------------------- 1 | [XComGame.XGCharacterGenerator] 2 | ; ------------------------------------------ 3 | ; -------------- AMERICAN ------------------ 4 | ; ------------------------------------------ 5 | m_arrAmMFirstNames="Shane" 6 | m_arrAmMFirstNames="Rob" 7 | m_arrAmMFirstNames="Brad" 8 | m_arrAmMFirstNames="Cameron" 9 | m_arrAmMFirstNames="Chris" 10 | m_arrAmMFirstNames="Neal" 11 | m_arrAmMFirstNames="Jordan" 12 | m_arrAmMFirstNames="Charlie" 13 | m_arrAmMFirstNames="Jeff" 14 | m_arrAmMFirstNames="Caleb" 15 | m_arrAmMFirstNames="Eric" 16 | m_arrAmMFirstNames="Samuel" 17 | m_arrAmMFirstNames="Cory" 18 | m_arrAmMFirstNames="Neil" 19 | m_arrAmMFirstNames="Shaun" 20 | m_arrAmMFirstNames="Nat" 21 | m_arrAmMFirstNames="Calvin" 22 | m_arrAmMFirstNames="Bob" 23 | m_arrAmMFirstNames="James" 24 | m_arrAmMFirstNames="Joe" 25 | m_arrAmMFirstNames="Toby" 26 | m_arrAmMFirstNames="Andy" 27 | m_arrAmMFirstNames="Gary" 28 | m_arrAmMFirstNames="Ruben" 29 | m_arrAmMFirstNames="Matt" 30 | m_arrAmMFirstNames="Geoff" 31 | m_arrAmMFirstNames="Sidney" 32 | m_arrAmMFirstNames="William" 33 | m_arrAmMFirstNames="Tariq" 34 | m_arrAmMFirstNames="Christian" 35 | m_arrAmMFirstNames="Donny" 36 | m_arrAmMFirstNames="Tim" 37 | m_arrAmMFirstNames="Ben" 38 | m_arrAmMFirstNames="Ross" 39 | m_arrAmMFirstNames="Stephen" 40 | m_arrAmMFirstNames="Duane" 41 | m_arrAmMFirstNames="Flynn" 42 | m_arrAmMFirstNames="Jake" 43 | m_arrAmMFirstNames="Greg" 44 | m_arrAmMFirstNames="David" 45 | m_arrAmMFirstNames="Arthur" 46 | m_arrAmMFirstNames="Mickey" 47 | m_arrAmMFirstNames="Daniel" 48 | m_arrAmMFirstNames="Brian" 49 | m_arrAmMFirstNames="Mike" 50 | m_arrAmMFirstNames="Chase" 51 | m_arrAmMFirstNames="Jeremy" 52 | m_arrAmMFirstNames="Sam" 53 | m_arrAmMFirstNames="Nick" 54 | m_arrAmMFirstNames="Alex" 55 | m_arrAmMFirstNames="Tom" 56 | m_arrAmMFirstNames="Landon" 57 | m_arrAmMFirstNames="Jack" 58 | m_arrAmMFirstNames="Derek" 59 | 60 | m_arrAmFFirstNames="Mary" 61 | m_arrAmFFirstNames="Lisa" 62 | m_arrAmFFirstNames="Elizabeth" 63 | m_arrAmFFirstNames="Jennifer" 64 | m_arrAmFFirstNames="Susan" 65 | m_arrAmFFirstNames="Karen" 66 | m_arrAmFFirstNames="Helen" 67 | m_arrAmFFirstNames="Sandra" 68 | m_arrAmFFirstNames="Donna" 69 | m_arrAmFFirstNames="Carol" 70 | m_arrAmFFirstNames="Sharon" 71 | m_arrAmFFirstNames="Michelle" 72 | m_arrAmFFirstNames="Laura" 73 | m_arrAmFFirstNames="Sarah" 74 | m_arrAmFFirstNames="Kim" 75 | m_arrAmFFirstNames="Jessica" 76 | m_arrAmFFirstNames="Cynthia" 77 | m_arrAmFFirstNames="Angela" 78 | m_arrAmFFirstNames="Melissa" 79 | m_arrAmFFirstNames="Amy" 80 | m_arrAmFFirstNames="Anne" 81 | m_arrAmFFirstNames="Rebecca" 82 | m_arrAmFFirstNames="Kate" 83 | m_arrAmFFirstNames="Amanda" 84 | m_arrAmFFirstNames="Stephanie" 85 | m_arrAmFFirstNames="Christine" 86 | m_arrAmFFirstNames="Janet" 87 | m_arrAmFFirstNames="Catharine" 88 | m_arrAmFFirstNames="Diane" 89 | m_arrAmFFirstNames="Alice" 90 | m_arrAmFFirstNames="Julie" 91 | m_arrAmFFirstNames="Heather" 92 | m_arrAmFFirstNames="Jill" 93 | m_arrAmFFirstNames="Joan" 94 | m_arrAmFFirstNames="Judy" 95 | m_arrAmFFirstNames="Ashley" 96 | m_arrAmFFirstNames="Kelly" 97 | m_arrAmFFirstNames="Nicole" 98 | m_arrAmFFirstNames="Denise" 99 | m_arrAmFFirstNames="Jane" 100 | m_arrAmFFirstNames="Laurie" 101 | m_arrAmFFirstNames="Rachel" 102 | m_arrAmFFirstNames="Andrea" 103 | m_arrAmFFirstNames="Marilyn" 104 | m_arrAmFFirstNames="Bonnie" 105 | m_arrAmFFirstNames="Tina" 106 | m_arrAmFFirstNames="Emily" 107 | m_arrAmFFirstNames="Dawn" 108 | m_arrAmFFirstNames="Tracy" 109 | m_arrAmFFirstNames="Tiffany" 110 | m_arrAmFFirstNames="Wendy" 111 | m_arrAmFFirstNames="Shannon" 112 | m_arrAmFFirstNames="Carrie" 113 | m_arrAmFFirstNames="April" 114 | m_arrAmFFirstNames="Jamie" 115 | m_arrAmFFirstNames="Megan" 116 | m_arrAmFFirstNames="Erin" 117 | m_arrAmFFirstNames="Sally" 118 | m_arrAmFFirstNames="Erica" 119 | m_arrAmFFirstNames="Stacy" 120 | m_arrAmFFirstNames="Brittany" 121 | 122 | m_arrAmLastNames="Freeman" 123 | m_arrAmLastNames="Jefferson" 124 | m_arrAmLastNames="Washington" 125 | m_arrAmLastNames="Wheeler" 126 | m_arrAmLastNames="Martz" 127 | m_arrAmLastNames="Hudson" 128 | m_arrAmLastNames="Smith" 129 | m_arrAmLastNames="Johnson" 130 | m_arrAmLastNames="Williams" 131 | m_arrAmLastNames="Black" 132 | m_arrAmLastNames="Bradley" 133 | m_arrAmLastNames="Jones" 134 | m_arrAmLastNames="Brown" 135 | m_arrAmLastNames="Davis" 136 | m_arrAmLastNames="Cooke" 137 | m_arrAmLastNames="Cunningham" 138 | m_arrAmLastNames="Wilson" 139 | m_arrAmLastNames="Moore" 140 | m_arrAmLastNames="Taylor" 141 | m_arrAmLastNames="Anderson" 142 | m_arrAmLastNames="Thomas" 143 | m_arrAmLastNames="Jackson" 144 | m_arrAmLastNames="White" 145 | m_arrAmLastNames="Harris" 146 | m_arrAmLastNames="Thompson" 147 | m_arrAmLastNames="Garcia" 148 | m_arrAmLastNames="Gordon" 149 | m_arrAmLastNames="Martinez" 150 | m_arrAmLastNames="Robinson" 151 | m_arrAmLastNames="Clark" 152 | m_arrAmLastNames="Welsh" 153 | m_arrAmLastNames="Rodriguez" 154 | m_arrAmLastNames="Meyers" 155 | m_arrAmLastNames="Lewis" 156 | m_arrAmLastNames="Lee" 157 | m_arrAmLastNames="Walker" 158 | m_arrAmLastNames="Martin" 159 | m_arrAmLastNames="Hall" 160 | m_arrAmLastNames="Allen" 161 | m_arrAmLastNames="Murphy" 162 | m_arrAmLastNames="Murray" 163 | m_arrAmLastNames="Young" 164 | m_arrAmLastNames="Hernandez" 165 | m_arrAmLastNames="King" 166 | m_arrAmLastNames="Wright" 167 | m_arrAmLastNames="Perry" 168 | m_arrAmLastNames="Hill" 169 | m_arrAmLastNames="Scott" 170 | m_arrAmLastNames="Green" 171 | m_arrAmLastNames="Adams" 172 | m_arrAmLastNames="Baker" 173 | m_arrAmLastNames="Carter" 174 | m_arrAmLastNames="Mitchell" 175 | m_arrAmLastNames="Roberts" 176 | m_arrAmLastNames="Turner" 177 | m_arrAmLastNames="Phillips" 178 | m_arrAmLastNames="Campbell" 179 | m_arrAmLastNames="Parker" 180 | m_arrAmLastNames="Evans" 181 | m_arrAmLastNames="Edwards" 182 | m_arrAmLastNames="Collins" 183 | m_arrAmLastNames="Morris" 184 | m_arrAmLastNames="Rodgers" 185 | m_arrAmLastNames="Reed" 186 | m_arrAmLastNames="Cook" 187 | m_arrAmLastNames="Morgan" 188 | m_arrAmLastNames="Bell" 189 | m_arrAmLastNames="Bailey" 190 | m_arrAmLastNames="Cooper" 191 | m_arrAmLastNames="Richardson" 192 | m_arrAmLastNames="Cox" 193 | m_arrAmLastNames="Ward" 194 | m_arrAmLastNames="Peterson" 195 | m_arrAmLastNames="Gray" 196 | m_arrAmLastNames="James" 197 | m_arrAmLastNames="Watson" 198 | m_arrAmLastNames="Ramirez" 199 | m_arrAmLastNames="Cook" 200 | m_arrAmLastNames="Brooks" 201 | m_arrAmLastNames="Kelly" 202 | m_arrAmLastNames="Sanders" 203 | m_arrAmLastNames="Bennett" 204 | m_arrAmLastNames="Wood" 205 | m_arrAmLastNames="Barnes" 206 | m_arrAmLastNames="Ross" 207 | m_arrAmLastNames="Henderson" 208 | m_arrAmLastNames="Coleman" 209 | m_arrAmLastNames="Jenkins" 210 | m_arrAmLastNames="Powell" 211 | m_arrAmLastNames="Long" 212 | m_arrAmLastNames="Patterson" 213 | m_arrAmLastNames="Flores" 214 | m_arrAmLastNames="Butler" 215 | m_arrAmLastNames="Bryant" 216 | m_arrAmLastNames="Alexander" 217 | m_arrAmLastNames="Russell" 218 | m_arrAmLastNames="Griffin" 219 | m_arrAmLastNames="Hayes" 220 | m_arrAmLastNames="Hamilton" 221 | m_arrAmLastNames="Graham" 222 | m_arrAmLastNames="Sullivan" 223 | m_arrAmLastNames="Woods" 224 | m_arrAmLastNames="Cole" 225 | m_arrAmLastNames="West" 226 | m_arrAmLastNames="Jordan" 227 | m_arrAmLastNames="Owens" 228 | m_arrAmLastNames="Reynolds" 229 | m_arrAmLastNames="Fisher" 230 | m_arrAmLastNames="Ellis" 231 | m_arrAmLastNames="Harrison" 232 | m_arrAmLastNames="Gibson" 233 | m_arrAmLastNames="Marshall" 234 | m_arrAmLastNames="Wells" 235 | m_arrAmLastNames="Simpson" 236 | m_arrAmLastNames="Stevens" 237 | m_arrAmLastNames="Reynolds" 238 | m_arrAmLastNames="Tucker" 239 | m_arrAmLastNames="Porter" 240 | m_arrAmLastNames="Hunter" 241 | m_arrAmLastNames="Hicks" 242 | m_arrAmLastNames="Crawford" 243 | m_arrAmLastNames="Henry" 244 | m_arrAmLastNames="Boyd" 245 | m_arrAmLastNames="Mason" 246 | m_arrAmLastNames="Kennedy" 247 | m_arrAmLastNames="Warren" 248 | m_arrAmLastNames="Dixon" 249 | m_arrAmLastNames="Burns" 250 | m_arrAmLastNames="Gordon" 251 | m_arrAmLastNames="Shaw" 252 | m_arrAmLastNames="Rice" 253 | m_arrAmLastNames="Robertson" 254 | m_arrAmLastNames="Hunt" 255 | m_arrAmLastNames="Daniels" 256 | m_arrAmLastNames="Palmer" 257 | m_arrAmLastNames="Mills" 258 | m_arrAmLastNames="Nichols" 259 | m_arrAmLastNames="Grant" 260 | m_arrAmLastNames="Knight" 261 | m_arrAmLastNames="Ferguson" 262 | m_arrAmLastNames="Rose" 263 | m_arrAmLastNames="Hawkins" 264 | m_arrAmLastNames="Dunn" 265 | m_arrAmLastNames="Perkins" 266 | m_arrAmLastNames="Hudson" 267 | m_arrAmLastNames="Spencer" 268 | m_arrAmLastNames="Gardner" 269 | m_arrAmLastNames="Payne" 270 | m_arrAmLastNames="Pierce" 271 | m_arrAmLastNames="Berry" 272 | m_arrAmLastNames="Matthews" 273 | m_arrAmLastNames="Wagner" 274 | m_arrAmLastNames="Willis" 275 | m_arrAmLastNames="Ray" 276 | m_arrAmLastNames="Watkins" 277 | m_arrAmLastNames="Olson" 278 | m_arrAmLastNames="Carroll" 279 | m_arrAmLastNames="Duncan" 280 | m_arrAmLastNames="Snyder" 281 | m_arrAmLastNames="Hart" 282 | m_arrAmLastNames="Cunningham" 283 | m_arrAmLastNames="Andrews" 284 | m_arrAmLastNames="Harper" 285 | m_arrAmLastNames="Fox" 286 | m_arrAmLastNames="Riley" 287 | m_arrAmLastNames="Armstrong" 288 | m_arrAmLastNames="Carpenter" 289 | m_arrAmLastNames="Weaver" 290 | m_arrAmLastNames="Greene" 291 | m_arrAmLastNames="Lawrence" 292 | m_arrAmLastNames="Elliot" 293 | m_arrAmLastNames="Lane" 294 | m_arrAmLastNames="Nelson" 295 | m_arrAmLastNames="Stewart" 296 | m_arrAmLastNames="Howard" 297 | m_arrAmLastNames="Price" 298 | m_arrAmLastNames="Hughes" 299 | m_arrAmLastNames="Wallace" 300 | m_arrAmLastNames="McDonald" 301 | m_arrAmLastNames="Webb" 302 | m_arrAmLastNames="Holmes" 303 | m_arrAmLastNames="Stone" 304 | m_arrAmLastNames="Arnold" 305 | 306 | ; ------------------------------------------ 307 | ; -------------- RUSSIAN ------------------- 308 | ; ------------------------------------------ 309 | 310 | m_arrRsMFirstNames="Aleksandr" 311 | m_arrRsMFirstNames="Sergey" 312 | m_arrRsMFirstNames="Vladimir" 313 | m_arrRsMFirstNames="Andrey" 314 | m_arrRsMFirstNames="Alexei" 315 | m_arrRsMFirstNames="Dmitriy" 316 | m_arrRsMFirstNames="Mikhail" 317 | m_arrRsMFirstNames="Igor" 318 | m_arrRsMFirstNames="Yuri" 319 | m_arrRsMFirstNames="Nikolai" 320 | m_arrRsMFirstNames="Andrey" 321 | m_arrRsMFirstNames="Anatoly" 322 | m_arrRsMFirstNames="Ivan" 323 | m_arrRsMFirstNames="Maxim" 324 | m_arrRsMFirstNames="Denis" 325 | m_arrRsMFirstNames="Yegor" 326 | m_arrRsMFirstNames="Artyom" 327 | m_arrRsMFirstNames="Viktor" 328 | m_arrRsMFirstNames="Konstantin" 329 | m_arrRsMFirstNames="Kirill" 330 | m_arrRsMFirstNames="Vasily" 331 | m_arrRsMFirstNames="Stanislav" 332 | m_arrRsMFirstNames="Pyotr" 333 | m_arrRsMFirstNames="Vanya" 334 | m_arrRsMFirstNames="Boris" 335 | m_arrRsMFirstNames="Kostya" 336 | m_arrRsFFirstNames="Galena" 337 | m_arrRsFFirstNames="Elena" 338 | m_arrRsFFirstNames="Olga" 339 | m_arrRsFFirstNames="Tatyana" 340 | m_arrRsFFirstNames="Irina" 341 | m_arrRsFFirstNames="Natalia" 342 | m_arrRsFFirstNames="Anna" 343 | m_arrRsFFirstNames="Svetlana" 344 | m_arrRsFFirstNames="Maria" 345 | m_arrRsFFirstNames="Marina" 346 | m_arrRsFFirstNames="Ludmilla" 347 | m_arrRsFFirstNames="Anastasiya" 348 | m_arrRsFFirstNames="Alexandra" 349 | m_arrRsFFirstNames="Polina" 350 | m_arrRsFFirstNames="Sofia" 351 | m_arrRsFFirstNames="Katarina" 352 | m_arrRsFFirstNames="Zuzana" 353 | m_arrRsFFirstNames="Eva" 354 | m_arrRsMLastNames="Smirnov" 355 | m_arrRsMLastNames="Ivanov" 356 | m_arrRsMLastNames="Kuznetsov" 357 | m_arrRsMLastNames="Popov" 358 | m_arrRsMLastNames="Sokolov" 359 | m_arrRsMLastNames="Lebedev" 360 | m_arrRsMLastNames="Kozlov" 361 | m_arrRsMLastNames="Novikov" 362 | m_arrRsMLastNames="Morozov" 363 | m_arrRsMLastNames="Petrov" 364 | m_arrRsMLastNames="Volkov" 365 | m_arrRsMLastNames="Solovyov" 366 | m_arrRsMLastNames="Vasilyev" 367 | m_arrRsMLastNames="Zaytsev" 368 | m_arrRsMLastNames="Pavlov" 369 | m_arrRsMLastNames="Semyenov" 370 | m_arrRsMLastNames="Chepurnov" 371 | m_arrRsMLastNames="Golubev" 372 | m_arrRsMLastNames="Vinogradov" 373 | m_arrRsMLastNames="Bogdanov" 374 | m_arrRsMLastNames="Vorobyov" 375 | m_arrRsMLastNames="Sidorov" 376 | m_arrRsMLastNames="Gusev" 377 | m_arrRsMLastNames="Dobrynin" 378 | m_arrRsMLastNames="Zinchenko" 379 | m_arrRsMLastNames="Ignatyev" 380 | m_arrRsMLastNames="Ilyushin" 381 | m_arrRsMLastNames="Malakhov" 382 | 383 | m_arrRsFLastNames="Smirnova" 384 | m_arrRsFLastNames="Ivanova" 385 | m_arrRsFLastNames="Kuznetsova" 386 | m_arrRsFLastNames="Popova" 387 | m_arrRsFLastNames="Sokolova" 388 | m_arrRsFLastNames="Lebedeva" 389 | m_arrRsFLastNames="Kozlova" 390 | m_arrRsFLastNames="Novikova" 391 | m_arrRsFLastNames="Morozova" 392 | m_arrRsFLastNames="Petrova" 393 | m_arrRsFLastNames="Volkova" 394 | m_arrRsFLastNames="Solovyova" 395 | m_arrRsFLastNames="Vasilyeva" 396 | m_arrRsFLastNames="Zaytseva" 397 | m_arrRsFLastNames="Pavlova" 398 | m_arrRsFLastNames="Semyenova" 399 | m_arrRsFLastNames="Chepurnova" 400 | m_arrRsFLastNames="Golubeva" 401 | m_arrRsFLastNames="Vinogradova" 402 | m_arrRsFLastNames="Bogdanova" 403 | m_arrRsFLastNames="Vorobyova" 404 | m_arrRsFLastNames="Sidorova" 405 | m_arrRsFLastNames="Guseva" 406 | m_arrRsFLastNames="Dobrynina" 407 | m_arrRsFLastNames="Zinchenko" 408 | m_arrRsFLastNames="Ignatyeva" 409 | m_arrRsFLastNames="Ilyushina" 410 | m_arrRsFLastNames="Malakhova" 411 | 412 | ; ------------------------------------------ 413 | ; -------------- CHINESE ------------------- 414 | ; ------------------------------------------ 415 | 416 | m_arrChMFirstNames="Wei" 417 | m_arrChMFirstNames="Hao" 418 | m_arrChMFirstNames="Dong" 419 | m_arrChMFirstNames="Ming" 420 | m_arrChMFirstNames="Tao" 421 | m_arrChMFirstNames="Zhuang" 422 | m_arrChMFirstNames="Chen" 423 | m_arrChMFirstNames="Cheng" 424 | m_arrChMFirstNames="Chi" 425 | m_arrChMFirstNames="Kong" 426 | m_arrChMFirstNames="Fei" 427 | m_arrChMFirstNames="Guang" 428 | m_arrChMFirstNames="Ho" 429 | m_arrChMFirstNames="Jun" 430 | m_arrChMFirstNames="Kaun-Yin" 431 | m_arrChMFirstNames="Lian" 432 | m_arrChMFirstNames="Liang" 433 | m_arrChMFirstNames="Lok" 434 | m_arrChMFirstNames="Long" 435 | m_arrChMFirstNames="On" 436 | m_arrChMFirstNames="Park" 437 | m_arrChMFirstNames="Shaiming" 438 | m_arrChMFirstNames="Shen" 439 | m_arrChMFirstNames="Sheng" 440 | m_arrChMFirstNames="Sying" 441 | m_arrChMFirstNames="Ye" 442 | m_arrChFFirstNames="Ying" 443 | m_arrChFFirstNames="Ping" 444 | m_arrChFFirstNames="Xue" 445 | m_arrChFFirstNames="An" 446 | m_arrChFFirstNames="Da-Xia" 447 | m_arrChFFirstNames="Fang Yin" 448 | m_arrChFFirstNames="Feng" 449 | m_arrChFFirstNames="Huan Yue" 450 | m_arrChFFirstNames="Hui Ying" 451 | m_arrChFFirstNames="Jia Li" 452 | m_arrChFFirstNames="Jiang Li" 453 | m_arrChFFirstNames="Li Mei" 454 | m_arrChFFirstNames="Li Ming" 455 | m_arrChFFirstNames="Xiao Chen" 456 | m_arrChFFirstNames="Yue Wan" 457 | m_arrChFFirstNames="Yue Ying" 458 | m_arrChFFirstNames="Zhi" 459 | m_arrChFFirstNames="Li Wei" 460 | m_arrChLastNames="Li" 461 | m_arrChLastNames="Wang" 462 | m_arrChLastNames="Zhang" 463 | m_arrChLastNames="Zhao" 464 | m_arrChLastNames="Chen" 465 | m_arrChLastNames="Yang" 466 | m_arrChLastNames="Wu" 467 | m_arrChLastNames="Liu" 468 | m_arrChLastNames="Huang" 469 | m_arrChLastNames="Zhou" 470 | m_arrChLastNames="Xu" 471 | m_arrChLastNames="Zhu" 472 | m_arrChLastNames="Lin" 473 | m_arrChLastNames="Sun" 474 | m_arrChLastNames="Ma" 475 | m_arrChLastNames="Gao" 476 | m_arrChLastNames="Hu" 477 | m_arrChLastNames="Zheng" 478 | m_arrChLastNames="Guo" 479 | m_arrChLastNames="Xiao" 480 | m_arrChLastNames="Ho" 481 | m_arrChLastNames="Song" 482 | m_arrChLastNames="Shen" 483 | m_arrChLastNames="Deng" 484 | m_arrChLastNames="Liang" 485 | m_arrChLastNames="Ye" 486 | m_arrChLastNames="Fong" 487 | m_arrChLastNames="Cheng" 488 | m_arrChLastNames="Pan" 489 | m_arrChLastNames="Yuan" 490 | m_arrChLastNames="Peng" 491 | 492 | ; ------------------------------------------ 493 | ; -------------- INDIAN ------------------- 494 | ; ------------------------------------------ 495 | 496 | m_arrInMFirstNames="Ananda" 497 | m_arrInMFirstNames="Abhijit" 498 | m_arrInMFirstNames="Jowar" 499 | m_arrInMFirstNames="Karan" 500 | m_arrInMFirstNames="Narayan" 501 | m_arrInMFirstNames="Navneet" 502 | m_arrInMFirstNames="Suresh" 503 | m_arrInMFirstNames="Saurabh" 504 | m_arrInMFirstNames="Amit" 505 | m_arrInMFirstNames="Arpit" 506 | m_arrInMFirstNames="Amitabh" 507 | m_arrInMFirstNames="Saman" 508 | m_arrInMFirstNames="Abhinav" 509 | m_arrInMFirstNames="Aditya" 510 | m_arrInMFirstNames="Akash" 511 | m_arrInMFirstNames="Anish" 512 | m_arrInMFirstNames="Arjun" 513 | m_arrInMFirstNames="Dhruv" 514 | m_arrInMFirstNames="Ishan" 515 | m_arrInMFirstNames="Krishna" 516 | m_arrInMFirstNames="Mihir" 517 | m_arrInMFirstNames="Neel" 518 | m_arrInMFirstNames="Nikhil" 519 | m_arrInMFirstNames="Pranav" 520 | m_arrInMFirstNames="Rahul" 521 | m_arrInMFirstNames="Rishi" 522 | m_arrInMFirstNames="Rajan" 523 | m_arrInMFirstNames="Rohit" 524 | m_arrInMFirstNames="Shankar" 525 | m_arrInMFirstNames="Varun" 526 | m_arrInMFirstNames="Vedant" 527 | m_arrInMFirstNames="Yash" 528 | 529 | m_arrInFFirstNames="Arpita" 530 | m_arrInFFirstNames="Ekta" 531 | m_arrInFFirstNames="Kanyakumari" 532 | m_arrInFFirstNames="Kavita" 533 | m_arrInFFirstNames="Lakshmi" 534 | m_arrInFFirstNames="Noora" 535 | m_arrInFFirstNames="Parvati" 536 | m_arrInFFirstNames="Priyamvada" 537 | m_arrInFFirstNames="Seema" 538 | m_arrInFFirstNames="Amani" 539 | m_arrInFFirstNames="Amiyah" 540 | m_arrInFFirstNames="Ananya" 541 | m_arrInFFirstNames="Cali" 542 | m_arrInFFirstNames="Diya" 543 | m_arrInFFirstNames="Esha" 544 | m_arrInFFirstNames="Kalee" 545 | m_arrInFFirstNames="Kalia" 546 | m_arrInFFirstNames="Leena" 547 | m_arrInFFirstNames="Lina" 548 | m_arrInFFirstNames="Neha" 549 | m_arrInFFirstNames="Priya" 550 | m_arrInFFirstNames="Shivani" 551 | m_arrInFFirstNames="Shreya" 552 | m_arrInFFirstNames="Simran" 553 | m_arrInFFirstNames="Tanvi" 554 | m_arrInFFirstNames="Varsha" 555 | 556 | m_arrInLastNames="Sharma" 557 | m_arrInLastNames="Varma" 558 | m_arrInLastNames="Gupta" 559 | m_arrInLastNames="Malhotra" 560 | m_arrInLastNames="Bhatnagar" 561 | m_arrInLastNames="Saxena" 562 | m_arrInLastNames="Kapur" 563 | m_arrInLastNames="Singh" 564 | m_arrInLastNames="Mehra" 565 | m_arrInLastNames="Chopra" 566 | m_arrInLastNames="Sarin" 567 | m_arrInLastNames="Malik" 568 | m_arrInLastNames="Chatterjee" 569 | m_arrInLastNames="Sen" 570 | m_arrInLastNames="Bose" 571 | m_arrInLastNames="Sengupta" 572 | m_arrInLastNames="Das" 573 | m_arrInLastNames="Dasgupta" 574 | m_arrInLastNames="Banerjee" 575 | m_arrInLastNames="Dutta" 576 | m_arrInLastNames="Nayar" 577 | m_arrInLastNames="Pillai" 578 | m_arrInLastNames="Rao" 579 | m_arrInLastNames="Jayaraman" 580 | m_arrInLastNames="Venkatesan" 581 | m_arrInLastNames="Krishnan" 582 | m_arrInLastNames="Subramanium" 583 | m_arrInLastNames="Rangan" 584 | m_arrInLastNames="Rangarajan" 585 | m_arrInLastNames="Singh" 586 | m_arrInLastNames="Yadav" 587 | m_arrInLastNames="Jhadav" 588 | m_arrInLastNames="Jaiteley" 589 | m_arrInLastNames="Chauhan" 590 | m_arrInLastNames="Mistry" 591 | m_arrInLastNames="Khan" 592 | m_arrInLastNames="Shah" 593 | m_arrInLastNames="Mehta" 594 | m_arrInLastNames="Patel" 595 | m_arrInLastNames="Patil" 596 | m_arrInLastNames="Pawar" 597 | m_arrInLastNames="Gavde" 598 | m_arrInLastNames="Kadam" 599 | m_arrInLastNames="Tambe" 600 | m_arrInLastNames="Chavan" 601 | 602 | ; ------------------------------------------ 603 | ; -------------- AFRICAN ------------------- 604 | ; ------------------------------------------ 605 | 606 | m_arrAfMFirstNames="Abimbola" 607 | m_arrAfMFirstNames="Abioye" 608 | m_arrAfMFirstNames="Adegoke" 609 | m_arrAfMFirstNames="Afolabi" 610 | m_arrAfMFirstNames="Amadi" 611 | m_arrAfMFirstNames="Ayokunle" 612 | m_arrAfMFirstNames="Azubuike" 613 | m_arrAfMFirstNames="Babajide" 614 | m_arrAfMFirstNames="Babatunde" 615 | m_arrAfMFirstNames="Berko" 616 | m_arrAfMFirstNames="Bongani" 617 | m_arrAfMFirstNames="Bosede" 618 | m_arrAfMFirstNames="Chidi" 619 | m_arrAfMFirstNames="Chidubem" 620 | m_arrAfMFirstNames="Chimeka" 621 | m_arrAfMFirstNames="Chike" 622 | m_arrAfMFirstNames="Chima" 623 | m_arrAfMFirstNames="Chiumbo" 624 | m_arrAfMFirstNames="Dakarai" 625 | m_arrAfMFirstNames="Ekwuenme" 626 | m_arrAfMFirstNames="Emeka" 627 | m_arrAfMFirstNames="Enitan" 628 | m_arrAfMFirstNames="Faraji" 629 | m_arrAfMFirstNames="Femi" 630 | m_arrAfMFirstNames="Fungai" 631 | m_arrAfMFirstNames="Gwandoya" 632 | m_arrAfMFirstNames="Imamu" 633 | m_arrAfMFirstNames="Isingoma" 634 | m_arrAfMFirstNames="Jalani" 635 | m_arrAfMFirstNames="Jengo" 636 | m_arrAfMFirstNames="Kato" 637 | m_arrAfMFirstNames="Kgosi" 638 | m_arrAfMFirstNames="Khamisi" 639 | m_arrAfMFirstNames="Kibwe" 640 | m_arrAfMFirstNames="Kofi" 641 | m_arrAfMFirstNames="Kojo" 642 | m_arrAfMFirstNames="Kwame" 643 | m_arrAfMFirstNames="Kwasi" 644 | m_arrAfMFirstNames="Mamadou" 645 | m_arrAfMFirstNames="Masambe" 646 | m_arrAfMFirstNames="Mosi" 647 | m_arrAfMFirstNames="Nkosana" 648 | m_arrAfMFirstNames="Ochieng" 649 | m_arrAfMFirstNames="Olabode" 650 | m_arrAfMFirstNames="Olufemi" 651 | m_arrAfMFirstNames="Olujimi" 652 | m_arrAfMFirstNames="Sefu" 653 | m_arrAfMFirstNames="Simba" 654 | m_arrAfMFirstNames="Sizwe" 655 | m_arrAfMFirstNames="Tafari" 656 | m_arrAfMFirstNames="Thulani" 657 | m_arrAfMFirstNames="Wekesa" 658 | m_arrAfMFirstNames="Zuberi" 659 | m_arrAfMFirstNames="Thabo" 660 | 661 | m_arrAfFFirstNames="Aba" 662 | m_arrAfFFirstNames="Abebi" 663 | m_arrAfFFirstNames="Akili" 664 | m_arrAfFFirstNames="Amadi" 665 | m_arrAfFFirstNames="Amina" 666 | m_arrAfFFirstNames="Arziki" 667 | m_arrAfFFirstNames="Asha" 668 | m_arrAfFFirstNames="Aziza" 669 | m_arrAfFFirstNames="Binta" 670 | m_arrAfFFirstNames="Bolanle" 671 | m_arrAfFFirstNames="Bonme" 672 | m_arrAfFFirstNames="Caimile" 673 | m_arrAfFFirstNames="Cataval" 674 | m_arrAfFFirstNames="Chika" 675 | m_arrAfFFirstNames="Chipo" 676 | m_arrAfFFirstNames="Dayo" 677 | m_arrAfFFirstNames="Deka" 678 | m_arrAfFFirstNames="Delu" 679 | m_arrAfFFirstNames="Denisha" 680 | m_arrAfFFirstNames="Dore" 681 | m_arrAfFFirstNames="Faiza" 682 | m_arrAfFFirstNames="Fayola" 683 | m_arrAfFFirstNames="Habika" 684 | m_arrAfFFirstNames="Hadiya" 685 | m_arrAfFFirstNames="Halima" 686 | m_arrAfFFirstNames="Hasina" 687 | m_arrAfFFirstNames="Iman" 688 | m_arrAfFFirstNames="Iniko" 689 | m_arrAfFFirstNames="Isoke" 690 | m_arrAfFFirstNames="Jamila" 691 | m_arrAfFFirstNames="Kadija" 692 | m_arrAfFFirstNames="Kali" 693 | m_arrAfFFirstNames="Kasindra" 694 | m_arrAfFFirstNames="Kesia" 695 | m_arrAfFFirstNames="Habika" 696 | m_arrAfFFirstNames="Lehana" 697 | m_arrAfFFirstNames="Maizah" 698 | m_arrAfFFirstNames="Malika" 699 | m_arrAfFFirstNames="Mandisa" 700 | m_arrAfFFirstNames="Marjani" 701 | m_arrAfFFirstNames="Naja" 702 | m_arrAfFFirstNames="Neema" 703 | m_arrAfFFirstNames="Oba" 704 | m_arrAfFFirstNames="Rafiya" 705 | m_arrAfFFirstNames="Safara" 706 | m_arrAfFFirstNames="Shasa" 707 | m_arrAfFFirstNames="Sika" 708 | m_arrAfFFirstNames="Simbra" 709 | m_arrAfFFirstNames="Taja" 710 | m_arrAfFFirstNames="Takiyah" 711 | m_arrAfFFirstNames="Tamala" 712 | m_arrAfFFirstNames="Tanginika" 713 | m_arrAfFFirstNames="Habika" 714 | m_arrAfFFirstNames="Tayla" 715 | m_arrAfFFirstNames="Tendai" 716 | m_arrAfFFirstNames="Waseme" 717 | m_arrAfFFirstNames="Xhosa" 718 | m_arrAfFFirstNames="Zahara" 719 | m_arrAfFFirstNames="Zalika" 720 | m_arrAfFFirstNames="Zarina" 721 | m_arrAfFFirstNames="Zisiwe" 722 | m_arrAfFFirstNames="Xhosa" 723 | m_arrAfFFirstNames="Zahara" 724 | m_arrAfFFirstNames="Zalika" 725 | m_arrAfFFirstNames="Zarina" 726 | 727 | m_arrAfLastNames="Baloyi" 728 | m_arrAfLastNames="Bapela" 729 | m_arrAfLastNames="Bengu" 730 | m_arrAfLastNames="Bikani" 731 | m_arrAfLastNames="Boroto" 732 | m_arrAfLastNames="Buthelezi" 733 | m_arrAfLastNames="Chikunga" 734 | m_arrAfLastNames="Dambuza" 735 | m_arrAfLastNames="Digkale" 736 | m_arrAfLastNames="Dubazana" 737 | m_arrAfLastNames="Farisani" 738 | m_arrAfLastNames="Gamede" 739 | m_arrAfLastNames="Gasebonwe" 740 | m_arrAfLastNames="Godongwana" 741 | m_arrAfLastNames="Gunda" 742 | m_arrAfLastNames="Hangana" 743 | m_arrAfLastNames="Kekana" 744 | m_arrAfLastNames="Khumalo" 745 | m_arrAfLastNames="Kotsi" 746 | m_arrAfLastNames="Legetho" 747 | m_arrAfLastNames="Luthuli" 748 | m_arrAfLastNames="Akinwande" 749 | m_arrAfLastNames="Abanda" 750 | m_arrAfLastNames="Kebbe" 751 | m_arrAfLastNames="Agooda" 752 | m_arrAfLastNames="Diallo" 753 | m_arrAfLastNames="Fofana" 754 | m_arrAfLastNames="Mensah" 755 | m_arrAfLastNames="Mbeki" 756 | m_arrAfLastNames="Okafor" 757 | m_arrAfLastNames="Yeboah" 758 | m_arrAfLastNames="Cissoko" 759 | m_arrAfLastNames="Dioppe" 760 | m_arrAfLastNames="Okeke" 761 | m_arrAfLastNames="Owusu" 762 | m_arrAfLastNames="Ballo" 763 | m_arrAfLastNames="Jalloh" 764 | m_arrAfLastNames="Nwosu" 765 | m_arrAfLastNames="Okoro" 766 | m_arrAfLastNames="Sesay" 767 | m_arrAfLastNames="Kuumba" 768 | m_arrAfLastNames="Mawakizi" 769 | m_arrAfLastNames="Ondede" 770 | m_arrAfLastNames="Mabaso" 771 | m_arrAfLastNames="Mabuza" 772 | m_arrAfLastNames="Madasa" 773 | m_arrAfLastNames="Mafolo" 774 | m_arrAfLastNames="Makhuba" 775 | m_arrAfLastNames="Manana" 776 | m_arrAfLastNames="Masango" 777 | m_arrAfLastNames="Masutha" 778 | m_arrAfLastNames="Mayunde" 779 | m_arrAfLastNames="Mazibuko" 780 | m_arrAfLastNames="Miambo" 781 | m_arrAfLastNames="Moshodi" 782 | m_arrAfLastNames="Mubu" 783 | m_arrAfLastNames="Muthambi" 784 | m_arrAfLastNames="Ngele" 785 | 786 | ; ------------------------------------------ 787 | ; -------------- MEXICAN ------------------- 788 | ; ------------------------------------------ 789 | 790 | m_arrMxMFirstNames="Alejandro" 791 | m_arrMxMFirstNames="Juan Carlos" 792 | m_arrMxMFirstNames="Miguel" 793 | m_arrMxMFirstNames="Eduardo" 794 | m_arrMxMFirstNames="Fernando" 795 | m_arrMxMFirstNames="Carlos" 796 | m_arrMxMFirstNames="Rodrigo" 797 | m_arrMxMFirstNames="Ricardo" 798 | m_arrMxMFirstNames="Javier" 799 | m_arrMxMFirstNames="Jose Luis" 800 | m_arrMxMFirstNames="Carlos" 801 | m_arrMxMFirstNames="Cesar" 802 | m_arrMxMFirstNames="Emilio" 803 | m_arrMxMFirstNames="Enrique" 804 | m_arrMxMFirstNames="Ernesto" 805 | m_arrMxMFirstNames="Felix" 806 | m_arrMxMFirstNames="Gabriel" 807 | m_arrMxMFirstNames="Hector" 808 | m_arrMxMFirstNames="Humberto" 809 | m_arrMxMFirstNames="Isidoro" 810 | m_arrMxMFirstNames="Ivan" 811 | m_arrMxMFirstNames="Jesus" 812 | m_arrMxMFirstNames="Jorge" 813 | m_arrMxMFirstNames="Jose" 814 | m_arrMxMFirstNames="Juan" 815 | m_arrMxMFirstNames="Osvaldo" 816 | m_arrMxMFirstNames="Raul" 817 | m_arrMxMFirstNames="Roman" 818 | m_arrMxMFirstNames="Ruben" 819 | m_arrMxMFirstNames="Santiago" 820 | m_arrMxMFirstNames="Sergio" 821 | m_arrMxMFirstNames="Victor" 822 | m_arrMxFFirstNames="Adriana" 823 | m_arrMxFFirstNames="Ana" 824 | m_arrMxFFirstNames="Analucia" 825 | m_arrMxFFirstNames="Beatriz" 826 | m_arrMxFFirstNames="Dominga" 827 | m_arrMxFFirstNames="Elsa" 828 | m_arrMxFFirstNames="Encarnacion" 829 | m_arrMxFFirstNames="Esmerelda" 830 | m_arrMxFFirstNames="Gabriela" 831 | m_arrMxFFirstNames="Graciela" 832 | m_arrMxFFirstNames="Guadalupe" 833 | m_arrMxFFirstNames="Inez" 834 | m_arrMxFFirstNames="Juanita" 835 | m_arrMxFFirstNames="Katia" 836 | m_arrMxFFirstNames="Leticia" 837 | m_arrMxFFirstNames="Maria" 838 | m_arrMxFFirstNames="Maricruz" 839 | m_arrMxFFirstNames="Patricia" 840 | m_arrMxFFirstNames="Rosa" 841 | m_arrMxFFirstNames="Rosario" 842 | m_arrMxFFirstNames="Silvia" 843 | m_arrMxFFirstNames="Xenia" 844 | m_arrMxFFirstNames="Yvonne" 845 | m_arrMxLastNames="Hernandez" 846 | m_arrMxLastNames="Garcia" 847 | m_arrMxLastNames="Martinez" 848 | m_arrMxLastNames="Lopez" 849 | m_arrMxLastNames="Gonzalez" 850 | m_arrMxLastNames="Rodriguez" 851 | m_arrMxLastNames="Perez" 852 | m_arrMxLastNames="Sanchez" 853 | m_arrMxLastNames="Ramirez" 854 | m_arrMxLastNames="Marquez" 855 | m_arrMxLastNames="Ruiz" 856 | m_arrMxLastNames="Santiago" 857 | m_arrMxLastNames="Rivera" 858 | m_arrMxLastNames="Torres" 859 | m_arrMxLastNames="Guzman" 860 | m_arrMxLastNames="Pena" 861 | m_arrMxLastNames="Delgado" 862 | m_arrMxLastNames="Valdez" 863 | m_arrMxLastNames="Vega" 864 | m_arrMxLastNames="Chavez" 865 | m_arrMxLastNames="Moreno" 866 | m_arrMxLastNames="Medina" 867 | m_arrMxLastNames="Soto" 868 | m_arrMxLastNames="Vargas" 869 | m_arrMxLastNames="Diaz" 870 | m_arrMxLastNames="Flores" 871 | m_arrMxLastNames="Garza" 872 | m_arrMxLastNames="Castillo" 873 | 874 | ; ------------------------------------------ 875 | ; -------------- Arabian ------------------- 876 | ; ------------------------------------------ 877 | 878 | m_arrAbMFirstNames="Mohammed" 879 | m_arrAbMFirstNames="Ahmed" 880 | m_arrAbMFirstNames="Ali" 881 | m_arrAbMFirstNames="Said" 882 | m_arrAbMFirstNames="Hamza" 883 | m_arrAbMFirstNames="Ibrahim" 884 | m_arrAbMFirstNames="Rachid" 885 | m_arrAbMFirstNames="Mustapha" 886 | m_arrAbMFirstNames="Mahmoud" 887 | m_arrAbMFirstNames="Youssef" 888 | m_arrAbMFirstNames="Abdullah" 889 | m_arrAbMFirstNames="Tareq" 890 | m_arrAbMFirstNames="Hassan" 891 | m_arrAbMFirstNames="Khaled" 892 | m_arrAbFFirstNames="Aya" 893 | m_arrAbFFirstNames="Fatima" 894 | m_arrAbFFirstNames="Raniya" 895 | m_arrAbFFirstNames="Khadija" 896 | m_arrAbFFirstNames="Sarah" 897 | m_arrAbFFirstNames="Malika" 898 | m_arrAbFFirstNames="Mariam" 899 | m_arrAbFFirstNames="Hoda" 900 | m_arrAbFFirstNames="Karima" 901 | m_arrAbFFirstNames="Saida" 902 | m_arrAbFFirstNames="Nasreem" 903 | m_arrAbFFirstNames="Naima" 904 | m_arrAbFFirstNames="Safiya" 905 | m_arrAbLastNames="Haddad" 906 | m_arrAbLastNames="Khoury" 907 | m_arrAbLastNames="Hariri" 908 | m_arrAbLastNames="Kharam" 909 | m_arrAbLastNames="Ajram" 910 | m_arrAbLastNames="Suleiman" 911 | m_arrAbLastNames="Rahman" 912 | m_arrAbLastNames="Amin" 913 | m_arrAbLastNames="Asad" 914 | m_arrAbLastNames="Aziz" 915 | m_arrAbLastNames="Farouk" 916 | m_arrAbLastNames="Ghaffar" 917 | m_arrAbLastNames="Ghalib" 918 | m_arrAbLastNames="Hashim" 919 | m_arrAbLastNames="Haidar" 920 | m_arrAbLastNames="Imad" 921 | m_arrAbLastNames="Isra" 922 | m_arrAbLastNames="Jalaal" 923 | m_arrAbLastNames="Jawahir" 924 | m_arrAbLastNames="Majid" 925 | m_arrAbLastNames="Mansoor" 926 | m_arrAbLastNames="Mufaddal" 927 | m_arrAbLastNames="Nabil" 928 | m_arrAbLastNames="Nasim" 929 | m_arrAbLastNames="Nur" 930 | m_arrAbLastNames="Samad" 931 | m_arrAbLastNames="Shazad" 932 | m_arrAbLastNames="Tariq" 933 | m_arrAbLastNames="Wahid" 934 | m_arrAbLastNames="Turk" 935 | m_arrAbLastNames="Canaan" 936 | 937 | ; ------------------------------------------ 938 | ; -------------- ENGLISH ------------------- 939 | ; ------------------------------------------ 940 | 941 | m_arrEnMFirstNames="Jack" 942 | m_arrEnMFirstNames="Oliver" 943 | m_arrEnMFirstNames="Harry" 944 | m_arrEnMFirstNames="Thomas" 945 | m_arrEnMFirstNames="William" 946 | m_arrEnMFirstNames="James" 947 | m_arrEnMFirstNames="Charles" 948 | m_arrEnMFirstNames="Daniel" 949 | m_arrEnMFirstNames="Richard" 950 | m_arrEnMFirstNames="Lewis" 951 | m_arrEnMFirstNames="George" 952 | m_arrEnMFirstNames="Adam" 953 | m_arrEnMFirstNames="Ben" 954 | m_arrEnMFirstNames="Owen" 955 | m_arrEnMFirstNames="Paul" 956 | m_arrEnFFirstNames="Emily" 957 | m_arrEnFFirstNames="Molly" 958 | m_arrEnFFirstNames="Sophie" 959 | m_arrEnFFirstNames="Jessica" 960 | m_arrEnFFirstNames="Amy" 961 | m_arrEnFFirstNames="Abigail" 962 | m_arrEnFFirstNames="Abby" 963 | m_arrEnFFirstNames="Lauren" 964 | m_arrEnFFirstNames="Holly" 965 | m_arrEnFFirstNames="Kate" 966 | m_arrEnFFirstNames="Lucy" 967 | m_arrEnFFirstNames="Elizabeth" 968 | m_arrEnFFirstNames="Leah" 969 | m_arrEnFFirstNames="Emma" 970 | m_arrEnFFirstNames="Helen" 971 | m_arrEnLastNames="Smith" 972 | m_arrEnLastNames="Jones" 973 | m_arrEnLastNames="Williams" 974 | m_arrEnLastNames="Brown" 975 | m_arrEnLastNames="Taylor" 976 | m_arrEnLastNames="Davies" 977 | m_arrEnLastNames="Wilson" 978 | m_arrEnLastNames="Evans" 979 | m_arrEnLastNames="Thomas" 980 | m_arrEnLastNames="Johnson" 981 | m_arrEnLastNames="Roberts" 982 | m_arrEnLastNames="Walker" 983 | m_arrEnLastNames="Wright" 984 | m_arrEnLastNames="Robinson" 985 | m_arrEnLastNames="Thompson" 986 | m_arrEnLastNames="White" 987 | m_arrEnLastNames="Hughes" 988 | m_arrEnLastNames="Edwards" 989 | m_arrEnLastNames="Green" 990 | m_arrEnLastNames="Hall" 991 | m_arrEnLastNames="Wood" 992 | m_arrEnLastNames="Harris" 993 | m_arrEnLastNames="Martin" 994 | m_arrEnLastNames="Jackson" 995 | m_arrEnLastNames="Clarke" 996 | m_arrEnLastNames="Turner" 997 | m_arrEnLastNames="Hill" 998 | 999 | ; ------------------------------------------ 1000 | ; -------------- FRENCH ------------------- 1001 | ; ------------------------------------------ 1002 | 1003 | m_arrFrMFirstNames="Bruno" 1004 | m_arrFrMFirstNames="Augustin" 1005 | m_arrFrMFirstNames="Bertrand" 1006 | m_arrFrMFirstNames="Charles" 1007 | m_arrFrMFirstNames="Christophe" 1008 | m_arrFrMFirstNames="Claude" 1009 | m_arrFrMFirstNames="David" 1010 | m_arrFrMFirstNames="Edouard" 1011 | m_arrFrMFirstNames="Emile" 1012 | m_arrFrMFirstNames="Etienne" 1013 | m_arrFrMFirstNames="Eugene" 1014 | m_arrFrMFirstNames="Francois" 1015 | m_arrFrMFirstNames="Frederic" 1016 | m_arrFrMFirstNames="Gaston" 1017 | m_arrFrMFirstNames="Georges" 1018 | m_arrFrMFirstNames="Gerard" 1019 | m_arrFrMFirstNames="Gilbert" 1020 | m_arrFrMFirstNames="Gregoire" 1021 | m_arrFrMFirstNames="Guillaume" 1022 | m_arrFrMFirstNames="Gustave" 1023 | m_arrFrMFirstNames="Henri" 1024 | m_arrFrMFirstNames="Jacques" 1025 | m_arrFrMFirstNames="Jean" 1026 | m_arrFrMFirstNames="Julien" 1027 | m_arrFrMFirstNames="Laurent" 1028 | m_arrFrMFirstNames="Louis" 1029 | m_arrFrMFirstNames="Luc" 1030 | m_arrFrMFirstNames="Marc" 1031 | m_arrFrMFirstNames="Marcel" 1032 | m_arrFrMFirstNames="Matthieu" 1033 | m_arrFrMFirstNames="Patrice" 1034 | m_arrFrMFirstNames="Philippe" 1035 | m_arrFrMFirstNames="Pierre" 1036 | m_arrFrMFirstNames="Remy" 1037 | m_arrFrMFirstNames="Rene" 1038 | m_arrFrMFirstNames="Richard" 1039 | m_arrFrMFirstNames="Roland" 1040 | m_arrFrMFirstNames="Sebastien" 1041 | m_arrFrMFirstNames="Theodore" 1042 | m_arrFrMFirstNames="Thierry" 1043 | m_arrFrMFirstNames="Thomas" 1044 | m_arrFrMFirstNames="Tristan" 1045 | m_arrFrMFirstNames="Victor" 1046 | m_arrFrMFirstNames="Vincent" 1047 | m_arrFrMFirstNames="Xavier" 1048 | m_arrFrMFirstNames="Yves" 1049 | m_arrFrMFirstNames="Zacharie" 1050 | 1051 | m_arrFrFFirstNames="Adele" 1052 | m_arrFrFFirstNames="Agathe" 1053 | m_arrFrFFirstNames="Amelie" 1054 | m_arrFrFFirstNames="Anne" 1055 | m_arrFrFFirstNames="Audrey" 1056 | m_arrFrFFirstNames="Astrid" 1057 | m_arrFrFFirstNames="Bernadette" 1058 | m_arrFrFFirstNames="Brigitte" 1059 | m_arrFrFFirstNames="Camille" 1060 | m_arrFrFFirstNames="Cecile" 1061 | m_arrFrFFirstNames="Claire" 1062 | m_arrFrFFirstNames="Colette" 1063 | m_arrFrFFirstNames="Constance" 1064 | m_arrFrFFirstNames="Dominique" 1065 | m_arrFrFFirstNames="Edith" 1066 | m_arrFrFFirstNames="Elisabeth" 1067 | m_arrFrFFirstNames="Emmanuelle" 1068 | m_arrFrFFirstNames="Gabrielle" 1069 | m_arrFrFFirstNames="Helene" 1070 | m_arrFrFFirstNames="Isabelle" 1071 | m_arrFrFFirstNames="Jacqueline" 1072 | m_arrFrFFirstNames="Josephine" 1073 | m_arrFrFFirstNames="Josette" 1074 | m_arrFrFFirstNames="Juliette" 1075 | m_arrFrFFirstNames="Madeleine" 1076 | m_arrFrFFirstNames="Marguerite" 1077 | m_arrFrFFirstNames="Mathilda" 1078 | m_arrFrFFirstNames="Monique" 1079 | m_arrFrFFirstNames="Odette" 1080 | m_arrFrFFirstNames="Renee" 1081 | m_arrFrFFirstNames="Sophie" 1082 | m_arrFrFFirstNames="Simone" 1083 | m_arrFrFFirstNames="Sylvie" 1084 | m_arrFrFFirstNames="Therese" 1085 | m_arrFrFFirstNames="Veronique" 1086 | m_arrFrFFirstNames="Valerie" 1087 | m_arrFrFFirstNames="Zoe" 1088 | 1089 | m_arrFrLastNames="Martine" 1090 | m_arrFrLastNames="Bernard" 1091 | m_arrFrLastNames="Dubois" 1092 | m_arrFrLastNames="Thomas" 1093 | m_arrFrLastNames="Richard" 1094 | m_arrFrLastNames="Petit" 1095 | m_arrFrLastNames="Durand" 1096 | m_arrFrLastNames="Leroy" 1097 | m_arrFrLastNames="Moreau" 1098 | m_arrFrLastNames="Simon" 1099 | m_arrFrLastNames="Laurent" 1100 | m_arrFrLastNames="Lefevre" 1101 | m_arrFrLastNames="Roux" 1102 | m_arrFrLastNames="Fournier" 1103 | m_arrFrLastNames="Morel" 1104 | m_arrFrLastNames="Girard" 1105 | m_arrFrLastNames="Andre" 1106 | m_arrFrLastNames="Mercier" 1107 | 1108 | ; ------------------------------------------ 1109 | ; -------------- GERMAN ------------------- 1110 | ; ------------------------------------------ 1111 | 1112 | m_arrGmMFirstNames="Lucas" 1113 | m_arrGmMFirstNames="Markus" 1114 | m_arrGmMFirstNames="Maximilian" 1115 | m_arrGmMFirstNames="Jonas" 1116 | m_arrGmMFirstNames="Martin" 1117 | m_arrGmMFirstNames="Klaus" 1118 | m_arrGmMFirstNames="Konrad" 1119 | m_arrGmMFirstNames="Dieter" 1120 | m_arrGmMFirstNames="Axel" 1121 | m_arrGmMFirstNames="Bernard" 1122 | m_arrGmMFirstNames="Karl" 1123 | m_arrGmMFirstNames="Barrett" 1124 | m_arrGmMFirstNames="Heinrich" 1125 | m_arrGmMFirstNames="Ernst" 1126 | m_arrGmFFirstNames="Martha" 1127 | m_arrGmFFirstNames="Freida" 1128 | m_arrGmFFirstNames="Else" 1129 | m_arrGmFFirstNames="Emma" 1130 | m_arrGmFFirstNames="Claudia" 1131 | m_arrGmFFirstNames="Christine" 1132 | m_arrGmFFirstNames="Gertrud" 1133 | m_arrGmFFirstNames="Martina" 1134 | m_arrGmFFirstNames="Ursula" 1135 | m_arrGmFFirstNames="Sophie" 1136 | m_arrGmFFirstNames="Lena" 1137 | m_arrGmFFirstNames="Sarah" 1138 | m_arrGmFFirstNames="Jana" 1139 | m_arrGmLastNames="Mueller" 1140 | m_arrGmLastNames="Schmidt" 1141 | m_arrGmLastNames="Schneider" 1142 | m_arrGmLastNames="Fischer" 1143 | m_arrGmLastNames="Meyer" 1144 | m_arrGmLastNames="Weber" 1145 | m_arrGmLastNames="Wagner" 1146 | m_arrGmLastNames="Becker" 1147 | m_arrGmLastNames="Schulz" 1148 | m_arrGmLastNames="Hauffman" 1149 | m_arrGmLastNames="Ulrich" 1150 | m_arrGmLastNames="Haussman" 1151 | m_arrGmLastNames="Wright" 1152 | m_arrGmLastNames="Schafer" 1153 | m_arrGmLastNames="Bauer" 1154 | m_arrGmLastNames="Klein" 1155 | m_arrGmLastNames="Wolf" 1156 | m_arrGmLastNames="Neumann" 1157 | m_arrGmLastNames="Schwartz" 1158 | m_arrGmLastNames="Lange" 1159 | m_arrGmLastNames="Werner" 1160 | m_arrGmLastNames="Krause" 1161 | m_arrGmLastNames="Kohler" 1162 | m_arrGmLastNames="Konig" 1163 | m_arrGmLastNames="Braun" 1164 | m_arrGmLastNames="Weiss" 1165 | m_arrGmLastNames="Hahn" 1166 | m_arrGmLastNames="Vogel" 1167 | 1168 | ; ------------------------------------------ 1169 | ; -------------- AUSTRALIAN ------------------- 1170 | ; ------------------------------------------ 1171 | 1172 | m_arrAuMFirstNames="Jack" 1173 | m_arrAuMFirstNames="James" 1174 | m_arrAuMFirstNames="Ian" 1175 | m_arrAuMFirstNames="Thomas" 1176 | m_arrAuMFirstNames="Patrick" 1177 | m_arrAuMFirstNames="William" 1178 | m_arrAuMFirstNames="Benjamin" 1179 | m_arrAuMFirstNames="David" 1180 | m_arrAuMFirstNames="John" 1181 | m_arrAuMFirstNames="Matthew" 1182 | m_arrAuMFirstNames="Paul" 1183 | m_arrAuMFirstNames="Keith" 1184 | m_arrAuMFirstNames="Jay" 1185 | m_arrAuMFirstNames="Steve" 1186 | m_arrAuFFirstNames="Emily" 1187 | m_arrAuFFirstNames="Holly" 1188 | m_arrAuFFirstNames="Sarah" 1189 | m_arrAuFFirstNames="Paula" 1190 | m_arrAuFFirstNames="Amy" 1191 | m_arrAuFFirstNames="Lauren" 1192 | m_arrAuFFirstNames="Erin" 1193 | m_arrAuFFirstNames="Zoe" 1194 | m_arrAuFFirstNames="Beth" 1195 | m_arrAuFFirstNames="Mary" 1196 | m_arrAuFFirstNames="Sarah" 1197 | m_arrAuLastNames="Jones" 1198 | m_arrAuLastNames="Williams" 1199 | m_arrAuLastNames="Brown" 1200 | m_arrAuLastNames="Wilson" 1201 | m_arrAuLastNames="Taylor" 1202 | m_arrAuLastNames="Johnson" 1203 | m_arrAuLastNames="White" 1204 | m_arrAuLastNames="Martin" 1205 | m_arrAuLastNames="Anderson" 1206 | m_arrAuLastNames="Thompson" 1207 | m_arrAuLastNames="Thomas" 1208 | m_arrAuLastNames="Walker" 1209 | m_arrAuLastNames="Harris" 1210 | m_arrAuLastNames="Lee" 1211 | m_arrAuLastNames="Ryan" 1212 | m_arrAuLastNames="Robinson" 1213 | m_arrAuLastNames="Kelly" 1214 | m_arrAuLastNames="King" 1215 | 1216 | ; ------------------------------------------ 1217 | ; -------------- ITALIAN ------------------- 1218 | ; ------------------------------------------ 1219 | 1220 | m_arrItMFirstNames="Fabricio" 1221 | m_arrItMFirstNames="Alessandro" 1222 | m_arrItMFirstNames="Matteo" 1223 | m_arrItMFirstNames="Lorenzo" 1224 | m_arrItMFirstNames="Luca" 1225 | m_arrItMFirstNames="Paolo" 1226 | m_arrItMFirstNames="Riccardo" 1227 | m_arrItMFirstNames="Fabian" 1228 | m_arrItMFirstNames="Silvio" 1229 | m_arrItMFirstNames="Andrea" 1230 | m_arrItMFirstNames="Angelo" 1231 | m_arrItMFirstNames="Antonio" 1232 | m_arrItMFirstNames="Marco" 1233 | m_arrItMFirstNames="Maurizio" 1234 | 1235 | m_arrItFFirstNames="Sofia" 1236 | m_arrItFFirstNames="Alessia" 1237 | m_arrItFFirstNames="Francesca" 1238 | m_arrItFFirstNames="Donatella" 1239 | m_arrItFFirstNames="Roberta" 1240 | m_arrItFFirstNames="Nicoletta" 1241 | m_arrItFFirstNames="Angela" 1242 | m_arrItFFirstNames="Ariana" 1243 | m_arrItFFirstNames="Alessandra" 1244 | m_arrItFFirstNames="Isabella" 1245 | m_arrItFFirstNames="Valetina" 1246 | m_arrItFFirstNames="Viviana" 1247 | m_arrItFFirstNames="Elisabetta" 1248 | 1249 | m_arrItLastNames="Rossi" 1250 | m_arrItLastNames="Russo" 1251 | m_arrItLastNames="Ferrari" 1252 | m_arrItLastNames="Bianchi" 1253 | m_arrItLastNames="Romano" 1254 | m_arrItLastNames="Ricci" 1255 | m_arrItLastNames="Marino" 1256 | m_arrItLastNames="Greco" 1257 | m_arrItLastNames="Bruno" 1258 | m_arrItLastNames="Gallo" 1259 | m_arrItLastNames="Conti" 1260 | m_arrItLastNames="De Luca" 1261 | m_arrItLastNames="Costa" 1262 | m_arrItLastNames="Giordano" 1263 | m_arrItLastNames="Mancini" 1264 | m_arrItLastNames="Rizzo" 1265 | m_arrItLastNames="Lombardi" 1266 | m_arrItLastNames="Moretti" 1267 | m_arrItLastNames="Simoni" 1268 | m_arrItLastNames="Bettini" 1269 | m_arrItLastNames="Pettachi" 1270 | m_arrItLastNames="Basso" 1271 | m_arrItLastNames="Cancellara" 1272 | m_arrItLastNames="Gasparatto" 1273 | m_arrItLastNames="Sella" 1274 | m_arrItLastNames="Lazarro" 1275 | m_arrItLastNames="Roberti" 1276 | m_arrItLastNames="Moletta" 1277 | 1278 | ; ------------------------------------------ 1279 | ; -------------- JAPANESE ------------------- 1280 | ; ------------------------------------------ 1281 | 1282 | m_arrJpMFirstNames="Daichi" 1283 | m_arrJpMFirstNames="Daisuke" 1284 | m_arrJpMFirstNames="Hiroki" 1285 | m_arrJpMFirstNames="Hiroshi" 1286 | m_arrJpMFirstNames="Kaito" 1287 | m_arrJpMFirstNames="Katsume" 1288 | m_arrJpMFirstNames="Kenji" 1289 | m_arrJpMFirstNames="Kenzo" 1290 | m_arrJpMFirstNames="Makoto" 1291 | m_arrJpMFirstNames="Masahiro" 1292 | m_arrJpMFirstNames="Naoki" 1293 | m_arrJpMFirstNames="Nobu" 1294 | m_arrJpMFirstNames="Riku" 1295 | m_arrJpMFirstNames="Ryo" 1296 | m_arrJpMFirstNames="Shigeru" 1297 | m_arrJpMFirstNames="Shin" 1298 | m_arrJpMFirstNames="Tadashi" 1299 | m_arrJpMFirstNames="Takumi" 1300 | m_arrJpMFirstNames="Yoshio" 1301 | m_arrJpMFirstNames="Yutaka" 1302 | m_arrJpMFirstNames="Hideo" 1303 | 1304 | m_arrJpFFirstNames="Aiko" 1305 | m_arrJpFFirstNames="Akemi" 1306 | m_arrJpFFirstNames="Ayaka" 1307 | m_arrJpFFirstNames="Chiyoko" 1308 | m_arrJpFFirstNames="Fumiko" 1309 | m_arrJpFFirstNames="Harumi" 1310 | m_arrJpFFirstNames="Hitomi" 1311 | m_arrJpFFirstNames="Kaori" 1312 | m_arrJpFFirstNames="Kasumi" 1313 | m_arrJpFFirstNames="Kazuko" 1314 | m_arrJpFFirstNames="Kazumi" 1315 | m_arrJpFFirstNames="Kiriko" 1316 | m_arrJpFFirstNames="Kumiko" 1317 | m_arrJpFFirstNames="Midori" 1318 | m_arrJpFFirstNames="Misaki" 1319 | m_arrJpFFirstNames="Miu" 1320 | m_arrJpFFirstNames="Natsuki" 1321 | m_arrJpFFirstNames="Rin" 1322 | m_arrJpFFirstNames="Sakura" 1323 | m_arrJpFFirstNames="Yoko" 1324 | m_arrJpFFirstNames="Yukiko" 1325 | m_arrJpFFirstNames="Yumi" 1326 | m_arrJpFFirstNames="Yuzuki" 1327 | 1328 | m_arrJpLastNames="Sato" 1329 | m_arrJpLastNames="Suzuki" 1330 | m_arrJpLastNames="Takahashi" 1331 | m_arrJpLastNames="Tanaka" 1332 | m_arrJpLastNames="Wantanabe" 1333 | m_arrJpLastNames="Ito" 1334 | m_arrJpLastNames="Yamamoto" 1335 | m_arrJpLastNames="Nakamura" 1336 | m_arrJpLastNames="Kobayashi" 1337 | m_arrJpLastNames="Saito" 1338 | m_arrJpLastNames="Kato" 1339 | m_arrJpLastNames="Yoshida" 1340 | m_arrJpLastNames="Yamada" 1341 | m_arrJpLastNames="Sasaki" 1342 | m_arrJpLastNames="Yamaguchi" 1343 | m_arrJpLastNames="Matsumoto" 1344 | m_arrJpLastNames="Kimura" 1345 | m_arrJpLastNames="Hayashi" 1346 | m_arrJpLastNames="Shimizu" 1347 | m_arrJpLastNames="Yamazaki" 1348 | m_arrJpLastNames="Mori" 1349 | m_arrJpLastNames="Ikeda" 1350 | m_arrJpLastNames="Hashimoto" 1351 | m_arrJpLastNames="Yamashita" 1352 | m_arrJpLastNames="Ishikawa" 1353 | m_arrJpLastNames="Nakajima" 1354 | m_arrJpLastNames="Ogawa" 1355 | m_arrJpLastNames="Fujita" 1356 | m_arrJpLastNames="Okada" 1357 | m_arrJpLastNames="Goto" 1358 | m_arrJpLastNames="Hasegawa" 1359 | m_arrJpLastNames="Murakami" 1360 | m_arrJpLastNames="Sakamoto" 1361 | m_arrJpLastNames="Endo" 1362 | m_arrJpLastNames="Aoki" 1363 | m_arrJpLastNames="Fujii" 1364 | m_arrJpLastNames="Nishimura" 1365 | m_arrJpLastNames="Fujiwara" 1366 | m_arrJpLastNames="Okamoto" 1367 | m_arrJpLastNames="Mutsuda" 1368 | m_arrJpLastNames="Nakagawa" 1369 | m_arrJpLastNames="Nakano" 1370 | m_arrJpLastNames="Kojima" 1371 | m_arrJpLastNames="Miyamoto" 1372 | 1373 | ; ------------------------------------------ 1374 | ; -------------- ISRAELI ------------------- 1375 | ; ------------------------------------------ 1376 | 1377 | m_arrIsMFirstNames="Abraham" 1378 | m_arrIsMFirstNames="Adam" 1379 | m_arrIsMFirstNames="Ari" 1380 | m_arrIsMFirstNames="Asher" 1381 | m_arrIsMFirstNames="Avi" 1382 | m_arrIsMFirstNames="Daniel" 1383 | m_arrIsMFirstNames="David" 1384 | m_arrIsMFirstNames="Eli" 1385 | m_arrIsMFirstNames="Ephraim" 1386 | m_arrIsMFirstNames="Gideon" 1387 | m_arrIsMFirstNames="Hayim" 1388 | m_arrIsMFirstNames="Isaac" 1389 | m_arrIsMFirstNames="Levi" 1390 | m_arrIsMFirstNames="Jacob" 1391 | m_arrIsMFirstNames="Malachi" 1392 | m_arrIsMFirstNames="Mikhael" 1393 | m_arrIsMFirstNames="Mordecai" 1394 | m_arrIsMFirstNames="Moshe" 1395 | m_arrIsMFirstNames="Noam" 1396 | m_arrIsMFirstNames="Ravid" 1397 | m_arrIsMFirstNames="Ronen" 1398 | m_arrIsMFirstNames="Malachi" 1399 | m_arrIsMFirstNames="Mikhael" 1400 | m_arrIsMFirstNames="Mordecai" 1401 | m_arrIsMFirstNames="Moshe" 1402 | m_arrIsMFirstNames="Noam" 1403 | m_arrIsMFirstNames="Ravid" 1404 | m_arrIsMFirstNames="Ronen" 1405 | m_arrIsMFirstNames="Saul" 1406 | m_arrIsMFirstNames="Sol" 1407 | m_arrIsMFirstNames="Yuri" 1408 | m_arrIsMFirstNames="Joshua" 1409 | m_arrIsMFirstNames="Yaron" 1410 | 1411 | 1412 | m_arrIsFFirstNames="Adina" 1413 | m_arrIsFFirstNames="Aliza" 1414 | m_arrIsFFirstNames="Ariel" 1415 | m_arrIsFFirstNames="Ayala" 1416 | m_arrIsFFirstNames="Dalia" 1417 | m_arrIsFFirstNames="Dara" 1418 | m_arrIsFFirstNames="Devorah" 1419 | m_arrIsFFirstNames="Eliana" 1420 | m_arrIsFFirstNames="Galia" 1421 | m_arrIsFFirstNames="Hadar" 1422 | m_arrIsFFirstNames="Hadassah" 1423 | m_arrIsFFirstNames="Hannah" 1424 | m_arrIsFFirstNames="Ava" 1425 | m_arrIsFFirstNames="Judith" 1426 | m_arrIsFFirstNames="Kayla" 1427 | m_arrIsFFirstNames="Liora" 1428 | m_arrIsFFirstNames="Marni" 1429 | m_arrIsFFirstNames="Miriam" 1430 | m_arrIsFFirstNames="Naomi" 1431 | m_arrIsFFirstNames="Nava" 1432 | m_arrIsFFirstNames="Nissa" 1433 | m_arrIsFFirstNames="Rachel" 1434 | m_arrIsFFirstNames="Rina" 1435 | m_arrIsFFirstNames="Rebecca" 1436 | m_arrIsFFirstNames="Sarah" 1437 | m_arrIsFFirstNames="Shahar" 1438 | m_arrIsFFirstNames="Shayna" 1439 | m_arrIsFFirstNames="Shiri" 1440 | m_arrIsFFirstNames="Shoshana" 1441 | m_arrIsFFirstNames="Tova" 1442 | 1443 | m_arrIsLastNames="Cohen" 1444 | m_arrIsLastNames="Levi" 1445 | m_arrIsLastNames="Mizrachi" 1446 | m_arrIsLastNames="Peretz" 1447 | m_arrIsLastNames="Ben-David" 1448 | m_arrIsLastNames="Bar-Lev" 1449 | m_arrIsLastNames="Biton" 1450 | m_arrIsLastNames="Daham" 1451 | m_arrIsLastNames="Rosenberg" 1452 | m_arrIsLastNames="Friedman" 1453 | m_arrIsLastNames="Azulai" 1454 | m_arrIsLastNames="Eliad" 1455 | m_arrIsLastNames="Malcah" 1456 | m_arrIsLastNames="Katz" 1457 | m_arrIsLastNames="David" 1458 | m_arrIsLastNames="Gabai" 1459 | m_arrIsLastNames="Amar" 1460 | m_arrIsLastNames="Hadad" 1461 | m_arrIsLastNames="Yosef" 1462 | m_arrIsLastNames="Levin" 1463 | m_arrIsLastNames="Moshe" 1464 | m_arrIsLastNames="Rabin" 1465 | m_arrIsLastNames="Segel" 1466 | m_arrIsLastNames="Chazan" 1467 | m_arrIsLastNames="Shapira" 1468 | m_arrIsLastNames="Meir" 1469 | m_arrIsLastNames="Klein" 1470 | m_arrIsLastNames="Golan" 1471 | 1472 | ; ------------------------------------------ 1473 | ; -------------- SPANISH ------------------- 1474 | ; ------------------------------------------ 1475 | 1476 | m_arrEsMFirstNames="Alfonso" 1477 | m_arrEsMFirstNames="Bernardo" 1478 | m_arrEsMFirstNames="Carlos" 1479 | m_arrEsMFirstNames="Edmundo" 1480 | m_arrEsMFirstNames="Eduardo" 1481 | m_arrEsMFirstNames="Esteban" 1482 | m_arrEsMFirstNames="Felipe" 1483 | m_arrEsMFirstNames="Fernando" 1484 | m_arrEsMFirstNames="Hugo" 1485 | m_arrEsMFirstNames="Javier" 1486 | m_arrEsMFirstNames="Jorge" 1487 | m_arrEsMFirstNames="Juan" 1488 | m_arrEsMFirstNames="Marcos" 1489 | m_arrEsMFirstNames="Miguel" 1490 | m_arrEsMFirstNames="Pablo" 1491 | m_arrEsMFirstNames="Pedro" 1492 | m_arrEsMFirstNames="Ramon" 1493 | m_arrEsMFirstNames="Raul" 1494 | m_arrEsMFirstNames="Ricardo" 1495 | m_arrEsMFirstNames="Roberto" 1496 | m_arrEsMFirstNames="Teodoro" 1497 | m_arrEsMFirstNames="Vincente" 1498 | m_arrEsMFirstNames="Victor" 1499 | 1500 | 1501 | m_arrEsFFirstNames="Alicia" 1502 | m_arrEsFFirstNames="Ana" 1503 | m_arrEsFFirstNames="Andrea" 1504 | m_arrEsFFirstNames="Carlota" 1505 | m_arrEsFFirstNames="Catalina" 1506 | m_arrEsFFirstNames="Cristina" 1507 | m_arrEsFFirstNames="Daniela" 1508 | m_arrEsFFirstNames="Esperanza" 1509 | m_arrEsFFirstNames="Estela" 1510 | m_arrEsFFirstNames="Eva" 1511 | m_arrEsFFirstNames="Francisca" 1512 | m_arrEsFFirstNames="Gabriela" 1513 | m_arrEsFFirstNames="Ines" 1514 | m_arrEsFFirstNames="Isabel" 1515 | m_arrEsFFirstNames="Lucia" 1516 | m_arrEsFFirstNames="Margarita" 1517 | m_arrEsFFirstNames="Mariana" 1518 | m_arrEsFFirstNames="Maria" 1519 | m_arrEsFFirstNames="Raquel" 1520 | m_arrEsFFirstNames="Rosalia" 1521 | m_arrEsFFirstNames="Silvia" 1522 | m_arrEsFFirstNames="Teresa" 1523 | m_arrEsFFirstNames="Yolanda" 1524 | 1525 | m_arrEsLastNames="Garcia" 1526 | m_arrEsLastNames="Fernandez" 1527 | m_arrEsLastNames="Gonzales" 1528 | m_arrEsLastNames="Rodriguez" 1529 | m_arrEsLastNames="Lopez" 1530 | m_arrEsLastNames="Martinez" 1531 | m_arrEsLastNames="Sanchez" 1532 | m_arrEsLastNames="Perez" 1533 | m_arrEsLastNames="Gomez" 1534 | m_arrEsLastNames="Ruiz" 1535 | m_arrEsLastNames="Hernandez" 1536 | m_arrEsLastNames="Jimenez" 1537 | m_arrEsLastNames="Diaz" 1538 | m_arrEsLastNames="Alvarez" 1539 | m_arrEsLastNames="Moreno" 1540 | m_arrEsLastNames="Munoz" 1541 | m_arrEsLastNames="Alonso" 1542 | m_arrEsLastNames="Gutierrez" 1543 | m_arrEsLastNames="Romero" 1544 | m_arrEsLastNames="Navarro" 1545 | m_arrEsLastNames="Torres" 1546 | m_arrEsLastNames="Dominguez" 1547 | m_arrEsLastNames="Vasquez" 1548 | m_arrEsLastNames="Serrano" 1549 | m_arrEsLastNames="Ramos" 1550 | m_arrEsLastNames="Blanco" 1551 | m_arrEsLastNames="Castro" 1552 | m_arrEsLastNames="Suarez" 1553 | 1554 | ; ------------------------------------------ 1555 | ; -------------- GREEK ------------------- 1556 | ; ------------------------------------------ 1557 | 1558 | m_arrGrMFirstNames="Giorgios" 1559 | m_arrGrMFirstNames="Konstantinos" 1560 | m_arrGrMFirstNames="Dimitrios" 1561 | m_arrGrMFirstNames="Nikolaos" 1562 | m_arrGrMFirstNames="Christos" 1563 | m_arrGrMFirstNames="Evangelos" 1564 | m_arrGrMFirstNames="Alexandros" 1565 | m_arrGrMFirstNames="Giannis" 1566 | m_arrGrMFirstNames="Hector" 1567 | m_arrGrMFirstNames="Piero" 1568 | m_arrGrMFirstNames="Jasen" 1569 | m_arrGrMFirstNames="Ajax" 1570 | m_arrGrMFirstNames="Cyrano" 1571 | m_arrGrMFirstNames="Cyril" 1572 | m_arrGrMFirstNames="Petros" 1573 | m_arrGrMFirstNames="Rasmus" 1574 | m_arrGrMFirstNames="Sabastian" 1575 | m_arrGrMFirstNames="Anatoli" 1576 | m_arrGrMFirstNames="Andreas" 1577 | m_arrGrMFirstNames="Dennis" 1578 | m_arrGrMFirstNames="Dion" 1579 | m_arrGrMFirstNames="Thanos" 1580 | m_arrGrMFirstNames="Theo" 1581 | m_arrGrMFirstNames="Minos" 1582 | m_arrGrMFirstNames="Artemas" 1583 | m_arrGrMFirstNames="Aristo" 1584 | m_arrGrMFirstNames="Eugenios" 1585 | m_arrGrMFirstNames="Atlas" 1586 | m_arrGrMFirstNames="Fedor" 1587 | m_arrGrMFirstNames="Tymon" 1588 | m_arrGrMFirstNames="Yuri" 1589 | m_arrGrMFirstNames="Gregor" 1590 | m_arrGrMFirstNames="Pavlos" 1591 | m_arrGrMFirstNames="Zoltan" 1592 | m_arrGrMFirstNames="Zorba" 1593 | 1594 | 1595 | m_arrGrFFirstNames="Maria" 1596 | m_arrGrFFirstNames="Eleni" 1597 | m_arrGrFFirstNames="Katerina" 1598 | m_arrGrFFirstNames="Georgia" 1599 | m_arrGrFFirstNames="Sofia" 1600 | m_arrGrFFirstNames="Anna" 1601 | m_arrGrFFirstNames="Angeliki" 1602 | m_arrGrFFirstNames="Dimitra" 1603 | m_arrGrFFirstNames="Konstantina" 1604 | m_arrGrFFirstNames="Alexandra" 1605 | m_arrGrFFirstNames="Ambrosia" 1606 | m_arrGrFFirstNames="Anastasia" 1607 | m_arrGrFFirstNames="Adrienne" 1608 | m_arrGrFFirstNames="Kassia" 1609 | m_arrGrFFirstNames="Petrine" 1610 | m_arrGrFFirstNames="Philippa" 1611 | m_arrGrFFirstNames="Ariadne" 1612 | m_arrGrFFirstNames="Elissa" 1613 | m_arrGrFFirstNames="Melaina" 1614 | m_arrGrFFirstNames="Theodora" 1615 | m_arrGrFFirstNames="Sibyl" 1616 | m_arrGrFFirstNames="Vesna" 1617 | m_arrGrFFirstNames="Varella" 1618 | m_arrGrFFirstNames="Callia" 1619 | m_arrGrFFirstNames="Isadora" 1620 | m_arrGrFFirstNames="Ophelia" 1621 | m_arrGrFFirstNames="Zena" 1622 | m_arrGrFFirstNames="Zoe" 1623 | 1624 | m_arrGrLastNames="Papadoupolous" 1625 | m_arrGrLastNames="Nicolo" 1626 | m_arrGrLastNames="Petridis" 1627 | m_arrGrLastNames="Papadakis" 1628 | m_arrGrLastNames="Baros" 1629 | m_arrGrLastNames="Antinos" 1630 | m_arrGrLastNames="Boulos" 1631 | m_arrGrLastNames="Cosmos" 1632 | m_arrGrLastNames="Demopolous" 1633 | m_arrGrLastNames="Galanos" 1634 | m_arrGrLastNames="Katsaros" 1635 | m_arrGrLastNames="Korba" 1636 | m_arrGrLastNames="Kosta" 1637 | m_arrGrLastNames="Kakos" 1638 | m_arrGrLastNames="Lekas" 1639 | m_arrGrLastNames="Manikas" 1640 | m_arrGrLastNames="Metaxas" 1641 | m_arrGrLastNames="Mikos" 1642 | m_arrGrLastNames="Panagakos" 1643 | m_arrGrLastNames="Petras" 1644 | m_arrGrLastNames="Romanos" 1645 | m_arrGrLastNames="Speros" 1646 | m_arrGrLastNames="Thanos" 1647 | m_arrGrLastNames="Zervas" 1648 | m_arrGrLastNames="Xenakis" 1649 | 1650 | ; ------------------------------------------ 1651 | ; -------------- NORWEGIAN ------------------- 1652 | ; ------------------------------------------ 1653 | 1654 | m_arrNwMFirstNames="Anders" 1655 | m_arrNwMFirstNames="Arne" 1656 | m_arrNwMFirstNames="Bjarne" 1657 | m_arrNwMFirstNames="Bjorn" 1658 | m_arrNwMFirstNames="Erik" 1659 | m_arrNwMFirstNames="Finn" 1660 | m_arrNwMFirstNames="Fredrik" 1661 | m_arrNwMFirstNames="Gunnar" 1662 | m_arrNwMFirstNames="Hans" 1663 | m_arrNwMFirstNames="Harald" 1664 | m_arrNwMFirstNames="Thor" 1665 | m_arrNwMFirstNames="Ivar" 1666 | m_arrNwMFirstNames="Jan" 1667 | m_arrNwMFirstNames="Jarle" 1668 | m_arrNwMFirstNames="Jens" 1669 | m_arrNwMFirstNames="Johan" 1670 | m_arrNwMFirstNames="Jorgen" 1671 | m_arrNwMFirstNames="Karl" 1672 | m_arrNwMFirstNames="Lars" 1673 | m_arrNwMFirstNames="Leif" 1674 | m_arrNwMFirstNames="Magnus" 1675 | m_arrNwMFirstNames="Olav" 1676 | m_arrNwMFirstNames="Rolf" 1677 | m_arrNwMFirstNames="Rune" 1678 | m_arrNwMFirstNames="Sigurd" 1679 | m_arrNwMFirstNames="Stig" 1680 | m_arrNwMFirstNames="Svein" 1681 | 1682 | 1683 | m_arrNwFFirstNames="Anette" 1684 | m_arrNwFFirstNames="Astrid" 1685 | m_arrNwFFirstNames="Brit" 1686 | m_arrNwFFirstNames="Elin" 1687 | m_arrNwFFirstNames="Else" 1688 | m_arrNwFFirstNames="Hanna" 1689 | m_arrNwFFirstNames="Gretta" 1690 | m_arrNwFFirstNames="Heidi" 1691 | m_arrNwFFirstNames="Hilde" 1692 | m_arrNwFFirstNames="Ingrid" 1693 | m_arrNwFFirstNames="Kari" 1694 | m_arrNwFFirstNames="Karin" 1695 | m_arrNwFFirstNames="Kirsten" 1696 | m_arrNwFFirstNames="Lillian" 1697 | m_arrNwFFirstNames="Lisbeth" 1698 | m_arrNwFFirstNames="Marte" 1699 | m_arrNwFFirstNames="Malin" 1700 | m_arrNwFFirstNames="Mona" 1701 | m_arrNwFFirstNames="Sigrid" 1702 | m_arrNwFFirstNames="Therese" 1703 | 1704 | m_arrNwLastNames="Hansen" 1705 | m_arrNwLastNames="Johansen" 1706 | m_arrNwLastNames="Olsen" 1707 | m_arrNwLastNames="Larsen" 1708 | m_arrNwLastNames="Andersen" 1709 | m_arrNwLastNames="Pedersen" 1710 | m_arrNwLastNames="Nilsen" 1711 | m_arrNwLastNames="Jensen" 1712 | m_arrNwLastNames="Karlsen" 1713 | m_arrNwLastNames="Johnson" 1714 | m_arrNwLastNames="Eriksen" 1715 | m_arrNwLastNames="Berg" 1716 | m_arrNwLastNames="Haugen" 1717 | m_arrNwLastNames="Hagen" 1718 | m_arrNwLastNames="Johannessen" 1719 | m_arrNwLastNames="Jacobsen" 1720 | m_arrNwLastNames="Halvorsen" 1721 | 1722 | ; ------------------------------------------ 1723 | ; -------------- IRISH ------------------- 1724 | ; ------------------------------------------ 1725 | 1726 | m_arrIrMFirstNames="Jack" 1727 | m_arrIrMFirstNames="Sean" 1728 | m_arrIrMFirstNames="Seamus" 1729 | m_arrIrMFirstNames="Daniel" 1730 | m_arrIrMFirstNames="James" 1731 | m_arrIrMFirstNames="Conor" 1732 | m_arrIrMFirstNames="Ryan" 1733 | m_arrIrMFirstNames="Dylan" 1734 | m_arrIrMFirstNames="Adam" 1735 | m_arrIrMFirstNames="Liam" 1736 | m_arrIrMFirstNames="Patrick" 1737 | m_arrIrMFirstNames="Gerry" 1738 | m_arrIrMFirstNames="Colin" 1739 | m_arrIrMFirstNames="Brendan" 1740 | m_arrIrMFirstNames="Shane" 1741 | m_arrIrMFirstNames="Aidan" 1742 | m_arrIrMFirstNames="Casey" 1743 | m_arrIrMFirstNames="Brennan" 1744 | m_arrIrMFirstNames="Caden" 1745 | m_arrIrMFirstNames="Kieran" 1746 | m_arrIrMFirstNames="Killian" 1747 | m_arrIrMFirstNames="Declan" 1748 | m_arrIrMFirstNames="Kellen" 1749 | 1750 | 1751 | m_arrIrFFirstNames="Aileen" 1752 | m_arrIrFFirstNames="Caitlin" 1753 | m_arrIrFFirstNames="Ciara" 1754 | m_arrIrFFirstNames="Erin" 1755 | m_arrIrFFirstNames="Clare" 1756 | m_arrIrFFirstNames="Molly" 1757 | m_arrIrFFirstNames="Mary" 1758 | m_arrIrFFirstNames="Kate" 1759 | m_arrIrFFirstNames="Bridget" 1760 | m_arrIrFFirstNames="Kathleen" 1761 | m_arrIrFFirstNames="Tara" 1762 | m_arrIrFFirstNames="Shawna" 1763 | m_arrIrFFirstNames="Fiona" 1764 | m_arrIrFFirstNames="Maura" 1765 | m_arrIrFFirstNames="Tracy" 1766 | m_arrIrFFirstNames="Dara" 1767 | m_arrIrFFirstNames="Emma" 1768 | m_arrIrFFirstNames="Lucy" 1769 | m_arrIrFFirstNames="Grace" 1770 | 1771 | m_arrIrLastNames="Murphy" 1772 | m_arrIrLastNames="Kelly" 1773 | m_arrIrLastNames="O'Sullivan" 1774 | m_arrIrLastNames="Walsh" 1775 | m_arrIrLastNames="O'Brien" 1776 | m_arrIrLastNames="Ryan" 1777 | m_arrIrLastNames="O'Connor" 1778 | m_arrIrLastNames="O'Neill" 1779 | m_arrIrLastNames="O'Reilly" 1780 | m_arrIrLastNames="Doyle" 1781 | m_arrIrLastNames="McCarthy" 1782 | m_arrIrLastNames="Gallagher" 1783 | m_arrIrLastNames="O'Doherty" 1784 | m_arrIrLastNames="Kennedy" 1785 | m_arrIrLastNames="Lynch" 1786 | m_arrIrLastNames="Murray" 1787 | m_arrIrLastNames="Quinn" 1788 | m_arrIrLastNames="Moore" 1789 | m_arrIrLastNames="Harrington" 1790 | m_arrIrLastNames="McLoughlin" 1791 | m_arrIrLastNames="O'Carroll" 1792 | m_arrIrLastNames="Connolly" 1793 | m_arrIrLastNames="Daly" 1794 | m_arrIrLastNames="O'Connell" 1795 | m_arrIrLastNames="Keenan" 1796 | m_arrIrLastNames="Duff" 1797 | m_arrIrLastNames="Kerrigan" 1798 | 1799 | ; ------------------------------------------ 1800 | ; -------------- SOUTH KOREAN ------------------- 1801 | ; ------------------------------------------ 1802 | 1803 | m_arrSkMFirstNames="Minjoon" 1804 | m_arrSkMFirstNames="Ji Hoon" 1805 | m_arrSkMFirstNames="Minjae" 1806 | m_arrSkMFirstNames="Woojin" 1807 | m_arrSkMFirstNames="Jin" 1808 | m_arrSkMFirstNames="Hyun" 1809 | m_arrSkMFirstNames="Minsu" 1810 | m_arrSkMFirstNames="Sung Min" 1811 | m_arrSkMFirstNames="Min Ho" 1812 | m_arrSkMFirstNames="Hwang" 1813 | m_arrSkMFirstNames="Mal Chin" 1814 | m_arrSkMFirstNames="Man Shik" 1815 | m_arrSkMFirstNames="Moon" 1816 | m_arrSkMFirstNames="Kang Dae" 1817 | m_arrSkMFirstNames="Ryung" 1818 | m_arrSkMFirstNames="Sam" 1819 | m_arrSkMFirstNames="Seung" 1820 | m_arrSkMFirstNames="Won Shik" 1821 | m_arrSkMFirstNames="Yon" 1822 | m_arrSkMFirstNames="Yong Sun" 1823 | 1824 | 1825 | m_arrSkFFirstNames="Ji Woo" 1826 | m_arrSkFFirstNames="Ji Min" 1827 | m_arrSkFFirstNames="Ji Yung" 1828 | m_arrSkFFirstNames="Ji Hye" 1829 | m_arrSkFFirstNames="So Ji" 1830 | m_arrSkFFirstNames="Min Ju" 1831 | m_arrSkFFirstNames="Hye Jin" 1832 | m_arrSkFFirstNames="Hyun Jung" 1833 | m_arrSkFFirstNames="Min Ji" 1834 | m_arrSkFFirstNames="Joo" 1835 | m_arrSkFFirstNames="Soo" 1836 | m_arrSkFFirstNames="Soon Bok" 1837 | m_arrSkFFirstNames="Sun Hi" 1838 | m_arrSkFFirstNames="Su Jin" 1839 | m_arrSkFFirstNames="Mi Cha" 1840 | m_arrSkFFirstNames="Mi Hi" 1841 | 1842 | m_arrSkLastNames="Kim" 1843 | m_arrSkLastNames="Lee" 1844 | m_arrSkLastNames="Park" 1845 | m_arrSkLastNames="Choi" 1846 | m_arrSkLastNames="Jeong" 1847 | m_arrSkLastNames="Cho" 1848 | m_arrSkLastNames="Yoon" 1849 | m_arrSkLastNames="Jang" 1850 | m_arrSkLastNames="Han" 1851 | m_arrSkLastNames="Shin" 1852 | m_arrSkLastNames="Kwan" 1853 | m_arrSkLastNames="Song" 1854 | m_arrSkLastNames="Hong" 1855 | m_arrSkLastNames="Yang" 1856 | m_arrSkLastNames="Liu" 1857 | m_arrSkLastNames="Chun" 1858 | m_arrSkLastNames="Chang" 1859 | 1860 | ; ------------------------------------------ 1861 | ; -------------- DUTCH ------------------- 1862 | ; ------------------------------------------ 1863 | 1864 | m_arrDuMFirstNames="Jacob" 1865 | m_arrDuMFirstNames="Johannes" 1866 | m_arrDuMFirstNames="Dirk" 1867 | m_arrDuMFirstNames="Janus" 1868 | m_arrDuMFirstNames="Anton" 1869 | m_arrDuMFirstNames="Gerard" 1870 | m_arrDuMFirstNames="Jan" 1871 | m_arrDuMFirstNames="Hans" 1872 | m_arrDuMFirstNames="Pieter" 1873 | m_arrDuMFirstNames="Willem" 1874 | m_arrDuMFirstNames="Lars" 1875 | m_arrDuMFirstNames="Hendrik" 1876 | 1877 | 1878 | m_arrDuFFirstNames="Adriana" 1879 | m_arrDuFFirstNames="Anna" 1880 | m_arrDuFFirstNames="Corrie" 1881 | m_arrDuFFirstNames="Elisabeth" 1882 | m_arrDuFFirstNames="Rika" 1883 | m_arrDuFFirstNames="Johanna" 1884 | m_arrDuFFirstNames="Margreet" 1885 | m_arrDuFFirstNames="Maria" 1886 | m_arrDuFFirstNames="Mina" 1887 | m_arrDuFFirstNames="Emma" 1888 | m_arrDuFFirstNames="Iris" 1889 | m_arrDuFFirstNames="Eva" 1890 | m_arrDuFFirstNames="Lisbet" 1891 | 1892 | m_arrDuLastNames="Jansen" 1893 | m_arrDuLastNames="VanDyke" 1894 | m_arrDuLastNames="Visser" 1895 | m_arrDuLastNames="Mulder" 1896 | m_arrDuLastNames="DeGroot" 1897 | m_arrDuLastNames="Peters" 1898 | m_arrDuLastNames="Hendriks" 1899 | m_arrDuLastNames="Dekker" 1900 | m_arrDuLastNames="DeWitt" 1901 | m_arrDuLastNames="Smits" 1902 | m_arrDuLastNames="De Graf" 1903 | m_arrDuLastNames="Vandermeer" 1904 | m_arrDuLastNames="Meyer" 1905 | m_arrDuLastNames="Bakker" 1906 | m_arrDuLastNames="Boor" 1907 | m_arrDuLastNames="Meer" 1908 | m_arrDuLastNames="Vos" 1909 | m_arrDuLastNames="Bos" 1910 | m_arrDuLastNames="Buskirk" 1911 | m_arrDuLastNames="De Jong" 1912 | 1913 | ; ------------------------------------------ 1914 | ; -------------- SCOTTISH ------------------- 1915 | ; ------------------------------------------ 1916 | 1917 | m_arrScMFirstNames="Alan" 1918 | m_arrScMFirstNames="Hugh" 1919 | m_arrScMFirstNames="Angus" 1920 | m_arrScMFirstNames="Aidan" 1921 | m_arrScMFirstNames="Brendan" 1922 | m_arrScMFirstNames="Colin" 1923 | m_arrScMFirstNames="Cameron" 1924 | m_arrScMFirstNames="Kieron" 1925 | m_arrScMFirstNames="Dermott" 1926 | m_arrScMFirstNames="Duncan" 1927 | m_arrScMFirstNames="Fergus" 1928 | m_arrScMFirstNames="Ewan" 1929 | m_arrScMFirstNames="Archie" 1930 | m_arrScMFirstNames="Gordon" 1931 | m_arrScMFirstNames="Neil" 1932 | m_arrScMFirstNames="Oscar" 1933 | m_arrScMFirstNames="Rory" 1934 | m_arrScMFirstNames="Charlie" 1935 | m_arrScMFirstNames="Scottie" 1936 | m_arrScMFirstNames="Ronan" 1937 | m_arrScMFirstNames="Robert" 1938 | 1939 | 1940 | m_arrScFFirstNames="Bridget" 1941 | m_arrScFFirstNames="Lexi" 1942 | m_arrScFFirstNames="Dolly" 1943 | m_arrScFFirstNames="Anna" 1944 | m_arrScFFirstNames="Sarah" 1945 | m_arrScFFirstNames="Rose" 1946 | m_arrScFFirstNames="Clara" 1947 | m_arrScFFirstNames="Charlotte" 1948 | m_arrScFFirstNames="Alice" 1949 | m_arrScFFirstNames="Emily" 1950 | m_arrScFFirstNames="Bessie" 1951 | m_arrScFFirstNames="Kathleen" 1952 | m_arrScFFirstNames="Chrissie" 1953 | m_arrScFFirstNames="Doreen" 1954 | m_arrScFFirstNames="Fiona" 1955 | m_arrScFFirstNames="Isabel" 1956 | m_arrScFFirstNames="Lily" 1957 | m_arrScFFirstNames="Maggie" 1958 | m_arrScFFirstNames="Mary" 1959 | m_arrScFFirstNames="Penny" 1960 | m_arrScFFirstNames="Joan" 1961 | 1962 | m_arrScLastNames="Robertson" 1963 | m_arrScLastNames="Campbell" 1964 | m_arrScLastNames="Stewart" 1965 | m_arrScLastNames="MacDonald" 1966 | m_arrScLastNames="Scott" 1967 | m_arrScLastNames="Murray" 1968 | m_arrScLastNames="Clark" 1969 | m_arrScLastNames="Gray" 1970 | m_arrScLastNames="Burns" 1971 | m_arrScLastNames="Murphy" 1972 | m_arrScLastNames="McKenzie" 1973 | m_arrScLastNames="McIntosh" 1974 | m_arrScLastNames="McGregor" 1975 | m_arrScLastNames="Douglas" 1976 | m_arrScLastNames="Ferguson" 1977 | m_arrScLastNames="McKay" 1978 | m_arrScLastNames="Hunter" 1979 | m_arrScLastNames="Donaldson" 1980 | m_arrScLastNames="McIntyre" 1981 | m_arrScLastNames="MacLeod" 1982 | m_arrScLastNames="Wallace" 1983 | m_arrScLastNames="Gibson" 1984 | m_arrScLastNames="Ross" 1985 | m_arrScLastNames="Hill" 1986 | m_arrScLastNames="Sutherland" 1987 | m_arrScLastNames="Morrison" 1988 | 1989 | ; ------------------------------------------ 1990 | ; -------------- BELGIAN ------------------- 1991 | ; ------------------------------------------ 1992 | 1993 | m_arrBgMFirstNames="Lars" 1994 | m_arrBgMFirstNames="Lucas" 1995 | m_arrBgMFirstNames="Noah" 1996 | m_arrBgMFirstNames="Nathan" 1997 | m_arrBgMFirstNames="Arthur" 1998 | m_arrBgMFirstNames="Mathis" 1999 | m_arrBgMFirstNames="Maxime" 2000 | m_arrBgMFirstNames="Jens" 2001 | m_arrBgMFirstNames="Jonas" 2002 | m_arrBgMFirstNames="Jarne" 2003 | m_arrBgMFirstNames="Niels" 2004 | m_arrBgMFirstNames="Adrien" 2005 | 2006 | 2007 | 2008 | m_arrBgFFirstNames="Lina" 2009 | m_arrBgFFirstNames="Clara" 2010 | m_arrBgFFirstNames="Emma" 2011 | m_arrBgFFirstNames="Lea" 2012 | m_arrBgFFirstNames="Marie" 2013 | m_arrBgFFirstNames="Ines" 2014 | m_arrBgFFirstNames="Ella" 2015 | m_arrBgFFirstNames="Camille" 2016 | m_arrBgFFirstNames="Louise" 2017 | m_arrBgFFirstNames="Julie" 2018 | m_arrBgFFirstNames="Amber" 2019 | m_arrBgFFirstNames="Elise" 2020 | m_arrBgFFirstNames="Chloe" 2021 | 2022 | m_arrBgLastNames="Peeters" 2023 | m_arrBgLastNames="Wouters" 2024 | m_arrBgLastNames="Jacobs" 2025 | m_arrBgLastNames="Willems" 2026 | m_arrBgLastNames="Goosens" 2027 | m_arrBgLastNames="Mertens" 2028 | m_arrBgLastNames="Aerts" 2029 | m_arrBgLastNames="Lambert" 2030 | m_arrBgLastNames="Dupont" 2031 | m_arrBgLastNames="Van Damme" 2032 | m_arrBgLastNames="Lemmens" 2033 | m_arrBgLastNames="Dumont" 2034 | m_arrBgLastNames="Leroy" 2035 | m_arrBgLastNames="Verhoeven" 2036 | m_arrBgLastNames="Renard" 2037 | m_arrBgLastNames="Timmermans" 2038 | m_arrBgLastNames="Gerard" 2039 | m_arrBgLastNames="Vandenberg" 2040 | m_arrBgLastNames="Fontaine" 2041 | m_arrBgLastNames="Beckers" -------------------------------------------------------------------------------- /tests/tests.c: -------------------------------------------------------------------------------- 1 | /* 2 | * MAIN 3 | */ 4 | 5 | #define SIR_STATIC 6 | #define SIMPLE_INI_READER_IMPLEMENTATION 7 | #include "../simple_ini_reader.h" 8 | 9 | #include 10 | 11 | #ifdef _WIN32 12 | 13 | #include 14 | 15 | long long time_in_usecs() 16 | { 17 | LARGE_INTEGER freq, ctr; 18 | 19 | QueryPerformanceFrequency(&freq); 20 | QueryPerformanceCounter(&ctr); 21 | 22 | ctr.QuadPart *= 1000000; 23 | ctr.QuadPart /= freq.QuadPart; 24 | 25 | return ctr.QuadPart; 26 | } 27 | 28 | void print(const char *format, ...) 29 | { 30 | static char s[2048]; 31 | va_list vl; 32 | 33 | va_start(vl, format); 34 | vsnprintf(s, 2048, format, vl); 35 | va_end(vl); 36 | 37 | OutputDebugString(s); 38 | } 39 | 40 | #endif 41 | 42 | #ifdef __unix__ 43 | 44 | #include 45 | 46 | long long time_in_usecs() 47 | { 48 | struct timespec ts; 49 | 50 | clock_gettime(CLOCK_MONOTONIC_RAW, &ts); 51 | 52 | return (ts.tv_sec * 1000000) + (ts.tv_nsec / 1000); 53 | } 54 | 55 | void print(const char *format, ...) 56 | { 57 | va_list vl; 58 | 59 | va_start(vl, format); 60 | vprintf(format, vl); 61 | va_end(vl); 62 | } 63 | 64 | #endif 65 | 66 | int main(int argc, char **argv) 67 | { 68 | long long start_time, end_time; 69 | 70 | start_time = time_in_usecs(); 71 | 72 | SirIni ini; 73 | 74 | // TEST 0 - Fail to load 75 | { 76 | ini = sir_load_from_file("this_file_doesnt_exist", 0, 0); 77 | 78 | if (!sir_has_error(ini)) print("TEST 0 FAILED\n"); 79 | } 80 | 81 | // TEST 1 - Basic Functions 82 | { 83 | // These should succeed 84 | ini = sir_load_from_file("test1.ini", 0, 0); 85 | 86 | sir_section_str(ini, SIR_GLOBAL_SECTION_NAME, "key1"); 87 | if (sir_has_error(ini)) print("TEST 1 FAILED: %s\n", ini->error); 88 | 89 | sir_section_str(ini, "section 1", "key2"); 90 | if (sir_has_error(ini)) print("TEST 1 FAILED: %s\n", ini->error); 91 | 92 | sir_section_str(ini, "section 2", "key3"); 93 | if (sir_has_error(ini)) print("TEST 1 FAILED: %s\n", ini->error); 94 | 95 | sir_str(ini, "key1"); 96 | if (sir_has_error(ini)) print("TEST 1 FAILED: %s\n", ini->error); 97 | 98 | sir_str(ini, "key2"); 99 | if (sir_has_error(ini)) print("TEST 1 FAILED: %s\n", ini->error); 100 | 101 | sir_str(ini, "key3"); 102 | if (sir_has_error(ini)) print("TEST 1 FAILED: %s\n", ini->error); 103 | 104 | // These should fail 105 | sir_section_str(ini, SIR_GLOBAL_SECTION_NAME, "key2"); 106 | if (!sir_has_error(ini)) print("TEST 1 FAILED\n"); 107 | 108 | sir_section_str(ini, "section 1", "key1"); 109 | if (!sir_has_error(ini)) print("TEST 1 FAILED\n"); 110 | 111 | sir_section_str(ini, "this_section_wont_be_found", "key1"); 112 | if (!sir_has_error(ini)) print("TEST 1 FAILED\n"); 113 | 114 | sir_str(ini, "this_key_wont_be_found"); 115 | if (!sir_has_error(ini)) print("TEST 1 FAILED\n"); 116 | 117 | const char *str = sir_section_str(0, SIR_GLOBAL_SECTION_NAME, "key1"); 118 | if (str) print("TEST 1 FAILED\n"); 119 | 120 | str = sir_str(0, "key1"); 121 | if (str) print("TEST 1 FAILED\n"); 122 | 123 | sir_free_ini(ini); 124 | } 125 | 126 | // TEST 2 - Parse to Type 127 | { 128 | // These should succeed 129 | ini = sir_load_from_file("test2.ini", 0, 0); 130 | 131 | long l = sir_long(ini, "long"); 132 | if (sir_has_error(ini)) print("TEST 2 FAILED: %s", ini->error); 133 | if (l != 70000000) print("TEST 2 FAILED\n"); 134 | 135 | unsigned long ul = sir_unsigned_long(ini, "ulong"); 136 | if (sir_has_error(ini)) print("TEST 2 FAILED: %s", ini->error); 137 | if (ul != 2100000) print("TEST 2 FAILED\n"); 138 | 139 | double d = sir_double(ini, "double"); 140 | if (sir_has_error(ini)) print("TEST 2 FAILED: %s", ini->error); 141 | if (d != 3.14) print("TEST 2 FAILED\n"); 142 | 143 | char b = sir_bool(ini, "bool1"); 144 | if (sir_has_error(ini)) print("TEST 2 FAILED: %s", ini->error); 145 | if (!b) print("TEST 2 FAILED\n"); 146 | 147 | b = sir_bool(ini, "bool2"); 148 | if (sir_has_error(ini)) print("TEST 2 FAILED: %s", ini->error); 149 | if (b) print("TEST 2 FAILED\n"); 150 | 151 | b = sir_bool(ini, "bool3"); 152 | if (sir_has_error(ini)) print("TEST 2 FAILED: %s", ini->error); 153 | if (!b) print("TEST 2 FAILED\n"); 154 | 155 | b = sir_bool(ini, "bool4"); 156 | if (sir_has_error(ini)) print("TEST 2 FAILED: %s", ini->error); 157 | if (b) print("TEST 2 FAILED\n"); 158 | 159 | b = sir_bool(ini, "bool5"); 160 | if (sir_has_error(ini)) print("TEST 2 FAILED: %s", ini->error); 161 | if (!b) print("TEST 2 FAILED\n"); 162 | 163 | // These should fail 164 | sir_long(ini, "long_too_big"); 165 | if (!sir_has_error(ini)) print("TEST 2 FAILED\n"); 166 | 167 | sir_long(ini, "long_too_small"); 168 | if (!sir_has_error(ini)) print("TEST 2 FAILED\n"); 169 | 170 | sir_long(ini, "long_no_digits"); 171 | if (!sir_has_error(ini)) print("TEST 2 FAILED\n"); 172 | 173 | sir_long(ini, "long_blank"); 174 | if (!sir_has_error(ini)) print("TEST 2 FAILED\n"); 175 | 176 | sir_double(ini, "double_blank"); 177 | if (!sir_has_error(ini)) print("TEST 2 FAILED\n"); 178 | 179 | sir_long(ini, "double_no_digits"); 180 | if (!sir_has_error(ini)) print("TEST 2 FAILED\n"); 181 | 182 | sir_long(ini, "bool_blank"); 183 | if (!sir_has_error(ini)) print("TEST 2 FAILED\n"); 184 | 185 | sir_long(ini, "bool_not_parsable"); 186 | if (!sir_has_error(ini)) print("TEST 2 FAILED\n"); 187 | 188 | sir_free_ini(ini); 189 | } 190 | 191 | // TEST 3 - Functions that return malloced arrays 192 | { 193 | ini = sir_load_from_file("test3.ini", 0, 0); 194 | 195 | int size; 196 | const char **csv = sir_csv(ini, "csv", &size); 197 | if (sir_has_error(ini)) 198 | print("TEST 3 FAILED: %s\n", ini->error); 199 | else if (size != 4) 200 | print("TEST 3 FAILED\n"); 201 | else 202 | sir_free_csv(ini, csv); 203 | 204 | const char **names = sir_section_key_names(ini, "global", &size); 205 | if (sir_has_error(ini)) 206 | print("TEST 3 FAILED: %s\n", ini->error); 207 | else if (size != 3) 208 | print("TEST 3 FAILED\n"); 209 | else 210 | sir_free(ini, (void *)names); 211 | 212 | const char **values = 213 | sir_section_key_values(ini, "another_section", &size); 214 | if (sir_has_error(ini)) 215 | print("TEST 3 FAILED: %s\n", ini->error); 216 | else if (size != 1) 217 | print("TEST 3 FAILED\n"); 218 | else 219 | sir_free(ini, (void *)values); 220 | } 221 | 222 | // TEST 4 - Options 223 | { 224 | const char *str = 0; 225 | 226 | ini = sir_load_from_file("test4.ini", SIR_OPTION_IGNORE_EMPTY_VALUES, 0); 227 | if (sir_has_error(ini)) 228 | { 229 | print("TEST 4 FAILED: %s\n", ini->error); 230 | } 231 | else 232 | { 233 | str = sir_str(ini, "key0"); 234 | if (str) print("TEST 4 FAILED\n"); 235 | 236 | sir_free_ini(ini); 237 | } 238 | 239 | ini = sir_load_from_file("test4.ini", SIR_OPTION_OVERRIDE_DUPLICATE_KEYS, 0); 240 | if (sir_has_error(ini)) 241 | { 242 | print("TEST 4 FAILED: %s\n", ini->error); 243 | } 244 | else 245 | { 246 | str = sir_str(ini, "key1"); 247 | if (strcmp(str, "baz")) print("TEST 4 FAILED\n"); 248 | 249 | str = sir_section_str(ini, "global", "key1"); 250 | if (strcmp(str, "bar")) print("TEST 4 FAILED\n"); 251 | 252 | sir_free_ini(ini); 253 | } 254 | 255 | ini = sir_load_from_file("test4.ini", SIR_OPTION_DISABLE_QUOTES, 0); 256 | if (sir_has_error(ini)) 257 | { 258 | print("TEST 4 FAILED: %s\n", ini->error); 259 | } 260 | else 261 | { 262 | str = sir_str(ini, "key2"); 263 | if (strcmp(str, "\"hello\"")) print("TEST 4 FAILED\n"); 264 | 265 | sir_free_ini(ini); 266 | } 267 | 268 | ini = sir_load_from_file("test4.ini", SIR_OPTION_DISABLE_HASH_COMMENTS, 0); 269 | if (sir_has_error(ini)) 270 | { 271 | print("TEST 4 FAILED: %s\n", ini->error); 272 | } 273 | else 274 | { 275 | str = sir_str(ini, 276 | "#thisisacomment\n\n[another_section]\n\nkey4"); 277 | if (!str) 278 | print("TEST 4 FAILED\n"); 279 | 280 | sir_free_ini(ini); 281 | } 282 | 283 | ini = sir_load_from_file("test4.ini", SIR_OPTION_DISABLE_COLON_ASSIGNMENT, 0); 284 | if (sir_has_error(ini)) 285 | { 286 | print("TEST 4 FAILED: %s\n", ini->error); 287 | } 288 | else 289 | { 290 | str = sir_str(ini, "key4:colon\n\nkey5"); 291 | if (!str) 292 | print("TEST 4 FAILED\n"); 293 | 294 | sir_free_ini(ini); 295 | } 296 | 297 | ini = sir_load_from_file("test4.ini", SIR_OPTION_DISABLE_COMMENT_ANYWHERE, 0); 298 | if (sir_has_error(ini)) 299 | { 300 | print("TEST 4 FAILED: %s\n", ini->error); 301 | } 302 | else 303 | { 304 | str = sir_str(ini, "key5"); 305 | if (strcmp(str, "olleh#commentanywhere")) 306 | print("TEST 4 FAILED\n"); 307 | 308 | sir_free_ini(ini); 309 | } 310 | 311 | ini = sir_load_from_file("test4.ini", SIR_OPTION_DISABLE_CASE_SENSITIVITY, 0); 312 | if (sir_has_error(ini)) 313 | { 314 | print("TEST 4 FAILED: %s\n", ini->error); 315 | } 316 | else 317 | { 318 | str = sir_str(ini, "key"); 319 | if (strcmp(str, "hello")) 320 | print("TEST 4 FAILED\n"); 321 | 322 | sir_free_ini(ini); 323 | } 324 | } 325 | 326 | // TEST 5 - Test Warnings and Errors 327 | { 328 | ini = sir_load_from_file("test5.ini", 0, 0); 329 | 330 | for (int i = 0; i < ini->warnings_count; ++i) 331 | print("%s\n", ini->warnings[i]); 332 | 333 | sir_free_ini(ini); 334 | 335 | // Test Disabling Warnings 336 | ini = sir_load_from_file("test5.ini", SIR_OPTION_DISABLE_WARNINGS, 0); 337 | if (ini->warnings_count != 0) print("TEST 5 FAILED\n"); 338 | 339 | sir_free_ini(ini); 340 | 341 | // Test Disabling Errors 342 | ini = sir_load_from_file("test5.ini", SIR_OPTION_DISABLE_ERRORS, 0); 343 | 344 | sir_str(ini, "this_wont_be_found"); 345 | 346 | if (sir_has_error(ini)) print("TEST 5 FAILED"); 347 | } 348 | 349 | end_time = time_in_usecs(); 350 | 351 | print("\nTests 1-5: %f Seconds\n", 352 | ((double)end_time - (double)start_time) / 1000000.0); 353 | 354 | // Large Files 355 | { 356 | start_time = time_in_usecs(); 357 | ini = sir_load_from_file("test6.ini", 0, 0); 358 | end_time = time_in_usecs(); 359 | print("\nTests 6: %f Seconds\n", 360 | ((double)end_time - (double)start_time) / 1000000.0); 361 | sir_free_ini(ini); 362 | 363 | start_time = time_in_usecs(); 364 | ini = sir_load_from_file("test7.ini", 0, 0); 365 | end_time = time_in_usecs(); 366 | print("\nTests 7: %f Seconds\n", 367 | ((double)end_time - (double)start_time) / 1000000.0); 368 | sir_free_ini(ini); 369 | 370 | start_time = time_in_usecs(); 371 | ini = sir_load_from_file("test8.ini", 0, 0); 372 | end_time = time_in_usecs(); 373 | print("\nTests 8: %f Seconds\n", 374 | ((double)end_time - (double)start_time) / 1000000.0); 375 | sir_free_ini(ini); 376 | } 377 | 378 | return 0; 379 | } 380 | -------------------------------------------------------------------------------- /util/README.md: -------------------------------------------------------------------------------- 1 | # Simple INI Reader Command-Line Utility 2 | This utility provides a basic shell interface to the Simple INI Reader library. 3 | It is written in the style of a Unix command (can be used with pipes and 4 | redirection, features a minimal set of options, etc.), but only uses C Standard 5 | Library functions, so it should be portable. 6 | 7 | ## Usage 8 | Input is given either in the form of a filename argument or as Standard Input 9 | if no filename is specified. The program uses the first argument it finds that 10 | doesn't look like an option as the filename. Any other filenames specified are 11 | ignored. 12 | 13 | The `-k key_name` option finds the first key named `key_name` and prints it 14 | to Standard Output. If the `-k` option is not given, all values are printed. 15 | 16 | The `-s section_name` option tells the program that you only want to look at 17 | keys in `section_name`. 18 | 19 | The `--list-sections` option prints the name of each section. Note that no name 20 | is printed for the INI's global section. 21 | 22 | The `--list-keys` option prints each key name (as opposed to the key values 23 | printed by `-k`). Note that this may be combined with the `-s` option to get 24 | the key names from a specific section. 25 | 26 | ## Compilation 27 | Simply compile `sir_util.c` with a C compiler. For example: 28 | 29 | ``` 30 | gcc -o sir sir_util.c 31 | ``` 32 | -------------------------------------------------------------------------------- /util/sir_util.c: -------------------------------------------------------------------------------- 1 | // Public-domain Unix-style program that provides a user-interface to 2 | // the Simple INI Reader library, written using only the C Standard Library. 3 | // 4 | // Author: Sebastian Jones (http://www.sebj.co.uk) 5 | 6 | #include 7 | #include 8 | #include 9 | 10 | #define SIMPLE_INI_READER_IMPLEMENTATION 11 | #include "../simple_ini_reader.h" 12 | 13 | // Returns the first argument that doesn't start with '-' or "--", or 14 | // 0 if none is found 15 | char *arg_first_non_option(int argc, char **argv) 16 | { 17 | for (int i = 1; i < argc; ++i) 18 | { 19 | if (argv[i][0] == '-') 20 | { 21 | if (argv[i][1] != '-') 22 | ++i; 23 | } 24 | else 25 | { 26 | return argv[i]; 27 | } 28 | } 29 | 30 | return 0; 31 | } 32 | 33 | // Returns the index of the first argument that matched 'arg', or -1 34 | // if not found. 35 | int arg_index(int argc, char **argv, char *arg) 36 | { 37 | for (int i = 1; i < argc; ++i) 38 | if (!strcmp(argv[i], arg)) 39 | return i; 40 | 41 | return -1; 42 | } 43 | 44 | // Returns the operand of 'option' or 0 if the option is not found or 45 | // an operand is not specified. 46 | char *arg_operand(int argc, char **argv, char *option) 47 | { 48 | int option_index = arg_index(argc, argv, option); 49 | if (option_index == -1) 50 | return 0; 51 | 52 | int operand_index = option_index + 1; 53 | if (operand_index >= argc) 54 | return 0; 55 | 56 | return argv[operand_index]; 57 | } 58 | 59 | // Prints a usage message to Standard Output 60 | void print_help() 61 | { 62 | printf("\n\tsir [-s section_name] [-k key_name] [FILENAME]\n\n" 63 | "\tParses INI data and prints the value of the specified\n" 64 | "\tkey from the specified section. If 'FILENAME' is not\n" 65 | "\tspecified, the program attempts to read the data from\n" 66 | "\tStandard Input (pipes and redirection only).\n\n" 67 | "\tOPTIONS\n\n" 68 | "\t-s section_name\t\tLook only in the given section.\n" 69 | "\t\t\t\tIf omitted, all sections are used.\n\n" 70 | "\t-k key_name\t\tFind the value of this key only.\n" 71 | "\t\t\t\tIf omitted, all values are listed.\n\n" 72 | "\t--help\t\t\tDisplay this help screen.\n\n" 73 | "\t--list-keys\t\tList key names. If used with the '-s'\n" 74 | "\t\t\t\toption, lists the key names in that section.\n\n" 75 | "\t--list-sections\t\tList section names.\n\n" 76 | ); 77 | } 78 | 79 | #define arg_exists(argc, argv, arg) arg_index(argc, argv, arg) != -1 80 | 81 | int main(int argc, char **argv) 82 | { 83 | if (arg_exists(argc, argv, "--help")) 84 | { 85 | print_help(); 86 | return 0; 87 | } 88 | 89 | // Parse INI 90 | 91 | SirIni ini = 0; 92 | 93 | char *filename = arg_first_non_option(argc, argv); 94 | if (filename) 95 | { 96 | ini = sir_load_from_file(filename, 0, 0); 97 | } 98 | else 99 | { 100 | // Attempt to read INI from Standard Input 101 | fseek(stdin, 0, SEEK_END); 102 | size_t size = ftell(stdin); 103 | 104 | if (size == EOF) 105 | { 106 | print_help(); 107 | return 1; 108 | } 109 | 110 | rewind(stdin); 111 | 112 | char *str = malloc(size + 1); 113 | 114 | size_t bytes_read = fread(str, 1, size, stdin); 115 | if (bytes_read < size) 116 | { 117 | size = bytes_read; 118 | str = realloc(str, size + 1); 119 | } 120 | 121 | str[size] = '\0'; 122 | 123 | ini = sir_load_from_str(str, 0, "stdin", 0); 124 | } 125 | 126 | if (!ini) 127 | { 128 | fprintf(stderr, "Something went seriously wrong\n"); 129 | return 1; 130 | } 131 | 132 | if (sir_has_error(ini)) 133 | { 134 | fprintf(stderr, "%s\n", ini->error); 135 | return 1; 136 | } 137 | 138 | for (int i = 0; i < ini->warnings_count; ++i) 139 | fprintf(stderr, "%s\n", ini->warnings[i]); 140 | 141 | // Do action specified by args 142 | char *section = arg_operand(argc, argv, "-s"); 143 | 144 | if (arg_exists(argc, argv, "--list-sections")) 145 | { 146 | for (int i = 0; i < ini->section_count; ++i) 147 | if (strcmp(ini->section_names[i], SIR_GLOBAL_SECTION_NAME)) 148 | printf("%s\n", ini->section_names[i]); 149 | } 150 | else if (arg_exists(argc, argv, "--list-keys")) 151 | { 152 | if (section) 153 | { 154 | int names_size; 155 | const char **names = sir_section_key_names(ini, section, 156 | &names_size); 157 | 158 | for (int i = 0; i < names_size; ++i) 159 | printf("%s\n", names[i]); 160 | } 161 | else 162 | { 163 | for (int i = 0; i < ini->key_count; ++i) 164 | printf("%s\n", ini->key_names[i]); 165 | } 166 | } 167 | else 168 | { 169 | char *key = arg_operand(argc, argv, "-k"); 170 | if (key) 171 | { 172 | const char *value = sir_section_str(ini, section, key); 173 | if (sir_has_error(ini)) 174 | { 175 | fprintf(stderr, "%s\n", ini->error); 176 | return 1; 177 | } 178 | 179 | printf("%s\n", value); 180 | } 181 | else 182 | { 183 | if (section) 184 | { 185 | int values_size; 186 | const char **values = sir_section_key_values(ini, 187 | section, &values_size); 188 | 189 | for (int i = 0; i < values_size; ++i) 190 | printf("%s\n", values[i]); 191 | } 192 | else 193 | { 194 | for (int i = 0; i < ini->key_count; ++i) 195 | printf("%s\n", ini->key_values[i]); 196 | } 197 | } 198 | } 199 | 200 | sir_free_ini(ini); 201 | 202 | return 0; 203 | } 204 | --------------------------------------------------------------------------------