2
0

Texts.c 44 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835
  1. /* voc 2.1.0 [2021/07/05]. Bootstrapping compiler for address size 8, alignment 8. xrtspaSF */
  2. #define SHORTINT INT8
  3. #define INTEGER INT16
  4. #define LONGINT INT32
  5. #define SET UINT32
  6. #include "SYSTEM.h"
  7. #include "Files.h"
  8. #include "Modules.h"
  9. #include "Out.h"
  10. #include "Reals.h"
  11. typedef
  12. struct Texts_RunDesc *Texts_Run;
  13. typedef
  14. struct Texts_FontDesc *Texts_FontsFont;
  15. typedef
  16. struct Texts_RunDesc {
  17. Texts_Run prev, next;
  18. INT32 len;
  19. Texts_FontsFont fnt;
  20. INT8 col, voff;
  21. BOOLEAN ascii;
  22. } Texts_RunDesc;
  23. typedef
  24. struct Texts_ElemDesc *Texts_Elem;
  25. typedef
  26. struct Texts_ElemMsg {
  27. char _prvt0[1];
  28. } Texts_ElemMsg;
  29. typedef
  30. void (*Texts_Handler)(Texts_Elem, Texts_ElemMsg*, ADDRESS *);
  31. typedef
  32. struct Texts_TextDesc *Texts_Text;
  33. typedef
  34. struct Texts_ElemDesc {
  35. Texts_Run prev, next;
  36. INT32 len;
  37. Texts_FontsFont fnt;
  38. INT8 col, voff;
  39. BOOLEAN ascii;
  40. INT32 W, H;
  41. Texts_Handler handle;
  42. Texts_Text base;
  43. } Texts_ElemDesc;
  44. struct Texts__1 { /* Texts_ElemDesc */
  45. Texts_Run prev, next;
  46. INT32 len;
  47. Texts_FontsFont fnt;
  48. INT8 col, voff;
  49. BOOLEAN ascii;
  50. INT32 W, H;
  51. Texts_Handler handle;
  52. Texts_Text base;
  53. Files_File file;
  54. INT32 org, span;
  55. CHAR mod[32], proc[32];
  56. };
  57. typedef
  58. struct Texts__1 *Texts_Alien;
  59. typedef
  60. struct Texts_BufDesc {
  61. INT32 len;
  62. Texts_Run head;
  63. } Texts_BufDesc;
  64. typedef
  65. Texts_BufDesc *Texts_Buffer;
  66. typedef
  67. struct Texts_CopyMsg { /* Texts_ElemMsg */
  68. Texts_Elem e;
  69. } Texts_CopyMsg;
  70. typedef
  71. struct Texts_FileMsg { /* Texts_ElemMsg */
  72. INT16 id;
  73. INT32 pos;
  74. Files_Rider r;
  75. } Texts_FileMsg;
  76. typedef
  77. struct Texts_FontDesc {
  78. CHAR name[32];
  79. } Texts_FontDesc;
  80. typedef
  81. struct Texts_IdentifyMsg { /* Texts_ElemMsg */
  82. CHAR mod[32], proc[32];
  83. } Texts_IdentifyMsg;
  84. typedef
  85. void (*Texts_Notifier)(Texts_Text, INT16, INT32, INT32);
  86. typedef
  87. struct Texts_PieceDesc *Texts_Piece;
  88. typedef
  89. struct Texts_PieceDesc {
  90. Texts_Run prev, next;
  91. INT32 len;
  92. Texts_FontsFont fnt;
  93. INT8 col, voff;
  94. BOOLEAN ascii;
  95. Files_File file;
  96. INT32 org;
  97. } Texts_PieceDesc;
  98. typedef
  99. struct Texts_Reader {
  100. BOOLEAN eot;
  101. Texts_FontsFont fnt;
  102. INT8 col, voff;
  103. Texts_Elem elem;
  104. Files_Rider rider;
  105. Texts_Run run;
  106. INT32 org, off;
  107. } Texts_Reader;
  108. typedef
  109. struct Texts_Scanner { /* Texts_Reader */
  110. BOOLEAN eot;
  111. Texts_FontsFont fnt;
  112. INT8 col, voff;
  113. Texts_Elem elem;
  114. Files_Rider rider;
  115. Texts_Run run;
  116. INT32 org, off;
  117. CHAR nextCh;
  118. INT16 line, class;
  119. INT32 i;
  120. REAL x;
  121. LONGREAL y;
  122. CHAR c;
  123. INT8 len;
  124. CHAR s[64];
  125. } Texts_Scanner;
  126. typedef
  127. struct Texts_TextDesc {
  128. INT32 len;
  129. Texts_Notifier notify;
  130. Texts_Run head, cache;
  131. INT32 corg;
  132. } Texts_TextDesc;
  133. typedef
  134. struct Texts_Writer {
  135. Texts_Buffer buf;
  136. Texts_FontsFont fnt;
  137. INT8 col, voff;
  138. Files_Rider rider;
  139. Files_File file;
  140. } Texts_Writer;
  141. export Texts_Elem Texts_new;
  142. static Texts_Buffer Texts_del;
  143. static Texts_FontsFont Texts_FontsDefault;
  144. export ADDRESS *Texts_FontDesc__typ;
  145. export ADDRESS *Texts_RunDesc__typ;
  146. export ADDRESS *Texts_PieceDesc__typ;
  147. export ADDRESS *Texts_ElemMsg__typ;
  148. export ADDRESS *Texts_ElemDesc__typ;
  149. export ADDRESS *Texts_FileMsg__typ;
  150. export ADDRESS *Texts_CopyMsg__typ;
  151. export ADDRESS *Texts_IdentifyMsg__typ;
  152. export ADDRESS *Texts_BufDesc__typ;
  153. export ADDRESS *Texts_TextDesc__typ;
  154. export ADDRESS *Texts_Reader__typ;
  155. export ADDRESS *Texts_Scanner__typ;
  156. export ADDRESS *Texts_Writer__typ;
  157. export ADDRESS *Texts__1__typ;
  158. export void Texts_Append (Texts_Text T, Texts_Buffer B);
  159. export void Texts_ChangeLooks (Texts_Text T, INT32 beg, INT32 end, UINT32 sel, Texts_FontsFont fnt, INT8 col, INT8 voff);
  160. static Texts_Elem Texts_CloneElem (Texts_Elem e);
  161. static Texts_Piece Texts_ClonePiece (Texts_Piece p);
  162. export void Texts_Close (Texts_Text T, CHAR *name, ADDRESS name__len);
  163. export void Texts_Copy (Texts_Buffer SB, Texts_Buffer DB);
  164. export void Texts_CopyElem (Texts_Elem SE, Texts_Elem DE);
  165. export void Texts_Delete (Texts_Text T, INT32 beg, INT32 end);
  166. export Texts_Text Texts_ElemBase (Texts_Elem E);
  167. export INT32 Texts_ElemPos (Texts_Elem E);
  168. static void Texts_Find (Texts_Text T, INT32 *pos, Texts_Run *u, INT32 *org, INT32 *off);
  169. static Texts_FontsFont Texts_FontsThis (CHAR *name, ADDRESS name__len);
  170. static void Texts_HandleAlien (Texts_Elem E, Texts_ElemMsg *msg, ADDRESS *msg__typ);
  171. export void Texts_Insert (Texts_Text T, INT32 pos, Texts_Buffer B);
  172. export void Texts_Load (Files_Rider *r, ADDRESS *r__typ, Texts_Text T);
  173. static void Texts_Load0 (Files_Rider *r, ADDRESS *r__typ, Texts_Text T);
  174. static void Texts_Merge (Texts_Text T, Texts_Run u, Texts_Run *v);
  175. export void Texts_Open (Texts_Text T, CHAR *name, ADDRESS name__len);
  176. export void Texts_OpenBuf (Texts_Buffer B);
  177. export void Texts_OpenReader (Texts_Reader *R, ADDRESS *R__typ, Texts_Text T, INT32 pos);
  178. export void Texts_OpenScanner (Texts_Scanner *S, ADDRESS *S__typ, Texts_Text T, INT32 pos);
  179. export void Texts_OpenWriter (Texts_Writer *W, ADDRESS *W__typ);
  180. export INT32 Texts_Pos (Texts_Reader *R, ADDRESS *R__typ);
  181. export void Texts_Read (Texts_Reader *R, ADDRESS *R__typ, CHAR *ch);
  182. export void Texts_ReadElem (Texts_Reader *R, ADDRESS *R__typ);
  183. export void Texts_ReadPrevElem (Texts_Reader *R, ADDRESS *R__typ);
  184. export void Texts_Recall (Texts_Buffer *B);
  185. export void Texts_Save (Texts_Text T, INT32 beg, INT32 end, Texts_Buffer B);
  186. export void Texts_Scan (Texts_Scanner *S, ADDRESS *S__typ);
  187. export void Texts_SetColor (Texts_Writer *W, ADDRESS *W__typ, INT8 col);
  188. export void Texts_SetFont (Texts_Writer *W, ADDRESS *W__typ, Texts_FontsFont fnt);
  189. export void Texts_SetOffset (Texts_Writer *W, ADDRESS *W__typ, INT8 voff);
  190. static void Texts_Splice (Texts_Run un, Texts_Run v, Texts_Run w, Texts_Text base);
  191. static void Texts_Split (INT32 off, Texts_Run *u, Texts_Run *un);
  192. export void Texts_Store (Files_Rider *r, ADDRESS *r__typ, Texts_Text T);
  193. export void Texts_Write (Texts_Writer *W, ADDRESS *W__typ, CHAR ch);
  194. export void Texts_WriteDate (Texts_Writer *W, ADDRESS *W__typ, INT32 t, INT32 d);
  195. export void Texts_WriteElem (Texts_Writer *W, ADDRESS *W__typ, Texts_Elem e);
  196. export void Texts_WriteHex (Texts_Writer *W, ADDRESS *W__typ, INT32 x);
  197. export void Texts_WriteInt (Texts_Writer *W, ADDRESS *W__typ, INT64 x, INT64 n);
  198. export void Texts_WriteLn (Texts_Writer *W, ADDRESS *W__typ);
  199. export void Texts_WriteLongReal (Texts_Writer *W, ADDRESS *W__typ, LONGREAL x, INT16 n);
  200. export void Texts_WriteLongRealHex (Texts_Writer *W, ADDRESS *W__typ, LONGREAL x);
  201. export void Texts_WriteReal (Texts_Writer *W, ADDRESS *W__typ, REAL x, INT16 n);
  202. export void Texts_WriteRealFix (Texts_Writer *W, ADDRESS *W__typ, REAL x, INT16 n, INT16 k);
  203. export void Texts_WriteRealHex (Texts_Writer *W, ADDRESS *W__typ, REAL x);
  204. export void Texts_WriteString (Texts_Writer *W, ADDRESS *W__typ, CHAR *s, ADDRESS s__len);
  205. static Texts_FontsFont Texts_FontsThis (CHAR *name, ADDRESS name__len)
  206. {
  207. Texts_FontsFont F = NIL;
  208. __NEW(F, Texts_FontDesc);
  209. __COPY(name, F->name, 32);
  210. return F;
  211. }
  212. static void Texts_Find (Texts_Text T, INT32 *pos, Texts_Run *u, INT32 *org, INT32 *off)
  213. {
  214. Texts_Run v = NIL;
  215. INT32 m;
  216. if (*pos >= T->len) {
  217. *pos = T->len;
  218. *u = T->head;
  219. *org = T->len;
  220. *off = 0;
  221. T->cache = T->head;
  222. T->corg = 0;
  223. } else {
  224. v = T->cache->next;
  225. m = *pos - T->corg;
  226. if (*pos >= T->corg) {
  227. while (m >= v->len) {
  228. m -= v->len;
  229. v = v->next;
  230. }
  231. } else {
  232. while (m < 0) {
  233. v = v->prev;
  234. m += v->len;
  235. }
  236. }
  237. *u = v;
  238. *org = *pos - m;
  239. *off = m;
  240. T->cache = v->prev;
  241. T->corg = *org;
  242. }
  243. }
  244. static void Texts_Split (INT32 off, Texts_Run *u, Texts_Run *un)
  245. {
  246. Texts_Piece p = NIL, U = NIL;
  247. if (off == 0) {
  248. *un = *u;
  249. *u = (*un)->prev;
  250. } else if (off >= (*u)->len) {
  251. *un = (*u)->next;
  252. } else {
  253. __NEW(p, Texts_PieceDesc);
  254. *un = (Texts_Run)p;
  255. U = __GUARDP(*u, Texts_PieceDesc, 1);
  256. __GUARDEQP(p, Texts_PieceDesc) = *U;
  257. p->org += off;
  258. p->len -= off;
  259. U->len -= p->len;
  260. p->ascii = (*u)->ascii;
  261. p->prev = (Texts_Run)U;
  262. p->next = U->next;
  263. p->next->prev = (Texts_Run)p;
  264. U->next = (Texts_Run)p;
  265. }
  266. }
  267. static void Texts_Merge (Texts_Text T, Texts_Run u, Texts_Run *v)
  268. {
  269. Texts_Piece p = NIL, q = NIL;
  270. if ((((((((((__ISP(u, Texts_PieceDesc, 1) && __ISP(*v, Texts_PieceDesc, 1))) && __STRCMP(u->fnt->name, (*v)->fnt->name) == 0)) && u->col == (*v)->col)) && u->voff == (*v)->voff)) && __GUARDP(u, Texts_PieceDesc, 1)->ascii == __GUARDP(*v, Texts_PieceDesc, 1)->ascii)) {
  271. p = __GUARDP(u, Texts_PieceDesc, 1);
  272. q = __GUARDP(*v, Texts_PieceDesc, 1);
  273. if ((p->file == q->file && p->org + p->len == q->org)) {
  274. if (T->cache == u) {
  275. T->corg += q->len;
  276. } else if (T->cache == *v) {
  277. T->cache = T->head;
  278. T->corg = 0;
  279. }
  280. p->len += q->len;
  281. *v = (*v)->next;
  282. }
  283. }
  284. }
  285. static void Texts_Splice (Texts_Run un, Texts_Run v, Texts_Run w, Texts_Text base)
  286. {
  287. Texts_Run u = NIL;
  288. if (v != w->next) {
  289. u = un->prev;
  290. u->next = v;
  291. v->prev = u;
  292. un->prev = w;
  293. w->next = un;
  294. do {
  295. if (__ISP(v, Texts_ElemDesc, 1)) {
  296. __GUARDP(v, Texts_ElemDesc, 1)->base = base;
  297. }
  298. v = v->next;
  299. } while (!(v == un));
  300. }
  301. }
  302. static Texts_Piece Texts_ClonePiece (Texts_Piece p)
  303. {
  304. Texts_Piece q = NIL;
  305. __NEW(q, Texts_PieceDesc);
  306. __GUARDEQP(q, Texts_PieceDesc) = *p;
  307. return q;
  308. }
  309. static Texts_Elem Texts_CloneElem (Texts_Elem e)
  310. {
  311. Texts_CopyMsg msg;
  312. msg.e = NIL;
  313. (*e->handle)(e, (void*)&msg, Texts_CopyMsg__typ);
  314. return msg.e;
  315. }
  316. void Texts_CopyElem (Texts_Elem SE, Texts_Elem DE)
  317. {
  318. DE->len = SE->len;
  319. DE->fnt = SE->fnt;
  320. DE->col = SE->col;
  321. DE->voff = SE->voff;
  322. DE->W = SE->W;
  323. DE->H = SE->H;
  324. DE->handle = SE->handle;
  325. }
  326. Texts_Text Texts_ElemBase (Texts_Elem E)
  327. {
  328. return E->base;
  329. }
  330. INT32 Texts_ElemPos (Texts_Elem E)
  331. {
  332. Texts_Run u = NIL;
  333. INT32 pos;
  334. u = E->base->head->next;
  335. pos = 0;
  336. while (u != (void *) E) {
  337. pos = pos + u->len;
  338. u = u->next;
  339. }
  340. return pos;
  341. }
  342. static void Texts_HandleAlien (Texts_Elem E, Texts_ElemMsg *msg, ADDRESS *msg__typ)
  343. {
  344. Texts_Alien e = NIL;
  345. Files_Rider r;
  346. INT32 i;
  347. CHAR ch;
  348. if (__ISP(E, Texts__1, 2)) {
  349. if (__IS(msg__typ, Texts_CopyMsg, 1)) {
  350. if (__IS(msg__typ, Texts_CopyMsg, 1)) {
  351. Texts_CopyMsg *msg__ = (void*)msg;
  352. __NEW(e, Texts__1);
  353. Texts_CopyElem((void*)(*(Texts_Alien*)&E), (void*)e);
  354. e->file = (*(Texts_Alien*)&E)->file;
  355. e->org = (*(Texts_Alien*)&E)->org;
  356. e->span = (*(Texts_Alien*)&E)->span;
  357. __MOVE((*(Texts_Alien*)&E)->mod, e->mod, 32);
  358. __MOVE((*(Texts_Alien*)&E)->proc, e->proc, 32);
  359. (*msg__).e = (Texts_Elem)e;
  360. } else __WITHCHK;
  361. } else if (__IS(msg__typ, Texts_IdentifyMsg, 1)) {
  362. if (__IS(msg__typ, Texts_IdentifyMsg, 1)) {
  363. Texts_IdentifyMsg *msg__ = (void*)msg;
  364. __COPY((*(Texts_Alien*)&E)->mod, (*msg__).mod, 32);
  365. __COPY((*(Texts_Alien*)&E)->proc, (*msg__).proc, 32);
  366. (*msg__).mod[31] = 0x01;
  367. } else __WITHCHK;
  368. } else if (__IS(msg__typ, Texts_FileMsg, 1)) {
  369. if (__IS(msg__typ, Texts_FileMsg, 1)) {
  370. Texts_FileMsg *msg__ = (void*)msg;
  371. if ((*msg__).id == 1) {
  372. Files_Set(&r, Files_Rider__typ, (*(Texts_Alien*)&E)->file, (*(Texts_Alien*)&E)->org);
  373. i = (*(Texts_Alien*)&E)->span;
  374. while (i > 0) {
  375. Files_Read(&r, Files_Rider__typ, (void*)&ch);
  376. Files_Write(&(*msg__).r, Files_Rider__typ, ch);
  377. i -= 1;
  378. }
  379. }
  380. } else __WITHCHK;
  381. }
  382. } else __WITHCHK;
  383. }
  384. void Texts_OpenBuf (Texts_Buffer B)
  385. {
  386. Texts_Run u = NIL;
  387. __NEW(u, Texts_RunDesc);
  388. u->next = u;
  389. u->prev = u;
  390. B->head = u;
  391. B->len = 0;
  392. }
  393. void Texts_Copy (Texts_Buffer SB, Texts_Buffer DB)
  394. {
  395. Texts_Run u = NIL, v = NIL, vn = NIL;
  396. u = SB->head->next;
  397. v = DB->head->prev;
  398. while (u != SB->head) {
  399. if (__ISP(u, Texts_PieceDesc, 1)) {
  400. vn = (Texts_Run)Texts_ClonePiece(__GUARDP(u, Texts_PieceDesc, 1));
  401. } else {
  402. vn = (Texts_Run)Texts_CloneElem(__GUARDP(u, Texts_ElemDesc, 1));
  403. }
  404. v->next = vn;
  405. vn->prev = v;
  406. v = vn;
  407. u = u->next;
  408. }
  409. v->next = DB->head;
  410. DB->head->prev = v;
  411. DB->len += SB->len;
  412. }
  413. void Texts_Recall (Texts_Buffer *B)
  414. {
  415. *B = Texts_del;
  416. Texts_del = NIL;
  417. }
  418. void Texts_Save (Texts_Text T, INT32 beg, INT32 end, Texts_Buffer B)
  419. {
  420. Texts_Run u = NIL, v = NIL, w = NIL, wn = NIL;
  421. INT32 uo, ud, vo, vd;
  422. Texts_Find(T, &beg, &u, &uo, &ud);
  423. Texts_Find(T, &end, &v, &vo, &vd);
  424. w = B->head->prev;
  425. while (u != v) {
  426. if (__ISP(u, Texts_PieceDesc, 1)) {
  427. wn = (Texts_Run)Texts_ClonePiece(__GUARDP(u, Texts_PieceDesc, 1));
  428. wn->len -= ud;
  429. __GUARDP(wn, Texts_PieceDesc, 1)->org += ud;
  430. } else {
  431. wn = (Texts_Run)Texts_CloneElem(__GUARDP(u, Texts_ElemDesc, 1));
  432. }
  433. w->next = wn;
  434. wn->prev = w;
  435. w = wn;
  436. u = u->next;
  437. ud = 0;
  438. }
  439. if (vd > 0) {
  440. wn = (Texts_Run)Texts_ClonePiece(__GUARDP(v, Texts_PieceDesc, 1));
  441. wn->len = vd - ud;
  442. __GUARDP(wn, Texts_PieceDesc, 1)->org += ud;
  443. w->next = wn;
  444. wn->prev = w;
  445. w = wn;
  446. }
  447. w->next = B->head;
  448. B->head->prev = w;
  449. B->len += end - beg;
  450. }
  451. void Texts_Insert (Texts_Text T, INT32 pos, Texts_Buffer B)
  452. {
  453. Texts_Run u = NIL, un = NIL, v = NIL;
  454. Texts_Piece p = NIL, q = NIL;
  455. INT32 uo, ud, len;
  456. Texts_Find(T, &pos, &u, &uo, &ud);
  457. Texts_Split(ud, &u, &un);
  458. len = B->len;
  459. v = B->head->next;
  460. Texts_Merge(T, u, &v);
  461. Texts_Splice(un, v, B->head->prev, T);
  462. T->len += len;
  463. B->head->next = B->head;
  464. B->head->prev = B->head;
  465. B->len = 0;
  466. if (T->notify != NIL) {
  467. (*T->notify)(T, 1, pos, pos + len);
  468. }
  469. }
  470. void Texts_Append (Texts_Text T, Texts_Buffer B)
  471. {
  472. Texts_Run v = NIL;
  473. INT32 pos, len;
  474. pos = T->len;
  475. len = B->len;
  476. v = B->head->next;
  477. Texts_Merge(T, T->head->prev, &v);
  478. Texts_Splice(T->head, v, B->head->prev, T);
  479. T->len += len;
  480. B->head->next = B->head;
  481. B->head->prev = B->head;
  482. B->len = 0;
  483. if (T->notify != NIL) {
  484. (*T->notify)(T, 1, pos, pos + len);
  485. }
  486. }
  487. void Texts_Delete (Texts_Text T, INT32 beg, INT32 end)
  488. {
  489. Texts_Run c = NIL, u = NIL, un = NIL, v = NIL, vn = NIL;
  490. INT32 co, uo, ud, vo, vd;
  491. Texts_Find(T, &beg, &u, &uo, &ud);
  492. Texts_Split(ud, &u, &un);
  493. c = T->cache;
  494. co = T->corg;
  495. Texts_Find(T, &end, &v, &vo, &vd);
  496. Texts_Split(vd, &v, &vn);
  497. T->cache = c;
  498. T->corg = co;
  499. __NEW(Texts_del, Texts_BufDesc);
  500. Texts_OpenBuf(Texts_del);
  501. Texts_del->len = end - beg;
  502. Texts_Splice(Texts_del->head, un, v, NIL);
  503. Texts_Merge(T, u, &vn);
  504. u->next = vn;
  505. vn->prev = u;
  506. T->len -= end - beg;
  507. if (T->notify != NIL) {
  508. (*T->notify)(T, 2, beg, end);
  509. }
  510. }
  511. void Texts_ChangeLooks (Texts_Text T, INT32 beg, INT32 end, UINT32 sel, Texts_FontsFont fnt, INT8 col, INT8 voff)
  512. {
  513. Texts_Run c = NIL, u = NIL, un = NIL, v = NIL, vn = NIL;
  514. INT32 co, uo, ud, vo, vd;
  515. Texts_Find(T, &beg, &u, &uo, &ud);
  516. Texts_Split(ud, &u, &un);
  517. c = T->cache;
  518. co = T->corg;
  519. Texts_Find(T, &end, &v, &vo, &vd);
  520. Texts_Split(vd, &v, &vn);
  521. T->cache = c;
  522. T->corg = co;
  523. while (un != vn) {
  524. if ((__IN(0, sel, 32) && fnt != NIL)) {
  525. un->fnt = fnt;
  526. }
  527. if (__IN(1, sel, 32)) {
  528. un->col = col;
  529. }
  530. if (__IN(2, sel, 32)) {
  531. un->voff = voff;
  532. }
  533. Texts_Merge(T, u, &un);
  534. if (u->next == un) {
  535. u = un;
  536. un = un->next;
  537. } else {
  538. u->next = un;
  539. un->prev = u;
  540. }
  541. }
  542. Texts_Merge(T, u, &un);
  543. u->next = un;
  544. un->prev = u;
  545. if (T->notify != NIL) {
  546. (*T->notify)(T, 0, beg, end);
  547. }
  548. }
  549. void Texts_OpenReader (Texts_Reader *R, ADDRESS *R__typ, Texts_Text T, INT32 pos)
  550. {
  551. Texts_Run u = NIL;
  552. if (pos >= T->len) {
  553. pos = T->len;
  554. }
  555. Texts_Find(T, &pos, &u, &(*R).org, &(*R).off);
  556. (*R).run = u;
  557. (*R).eot = 0;
  558. if (__ISP(u, Texts_PieceDesc, 1)) {
  559. Files_Set(&(*R).rider, Files_Rider__typ, __GUARDP(u, Texts_PieceDesc, 1)->file, __GUARDP(u, Texts_PieceDesc, 1)->org + (*R).off);
  560. }
  561. }
  562. void Texts_Read (Texts_Reader *R, ADDRESS *R__typ, CHAR *ch)
  563. {
  564. Texts_Run u = NIL;
  565. INT32 pos;
  566. CHAR nextch;
  567. u = (*R).run;
  568. (*R).fnt = u->fnt;
  569. (*R).col = u->col;
  570. (*R).voff = u->voff;
  571. (*R).off += 1;
  572. if (__ISP(u, Texts_PieceDesc, 1)) {
  573. Files_Read(&(*R).rider, Files_Rider__typ, (void*)&*ch);
  574. (*R).elem = NIL;
  575. if ((*ch == 0x0a && __GUARDP(u, Texts_PieceDesc, 1)->ascii)) {
  576. *ch = 0x0d;
  577. } else if ((*ch == 0x0d && __GUARDP(u, Texts_PieceDesc, 1)->ascii)) {
  578. pos = Files_Pos(&(*R).rider, Files_Rider__typ);
  579. Files_Read(&(*R).rider, Files_Rider__typ, (void*)&nextch);
  580. if (nextch == 0x0a) {
  581. (*R).off += 1;
  582. } else {
  583. Files_Set(&(*R).rider, Files_Rider__typ, __GUARDP(u, Texts_PieceDesc, 1)->file, pos);
  584. }
  585. }
  586. } else if (__ISP(u, Texts_ElemDesc, 1)) {
  587. *ch = 0x1c;
  588. (*R).elem = __GUARDP(u, Texts_ElemDesc, 1);
  589. } else {
  590. *ch = 0x00;
  591. (*R).elem = NIL;
  592. (*R).eot = 1;
  593. }
  594. if ((*R).off == u->len) {
  595. (*R).org += u->len;
  596. u = u->next;
  597. if (__ISP(u, Texts_PieceDesc, 1)) {
  598. if (__ISP(u, Texts_PieceDesc, 1)) {
  599. Files_Set(&(*R).rider, Files_Rider__typ, (*(Texts_Piece*)&u)->file, (*(Texts_Piece*)&u)->org);
  600. } else __WITHCHK;
  601. }
  602. (*R).run = u;
  603. (*R).off = 0;
  604. }
  605. }
  606. void Texts_ReadElem (Texts_Reader *R, ADDRESS *R__typ)
  607. {
  608. Texts_Run u = NIL, un = NIL;
  609. u = (*R).run;
  610. while (__ISP(u, Texts_PieceDesc, 1)) {
  611. (*R).org += u->len;
  612. u = u->next;
  613. }
  614. if (__ISP(u, Texts_ElemDesc, 1)) {
  615. un = u->next;
  616. (*R).run = un;
  617. (*R).org += 1;
  618. (*R).off = 0;
  619. (*R).fnt = u->fnt;
  620. (*R).col = u->col;
  621. (*R).voff = u->voff;
  622. (*R).elem = __GUARDP(u, Texts_ElemDesc, 1);
  623. if (__ISP(un, Texts_PieceDesc, 1)) {
  624. if (__ISP(un, Texts_PieceDesc, 1)) {
  625. Files_Set(&(*R).rider, Files_Rider__typ, (*(Texts_Piece*)&un)->file, (*(Texts_Piece*)&un)->org);
  626. } else __WITHCHK;
  627. }
  628. } else {
  629. (*R).eot = 1;
  630. (*R).elem = NIL;
  631. }
  632. }
  633. void Texts_ReadPrevElem (Texts_Reader *R, ADDRESS *R__typ)
  634. {
  635. Texts_Run u = NIL;
  636. u = (*R).run->prev;
  637. while (__ISP(u, Texts_PieceDesc, 1)) {
  638. (*R).org -= u->len;
  639. u = u->prev;
  640. }
  641. if (__ISP(u, Texts_ElemDesc, 1)) {
  642. (*R).run = u;
  643. (*R).org -= 1;
  644. (*R).off = 0;
  645. (*R).fnt = u->fnt;
  646. (*R).col = u->col;
  647. (*R).voff = u->voff;
  648. (*R).elem = __GUARDP(u, Texts_ElemDesc, 1);
  649. } else {
  650. (*R).eot = 1;
  651. (*R).elem = NIL;
  652. }
  653. }
  654. INT32 Texts_Pos (Texts_Reader *R, ADDRESS *R__typ)
  655. {
  656. return (*R).org + (*R).off;
  657. }
  658. void Texts_OpenScanner (Texts_Scanner *S, ADDRESS *S__typ, Texts_Text T, INT32 pos)
  659. {
  660. Texts_OpenReader((void*)&*S, S__typ, T, pos);
  661. (*S).line = 0;
  662. (*S).nextCh = ' ';
  663. }
  664. static struct Scan__31 {
  665. Texts_Scanner *S;
  666. ADDRESS *S__typ;
  667. CHAR *ch;
  668. BOOLEAN *negE;
  669. INT16 *e;
  670. struct Scan__31 *lnk;
  671. } *Scan__31_s;
  672. static void ReadScaleFactor__32 (void);
  673. static void ReadScaleFactor__32 (void)
  674. {
  675. Texts_Read((void*)&*Scan__31_s->S, Scan__31_s->S__typ, &*Scan__31_s->ch);
  676. if (*Scan__31_s->ch == '-') {
  677. *Scan__31_s->negE = 1;
  678. Texts_Read((void*)&*Scan__31_s->S, Scan__31_s->S__typ, &*Scan__31_s->ch);
  679. } else {
  680. *Scan__31_s->negE = 0;
  681. if (*Scan__31_s->ch == '+') {
  682. Texts_Read((void*)&*Scan__31_s->S, Scan__31_s->S__typ, &*Scan__31_s->ch);
  683. }
  684. }
  685. while (('0' <= *Scan__31_s->ch && *Scan__31_s->ch <= '9')) {
  686. *Scan__31_s->e = (*Scan__31_s->e * 10 + (INT16)*Scan__31_s->ch) - 48;
  687. Texts_Read((void*)&*Scan__31_s->S, Scan__31_s->S__typ, &*Scan__31_s->ch);
  688. }
  689. }
  690. void Texts_Scan (Texts_Scanner *S, ADDRESS *S__typ)
  691. {
  692. CHAR ch, term;
  693. BOOLEAN neg, negE, hex;
  694. INT8 i, j, h;
  695. INT16 e;
  696. INT32 k;
  697. REAL x, f;
  698. LONGREAL y, g;
  699. CHAR d[32];
  700. struct Scan__31 _s;
  701. _s.S = S; _s.S__typ = S__typ;
  702. _s.ch = &ch;
  703. _s.negE = &negE;
  704. _s.e = &e;
  705. _s.lnk = Scan__31_s;
  706. Scan__31_s = &_s;
  707. ch = (*S).nextCh;
  708. i = 0;
  709. for (;;) {
  710. if (ch == 0x0d) {
  711. (*S).line += 1;
  712. } else if ((ch != ' ' && ch != 0x09)) {
  713. break;
  714. }
  715. Texts_Read((void*)&*S, S__typ, &ch);
  716. }
  717. if ((('A' <= __CAP(ch) && __CAP(ch) <= 'Z') || ch == '/') || ch == '.') {
  718. do {
  719. (*S).s[__X(i, 64)] = ch;
  720. i += 1;
  721. Texts_Read((void*)&*S, S__typ, &ch);
  722. } while (!((((__CAP(ch) > 'Z' && ch != '_') || ('A' > __CAP(ch) && ch > '9')) || ((('0' > ch && ch != '.')) && ch != '/')) || i == 63));
  723. (*S).s[__X(i, 64)] = 0x00;
  724. (*S).len = i;
  725. (*S).class = 1;
  726. } else if (ch == '"') {
  727. Texts_Read((void*)&*S, S__typ, &ch);
  728. while ((((ch != '"' && ch >= ' ')) && i != 63)) {
  729. (*S).s[__X(i, 64)] = ch;
  730. i += 1;
  731. Texts_Read((void*)&*S, S__typ, &ch);
  732. }
  733. (*S).s[__X(i, 64)] = 0x00;
  734. (*S).len = i + 1;
  735. Texts_Read((void*)&*S, S__typ, &ch);
  736. (*S).class = 2;
  737. } else {
  738. if (ch == '-') {
  739. neg = 1;
  740. Texts_Read((void*)&*S, S__typ, &ch);
  741. } else {
  742. neg = 0;
  743. }
  744. if (('0' <= ch && ch <= '9')) {
  745. hex = 0;
  746. j = 0;
  747. for (;;) {
  748. d[__X(i, 32)] = ch;
  749. i += 1;
  750. Texts_Read((void*)&*S, S__typ, &ch);
  751. if (ch < '0') {
  752. break;
  753. }
  754. if ('9' < ch) {
  755. if (('A' <= ch && ch <= 'F')) {
  756. hex = 1;
  757. ch = __CHR((INT16)ch - 7);
  758. } else if (('a' <= ch && ch <= 'f')) {
  759. hex = 1;
  760. ch = __CHR((INT16)ch - 39);
  761. } else {
  762. break;
  763. }
  764. }
  765. }
  766. if (ch == 'H') {
  767. Texts_Read((void*)&*S, S__typ, &ch);
  768. (*S).class = 3;
  769. if (i - j > 8) {
  770. j = i - 8;
  771. }
  772. k = (INT16)d[__X(j, 32)] - 48;
  773. j += 1;
  774. if ((i - j == 7 && k >= 8)) {
  775. k -= 16;
  776. }
  777. while (j < i) {
  778. k = __ASHL(k, 4) + ((INT16)d[__X(j, 32)] - 48);
  779. j += 1;
  780. }
  781. if (neg) {
  782. (*S).i = -k;
  783. } else {
  784. (*S).i = k;
  785. }
  786. } else if (ch == '.') {
  787. Texts_Read((void*)&*S, S__typ, &ch);
  788. h = i;
  789. while (('0' <= ch && ch <= '9')) {
  790. d[__X(i, 32)] = ch;
  791. i += 1;
  792. Texts_Read((void*)&*S, S__typ, &ch);
  793. }
  794. if (ch == 'D') {
  795. e = 0;
  796. y = (LONGREAL)0;
  797. g = (LONGREAL)1;
  798. do {
  799. y = y * (LONGREAL)10 + ((INT16)d[__X(j, 32)] - 48);
  800. j += 1;
  801. } while (!(j == h));
  802. while (j < i) {
  803. g = g / (LONGREAL)(LONGREAL)10;
  804. y = ((INT16)d[__X(j, 32)] - 48) * g + y;
  805. j += 1;
  806. }
  807. ReadScaleFactor__32();
  808. if (negE) {
  809. if (e <= 308) {
  810. y = y / (LONGREAL)Reals_TenL(e);
  811. } else {
  812. y = (LONGREAL)0;
  813. }
  814. } else if (e > 0) {
  815. if (e <= 308) {
  816. y = Reals_TenL(e) * y;
  817. } else {
  818. __HALT(40);
  819. }
  820. }
  821. if (neg) {
  822. y = -y;
  823. }
  824. (*S).class = 5;
  825. (*S).y = y;
  826. } else {
  827. e = 0;
  828. x = (REAL)0;
  829. f = (REAL)1;
  830. do {
  831. x = x * (REAL)10 + ((INT16)d[__X(j, 32)] - 48);
  832. j += 1;
  833. } while (!(j == h));
  834. while (j < i) {
  835. f = f / (REAL)(REAL)10;
  836. x = ((INT16)d[__X(j, 32)] - 48) * f + x;
  837. j += 1;
  838. }
  839. if (ch == 'E') {
  840. ReadScaleFactor__32();
  841. }
  842. if (negE) {
  843. if (e <= 38) {
  844. x = x / (REAL)Reals_Ten(e);
  845. } else {
  846. x = (REAL)0;
  847. }
  848. } else if (e > 0) {
  849. if (e <= 38) {
  850. x = Reals_Ten(e) * x;
  851. } else {
  852. __HALT(40);
  853. }
  854. }
  855. if (neg) {
  856. x = -x;
  857. }
  858. (*S).class = 4;
  859. (*S).x = x;
  860. }
  861. if (hex) {
  862. (*S).class = 0;
  863. }
  864. } else {
  865. (*S).class = 3;
  866. k = 0;
  867. do {
  868. k = k * 10 + ((INT16)d[__X(j, 32)] - 48);
  869. j += 1;
  870. } while (!(j == i));
  871. if (neg) {
  872. (*S).i = -k;
  873. } else {
  874. (*S).i = k;
  875. }
  876. if (hex) {
  877. (*S).class = 0;
  878. } else {
  879. (*S).class = 3;
  880. }
  881. }
  882. } else {
  883. (*S).class = 6;
  884. if (neg) {
  885. (*S).c = '-';
  886. } else {
  887. (*S).c = ch;
  888. Texts_Read((void*)&*S, S__typ, &ch);
  889. }
  890. }
  891. }
  892. (*S).nextCh = ch;
  893. Scan__31_s = _s.lnk;
  894. }
  895. void Texts_OpenWriter (Texts_Writer *W, ADDRESS *W__typ)
  896. {
  897. __NEW((*W).buf, Texts_BufDesc);
  898. Texts_OpenBuf((*W).buf);
  899. (*W).fnt = Texts_FontsDefault;
  900. (*W).col = 15;
  901. (*W).voff = 0;
  902. (*W).file = Files_New((CHAR*)"", 1);
  903. Files_Set(&(*W).rider, Files_Rider__typ, (*W).file, 0);
  904. }
  905. void Texts_SetFont (Texts_Writer *W, ADDRESS *W__typ, Texts_FontsFont fnt)
  906. {
  907. (*W).fnt = fnt;
  908. }
  909. void Texts_SetColor (Texts_Writer *W, ADDRESS *W__typ, INT8 col)
  910. {
  911. (*W).col = col;
  912. }
  913. void Texts_SetOffset (Texts_Writer *W, ADDRESS *W__typ, INT8 voff)
  914. {
  915. (*W).voff = voff;
  916. }
  917. void Texts_Write (Texts_Writer *W, ADDRESS *W__typ, CHAR ch)
  918. {
  919. Texts_Run u = NIL, un = NIL;
  920. Texts_Piece p = NIL;
  921. Files_Write(&(*W).rider, Files_Rider__typ, ch);
  922. (*W).buf->len += 1;
  923. un = (*W).buf->head;
  924. u = un->prev;
  925. if ((((((((((__ISP(u, Texts_PieceDesc, 1) && __GUARDP(u, Texts_PieceDesc, 1)->file == (*W).file)) && __STRCMP(u->fnt->name, (*W).fnt->name) == 0)) && u->col == (*W).col)) && u->voff == (*W).voff)) && !__GUARDP(u, Texts_PieceDesc, 1)->ascii)) {
  926. u->len += 1;
  927. } else {
  928. __NEW(p, Texts_PieceDesc);
  929. u->next = (Texts_Run)p;
  930. p->prev = u;
  931. p->next = un;
  932. un->prev = (Texts_Run)p;
  933. p->len = 1;
  934. p->fnt = (*W).fnt;
  935. p->col = (*W).col;
  936. p->voff = (*W).voff;
  937. p->file = (*W).file;
  938. p->org = Files_Length((*W).file) - 1;
  939. p->ascii = 0;
  940. }
  941. }
  942. void Texts_WriteElem (Texts_Writer *W, ADDRESS *W__typ, Texts_Elem e)
  943. {
  944. Texts_Run u = NIL, un = NIL;
  945. if (e->base != NIL) {
  946. __HALT(99);
  947. }
  948. (*W).buf->len += 1;
  949. e->len = 1;
  950. e->fnt = (*W).fnt;
  951. e->col = (*W).col;
  952. e->voff = (*W).voff;
  953. un = (*W).buf->head;
  954. u = un->prev;
  955. u->next = (Texts_Run)e;
  956. e->prev = u;
  957. e->next = un;
  958. un->prev = (Texts_Run)e;
  959. }
  960. void Texts_WriteLn (Texts_Writer *W, ADDRESS *W__typ)
  961. {
  962. Texts_Write(&*W, W__typ, 0x0d);
  963. }
  964. void Texts_WriteString (Texts_Writer *W, ADDRESS *W__typ, CHAR *s, ADDRESS s__len)
  965. {
  966. INT16 i;
  967. __DUP(s, s__len, CHAR);
  968. i = 0;
  969. while (s[__X(i, s__len)] >= ' ') {
  970. Texts_Write(&*W, W__typ, s[__X(i, s__len)]);
  971. i += 1;
  972. }
  973. __DEL(s);
  974. }
  975. void Texts_WriteInt (Texts_Writer *W, ADDRESS *W__typ, INT64 x, INT64 n)
  976. {
  977. INT16 i;
  978. INT64 x0;
  979. CHAR a[24];
  980. i = 0;
  981. if (x < 0) {
  982. if (x == (-9223372036854775807LL-1)) {
  983. Texts_WriteString(&*W, W__typ, (CHAR*)" -9223372036854775808", 22);
  984. return;
  985. } else {
  986. n -= 1;
  987. x0 = -x;
  988. }
  989. } else {
  990. x0 = x;
  991. }
  992. do {
  993. a[__X(i, 24)] = __CHR(__MOD(x0, 10) + 48);
  994. x0 = __DIV(x0, 10);
  995. i += 1;
  996. } while (!(x0 == 0));
  997. while (n > (INT64)i) {
  998. Texts_Write(&*W, W__typ, ' ');
  999. n -= 1;
  1000. }
  1001. if (x < 0) {
  1002. Texts_Write(&*W, W__typ, '-');
  1003. }
  1004. do {
  1005. i -= 1;
  1006. Texts_Write(&*W, W__typ, a[__X(i, 24)]);
  1007. } while (!(i == 0));
  1008. }
  1009. void Texts_WriteHex (Texts_Writer *W, ADDRESS *W__typ, INT32 x)
  1010. {
  1011. INT16 i;
  1012. INT32 y;
  1013. CHAR a[20];
  1014. i = 0;
  1015. Texts_Write(&*W, W__typ, ' ');
  1016. do {
  1017. y = __MASK(x, -16);
  1018. if (y < 10) {
  1019. a[__X(i, 20)] = __CHR(y + 48);
  1020. } else {
  1021. a[__X(i, 20)] = __CHR(y + 55);
  1022. }
  1023. x = __ASHR(x, 4);
  1024. i += 1;
  1025. } while (!(i == 8));
  1026. do {
  1027. i -= 1;
  1028. Texts_Write(&*W, W__typ, a[__X(i, 20)]);
  1029. } while (!(i == 0));
  1030. }
  1031. void Texts_WriteReal (Texts_Writer *W, ADDRESS *W__typ, REAL x, INT16 n)
  1032. {
  1033. INT16 e;
  1034. REAL x0;
  1035. CHAR d[9];
  1036. e = Reals_Expo(x);
  1037. if (e == 0) {
  1038. Texts_WriteString(&*W, W__typ, (CHAR*)" 0", 4);
  1039. do {
  1040. Texts_Write(&*W, W__typ, ' ');
  1041. n -= 1;
  1042. } while (!(n <= 3));
  1043. } else if (e == 255) {
  1044. Texts_WriteString(&*W, W__typ, (CHAR*)" NaN", 5);
  1045. while (n > 4) {
  1046. Texts_Write(&*W, W__typ, ' ');
  1047. n -= 1;
  1048. }
  1049. } else {
  1050. if (n <= 9) {
  1051. n = 3;
  1052. } else {
  1053. n -= 6;
  1054. }
  1055. do {
  1056. Texts_Write(&*W, W__typ, ' ');
  1057. n -= 1;
  1058. } while (!(n <= 8));
  1059. if (x < (REAL)0) {
  1060. Texts_Write(&*W, W__typ, '-');
  1061. x = -x;
  1062. } else {
  1063. Texts_Write(&*W, W__typ, ' ');
  1064. }
  1065. e = __ASHR((e - 127) * 77, 8);
  1066. if (e >= 0) {
  1067. x = x / (REAL)Reals_Ten(e);
  1068. } else {
  1069. x = Reals_Ten(-e) * x;
  1070. }
  1071. if (x >= (REAL)10) {
  1072. x = 1.0000000e-001 * x;
  1073. e += 1;
  1074. }
  1075. x0 = Reals_Ten(n - 1);
  1076. x = x0 * x + 5.0000000e-001;
  1077. if (x >= (REAL)10 * x0) {
  1078. x = x * 1.0000000e-001;
  1079. e += 1;
  1080. }
  1081. Reals_Convert(x, n, (void*)d, 9);
  1082. n -= 1;
  1083. Texts_Write(&*W, W__typ, d[__X(n, 9)]);
  1084. Texts_Write(&*W, W__typ, '.');
  1085. do {
  1086. n -= 1;
  1087. Texts_Write(&*W, W__typ, d[__X(n, 9)]);
  1088. } while (!(n == 0));
  1089. Texts_Write(&*W, W__typ, 'E');
  1090. if (e < 0) {
  1091. Texts_Write(&*W, W__typ, '-');
  1092. e = -e;
  1093. } else {
  1094. Texts_Write(&*W, W__typ, '+');
  1095. }
  1096. Texts_Write(&*W, W__typ, __CHR(__DIV(e, 10) + 48));
  1097. Texts_Write(&*W, W__typ, __CHR((int)__MOD(e, 10) + 48));
  1098. }
  1099. }
  1100. static struct WriteRealFix__53 {
  1101. Texts_Writer *W;
  1102. ADDRESS *W__typ;
  1103. INT16 *i;
  1104. CHAR (*d)[9];
  1105. struct WriteRealFix__53 *lnk;
  1106. } *WriteRealFix__53_s;
  1107. static void dig__54 (INT16 n);
  1108. static void seq__56 (CHAR ch, INT16 n);
  1109. static void seq__56 (CHAR ch, INT16 n)
  1110. {
  1111. while (n > 0) {
  1112. Texts_Write(&*WriteRealFix__53_s->W, WriteRealFix__53_s->W__typ, ch);
  1113. n -= 1;
  1114. }
  1115. }
  1116. static void dig__54 (INT16 n)
  1117. {
  1118. while (n > 0) {
  1119. *WriteRealFix__53_s->i -= 1;
  1120. Texts_Write(&*WriteRealFix__53_s->W, WriteRealFix__53_s->W__typ, (*WriteRealFix__53_s->d)[__X(*WriteRealFix__53_s->i, 9)]);
  1121. n -= 1;
  1122. }
  1123. }
  1124. void Texts_WriteRealFix (Texts_Writer *W, ADDRESS *W__typ, REAL x, INT16 n, INT16 k)
  1125. {
  1126. INT16 e, i;
  1127. CHAR sign;
  1128. REAL x0;
  1129. CHAR d[9];
  1130. struct WriteRealFix__53 _s;
  1131. _s.W = W; _s.W__typ = W__typ;
  1132. _s.i = &i;
  1133. _s.d = (void*)d;
  1134. _s.lnk = WriteRealFix__53_s;
  1135. WriteRealFix__53_s = &_s;
  1136. e = Reals_Expo(x);
  1137. if (k < 0) {
  1138. k = 0;
  1139. }
  1140. if (e == 0) {
  1141. seq__56(' ', (n - k) - 2);
  1142. Texts_Write(&*W, W__typ, '0');
  1143. seq__56(' ', k + 1);
  1144. } else if (e == 255) {
  1145. Texts_WriteString(&*W, W__typ, (CHAR*)" NaN", 5);
  1146. seq__56(' ', n - 4);
  1147. } else {
  1148. e = __ASHR((e - 127) * 77, 8);
  1149. if (x < (REAL)0) {
  1150. sign = '-';
  1151. x = -x;
  1152. } else {
  1153. sign = ' ';
  1154. }
  1155. if (e >= 0) {
  1156. x = x / (REAL)Reals_Ten(e);
  1157. } else {
  1158. x = Reals_Ten(-e) * x;
  1159. }
  1160. if (x >= (REAL)10) {
  1161. x = 1.0000000e-001 * x;
  1162. e += 1;
  1163. }
  1164. if (k + e >= 8) {
  1165. k = 8 - e;
  1166. } else if (k + e < 0) {
  1167. k = -e;
  1168. x = (REAL)0;
  1169. }
  1170. x0 = Reals_Ten(k + e);
  1171. x = x0 * x + 5.0000000e-001;
  1172. if (x >= (REAL)10 * x0) {
  1173. e += 1;
  1174. }
  1175. e += 1;
  1176. i = k + e;
  1177. Reals_Convert(x, i, (void*)d, 9);
  1178. if (e > 0) {
  1179. seq__56(' ', ((n - e) - k) - 2);
  1180. Texts_Write(&*W, W__typ, sign);
  1181. dig__54(e);
  1182. Texts_Write(&*W, W__typ, '.');
  1183. dig__54(k);
  1184. } else {
  1185. seq__56(' ', (n - k) - 3);
  1186. Texts_Write(&*W, W__typ, sign);
  1187. Texts_Write(&*W, W__typ, '0');
  1188. Texts_Write(&*W, W__typ, '.');
  1189. seq__56('0', -e);
  1190. dig__54(k + e);
  1191. }
  1192. }
  1193. WriteRealFix__53_s = _s.lnk;
  1194. }
  1195. void Texts_WriteRealHex (Texts_Writer *W, ADDRESS *W__typ, REAL x)
  1196. {
  1197. INT16 i;
  1198. CHAR d[8];
  1199. Reals_ConvertH(x, (void*)d, 8);
  1200. i = 0;
  1201. do {
  1202. Texts_Write(&*W, W__typ, d[__X(i, 8)]);
  1203. i += 1;
  1204. } while (!(i == 8));
  1205. }
  1206. void Texts_WriteLongReal (Texts_Writer *W, ADDRESS *W__typ, LONGREAL x, INT16 n)
  1207. {
  1208. INT16 e;
  1209. LONGREAL x0;
  1210. CHAR d[16];
  1211. e = Reals_ExpoL(x);
  1212. if (e == 0) {
  1213. Texts_WriteString(&*W, W__typ, (CHAR*)" 0", 4);
  1214. do {
  1215. Texts_Write(&*W, W__typ, ' ');
  1216. n -= 1;
  1217. } while (!(n <= 3));
  1218. } else if (e == 2047) {
  1219. Texts_WriteString(&*W, W__typ, (CHAR*)" NaN", 5);
  1220. while (n > 4) {
  1221. Texts_Write(&*W, W__typ, ' ');
  1222. n -= 1;
  1223. }
  1224. } else {
  1225. if (n <= 10) {
  1226. n = 3;
  1227. } else {
  1228. n -= 7;
  1229. }
  1230. do {
  1231. Texts_Write(&*W, W__typ, ' ');
  1232. n -= 1;
  1233. } while (!(n <= 16));
  1234. if (x < (LONGREAL)0) {
  1235. Texts_Write(&*W, W__typ, '-');
  1236. x = -x;
  1237. } else {
  1238. Texts_Write(&*W, W__typ, ' ');
  1239. }
  1240. e = __SHORT(__ASHR((e - 1023) * 77, 8), 32768);
  1241. if (e >= 0) {
  1242. x = x / (LONGREAL)Reals_TenL(e);
  1243. } else {
  1244. x = Reals_TenL(-e) * x;
  1245. }
  1246. if (x >= (LONGREAL)10) {
  1247. x = 1.00000000000000e-001 * x;
  1248. e += 1;
  1249. }
  1250. x0 = Reals_TenL(n - 1);
  1251. x = x0 * x + 5.00000000000000e-001;
  1252. if (x >= (LONGREAL)10 * x0) {
  1253. x = 1.00000000000000e-001 * x;
  1254. e += 1;
  1255. }
  1256. Reals_ConvertL(x, n, (void*)d, 16);
  1257. n -= 1;
  1258. Texts_Write(&*W, W__typ, d[__X(n, 16)]);
  1259. Texts_Write(&*W, W__typ, '.');
  1260. do {
  1261. n -= 1;
  1262. Texts_Write(&*W, W__typ, d[__X(n, 16)]);
  1263. } while (!(n == 0));
  1264. Texts_Write(&*W, W__typ, 'D');
  1265. if (e < 0) {
  1266. Texts_Write(&*W, W__typ, '-');
  1267. e = -e;
  1268. } else {
  1269. Texts_Write(&*W, W__typ, '+');
  1270. }
  1271. Texts_Write(&*W, W__typ, __CHR(__DIV(e, 100) + 48));
  1272. e = (int)__MOD(e, 100);
  1273. Texts_Write(&*W, W__typ, __CHR(__DIV(e, 10) + 48));
  1274. Texts_Write(&*W, W__typ, __CHR((int)__MOD(e, 10) + 48));
  1275. }
  1276. }
  1277. void Texts_WriteLongRealHex (Texts_Writer *W, ADDRESS *W__typ, LONGREAL x)
  1278. {
  1279. INT16 i;
  1280. CHAR d[16];
  1281. Reals_ConvertHL(x, (void*)d, 16);
  1282. i = 0;
  1283. do {
  1284. Texts_Write(&*W, W__typ, d[__X(i, 16)]);
  1285. i += 1;
  1286. } while (!(i == 16));
  1287. }
  1288. static struct WriteDate__43 {
  1289. Texts_Writer *W;
  1290. ADDRESS *W__typ;
  1291. struct WriteDate__43 *lnk;
  1292. } *WriteDate__43_s;
  1293. static void WritePair__44 (CHAR ch, INT32 x);
  1294. static void WritePair__44 (CHAR ch, INT32 x)
  1295. {
  1296. Texts_Write(&*WriteDate__43_s->W, WriteDate__43_s->W__typ, ch);
  1297. Texts_Write(&*WriteDate__43_s->W, WriteDate__43_s->W__typ, __CHR(__DIV(x, 10) + 48));
  1298. Texts_Write(&*WriteDate__43_s->W, WriteDate__43_s->W__typ, __CHR((int)__MOD(x, 10) + 48));
  1299. }
  1300. void Texts_WriteDate (Texts_Writer *W, ADDRESS *W__typ, INT32 t, INT32 d)
  1301. {
  1302. struct WriteDate__43 _s;
  1303. _s.W = W; _s.W__typ = W__typ;
  1304. _s.lnk = WriteDate__43_s;
  1305. WriteDate__43_s = &_s;
  1306. WritePair__44(' ', __MASK(d, -32));
  1307. WritePair__44('.', __MASK(__ASHR(d, 5), -16));
  1308. WritePair__44('.', __MASK(__ASHR(d, 9), -128));
  1309. WritePair__44(' ', __MASK(__ASHR(t, 12), -32));
  1310. WritePair__44(':', __MASK(__ASHR(t, 6), -64));
  1311. WritePair__44(':', __MASK(t, -64));
  1312. WriteDate__43_s = _s.lnk;
  1313. }
  1314. static struct Load0__16 {
  1315. Texts_Text *T;
  1316. INT8 *ecnt;
  1317. Files_File *f;
  1318. Texts_FileMsg *msg;
  1319. CHAR (*mods)[64][32], (*procs)[64][32];
  1320. struct Load0__16 *lnk;
  1321. } *Load0__16_s;
  1322. static void LoadElem__17 (Files_Rider *r, ADDRESS *r__typ, INT32 pos, INT32 span, Texts_Elem *e);
  1323. static void LoadElem__17 (Files_Rider *r, ADDRESS *r__typ, INT32 pos, INT32 span, Texts_Elem *e)
  1324. {
  1325. Heap_Module M = NIL;
  1326. Heap_Command Cmd;
  1327. Texts_Alien a = NIL;
  1328. INT32 org, ew, eh;
  1329. INT8 eno;
  1330. Texts_new = NIL;
  1331. Files_ReadLInt(&*r, r__typ, &ew);
  1332. Files_ReadLInt(&*r, r__typ, &eh);
  1333. Files_Read(&*r, r__typ, (void*)&eno);
  1334. if (eno > *Load0__16_s->ecnt) {
  1335. *Load0__16_s->ecnt = eno;
  1336. Files_ReadString(&*r, r__typ, (void*)(*Load0__16_s->mods)[__X(eno, 64)], 32);
  1337. Files_ReadString(&*r, r__typ, (void*)(*Load0__16_s->procs)[__X(eno, 64)], 32);
  1338. }
  1339. org = Files_Pos(&*r, r__typ);
  1340. M = Modules_ThisMod((*Load0__16_s->mods)[__X(eno, 64)], 32);
  1341. if (M != NIL) {
  1342. Cmd = Modules_ThisCommand(M, (*Load0__16_s->procs)[__X(eno, 64)], 32);
  1343. if (Cmd != NIL) {
  1344. (*Cmd)();
  1345. }
  1346. }
  1347. *e = Texts_new;
  1348. if (*e != NIL) {
  1349. (*e)->W = ew;
  1350. (*e)->H = eh;
  1351. (*e)->base = *Load0__16_s->T;
  1352. (*Load0__16_s->msg).pos = pos;
  1353. (*(*e)->handle)(*e, (void*)&*Load0__16_s->msg, Texts_FileMsg__typ);
  1354. if (Files_Pos(&*r, r__typ) != org + span) {
  1355. *e = NIL;
  1356. }
  1357. }
  1358. if (*e == NIL) {
  1359. Files_Set(&*r, r__typ, *Load0__16_s->f, org + span);
  1360. __NEW(a, Texts__1);
  1361. a->W = ew;
  1362. a->H = eh;
  1363. a->handle = Texts_HandleAlien;
  1364. a->base = *Load0__16_s->T;
  1365. a->file = *Load0__16_s->f;
  1366. a->org = org;
  1367. a->span = span;
  1368. __COPY((*Load0__16_s->mods)[__X(eno, 64)], a->mod, 32);
  1369. __COPY((*Load0__16_s->procs)[__X(eno, 64)], a->proc, 32);
  1370. *e = (Texts_Elem)a;
  1371. }
  1372. }
  1373. static void Texts_Load0 (Files_Rider *r, ADDRESS *r__typ, Texts_Text T)
  1374. {
  1375. Texts_Run u = NIL, un = NIL;
  1376. Texts_Piece p = NIL;
  1377. Texts_Elem e = NIL;
  1378. INT32 org, pos, hlen, plen;
  1379. INT8 ecnt, fcnt, fno, col, voff;
  1380. Files_File f = NIL;
  1381. Texts_FileMsg msg;
  1382. CHAR mods[64][32], procs[64][32];
  1383. CHAR name[32];
  1384. Texts_FontsFont fnts[32];
  1385. struct Load0__16 _s;
  1386. _s.T = &T;
  1387. _s.ecnt = &ecnt;
  1388. _s.f = &f;
  1389. _s.msg = &msg;
  1390. _s.mods = (void*)mods;
  1391. _s.procs = (void*)procs;
  1392. _s.lnk = Load0__16_s;
  1393. Load0__16_s = &_s;
  1394. pos = Files_Pos(&*r, r__typ);
  1395. f = Files_Base(&*r, r__typ);
  1396. __NEW(u, Texts_RunDesc);
  1397. u->len = 2147483647;
  1398. u->fnt = NIL;
  1399. u->col = 15;
  1400. T->head = u;
  1401. ecnt = 0;
  1402. fcnt = 0;
  1403. msg.id = 0;
  1404. msg.r = *r;
  1405. Files_ReadLInt(&msg.r, Files_Rider__typ, &hlen);
  1406. org = (pos - 2) + hlen;
  1407. pos = org;
  1408. Files_Read(&msg.r, Files_Rider__typ, (void*)&fno);
  1409. while (fno != 0) {
  1410. if (fno > fcnt) {
  1411. fcnt = fno;
  1412. Files_ReadString(&msg.r, Files_Rider__typ, (void*)name, 32);
  1413. fnts[__X(fno, 32)] = Texts_FontsThis((void*)name, 32);
  1414. }
  1415. Files_Read(&msg.r, Files_Rider__typ, (void*)&col);
  1416. Files_Read(&msg.r, Files_Rider__typ, (void*)&voff);
  1417. Files_ReadLInt(&msg.r, Files_Rider__typ, &plen);
  1418. if (plen > 0) {
  1419. __NEW(p, Texts_PieceDesc);
  1420. p->file = f;
  1421. p->org = pos;
  1422. p->ascii = 0;
  1423. un = (Texts_Run)p;
  1424. un->len = plen;
  1425. } else {
  1426. LoadElem__17(&msg.r, Files_Rider__typ, pos - org, -plen, &e);
  1427. un = (Texts_Run)e;
  1428. un->len = 1;
  1429. }
  1430. un->col = col;
  1431. un->voff = voff;
  1432. pos += un->len;
  1433. u->next = un;
  1434. un->prev = u;
  1435. u = un;
  1436. Files_Read(&msg.r, Files_Rider__typ, (void*)&fno);
  1437. }
  1438. u->next = T->head;
  1439. T->head->prev = u;
  1440. T->cache = T->head;
  1441. T->corg = 0;
  1442. Files_ReadLInt(&msg.r, Files_Rider__typ, &T->len);
  1443. Files_Set(&*r, r__typ, f, Files_Pos(&msg.r, Files_Rider__typ) + T->len);
  1444. Load0__16_s = _s.lnk;
  1445. }
  1446. void Texts_Load (Files_Rider *r, ADDRESS *r__typ, Texts_Text T)
  1447. {
  1448. INT16 tag;
  1449. Files_ReadInt(&*r, r__typ, &tag);
  1450. if (tag != -4095) {
  1451. Files_Set(&*r, r__typ, Files_Base(&*r, r__typ), Files_Pos(&*r, r__typ) - 2);
  1452. }
  1453. Texts_Load0(&*r, r__typ, T);
  1454. }
  1455. void Texts_Open (Texts_Text T, CHAR *name, ADDRESS name__len)
  1456. {
  1457. Files_File f = NIL;
  1458. Files_Rider r;
  1459. Texts_Run u = NIL;
  1460. Texts_Piece p = NIL;
  1461. CHAR tag, version;
  1462. INT32 hlen;
  1463. __DUP(name, name__len, CHAR);
  1464. f = Files_Old(name, name__len);
  1465. if (f == NIL) {
  1466. f = Files_New((CHAR*)"", 1);
  1467. }
  1468. Files_Set(&r, Files_Rider__typ, f, 0);
  1469. Files_Read(&r, Files_Rider__typ, (void*)&tag);
  1470. Files_Read(&r, Files_Rider__typ, (void*)&version);
  1471. if (tag == 0xf0 || (tag == 0x01 && version == 0xf0)) {
  1472. Texts_Load0(&r, Files_Rider__typ, T);
  1473. } else {
  1474. __NEW(u, Texts_RunDesc);
  1475. u->len = 2147483647;
  1476. u->fnt = NIL;
  1477. u->col = 15;
  1478. __NEW(p, Texts_PieceDesc);
  1479. if ((tag == 0xf7 && version == 0x07)) {
  1480. Files_Set(&r, Files_Rider__typ, f, 28);
  1481. Files_ReadLInt(&r, Files_Rider__typ, &hlen);
  1482. Files_Set(&r, Files_Rider__typ, f, 22 + hlen);
  1483. Files_ReadLInt(&r, Files_Rider__typ, &T->len);
  1484. p->org = 26 + hlen;
  1485. } else {
  1486. T->len = Files_Length(f);
  1487. p->org = 0;
  1488. }
  1489. if (T->len > 0) {
  1490. p->len = T->len;
  1491. p->fnt = Texts_FontsDefault;
  1492. p->col = 15;
  1493. p->voff = 0;
  1494. p->file = f;
  1495. p->ascii = 1;
  1496. u->next = (Texts_Run)p;
  1497. u->prev = (Texts_Run)p;
  1498. p->next = u;
  1499. p->prev = u;
  1500. } else {
  1501. u->next = u;
  1502. u->prev = u;
  1503. }
  1504. T->head = u;
  1505. T->cache = T->head;
  1506. T->corg = 0;
  1507. }
  1508. __DEL(name);
  1509. }
  1510. static struct Store__39 {
  1511. INT8 *ecnt;
  1512. Texts_FileMsg *msg;
  1513. Texts_IdentifyMsg *iden;
  1514. CHAR (*mods)[64][32], (*procs)[64][32];
  1515. struct Store__39 *lnk;
  1516. } *Store__39_s;
  1517. static void StoreElem__40 (Files_Rider *r, ADDRESS *r__typ, INT32 pos, Texts_Elem e);
  1518. static void StoreElem__40 (Files_Rider *r, ADDRESS *r__typ, INT32 pos, Texts_Elem e)
  1519. {
  1520. Files_Rider r1;
  1521. INT32 org, span;
  1522. INT8 eno;
  1523. __COPY((*Store__39_s->iden).mod, (*Store__39_s->mods)[__X(*Store__39_s->ecnt, 64)], 32);
  1524. __COPY((*Store__39_s->iden).proc, (*Store__39_s->procs)[__X(*Store__39_s->ecnt, 64)], 32);
  1525. eno = 1;
  1526. while (__STRCMP((*Store__39_s->mods)[__X(eno, 64)], (*Store__39_s->iden).mod) != 0 || __STRCMP((*Store__39_s->procs)[__X(eno, 64)], (*Store__39_s->iden).proc) != 0) {
  1527. eno += 1;
  1528. }
  1529. Files_Set(&r1, Files_Rider__typ, Files_Base(&*r, r__typ), Files_Pos(&*r, r__typ));
  1530. Files_WriteLInt(&*r, r__typ, 0);
  1531. Files_WriteLInt(&*r, r__typ, 0);
  1532. Files_WriteLInt(&*r, r__typ, 0);
  1533. Files_Write(&*r, r__typ, eno);
  1534. if (eno == *Store__39_s->ecnt) {
  1535. *Store__39_s->ecnt += 1;
  1536. Files_WriteString(&*r, r__typ, (*Store__39_s->iden).mod, 32);
  1537. Files_WriteString(&*r, r__typ, (*Store__39_s->iden).proc, 32);
  1538. }
  1539. (*Store__39_s->msg).pos = pos;
  1540. org = Files_Pos(&*r, r__typ);
  1541. (*e->handle)(e, (void*)&*Store__39_s->msg, Texts_FileMsg__typ);
  1542. span = Files_Pos(&*r, r__typ) - org;
  1543. Files_WriteLInt(&r1, Files_Rider__typ, -span);
  1544. Files_WriteLInt(&r1, Files_Rider__typ, e->W);
  1545. Files_WriteLInt(&r1, Files_Rider__typ, e->H);
  1546. }
  1547. void Texts_Store (Files_Rider *r, ADDRESS *r__typ, Texts_Text T)
  1548. {
  1549. Files_Rider r1;
  1550. Texts_Run u = NIL, un = NIL;
  1551. Texts_Elem e = NIL;
  1552. INT32 org, pos, delta, hlen, rlen;
  1553. INT8 ecnt, fcnt;
  1554. CHAR ch;
  1555. INT8 fno;
  1556. Texts_FileMsg msg;
  1557. Texts_IdentifyMsg iden;
  1558. CHAR mods[64][32], procs[64][32];
  1559. Texts_FontsFont fnts[32];
  1560. CHAR block[1024];
  1561. struct Store__39 _s;
  1562. _s.ecnt = &ecnt;
  1563. _s.msg = &msg;
  1564. _s.iden = &iden;
  1565. _s.mods = (void*)mods;
  1566. _s.procs = (void*)procs;
  1567. _s.lnk = Store__39_s;
  1568. Store__39_s = &_s;
  1569. org = Files_Pos(&*r, r__typ);
  1570. msg.id = 1;
  1571. msg.r = *r;
  1572. Files_WriteLInt(&msg.r, Files_Rider__typ, 0);
  1573. u = T->head->next;
  1574. pos = 0;
  1575. delta = 0;
  1576. fcnt = 1;
  1577. ecnt = 1;
  1578. while (u != T->head) {
  1579. if (__ISP(u, Texts_ElemDesc, 1)) {
  1580. iden.mod[0] = 0x00;
  1581. (*__GUARDP(u, Texts_ElemDesc, 1)->handle)(__GUARDP(u, Texts_ElemDesc, 1), (void*)&iden, Texts_IdentifyMsg__typ);
  1582. } else {
  1583. iden.mod[0] = 0x01;
  1584. }
  1585. if (iden.mod[0] != 0x00) {
  1586. fnts[__X(fcnt, 32)] = u->fnt;
  1587. fno = 1;
  1588. while (__STRCMP(fnts[__X(fno, 32)]->name, u->fnt->name) != 0) {
  1589. fno += 1;
  1590. }
  1591. Files_Write(&msg.r, Files_Rider__typ, fno);
  1592. if (fno == fcnt) {
  1593. fcnt += 1;
  1594. Files_WriteString(&msg.r, Files_Rider__typ, u->fnt->name, 32);
  1595. }
  1596. Files_Write(&msg.r, Files_Rider__typ, u->col);
  1597. Files_Write(&msg.r, Files_Rider__typ, u->voff);
  1598. }
  1599. if (__ISP(u, Texts_PieceDesc, 1)) {
  1600. rlen = u->len;
  1601. un = u->next;
  1602. while ((((((__ISP(un, Texts_PieceDesc, 1) && un->fnt == u->fnt)) && un->col == u->col)) && un->voff == u->voff)) {
  1603. rlen += un->len;
  1604. un = un->next;
  1605. }
  1606. Files_WriteLInt(&msg.r, Files_Rider__typ, rlen);
  1607. pos += rlen;
  1608. u = un;
  1609. } else if (iden.mod[0] != 0x00) {
  1610. StoreElem__40(&msg.r, Files_Rider__typ, pos, __GUARDP(u, Texts_ElemDesc, 1));
  1611. pos += 1;
  1612. u = u->next;
  1613. } else {
  1614. delta += 1;
  1615. u = u->next;
  1616. }
  1617. }
  1618. Files_Write(&msg.r, Files_Rider__typ, 0);
  1619. Files_WriteLInt(&msg.r, Files_Rider__typ, T->len - delta);
  1620. hlen = (Files_Pos(&msg.r, Files_Rider__typ) - org) + 2;
  1621. Files_Set(&r1, Files_Rider__typ, Files_Base(&msg.r, Files_Rider__typ), org);
  1622. Files_WriteLInt(&r1, Files_Rider__typ, hlen);
  1623. u = T->head->next;
  1624. while (u != T->head) {
  1625. if (__ISP(u, Texts_PieceDesc, 1)) {
  1626. if (__ISP(u, Texts_PieceDesc, 1)) {
  1627. if ((*(Texts_Piece*)&u)->ascii) {
  1628. Files_Set(&r1, Files_Rider__typ, (*(Texts_Piece*)&u)->file, (*(Texts_Piece*)&u)->org);
  1629. delta = (*(Texts_Piece*)&u)->len;
  1630. while (delta > 0) {
  1631. Files_Read(&r1, Files_Rider__typ, (void*)&ch);
  1632. delta -= 1;
  1633. if (ch == 0x0a) {
  1634. Files_Write(&msg.r, Files_Rider__typ, 0x0d);
  1635. } else {
  1636. Files_Write(&msg.r, Files_Rider__typ, ch);
  1637. }
  1638. }
  1639. } else {
  1640. Files_Set(&r1, Files_Rider__typ, (*(Texts_Piece*)&u)->file, (*(Texts_Piece*)&u)->org);
  1641. delta = (*(Texts_Piece*)&u)->len;
  1642. while (delta > 1024) {
  1643. Files_ReadBytes(&r1, Files_Rider__typ, (void*)block, 1024, 1024);
  1644. Files_WriteBytes(&msg.r, Files_Rider__typ, (void*)block, 1024, 1024);
  1645. delta -= 1024;
  1646. }
  1647. Files_ReadBytes(&r1, Files_Rider__typ, (void*)block, 1024, delta);
  1648. Files_WriteBytes(&msg.r, Files_Rider__typ, (void*)block, 1024, delta);
  1649. }
  1650. } else __WITHCHK;
  1651. } else {
  1652. iden.mod[0] = 0x00;
  1653. (*__GUARDP(u, Texts_ElemDesc, 1)->handle)(__GUARDP(u, Texts_ElemDesc, 1), (void*)&iden, Texts_IdentifyMsg__typ);
  1654. if (iden.mod[0] != 0x00) {
  1655. Files_Write(&msg.r, Files_Rider__typ, 0x1c);
  1656. }
  1657. }
  1658. u = u->next;
  1659. }
  1660. __GUARDEQR(r, r__typ, Files_Rider) = msg.r;
  1661. if (T->notify != NIL) {
  1662. (*T->notify)(T, 3, 0, 0);
  1663. }
  1664. Store__39_s = _s.lnk;
  1665. }
  1666. void Texts_Close (Texts_Text T, CHAR *name, ADDRESS name__len)
  1667. {
  1668. Files_File f = NIL;
  1669. Files_Rider r;
  1670. INT16 i, res;
  1671. CHAR bak[64];
  1672. __DUP(name, name__len, CHAR);
  1673. f = Files_New(name, name__len);
  1674. Files_Set(&r, Files_Rider__typ, f, 0);
  1675. Files_Write(&r, Files_Rider__typ, 0xf0);
  1676. Files_Write(&r, Files_Rider__typ, 0x01);
  1677. Texts_Store(&r, Files_Rider__typ, T);
  1678. i = 0;
  1679. while (name[__X(i, name__len)] != 0x00) {
  1680. i += 1;
  1681. }
  1682. __COPY(name, bak, 64);
  1683. bak[__X(i, 64)] = '.';
  1684. bak[__X(i + 1, 64)] = 'B';
  1685. bak[__X(i + 2, 64)] = 'a';
  1686. bak[__X(i + 3, 64)] = 'k';
  1687. bak[__X(i + 4, 64)] = 0x00;
  1688. Files_Rename(name, name__len, bak, 64, &res);
  1689. Files_Register(f);
  1690. __DEL(name);
  1691. }
  1692. static void EnumPtrs(void (*P)(void*))
  1693. {
  1694. P(Texts_new);
  1695. P(Texts_del);
  1696. P(Texts_FontsDefault);
  1697. }
  1698. __TDESC(Texts_FontDesc, 1, 0) = {__TDFLDS("FontDesc", 32), {-4}};
  1699. __TDESC(Texts_RunDesc, 1, 3) = {__TDFLDS("RunDesc", 20), {0, 4, 12, -16}};
  1700. __TDESC(Texts_PieceDesc, 1, 4) = {__TDFLDS("PieceDesc", 28), {0, 4, 12, 20, -20}};
  1701. __TDESC(Texts_ElemMsg, 1, 0) = {__TDFLDS("ElemMsg", 1), {-4}};
  1702. __TDESC(Texts_ElemDesc, 1, 4) = {__TDFLDS("ElemDesc", 36), {0, 4, 12, 32, -20}};
  1703. __TDESC(Texts_FileMsg, 1, 1) = {__TDFLDS("FileMsg", 28), {16, -8}};
  1704. __TDESC(Texts_CopyMsg, 1, 1) = {__TDFLDS("CopyMsg", 4), {0, -8}};
  1705. __TDESC(Texts_IdentifyMsg, 1, 0) = {__TDFLDS("IdentifyMsg", 64), {-4}};
  1706. __TDESC(Texts_BufDesc, 1, 1) = {__TDFLDS("BufDesc", 8), {4, -8}};
  1707. __TDESC(Texts_TextDesc, 1, 2) = {__TDFLDS("TextDesc", 20), {8, 12, -12}};
  1708. __TDESC(Texts_Reader, 1, 4) = {__TDFLDS("Reader", 48), {4, 12, 24, 36, -20}};
  1709. __TDESC(Texts_Scanner, 1, 4) = {__TDFLDS("Scanner", 140), {4, 12, 24, 36, -20}};
  1710. __TDESC(Texts_Writer, 1, 4) = {__TDFLDS("Writer", 36), {0, 4, 20, 32, -20}};
  1711. __TDESC(Texts__1, 1, 5) = {__TDFLDS("", 112), {0, 4, 12, 32, 36, -24}};
  1712. export void *Texts__init(void)
  1713. {
  1714. __DEFMOD;
  1715. __MODULE_IMPORT(Files);
  1716. __MODULE_IMPORT(Modules);
  1717. __MODULE_IMPORT(Out);
  1718. __MODULE_IMPORT(Reals);
  1719. __REGMOD("Texts", EnumPtrs);
  1720. __INITYP(Texts_FontDesc, Texts_FontDesc, 0);
  1721. __INITYP(Texts_RunDesc, Texts_RunDesc, 0);
  1722. __INITYP(Texts_PieceDesc, Texts_RunDesc, 1);
  1723. __INITYP(Texts_ElemMsg, Texts_ElemMsg, 0);
  1724. __INITYP(Texts_ElemDesc, Texts_RunDesc, 1);
  1725. __INITYP(Texts_FileMsg, Texts_ElemMsg, 1);
  1726. __INITYP(Texts_CopyMsg, Texts_ElemMsg, 1);
  1727. __INITYP(Texts_IdentifyMsg, Texts_ElemMsg, 1);
  1728. __INITYP(Texts_BufDesc, Texts_BufDesc, 0);
  1729. __INITYP(Texts_TextDesc, Texts_TextDesc, 0);
  1730. __INITYP(Texts_Reader, Texts_Reader, 0);
  1731. __INITYP(Texts_Scanner, Texts_Reader, 1);
  1732. __INITYP(Texts_Writer, Texts_Writer, 0);
  1733. __INITYP(Texts__1, Texts_ElemDesc, 2);
  1734. /* BEGIN */
  1735. Texts_del = NIL;
  1736. __NEW(Texts_FontsDefault, Texts_FontDesc);
  1737. __MOVE("Syntax10.Scn.Fnt", Texts_FontsDefault->name, 17);
  1738. __ENDMOD;
  1739. }