---
title: DOSLIB
url: 'https://wiki.teletypegames.org/hu/dos/doslib'
markdown: 'https://wiki.teletypegames.org/hu/dos/doslib.md'
lang: hu
date: '2026-10-11'
description: 'A DOSLIB a DOSINST, a GMENU, a BMAGIC és a TTGWIKI DOS-programok közös kódja (C++, Open Watcom, 16 bites DOS és Win32), és a szabályok, amelyeket a kódjuk követ. Mindegyik program SOURCE/lib mappájában git subtree-ként van benne, így önállóan fordul. Repó: git.teletypegames.org/dos/doslib Mi va…'
taxonomy:
  tag:
    - howto
---

# DOSLIB

> A DOSLIB a [DOSINST](https://wiki.teletypegames.org/hu/dos/dosinst), a [GMENU](https://wiki.teletypegames.org/hu/dos/gmenu), a [BMAGIC](https://wiki.teletypegames.org/hu/dos/bmagic) és a [TTGWIKI](https://wiki.teletypegames.org/hu/dos/ttgwiki) DOS-programok közös kódja (C++, Open Watcom, 16 bites DOS és Win32), és a szabályok, amelyeket a kódjuk követ. Mindegyik program `SOURCE/lib` mappájában git subtree-ként van benne, így önállóan fordul.

- **Repó:** [git.teletypegames.org/dos/doslib](https://git.teletypegames.org/dos/doslib)

# Mi van benne

| Mappa | Tartalom |
|---|---|
| `core` | I/O nélkül: szövegek és 8.3-as nevek, INI-fájlok, UTF-8 és 437-es kódlap, a 437-es és 852-es kódlap karakterenként egy bájttal (`code_page`), CRC-32, a közös `Error`. |
| `platform` | A gép interfészei: `Screen`, `Keyboard`, `Mouse`, `Clock`, `FileSystem`, `Network`, ... |
| `platform/dos`, `platform/win32` | A megvalósításaik: videomemória, BIOS, INT 33h, a Watcom C-könyvtár; a Win32-konzol. |
| `net` | FTP-kliens a `Network` interfészen. |
| `ui` | Rajzolás egy `Screen`-re, a BIOS-billentyűkódok, listakurzor. |
| `testing` | A tesztbuildek kampói (szkriptelt billentyűk, képernyőmentés), és tesztpótlékok a fejlesztőgépes unit-tesztekhez. |
| `tools` | A Watcom-build segédje, a rétegellenőrzés, a unit-tesztfuttató, a formázó. |

# Rétegek

Egy program rétegekből áll; mindegyik csak az alatta lévőket használja, azokat is csak az interfészükön át:

```
main_*.cpp     a gép: kiválasztja a platform-megvalósításokat
app/           összerakja a rétegeket
controller/    billentyűk és parancsok -> service-hívások
view/          rajzol
service/       amit a program csinál
repository/    a tárolás interfészei; a repository/<fajta>/ valósítja meg őket
model/         az adatok és a szabályaik, I/O nélkül
platform/      a program saját gépinterfészei és megvalósításaik
lib/           a DOSLIB
```

A `tools/check_layers.py` ezt a CI-ban ellenőrzi: melyik mappa mit include-olhat, hogy DOS- és Windows-fejléc csak a platformkódban van, hogy nincs `goto`, és `exit()` csak a `main`-ben. A platform fölött minden a fejlesztőgépen is lefordul, így ott unit-tesztelhető, DOSBox nélkül.

# A kód

- C++98, amennyit az Open Watcom ismer: osztályok, tisztán virtuális interfészek, referenciák, egyszerű template-ek; nincs kivétel, RTTI, STL és C++11.
- Az interfész neve azt mondja meg, mi (`FileSystem`), a megvalósításé azt, hogyan (`DosFileSystem`, `FakeFileSystem`). A függőségek a konstruktoron jönnek; konkrét objektumot csak az `app/` és a `main_*.cpp` hoz létre.
- A hiba egy `bool` és egy közös `Error`; a platformkódon kívül nincs globális állapot.
- Fájlok `snake_case`, típusok `PascalCase`, függvények `camelCase`, tagok `name_`; clang-format 18 a repó `.clang-format`-jával.

# Egy program frissítése

```sh
git subtree pull --prefix=SOURCE/lib ssh://git@git.teletypegames.org:2222/dos/doslib master --squash
```

Egy program `SOURCE/lib` mappájában tett változtatás a `git subtree push --prefix=SOURCE/lib ... master` paranccsal megy vissza.

# Open Watcom-buktatók

- A large modell 16 bites fordítója összeomlik 25 karakternél hosszabb modulnévnél; a build `-nm`-mel levágja.
- A 32 KB-nál nagyobb statikus objektum az EXE-fájlba kerül: a nagy objektumok a heapen vannak.
- 16 biten a rétegeknek mérete van (far mutatók, konstruktorok, virtuális táblák): a GMENU 30-ról 45 KB-ra, a DOSINST 77-ről 90 KB-ra nőtt.

'; var prevLevel = 2; for (var i = 0; i < headings.length; i++) { var h = headings\[i\]; var text = h.textContent.trim(); var slug = text.toLowerCase() .replace(/\[áàâä\]/g,'a').replace(/\[éèêë\]/g,'e').replace(/\[íìîï\]/g,'i') .replace(/\[óòôöő\]/g,'o').replace(/\[úùûüű\]/g,'u') .replace(/\[^a-z0-9\]+/g, '-').replace(/^-|-$/g, ''); if (!slug) slug = 'heading-' + i; if (used\[slug\]) { slug += '-' + i; } used\[slug\] = true; h.id = slug; var level = parseInt(h.tagName.charAt(1)); var cls = level > 2 ? ' class="toc-child"' : ''; html += '- [' + text + '](#'%20+%20slug%20+%20')
'; } html += '
'; toc.innerHTML = html; // Scroll-spy: highlight current heading var links = toc.querySelectorAll('a'); var ids = \[\]; for (var j = 0; j < links.length; j++) ids.push(links\[j\].getAttribute('href').slice(1)); function updateActive() { var current = ''; for (var k = 0; k < ids.length; k++) { var el = document.getElementById(ids\[k\]); if (el && el.getBoundingClientRect().top <= 80) current = ids\[k\]; } for (var m = 0; m < links.length; m++) { links\[m\].parentNode.classList.toggle('active', links\[m\].getAttribute('href') === '#' + current); } } window.addEventListener('scroll', updateActive, { passive: true }); updateActive(); })();

---

## Navigation

- Parent: [DOS](https://wiki.teletypegames.org/hu/dos.md)
- Previous: [DOSINST](https://wiki.teletypegames.org/hu/dos/dosinst.md)
- Next: [GMENU](https://wiki.teletypegames.org/hu/dos/gmenu.md)
