abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
dnes 20:33 | Nová verze

Společnost NVIDIA oficiálně vydala verzi 10.0 toolkitu CUDA (Wikipedie) umožňujícího vývoj aplikací běžících na jejich grafických kartách. Přehled novinek v poznámkách k vydání.

Ladislav Hagara | Komentářů: 0
dnes 20:00 | Upozornění

Příspěvek Jak přežít plánovanou údržbu DNS na blogu zaměstnanců CZ.NIC upozorňuje na historicky poprvé podepsání DNS root zóny novým klíčem dne 11. října 2018 v 18:00. Software, který nebude po tomto okamžiku obsahovat nový DNSSEC root klíč, nebude schopen resolvovat žádná data. Druhým důležitým datem je 1. února 2019, kdy významní výrobci DNS softwaru, také historicky poprvé, přestanou podporovat servery, které porušují DNS standard

… více »
Ladislav Hagara | Komentářů: 0
dnes 15:55 | Pozvánky

Spolek OpenAlt zve příznivce otevřených řešení a přístupu na 156. brněnský sraz, který proběhne v pátek 21. září od 18:00 v restauraci Na Purkyňce na adrese Purkyňova 80.

Ladislav Hagara | Komentářů: 0
dnes 13:22 | Nová verze

Alan Griffiths z Canonicalu oznámil vydání verze 1.0.0 display serveru Mir (GitHub, Wikipedie). Mir byl představen v březnu 2013 jako náhrada X serveru a alternativa k Waylandu. Dnes Mir běží nad Waylandem a cílen je na internet věcí (IoT).

Ladislav Hagara | Komentářů: 0
včera 22:00 | Nasazení Linuxu
Stabilní aktualizace Chrome OS 69 (resp. Chromium OS), konkrétně 69.0.3497.95, přináší mj. podporu linuxových aplikací. Implementována je pomocí virtualizace, a proto je tato funkce také omezena na zařízení s dostatkem paměti a podporou hardwarové akcelerace, tudíž nejsou podporovány chromebooky s 32bitovými architekturami ARM, či Intel Bay Trail (tzn. bez Intel VT-x).
Fluttershy, yay! | Komentářů: 5
včera 21:32 | Zajímavý projekt
Došlo k uvolnění linuxové distribuce CLIP OS, vyvíjené francouzským úřadem pro kybernetickou bezpečnost ANSSI, jako open source. Vznikla za účelem nasazení v úřadech, kde je potřeba omezit přístup k důvěrným datům. Je založená na Gentoo.
Fluttershy, yay! | Komentářů: 1
včera 16:00 | Komerce

Zjistěte více o bezpečné a flexibilní architektuře v cloudu! IBM Cloud poskytuje bezpečné úložiště pro Vaše obchodní data s možností škálovatelnosti a flexibilitou ukládání dat. Zároveň nabízí prostředky pro jejich analýzu, vizualizaci, reporting a podporu rozhodování.

… více »
Fluttershy, yay! | Komentářů: 12
včera 12:22 | Nová verze

V dubnu letošního roku Mozilla představila webový prohlížeč pro rozšířenou a virtuální realitu Firefox Reality (GitHub). V úterý oznámila vydání verze 1.0. Ukázka na YouTube. Firefox Reality je k dispozici pro Viveport, Oculus a Daydream.

Ladislav Hagara | Komentářů: 2
včera 12:00 | Komunita

V srpnu loňského roku společnost Oracle oznámila, že Java EE (Enterprise Edition) bude uvolněna jako open source. O měsíc později bylo rozhodnuto, že tato open source Java EE bude přejmenována a předána Eclipse Foundation. Nové jméno bylo oznámeno v únoru letošního roku. Z Java EE se stala Jakarta EE. Eclipse Foundation včera oznámila dosažení dalšího milníku. Zdrojové kódy aplikačního serveru GlassFish jsou již k dispozici v git repozitářích Eclipse Foundation (GitHub).

Ladislav Hagara | Komentářů: 0
19.9. 23:55 | Komunita

LTS (Long Term Support) podpora Ubuntu 12.04 LTS (Precise Pangolin) skončila po 5 letech od jeho vydání, tj. v dubnu 2017. V březnu 2017 ale Canonical představil placenou ESM (Extended Security Maintenance) podporu, díky které je Ubuntu 12.04 podporováno do dubna 2020. Dnes Canonical potvrdil ESM podporu také pro Ubuntu 14.04 LTS (Trusty Tahr), jehož LTS podpora skončí v dubnu 2019.

