... |
... |
@@ -421,32 +421,23 @@ |
421
|
421
|
static void
|
422
|
422
|
remove_subset_prefix( FT_String* name )
|
423
|
423
|
{
|
424
|
|
- FT_Int32 idx = 0;
|
425
|
|
- FT_Int32 length = (FT_Int32)ft_strlen( name ) + 1;
|
426
|
|
- FT_Bool continue_search = 1;
|
|
424
|
+ FT_UInt32 i = 0, idx = 0;
|
427
|
425
|
|
428
|
426
|
|
429
|
|
- while ( continue_search )
|
|
427
|
+ /* six ASCII uppercase letters followed by a plus sign */
|
|
428
|
+ while ( 'A' <= name[i] && name[i++] <= 'Z' &&
|
|
429
|
+ 'A' <= name[i] && name[i++] <= 'Z' &&
|
|
430
|
+ 'A' <= name[i] && name[i++] <= 'Z' &&
|
|
431
|
+ 'A' <= name[i] && name[i++] <= 'Z' &&
|
|
432
|
+ 'A' <= name[i] && name[i++] <= 'Z' &&
|
|
433
|
+ 'A' <= name[i] && name[i++] <= 'Z' &&
|
|
434
|
+ name[i++] == '+' )
|
430
|
435
|
{
|
431
|
|
- if ( length >= 7 && name[6] == '+' )
|
432
|
|
- {
|
433
|
|
- for ( idx = 0; idx < 6; idx++ )
|
434
|
|
- {
|
435
|
|
- /* ASCII uppercase letters */
|
436
|
|
- if ( !( 'A' <= name[idx] && name[idx] <= 'Z' ) )
|
437
|
|
- continue_search = 0;
|
438
|
|
- }
|
439
|
|
-
|
440
|
|
- if ( continue_search )
|
441
|
|
- {
|
442
|
|
- for ( idx = 7; idx < length; idx++ )
|
443
|
|
- name[idx - 7] = name[idx];
|
444
|
|
- length -= 7;
|
445
|
|
- }
|
446
|
|
- }
|
447
|
|
- else
|
448
|
|
- continue_search = 0;
|
|
436
|
+ idx = i;
|
449
|
437
|
}
|
|
438
|
+
|
|
439
|
+ if ( idx )
|
|
440
|
+ FT_MEM_MOVE( name, name + idx, ft_strlen( name + idx ) + 1 );
|
450
|
441
|
}
|
451
|
442
|
|
452
|
443
|
|
... |
... |
@@ -456,42 +447,20 @@ |
456
|
447
|
remove_style( FT_String* family_name,
|
457
|
448
|
const FT_String* style_name )
|
458
|
449
|
{
|
459
|
|
- FT_Int32 family_name_length, style_name_length;
|
|
450
|
+ FT_String* f = family_name + ft_strlen( family_name );
|
|
451
|
+ const FT_String* s = style_name + ft_strlen( style_name );
|
460
|
452
|
|
461
|
453
|
|
462
|
|
- family_name_length = (FT_Int32)ft_strlen( family_name );
|
463
|
|
- style_name_length = (FT_Int32)ft_strlen( style_name );
|
|
454
|
+ /* compare strings moving backwards */
|
|
455
|
+ while ( s > style_name )
|
|
456
|
+ if ( f == family_name || *--s != *--f )
|
|
457
|
+ return;
|
464
|
458
|
|
465
|
|
- if ( family_name_length > style_name_length )
|
466
|
|
- {
|
467
|
|
- FT_Int idx;
|
468
|
|
-
|
469
|
|
-
|
470
|
|
- for ( idx = 1; idx <= style_name_length; idx++ )
|
471
|
|
- {
|
472
|
|
- if ( family_name[family_name_length - idx] !=
|
473
|
|
- style_name[style_name_length - idx] )
|
474
|
|
- break;
|
475
|
|
- }
|
476
|
|
-
|
477
|
|
- if ( idx > style_name_length )
|
478
|
|
- {
|
479
|
|
- /* family_name ends with style_name; remove it */
|
480
|
|
- idx = family_name_length - style_name_length - 1;
|
481
|
|
-
|
482
|
|
- /* also remove special characters */
|
483
|
|
- /* between real family name and style */
|
484
|
|
- while ( idx > 0 &&
|
485
|
|
- ( family_name[idx] == '-' ||
|
486
|
|
- family_name[idx] == ' ' ||
|
487
|
|
- family_name[idx] == '_' ||
|
488
|
|
- family_name[idx] == '+' ) )
|
489
|
|
- idx--;
|
490
|
|
-
|
491
|
|
- if ( idx > 0 )
|
492
|
|
- family_name[idx + 1] = '\0';
|
493
|
|
- }
|
494
|
|
- }
|
|
459
|
+ /* terminate and remove special characters */
|
|
460
|
+ do
|
|
461
|
+ *f = '\0';
|
|
462
|
+ while ( f-- > family_name &&
|
|
463
|
+ ( *f == '-' || *f == ' ' || *f == '_' || *f == '+' ) );
|
495
|
464
|
}
|
496
|
465
|
|
497
|
466
|
|