aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2011-06-05 13:56:34 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2011-06-05 13:56:34 +0300
commitdaca71a486490125471d0fb8d596d004485179bf (patch)
treed31ef54152a5ae3a20e53ff4c5a505ce4f7612fa
parent618724bfda07dfb1f8b61212da8f43e2eace95ba (diff)
downloadellinika-daca71a486490125471d0fb8d596d004485179bf.tar.gz
ellinika-daca71a486490125471d0fb8d596d004485179bf.tar.bz2
Fix memory corruption, improve conjugator
* data/db.struct: Revamp conjugation support tables. * scm/conjugator.scm: Improve irregular conjugation support. * src/ellinika/elmorph.c (_elstr_syllabize): Use calloc. Fix memory corruption. (_elstr_dup): Don't allocate new sylmap if the source one is NULL. (_elstr_free): Call scm_gc_free on elstr.
-rw-r--r--data/db.struct73
-rw-r--r--scm/conjugator.scm141
-rw-r--r--src/ellinika/elmorph.c18
3 files changed, 142 insertions, 90 deletions
diff --git a/data/db.struct b/data/db.struct
index 01507ce..c5c20af 100644
--- a/data/db.struct
+++ b/data/db.struct
@@ -160,6 +160,7 @@ CREATE TABLE newsart(
----
+DROP TABLE IF EXISTS verbflect;
CREATE TABLE verbflect(
ident int(32) not null, -- REL 8
sing1 varchar(32),
@@ -171,12 +172,13 @@ CREATE TABLE verbflect(
UNIQUE(ident)
);
+DROP TABLE IF EXISTS conjugation;
CREATE TABLE conjugation(
conj char(2), -- REL 9
voice enum('act','pas'), -- Ενεργητηκή/Μεσοπαθητική
mode enum('ind','sub','imp'),
tense varchar(128),
- thema enum('pres','aor','pass','synt'), -- Ενεστώτα, Αόριστου, Αόριστου μεσοπαθητικής, syntethic
+ thema enum('pres','aor','sub','synt'), -- Ενεστώτα, Αόριστου, υποτακτικής, syntethic
suffix char(32),
flect int(32), -- REL 8
accmap char(7), -- accent map
@@ -188,17 +190,19 @@ CREATE TABLE conjugation(
KEY (mode)
);
+DROP TABLE IF EXISTS participle;
CREATE TABLE participle (
conj char(2), -- REL 9
voice enum('act','pas'), -- Ενεργητηκή/Μεσοπαθητική
tense char(32),
- thema enum('pres','aor','pass'), -- Ενεστώτα, Αόριστου, Αόριστου μεσοπαθητικής
+ thema enum('pres','aor','sub'), -- Ενεστώτα, Αόριστου, υποτακτικής
suffix char(32),
flect char(32),
aux varchar(128)
);
INSERT INTO verbflect VALUES
+(0, NULL, NULL, NULL, NULL, NULL, NULL),
-- Συζυγία Α'
(1, "ω", "εις", "ει", "ουμε", "ετε", "ουν(ε)"),
(2, "α", "ες", "ε", "αμε", "ατε", "αν"),
@@ -235,33 +239,33 @@ INSERT INTO conjugation VALUES
("A", "act", "ind", "Παρακείμενος", 'synt', NULL, 0, NULL, NULL, "έχω", "Ενεστώτας"),
("A", "act", "ind", "Υπερσυντέλικος", 'synt', NULL, 0, NULL, NULL, "έχω", "Παρατατικός"),
("A", "act", "ind", "Συντελεσμένος μέλλοντας", 'synt', NULL, 0, NULL, "θα", "έχω", "Ενεστώτας"),
-("A", "act", "ind", "Μέλλοντας στιγμιαίος", 'aor', NULL, 1, "000000", "θα", NULL, NULL),
+("A", "act", "ind", "Μέλλοντας στιγμιαίος", 'sub', NULL, 1, "000000", "θα", NULL, NULL),
-- Υποτακτική
("A", "act", "sub", "Ενεστώτας", 'pres', NULL, 1, "000000", "να", NULL, NULL),
-("A", "act", "sub", "Αόριστος", 'aor', NULL, 1, "000000", "να", NULL, NULL),
+("A", "act", "sub", "Αόριστος", 'sub', NULL, 1, "000000", "να", NULL, NULL),
("A", "act", "sub", "Παρακείμενος", 'synt', NULL, 0, NULL, "να", "έχω", "Ενεστώτας"),
-- Προστακτική
("A", "act", "imp", "Ενεστώτας", 'pres', NULL, 8, "-3--3-", NULL, NULL, NULL),
-("A", "act", "imp", "Αόριστος", 'aor', NULL, 9, "-0--0-", NULL, NULL, NULL),
+("A", "act", "imp", "Αόριστος", 'sub', NULL, 9, "-0--0-", NULL, NULL, NULL),
("A", "act", "imp", "Παρακείμενος", 'synt', NULL, 0, NULL, "να", "έχω", "Ενεστώτας"),
-- Μεσοπαθητική φωνή
-- Οριστική
("A", "pas", "ind", "Ενεστώτας", 'pres', NULL, 11, "000300", NULL, NULL, NULL),
("A", "pas", "ind", "Παρατατικός", 'pres', NULL, 12, "222333", NULL, NULL, NULL),
("A", "pas", "ind", "Μέλλοντας διαρκείας", 'pres', NULL, 11, "333333", "θα", NULL, NULL),
-("A", "pas", "ind", "Αόριστος", 'pass', "ηκ", 2, "333333", NULL, NULL, NULL),
+("A", "pas", "ind", "Αόριστος", 'aor', "ηκ", 2, "333333", NULL, NULL, NULL),
("A", "pas", "ind", "Παρακείμενος", 'synt', NULL, 0, NULL, NULL, "έχω", "Ενεστώτας"),
("A", "pas", "ind", "Υπερσυντέλικος", 'synt', NULL, 0, NULL, NULL, "έχω", "Παρατατικός"),
("A", "pas", "ind", "Συντελεσμένος μέλλοντας", 'synt', NULL, 0, NULL, "θα", "έχω", "Ενεστώτας"),
-("A", "pas", "ind", "Μέλλοντας στιγμιαίος", 'pass', NULL, 15, "111111", "θα", NULL, NULL),
+("A", "pas", "ind", "Μέλλοντας στιγμιαίος", 'aor', NULL, 15, "111111", "θα", NULL, NULL),
-- Υποτακτική
("A", "pas", "sub", "Ενεστώτας", 'pres', NULL, 11, "333333", "να", NULL, NULL),
-("A", "pas", "sub", "Αόριστος", 'pass', NULL, 15, "111221", "να", NULL, NULL),
+("A", "pas", "sub", "Αόριστος", 'aor', NULL, 15, "111221", "να", NULL, NULL),
("A", "pas", "sub", "Παρακείμενος", 'synt', NULL, 0, NULL, "να", "έχω", "Παρατατικός"),
-- Προστακτική
("A", "pas", "imp", "Ενεστώτας", 'pres', NULL, 11, "-3--3-", "να", NULL, NULL),
("A", "pas", "imp", "Αόριστος", 'aor', NULL, 17, "-0----", NULL, NULL, NULL),
-("A", "pas", "imp", "Αόριστος", 'pass', NULL, 18, "----2-", NULL, NULL, NULL),
+("A", "pas", "imp", "Αόριστος", 'aor', NULL, 18, "----2-", NULL, NULL, NULL),
("A", "pas", "imp", "Παρακείμενος", 'synt', NULL, 0, NULL, "να", "έχω", "Παρατατικός"),
-- Συζυγία Β΄ - α΄ τάξη
-- Ενεργητηκή φωνή
@@ -287,20 +291,20 @@ INSERT INTO conjugation VALUES
("B1", "pas", "ind", "Ενεστώτας", 'pres', NULL, 28, "ffffff", NULL, NULL, NULL),
("B1", "pas", "ind", "Παρατατικός", 'pres', NULL, 29, "ffffff", NULL, NULL, NULL),
("B1", "pas", "ind", "Μέλλοντας διαρκείας", 'pres', NULL, 28, "ffffff", "θα", NULL, NULL),
-("B1", "pas", "ind", "Αόριστος", 'pass', "ηκ", 2, "333333", NULL, NULL, NULL),
+("B1", "pas", "ind", "Αόριστος", 'aor', "ηκ", 2, "333333", NULL, NULL, NULL),
("B1", "pas", "ind", "Παρακείμενος", 'synt', NULL, 0, NULL, NULL, "έχω", "Ενεστώτας"),
("B1", "pas", "ind", "Υπερσυντέλικος", 'synt', NULL, 0, NULL, NULL, "έχω", "Παρατατικός"),
("B1", "pas", "ind", "Συντελεσμένος μέλλοντας", 'synt', NULL, 0, NULL, "θα", "έχω", "Ενεστώτας"),
-("B1", "pas", "ind", "Μέλλοντας στιγμιαίος", 'pass', NULL, 15, "ffffff", "θα", NULL, NULL),
+("B1", "pas", "ind", "Μέλλοντας στιγμιαίος", 'aor', NULL, 15, "ffffff", "θα", NULL, NULL),
-- Υποτακτική
("B1", "pas", "sub", "Ενεστώτας", 'pres', NULL, 28, "ffffff", "να", NULL, NULL),
-("B1", "pas", "sub", "Αόριστος", 'pass', NULL, 15, "ffffff", "να", NULL, NULL),
+("B1", "pas", "sub", "Αόριστος", 'aor', NULL, 15, "ffffff", "να", NULL, NULL),
("B1", "pas", "sub", "Παρακείμενος", 'synt', NULL, 0, NULL, "να", "έχω", "Παρατατικός"),
-- Προστακτική
("B1", "pas", "imp", "Ενεστώτας", 'pres', NULL, 30, "-f--f-", "να", NULL, NULL),
("B1", "pas", "imp", "Αόριστος", 'aor', NULL, 31, "-2----", NULL, NULL, NULL),
-("B1", "pas", "imp", "Αόριστος", 'pass', NULL, 32, "----2-", NULL, NULL, NULL),
+("B1", "pas", "imp", "Αόριστος", 'aor', NULL, 32, "----2-", NULL, NULL, NULL),
("B1", "pas", "imp", "Παρακείμενος", 'synt', NULL, 0, NULL, "να", "έχω", "Παρατατικός"),
-- Συζυγία Β΄ - β΄ τάξη
@@ -329,20 +333,20 @@ INSERT INTO conjugation VALUES
("B2", "pas", "ind", "Ενεστώτας", 'pres', NULL, 34, "ffffff", NULL, NULL, NULL),
("B2", "pas", "ind", "Παρατατικός", 'pres', NULL, 35, "ffffff", NULL, NULL, NULL),
("B2", "pas", "ind", "Μέλλοντας διαρκείας", 'pres', NULL, 34, "ffffff", "θα", NULL, NULL),
-("B2", "pas", "ind", "Αόριστος", 'pass', "ηκ", 2, "333333", NULL, NULL, NULL),
+("B2", "pas", "ind", "Αόριστος", 'aor', "ηκ", 2, "333333", NULL, NULL, NULL),
("B2", "pas", "ind", "Παρακείμενος", 'synt', NULL, 0, NULL, NULL, "έχω", "Ενεστώτας"),
("B2", "pas", "ind", "Υπερσυντέλικος", 'synt', NULL, 0, NULL, NULL, "έχω", "Παρατατικός"),
("B2", "pas", "ind", "Συντελεσμένος μέλλοντας", 'synt', NULL, 0, NULL, "θα", "έχω", "Ενεστώτας"),
-("B2", "pas", "ind", "Μέλλοντας στιγμιαίος", 'pass', NULL, 15, "ffffff", "θα", NULL, NULL),
+("B2", "pas", "ind", "Μέλλοντας στιγμιαίος", 'aor', NULL, 15, "ffffff", "θα", NULL, NULL),
-- Υποτακτική
("B2", "pas", "sub", "Ενεστώτας", 'pres', NULL, 34, "ffffff", "να", NULL, NULL),
-("B2", "pas", "sub", "Αόριστος", 'pass', NULL, 15, "ffffff", "να", NULL, NULL),
+("B2", "pas", "sub", "Αόριστος", 'aor', NULL, 15, "ffffff", "να", NULL, NULL),
("B2", "pas", "sub", "Παρακείμενος", 'synt', NULL, 0, NULL, "να", "έχω", "Παρατατικός"),
-- Προστακτική
("B2", "pas", "imp", "Ενεστώτας", 'pres', NULL, 36, "-f--f-", "να", NULL, NULL),
("B2", "pas", "imp", "Αόριστος", 'aor', NULL, 31, "-2----", NULL, NULL, NULL),
-("B2", "pas", "imp", "Αόριστος", 'pass', NULL, 32, "----2-", NULL, NULL, NULL),
+("B2", "pas", "imp", "Αόριστος", 'aor', NULL, 32, "----2-", NULL, NULL, NULL),
("B2", "pas", "imp", "Παρακείμενος", 'synt', NULL, 0, NULL, "να", "έχω", "Παρατατικός");
@@ -366,11 +370,36 @@ INSERT INTO participle VALUES
-- Μεσοπαθητική φωνή
("B1", "pass", "Παρακείμενος", 'pres', "η", "μένος", NULL);
+DROP TABLE IF EXISTS verb;
CREATE TABLE verb(
- word varchar(128), -- REL 10
+ verb varchar(128), -- REL 10
conj char(2), -- REL 9
- present varchar(128), -- θέμα ενεστώτα
- aorist varchar(128), -- θέμα αόριστου
- pass varchar(128), -- θέμα αόριστου μεσοπαθητικής
- INDEX(word)
+ augment char(1),
+ accmap char(7),
+ INDEX(verb)
+);
+
+DROP TABLE IF EXISTS irregular_root;
+CREATE TABLE irregular_root(
+ verb varchar(128),
+ voice enum('act','pas'), -- Ενεργητηκή/Μεσοπαθητική
+ thema enum('pres','aor','sub'), -- Αόριστος/Υποτακτική
+ root varchar(128)
);
+
+INSERT INTO verb VALUES
+('βρίσκω', 'A', NULL, '000000'),
+('θέλω','A','η',NULL),
+('έχω','A',NULL,NULL),
+('ξέρω','A','η',NULL)
+;
+
+INSERT INTO irregular_root VALUES
+('βρίσκω','act','aor','βρήκ'),
+('βρίσκω','act','sub','βρ'),
+('βρίσκω','pas','aor','βρέθ'),
+('βρίσκω','pas','sub','βρέθ'),
+('θέλω','act','aor','θέλησ'),
+('έχω','act', 'aor', 'είχ')
+;
+
diff --git a/scm/conjugator.scm b/scm/conjugator.scm
index 19642b3..3015b13 100644
--- a/scm/conjugator.scm
+++ b/scm/conjugator.scm
@@ -52,39 +52,55 @@
(else
(let ((root (elstr-trim elverb -1)))
(list "A"
+ #f
"ε"
- (list
- (cons "pres" root)
- (cons "aor" (elstr-thema-aoristoy root))
- (cons "pass" root))))))))
+ #f))))))
(define (get-verb-info verb)
(let ((conn (dict-connect)))
(let ((vdb (my-sql-query
conn
(string-append
- "SELECT conj,augment,present,aorist,pass FROM verb WHERE word='"
- verb
- "'"))))
+ "SELECT conj,accmap,augment FROM verb \
+WHERE verb='" verb "'"))))
(if (null? vdb)
(guess-verb-info verb)
(let ((x (car vdb)))
(list
- (car x)
- (or (list-ref x 1) "ε")
- (list
- (cons "pres" (list-ref x 2))
- (cons "aor" (list-ref x 3))
- (cons "pass" (list-ref x 4)))))))))
+ (list-ref x 0)
+ (list-ref x 1)
+ (or (list-ref x 2) "ε")
+ #f))))))
+
+(define (complement-verb-info vinfo verb voice thema)
+; (format #t "COMPLEMENT ~S~%" thema)
+ (let ((result (my-sql-query
+ (dict-connect)
+ (string-append
+ "SELECT root FROM irregular_root \
+WHERE verb='" verb "' AND voice='" voice "' AND thema='" thema "'"))))
+ (list-set! vinfo 3
+ (if (not (null? result))
+ (caar result)
+ (let ((root (elstr-trim (string->elstr verb) -1)))
+ (cond
+ ((string=? thema "pres")
+ root)
+ ((or (string=? thema "aor") (string=? thema "sub"))
+ (elstr-thema-aoristoy root))
+ (else
+ #f)))))))
(define-syntax verb-info
(syntax-rules ()
((verb-info #:conj v)
(list-ref v 0))
- ((verb-info #:augment v)
+ ((verb-info #:accmap v)
(list-ref v 1))
+ ((verb-info #:augment v)
+ (list-ref v 2))
((verb-info #:root v)
- (list-ref v 2))))
+ (list-ref v 3))))
(define-syntax conj-info
(syntax-rules ()
@@ -139,20 +155,14 @@ WHERE c.conj='" conj "' AND c.voice='" voice "' AND c.mode='" mode
(string->elstr str)
str))
-(define (force-accent str)
- (if (and str (= (elstr-accented-syllable str) 0))
- (let ((nsyl (elstr-number-of-syllables str)))
- (cond
- ((= nsyl 1)
- str)
- (else
- (elstr-set-accent str 2))))
- str))
-
-(define (apply-flect root conj vinfo)
- (let ((suffix (or (conj-info #:suffix conj) ""))
- (accmap (string->list (or (conj-info #:accmap conj) "000000")))
+(define (apply-flect conj vinfo)
+ (let ((root (verb-info #:root vinfo))
+ (suffix (or (conj-info #:suffix conj) ""))
+ (accmap (string->list (or (verb-info #:accmap vinfo)
+ (conj-info #:accmap conj)
+ "000000")))
(augment ""))
+; (format #t "ROOT ~S, ACCMAP ~S~%" root accmap)
(cond
((> (length accmap) 6)
(set! accmap (list-head accmap 6))
@@ -162,10 +172,22 @@ WHERE c.conj='" conj "' AND c.voice='" voice "' AND c.mode='" mode
(lambda (flect acc)
(cond
((char=? acc #\0)
- (force-accent
- (elstr-append
- root
- (elstr-deaccent (elstr-append suffix flect)))))
+ (let* ((rs (force-elstr root))
+ (suf (elstr-deaccent (elstr-append suffix flect)))
+ (result (elstr-append rs suf)))
+ (cond
+ ((or (= (elstr-accented-syllable rs) 0)
+ (> (elstr-number-of-syllables suf) 2))
+ (let ((nsyl (elstr-number-of-syllables suf)))
+ (cond
+ ((= nsyl 1)
+ result)
+ ((= nsyl 3)
+ (elstr-set-accent result 3))
+ (else
+ (elstr-set-accent result 2)))))
+ (else
+ result))))
((char=? acc #\f)
(elstr-append
(elstr-deaccent (elstr-append root suffix))
@@ -209,7 +231,7 @@ WHERE c.conj='" conj "' AND c.voice='" voice "' AND c.mode='" mode
(cond
((string=? (conj-info #:thema conj) "synt")
(let ((form (list-ref
- (conjugate verb "act" "sub" "Ενεστώτας" #:nopart) 2))
+ (conjugate verb "act" "sub" "Αόριστος" #:nopart) 2))
(part (conj-info #:particle conj)))
(map
(lambda (aux)
@@ -220,21 +242,9 @@ WHERE c.conj='" conj "' AND c.voice='" voice "' AND c.mode='" mode
(conjugate (conj-info #:aux conj) "act" "ind"
(conj-info #:auxtense conj))) ))
(else
- (let ((root #f)
- (exception (my-sql-query
- (dict-connect)
- (string-append
- "SELECT root,accmap FROM irregular_verb \
-WHERE word='" verb "' AND voice='" voice "' AND tense='" tense "'"))))
- (if (not (null? exception))
- (let ((x (car exception)))
- (set! root (list-ref x 0))
- (let ((accmap (list-ref x 1)))
- (if accmap
- (list-set! conj 2 accmap))))
- (set! root (assoc-ref (verb-info #:root vinfo)
- (conj-info #:thema conj))))
- (apply-flect root conj vinfo))))))
+; (format #t "CONJ ~S~%" conj)
+ (complement-verb-info vinfo verb voice (conj-info #:thema conj))
+ (apply-flect conj vinfo)))))
;;
;(display (verb-info "βρίσκω"))
@@ -242,18 +252,25 @@ WHERE word='" verb "' AND voice='" voice "' AND tense='" tense "'"))))
;(display (verb-info "ανοίγω"))
;(newline)
-;(display (conjugate "έχω" "act" "ind" "Ενεστώτας"))
-;(display (conjugate "ανοίγω" "act" "ind" "Ενεστώτας"))
-;(display (conjugate "ανοίγω" "act" "ind" "Αόριστος"))
-;(display (conjugate "δένω" "act" "ind" "Αόριστος"))
-;(display (conjugate "βρίσκω" "act" "ind" "Ενεστώτας"))
-;(display (conjugate "βρίσκω" "act" "ind" "Αόριστος"))
-;(display (conjugate "βρίσκω" "act" "ind" "Μέλλοντας στιγμιαίος"))
-;(display (conjugate "βρίσκω" "pas" "ind" "Αόριστος"))
-;(display (conjugate "θέλω" "act" "ind" "Αόριστος"))
-;(display (conjugate "θέλω" "act" "ind" "Παρατατικός"))
-;(display (conjugate "βρίσκω" "act" "ind" "Παρακείμενος"))
-;(display (conjugate "βρίσκω" "act" "sub" "Παρακείμενος"))
-;(display (conjugate "βρίσκω" "act" "sub" "Ενεστώτας"))
-(display (conjugate "βρίσκω" "act" "sub" "Αόριστος"))
+(define (test-conjugation verb voice mode tense)
+ (format #t "~A ~A ~A ~A: " verb voice mode tense)
+ (display (map force-string (conjugate verb voice mode tense)))
+ (newline)
+ (gc))
+
+(test-conjugation "έχω" "act" "ind" "Ενεστώτας")
+(test-conjugation "ανοίγω" "act" "ind" "Ενεστώτας")
+(test-conjugation "ανοίγω" "act" "ind" "Αόριστος")
+(test-conjugation "δένω" "act" "ind" "Αόριστος")
+(test-conjugation "θέλω" "act" "ind" "Αόριστος")
+(test-conjugation "θέλω" "act" "ind" "Παρατατικός")
+(test-conjugation "βρίσκω" "act" "ind" "Ενεστώτας")
+(test-conjugation "βρίσκω" "act" "ind" "Αόριστος")
+(test-conjugation "βρίσκω" "act" "ind" "Μέλλοντας στιγμιαίος")
+(test-conjugation "βρίσκω" "pas" "ind" "Αόριστος")
+(test-conjugation "βρίσκω" "act" "sub" "Ενεστώτας")
+(test-conjugation "βρίσκω" "act" "sub" "Αόριστος")
+(test-conjugation "βρίσκω" "act" "ind" "Παρακείμενος")
+(test-conjugation "βρίσκω" "act" "sub" "Παρακείμενος")
+
(newline)
diff --git a/src/ellinika/elmorph.c b/src/ellinika/elmorph.c
index 75e42f9..faeeb49 100644
--- a/src/ellinika/elmorph.c
+++ b/src/ellinika/elmorph.c
@@ -40,13 +40,16 @@ static void
_elstr_syllabize(struct elstr *elstr)
{
unsigned *sylmap;
- unsigned i, nsyl = 0, accsyl = 0, accchr = 0;
+ unsigned i, nsyl = 0, accchr = 0;
+ int accsyl = -1;
int dstate = 0;
int acc = 0;
+ if (!elstr->sylmap) {
+ elstr->sylmap = calloc(elstr->len, sizeof(sylmap[0]));
if (!elstr->sylmap)
- elstr->sylmap = scm_gc_malloc(sizeof(sylmap[0])*elstr->len,
- "syllable map");
+ scm_memory_error("_elstr_syllabize");
+ }
sylmap = elstr->sylmap;
for (i = 0; i < elstr->len; i++) {
@@ -67,11 +70,11 @@ _elstr_syllabize(struct elstr *elstr)
}
if (dstate)
sylmap[nsyl++] = i - 1;
- else
+ else if (nsyl)
sylmap[nsyl-1] = i - 1;
elstr->nsyl = nsyl;
elstr->acc_pos = accchr;
- elstr->acc_syl = nsyl - accsyl;
+ elstr->acc_syl = (accsyl >= 0) ? nsyl - accsyl : 0;
}
static SCM
@@ -114,11 +117,14 @@ _elstr_dup(struct elstr *elstr)
elnew->str = calloc(elstr->len, sizeof(elnew->str[0]));
if (!elnew->str)
scm_memory_error("_elstr_dup");
+ if (elstr->sylmap) {
elnew->sylmap = calloc(elstr->nsyl, sizeof(elnew->sylmap[0]));
if (!elnew->sylmap) {
free(elnew->str);
scm_memory_error("_elstr_dup");
}
+ } else
+ elnew->sylmap = NULL;
memcpy(elnew->str, elstr->str, sizeof(elstr->str[0]) * elstr->len);
elnew->len = elstr->len;
elnew->nsyl = elstr->nsyl;
@@ -151,7 +157,7 @@ _elstr_free(SCM smob)
struct elstr *elstr = (struct elstr *) SCM_CDR(smob);
free(elstr->str);
free(elstr->sylmap);
- free(elstr);
+ scm_gc_free(elstr, sizeof(struct elstr), "elstr");
return 0;
}

Return to:

Send suggestions and report system problems to the System administrator.