![]() |
C nach Delphi
Hallo,
ich hab eine für mich sehr nützliche Sache gefunden in einem C Quelltext, diese hätte ich super gerne in Delphi, nur das übersteigt meine Fähigkeiten bei weitem. Könnte jemand das ganze vielleict nach Delphi übersetzen das wär mehr als genial!
Code:
Naja sofern das halt überhaupt möglich ist...int match_pattern(const char *text, const char *search, int case_sensitive, int strict) { if (search && *search) { #ifdef __GNUC__ const char *stack[strlen(text) + 2]; #else const char** stack= g_malloc(sizeof(char*) * ((unsigned int) strlen(text) + 2)); #endif int stackp= 0; const char *search_begin= search; const char *tend= text+g_utf8_strlen(text, (gssize)strlen(text)); const char *send= search+g_utf8_strlen(text, (gssize)strlen(search)); gunichar (*normcase)(gunichar)= case_sensitive ? dummy : g_unichar_toupper; while (*search && *text) { switch (*search) { case '*': search= g_utf8_next_char(search); if (*search != '?') { gunichar norm_search= normcase(*search); stack[stackp++]= search; while (*text && normcase(g_utf8_get_char_validated(text, (gssize)(tend - text))) != norm_search) text= g_utf8_next_char(text); break; } case '?': search= g_utf8_next_char(search); text= g_utf8_next_char(text); break; default: if (normcase(g_utf8_get_char_validated(text, (gssize)(tend-search))) != normcase(g_utf8_get_char_validated(search, (gssize)(send-search)))) { if (stackp==0) { return 0; } else { // backtrack search= stack[--stackp]; while (*text && *search && normcase(g_utf8_get_char_validated(text, (gssize)(tend-text))) != normcase(g_utf8_get_char_validated(search, (gssize)(send-search)))) text= g_utf8_next_char(text); } } else { search= g_utf8_next_char(search); text= g_utf8_next_char(text); } break; } } #ifndef __GNUC__ g_free(stack); #endif if (strict) { if (!*search) { if (search > search_begin && g_utf8_prev_char(search) && *g_utf8_prev_char(search) == '*') return 1; return *text ? 0 : 1; } else return 0; } else { // If both search string and text string are at end then we found a match. if (!*search && !*text) return 1; else { // If the search string still contains characters then text was exhausted already. // In this case we match only if search contains one or more '*'. if (!*search) return 0; else { while (*search == '*') ++search; return !*search; }; }; }; } else return -1; } Vielen Dank s! |
Re: C nach Delphi
Wo liegen deine Probleme im Speziellen?
|
Re: C nach Delphi
Im speziellen das ich überhaupt kein C kann respektive mich noch nie damit auseinander gesetzt hab ich kanns kaum lesen ums mal so auszudrücken :-(
|
Re: C nach Delphi
Vielleicht beschreibst Du einfach, was Du von der Funktion erwartest. Scheint mir eine etwas aufgebohrte StringCompare-Routine zu sein.
Das ist in Delphi mit ein paar Zeilen getan, den ganzen Müll mit dem Stack brauchst Du nicht. Grüße, Messie |
Re: C nach Delphi
Zitat:
DLTree.FullyVisible[Node] := match_pattern(Text, FSearchString, 0, 1) <> 0; |
Re: C nach Delphi
das beschreibt aber nicht was die Funktioen machen soll!
|
Re: C nach Delphi
Zitat:
Das läuft ungefähr so ab: In einem TEdit, tippst du den Text ein der gesucht werden soll, dabei wird erstaml alles im Tree auf visible = false gesetzt, also alle nodes... Nun wird halt beim eintippen des Suchwortes der vergleich gemacht und die Nodes dann wieder auf visible gesetzt, sofern der Nodes.Text mit dem Suchtext übereinstimmt, der rest bleibt halt unsichtbar... Problem ist aber so wie ich die Funktion da lese, das jeder eingetippte Buchstabe mit dem Nodes.Text verglichen wird und nicht nur das gesammte Wort? |
Re: C nach Delphi
Zitat:
Schau' mal ![]() Grüße, Messie |
Re: C nach Delphi
Zitat:
Gruß Marc |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz