Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² срСдС Linux. Π’Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 126

Автор Майкл ДТонсон

24.2.8. РисованиС Π»ΠΈΠ½ΠΈΠΉ ΠΈ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ²

Π₯отя функция SLsmg_set_char_set() ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ вСсь спСктр Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… возмоТностСй, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… для рисования простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ Π½Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅, Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ S-Lang для этого прСдусмотрСно нСсколько простых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

void SLsmg_draw_hline(int row);

void SLsmg_draw_vline(int column);

void SLsmg_draw_box(int row, int column, int height, int width);

Ѐункция SLsmg_draw_hline() рисуСт ΠΎΠ΄Π½Ρƒ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΡƒΡŽ линию Π² строкС row, Π° функция SLsmg_draw_vline() β€” ΠΎΠ΄Π½Ρƒ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ линию Π² ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ΅ col.

Ѐункция SLsmg_draw_box() рисуСт ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ, начиная с row ΠΈ col, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ простираСтся Π½Π° height строк ΠΈ width ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ. Ѐункция SLsmg_draw_box() ΠΏΠΎΠ΄ΠΎΠ±Π½Π° ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ SLsmg_draw_hline() ΠΈ SLsmg_draw_vline(), ΠΎΠ΄Π½Π°ΠΊΠΎ Π²Π΄ΠΎΠ±Π°Π²ΠΎΠΊ ΠΎΠ½Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π²Π΅Ρ€ΡˆΠΈΠ½Π°Ρ….

Π”Π°Π»Π΅Π΅ прСдставлСн ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, которая рисуСт экран, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‰ΠΈΠΉ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΈ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€Ρ‹ символов. Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ дСмонстрируСтся простоС использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SLsmg_draw_box().

 1: /* slcharset.с */

 2:

 3: #include <slang/slang.h>

 4: #include <stdio.h>

 5: #include <sys/ioctl.h>

 6: #include <termios.h>

 7:

 8: /* ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ 256 символов ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π° символов,

 9:    Π½Π°Ρ‡ΠΈΠ½Π°Ρ со столбца col. ΠŸΠΎΠ²Π΅Ρ€Ρ… Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ отобраТаСтся ΠΌΠ΅Ρ‚ΠΊΠ° 'label',

10:    Π° Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ символов Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ случаС,

11:    Ссли isAlternate Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ */

12: static void drawCharSet(int col, int isAlternate, char * label) {

13:  int i, j;

14:  int n = 0;

15:

16:  /* Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ */

17:  SLsmg_draw_box(0, col, 20, 38);

18:

19:  /* Ρ†Π΅Π½Ρ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ надпись */

20:  SLsmg_gotorc(0, col + 2);

21:  SLsmg_write_string(label);

22:

23:

24:  /* Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΡƒΡŽ линию */

25:  SLsmg_gotorc(2, col + 4);

26:  SLsmg_write_string("0123456789ABCDEF");

27:

28:  /* Π·Π°Π΄Π°Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π½Π°Π±ΠΎΡ€ символов */

29:  SLsmg_set_char_set(isAlternate);

30:

31:  /* итСрация ΠΏΠΎ 4 самым ΡΡ‚Π°Ρ€ΡˆΠΈΠΌ Π±ΠΈΡ‚Π°ΠΌ */

32:  for (i = 0; i < 16; i++) {

33:   SLsmg_gotorc(3 + i, 2 + col);

34:   SLsmg_write_char(i < 10 ? i + '0' : (i - 10) + 'A');

35:

36:   /* итСрация ΠΏΠΎ 4 самым младшим Π±ΠΈΡ‚Π°ΠΌ */

37:   for (j = 0; j < 16; j++) {

38:    SLsmg_gotorc(3 + i, col + 4 + (j * 2));

39:    SLsmg_write_char(n++);

40:   }

41:  }

42:

43:  SLsmg_set_char_set(0);

44: }

45:

46: int main (void) {

47:  struct winsize ws;

48:

49:  /* ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊ stdout */

50:  if (ioctl(1, TIOCGWINSZ, &ws)) {

51:   perror("сбой ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΠΎΠΊΠ½Π°");

52:   return 1;

53:  }

54:

55:  SLtt_get_terminfΠΎ();

56:

57:  SLtt_Screen_Rows = ws.ws_row;

58:  SLtt_Screen_Cols = ws.ws_col;

59:

60:  SLsmg_init_smg();

61:  SLang_init_tty(-1, 0, 1);

62:

63:  drawCharSet(0, 0, "Normal Character Set");

64:  drawCharSet(40, 1, "Alternate Character Set");

65:

66:  SLsmg_refresh();

67:  SLang_getkey();

68:

69:  SLsmg_gotorc(SLtt_Screen_Rows - 1, 0);

70:  SLsmg_refresh();

71:  SLsmg_reset_smg();

72:  SLang_reset_tty();

73:

74:  return 0;

75: }

