ronnie
2022-10-14 1504bb53e29d3d46222c0b3ea994fc494b48e153
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <string.h>
#include <sys/stat.h>
#include <cstdio>
#include <vector>
 
#include <utils/Log.h>
 
#include "minikin/Hyphenator.h"
 
using minikin::HyphenationType;
using minikin::Hyphenator;
 
Hyphenator* loadHybFile(const char* fn, int minPrefix, int minSuffix, const char* language) {
    struct stat statbuf;
    int status = stat(fn, &statbuf);
    if (status < 0) {
        fprintf(stderr, "error opening %s\n", fn);
        return nullptr;
    }
    size_t size = statbuf.st_size;
    FILE* f = fopen(fn, "rb");
    if (f == NULL) {
        fprintf(stderr, "error opening %s\n", fn);
        return nullptr;
    }
    uint8_t* buf = new uint8_t[size];
    size_t read_size = fread(buf, 1, size, f);
    fclose(f);
    if (read_size < size) {
        fprintf(stderr, "error reading %s\n", fn);
        delete[] buf;
        return nullptr;
    }
    return Hyphenator::loadBinary(buf, minPrefix, minSuffix, language);
}
 
int main(int argc, char** argv) {
    Hyphenator* hyph = loadHybFile("/tmp/en.hyb", 2, 3, "en");  // should also be configurable
    std::vector<HyphenationType> result;
    std::vector<uint16_t> word;
    if (argc < 2) {
        fprintf(stderr, "usage: hyphtool word\n");
        return 1;
    }
    char* asciiword = argv[1];
    size_t len = strlen(asciiword);
    for (size_t i = 0; i < len; i++) {
        uint32_t c = asciiword[i];
        if (c == '-') {
            c = 0x00AD;
        }
        // ASCII (or possibly ISO Latin 1), but kinda painful to do utf conversion :(
        word.push_back(c);
    }
    hyph->hyphenate(word, &result);
    for (size_t i = 0; i < len; i++) {
        if (result[i] != HyphenationType::DONT_BREAK) {
            printf("-");
        }
        printf("%c", word[i]);
    }
    printf("\n");
    return 0;
}