Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

492 lines
14 KiB

  1. /* File: D:\WACKER\emu\autoinit.c (Created: 28-Feb-1994)
  2. *
  3. * Copyright 1994 by Hilgraeve Inc. -- Monroe, MI
  4. * All rights reserved
  5. *
  6. * $Revision: 1 $
  7. * $Date: 10/05/98 12:28p $
  8. */
  9. #include <windows.h>
  10. #pragma hdrstop
  11. #include <tdll\stdtyp.h>
  12. #include <tdll\session.h>
  13. #include <tdll\cloop.h>
  14. #include <tdll\assert.h>
  15. #include <tdll\mc.h>
  16. #include <tdll\backscrl.h>
  17. #include "emu.h"
  18. #include "emu.hh"
  19. #include "emuid.h"
  20. #include "ansi.hh"
  21. #include "viewdata.hh"
  22. #include "minitel.hh"
  23. #include "keytbls.h"
  24. static void emuAutoNothingVT52(const HHEMU hhEmu);
  25. static void emuAutoVT52toAnsi(const HHEMU hhEmu);
  26. static void emuAutoAnsiEdVT52(const HHEMU hhEmu);
  27. static void emuAutoAnsiElVT52(const HHEMU hhEmu);
  28. static void emuAutoCharPnVT52(const HHEMU hhEmu);
  29. static void emuAutoNothingVT100(const HHEMU hhEmu);
  30. static void emuAutoScs1VT100(const HHEMU hhEmu);
  31. static void emuAutoSaveCursorVT100(const HHEMU hhEmu);
  32. static void emuAutoAnsiPnEndVT100(const HHEMU hhEmu);
  33. static void emuAutoResetVT100(const HHEMU hhEmu);
  34. static void emuAutoAnsiDaVT100(const HHEMU hhEmu);
  35. static void emuAutoReportVT100(const HHEMU hhEmu);
  36. static void emuAutoNothingViewdata(const HHEMU hhEmu);
  37. static void emuAutoSetAttrViewdata(const HHEMU hhEmu);
  38. static void emuAutoNothingAnsi(const HHEMU hhEmu);
  39. static void emuAutoScrollAnsi(const HHEMU hhEmu);
  40. static void emuAutoSaveCurAnsi(const HHEMU hhEmu);
  41. static void emuAutoPnAnsi(const HHEMU hhEmu);
  42. static void emuAutoDoorwayAnsi(const HHEMU hhEmu);
  43. static void emuAutoNothingMinitel(const HHEMU hhEmu);
  44. static void emuAutoMinitelCharAttr(const HHEMU hhEmu);
  45. static void emuAutoMinitelFieldAttr(const HHEMU hhEmu);
  46. static void emuAutoMinitelCursorReport(const HHEMU hhEmu);
  47. /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  48. * emuAutoInit
  49. *
  50. * DESCRIPTION:
  51. *
  52. * ARGUMENTS:
  53. *
  54. * RETURNS:
  55. * nothing
  56. */
  57. void emuAutoInit(const HHEMU hhEmu)
  58. {
  59. PSTANSIPRIVATE pstPRI;
  60. static struct trans_entry const astfAutoAnsiTable[] =
  61. {
  62. // State 0
  63. //
  64. // Ansi emulation occupies all of state 0 codes.
  65. //
  66. {NEW_STATE, 0, 0, 0},
  67. #if !defined(FAR_EAST)
  68. {0, ETEXT('\x20'), ETEXT('\xFF'), emuStdGraphic}, // Space - All
  69. #else
  70. {0, ETEXT('\x20'), 0xFFFF, emuStdGraphic}, // Space - All
  71. #endif
  72. {1, ETEXT('\x1B'), ETEXT('\x1B'), nothing}, // Esc
  73. {0, ETEXT('\x05'), ETEXT('\x05'), vt100_answerback}, // Ctrl-E
  74. {0, ETEXT('\x07'), ETEXT('\x07'), emu_bell}, // Ctrl-G
  75. {0, ETEXT('\x08'), ETEXT('\x08'), backspace}, // Backspace
  76. {0, ETEXT('\x09'), ETEXT('\x09'), tabn}, // Tab
  77. {0, ETEXT('\x0A'), ETEXT('\x0B'), emuLineFeed}, // NL - VT
  78. {0, ETEXT('\x0C'), ETEXT('\x0C'), AnsiFormFeed}, // Form Feed
  79. {0, ETEXT('\x0D'), ETEXT('\x0D'), carriagereturn}, // CR
  80. {3, ETEXT('\x18'), ETEXT('\x18'), EmuStdChkZmdm}, // Ctrl-X
  81. {0, ETEXT('\x00'), ETEXT('\x1F'), emuStdGraphic}, // All Ctrl's
  82. //
  83. // State 1
  84. // At this point, an ESC has been seen.
  85. //
  86. {NEW_STATE, 0, 0, 0}, // Esc
  87. {2, ETEXT('\x5B'), ETEXT('\x5B'), ANSI_Pn_Clr}, // [
  88. {0, ETEXT('\x44'), ETEXT('\x44'), ANSI_IND}, // D
  89. {0, ETEXT('\x45'), ETEXT('\x45'), ANSI_NEL}, // E
  90. {0, ETEXT('\x48'), ETEXT('\x48'), ANSI_HTS}, // H
  91. {0, ETEXT('\x4D'), ETEXT('\x4D'), ANSI_RI}, // M
  92. //
  93. // Autodetect sequences for for VT52, State 1.
  94. //
  95. {2, ETEXT('\x59'), ETEXT('\x59'), emuAutoNothingVT52}, // Y
  96. {0, ETEXT('\x3C'), ETEXT('\x3C'), emuAutoVT52toAnsi}, // <
  97. {0, ETEXT('\x4A'), ETEXT('\x4A'), emuAutoAnsiEdVT52}, // J
  98. {0, ETEXT('\x4B'), ETEXT('\x4B'), emuAutoAnsiElVT52}, // K
  99. //
  100. // Autodetect sequences for for VT100, State 1.
  101. //
  102. #if !defined(INCL_MINITEL)
  103. {3, ETEXT('\x23'), ETEXT('\x23'), emuAutoNothingVT100}, // #
  104. #endif
  105. {4, ETEXT('\x28'), ETEXT('\x29'), emuAutoScs1VT100}, // ( - )
  106. {0, ETEXT('\x38'), ETEXT('\x38'), emuAutoSaveCursorVT100},// 8
  107. #if !defined(INCL_MINITEL)
  108. {1, ETEXT('\x3B'), ETEXT('\x3B'), emuAutoAnsiPnEndVT100}, // ;
  109. #endif
  110. {0, ETEXT('\x63'), ETEXT('\x63'), emuAutoResetVT100}, // c
  111. //
  112. // Autodetect sequences for for Viewdata, State 1.
  113. //
  114. #if defined(INCL_VIEWDATA)
  115. {0, ETEXT('\x31'), ETEXT('\x34'), emuAutoNothingViewdata},// 1 - 4
  116. #endif
  117. //
  118. // Autodetect sequences for for Minitel, State 1.
  119. //
  120. #if defined(INCL_MINITEL)
  121. //{1, ETEXT('\x00'), ETEXT('\x00'), emuAutoNothingMinitel},
  122. //{14,ETEXT('\x25'), ETEXT('\x25'), emuAutoNothingMinitel},
  123. //{13,ETEXT('\x35'), ETEXT('\x37'), emuAutoNothingMinitel}, // eat ESC,35-37,X sequences
  124. //{6, ETEXT('\x39'), ETEXT('\x39'), emuAutoNothingMinitel}, // PROT1, p134
  125. {7, ETEXT('\x3A'), ETEXT('\x3A'), emuAutoNothingMinitel}, // PROT2, p134
  126. {0, ETEXT('\x40'), ETEXT('\x43'), emuAutoMinitelCharAttr}, // forground color, flashing
  127. //{0, ETEXT('\x4C'), ETEXT('\x4C'), emuAutoMinitelCharAttr}, // char width & height
  128. //{0, ETEXT('\x4E'), ETEXT('\x4E'), emuAutoMinitelCharAttr}, // char width & height
  129. //{0, ETEXT('\x4F'), ETEXT('\x4F'), emuAutoMinitelCharAttr}, // char width & height
  130. //{0, ETEXT('\x50'), ETEXT('\x59'), emuAutoMinitelFieldAttr}, // background, underlining
  131. //{0, ETEXT('\x5F'), ETEXT('\x5F'), emuAutoMinitelFieldAttr}, // reveal display
  132. //{0, ETEXT('\x5C'), ETEXT('\x5D'), emuAutoMinitelCharAttr}, // inverse
  133. //{0, ETEXT('\x61'), ETEXT('\x61'), emuAutoMinitelCursorReport},
  134. #endif
  135. //
  136. // State 2
  137. //
  138. {NEW_STATE, 0, 0, 0}, // Esc[
  139. {2, ETEXT('\x30'), ETEXT('\x39'), ANSI_Pn}, // 0 - 9
  140. {2, ETEXT('\x3B'), ETEXT('\x3B'), ANSI_Pn_End}, // ;
  141. {5, ETEXT('\x3D'), ETEXT('\x3D'), nothing}, // =
  142. {2, ETEXT('\x3A'), ETEXT('\x3F'), ANSI_Pn}, // : - ?
  143. {0, ETEXT('\x41'), ETEXT('\x41'), ANSI_CUU}, // A
  144. {0, ETEXT('\x42'), ETEXT('\x42'), ANSI_CUD}, // B
  145. {0, ETEXT('\x43'), ETEXT('\x43'), ANSI_CUF}, // C
  146. {0, ETEXT('\x44'), ETEXT('\x44'), ANSI_CUB}, // D
  147. {0, ETEXT('\x48'), ETEXT('\x48'), ANSI_CUP}, // H
  148. {0, ETEXT('\x4A'), ETEXT('\x4A'), ANSI_ED}, // J
  149. {0, ETEXT('\x4B'), ETEXT('\x4B'), ANSI_EL}, // K
  150. {0, ETEXT('\x4C'), ETEXT('\x4C'), ANSI_IL}, // L
  151. {0, ETEXT('\x4D'), ETEXT('\x4D'), ANSI_DL}, // M
  152. {0, ETEXT('\x50'), ETEXT('\x50'), ANSI_DCH}, // P
  153. {0, ETEXT('\x66'), ETEXT('\x66'), ANSI_CUP}, // f
  154. {0, ETEXT('\x67'), ETEXT('\x67'), ANSI_TBC}, // g
  155. {0, ETEXT('\x68'), ETEXT('\x68'), ansi_setmode}, // h
  156. {0, ETEXT('\x69'), ETEXT('\x69'), vt100PrintCommands}, // i
  157. {0, ETEXT('\x6C'), ETEXT('\x6C'), ansi_resetmode}, // l
  158. {0, ETEXT('\x6D'), ETEXT('\x6D'), ANSI_SGR}, // m
  159. {0, ETEXT('\x6E'), ETEXT('\x6E'), ANSI_DSR}, // n
  160. {0, ETEXT('\x70'), ETEXT('\x70'), emuAutoNothingAnsi}, // p
  161. {0, ETEXT('\x72'), ETEXT('\x72'), emuAutoScrollAnsi}, // r
  162. {0, ETEXT('\x73'), ETEXT('\x73'), emuAutoSaveCurAnsi}, // s
  163. {0, ETEXT('\x75'), ETEXT('\x75'), ansi_savecursor}, // u
  164. //
  165. //Autodetect sequences for for VT52, State 2.
  166. //
  167. {3, ETEXT('\x20'), ETEXT('\x20'), emuAutoCharPnVT52}, // Space
  168. {3, ETEXT('\x22'), ETEXT('\x22'), emuAutoCharPnVT52}, // "
  169. {3, ETEXT('\x24'), ETEXT('\x2F'), emuAutoCharPnVT52}, // $ - /
  170. //
  171. // Autodetect sequences for for VT100, State 2.
  172. //
  173. {0, ETEXT('\x63'), ETEXT('\x63'), emuAutoAnsiDaVT100}, // c
  174. {0, ETEXT('\x71'), ETEXT('\x71'), emuAutoNothingVT100}, // q
  175. {0, ETEXT('\x78'), ETEXT('\x78'), emuAutoReportVT100}, // x
  176. //
  177. // State 3
  178. //
  179. {NEW_STATE, 0, 0, 0},
  180. {3, ETEXT('\x00'), ETEXT('\xFF'), EmuStdChkZmdm}, // All
  181. //
  182. // State 4
  183. //
  184. {NEW_STATE, 0, 0, 0},
  185. {4, ETEXT('\x00'), ETEXT('\xFF'), nothing}, // All
  186. //
  187. // State 5
  188. //
  189. {NEW_STATE, 0, 0, 0},
  190. {5, ETEXT('\x32'), ETEXT('\x32'), emuAutoPnAnsi}, // 2
  191. {5, ETEXT('\x35'), ETEXT('\x35'), emuAutoPnAnsi}, // 5
  192. {0, ETEXT('\x68'), ETEXT('\x68'), emuAutoDoorwayAnsi}, // h
  193. {0, ETEXT('\x6C'), ETEXT('\x6C'), emuAutoDoorwayAnsi}, // l
  194. //
  195. // Autodetect sequences for for VT100, State 5.
  196. //
  197. {0, ETEXT('\x70'), ETEXT('\x70'), emuAutoNothingVT100}, // p
  198. //
  199. // Autodetect sequences for for VT52, State 5.
  200. //
  201. {0, ETEXT('\x00'), ETEXT('\xFF'), EmuStdChkZmdm}, // All
  202. //
  203. // State 6
  204. //
  205. {NEW_STATE, 0, 0, 0},
  206. //
  207. // Autodetect sequences for for VT52, VT100, State 6.
  208. //
  209. {6, ETEXT('\x00'), ETEXT('\xFF'), nothing}, // All
  210. //
  211. // State 7
  212. //
  213. // Autodetect sequences for for VT100, State 7.
  214. //
  215. {NEW_STATE, 0, 0, 0},
  216. {7, ETEXT('\x00'), ETEXT('\xFF'), EmuStdChkZmdm}, // All
  217. //
  218. // State 8
  219. //
  220. // Autodetect sequences for for VT100, State 8.
  221. //
  222. {NEW_STATE, 0, 0, 0},
  223. {8, ETEXT('\x00'), ETEXT('\xFF'), nothing}, // All
  224. };
  225. emuInstallStateTable(hhEmu, astfAutoAnsiTable, DIM(astfAutoAnsiTable));
  226. // Allocate space for and initialize data that is used only by the
  227. // Auto ANSI emulator.
  228. //
  229. hhEmu->pvPrivate = malloc(sizeof(ANSIPRIVATE));
  230. if (hhEmu->pvPrivate == 0)
  231. {
  232. assert(FALSE);
  233. return;
  234. }
  235. pstPRI = (PSTANSIPRIVATE)hhEmu->pvPrivate;
  236. memset(pstPRI, 0, sizeof(ANSIPRIVATE));
  237. hhEmu->emuResetTerminal = emuAnsiReset;
  238. // The Auto Detect emulator is ANSI based. So, do the same
  239. // stuff we do when initializing the ANSI emulator.
  240. //
  241. emuKeyTableLoad(hhEmu, AnsiKeyTable,
  242. sizeof(AnsiKeyTable)/sizeof(KEYTBLSTORAGE),
  243. &hhEmu->stEmuKeyTbl);
  244. emuKeyTableLoad(hhEmu, IBMPCKeyTable,
  245. sizeof(IBMPCKeyTable)/sizeof(KEYTBLSTORAGE),
  246. &hhEmu->stEmuKeyTbl2);
  247. hhEmu->emu_kbdin = ansi_kbdin;
  248. hhEmu->emu_deinstall = emuAnsiUnload;
  249. emuAnsiReset(hhEmu, FALSE);
  250. #if !defined(FAR_EAST)
  251. hhEmu->emu_highchar = (ECHAR)0xFF;
  252. #else
  253. hhEmu->emu_highchar = (ECHAR)0xFFFF;
  254. #endif
  255. backscrlSetShowFlag(sessQueryBackscrlHdl(hhEmu->hSession), TRUE);
  256. return;
  257. }
  258. // Ansi Auto Detect Functions.
  259. //
  260. void emuAutoNothingAnsi(const HHEMU hhEmu)
  261. {
  262. #if !defined(FAR_EAST)
  263. emuAutoDetectLoad(hhEmu, EMU_ANSI);
  264. #else
  265. emuAutoDetectLoad(hhEmu, EMU_ANSIW);
  266. #endif
  267. nothing(hhEmu);
  268. return;
  269. }
  270. void emuAutoScrollAnsi(const HHEMU hhEmu)
  271. {
  272. #if !defined(FAR_EAST)
  273. emuAutoDetectLoad(hhEmu, EMU_ANSI);
  274. #else
  275. emuAutoDetectLoad(hhEmu, EMU_ANSIW);
  276. #endif
  277. vt_scrollrgn(hhEmu);
  278. return;
  279. }
  280. void emuAutoSaveCurAnsi(const HHEMU hhEmu)
  281. {
  282. #if !defined(FAR_EAST)
  283. emuAutoDetectLoad(hhEmu, EMU_ANSI);
  284. #else
  285. emuAutoDetectLoad(hhEmu, EMU_ANSIW);
  286. #endif
  287. ansi_savecursor(hhEmu);
  288. return;
  289. }
  290. void emuAutoPnAnsi(const HHEMU hhEmu)
  291. {
  292. #if !defined(FAR_EAST)
  293. emuAutoDetectLoad(hhEmu, EMU_ANSI);
  294. #else
  295. emuAutoDetectLoad(hhEmu, EMU_ANSIW);
  296. #endif
  297. ANSI_Pn(hhEmu);
  298. return;
  299. }
  300. void emuAutoDoorwayAnsi(const HHEMU hhEmu)
  301. {
  302. #if !defined(FAR_EAST)
  303. emuAutoDetectLoad(hhEmu, EMU_ANSI);
  304. #else
  305. emuAutoDetectLoad(hhEmu, EMU_ANSIW);
  306. #endif
  307. DoorwayMode(hhEmu);
  308. return;
  309. }
  310. // VT52 Auto Detect Functions.
  311. //
  312. void emuAutoNothingVT52(const HHEMU hhEmu)
  313. {
  314. emuAutoDetectLoad(hhEmu, EMU_VT52);
  315. return;
  316. }
  317. void emuAutoVT52toAnsi(const HHEMU hhEmu)
  318. {
  319. emuAutoDetectLoad(hhEmu, EMU_VT52);
  320. vt52_toANSI(hhEmu);
  321. return;
  322. }
  323. void emuAutoAnsiEdVT52(const HHEMU hhEmu)
  324. {
  325. emuAutoDetectLoad(hhEmu, EMU_VT52);
  326. ANSI_ED(hhEmu);
  327. return;
  328. }
  329. void emuAutoAnsiElVT52(const HHEMU hhEmu)
  330. {
  331. emuAutoDetectLoad(hhEmu, EMU_VT52);
  332. ANSI_EL(hhEmu);
  333. return;
  334. }
  335. void emuAutoCharPnVT52(const HHEMU hhEmu)
  336. {
  337. emuAutoDetectLoad(hhEmu, EMU_VT52);
  338. char_pn(hhEmu);
  339. return;
  340. }
  341. // VT100 Auto Detect Functions.
  342. //
  343. void emuAutoNothingVT100(const HHEMU hhEmu)
  344. {
  345. #if !defined(FAR_EAST)
  346. emuAutoDetectLoad(hhEmu, EMU_VT100);
  347. #else
  348. emuAutoDetectLoad(hhEmu, EMU_VT100J);
  349. #endif
  350. return;
  351. }
  352. void emuAutoScs1VT100(const HHEMU hhEmu)
  353. {
  354. #if !defined(FAR_EAST)
  355. emuAutoDetectLoad(hhEmu, EMU_VT100);
  356. #else
  357. emuAutoDetectLoad(hhEmu, EMU_VT100J);
  358. #endif
  359. vt_scs1(hhEmu);
  360. return;
  361. }
  362. void emuAutoSaveCursorVT100(const HHEMU hhEmu)
  363. {
  364. #if !defined(FAR_EAST)
  365. emuAutoDetectLoad(hhEmu, EMU_VT100);
  366. #else
  367. emuAutoDetectLoad(hhEmu, EMU_VT100J);
  368. #endif
  369. vt100_savecursor(hhEmu);
  370. return;
  371. }
  372. void emuAutoAnsiPnEndVT100(const HHEMU hhEmu)
  373. {
  374. #if !defined(FAR_EAST)
  375. emuAutoDetectLoad(hhEmu, EMU_VT100);
  376. #else
  377. emuAutoDetectLoad(hhEmu, EMU_VT100J);
  378. #endif
  379. ANSI_Pn_End(hhEmu);
  380. return;
  381. }
  382. void emuAutoResetVT100(const HHEMU hhEmu)
  383. {
  384. #if !defined(FAR_EAST)
  385. emuAutoDetectLoad(hhEmu, EMU_VT100);
  386. #else
  387. emuAutoDetectLoad(hhEmu, EMU_VT100J);
  388. #endif
  389. vt100_hostreset(hhEmu);
  390. return;
  391. }
  392. void emuAutoAnsiDaVT100(const HHEMU hhEmu)
  393. {
  394. #if !defined(FAR_EAST)
  395. emuAutoDetectLoad(hhEmu, EMU_VT100);
  396. #else
  397. emuAutoDetectLoad(hhEmu, EMU_VT100J);
  398. #endif
  399. ANSI_DA(hhEmu);
  400. return;
  401. }
  402. void emuAutoReportVT100(const HHEMU hhEmu)
  403. {
  404. #if !defined(FAR_EAST)
  405. emuAutoDetectLoad(hhEmu, EMU_VT100);
  406. #else
  407. emuAutoDetectLoad(hhEmu, EMU_VT100J);
  408. #endif
  409. vt100_report(hhEmu);
  410. return;
  411. }
  412. #if defined(INCL_VIEWDATA)
  413. // Viewdata Auto Detect Functions.
  414. //
  415. void emuAutoNothingViewdata(const HHEMU hhEmu)
  416. {
  417. emuAutoDetectLoad(hhEmu, EMU_VIEW);
  418. return;
  419. }
  420. void emuAutoSetAttrViewdata(const HHEMU hhEmu)
  421. {
  422. emuAutoDetectLoad(hhEmu, EMU_VIEW);
  423. EmuViewdataSetAttr(hhEmu);
  424. return;
  425. }
  426. #endif // INCL_VIEWDATA
  427. #if defined(INCL_MINITEL)
  428. void emuAutoNothingMinitel(const HHEMU hhEmu)
  429. {
  430. emuAutoDetectLoad(hhEmu, EMU_MINI);
  431. return;
  432. }
  433. void emuAutoMinitelCharAttr(const HHEMU hhEmu)
  434. {
  435. emuAutoDetectLoad(hhEmu, EMU_MINI);
  436. emuMinitelCharAttr(hhEmu);
  437. return;
  438. }
  439. void emuAutoMinitelFieldAttr(const HHEMU hhEmu)
  440. {
  441. emuAutoDetectLoad(hhEmu, EMU_MINI);
  442. emuMinitelFieldAttr(hhEmu);
  443. return;
  444. }
  445. void emuAutoMinitelCursorReport(const HHEMU hhEmu)
  446. {
  447. emuAutoDetectLoad(hhEmu, EMU_MINI);
  448. minitelCursorReport(hhEmu);
  449. return;
  450. }
  451. #endif