CHARIO.C
上传用户:dcs7469208
上传日期:2010-01-02
资源大小:443k
文件大小:9k
源码类别:

操作系统开发

开发平台:

DOS

  1. /****************************************************************/
  2. /*                                                              */
  3. /*                          chario.c                            */
  4. /*                           DOS-C                              */
  5. /*                                                              */
  6. /*    Character device functions and device driver interface    */
  7. /*                                                              */
  8. /*                      Copyright (c) 1994                      */
  9. /*                      Pasquale J. Villani                     */
  10. /*                      All Rights Reserved                     */
  11. /*                                                              */
  12. /* This file is part of DOS-C.                                  */
  13. /*                                                              */
  14. /* DOS-C is free software; you can redistribute it and/or       */
  15. /* modify it under the terms of the GNU General Public License  */
  16. /* as published by the Free Software Foundation; either version */
  17. /* 2, or (at your option) any later version.                    */
  18. /*                                                              */
  19. /* DOS-C is distributed in the hope that it will be useful, but */
  20. /* WITHOUT ANY WARRANTY; without even the implied warranty of   */
  21. /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See    */
  22. /* the GNU General Public License for more details.             */
  23. /*                                                              */
  24. /* You should have received a copy of the GNU General Public    */
  25. /* License along with DOS-C; see the file COPYING.  If not,     */
  26. /* write to the Free Software Foundation, 675 Mass Ave,         */
  27. /* Cambridge, MA 02139, USA.                                    */
  28. /*                                                              */
  29. /****************************************************************/
  30. #include "../../hdr/portab.h"
  31. /* $Logfile:   C:/dos-c/src/fs/chario.c_v  $ */
  32. #ifdef VERSION_STRINGS
  33. static BYTE *charioRcsId = "$Header:   C:/dos-c/src/fs/chario.c_v   1.8   11 Jan 1998  2:06:08   patv  $";
  34. #endif
  35. /* $Log:   C:/dos-c/src/fs/chario.c_v  $
  36.  * 
  37.  *    Rev 1.8   11 Jan 1998  2:06:08   patv
  38.  * Added functionality to ioctl.
  39.  * 
  40.  *    Rev 1.7   08 Jan 1998 21:36:40   patv
  41.  * Changed automatic requestic packets to static to save stack space.
  42.  * 
  43.  *    Rev 1.6   04 Jan 1998 23:14:38   patv
  44.  * Changed Log for strip utility
  45.  * 
  46.  *    Rev 1.5   30 Dec 1997  4:00:20   patv
  47.  * Modified to support SDA
  48.  * 
  49.  *    Rev 1.4   16 Jan 1997 12:46:36   patv
  50.  * pre-Release 0.92 feature additions
  51.  * 
  52.  *    Rev 1.3   29 May 1996 21:15:12   patv
  53.  * bug fixes for v0.91a
  54.  * 
  55.  *    Rev 1.2   01 Sep 1995 17:48:42   patv
  56.  * First GPL release.
  57.  * 
  58.  *    Rev 1.1   30 Jul 1995 20:50:26   patv
  59.  * Eliminated version strings in ipl
  60.  * 
  61.  *    Rev 1.0   02 Jul 1995  8:05:44   patv
  62.  * Initial revision.
  63.  *
  64.  */ 
  65. /* $EndLog$ */
  66. #include "globals.h"
  67. static BYTE *con_name = "CON";
  68. #if !defined(KERNEL) && !defined(IPL)
  69. VOID INRPT FAR 
  70. handle_break (void)
  71. {
  72. }
  73. #endif
  74. #ifdef PROTO
  75. BOOL _sto(COUNT);
  76. VOID kbfill(keyboard FAR *, UCOUNT, BOOL);
  77. struct dhdr FAR *finddev(UWORD attr_mask);
  78. #else
  79. BOOL _sto();
  80. VOID kbfill();
  81. struct dhdr FAR *finddev();
  82. #endif
  83. /*      Return a pointer to the first driver in the chain that 
  84.  *      matches the attributes. 
  85.  */
  86. struct dhdr FAR *finddev(UWORD attr_mask)
  87. {
  88. struct dhdr far *dh;
  89. for (dh = nul_dev.dh_next; FP_OFF(dh) != 0xFFFF; dh = dh -> dh_next)
  90. {
  91.      if (dh -> dh_attr & attr_mask)
  92.  return dh;
  93. }
  94. /* return dev/null if no matching driver found */
  95. return &nul_dev;
  96. }
  97. BYTE *CharName(struct dhdr far *lpDhdr)
  98. {
  99. struct dhdr far *dh;
  100. static BYTE szName[9];
  101. COUNT nIdx;
  102. /* Scan through the device list */
  103. for (dh = nul_dev.dh_next; FP_OFF(dh) != 0xFFFF; dh = dh -> dh_next)
  104. {
  105. if (dh == lpDhdr)
  106. break;
  107. }
  108. /* return name of /dev/null if no matching driver found */
  109. if(FP_OFF(dh) == 0xFFFF)
  110. dh = (struct dhdr far *)&nul_dev;
  111. /* Now convert it to a C string */
  112. for(nIdx = 0; nIdx < 8 && dh -> dh_name[nIdx] != ' '; nIdx++)
  113. szName[nIdx] = dh -> dh_name[nIdx];
  114. szName[nIdx] = '';
  115. return szName;
  116. }
  117. static BOOL 
  118. _sto (COUNT c)
  119. {
  120. BYTE buf = c;
  121. if(con_break())
  122. {
  123. handle_break();
  124. return FALSE;
  125. }
  126. CharReqHdr.r_length = sizeof(request);
  127. CharReqHdr.r_command = C_OUTPUT;
  128. CharReqHdr.r_count = 1;
  129. CharReqHdr.r_trans = (BYTE FAR *)(&buf);
  130. CharReqHdr.r_status = 0;
  131. execrh((request FAR *)&CharReqHdr, (struct dhdr FAR *)finddev(ATTR_STDOUT));
  132. if(CharReqHdr.r_status & S_ERROR)
  133. return char_error(&CharReqHdr, con_name);
  134. return TRUE;
  135. }
  136. VOID 
  137. sto (COUNT c)
  138. {
  139. /* Test for hold char                                   */
  140. con_hold();
  141. /* Display a printable character                        */
  142. if(c != HT)
  143. _sto(c);
  144. if(c == CR)
  145. scr_pos = 0;
  146. else if(c == BS)
  147. {
  148. if(scr_pos > 0)
  149. --scr_pos;
  150. }
  151. else if(c == HT)
  152. {
  153. do
  154. _sto(' ');
  155. while(++scr_pos & 7);
  156. }
  157. else if(c != LF && c != BS)
  158. ++scr_pos;
  159. }
  160. VOID 
  161. mod_sto (REG UCOUNT c)
  162. {
  163. if(c < ' ' && c != HT)
  164. {
  165. sto('^');
  166. sto(c + '@');
  167. }
  168. else
  169. sto(c);
  170. }
  171. VOID 
  172. destr_bs (void)
  173. {
  174. sto(BS);
  175. sto(' ');
  176. sto(BS);
  177. }
  178. UCOUNT 
  179. _sti (void)
  180. {
  181. UBYTE cb;
  182. CharReqHdr.r_length = sizeof(request);
  183. CharReqHdr.r_command = C_INPUT;
  184. CharReqHdr.r_count = 1;
  185. CharReqHdr.r_trans = (BYTE FAR *)&cb;
  186. CharReqHdr.r_status = 0;
  187. execrh((request FAR *)&CharReqHdr, (struct dhdr FAR *)finddev(ATTR_STDIN));
  188. if(CharReqHdr.r_status & S_ERROR)
  189. return char_error(&CharReqHdr, con_name);
  190. if(cb == CTL_C)
  191. {
  192. handle_break();
  193. return CTL_C;
  194. }
  195. else
  196. return cb;
  197. }
  198. VOID 
  199. con_hold (void)
  200. {
  201. CharReqHdr.r_unit = 0;
  202. CharReqHdr.r_status = 0;
  203. CharReqHdr.r_command = C_NDREAD;
  204. CharReqHdr.r_length = sizeof(request);
  205. execrh((request FAR *)&CharReqHdr, (struct dhdr FAR *)finddev(ATTR_STDIN));
  206. if(CharReqHdr.r_status & S_BUSY)
  207. return;
  208. if(CharReqHdr.r_ndbyte == CTL_S)
  209. {
  210. _sti();
  211. while(_sti() != CTL_Q)
  212. /* just wait */;
  213. }
  214. }
  215. BOOL 
  216. con_break (void)
  217. {
  218. CharReqHdr.r_unit = 0;
  219. CharReqHdr.r_status = 0;
  220. CharReqHdr.r_command = C_NDREAD;
  221. CharReqHdr.r_length = sizeof(request);
  222. execrh((request FAR *)&CharReqHdr, (struct dhdr FAR *)finddev(ATTR_STDIN));
  223. if(CharReqHdr.r_status & S_BUSY)
  224. return FALSE;
  225. if(CharReqHdr.r_ndbyte == CTL_C)
  226. {
  227. _sti();
  228. return TRUE;
  229. }
  230. else
  231. return FALSE;
  232. }
  233. BOOL 
  234. KbdBusy (void)
  235. {
  236. CharReqHdr.r_unit = 0;
  237. CharReqHdr.r_status = 0;
  238. CharReqHdr.r_command = C_ISTAT;
  239. CharReqHdr.r_length = sizeof(request);
  240. execrh((request FAR *)&CharReqHdr, (struct dhdr FAR *)finddev(ATTR_STDIN));
  241. if(CharReqHdr.r_status & S_BUSY)
  242. return TRUE;
  243. else
  244. return FALSE;
  245. }
  246. VOID 
  247. KbdFlush (void)
  248. {
  249. CharReqHdr.r_unit = 0;
  250. CharReqHdr.r_status = 0;
  251. CharReqHdr.r_command = C_IFLUSH;
  252. CharReqHdr.r_length = sizeof(request);
  253. execrh((request FAR *)&CharReqHdr, (struct dhdr FAR *)finddev(ATTR_STDIN));
  254. }
  255. static VOID kbfill(kp, c, ctlf)
  256. keyboard FAR *kp;
  257. UCOUNT c;
  258. BOOL ctlf;
  259. {
  260. if(kp -> kb_count > kp -> kb_size)
  261. {
  262. sto(BELL);
  263. return;
  264. }
  265. kp -> kb_buf[kp -> kb_count++] = c;
  266. if(!ctlf)
  267. mod_sto(c);
  268. else
  269. sto(c);
  270. }
  271. VOID sti(kp)
  272. keyboard FAR *kp;
  273. {
  274. REG UWORD c, cu_pos = scr_pos;
  275. WORD init_count = kp -> kb_count;
  276. #ifndef NOSPCL
  277. static BYTE local_buffer[LINESIZE];
  278. #endif
  279. if(kp -> kb_size == 0)
  280. return;
  281. if(kp -> kb_size <= kp -> kb_count || kp -> kb_buf[kp -> kb_count] != CR)
  282. kp -> kb_count = 0;
  283. FOREVER
  284. {
  285. switch(c = _sti())
  286. {
  287. case CTL_F:
  288. continue;
  289. #ifndef NOSPCL
  290. case SPCL:
  291. switch(c = _sti())
  292. {
  293. case LEFT:
  294. goto backspace;
  295. case F3:
  296. {
  297. REG COUNT i;
  298. for(i = kp -> kb_count; local_buffer[i] != ''; i++)
  299. {
  300. c = local_buffer[kp -> kb_count];
  301. if(c == 'r' || c == 'n')
  302. break;
  303. kbfill(kp, c, FALSE);
  304. }
  305. break;
  306. }
  307. case RIGHT:
  308. c = local_buffer[kp -> kb_count];
  309. if(c == 'r' || c == 'n')
  310. break;
  311. kbfill(kp, c, FALSE);
  312. break;
  313. }
  314. break;
  315. #endif
  316. case CTL_BS:
  317. case BS:
  318. backspace:
  319. if(kp -> kb_count > 0)
  320. {
  321. if(kp -> kb_buf[kp -> kb_count - 1] >= ' ')
  322. {
  323. destr_bs();
  324. }
  325. else if((kp -> kb_buf[kp -> kb_count - 1] < ' ')
  326.  && (kp -> kb_buf[kp -> kb_count - 1] != HT))
  327. {
  328. destr_bs();
  329. destr_bs();
  330. }
  331. else if(kp -> kb_buf[kp -> kb_count - 1] == HT)
  332. {
  333. do
  334. {
  335. destr_bs();
  336. }
  337. while((scr_pos > cu_pos) && (scr_pos & 7));
  338. }
  339. --kp -> kb_count;
  340. }
  341. break;
  342. case CR:
  343. kbfill(kp, CR, TRUE);
  344. kbfill(kp, LF, TRUE);
  345. #ifndef NOSPCL
  346. fbcopy((BYTE FAR *)kp -> kb_buf,
  347.  (BYTE FAR *)local_buffer, (COUNT)kp -> kb_count);
  348. local_buffer[kp -> kb_count] = '';
  349. #endif
  350. return;
  351. case LF:
  352. sto(CR);
  353. sto(LF);
  354. break;
  355. case ESC:
  356. sto('\');
  357. sto(CR);
  358. sto(LF);
  359. for(c = 0; c < cu_pos; c++)
  360. sto(' ');
  361. kp -> kb_count = init_count;
  362. break;
  363. default:
  364. kbfill(kp, c, FALSE);
  365. break;
  366. }
  367. }
  368. }