24.2.9. ИспользованиС Ρ†Π²Π΅Ρ‚Π°

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° S-Lang ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ процСсс добавлСния Ρ†Π²Π΅Ρ‚ΠΎΠ² Π² прилоТСния. Она позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρƒ, ΡΠΎΡΡ‚ΠΎΡΡ‰ΡƒΡŽ ΠΈΠ· 256 элСмСнтов[171], ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… опрСдСляСт Ρ†Π²Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π½Π΅Π³ΠΎ ΠΏΠ»Π°Π½Π° ΠΈ Ρ„ΠΎΠ½Π°. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ элСмСнт ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ€Π°ΠΌΠΊΠΈ ΠΎΠΊΠ½Π° ΠΈΠ»ΠΈ ΠΏΡƒΠ½ΠΊΡ‚Π° списка. ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ†Π²Π΅Ρ‚Π° ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SLtt_set_color().

void SLtt_set_color(int entry, char * name, char * fg, char * bg);

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ опрСдСляСт ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ элСмСнт ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ name Π² настоящий ΠΌΠΎΠΌΠ΅Π½Ρ‚ игнорируСтся ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π΅Π½ NULL. Π”Π²Π° послСдних элСмСнта Π·Π°Π΄Π°ΡŽΡ‚ Π½ΠΎΠ²Ρ‹Π΅ Ρ†Π²Π΅Ρ‚Π° ΠΏΠ΅Ρ€Π΅Π΄Π½Π΅Π³ΠΎ ΠΏΠ»Π°Π½Π° ΠΈ Ρ„ΠΎΠ½Π° для Π΄Π°Π½Π½ΠΎΠ³ΠΎ элСмСнта ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹. Π’ Ρ‚Π°Π±Π». 24.2 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ список Ρ†Π²Π΅Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° S-Lang; fg ΠΈ bg Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ строки, содСрТащиС имя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚Π°. ВсС Ρ†Π²Π΅Ρ‚Π° Π² Π»Π΅Π²ΠΎΠΉ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ для ΠΏΠ΅Ρ€Π΅Π΄Π½Π΅Π³ΠΎ ΠΏΠ»Π°Π½Π°, Ρ‚Π°ΠΊ ΠΈ для Ρ„ΠΎΠ½Π°. Π¦Π²Π΅Ρ‚Π° Π² ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² качСствС Ρ†Π²Π΅Ρ‚ΠΎΠ² ΠΏΠ΅Ρ€Π΅Π΄Π½Π΅Π³ΠΎ ΠΏΠ»Π°Π½Π°. ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° использования этих Ρ†Π²Π΅Ρ‚ΠΎΠ² для Ρ„ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ нСпрСдсказуСмым Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ[172].


Π’Π°Π±Π»ΠΈΡ†Π° 24.2. Π¦Π²Π΅Ρ‚Π° Π² S-Lang

ΠŸΠ΅Ρ€Π΅Π΄Π½ΠΈΠΉ ΠΏΠ»Π°Π½ ΠΈ Ρ„ΠΎΠ½ ΠŸΠ΅Ρ€Π΅Π΄Π½ΠΈΠΉ ΠΏΠ»Π°Π½ black gray red brightred green brightgreen brown yellow blue brightblue magenta brightmagenta cyan brightcyan lightgray white

Π—Π°ΠΏΠΈΡΡŒ Π½Π° экран осущСствляСтся с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ элСмСнта ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Slsmg_set_color().

void SLsmg_set_color(int entry);

Π­Ρ‚Π° функция Π·Π°Π΄Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ элСмСнт ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹ ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ элСмСнту. Π¦Π²Π΅Ρ‚Π°, опрСдСляСмыС этим элСмСнтом, Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… записях Π½Π° экран.

Π₯отя ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ†Π²Π΅Ρ‚ΠΎΠΌ Π½Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ любого Ρ‚ΠΈΠΏΠ°, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ отобраТСния Ρ‚ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒΡΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Ρ„Π°ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ. Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Π°Ρ пСрСмСнная SLtt_Use_Ansi_Colors ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ†Π²Π΅Ρ‚ΠΎΠ². Если эта пСрСмСнная Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ†Π²Π΅Ρ‚Π° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, Π° Ссли любоС Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ.

