chinwag 0.1.5 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Rakefile +1 -1
- data/ext/chinwag/chinwag.c +46 -41
- data/ext/chinwag/chinwag.h +20 -12
- data/ext/chinwag/config.c +6 -6
- data/ext/chinwag/dict.c +211 -107
- data/ext/chinwag/dict.h +93 -41
- data/ext/chinwag/latin.h +2 -2
- data/ext/chinwag/rb_chinwag_ext.c +255 -167
- data/ext/chinwag/seuss.h +2 -2
- data/ext/chinwag/tokenize.c +7 -5
- data/ext/chinwag/tokenize.h +5 -2
- metadata +2 -2
| @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            #include "rb_chinwag_ext.h"
         | 
| 2 2 |  | 
| 3 3 | 
             
            VALUE m_chinwag;
         | 
| 4 | 
            -
            VALUE  | 
| 4 | 
            +
            VALUE c_cwdict;
         | 
| 5 5 |  | 
| 6 6 | 
             
            VALUE default_dict;
         | 
| 7 7 | 
             
            VALUE default_output_type;
         | 
| @@ -31,7 +31,7 @@ cw_t get_cw_t_for_symbol(VALUE symbol) | |
| 31 31 |  | 
| 32 32 | 
             
            VALUE m_cw_generate(int argc, VALUE* argv, VALUE obj)
         | 
| 33 33 | 
             
            {
         | 
| 34 | 
            -
               | 
| 34 | 
            +
              cwdict_t* d;
         | 
| 35 35 | 
             
              VALUE result;
         | 
| 36 36 | 
             
              cw_t cw_type = get_cw_t_for_symbol(default_output_type);
         | 
| 37 37 | 
             
              long min = NUM2LONG(default_min_output);
         | 
| @@ -45,9 +45,9 @@ VALUE m_cw_generate(int argc, VALUE* argv, VALUE obj) | |
| 45 45 | 
             
              }
         | 
| 46 46 |  | 
| 47 47 | 
             
              // do stuff with 'em
         | 
