aboutsummaryrefslogtreecommitdiff
path: root/src/ellinika
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2011-06-07 22:15:26 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2011-06-07 22:19:26 +0300
commit2bae7da012e2125762855ce014e63345ecbbbb18 (patch)
tree61faec7672937f8fc420310da0ff531ce9c6a6bb /src/ellinika
parent79447034e393dc5c7f01f3ec0ca1de7ded4f15e6 (diff)
downloadellinika-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.c66
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
617static 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
659SCM_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
668SCM_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
618SCM_DEFINE_PUBLIC(scm_elstr_char_prop_bitmask, "elstr-char-prop-bitmask", 678SCM_DEFINE_PUBLIC(scm_elstr_char_prop_bitmask, "elstr-char-prop-bitmask",
619 2, 0, 0, 679 2, 0, 0,

Return to:

Send suggestions and report system problems to the System administrator.