Strona główna › Forums › Dla programistów › Clipboard i C
Jakiej funkcji należy użyć aby otrzymać w zadeklarowanej wcześniej tablicy tekst z systemowego schowka ?
Zależy mi aby dane otrzymane w tablicy były w formie strumienia włącznie z EOF.
W tablicy to chyba nie bardzo, bo przecież nie znasz długości tych danych. Tak czy inaczej są dwa sposoby. Albo używasz iffparse.library, albo otwierasz clipboard.device i czytasz przez CMD_READ. Z tym, że weź pod uwagę, że dane w schowku nie są „gołym” tekstem, ale są trzymane w formacie IFF FTXT.
Otóż to, mam trudność w rozpoznaniu długości tych danych. Ogólnie rzecz biorąc chciałbym w swoim programie jako dane wejściowe umieścić tekst zawarty w systemowym schowku. Problemu nie ma jeśli potrzebowałbym "wklejać" tylko jedną linię, jednak docelowo wejściowy tekst ma składać się z wielu linii. Próbowałem ułatwić sobie zadanie wykorzystując Console MUI i pobierać wklejony tekst w pętli po jednym znaku, jednak jedyny dostępny znak sterujący w tym układzie to ‘n’. W przyszłości chciałbym do tego (wklejania i ew. prostego edytownia) wykorzystać odpowiednią klasę MUI, ale na razie chcę aby działało z CLI. W każdym razie już tak namotałem, że nie mam pewności którędy. :]
Sparsuj IFF-a. W nagłówku chunka CHRS jest podana długość. W sumie nie byłoby głupim napisać jakąś gotową funkcję do tego… A do niej tutorial, kaska na bounty leży. Tym bardziej, że morphosowy schowek ma już obsługę unikodu, ale nie jest to nigdzie udokumentowane jeszcze.
Parser w zasadzie gotowy, wyłuskany tekst zapisany do tablicy dynamicznej, zaalokowana pamięć zwalniana.
Paradoksalnie, (takie odnoszę wrażenie) teraz łatwiej jest mi umieścić instrukcje z głównego programu (nad którym pracowałem wcześniej) wewnątrz tej funkcji a nie odwrotnie, co mogłoby być bardziej pożądane. Tu właściwie utknąłem.
char *GetClipboardText();
int main(void)
{
char *text_addr;
text_addr = GetClipboardText();
// co robić :}
free (text_addr);
return 0;
}
char *GetClipboardText()
{
char *text_tab;
~~~~~~~~~~~~~~~~~
text_tab = (int*) malloc(text_lenght * sizeof *text_tab);
return text_tab;
}
Jakkolwiek udaje mi się jeszcze (po wywołaniu funkcji) zwolnić zaalokowaną na tablicę pamięć, to dalej w takim układzie nie za bardzo mogę z tych danych korzystać jak wewnątrz funkcji. Tracę też informację o ilości elementów, a szukanie końca ciągu znaków jest bez sensu skoro wcześniej posiadałem taką informację… i tu dla mnie kółko się zamyka a nawet trochę wcześniej. :]
Ps. Pomysł z bounty jest jak najbardziej ok, mógłbym powiedzieć nawet, że zgłaszam się na ochotnika ale to raczej jak zrobie z tego funkcje 😉
Możesz sobie np. zdefiniować strukturę:
struct MyText
{
char *text;
int length;
};
I teraz
struct MyText *GetClipboardText()
{
struct MyText *mt;
if (mt = AllocMem(sizeof(struct MyText), MEMF_ANY))
{
if (mt->text = AllocVec(text_length + 1, MEMF_ANY))
{
CopyMem(tekst_z_clipa, mt->text, text_length + 1);
mt->length = text_length;
return mt;
}
FreeVec(mt->text);
}
return NULL;
}
void FreeMyText(struct MyText *mt)
{
if (mt)
{
if (mt->text) FreeVec(mt->text);
FreeMem(mt, sizeof(struct MyText));
}
}
Teraz masz poprzez MyText dostęp do tekstu i do jego długości.
W sumie udało mi się przez *mt, pewnie znowu za bardzo kombinuję…
struct MyText
{
char *text;
ULONG length;
}*mt;
mt = GetClipboardText();
i dopiero w innych funkcjach mam dostęp przez mt->text.
Zastanawiam się czy może przez argumenty tych innych funkcji można by przekazać strukturę zwróconą przez GetClipboardText(). :}
Copyright 2014 - Wszelkie prawa zastrzeżone MorphOS.pl