powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Добавить функцию в ядро fb3
12 сообщений из 12, страница 1 из 1
Добавить функцию в ядро fb3
    #39196239
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый вечер!

Как можно добавить функцию в ядро fb3, которой очень не хватает. Аналог в php similar_text?
...
Рейтинг: 0 / 0
Добавить функцию в ядро fb3
    #39196242
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__,

зачем же сразу в ядро. Напиши свою UDR и всё.
...
Рейтинг: 0 / 0
Добавить функцию в ядро fb3
    #39196243
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

Надоело udr и udf таскать.
...
Рейтинг: 0 / 0
Добавить функцию в ядро fb3
    #39196249
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__Аналог в php similar_text?
similar to не аналог что ли?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Добавить функцию в ядро fb3
    #39196251
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

судя по всему нет http://php.net/manual/ru/function.similar-text.php
...
Рейтинг: 0 / 0
Добавить функцию в ядро fb3
    #39196252
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Нет, не аналог. similar_text возвращает релевантность двух строк по методу Ratcliff/Obershelp.
...
Рейтинг: 0 / 0
Добавить функцию в ядро fb3
    #39196261
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Дениссудя по всему нет
Ну, тогда, после переезда на GitHub, всё стало гораздо проще: fork, implement, send pull
request, подождать пару-тройку лет - профит!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Добавить функцию в ядро fb3
    #39196292
fb user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисзачем же сразу в ядро. Напиши свою UDR и всё.
Кстати сложно задекларировать udr-функцию чтобы она принимала любые строковые параметры.
Например хочется написать аналог REPLACE (str, find, repl). Как задекларировать такую функцию?
...
Рейтинг: 0 / 0
Добавить функцию в ядро fb3
    #39197679
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Набросал функцию:
Код: sql
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.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
const SysFunction SysFunction::functions[] =
		{"SIMILAR_TEXT", 1, 1, setParamsFromList, makeDoubleResult, evlSimilarText, NULL},
		
dsc* evlSimilarText(thread_db* tdbb, const SysFunction* function, const NestValueArray& args, impure_value* impure);

static inline size_t similar_str(const UChar *txt1, const size_t len1, const UChar *txt2, const size_t len2)
{
	size_t sum = 0, pos1 = 0, pos2 = 0, max = 0;
	UChar *p, *q;
	const UChar *end1 = (UChar *)txt1 + len1;
	const UChar *end2 = (UChar *)txt2 + len2;
	size_t l, l1, l2;
	UChar32 c1, c2;
	for (p = (UChar *)txt1; p < end1; p++) {
		for (q = (UChar *)txt2; q < end2; q++) {
			for (l = l1 = l2 = 0; (p + l1 < end1) && (q + l2 < end2);) {
				U16_NEXT(p, l1, len1, c1);
				U16_NEXT(q, l2, len2, c2);
				if (c1 == c2)
					l++;
				else
					break;
			}
			if (l > max) {
				max	= l;
				pos1 = p - txt1;
				pos2 = q - txt2;
			}
		}
	}
	if (max > 0) {
		sum = max;
		if ((pos1 + max < len1) && (pos2 + max < len2)) {
			sum += similar_str(txt1 + pos1 + max, len1 - pos1 - max,
							   txt2 + pos2 + max, len2 - pos2 - max);
		}
		if (pos1 && pos2) {
			sum += similar_str(txt1, pos1,
							   txt2, pos2);
		}
	}
	return sum;
}

dsc* evlSimilarText(thread_db* tdbb, const SysFunction* function, const NestValueArray& args,
	impure_value* impure)
{
	fb_assert(args.getCount() == 2);

	jrd_req* request = tdbb->getRequest();

	const dsc* str1 = EVL_expr(tdbb, request, args[0]);
	if (request->req_flags & req_null)	// return NULL if str1 is NULL
		return NULL;

	const dsc* str2 = EVL_expr(tdbb, request, args[1]);
	if (request->req_flags & req_null)	// return NULL if str2 is NULL
		return NULL;

	UCHAR* p1;
	MoveBuffer temp1;
	ULONG len1;
	len1 = MOV_make_string2(tdbb, str1, value->getCharSet(), &p1, temp1);

	UCHAR* p2;
	MoveBuffer temp2;
	ULONG len2;
	len2 = MOV_make_string2(tdbb, str2, value->getCharSet(), &p2, temp2);

	double rc;

	if (!len1 || !len2)
		rc = 0;
	else
		rc = similar_str(p1, len1, p2, len2) * 200.0 / (u_countChar32(p1, len1) + u_countChar32(p2, len2));

	impure->vlu_misc.vlu_double = rc;
	impure->vlu_desc.makeDouble(&impure->vlu_misc.vlu_double);

	return &impure->vlu_desc;
}



Где взять U16_NEXT, UChar32 и u_countChar32?
...
Рейтинг: 0 / 0
Добавить функцию в ядро fb3
    #39198507
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никто не знает?
...
Рейтинг: 0 / 0
Добавить функцию в ядро fb3
    #39198510
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__Никто не знает?
http://icu-project.org/apiref/icu4c/ustring_8h.html
...
Рейтинг: 0 / 0
Добавить функцию в ядро fb3
    #39198512
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman__Avenger__Никто не знает?
http://icu-project.org/apiref/icu4c/ustring_8h.html

Это понятно, но интересует со стороны движка FB как это сделать правильно.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Добавить функцию в ядро fb3
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]