Ladislav Hagara | Komentářů: 0
Na optické médium (CD, DVD, BD aj.) jsem naposledy vypaloval(a) data před méně než
 (13%)
 (14%)
 (21%)
 (23%)
 (25%)
 (4%)
 (1%)
Celkem 384 hlasů
 Komentářů: 33, poslední 16.9. 11:55
Rozcestník

Implementace ctype funkcí (Unix V7)

14.7. 13:34 | Přečteno: 2784× | Linux | poslední úprava: 14.7. 13:28

Během pročítání The C Programming Language (1988) občas narazíte na docela divoké konstrukce.
if (isdigit(c))            /* collect integer part */
    while (isdigit(s[++i] = c = getch()))
        ;
Protože funkce ze ctype.h jsou většinou implementovány jako makra, možná vás napadne, jak byste takové makro sami napsali, aby nedocházelo k side-efektům.

V Unixu V7 (1979) to řeší takto:

ctype_.c
#include    <ctype.h>

char _ctype_[] = {
    0,
    _C,    _C,    _C,    _C,    _C,    _C,    _C,    _C,
    _C,    _S,    _S,    _S,    _S,    _S,    _C,    _C,
    _C,    _C,    _C,    _C,    _C,    _C,    _C,    _C,
    _C,    _C,    _C,    _C,    _C,    _C,    _C,    _C,
    _S,    _P,    _P,    _P,    _P,    _P,    _P,    _P,
    _P,    _P,    _P,    _P,    _P,    _P,    _P,    _P,
    _N,    _N,    _N,    _N,    _N,    _N,    _N,    _N,
    _N,    _N,    _P,    _P,    _P,    _P,    _P,    _P,
    _P,    _U|_X, _U|_X, _U|_X, _U|_X, _U|_X, _U|_X, _U,
    _U,    _U,    _U,    _U,    _U,    _U,    _U,    _U,
    _U,    _U,    _U,    _U,    _U,    _U,    _U,    _U,
    _U,    _U,    _U,    _P,    _P,    _P,    _P,    _P,
    _P,    _L|_X, _L|_X, _L|_X, _L|_X, _L|_X, _L|_X, _L,
    _L,    _L,    _L,    _L,    _L,    _L,    _L,    _L,
    _L,    _L,    _L,    _L,    _L,    _L,    _L,    _L,
    _L,    _L,    _L,    _P,    _P,    _P,    _P,    _C
};
ctype.h
#define _U    01
#define _L    02
#define _N    04
#define _S    010
#define _P    020
#define _C    040
#define _X    0100

extern  char  _ctype_[];

#define isalpha(c)    ((_ctype_+1)[c]&(_U|_L))
#define isupper(c)    ((_ctype_+1)[c]&_U)
#define islower(c)    ((_ctype_+1)[c]&_L)
#define isdigit(c)    ((_ctype_+1)[c]&_N)
#define isxdigit(c)   ((_ctype_+1)[c]&(_N|_X))
#define isspace(c)    ((_ctype_+1)[c]&_S)
#define ispunct(c)    ((_ctype_+1)[c]&_P)
#define isalnum(c)    ((_ctype_+1)[c]&(_U|_L|_N))
#define isprint(c)    ((_ctype_+1)[c]&(_P|_U|_L|_N))
#define iscntrl(c)    ((_ctype_+1)[c]&_C)
#define isascii(c)    ((unsigned)(c)<=0177)
#define toupper(c)    ((c)-'a'+'A')
#define tolower(c)    ((c)-'A'+'a')
#define toascii(c)    ((c)&0177)
       

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Vložit další komentář

14.7. 19:24 Martin Mareš
Rozbalit Rozbalit vše Re: Implementace ctype funkcí (Unix V7)
On je to pěkný trik, ale bohužel také důvod, proč následující přímočaře vypadající kód nefunguje:
char c = getchar();
if (isprint(c))
    putchar(c);
