Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi C nach Delphi (https://www.delphipraxis.net/125560-c-nach-delphi.html)

stOrM 8. Dez 2008 15:06


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:


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;
}
Naja sofern das halt überhaupt möglich ist...

Vielen Dank
s!

mkinzler 8. Dez 2008 15:08

Re: C nach Delphi
 
Wo liegen deine Probleme im Speziellen?

stOrM 8. Dez 2008 15:15

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 :-(

messie 8. Dez 2008 15:18

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

stOrM 8. Dez 2008 15:19

Re: C nach Delphi
 
Zitat:

Zitat von messie
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

Also mit VST wo ich gerne dann sowas einsetzen würde:

DLTree.FullyVisible[Node] := match_pattern(Text, FSearchString, 0, 1) <> 0;

mkinzler 8. Dez 2008 15:26

Re: C nach Delphi
 
das beschreibt aber nicht was die Funktioen machen soll!

stOrM 8. Dez 2008 15:28

Re: C nach Delphi
 
Zitat:

Zitat von mkinzler
das beschreibt aber nicht was die Funktioen machen soll!

Hmm die Nodes im Tree auf visible setzen wenn der Text mit dem SearchText übereinstimmt, wenn nicht werden die halt auch nicht angezeigt...
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?

messie 8. Dez 2008 15:28

Re: C nach Delphi
 
Zitat:

Zitat von mkinzler
das beschreibt aber nicht was die Funktioen machen soll!

Stimmt.

Schau' mal hier rein, vielleicht ist das das, was Du suchst.

Grüße, Messie

stOrM 8. Dez 2008 15:39

Re: C nach Delphi
 
Zitat:

Zitat von messie
Zitat:

Zitat von mkinzler
das beschreibt aber nicht was die Funktioen machen soll!

Stimmt.

Schau' mal hier rein, vielleicht ist das das, was Du suchst.

Grüße, Messie

Vielen Dank funzt super!
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