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í
×
16.11. 17:00 | Nová verze

Simon Long představil na blogu Raspberry Pi novou verzi 2018-11-13 linuxové distribuce Raspbian určené především pro jednodeskové miniaturní počítače Raspberry Pi. Přehled novinek v poznámkách k vydání. Společně s Raspbianem byl aktualizován také instalační nástroj NOOBS (New Out Of the Box Software). Simon Long z novinek zdůrazňuje multimediální přehrávač VLC s hardwarovou akcelerací nebo vývojové prostředí pro Python Thonny ve verzi 3. Ke stažení jsou nově také lite a full obrazy Raspbianu. Raspbian Full opět obsahuje software Mathematica.

Ladislav Hagara | Komentářů: 0
16.11. 02:00 | Nová verze

Krátce po vydání Debianu 9.6 oznámil Tomáš Matějíček vydání verze 9.6 dnes již na Debianu založené živé linuxové distribuce Slax. Vedle vylepšení z Debianu je opraveno několik malých chyb. Opraveno bylo bootování pomocí PXE. Novinkou je skript s názvem pxe pro spuštění vlastního PXE serveru.

Ladislav Hagara | Komentářů: 0
16.11. 01:00 | Nová verze

Byla vydána beta verze Red Hat Enterprise Linuxu 8. Přehled novinek v příspěvku na blogu a v poznámkách k vydání.

Ladislav Hagara | Komentářů: 3
15.11. 13:44 | IT novinky

Nadace Raspberry Pi na svém blogu představila (YouTube) jednodeskový počítač Raspberry Pi 3 Model A+. Toto menší Raspberry Pi 3 lze koupit za 25 dolarů.

Ladislav Hagara | Komentářů: 0
15.11. 06:00 | Pozvánky

Dnes a zítra probíhá v Praze konference Internet a Technologie 18 pořádaná sdružením CZ.NIC. Sledovat ji lze online.

Ladislav Hagara | Komentářů: 0
15.11. 01:11 | Komunita

V září proběhl v Madridu Open Source CubeSat Workshop 2018. Videozáznamy přednášek byly zveřejněny na YouTube.

Ladislav Hagara | Komentářů: 1
15.11. 00:55 | Zajímavý software

Společnost Amazon představila Amazon Corretto. Jedná se o fork a distribuci OpenJDK (Open Java Development Kit) s dlouhodobou podporou od Amazonu. Ke stažení je preview verze 8. V plánu je také verze 11. Zdrojové kódy jsou k dispozici na GitHubu. Jedná se o reakci na oznámení společnosti Oracle, že bezplatné aktualizace její Javy nebude možné po lednu 2019 používat komerčně. Název Coretto vychází z Caffè corretto, tj. espressa s alkoholem.

Ladislav Hagara | Komentářů: 13
14.11. 12:44 | Nová verze

Po roce vývoje od vydání verze 5.2.0 byla vydána verze 5.3.0 svobodného integrovaného vývojového prostředí KDevelop (Wikipedie). Novinkou je analyzátor Clazy. Vylepšena byla podpora programovacích jazyků C++, PHP a Python. Ke stažení a k vyzkoušení je i binární balíček s KDevelopem 5.3.0 ve formátu AppImage.

Ladislav Hagara | Komentářů: 0
14.11. 05:55 | Komunita

Ubuntu 19.04 bude mít kódové jméno Disco Dingo. Dle oznámení v diskusním listu ubuntu-devel-announce je ve vývojové verzi Disco Dinga výchozím Pythonem 3 verze 3.7. Perl byl aktualizován na verzi 5.28. OpenSSL 1.0 bude nahrazeno OpenSSL 1.1.1 LTS. Nové instalace Dinga budou mít sloučený /usr. Stane se tak 7 let po sloučení /usr ve Fedoře nebo Arch Linuxu.

Ladislav Hagara | Komentářů: 9
14.11. 02:22 | IT novinky

V pondělí a úterý proběhl v San Franciscu Chrome Dev Summit 2018. Přehled dění v příspěvcích na Chromium Blogu. Videozáznamy přednášek na YouTube. Představen byl například web pro webové vývojáře web.dev nebo rozšíření webového prohlížeče Chrome s názvem VisBug (YouTube) určené pro webdesignery. Slíbená je podpora Firefoxu.

Ladislav Hagara | Komentářů: 0
Jak nejčastěji otevíráte dokumenty na počítači?
 (91%)
 (4%)
 (5%)
Celkem 112 hlasů
 Komentářů: 9, poslední 15.11. 22:46
Rozcestník

Implementace ctype funkcí (Unix V7)

14.7. 13:34 | Přečteno: 2829× | 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.