OLD | NEW |
(Empty) | |
| 1 /* |
| 2 ** Copyright (c) 1999, 2000, 2001, 2002, 2003 |
| 3 ** Adel I. Mirzazhanov. All rights reserved |
| 4 ** |
| 5 ** Redistribution and use in source and binary forms, with or without |
| 6 ** modification, are permitted provided that the following conditions |
| 7 ** are met: |
| 8 ** |
| 9 ** 1.Redistributions of source code must retain the above copyright notice, |
| 10 ** this list of conditions and the following disclaimer. |
| 11 ** 2.Redistributions in binary form must reproduce the above copyright |
| 12 ** notice, this list of conditions and the following disclaimer in the |
| 13 ** documentation and/or other materials provided with the distribution. |
| 14 ** 3.The name of the author may not be used to endorse or promote products |
| 15 ** derived from this software without specific prior written permission. |
| 16 ** |
| 17 ** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS |
| 18 ** OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
| 19 ** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| 20 ** ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY |
| 21 ** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| 22 ** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE |
| 23 ** GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| 24 ** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
| 25 ** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
| 26 ** NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| 27 ** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 28 */ |
| 29 |
| 30 #include <stdlib.h> |
| 31 #include <string.h> |
| 32 #if !defined(WIN32) && !defined(_WIN32) && !defined(__WIN32) && !defined(__WIN32
__) |
| 33 #include <strings.h> |
| 34 #endif |
| 35 #ifndef APGBFM |
| 36 # include "errs.h" |
| 37 # include "randpass.h" |
| 38 #endif |
| 39 |
| 40 #include "convert.h" |
| 41 |
| 42 /* |
| 43 ** GLOBALS |
| 44 */ |
| 45 |
| 46 /* small letters */ |
| 47 char let[26] = |
| 48 { |
| 49 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', |
| 50 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', |
| 51 'u', 'v', 'w', 'x', 'w', 'z' |
| 52 }; |
| 53 /* capital letters */ |
| 54 char clet[26] = |
| 55 { |
| 56 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', |
| 57 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', |
| 58 'U', 'V', 'W', 'X', 'W', 'Z' |
| 59 }; |
| 60 |
| 61 /* |
| 62 ** FUNCTIONS |
| 63 */ |
| 64 |
| 65 /* |
| 66 ** decapitalize() - This routine replaces all capital letters |
| 67 ** to small letters in the word: |
| 68 ** INPUT: |
| 69 ** char * - word. |
| 70 ** OUTPUT: |
| 71 ** none. |
| 72 ** NOTES: |
| 73 ** none. |
| 74 */ |
| 75 void |
| 76 decapitalize (char *word) |
| 77 { |
| 78 int i = 0; /* counter */ |
| 79 int j = 0; /* counter */ |
| 80 int str_len = strlen(word); |
| 81 for(j = 0; j < str_len; j++) |
| 82 for(i=0; i < 26; i++) |
| 83 if(word[j] == clet[i]) |
| 84 word[j] = let[i]; |
| 85 } |
| 86 |
| 87 #ifndef APGBFM |
| 88 /* |
| 89 ** capitalize() - This routine designed to modify sullable like this: |
| 90 ** adel ----> Adel |
| 91 ** dot ----> Dot |
| 92 ** etc. |
| 93 ** INPUT: |
| 94 ** char * - syllable. |
| 95 ** OUTPUT: |
| 96 ** none. |
| 97 ** NOTES: |
| 98 ** none. |
| 99 */ |
| 100 void |
| 101 capitalize (char *syllable) |
| 102 { |
| 103 char tmp = 0x00; |
| 104 int i = 0; |
| 105 if ( randint(2) == TRUE) |
| 106 { |
| 107 (void)memcpy((void *)&tmp, (void *)syllable, sizeof(tmp)); |
| 108 for(i=0; i < 26; i++) |
| 109 if ( let[i] == tmp ) |
| 110 if (is_restricted_symbol(clet[i]) != TRUE) |
| 111 (void)memcpy ((void *)syllable, (void *)&clet[i], 1); |
| 112 } |
| 113 } |
| 114 |
| 115 /* |
| 116 ** numerize() - This routine designed to modify single-letter |
| 117 ** syllable like this: |
| 118 ** a ----> 1 or 2 or 3 etc. |
| 119 ** u ----> 1 or 2 or 3 etc. |
| 120 ** etc. |
| 121 ** INPUT: |
| 122 ** char * - single-letter syllable |
| 123 ** OUTPUT: |
| 124 ** none. |
| 125 ** NOTES: |
| 126 ** none. |
| 127 */ |
| 128 void |
| 129 numerize (char *syllable) |
| 130 { |
| 131 char *tmp; |
| 132 if ( (tmp = (char *)calloc(1, 4)) == NULL) |
| 133 err_sys_fatal("calloc"); |
| 134 if ( strlen (syllable) == 1 ) |
| 135 { |
| 136 (void) gen_rand_symbol(tmp, S_NB); |
| 137 (void)memcpy ((void *)syllable, (void *)tmp, 1); |
| 138 } |
| 139 free ((void *)tmp); |
| 140 } |
| 141 /* |
| 142 ** specialize() - This routine designed to modify single-letter syllable |
| 143 ** like this: |
| 144 ** a ----> # or $ or % etc. |
| 145 ** u ----> # or $ or % etc. |
| 146 ** etc. |
| 147 ** INPUT: |
| 148 ** char * - single-letter syllable. |
| 149 ** OUTPUT: |
| 150 ** none. |
| 151 ** NOTES: |
| 152 ** none. |
| 153 */ |
| 154 void |
| 155 specialize (char *syllable) |
| 156 { |
| 157 char *tmp; |
| 158 if ( (tmp = (char *)calloc(1, 4)) == NULL) |
| 159 err_sys_fatal("calloc"); |
| 160 if ( strlen (syllable) == 1 ) |
| 161 { |
| 162 (void) gen_rand_symbol(tmp, S_SS); |
| 163 (void)memcpy ((void *)syllable, (void *)tmp, 1); |
| 164 } |
| 165 free ((void *)tmp); |
| 166 } |
| 167 |
| 168 /* |
| 169 ** symb2name - convert symbol to it's name |
| 170 ** INPUT: |
| 171 ** char * - one symbol syllable |
| 172 ** OUTPUT: |
| 173 ** none. |
| 174 ** NOTES: |
| 175 ** none. |
| 176 */ |
| 177 void |
| 178 symb2name(char * syllable, char * h_syllable) |
| 179 { |
| 180 struct ssymb_names |
| 181 { |
| 182 char symbol; |
| 183 char *name; |
| 184 }; |
| 185 static struct ssymb_names ssn[42] = |
| 186 { |
| 187 {'1',"ONE"}, |
| 188 {'2',"TWO"}, |
| 189 {'3',"THREE"}, |
| 190 {'4',"FOUR"}, |
| 191 {'5',"FIVE"}, |
| 192 {'6',"SIX"}, |
| 193 {'7',"SEVEN"}, |
| 194 {'8',"EIGHT"}, |
| 195 {'9',"NINE"}, |
| 196 {'0',"ZERO"}, |
| 197 {33, "EXCLAMATION_POINT"}, |
| 198 {34, "QUOTATION_MARK"}, |
| 199 {35, "CROSSHATCH"}, |
| 200 {36, "DOLLAR_SIGN"}, |
| 201 {37, "PERCENT_SIGN"}, |
| 202 {38, "AMPERSAND"}, |
| 203 {39, "APOSTROPHE"}, |
| 204 {40, "LEFT_PARENTHESIS"}, |
| 205 {41, "RIGHT_PARENTHESIS"}, |
| 206 {42, "ASTERISK"}, |
| 207 {43, "PLUS_SIGN"}, |
| 208 {44, "COMMA"}, |
| 209 {45, "HYPHEN"}, |
| 210 {46, "PERIOD"}, |
| 211 {47, "SLASH"}, |
| 212 {58, "COLON"}, |
| 213 {59, "SEMICOLON"}, |
| 214 {60, "LESS_THAN"}, |
| 215 {61, "EQUAL_SIGN"}, |
| 216 {62, "GREATER_THAN"}, |
| 217 {63, "QUESTION_MARK"}, |
| 218 {64, "AT_SIGN"}, |
| 219 {91, "LEFT_BRACKET"}, |
| 220 {92, "BACKSLASH"}, |
| 221 {93, "RIGHT_BRACKET"}, |
| 222 {94, "CIRCUMFLEX"}, |
| 223 {95, "UNDERSCORE"}, |
| 224 {96, "GRAVE"}, |
| 225 {123, "LEFT_BRACE"}, |
| 226 {124, "VERTICAL_BAR"}, |
| 227 {125, "RIGHT_BRACE"}, |
| 228 {126, "TILDE"} |
| 229 }; |
| 230 int i = 0; |
| 231 int flag = FALSE; |
| 232 |
| 233 if (strlen(syllable) == 1) |
| 234 { |
| 235 for (i = 0; i < 42; i++) |
| 236 { |
| 237 if(*syllable == ssn[i].symbol) |
| 238 { |
| 239 (void)memcpy((void*)h_syllable, (void*)ssn[i].name, strlen(ssn[i].name)
); |
| 240 flag = TRUE; |
| 241 } |
| 242 } |
| 243 if (flag != TRUE) |
| 244 (void)memcpy((void*)h_syllable, (void*)syllable, strlen(syllable)); |
| 245 } |
| 246 } |
| 247 |
| 248 /* |
| 249 ** spell_word - spell the word |
| 250 ** INPUT: |
| 251 ** char * - pointer to the word |
| 252 ** char * - pointer to the spelled word |
| 253 ** OUTPUT: |
| 254 ** char * - pointer to the spelled word |
| 255 ** NULL - something is wrong |
| 256 ** NOTES: |
| 257 ** You should free() memory pointed by spelled_word after each use of spell_wo
rd |
| 258 */ |
| 259 char * |
| 260 spell_word(char * word, char * spelled_word) |
| 261 { |
| 262 struct char_spell |
| 263 { |
| 264 char symbol; |
| 265 char *name; |
| 266 }; |
| 267 static struct char_spell cs[94] = |
| 268 { |
| 269 {'1',"ONE" }, |
| 270 {'2',"TWO" }, |
| 271 {'3',"THREE" }, |
| 272 {'4',"FOUR" }, |
| 273 {'5',"FIVE" }, |
| 274 {'6',"SIX" }, |
| 275 {'7',"SEVEN" }, |
| 276 {'8',"EIGHT" }, |
| 277 {'9',"NINE" }, |
| 278 {'0',"ZERO" }, |
| 279 {'A', "Alfa" }, |
| 280 {'B', "Bravo" }, |
| 281 {'C', "Charlie" }, |
| 282 {'D', "Delta" }, |
| 283 {'E', "Echo" }, |
| 284 {'F', "Foxtrot" }, |
| 285 {'G', "Golf" }, |
| 286 {'H', "Hotel" }, |
| 287 {'I', "India" }, |
| 288 {'J', "Juliett" }, |
| 289 {'K', "Kilo" }, |
| 290 {'L', "Lima" }, |
| 291 {'M', "Mike" }, |
| 292 {'N', "November" }, |
| 293 {'O', "Oscar" }, |
| 294 {'P', "Papa" }, |
| 295 {'Q', "Quebec" }, |
| 296 {'R', "Romeo" }, |
| 297 {'S', "Sierra" }, |
| 298 {'T', "Tango" }, |
| 299 {'U', "Uniform" }, |
| 300 {'V', "Victor" }, |
| 301 {'W', "Whiskey" }, |
| 302 {'X', "X_ray" }, |
| 303 {'Y', "Yankee" }, |
| 304 {'Z', "Zulu" }, |
| 305 {'a', "alfa" }, |
| 306 {'b', "bravo" }, |
| 307 {'c', "charlie" }, |
| 308 {'d', "delta" }, |
| 309 {'e', "echo" }, |
| 310 {'f', "foxtrot" }, |
| 311 {'g', "golf" }, |
| 312 {'h', "hotel" }, |
| 313 {'i', "india" }, |
| 314 {'j', "juliett" }, |
| 315 {'k', "kilo" }, |
| 316 {'l', "lima" }, |
| 317 {'m', "mike" }, |
| 318 {'n', "november" }, |
| 319 {'o', "oscar" }, |
| 320 {'p', "papa" }, |
| 321 {'q', "quebec" }, |
| 322 {'r', "romeo" }, |
| 323 {'s', "sierra" }, |
| 324 {'t', "tango" }, |
| 325 {'u', "uniform" }, |
| 326 {'v', "victor" }, |
| 327 {'w', "whiskey" }, |
| 328 {'x', "x_ray" }, |
| 329 {'y', "yankee" }, |
| 330 {'z', "zulu" }, |
| 331 {33, "EXCLAMATION_POINT"}, |
| 332 {34, "QUOTATION_MARK" }, |
| 333 {35, "CROSSHATCH" }, |
| 334 {36, "DOLLAR_SIGN" }, |
| 335 {37, "PERCENT_SIGN" }, |
| 336 {38, "AMPERSAND" }, |
| 337 {39, "APOSTROPHE" }, |
| 338 {40, "LEFT_PARENTHESIS" }, |
| 339 {41, "RIGHT_PARENTHESIS"}, |
| 340 {42, "ASTERISK" }, |
| 341 {43, "PLUS_SIGN" }, |
| 342 {44, "COMMA" }, |
| 343 {45, "HYPHEN" }, |
| 344 {46, "PERIOD" }, |
| 345 {47, "SLASH" }, |
| 346 {58, "COLON" }, |
| 347 {59, "SEMICOLON" }, |
| 348 {60, "LESS_THAN" }, |
| 349 {61, "EQUAL_SIGN" }, |
| 350 {62, "GREATER_THAN" }, |
| 351 {63, "QUESTION_MARK" }, |
| 352 {64, "AT_SIGN" }, |
| 353 {91, "LEFT_BRACKET" }, |
| 354 {92, "BACKSLASH" }, |
| 355 {93, "RIGHT_BRACKET" }, |
| 356 {94, "CIRCUMFLEX" }, |
| 357 {95, "UNDERSCORE" }, |
| 358 {96, "GRAVE" }, |
| 359 {123, "LEFT_BRACE" }, |
| 360 {124, "VERTICAL_BAR" }, |
| 361 {125, "RIGHT_BRACE" }, |
| 362 {126, "TILDE" } |
| 363 }; |
| 364 int s_length = 0; |
| 365 int i = 0; |
| 366 int j = 0; |
| 367 int word_len = strlen(word); |
| 368 char * tmp_ptr; |
| 369 char hyphen = '-'; |
| 370 char zero = 0x00; |
| 371 |
| 372 /* Count the length of the spelled word */ |
| 373 for (i=0; i <= word_len; i++) |
| 374 for (j=0; j < 94; j++) |
| 375 if (word[i] == cs[j].symbol) |
| 376 { |
| 377 s_length = s_length + strlen(cs[j].name) + 1; |
| 378 continue; |
| 379 } |
| 380 |
| 381 /* Allocate memory for spelled word */ |
| 382 if ( (spelled_word = (char *)calloc(1, (size_t)s_length)) == NULL) |
| 383 return(NULL); |
| 384 |
| 385 /* Construct spelled word */ |
| 386 tmp_ptr = spelled_word; |
| 387 |
| 388 for (i=0; i < word_len; i++) |
| 389 for (j=0; j < 94; j++) |
| 390 if (word[i] == cs[j].symbol) |
| 391 { |
| 392 (void) memcpy((void *)tmp_ptr, (void *)cs[j].name, strlen(cs[j].name)); |
| 393 tmp_ptr = tmp_ptr + strlen(cs[j].name); |
| 394 /* Place the hyphen after each symbol */ |
| 395 (void) memcpy((void *)(tmp_ptr), (void *)&hyphen, 1); |
| 396 tmp_ptr = tmp_ptr + 1; |
| 397 continue; |
| 398 } |
| 399 |
| 400 /* Remove hyphen at the end of the word */ |
| 401 tmp_ptr = tmp_ptr - 1; |
| 402 (void) memcpy((void *)(tmp_ptr), (void *)&zero, 1); |
| 403 |
| 404 return (spelled_word); |
| 405 } |
| 406 |
| 407 #endif /* APGBFM */ |
OLD | NEW |