| term(5) | File formats | term(5) |
نام (NAME)
term - قالب توصیف ترمینال کامپایلشده terminfo
توضیحات (DESCRIPTION)
دستور tic(1) توصیف نوع ترمینال terminfo را کامپایل میکند و setupterm(3NCURSES) آن را میخواند. یک توصیف کامپایلشده ممکن است در یک فایل یا در یک پایگاه داده که بالقوه شامل تعداد زیادی از چنین توصیفهایی است ذخیره شود. علاوه بر این، یک توصیف کامپایلشده میتواند به یکی از دو قالب باشد: یکی مشابه قالبی که توسط System V استفاده میشد، و دیگری قالبی جدیدتر و قابل گسترش که منحصراً توسط ncurses به کار گرفته میشود.
محل ذخیرهسازی (Storage Location)
توصیفهای کامپایلشدهٔ terminfo در زیر دایرکتوری /etc/terminfo قرار میگیرند. هنگام ساخت کتابخانههای ncurses یکی از دو پیکربندی زیر انتخاب میشود:
- درخت دایرکتوری (directory tree)
- یک طرح دو سطحی برای جلوگیری از جستجوی خطی در دایرکتوری بزرگ سیستمی یونیکس استفاده میشود: /etc/terminfo/c/name که در آن name نام ترمینال، و c اولین نویسه از name است. بنابراین، توصیف کامپایلشده نوع ترمینال “act4” در فایل /etc/terminfo/a/act4 یافت میشود. نامهای مترادف برای یک ترمینال یکسان، با پیوندهای چندگانه (links) به همان فایل کامپایلشده پیادهسازی میشوند.
- پایگاه داده هششده (hashed database)
- با استفاده از API پایگاه داده برکلی (Berkeley database)، دو نوع رکورد ذخیره میشود: دادههای terminfo با همان قالبی که در درخت دایرکتوری ذخیره میشود به همراه نام اولیه نوع ترمینال به عنوان کلید، و رکوردهایی که فقط شامل نامهای مستعار اشارهکننده به نام اصلی هستند.
- در صورتی که برای نوشتن پایگاه دادههای هششده ساخته شده باشد، ncurses همچنان میتواند پایگاه دادههای terminfo سازمانیافته به صورت درخت دایرکتوری را بخواند، اما نمیتواند ورودیهایی را در درخت دایرکتوری بنویسد. این کتابخانه میتواند ورودیها را در پایگاه داده هششده بنویسد (یا بازنویسی کند).
- کتابخانهٔ ncurses دو حالت را در متغیرهای محیطی TERMINFO و TERMINFO_DIRS با فرض درخت دایرکتوری برای ورودیهایی که با یک دایرکتوری موجود مطابقت دارند، و فرض پایگاه داده هششده در غیر این صورت، تشخیص میدهد.
قالب ذخیرهسازی موروثی (Legacy Storage Format)
این قالب به گونهای انتخاب شده است که در تمام سختافزارها یکسان باشد. عرض بایت حداقل هشت بیت در نظر گرفته میشود، اما هیچ فرضی دربارهٔ ترتیب بیتها (bit ordering) یا گسترش علامت (sign extension) انجام نشده است.
این فایل به شش بخش تقسیم میشود:
- (a)
- header (هدر)،
- (b)
- terminal names (نامهای ترمینال)،
- (c)
- Boolean flags (پرچمهای بولی)،
- (d)
- numbers (اعداد)،
- (e)
- strings (رشتهها)، و
- (f)
- یک string table (جدول رشتهها).
بخش header فایل را آغاز میکند. این بخش شامل شش عدد صحیح کوتاه (short integer) در قالبی است که در زیر شرح داده شده است. این اعداد عبارتند از:
- (1) عدد جادویی (magic number)
- (هشتهشتی 0432)؛
- (2) اندازهٔ بخش terminal names بر حسب بایت؛
- (3) تعداد بایتهای بخش Boolean flags؛
- (4) تعداد اعداد صحیح کوتاه در بخش numbers؛
- (5) تعداد آفستها (اعداد صحیح کوتاه) در بخش strings؛
- (6) اندازهٔ string table بر حسب بایت.
قابلیتهای موجود در بخشهای Boolean flags، numbers و strings به همان ترتیبی هستند که در فایل هدر term.h تعریف شدهاند.
اعداد صحیح کوتاه، علامتدار و در محدودهٔ -32768 تا 32767 هستند و در قالب little-endian ذخیره میشوند.
اعداد در توصیف ترمینال، چه ورودیهایی در جدول numbers باشند و چه در جدول strings، اعداد صحیح مثبت هستند. پرچمهای بولی به عنوان اعداد صحیح مثبت یک بایتی در نظر گرفته میشوند. در هر مورد، آن اعداد صحیح مثبت نشاندهنده یک قابلیت ترمینال هستند. کامپایلر ترمینال tic از اعداد صحیح منفی برای مدیریت مواردی که یک قابلیت در دسترس نیست استفاده میکند:
- •
- اگر قابلیتی در این ترمینال وجود نداشته باشد، tic مقدار -1 را در جدول مربوطه ذخیره میکند.
- مقدار صحیح
-1 توسط دو
بایت 0377 و 0377
نشان داده
میشود.
مقادیر بولی ناموجود با بایت 0 (نادرست / false) نشان داده میشوند.
- •
- اگر قابلیتی برای این ترمینال لغو شده باشد (canceled)، tic مقدار -2 را در جدول مربوطه ذخیره میکند.
- مقدار صحیح
-2 توسط دو
بایت 0377 و 0376
نشان داده
میشود.
مقدار بولی -2 با بایت 0376 نشان داده میشود.
- •
- سایر مقادیر منفی غیرمجاز هستند.
بخش terminal names بعد از header میآید. این بخش شامل خط اول توصیف terminfo است که نامهای مختلف ترمینال را که با نویسهٔ “|” از هم جدا شدهاند فهرست میکند. بخش terminal names با یک نویسهٔ ASCII NUL خاتمه مییابد.
بخش Boolean flags برای هر پرچم یک بایت دارد. قابلیتهای بولی بسته به اینکه ترمینال از قابلیت مورد نظر پشتیبانی میکند یا خیر، 1 یا 0 (درست یا نادرست) هستند.
بین بخش Boolean flags و بخش number، در صورت لزوم یک بایت null درج میشود تا اطمینان حاصل شود که بخش number در یک بایت زوج شروع میشود. این یادگاری از معماری آدرسدهی کلمهای PDP-11 است که در ابتدا برای جلوگیری از وقفهها (traps) ناشی از آدرسدهی یک کلمه در مرز بایت فرد طراحی شده بود. تمام اعداد صحیح کوتاه در مرز کلمهٔ کوتاه تراز (align) میشوند.
بخش numbers شبیه به بخش Boolean flags است. هر قابلیت دو بایت را اشغال میکند و به عنوان یک عدد صحیح کوتاه little-endian ذخیره میشود.
بخش strings نیز مشابه است. هر قابلیت به صورت یک عدد صحیح کوتاه ذخیره میشود. مقدار قابلیت، یک شاخص (index) به درون string table است.
بخش string table آخرین بخش است. این بخش شامل تمامی مقادیر قابلیتهای رشتهای ارجاعشده در بخش strings است. هر رشته با نویسهٔ null خاتمه مییابد. نویسههای خاص در قالب نشانهگذاری ^X یا \c در شکل تفسیرشدهٔ خود ذخیره میشوند، نه نمایش چاپی. اطلاعات فاصلهگذاری (padding) $<nn> و اطلاعات پارامتر %x به صورت دستنخورده در شکل تفسیرنشده ذخیره میشوند.
قالب ذخیرهسازی گسترشیافته (Extended Storage Format)
بخش پیشین، قالب باینری متداول terminfo را شرح میدهد. با برخی تغییرات جزئی در آفستها (بخش سازگاری را ببینید)، همان قالب باینری در تمام سیستمهای مدرن یونیکس استفاده میشود. هر سیستم از مجموعهای از پیش تعریفشده از قابلیتهای بولی، عددی یا رشتهای استفاده میکند.
کتابخانهها و برنامههای ncurses از قالب باینری گسترشیافتهٔ terminfo پشتیبانی میکنند که به کاربران اجازه میدهد قابلیتهایی را تعریف کنند که در زمان اجرا بارگذاری میشوند. این گسترش با استفاده از این واقعیت امکانپذیر شده است که سایر پیادهسازیها خواندن دادههای terminfo را هنگامی که به انتهای اندازهٔ ارائهشده در هدر میرسند، متوقف میکنند. ncurses اندازه را بررسی میکند و اگر به دلیل دادههای از پیش تعریفشده از آن فراتر رود، به تجزیه بر اساس طرح خود ادامه میدهد.
ابتدا، هدر گسترشیافته را میخواند (۵ عدد صحیح کوتاه):
- (1)
- تعداد قابلیتهای بولی گسترشیافته
- (2)
- تعداد قابلیتهای عددی گسترشیافته
- (3)
- تعداد قابلیتهای رشتهای گسترشیافته
- (4)
- تعداد آیتمها در جدول رشتههای گسترشیافته
- (5)
- اندازهٔ جدول رشتههای گسترشیافته بر حسب بایت
مقادیر تعداد و اندازه برای جدول رشتههای گسترشیافته، هم شامل names (نامهای) قابلیتهای گسترشیافته و هم values (مقادیر) قابلیتهای گسترشیافته است.
با استفاده از این تعدادها و اندازهها، ncurses آرایهها را تخصیص میدهد و دادهها را برای قابلیتهای گسترشیافته به همان ترتیب اطلاعات هدر میخواند.
جدول رشتههای گسترشیافته شامل مقادیری برای قابلیتهای رشتهای است. پس از پایان این مقادیر، این جدول شامل نامهای هر یک از قابلیتهای گسترشیافته به ترتیب است: بولی، عددی، و رشتهای.
با ذخیره کردن توصیفهای ترمینال به این روش، ncurses میتواند پایگاه دادهای مفید برای برنامههای موروثی فراهم کند و همزمان دادههایی را برای برنامههایی که به اطلاعات بیشتری دربارهٔ نوع ترمینال نسبت به آنچه توسط X/Open Curses پیشبینی شده بود نیاز دارند، ارائه دهد. برای مرور کلی بر نحوهٔ استفادهٔ ncurses از این اطلاعات گسترشیافته، به user_caps(5) مراجعه کنید.
برنامههایی که دادههای ترمینال را دستکاری میکنند میتوانند از تعاریف شرح دادهشده در terminfo_variables(3NCURSES) استفاده کنند که نامهای طولانی قابلیتها را با اعضای یک ساختار TERMTYPE مرتبط میسازد.
قالب عددی گسترشیافته (Extended Number Format)
گاهی اوقات، اعداد صحیح علامتدار ۱۶ بیتی به اندازهٔ کافی بزرگ نیستند. ncurses نسخهٔ 6.1 با ایجاد چند تغییر در قالب موروثی، قالب جدیدی را معرفی کرد:
- یک عدد جادویی متفاوت (هشتهشتی 01036)
- تغییر نوع آرایهٔ number از اعداد صحیح ۱۶ بیتی علامتدار به اعداد صحیح ۳۲ بیتی علامتدار.
برای حفظ سازگاری، کتابخانه همان ساختارهای داده را مشابه قالبهای قبلی در اختیار کاربران مستقیم ساختار TERMTYPE قرار میدهد. با این حال، این کار نمیتواند اعداد گسترشیافته را در اختیار فراخوانها قرار دهد. این کتابخانه از یک ساختار دادهٔ مشابه اما پنهان به نام TERMTYPE2 برای ارائه دادهها به توابع terminfo استفاده میکند.
فایلها (FILES)
- /etc/terminfo
- پایگاه داده توصیف ترمینال کامپایلشده
سازگاری (PORTABILITY)
setupterm
توجه داشته باشید که ممکن است setupterm انتظار مجموعهای از قابلیتها را داشته باشد که با آنچه در واقعیت در فایل موجود است تفاوت دارد. یا ممکن است پایگاه داده از زمان کامپایل مجدد setupterm بهروزرسانی شده باشد (که منجر به ورودیهای ناشناختهٔ اضافی در فایل میشود) یا برنامه اخیراً و پس از بهروزرسانی پایگاه داده بازکامپایل شده باشد (که منجر به ورودیهای ناموجود میشود). روال setupterm باید برای هر دو احتمال آماده باشد - به همین دلیل است که اعداد و اندازهها در فایل گنجانده شدهاند. همچنین، قابلیتهای جدید باید همیشه در انتهای فهرستهای قابلیتهای بولی، عددی و رشتهای افزوده شوند.
قالب باینری (Binary Format)
استاندارد X/Open Curses قالبی را برای پایگاه دادهٔ terminfo تعیین نمیکند. در System V curses از یک درخت دایرکتوری از فایلهای باینری استفاده میشد؛ یک فایل به ازای هر توصیف ترمینال.
با وجود استفادهٔ مداوم از اعداد little-endian و قالبی که در غیر این صورت خود-توصیف (self-describing) است، تکیه بر سازگاری و جابجاییپذیری ورودیهای باینری terminfo بین نسخههای تجاری یونیکس کار عاقلانهای نیست. مشکل این است که حداقل سه نسخه از terminfo وجود دارد (تحت HP-UX، AIX، و OSF/1) که هر کدام پس از SVr1 از terminfo مربوط به System V منشعب شدند، و قابلیتهای الحاقی را به جدول رشتهها افزودند که (در قالب باینری) با الحاقات System V و X/Open Curses تداخل پیدا میکنند. برای بحث دقیق دربارهٔ مسائل سازگاری سورس terminfo، به terminfo(5) مراجعه کنید.
این پیادهسازی به طور پیشفرض با قالب باینری terminfo مورد استفاده در Solaris curses سازگار است، به جز در چند مورد جزئی کمتر استفادهشده که مشخص شد پیادهسازی سولاریس با X/Open Curses مطابقت ندارد. قالبی که توسط سایر نسخههای یونیکس استفاده میشود را میتوان با ساخت ncurses با گزینههای پیکربندی مختلف تطبیق داد.
کدهای جادویی (Magic Codes)
عدد جادویی در یک فایل باینری terminfo شامل ۱۶ بیت اول (دو بایت) است. علاوه بر قابل اطمینانتر ساختن بررسی این موضوع توسط کتابخانه که آیا یک فایل terminfo است یا خیر، ابزارهایی مانند file(1) نیز از آن برای تشخیص قالب فایل استفاده میکنند. سیستم System V بیش از یک عدد جادویی تعریف کرده بود، از جمله 0433 و 0435 به عنوان دامپ صفحه (screen-dump) (scr_dump(5) را ببینید). این پیادهسازی از 01036 به عنوان ادامهٔ آن توالی استفاده میکند، اما با یک بایت مرتبه بالای متفاوت برای جلوگیری از سردرگمی.
ساختار TERMTYPE
دسترسی مستقیم به ساختار TERMTYPE برای برنامههای موروثی فراهم شده است. برنامههای قابلحمل باید از tigetflag(3NCURSES) و توابع مرتبط برای خواندن قابلیتهای ترمینال استفاده کنند.
نامهای ترمینال با حروف کوچک و بزرگ ترکیبی (Mixed-case Terminal Names)
تعداد کمی از توصیفهای ترمینال از حروف بزرگ در نام خود استفاده میکنند. اگر فایلسیستم زیربنایی تفاوت میان حروف بزرگ و کوچک را نادیده بگیرد، ncurses «اولین نویسه» از نام ترمینال را که به عنوان سطح میانی یک درخت دایرکتوری استفاده میشود، به صورت هگزادسیمال (دو نویسهای) نشان میدهد.
محدودیتها (Limits)
کتابخانهٔ ncurses توصیفهای ترمینال کامپایلشده را در سه قالب مرتبط ذخیره میکند که در زیربخشهای زیر شرح داده شدهاند:
- قالب ذخیرهسازی موروثی (Legacy Storage Format)، و
- قالب ذخیرهسازی گسترشیافته (Extended Storage Format)، و
- قالب عددی گسترشیافته (Extended Number Format).
قالب ذخیرهسازی موروثی و قالب عددی گسترشیافته از نظر انواع قابلیتهای عددی که میتوانند ذخیره کنند با یکدیگر تفاوت دارند (به عنوان مثال، اعداد صحیح ۱۶ بیتی در برابر ۳۲ بیتی). قالب ذخیرهسازی گسترشیافته که توسط ncurses نسخهٔ 5.0 معرفی شد، دادههایی را به هر یک از این قالبها اضافه میکند.
برخی از محدودیتها اعمال میشوند:
- کل ورودیهای کامپایلشده در قالب موروثی نمیتواند از ۴۰۹۶ بایت تجاوز کند.
- کل ورودیهای کامپایلشده در قالب گسترشیافته نمیتواند از ۳۲۷۶۸ بایت تجاوز کند.
- طول فیلد نام نمیتواند از ۱۲۸ بایت بیشتر باشد.
ورودیهای کامپایلشده به ۳۲۷۶۸ بایت محدود هستند زیرا آفستها به درون جدول رشتهها (strings table) از اعداد صحیح دو بایتی استفاده میکنند. قالب موروثی میتوانست از ورودیهای ۳۲۷۶۸ بایتی پشتیبانی کند، اما به اندازهٔ ۴۰۹۶ بایت یک صفحهٔ حافظهٔ مجازی محدود شده بود.
مثالها (EXAMPLES)
در اینجا یک توصیف terminfo از Lear-Siegler ADM-3 آمده است؛ یک پایانهٔ اولیه محبوب و ساده.
adm3a|lsi adm3a,
am,
cols#80, lines#24,
bel=^G, clear=\032$<1>, cr=^M, cub1=^H, cud1=^J,
cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K,
home=^^, ind=^J,
دامپ هگزادسیمال توصیف ترمینال کامپایلشده آن (در قالب موروثی) در ادامه آمده است:
| 0000 1a 01 10 00 02 00 03 00 82 00 31 00 61 64 6d 33 ........ ..1.adm3 |
| 0010 61 7c 6c 73 69 20 61 64 6d 33 61 00 00 01 50 00 a|lsi ad m3a...P. |
| 0020 ff ff 18 00 ff ff 00 00 02 00 ff ff ff ff 04 00 ........ ........ |
| 0030 ff ff ff ff ff ff ff ff 0a 00 25 00 27 00 ff ff ........ ..%... |
| 0040 29 00 ff ff ff ff 2b 00 ff ff 2d 00 ff ff ff ff ).....+. ..-..... |
| 0050 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........ ........ |
| 0060 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........ ........ |
| 0070 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........ ........ |
| 0080 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........ ........ |
| 0090 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........ ........ |
| 00a0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........ ........ |
| 00b0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........ ........ |
| 00c0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........ ........ |
| 00d0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........ ........ |
| 00e0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........ ........ |
| 00f0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........ ........ |
| 0100 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........ ........ |
| 0110 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........ ........ |
| 0120 ff ff ff ff ff ff 2f 00 07 00 0d 00 1a 24 3c 31 ....../. .....$<1 |
| 0130 3e 00 1b 3d 25 70 31 25 7b 33 32 7d 25 2b 25 63 >..=%p1% {32}%+%c |
| 0140 25 70 32 25 7b 33 32 7d 25 2b 25 63 00 0a 00 1e %p2%{32} %+%c.... |
| 0150 00 08 00 0c 00 0b 00 0a 00 ........ . |
نویسندگان (AUTHORS)
Thomas E. Dickey
قالب
گسترشیافتهٔ
terminfo برای ncurses 5.0
پشتیبانی
از پایگاه
داده
هششده
برای ncurses 5.6
پشتیبانی
از اعداد
گسترشیافته
برای ncurses 6.1
Eric S. Raymond
مستندسازی
قالب
موروثی terminfo
(مورد
استفاده
توسط pcurses).
همچنین ببینید (SEE ALSO)
ncurses(3NCURSES)، terminfo(3NCURSES)، terminfo(5)، user_caps(5)
| 2024-06-15 | ncurses 6.5 |