Obsah / Utility / TEXT / TextCopyWrite
Zdrojový kód: INCLUDE\UTIL\TEXT.INC, UTIL\TEXT.ASM
TextCopyWrite - Kopie dat textového řetězce před zápisem (interní funkce)
Funkce TextCopyWrite duplikuje data textového řetězce před změnou textového řetězce v případě, že data textového řetězce vlastní více vlastníků (tj. referenční čítač je větší než 1).
|
Na vstupu funkce obsahuje registr EBX ukazatel na textovou proměnnou TEXT. V případě chyby nedostatku paměti je navrácen příznak chyby CY, v tom případě není obsah proměnné textového řetězce změněn.
|
Nejdříve je proveden rychlý test, zda data textového řetězce vlastní více vlastníků. Do registru ESI je připraven ukazatel na data textového řetězce a pokud má referenční čítač textového řetězce hodnotu 1, proměnná textového řetězce je jediným vlastníkem dat a není potřeba je před zápisem duplikovat, funkce se může ihned ukončit. Tento text obsáhne i konstantní texty, konstantní text se duplikuje vždy.
|
Po úschově registrů je vytvořen nový datový buffer se stejnou délkou textu jako byla původní. Při chybě paměti se funkce ukončí s chybou, obsah textové proměnné přitom zůstává nezměněn.
|
Původní datový buffer bude zkopírován do nového bufferu. Z textové proměnné [EBX] je do registru EDI načten ukazatel na nový datový buffer. Adresa starého (ESI) i nového (EDI) bufferu se posune na začátek textu v bufferu. Do registru ECX se připraví délka textu. Text se zkopíruje nejdříve po násobcích dvojslov a poté se zkopírují zbylé bajty v posledním dvojslově.
|
Nakonec musí být odpojen starý text. Pokud se jednalo o konstantní text (nejvyšší bajt referenčního čítače má hodnotu 80h), referenční čítač nebude měněn a funkce se ukončí. Nejednalo-li se o konstantní text, dekrementuje se referenční čítač dat textového řetězce. Dekrementace se provede s uzamknutím sběrnice procesoru instrukcí LOCK, čímž je ošetřena možnost souběhu více procesorů.
Pokud referenční čítač dosáhl nuly, žádný další vlastník data textového řetězce již nevlastní a proto jsou zrušena pomocí makra TEXTBUFFREE. Tento případ by zdánlivě nemohl nastati, protože kopie při zápisu byla provedena v případě, že textová data vlastnilo více vlastníků. Ve skutečnosti může nastat případ, kdy se jiný vlastník odpojil od dat v průběhu provádění funkce TextCopyWrite, takže se textová proměnná EBX stala jediným vlastníkem.
Obsah / Utility / TEXT / TextCopyWrite