Vidíte, proč?
14.7. 20:19 sad
Rozbalit Rozbalit vše Re: Implementace ctype funkcí (Unix V7)
Ani ne, mně ten kód funguje.
14.7. 21:12 pc2005 | skóre: 36 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Implementace ctype funkcí (Unix V7)
V případě, že někdo zavře stdin, tak ta tabulka přeteče. Ale závisí to na tom, zda měl v té době getchar návratový typ int, měl implementovaný EOF (= -1) nebo chybový návrat a zda byl char signed nebo unsigned (spíš signed, protože tam je ta +1) a zda může getchar číst i ascii znaky s nastaveným 7. bitem (128-255, pokud je v dané implementaci char signed, a někdo načte znak z vyšší poloviny ascii, tak tabulka naopak podteče). Nejspíš by to chtělo ten načtenej znak obalit toascii().
14.7. 21:25 debian
Rozbalit Rozbalit vše Re: Implementace ctype funkcí (Unix V7)
toascii nepomoze. pracuje s int.
int toascii(int c);
Vid man

14.7. 21:41 pc2005 | skóre: 36 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Implementace ctype funkcí (Unix V7)
V roce 1979 bylo typově nezávislé, viz poslední řádek blogu.
15.7. 22:45 .
Rozbalit Rozbalit vše Re: Implementace ctype funkcí (Unix V7)
Jestli se bavíte o kódu z blogu, tak tam žádný problém není.

Pokud je řeč o tom od MM, tak je v první řadě použití charu prostě blbě.
16.7. 01:31 Martin Mareš
Rozbalit Rozbalit vše Re: Implementace ctype funkcí (Unix V7)
Je blbě, ale je to naprosto typická začátečnická chyba: chvíli trvá, než člověk pochopí, že znaky se obvykle neukládají do charů :)

Svádí to k tomu, už jsem viděl i několik programů o statisících řádků zdrojáku, které byly takovýmihle chybami prolezlé.
16.7. 09:27 sad
Rozbalit Rozbalit vše Re: Implementace ctype funkcí (Unix V7)
Bych to jen doplnil, že znaky se deklarují jako int, aby mohly nabýt hodnotu EOF, která je zpravidla -1.
14.7. 21:38 sad
Rozbalit Rozbalit vše Re: Implementace ctype funkcí (Unix V7)
Tak v operačním systému Plan 9 už má ta tabulka 256 prvků.
15.7. 00:49 Martin Mareš
Rozbalit Rozbalit vše Re: Implementace ctype funkcí (Unix V7)
Nejen když zavře stdin. Úplně stačí, když se na vstupu objeví jakýkoliv znak s nahozeným nejvyšším bitem (tedy aspoň na překladačích, kde char je defaultně signed).
15.7. 06:59 kvr
Rozbalit Rozbalit vše Re: Implementace ctype funkcí (Unix V7)
Tak v zásadě není problém udělat buď pole se základem -128 a odečíst od parametru. Nebo lépe přetypovat parametr na (unsigned char).

Předpokládám, že výše uvedený kus kódu pocházel z doby, kdy měly kompilátory a knihovny nastavený char jako unsigned, u novějších bych čekal odolnější přístup.
14.7. 21:22 debian
Rozbalit Rozbalit vše Re: Implementace ctype funkcí (Unix V7)
Mne to funguje spravne.
14.7. 22:42 SazeVaclav
Rozbalit Rozbalit vše Re: Implementace ctype funkcí (Unix V7)
me ne ??? , ja kdyz zadam 'é', tak se ten putchar neprovede - a pritom bych si myslel, ze 'é' je printable.
15.7. 09:31 Jindřich Makovička | skóre: 15
Rozbalit Rozbalit vše Re: Implementace ctype funkcí (Unix V7)
Pro multibyte locale tenhle kód nefunguje už vůbec, tam je potřeba použít wchar varianty funkcí.
15.7. 22:48 .
Rozbalit Rozbalit vše Re: Implementace ctype funkcí (Unix V7)
Ono to nemusí být multibyte, ale určitě je to mimo ASCII+EOF, pro které je ta tabulka definovaná.
16.7. 11:04 debian
Rozbalit Rozbalit vše Re: Implementace ctype funkcí (Unix V7)
v popise man page jasne pise, ze pracuje so 7 bitami
16.7. 19:51 debian
Rozbalit Rozbalit vše Re: Implementace ctype funkcí (Unix V7)
Zdrojaky prekladacov su dostupne, tak preco z nich nevytiahnut, co clovek potrebuje?

Založit nové vláknoNahoru

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.