Ѐункция SLtt_get_terminfo() пытаСтся ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ Ρ†Π²Π΅Ρ‚ доступСн Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅. К соТалСнию, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… termcap ΠΈ terminfo Π² этом ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ Π½Π΅ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½Ρ‹. Если Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π΄Π°Π½Π° пСрСмСнная срСды COLORTERM, Ρ‚ΠΎ S-Lang установит ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ SLtt_Use_Ansi_Colors нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΎ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°.

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Ρ†Π²Π΅Ρ‚ΠΎΠ², Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ ΠΎΠΏΡ†ΠΈΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, позволяя ΠΈΠ·Π±ΠΈΡ€Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Ρ†Π²Π΅Ρ‚ΠΎΠ². Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ этой ΠΎΠΏΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ явной установкС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ SLtt_Use_Ansi_Colors Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.

Π“Π»Π°Π²Π° 25

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌ часто Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ€Π°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ„Π°ΠΉΠ»Π°Ρ…. Π₯Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΠ³Π΄Π° Π²ΠΎ Π³Π»Π°Π²Ρƒ ΡƒΠ³Π»Π° ставится Π·Π°Π΄Π°Ρ‡Π° эффСктивного ΠΈΡ… извлСчСния, отличаСтся ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΈ слабой ΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒΡŽ ΠΊ ошибкам. БущСствуСт нСсколько Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ простыС API-интСрфСйсы для хранСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² Ρ„Π°ΠΉΠ»Π°Ρ…. Π’ систСмах сСмСйства Unix ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΏΠ΅Ρ€Π²Ρ‹Ρ… использовалась Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° dbm (впослСдствии ΠΎΠ½Π° Π±Ρ‹Π»Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΊΠ°ΠΊ ndbm), Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ Π·Π°Ρ‚Π΅ΠΌ ΠΊ появлСнию Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Berkley db ΠΈ gdbm ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° GNU. ВсС эти Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ обСспСчивали простой доступ ΠΊ Ρ„Π°ΠΉΠ»Π°ΠΌ, ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ Π² Π²ΠΈΠ΄Π΅ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†, с Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обСспСчивал доступ ΠΊ области Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…[173].

НСсмотря Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ gdbm ΠΈ Berkley db ΡˆΠΈΡ€ΠΎΠΊΠΎ доступны Π² систСмах Linux, Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ, сопровоТдаСмыС ΠΈΡ…, ΡΠ½ΠΈΠΆΠ°ΡŽΡ‚ удобство ΠΈΡ… коммСрчСского использования[174]. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° gdbm Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π½ΠΎ ΠΏΠΎΠ΄ΠΏΠ°Π΄Π°Π΅Ρ‚ ΠΏΠΎΠ΄ дСйствиС Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ LGPL, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ². Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ API-интСрфСйс ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· этих Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅, поэтому ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ ΠΌΠ΅ΠΆΠ΄Ρƒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ нСслоТно.

ΠŸΠΎΠ»Π½Ρ‹ΠΉ исходный ΠΊΠΎΠ΄ ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΏΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ gdbm ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° Web-сайтС ΠΏΠΎ адрСсу http://qdbm.sourceforge.net. Π’ этой Π³Π»Π°Π²Π΅ Π±ΡƒΠ΄ΡƒΡ‚ описаны всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для qdbm (каТдая ΠΈΠ· Π½ΠΈΡ… ΠΈΠΌΠ΅Π΅Ρ‚ Π±Π»ΠΈΠ·ΠΊΠΈΠ΅ Π°Π½Π°Π»ΠΎΠ³ΠΈ Π² Berkley db, adbm ΠΈ ndbm). Доступны Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ API, описаниС ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° Web-сайтС qdbm.

25.1. ΠžΠ±Π·ΠΎΡ€

qdbm ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ нСсколько Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… API-интСрфСйсов. Π‘Π°ΠΌΡ‹ΠΉ основной ΠΈΠ· Π½ΠΈΡ…, Depot, являСтся Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΌ API, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΈ рассмотрим Π² этой Π³Π»Π°Π²Π΅. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ Curia позволяСт Ρ€Π°Π·Π±ΠΈΠ²Π°Ρ‚ΡŒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ² (для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΠΈ ΠΈΠ»ΠΈ с Ρ†Π΅Π»ΡŒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС с ограничСниями), Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Villa ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ Π΄Π²Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ: модСль B-Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π² ΠΈ модСль Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ. API-интСрфСйс Odeon позволяСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ индСксами[175]. Π”Π²Π° послСдних API, Relic ΠΈ Hovel, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ‚Π°ΠΊΠΈΡ… интСрфСйсов, ΠΊΠ°ΠΊ ndbm ΠΈ qdbm.