diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-06-07 22:15:26 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-06-07 22:19:26 +0300 |
commit | 2bae7da012e2125762855ce014e63345ecbbbb18 (patch) | |
tree | 61faec7672937f8fc420310da0ff531ce9c6a6bb /src/ellinika | |
parent | 79447034e393dc5c7f01f3ec0ca1de7ded4f15e6 (diff) | |
download | ellinika-2bae7da012e2125762855ce014e63345ecbbbb18.tar.gz ellinika-2bae7da012e2125762855ce014e63345ecbbbb18.tar.bz2 |
Improve conjugator
* data/dbverb.struct: Remove individual verb definitions.
* data/irregular-verbs.xml: New file.
* scm/verbop.scm: New file.
* scm/Makefile.am: Add rules for verbop.
* scm/conjugator.scm: Various fixes.
* src/ellinika/elmorph.c (elstr-accent-position): Fix handling
of string arguments.
(_elstr_set_accent): Fix error message.
(elstr-set-accent-character)
(elstr-set-accent-character!): New functions.
Diffstat (limited to 'src/ellinika')
-rw-r--r-- | src/ellinika/elmorph.c | 66 |
1 files changed, 63 insertions, 3 deletions
diff --git a/src/ellinika/elmorph.c b/src/ellinika/elmorph.c index f55e010..1831610 100644 --- a/src/ellinika/elmorph.c +++ b/src/ellinika/elmorph.c | |||
@@ -352,7 +352,7 @@ SCM_DEFINE_PUBLIC(scm_elstr_accent_position, "elstr-accent-position", 1, 0, 0, | |||
352 | #define FUNC_NAME s_scm_elstr_accent_position | 352 | #define FUNC_NAME s_scm_elstr_accent_position |
353 | { | 353 | { |
354 | struct elstr *elstr; | 354 | struct elstr *elstr; |
355 | force_elstr(&elstr, el, 0, SCM_ARG1, FUNC_NAME); | 355 | force_elstr(&elstr, el, 1, SCM_ARG1, FUNC_NAME); |
356 | return scm_from_uint(elstr->acc_pos); | 356 | return scm_from_uint(elstr->acc_pos); |
357 | } | 357 | } |
358 | #undef FUNC_NAME | 358 | #undef FUNC_NAME |
@@ -559,7 +559,7 @@ _elstr_set_accent(SCM el, SCM n, int destructive, const char *func_name) | |||
559 | if (num > elstr->nsyl) | 559 | if (num > elstr->nsyl) |
560 | scm_misc_error(func_name, | 560 | scm_misc_error(func_name, |
561 | "cannot set accent on syllable #~S: not enough syllables: ~S", | 561 | "cannot set accent on syllable #~S: not enough syllables: ~S", |
562 | scm_list_2(el, n)); | 562 | scm_list_2(n, el)); |
563 | acc_num = elstr->nsyl - num; | 563 | acc_num = elstr->nsyl - num; |
564 | if (acc_num == 0) | 564 | if (acc_num == 0) |
565 | start = 0; | 565 | start = 0; |
@@ -613,7 +613,67 @@ SCM_DEFINE_PUBLIC(scm_elstr_set_accent_x, "elstr-set-accent!", | |||
613 | { | 613 | { |
614 | return _elstr_set_accent(el, n, 1, s_scm_elstr_set_accent_x); | 614 | return _elstr_set_accent(el, n, 1, s_scm_elstr_set_accent_x); |
615 | } | 615 | } |
616 | #undef FUNC_NAME | 616 | |
617 | static SCM | ||
618 | _elstr_set_accent_on_char(SCM el, SCM n, int destructive, const char *func_name) | ||
619 | { | ||
620 | struct elstr *elstr; | ||
621 | unsigned i; | ||
622 | unsigned acc_num, num, len, start; | ||
623 | SCM scm; | ||
624 | int dstate; | ||
625 | |||
626 | if (destructive) { | ||
627 | SCM_ASSERT(scm_is_elstr(el), el, SCM_ARG1, func_name); | ||
628 | elstr = (struct elstr*) SCM_CDR(el); | ||
629 | } else | ||
630 | scm = force_elstr(&elstr, el, 0, SCM_ARG1, func_name); | ||
631 | |||
632 | SCM_ASSERT(scm_is_integer(n), n, SCM_ARG2, func_name); | ||
633 | num = scm_to_uint(n); | ||
634 | if (num > elstr->len) | ||
635 | scm_misc_error(func_name, | ||
636 | "cannot set accent on character #~S: not enough characters: ~S", | ||
637 | scm_list_2(el, n)); | ||
638 | if (!elchr_isvowel(elstr->str[num])) | ||
639 | scm_misc_error(func_name, | ||
640 | "cannot set accent on character #~S: not a vowel: ~S", | ||
641 | scm_list_2(el, n)); | ||
642 | |||
643 | if (destructive) | ||
644 | scm = SCM_UNSPECIFIED; | ||
645 | else if (scm == el) { | ||
646 | scm = _elstr_dup(elstr); | ||
647 | elstr = (struct elstr*) SCM_CDR(scm); | ||
648 | } | ||
649 | |||
650 | /* Clear all accents */ | ||
651 | for (i = 0; i < elstr->len; i++) | ||
652 | elstr->str[i] = elchr_deaccent(elstr->str[i]); | ||
653 | |||
654 | elstr->str[num] = elchr_accent(elstr->str[num], CHF_OXEIA); | ||
655 | _elstr_syllabize(elstr); | ||
656 | return scm; | ||
657 | } | ||
658 | |||
659 | SCM_DEFINE_PUBLIC(scm_elstr_set_accent_character, "elstr-set-accent-character", | ||
660 | 2, 0, 0, | ||
661 | (SCM el, SCM n), | ||
662 | "Set accent on Nth character of EL\n") | ||
663 | { | ||
664 | return _elstr_set_accent_on_char(el, n, 0, | ||
665 | s_scm_elstr_set_accent_character); | ||
666 | } | ||
667 | |||
668 | SCM_DEFINE_PUBLIC(scm_elstr_set_accent_character_x, | ||
669 | "elstr-set-accent-character!", | ||
670 | 2, 0, 0, | ||
671 | (SCM el, SCM n), | ||
672 | "Set accent on Nth character of EL (destructive)\n") | ||
673 | { | ||
674 | return _elstr_set_accent_on_char(el, n, 1, | ||
675 | s_scm_elstr_set_accent_character_x); | ||
676 | } | ||
617 | 677 | ||
618 | SCM_DEFINE_PUBLIC(scm_elstr_char_prop_bitmask, "elstr-char-prop-bitmask", | 678 | SCM_DEFINE_PUBLIC(scm_elstr_char_prop_bitmask, "elstr-char-prop-bitmask", |
619 | 2, 0, 0, | 679 | 2, 0, 0, |