| 48 | 
            -
              if(argc == 0) Data_Get_Struct(default_dict,  | 
| 48 | 
            +
              if(argc == 0) Data_Get_Struct(default_dict, cwdict_t, d);
         | 
| 49 49 |  | 
| 50 | 
            -
              if(argc >= 1) Data_Get_Struct(argv[0],  | 
| 50 | 
            +
              if(argc >= 1) Data_Get_Struct(argv[0], cwdict_t, d);
         | 
| 51 51 |  | 
| 52 52 | 
             
              if(argc >= 2) cw_type = get_cw_t_for_symbol(argv[1]);
         | 
| 53 53 |  | 
| @@ -75,7 +75,7 @@ VALUE m_cw_generate(int argc, VALUE* argv, VALUE obj) | |
| 75 75 | 
             
                rb_raise(rb_eRangeError,"out of range (1..10000)");
         | 
| 76 76 | 
             
              }
         | 
| 77 77 |  | 
| 78 | 
            -
              if(! | 
| 78 | 
            +
              if(!cwdict_valid(*d, &e))
         | 
| 79 79 | 
             
              {
         | 
| 80 80 | 
             
                rb_raise(rb_eException, "%s", e);
         | 
| 81 81 | 
             
                free(e);
         | 
| @@ -107,14 +107,14 @@ VALUE m_cw_generate(int argc, VALUE* argv, VALUE obj) | |
| 107 107 | 
             
              return result;
         | 
| 108 108 | 
             
            }
         | 
| 109 109 |  | 
| 110 | 
            -
            VALUE  | 
| 111 | 
            -
            VALUE  | 
| 110 | 
            +
            VALUE c_cwdict_clone(VALUE obj);
         | 
| 111 | 
            +
            VALUE c_cwdict_close(VALUE obj);
         | 
| 112 112 | 
             
            VALUE m_set_d_dict(VALUE obj, VALUE new)
         | 
| 113 113 | 
             
            {
         | 
| 114 | 
            -
              VALUE original =  | 
| 114 | 
            +
              VALUE original = c_cwdict_clone(default_dict);
         | 
| 115 115 |  | 
| 116 | 
            -
              default_dict =  | 
| 117 | 
            -
              default_dict =  | 
| 116 | 
            +
              default_dict = c_cwdict_close(default_dict);
         | 
| 117 | 
            +
              default_dict = c_cwdict_clone(new);
         | 
| 118 118 |  | 
| 119 119 | 
             
              return original;
         | 
| 120 120 | 
             
            }
         | 
| @@ -190,17 +190,17 @@ VALUE m_s_max(VALUE obj, VALUE num) | |
| 190 190 | 
             
              return original;
         | 
| 191 191 | 
             
            }
         | 
| 192 192 |  | 
| 193 | 
            -
            static void  | 
| 193 | 
            +
            static void c_cwdict_free(void* dict)
         | 
| 194 194 | 
             
            {
         | 
| 195 | 
            -
               | 
| 196 | 
            -
              if(d->drows && d->count > 0)  | 
| 195 | 
            +
              cwdict_t* d = (cwdict_t*)dict;
         | 
| 196 | 
            +
              if(d->drows && d->count > 0) cwdict_close(*d);
         | 
| 197 197 | 
             
            }
         | 
| 198 198 |  | 
| 199 | 
            -
            VALUE  | 
| 199 | 
            +
            VALUE c_cwdict_open(int argc, VALUE* argv, VALUE obj)
         | 
| 200 200 | 
             
            {
         | 
| 201 201 | 
             
              VALUE file_pathname;
         | 
| 202 202 | 
             
              FILE* file_ptr = NULL;
         | 
| 203 | 
            -
               | 
| 203 | 
            +
              cwdict_t d = cwdict_open(), path_parts, file_parts;
         | 
| 204 204 | 
             
              char* tkns_ptr = NULL; char* name_ptr = NULL;
         | 
| 205 205 | 
             
              char* path_name = NULL; char* file_name = NULL;
         | 
| 206 206 | 
             
              char* name = NULL; bool used_file = false; char* file_buffer = NULL;
         | 
| @@ -226,7 +226,7 @@ VALUE c_cw_dict_open(int argc, VALUE* argv, VALUE obj) | |
| 226 226 |  | 
| 227 227 | 
             
                    if(include(path_name, "/") || include(path_name, "\\"))
         | 
| 228 228 | 
             
                    {
         | 
| 229 | 
            -
                      path_parts =  | 
| 229 | 
            +
                      path_parts = split_into_cwdict(path_name, "/\\");
         | 
| 230 230 |  | 
| 231 231 | 
             
                      last_drow = path_parts.count - 1;
         | 
| 232 232 | 
             
                      last_word = path_parts.drows[last_drow].count - 1;
         | 
| @@ -236,7 +236,7 @@ VALUE c_cw_dict_open(int argc, VALUE* argv, VALUE obj) | |
| 236 236 | 
             
                      strcpy(file_name, path_parts.drows[last_drow].words[last_word]);
         | 
| 237 237 | 
             
                      file_name[len] = '\0';
         | 
| 238 238 |  | 
| 239 | 
            -
                       | 
| 239 | 
            +
                      cwdict_close(path_parts);
         | 
| 240 240 | 
             
                    }
         | 
| 241 241 | 
             
                    else
         | 
| 242 242 | 
             
                    {
         | 
| @@ -247,7 +247,7 @@ VALUE c_cw_dict_open(int argc, VALUE* argv, VALUE obj) | |
| 247 247 |  | 
| 248 248 | 
             
                    if(include(file_name, "."))
         | 
| 249 249 | 
             
                    {
         | 
| 250 | 
            -
                      file_parts =  | 
| 250 | 
            +
                      file_parts = split_into_cwdict(file_name, ".");
         | 
| 251 251 |  | 
| 252 252 | 
             
                      size_t len = strlen(file_parts.drows[0].words[0]);
         | 
| 253 253 |  | 
| @@ -255,7 +255,7 @@ VALUE c_cw_dict_open(int argc, VALUE* argv, VALUE obj) | |
| 255 255 | 
             
                      strcpy(name, file_parts.drows[0].words[0]);
         | 
| 256 256 | 
             
                      name[len] = '\0';
         | 
| 257 257 |  | 
| 258 | 
            -
                       | 
| 258 | 
            +
                      cwdict_close(file_parts);
         | 
| 259 259 | 
             
                    }
         | 
| 260 260 | 
             
                    else
         | 
| 261 261 | 
             
                    {
         | 
| @@ -282,26 +282,26 @@ VALUE c_cw_dict_open(int argc, VALUE* argv, VALUE obj) | |
| 282 282 | 
             
              }
         | 
| 283 283 |  | 
| 284 284 | 
             
              // check if tkns references existing, embedded dictionary...
         | 
| 285 | 
            -
              if(!tkns_ptr && !name_ptr && !used_file) d =  | 
| 285 | 
            +
              if(!tkns_ptr && !name_ptr && !used_file) d = cwdict_open();
         | 
| 286 286 | 
             
              else if(tkns_ptr && !used_file)
         | 
| 287 287 | 
             
              {
         | 
| 288 288 | 
             
                if(strcmp(tkns_ptr, "seussian") == 0)
         | 
| 289 289 | 
             
                {
         | 
| 290 290 | 
             
                  if(!name_ptr)
         | 
| 291 | 
            -
                  d | 
| 291 | 
            +
                  d=cwdict_open_with_name_and_tokens("seussian",dict_seuss,DELIMITERS);
         | 
| 292 292 | 
             
                  else
         | 
| 293 | 
            -
                  d | 
| 293 | 
            +
                  d=cwdict_open_with_name_and_tokens(name_ptr,dict_seuss,DELIMITERS);
         | 
| 294 294 | 
             
                }
         | 
| 295 295 | 
             
                else if(strcmp(tkns_ptr, "latin") == 0)
         | 
| 296 296 | 
             
                {
         | 
| 297 297 | 
             
                  if(!name_ptr)
         | 
| 298 | 
            -
                  d | 
| 298 | 
            +
                  d=cwdict_open_with_name_and_tokens("latin", dict_latin,DELIMITERS);
         | 
| 299 299 | 
             
                  else
         | 
| 300 | 
            -
                  d | 
| 300 | 
            +
                  d=cwdict_open_with_name_and_tokens(name_ptr, dict_latin,DELIMITERS);
         | 
| 301 301 | 
             
                }
         | 
| 302 302 | 
             
              }
         | 
| 303 303 | 
             
              // ...else, if just a name was passed...
         | 
| 304 | 
            -
              else if(name_ptr && !used_file) d =  | 
| 304 | 
            +
              else if(name_ptr && !used_file) d = cwdict_open_with_name(name_ptr);
         | 
| 305 305 | 
             
              // ...else, see if file exists by passed name...
         | 
| 306 306 | 
             
              else if(used_file && name && file_ptr)
         | 
| 307 307 | 
             
              {
         | 
| @@ -312,52 +312,52 @@ VALUE c_cw_dict_open(int argc, VALUE* argv, VALUE obj) | |
| 312 312 | 
             
                  file_name);
         | 
| 313 313 | 
             
                }
         | 
| 314 314 |  | 
| 315 | 
            -
                d | 
| 315 | 
            +
                d=cwdict_open_with_name_and_tokens(name, file_buffer, DELIMITERS);
         | 
| 316 316 |  | 
| 317 317 | 
             
                free(file_buffer);
         | 
| 318 318 | 
             
              }
         | 
| 319 319 | 
             
              // ...else, return a blank dictionary
         | 
| 320 320 |  | 
| 321 321 | 
             
              // create a dictionary pointer
         | 
| 322 | 
            -
               | 
| 322 | 
            +
              cwdict_t* d_ptr = (cwdict_t*)malloc(sizeof(cwdict_t));
         | 
| 323 323 | 
             
              *d_ptr = d;
         | 
| 324 324 |  | 
| 325 325 | 
             
              if(name) free(name);
         | 
| 326 326 | 
             
              if(file_name) free(file_name);
         | 
| 327 327 |  | 
| 328 | 
            -
              return Data_Wrap_Struct( | 
| 328 | 
            +
              return Data_Wrap_Struct(c_cwdict, 0, c_cwdict_free, d_ptr);
         | 
| 329 329 | 
             
            }
         | 
| 330 330 |  | 
| 331 | 
            -
            VALUE  | 
| 331 | 
            +
            VALUE c_cwdict_close(VALUE obj)
         | 
| 332 332 | 
             
            {
         | 
| 333 | 
            -
               | 
| 334 | 
            -
               | 
| 333 | 
            +
              cwdict_t* d;
         | 
| 334 | 
            +
              cwdict_t empty;
         | 
| 335 335 |  | 
| 336 336 | 
             
              // get original pointer from Ruby VM and close
         | 
| 337 | 
            -
              Data_Get_Struct(obj,  | 
| 337 | 
            +
              Data_Get_Struct(obj, cwdict_t, d);
         | 
| 338 338 |  | 
| 339 | 
            -
              if(d->drows && d->count > 0) { *d =  | 
| 339 | 
            +
              if(d->drows && d->count > 0) { *d = cwdict_close(*d); }
         | 
| 340 340 |  | 
| 341 341 | 
             
              return obj;
         | 
| 342 342 | 
             
            }
         | 
| 343 343 |  | 
| 344 | 
            -
            VALUE  | 
| 344 | 
            +
            VALUE c_cwdict_name_g(VALUE obj)
         | 
| 345 345 | 
             
            {
         | 
| 346 | 
            -
               | 
| 346 | 
            +
              cwdict_t* d;
         | 
| 347 347 |  | 
| 348 348 | 
             
              // get original pointer from Ruby VM
         | 
| 349 | 
            -
              Data_Get_Struct(obj,  | 
| 349 | 
            +
              Data_Get_Struct(obj, cwdict_t, d);
         | 
| 350 350 |  | 
| 351 351 | 
             
              if(d->name && strlen(d->name) > 0) return rb_str_new2(d->name);
         | 
| 352 352 | 
             
              return rb_str_new2("");
         | 
| 353 353 | 
             
            }
         | 
| 354 354 |  | 
| 355 | 
            -
            VALUE  | 
| 355 | 
            +
            VALUE c_cwdict_name_s(VALUE obj, VALUE name)
         | 
| 356 356 | 
             
            {
         | 
| 357 | 
            -
               | 
| 357 | 
            +
              cwdict_t* d; long len = RSTRING_LEN(name);
         | 
| 358 358 |  | 
| 359 359 | 
             
              // get original pointer from Ruby VM
         | 
| 360 | 
            -
              Data_Get_Struct(obj,  | 
| 360 | 
            +
              Data_Get_Struct(obj, cwdict_t, d);
         | 
| 361 361 |  | 
| 362 362 | 
             
              d->name = (char*)malloc(len + 1);
         | 
| 363 363 | 
             
              strcpy(d->name, StringValueCStr(name));
         | 
| @@ -366,155 +366,235 @@ VALUE c_cw_dict_name_s(VALUE obj, VALUE name) | |
| 366 366 | 
             
              return obj;
         | 
| 367 367 | 
             
            }
         | 
| 368 368 |  | 
| 369 | 
            -
            VALUE  | 
| 369 | 
            +
            VALUE c_cwdict_length(VALUE obj)
         | 
| 370 370 | 
             
            {
         | 
| 371 | 
            -
               | 
| 371 | 
            +
              cwdict_t* d;
         | 
| 372 372 |  | 
| 373 373 | 
             
              // get original pointer from Ruby VM
         | 
| 374 | 
            -
              Data_Get_Struct(obj,  | 
| 374 | 
            +
              Data_Get_Struct(obj, cwdict_t, d);
         | 
| 375 375 |  | 
| 376 376 | 
             
              if(d->count == 0) return INT2NUM(0);
         | 
| 377 | 
            -
              return LONG2NUM( | 
| 377 | 
            +
              return LONG2NUM(cwdict_length(*d));
         | 
| 378 378 | 
             
            }
         | 
| 379 379 |  | 
| 380 | 
            -
            VALUE  | 
| 380 | 
            +
            VALUE c_cwdict_enum_length(VALUE obj, VALUE args, VALUE eobj)
         | 
| 381 381 | 
             
            {
         | 
| 382 | 
            -
               | 
| 382 | 
            +
              return c_cwdict_length(obj);
         | 
| 383 | 
            +
            }
         | 
| 384 | 
            +
             | 
| 385 | 
            +
            VALUE c_cwdict_join(int argc, VALUE* argv, VALUE obj)
         | 
| 386 | 
            +
            {
         | 
| 387 | 
            +
              cwdict_t* d;
         | 
| 383 388 |  | 
| 384 389 | 
             
              // raise exception if passed wrong number of arguments
         | 
| 385 390 | 
             
              if(argc > 1) rb_raise(rb_eArgError, "wrong number of arguments");
         | 
| 386 391 | 
             
              if(argc == 1) Check_Type(argv[0], T_STRING);
         | 
| 387 392 |  | 
| 388 393 | 
             
              // get original pointer from Ruby VM
         | 
| 389 | 
            -
              Data_Get_Struct(obj,  | 
| 394 | 
            +
              Data_Get_Struct(obj, cwdict_t, d);
         | 
| 390 395 |  | 
| 391 | 
            -
              if(argc == 0) return rb_str_new2( | 
| 392 | 
            -
              return rb_str_new2( | 
| 396 | 
            +
              if(argc == 0) return rb_str_new2(cwdict_join(*d, " "));
         | 
| 397 | 
            +
              return rb_str_new2(cwdict_join(*d, StringValueCStr(argv[0])));
         | 
| 393 398 | 
             
            }
         | 
| 394 399 |  | 
| 395 | 
            -
            VALUE  | 
| 400 | 
            +
            VALUE c_cwdict_clone(VALUE obj)
         | 
| 396 401 | 
             
            {
         | 
| 397 | 
            -
               | 
| 402 | 
            +
              cwdict_t* d, *new_p;
         | 
| 398 403 | 
             
              VALUE new;
         | 
| 399 404 |  | 
| 400 405 | 
             
              // open new dict for return value
         | 
| 401 406 | 
             
              VALUE args[] = { rb_str_new2(""), rb_str_new2("") };
         | 
| 402 | 
            -
              new =  | 
| 407 | 
            +
              new = c_cwdict_open(2, args, new);
         | 
| 403 408 |  | 
| 404 409 | 
             
              // get original pointers from Ruby VM
         | 
| 405 | 
            -
              Data_Get_Struct(obj,  | 
| 406 | 
            -
              Data_Get_Struct(new,  | 
| 410 | 
            +
              Data_Get_Struct(obj, cwdict_t, d);
         | 
| 411 | 
            +
              Data_Get_Struct(new, cwdict_t, new_p);
         | 
| 407 412 |  | 
| 408 413 | 
             
              // get a copy of the original dictionary
         | 
| 409 | 
            -
              *new_p =  | 
| 414 | 
            +
              *new_p = cwdict_clone(*d);
         | 
| 410 415 |  | 
| 411 416 | 
             
              return new;
         | 
| 412 417 | 
             
            }
         | 
| 413 418 |  | 
| 414 | 
            -
            VALUE  | 
| 419 | 
            +
            VALUE c_cwdict_sample(VALUE obj)
         | 
| 415 420 | 
             
            {
         | 
| 416 | 
            -
               | 
| 421 | 
            +
              cwdict_t* d;
         | 
| 417 422 |  | 
| 418 423 | 
             
              // get original pointer from Ruby VM
         | 
| 419 | 
            -
              Data_Get_Struct(obj,  | 
| 424 | 
            +
              Data_Get_Struct(obj, cwdict_t, d);
         | 
| 425 | 
            +
             | 
| 426 | 
            +
              return rb_str_new2(cwdict_sample(*d));
         | 
| 427 | 
            +
            }
         | 
| 428 | 
            +
             | 
| 429 | 
            +
            VALUE c_cwdict_each(VALUE obj)
         | 
| 430 | 
            +
            {
         | 
| 431 | 
            +
              cwdict_t *d;
         | 
| 432 | 
            +
             | 
| 433 | 
            +
              // get original pointers from Ruby VM
         | 
| 434 | 
            +
              Data_Get_Struct(obj, cwdict_t, d);
         | 
| 435 | 
            +
             | 
| 436 | 
            +
              RETURN_SIZED_ENUMERATOR(obj, 0, 0, c_cwdict_enum_length);
         | 
| 437 | 
            +
             | 
| 438 | 
            +
              for(U32 i = 0; i != d->count; ++i)
         | 
| 439 | 
            +
              {
         | 
| 440 | 
            +
                for(U32 j = 0; j != d->drows[i].count; ++j)
         | 
| 441 | 
            +
                {
         | 
| 442 | 
            +
                  rb_yield(rb_str_new2(d->drows[i].words[j]));
         | 
| 443 | 
            +
                }
         | 
| 444 | 
            +
              }
         | 
| 445 | 
            +
             | 
| 446 | 
            +
              return obj;
         | 
| 447 | 
            +
            }
         | 
| 448 | 
            +
             | 
| 449 | 
            +
            VALUE c_cwdict_each_index(VALUE obj)
         | 
| 450 | 
            +
            {
         | 
| 451 | 
            +
              long num = 0; cwdict_t *d;
         | 
| 452 | 
            +
             | 
| 453 | 
            +
              // get original pointers from Ruby VM
         | 
| 454 | 
            +
              Data_Get_Struct(obj, cwdict_t, d);
         | 
| 455 | 
            +
             | 
| 456 | 
            +
              RETURN_SIZED_ENUMERATOR(obj, 0, 0, c_cwdict_enum_length);
         | 
| 457 | 
            +
             | 
| 458 | 
            +
              for(U32 i = 0; i != d->count; ++i)
         | 
| 459 | 
            +
              {
         | 
| 460 | 
            +
                for(U32 j = 0; j != d->drows[i].count; ++j)
         | 
| 461 | 
            +
                {
         | 
| 462 | 
            +
                  rb_yield(LONG2NUM(++num));
         | 
| 463 | 
            +
                }
         | 
| 464 | 
            +
              }
         | 
| 465 | 
            +
             | 
| 466 | 
            +
              return obj;
         | 
| 467 | 
            +
            }
         | 
| 468 | 
            +
             | 
| 469 | 
            +
            VALUE c_cwdict_map_s(VALUE obj);
         | 
| 470 | 
            +
            VALUE c_cwdict_map(VALUE obj)
         | 
| 471 | 
            +
            {
         | 
| 472 | 
            +
              VALUE new;
         | 
| 473 | 
            +
             | 
| 474 | 
            +
              // get a new copy of the original dict
         | 
| 475 | 
            +
              new = c_cwdict_clone(obj);
         | 
| 476 | 
            +
              new = c_cwdict_map_s(new);
         | 
| 477 | 
            +
             | 
| 478 | 
            +
              return new;
         | 
| 479 | 
            +
            }
         | 
| 420 480 |  | 
| 421 | 
            -
             | 
| 481 | 
            +
            VALUE c_cwdict_map_s(VALUE obj)
         | 
| 482 | 
            +
            {
         | 
| 483 | 
            +
              cwdict_t *d;
         | 
| 484 | 
            +
             | 
| 485 | 
            +
              // get original pointers from Ruby VM
         | 
| 486 | 
            +
              Data_Get_Struct(obj, cwdict_t, d);
         | 
| 487 | 
            +
             | 
| 488 | 
            +
              for(U32 i = 0; i != d->count; ++i)
         | 
| 489 | 
            +
              {
         | 
| 490 | 
            +
                for(U32 j = 0; j != d->drows[i].count; ++j)
         | 
| 491 | 
            +
                {
         | 
| 492 | 
            +
                  VALUE ref = rb_yield(rb_str_new2(d->drows[i].words[j]));
         | 
| 493 | 
            +
                  long len = RSTRING_LEN(ref);
         | 
| 494 | 
            +
             | 
| 495 | 
            +
                  d->drows[i].words[j] = (char*)realloc(d->drows[i].words[j], len + 1);
         | 
| 496 | 
            +
                  strcpy(d->drows[i].words[j], StringValueCStr(ref));
         | 
| 497 | 
            +
                  d->drows[i].words[j][len] = '\0';
         | 
| 498 | 
            +
                }
         | 
| 499 | 
            +
              }
         | 
| 500 | 
            +
             | 
| 501 | 
            +
              return obj;
         | 
| 422 502 | 
             
            }
         | 
| 423 503 |  | 
| 424 | 
            -
            VALUE  | 
| 504 | 
            +
            VALUE c_cwdict_sort(VALUE obj)
         | 
| 425 505 | 
             
            {
         | 
| 426 | 
            -
               | 
| 506 | 
            +
              cwdict_t* d;
         | 
| 427 507 | 
             
              VALUE new;
         | 
| 428 508 |  | 
| 429 509 | 
             
              // get a new copy of the original dict
         | 
| 430 | 
            -
              new =  | 
| 510 | 
            +
              new = c_cwdict_clone(obj);
         | 
| 431 511 |  | 
| 432 512 | 
             
              // get original pointer from Ruby VM
         | 
| 433 | 
            -
              Data_Get_Struct(new,  | 
| 513 | 
            +
              Data_Get_Struct(new, cwdict_t, d);
         | 
| 434 514 |  | 
| 435 | 
            -
              *d =  | 
| 515 | 
            +
              *d = cwdict_sort(*d);
         | 
| 436 516 |  | 
| 437 517 | 
             
              return new;
         | 
| 438 518 | 
             
            }
         | 
| 439 519 |  | 
| 440 | 
            -
            VALUE  | 
| 520 | 
            +
            VALUE c_cwdict_prune(VALUE obj)
         | 
| 441 521 | 
             
            {
         | 
| 442 | 
            -
               | 
| 522 | 
            +
              cwdict_t* d;
         | 
| 443 523 | 
             
              VALUE new;
         | 
| 444 524 |  | 
| 445 525 | 
             
              // get a new copy of the original dict
         | 
| 446 | 
            -
              new =  | 
| 526 | 
            +
              new = c_cwdict_clone(obj);
         | 
| 447 527 |  | 
| 448 528 | 
             
              // get original pointer from Ruby VM
         | 
| 449 | 
            -
              Data_Get_Struct(new,  | 
| 529 | 
            +
              Data_Get_Struct(new, cwdict_t, d);
         | 
| 450 530 |  | 
| 451 | 
            -
              *d =  | 
| 531 | 
            +
              *d = cwdict_prune(*d, false);
         | 
| 452 532 |  | 
| 453 533 | 
             
              return new;
         | 
| 454 534 | 
             
            }
         | 
| 455 535 |  | 
| 456 | 
            -
            VALUE  | 
| 536 | 
            +
            VALUE c_cwdict_clean(VALUE obj)
         | 
| 457 537 | 
             
            {
         | 
| 458 | 
            -
               | 
| 538 | 
            +
              cwdict_t* d;
         | 
| 459 539 | 
             
              VALUE new;
         | 
| 460 540 |  | 
| 461 541 | 
             
              // get a new copy of the original dict
         | 
| 462 | 
            -
              new =  | 
| 542 | 
            +
              new = c_cwdict_clone(obj);
         | 
| 463 543 |  | 
| 464 544 | 
             
              // get original pointer from Ruby VM
         | 
| 465 | 
            -
              Data_Get_Struct(new,  | 
| 545 | 
            +
              Data_Get_Struct(new, cwdict_t, d);
         | 
| 466 546 |  | 
| 467 | 
            -
              *d =  | 
| 547 | 
            +
              *d = cwdict_prune(*d, true);
         | 
| 468 548 |  | 
| 469 549 | 
             
              return new;
         | 
| 470 550 | 
             
            }
         | 
| 471 551 |  | 
| 472 | 
            -
            VALUE  | 
| 552 | 
            +
            VALUE c_cwdict_sort_s(VALUE obj)
         | 
| 473 553 | 
             
            {
         | 
| 474 | 
            -
               | 
| 554 | 
            +
              cwdict_t* d;
         | 
| 475 555 |  | 
| 476 556 | 
             
              // get original pointer from Ruby VM
         | 
| 477 | 
            -
              Data_Get_Struct(obj,  | 
| 557 | 
            +
              Data_Get_Struct(obj, cwdict_t, d);
         | 
| 478 558 |  | 
| 479 | 
            -
              *d =  | 
| 559 | 
            +
              *d = cwdict_sort(*d);
         | 
| 480 560 |  | 
| 481 561 | 
             
              return obj;
         | 
| 482 562 | 
             
            }
         | 
| 483 563 |  | 
| 484 | 
            -
            VALUE  | 
| 564 | 
            +
            VALUE c_cwdict_prune_s(VALUE obj)
         | 
| 485 565 | 
             
            {
         | 
| 486 | 
            -
               | 
| 566 | 
            +
              cwdict_t* d;
         | 
| 487 567 |  | 
| 488 568 | 
             
              // get original pointer from Ruby VM
         | 
| 489 | 
            -
              Data_Get_Struct(obj,  | 
| 569 | 
            +
              Data_Get_Struct(obj, cwdict_t, d);
         | 
| 490 570 |  | 
| 491 | 
            -
              *d =  | 
| 571 | 
            +
              *d = cwdict_prune(*d, false);
         | 
| 492 572 |  | 
| 493 573 | 
             
              return obj;
         | 
| 494 574 | 
             
            }
         | 
| 495 575 |  | 
| 496 | 
            -
            VALUE  | 
| 576 | 
            +
            VALUE c_cwdict_clean_s(VALUE obj)
         | 
| 497 577 | 
             
            {
         | 
| 498 | 
            -
               | 
| 578 | 
            +
              cwdict_t* d;
         | 
| 499 579 |  | 
| 500 580 | 
             
              // get original pointer from Ruby VM
         | 
| 501 | 
            -
              Data_Get_Struct(obj,  | 
| 581 | 
            +
              Data_Get_Struct(obj, cwdict_t, d);
         | 
| 502 582 |  | 
| 503 | 
            -
              *d =  | 
| 583 | 
            +
              *d = cwdict_prune(*d, true);
         | 
| 504 584 |  | 
| 505 585 | 
             
              return obj;
         | 
| 506 586 | 
             
            }
         | 
| 507 587 |  | 
| 508 | 
            -
            VALUE  | 
| 588 | 
            +
            VALUE c_cwdict_validate_s(VALUE obj)
         | 
| 509 589 | 
             
            {
         | 
| 510 590 | 
             
              char* e;
         | 
| 511 | 
            -
               | 
| 591 | 
            +
              cwdict_t* d;
         | 
| 512 592 |  | 
| 513 593 | 
             
              // get original pointer from Ruby VM
         | 
| 514 | 
            -
              Data_Get_Struct(obj,  | 
| 594 | 
            +
              Data_Get_Struct(obj, cwdict_t, d);
         | 
| 515 595 |  | 
| 516 596 | 
             
              // handle invalid state first (for error handling's sake)
         | 
| 517 | 
            -
              if(! | 
| 597 | 
            +
              if(!cwdict_valid(*d, &e))
         | 
| 518 598 | 
             
              {
         | 
| 519 599 | 
             
                rb_raise(rb_eException, "%s", e);
         | 
| 520 600 | 
             
                free(e);
         | 
| @@ -523,27 +603,27 @@ VALUE c_cw_dict_validate_s(VALUE obj) | |
| 523 603 | 
             
              return obj;
         | 
| 524 604 | 
             
            }
         | 
| 525 605 |  | 
| 526 | 
            -
            VALUE  | 
| 606 | 
            +
            VALUE c_cwdict_named_q(VALUE obj)
         | 
| 527 607 | 
             
            {
         | 
| 528 | 
            -
               | 
| 608 | 
            +
              cwdict_t* d;
         | 
| 529 609 |  | 
| 530 610 | 
             
              // get original pointer from Ruby VM
         | 
| 531 | 
            -
              Data_Get_Struct(obj,  | 
| 611 | 
            +
              Data_Get_Struct(obj, cwdict_t, d);
         | 
| 532 612 |  | 
| 533 613 | 
             
              if(d->name && strlen(d->name) > 0) return Qtrue;
         | 
| 534 614 | 
             
              return Qfalse;
         | 
| 535 615 | 
             
            }
         | 
| 536 616 |  | 
| 537 | 
            -
            VALUE  | 
| 617 | 
            +
            VALUE c_cwdict_valid_q(VALUE obj)
         | 
| 538 618 | 
             
            {
         | 
| 539 619 | 
             
              char* e;
         | 
| 540 | 
            -
               | 
| 620 | 
            +
              cwdict_t* d;
         | 
| 541 621 |  | 
| 542 622 | 
             
              // get original pointer from Ruby VM
         | 
| 543 | 
            -
              Data_Get_Struct(obj,  | 
| 623 | 
            +
              Data_Get_Struct(obj, cwdict_t, d);
         | 
| 544 624 |  | 
| 545 625 | 
             
              // handle invalid state first (for error handling's sake)
         | 
| 546 | 
            -
              if(! | 
| 626 | 
            +
              if(!cwdict_valid(*d, &e))
         | 
| 547 627 | 
             
              {
         | 
| 548 628 | 
             
                rb_raise(rb_eException, "%s", e);
         | 
| 549 629 | 
             
                free(e);
         | 
| @@ -554,47 +634,47 @@ VALUE c_cw_dict_valid_q(VALUE obj) | |
| 554 634 | 
             
              return Qtrue;
         | 
| 555 635 | 
             
            }
         | 
| 556 636 |  | 
| 557 | 
            -
            VALUE  | 
| 637 | 
            +
            VALUE c_cwdict_sorted_q(VALUE obj)
         | 
| 558 638 | 
             
            {
         | 
| 559 | 
            -
               | 
| 639 | 
            +
              cwdict_t* d;
         | 
| 560 640 |  | 
| 561 641 | 
             
              // get original pointer from Ruby VM
         | 
| 562 | 
            -
              Data_Get_Struct(obj,  | 
| 642 | 
            +
              Data_Get_Struct(obj, cwdict_t, d);
         | 
| 563 643 |  | 
| 564 644 | 
             
              if(d->sorted) return Qtrue;
         | 
| 565 645 | 
             
              return Qfalse;
         | 
| 566 646 | 
             
            }
         | 
| 567 647 |  | 
| 568 | 
            -
            VALUE  | 
| 648 | 
            +
            VALUE c_cwdict_include_q(VALUE obj, VALUE string)
         | 
| 569 649 | 
             
            {
         | 
| 570 | 
            -
               | 
| 650 | 
            +
              cwdict_t* d;
         | 
| 571 651 |  | 
| 572 652 | 
             
              // get original pointer from Ruby VM
         | 
| 573 | 
            -
              Data_Get_Struct(obj,  | 
| 653 | 
            +
              Data_Get_Struct(obj, cwdict_t, d);
         | 
| 574 654 |  | 
| 575 | 
            -
              if( | 
| 655 | 
            +
              if(cwdict_include(*d, StringValueCStr(string))) return Qtrue;
         | 
| 576 656 | 
             
              return Qfalse;
         | 
| 577 657 | 
             
            }
         | 
| 578 658 |  | 
| 579 | 
            -
            VALUE  | 
| 659 | 
            +
            VALUE c_cwdict_exclude_q(VALUE obj, VALUE string)
         | 
| 580 660 | 
             
            {
         | 
| 581 | 
            -
               | 
| 661 | 
            +
              cwdict_t* d;
         | 
| 582 662 |  | 
| 583 663 | 
             
              // get original pointer from Ruby VM
         | 
| 584 | 
            -
              Data_Get_Struct(obj,  | 
| 664 | 
            +
              Data_Get_Struct(obj, cwdict_t, d);
         | 
| 585 665 |  | 
| 586 | 
            -
              if( | 
| 666 | 
            +
              if(cwdict_exclude(*d, StringValueCStr(string))) return Qtrue;
         | 
| 587 667 | 
             
              return Qfalse;
         | 
| 588 668 | 
             
            }
         | 
| 589 669 |  | 
| 590 | 
            -
            VALUE  | 
| 670 | 
            +
            VALUE c_cwdict_inspect(VALUE obj)
         | 
| 591 671 | 
             
            {
         | 
| 592 | 
            -
               | 
| 672 | 
            +
              cwdict_t* dict; VALUE str;
         | 
| 593 673 | 
             
              size_t count = 0; int multiplier = 1; int word_len = 0;
         | 
| 594 674 | 
             
              char* result = (char*)malloc(LARGE_BUFFER * multiplier + 1);
         | 
| 595 675 |  | 
| 596 676 | 
             
              // get original pointer from Ruby VM
         | 
| 597 | 
            -
              Data_Get_Struct(obj,  | 
| 677 | 
            +
              Data_Get_Struct(obj, cwdict_t, dict);
         | 
| 598 678 |  | 
| 599 679 | 
             
              // add opening delimiter
         | 
| 600 680 | 
             
              strcpy(result, "["); ++count;
         | 
| @@ -657,29 +737,29 @@ VALUE c_cw_dict_inspect(VALUE obj) | |
| 657 737 | 
             
              return str;
         | 
| 658 738 | 
             
            }
         | 
| 659 739 |  | 
| 660 | 
            -
            VALUE  | 
| 740 | 
            +
            VALUE c_cwdict_to_s(VALUE obj)
         | 
| 661 741 | 
             
            {
         | 
| 662 | 
            -
               | 
| 742 | 
            +
              cwdict_t* dict;
         | 
| 663 743 | 
             
              size_t count = 0; int multiplier = 1;
         | 
| 664 744 |  | 
| 665 745 | 
             
              // get original pointer from Ruby VM
         | 
| 666 | 
            -
              Data_Get_Struct(obj,  | 
| 746 | 
            +
              Data_Get_Struct(obj, cwdict_t, dict);
         | 
| 667 747 |  | 
| 668 748 | 
             
              // if(dict->drows && dict->count > 0) return Qnil;
         | 
| 669 | 
            -
              return  | 
| 749 | 
            +
              return c_cwdict_inspect(obj);
         | 
| 670 750 | 
             
            }
         | 
| 671 751 |  | 
| 672 | 
            -
            VALUE  | 
| 752 | 
            +
            VALUE c_cwdict_append_op(VALUE obj, VALUE addend)
         | 
| 673 753 | 
             
            {
         | 
| 674 | 
            -
               | 
| 754 | 
            +
              cwdict_t* d;
         | 
| 675 755 |  | 
| 676 756 | 
             
              // get original pointer from Ruby VM
         | 
| 677 | 
            -
              Data_Get_Struct(obj,  | 
| 757 | 
            +
              Data_Get_Struct(obj, cwdict_t, d);
         | 
| 678 758 |  | 
| 679 759 | 
             
              switch(TYPE(addend))
         | 
| 680 760 | 
             
              {
         | 
| 681 761 | 
             
                case T_STRING:
         | 
| 682 | 
            -
                  *d =  | 
| 762 | 
            +
                  *d = cwdict_place_word_strict(*d, StringValueCStr(addend));
         | 
| 683 763 | 
             
                  break;
         | 
| 684 764 | 
             
                case T_ARRAY:
         | 
| 685 765 | 
             
                  for(long i = 0; i != RARRAY_LEN(addend); ++i)
         | 
| @@ -694,7 +774,7 @@ VALUE c_cw_dict_append_op(VALUE obj, VALUE addend) | |
| 694 774 | 
             
                    VALUE entry = rb_ary_entry(addend, i);
         | 
| 695 775 | 
             
                    char* entry_str = StringValueCStr(entry);
         | 
| 696 776 |  | 
| 697 | 
            -
                    *d =  | 
| 777 | 
            +
                    *d = cwdict_place_word_strict(*d, entry_str);
         | 
| 698 778 | 
             
                  }
         | 
| 699 779 |  | 
| 700 780 | 
             
                  break;
         | 
| @@ -703,46 +783,46 @@ VALUE c_cw_dict_append_op(VALUE obj, VALUE addend) | |
| 703 783 | 
             
                  break;
         | 
| 704 784 | 
             
              }
         | 
| 705 785 |  | 
| 706 | 
            -
              if(d->sorted) return  | 
| 786 | 
            +
              if(d->sorted) return c_cwdict_sort(obj);
         | 
| 707 787 | 
             
              return obj;
         | 
| 708 788 | 
             
            }
         | 
| 709 789 |  | 
| 710 | 
            -
            VALUE  | 
| 790 | 
            +
            VALUE c_cwdict_add_op(VALUE obj, VALUE addend)
         | 
| 711 791 | 
             
            {
         | 
| 712 792 | 
             
              VALUE new;
         | 
| 713 793 |  | 
| 714 794 | 
             
              // get a clone of the original
         | 
| 715 | 
            -
              new =  | 
| 795 | 
            +
              new = c_cwdict_clone(obj);
         | 
| 716 796 |  | 
| 717 | 
            -
              return  | 
| 797 | 
            +
              return c_cwdict_append_op(new, addend);
         | 
| 718 798 | 
             
            }
         | 
| 719 799 |  | 
| 720 | 
            -
            VALUE  | 
| 800 | 
            +
            VALUE c_cwdict_add_assign_op(VALUE obj, VALUE addend)
         | 
| 721 801 | 
             
            {
         | 
| 722 | 
            -
              return  | 
| 802 | 
            +
              return c_cwdict_append_op(obj, addend);
         | 
| 723 803 | 
             
            }
         | 
| 724 804 |  | 
| 725 | 
            -
            VALUE  | 
| 805 | 
            +
            VALUE c_cwdict_check_equality(VALUE obj, VALUE against)
         | 
| 726 806 | 
             
            {
         | 
| 727 | 
            -
               | 
| 807 | 
            +
              cwdict_t* d, *comparison;
         | 
| 728 808 |  | 
| 729 809 | 
             
              // get original pointers from Ruby VM
         | 
| 730 | 
            -
              Data_Get_Struct(obj,  | 
| 731 | 
            -
              Data_Get_Struct(against,  | 
| 810 | 
            +
              Data_Get_Struct(obj, cwdict_t, d);
         | 
| 811 | 
            +
              Data_Get_Struct(against, cwdict_t, comparison);
         | 
| 732 812 |  | 
| 733 | 
            -
              if( | 
| 813 | 
            +
              if(cwdict_equal(*d, *comparison)) return Qtrue;
         | 
| 734 814 | 
             
              return Qfalse;
         | 
| 735 815 | 
             
            }
         | 
| 736 816 |  | 
| 737 | 
            -
            VALUE  | 
| 817 | 
            +
            VALUE c_cwdict_check_inequality(VALUE obj, VALUE against)
         | 
| 738 818 | 
             
            {
         | 
| 739 | 
            -
               | 
| 819 | 
            +
              cwdict_t* d, *comparison;
         | 
| 740 820 |  | 
| 741 821 | 
             
              // get original pointers from Ruby VM
         | 
| 742 | 
            -
              Data_Get_Struct(obj,  | 
| 743 | 
            -
              Data_Get_Struct(against,  | 
| 822 | 
            +
              Data_Get_Struct(obj, cwdict_t, d);
         | 
| 823 | 
            +
              Data_Get_Struct(against, cwdict_t, comparison);
         | 
| 744 824 |  | 
| 745 | 
            -
              if( | 
| 825 | 
            +
              if(cwdict_inequal(*d, *comparison)) return Qtrue;
         | 
| 746 826 | 
             
              return Qfalse;
         | 
| 747 827 | 
             
            }
         | 
| 748 828 |  | 
| @@ -750,7 +830,10 @@ void Init_chinwag() | |
| 750 830 | 
             
            {
         | 
| 751 831 | 
             
              // setup module extension and containing class(es)
         | 
| 752 832 | 
             
              m_chinwag = rb_define_module("Chinwag");
         | 
| 753 | 
            -
               | 
| 833 | 
            +
              c_cwdict = rb_define_class_under(m_chinwag, "CWDict", rb_cObject);
         | 
| 834 | 
            +
             | 
| 835 | 
            +
              // note module inclusions
         | 
| 836 | 
            +
              rb_include_module(c_cwdict, rb_mEnumerable);
         | 
| 754 837 |  | 
| 755 838 | 
             
              // sync up module generation functions
         | 
| 756 839 | 
             
              rb_define_module_function(m_chinwag, "generate", m_cw_generate, -1);
         | 
| @@ -760,50 +843,55 @@ void Init_chinwag() | |
| 760 843 | 
             
              rb_define_module_function(m_chinwag, "set_default_max_output",m_s_max,1);
         | 
| 761 844 |  | 
| 762 845 | 
             
              // sync up class methods
         | 
| 763 | 
            -
              rb_define_singleton_method( | 
| 764 | 
            -
              rb_define_method( | 
| 846 | 
            +
              rb_define_singleton_method(c_cwdict, "open", c_cwdict_open, -1);
         | 
| 847 | 
            +
              rb_define_method(c_cwdict, "close", c_cwdict_close, 0);
         | 
| 848 | 
            +
             | 
| 849 | 
            +
              rb_define_method(c_cwdict, "name", c_cwdict_name_g, 0);
         | 
| 850 | 
            +
              rb_define_method(c_cwdict, "name=", c_cwdict_name_s, 1);
         | 
| 851 | 
            +
              rb_define_method(c_cwdict, "length", c_cwdict_length, 0);
         | 
| 765 852 |  | 
| 766 | 
            -
              rb_define_method( | 
| 767 | 
            -
              rb_define_method( | 
| 768 | 
            -
              rb_define_method( | 
| 853 | 
            +
              rb_define_method(c_cwdict, "join", c_cwdict_join, -1);
         | 
| 854 | 
            +
              rb_define_method(c_cwdict, "clone", c_cwdict_clone, 0);
         | 
| 855 | 
            +
              rb_define_method(c_cwdict, "sample", c_cwdict_sample, 0);
         | 
| 769 856 |  | 
| 770 | 
            -
              rb_define_method( | 
| 771 | 
            -
              rb_define_method( | 
| 772 | 
            -
              rb_define_method( | 
| 857 | 
            +
              rb_define_method(c_cwdict, "each", c_cwdict_each, 0);
         | 
| 858 | 
            +
              rb_define_method(c_cwdict, "each_index", c_cwdict_each_index, 0);
         | 
| 859 | 
            +
              rb_define_method(c_cwdict, "map", c_cwdict_map, 0);
         | 
| 860 | 
            +
              rb_define_method(c_cwdict, "map!", c_cwdict_map_s, 0);
         | 
| 773 861 |  | 
| 774 | 
            -
              rb_define_method( | 
| 775 | 
            -
              rb_define_method( | 
| 776 | 
            -
              rb_define_method( | 
| 862 | 
            +
              rb_define_method(c_cwdict, "sort", c_cwdict_sort, 0);
         | 
| 863 | 
            +
              rb_define_method(c_cwdict, "prune", c_cwdict_prune, 0);
         | 
| 864 | 
            +
              rb_define_method(c_cwdict, "clean", c_cwdict_clean, 0);
         | 
| 777 865 |  | 
| 778 | 
            -
              rb_define_method( | 
| 779 | 
            -
              rb_define_method( | 
| 780 | 
            -
              rb_define_method( | 
| 781 | 
            -
              rb_define_method( | 
| 866 | 
            +
              rb_define_method(c_cwdict, "sort!", c_cwdict_sort_s, 0);
         | 
| 867 | 
            +
              rb_define_method(c_cwdict, "prune!", c_cwdict_prune_s, 0);
         | 
| 868 | 
            +
              rb_define_method(c_cwdict, "clean!", c_cwdict_clean_s, 0);
         | 
| 869 | 
            +
              rb_define_method(c_cwdict, "validate!", c_cwdict_validate_s, 0);
         | 
| 782 870 |  | 
| 783 | 
            -
              rb_define_method( | 
| 784 | 
            -
              rb_define_method( | 
| 785 | 
            -
              rb_define_method( | 
| 786 | 
            -
              rb_define_method( | 
| 787 | 
            -
              rb_define_method( | 
| 871 | 
            +
              rb_define_method(c_cwdict, "named?", c_cwdict_named_q, 0);
         | 
| 872 | 
            +
              rb_define_method(c_cwdict, "valid?", c_cwdict_valid_q, 0);
         | 
| 873 | 
            +
              rb_define_method(c_cwdict, "sorted?", c_cwdict_sorted_q, 0);
         | 
| 874 | 
            +
              rb_define_method(c_cwdict, "include?", c_cwdict_include_q, 1);
         | 
| 875 | 
            +
              rb_define_method(c_cwdict, "exclude?", c_cwdict_exclude_q, 1);
         | 
| 788 876 |  | 
| 789 | 
            -
              rb_define_method( | 
| 790 | 
            -
              rb_define_method( | 
| 877 | 
            +
              rb_define_method(c_cwdict, "inspect", c_cwdict_inspect, 0);
         | 
| 878 | 
            +
              rb_define_method(c_cwdict, "to_s", c_cwdict_to_s, 0);
         | 
| 791 879 |  | 
| 792 880 | 
             
              // operator methods
         | 
| 793 | 
            -
              rb_define_method( | 
| 794 | 
            -
              rb_define_method( | 
| 795 | 
            -
              rb_define_method( | 
| 796 | 
            -
              rb_define_method( | 
| 797 | 
            -
              rb_define_method( | 
| 881 | 
            +
              rb_define_method(c_cwdict, "+", c_cwdict_add_op, 1);
         | 
| 882 | 
            +
              rb_define_method(c_cwdict, "+=", c_cwdict_add_assign_op, 1);
         | 
| 883 | 
            +
              rb_define_method(c_cwdict, "<<", c_cwdict_append_op, 1);
         | 
| 884 | 
            +
              rb_define_method(c_cwdict, "==", c_cwdict_check_equality, 1);
         | 
| 885 | 
            +
              rb_define_method(c_cwdict, "!=", c_cwdict_check_inequality, 1);
         | 
| 798 886 |  | 
| 799 887 | 
             
              // method aliases
         | 
| 800 | 
            -
              rb_define_alias( | 
| 801 | 
            -
              rb_define_alias( | 
| 802 | 
            -
              rb_define_alias( | 
| 888 | 
            +
              rb_define_alias(c_cwdict, "dup", "clone");
         | 
| 889 | 
            +
              rb_define_alias(c_cwdict, "size", "length");
         | 
| 890 | 
            +
              rb_define_alias(c_cwdict, "count", "length");
         | 
| 803 891 |  | 
| 804 892 | 
             
              // open Seussian dict as default fall-back
         | 
| 805 893 | 
             
              VALUE args[] = { rb_str_new2("seussian") };
         | 
| 806 | 
            -
              default_dict =  | 
| 894 | 
            +
              default_dict = c_cwdict_open(1, args, default_dict);
         | 
| 807 895 |  | 
| 808 896 | 
             
              // set default output type
         | 
| 809 897 | 
             
              default_output_type = ID2SYM(rb_intern("words"));
         |