Skip navigation

Давно искал быстрый консольный менеджер словарей, товарищ (фанат убунту) подсказал lightlang. Установил все зависимости описанные в документации, успешно прошла ./configure. А вот make зацикливался на что-то вроде:


Building LightLang...
+---------------------------------------------------------------------+
/usr/bin/cd apps && /usr/bin/make
+---------------------------------------------------------------------+
make[70]: *** [all] Interrupt
make[69]: *** [all] Interrupt
make[68]: *** [all] Interrupt
...

Решив по очереди компилировать все утилиты программы и её словари выяснялось что утилита sl не компилируется. Откуда возникает зацикливание так и не понял.

sl же ругалась, что в системных библиотеках C не находила функцию getline() из glibc (GNU Lib C). Странно OS X сама лишь ветка от GNU FreeBSD.

Так как в C не силён, просто вставил исходники getline() и зависимой от неё функции getdelim() в файлы которые её требовали apps/sl/src/cs/manager.c и apps/sl/src/cs/find.c.

#include
#ifndef SIZE_MAX
# define SIZE_MAX ((size_t) -1)
#endif
#ifndef SSIZE_MAX
# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
#endif
#if !HAVE_FLOCKFILE
# undef flockfile
# define flockfile(x) ((void) 0)
#endif
#if !HAVE_FUNLOCKFILE
# undef funlockfile
# define funlockfile(x) ((void) 0)
#endif
ssize_t getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp)
{
ssize_t result;
size_t cur_len = 0;

if (lineptr == NULL || n == NULL || fp == NULL)
{
errno = EINVAL;
return -1;
}

flockfile (fp);

if (*lineptr == NULL || *n == 0)
{
*n = 120;
*lineptr = (char *) malloc (*n);
if (*lineptr == NULL)
{
result = -1;
goto unlock_return;
}
}

for (;;)
{
int i;

i = getc (fp);
if (i == EOF)
{
result = -1;
break;
}

/* Make enough space for len+1 (for final NUL) bytes. */
if (cur_len + 1 >= *n)
{
size_t needed_max =
SSIZE_MAX < SIZE_MAX ? (size_t) SSIZE_MAX + 1 : SIZE_MAX;
size_t needed = 2 * *n + 1; /* Be generous. */
char *new_lineptr;

if (needed_max = needed)
{
result = -1;
goto unlock_return;
}

new_lineptr = (char *) realloc (*lineptr, needed);
if (new_lineptr == NULL)
{
result = -1;
goto unlock_return;
}

*lineptr = new_lineptr;
*n = needed;
}

(*lineptr)[cur_len] = i;
cur_len++;

if (i == delimiter)
break;
}
(*lineptr)[cur_len] = '';
result = cur_len ? cur_len : result;

unlock_return:
funlockfile (fp);
return result;
}
ssize_t getline (char **lineptr, size_t *n, FILE *stream)
{
return getdelim (lineptr, n, '\n', stream);
}

После чего sl собралась, в след за ней словари. Оконная утилита xsl хоть и собралась, но при запуске выкинула длинный стэк непонятного exception и я на неё забил, мне нужен был терминальный словарик прежде всего :)

Первый запуск $ sl new результатов не дал. Странно, словари же собрались. Но не подключились, поэтому повторил их подключение:

$ sl --install [dict_name_without_path]
$ sl --connect [dict_name_without_path]

На этот раз всё заработало, гут :)

Advertisements

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: