📄 ctest.c
字号:
/*
* CTEST.C
*
* Sample program that uses the Atoms Device Driver (ATMS).
* The program displays a menu from which you can Write only, Read only,
* or Quit. Any other key will cause the program to go into the 'Input->
* Return' mode: It will asked the user for input strings, write them to
* the device, and immediately read back from the device. To get out of
* this mode, press return and the menu will come up again
*
* To communicate with the ATMS driver, we first open it as if it were
* a file, using _sopen. The system will return a handle, with which,
* we can begin communicating to the driver.
*
* By passing a null terminated string to _write, you can do the following
* if string = '<variable>', search for <variable>
* if string = '<variable>=' delete <variable>
* if string = '<variable>=value' insert <variable>
* This allows us to 'browse' the data stored by ATMS.
*
* Calling _read will return the current <variable> text.
*
*/
#include <stdio.h>
#include <dos.h>
#include <share.h>
#include <fcntl.h>
#define LENGTH 140 // defining the length of the buffers
#define inLen LENGTH
#define outLen LENGTH
char InBuffer[LENGTH]; // holds data from keyboard
char OutBuffer[LENGTH]; // holds data from device
void set_raw_mode(int handle),
display_menu(int handle),
do_write(int handle),
do_read(int handle),
test_result(int value);
/*
* main
*
* open the device (with sopen, to allow more than one program to open the
* device at the same time). Set raw mode. Display the menu, allow the user
* to start there. The infinite loop goes like this: print the input prompt,
* accept a string from the user. (see do_write below). If count=1, means that
* only a 'cr' was inputed, so do the menu again. Otherwise, write to the
* device, first eliminating the last 'cr', and read back from the device.
* print out what we read from the device. continue the loop.
*/
main(int argc, char **argv, char **envp)
{
int count, handle, index; /* count holds length of keyboard input string,
handle holds assigned handle to the device */
test_result(handle=_sopen("ATMS",_O_RDWR | _O_BINARY, _SH_DENYNO));
set_raw_mode(handle); /* necessary only if not linking to binmode.obj */
/* Insert the environment elements */
for (index=0;envp[index]!=NULL;index++)
{
printf("%s\n",envp[index]);
test_result(_write(handle,envp[index],strlen(envp[index])));
}
/* Insert the command line arguments */
for (index=1; index<argc; index++)
{
printf("%s\n",argv[index]);
test_result(_write(handle,argv[index],strlen(argv[index])));
}
display_menu(handle);
for (;;)
{
printf("Input? ");
test_result(count=_read(0,OutBuffer,outLen));
if (count==1)
display_menu(handle);
else
{
OutBuffer[--count] = 0;
test_result(_write(handle,OutBuffer,outLen));
do_read(handle);
}
}
}
/*
* do_write
*
* print the Input prompt. Read from the keyboard. We can't do a scanf
* because we want to be able to accept white space in the variable values
* then set the last character of the buffer (which would be a carriage
* return, to be null terminated, a 0. If we didn't do that, then variable
* values would finish with a cr, as would variable names in a search.
* finally, write the result to the device
*/
void do_write(int handle)
{
int count;
printf("Input? ");
test_result(count=_read(0,OutBuffer,outLen));
OutBuffer[--count] = 0;
test_result(_write(handle,OutBuffer,outLen));
}
/*
* do_read
*
* read from the device into the InBuffer, which has inLen.
* count will hold the actual number of bytes transferred.
* print the input buffer out. since count from read include the '\0',
* decrement count before printing it.
*/
void do_read(int handle)
{
int count;
test_result(count=_read(handle,InBuffer,inLen));
printf("\nReturn(%d): %s\n\n",--count,InBuffer);
}
/*
* display_menu
*
* Displays the simple menu, waits for a character. If 1 or 2, do a Write or
* a Read only. 0 closes the device and quits. Any other key, return
*/
void display_menu(int handle)
{
static char *menu ="\n\tATMS device driver Sample\n\tSelect Device Function\
\n\n\t1. Write to Device Only\n\t2. Read from Device Only\n\t0. Quit\n\
\tOther Keys: Write & Read\n\t\t Until Return\n";
char ch;
printf("%s",menu);
for (;;)
{
printf("\n Please press a key: ");
ch=getch();
printf("%c \n\n",ch);
switch (ch)
{
case '0':
test_result(_close(handle));
exit(0);
break;
case '1':
do_write(handle);
break;
case '2':
do_read(handle);
break;
default:
return;
}
}
}
/*
* test_result
*
* since there are so many places that error-checking has to be performed,
* calling this routine automatically does it, and if there's an error it
* displays the error string, and exits the program
*/
void test_result(int value)
{
if (value == -1) // a value of -1 always indicates error
{
perror("ATMS Error"); // using perror display a user-friendly string
exit(value);
}
}
/*
* set_raw_mode
*
* cooked (sometimes called text) mode send data to the device one character
* at a time. we need to be in raw mode. a low-level interrupt accomplishes
* this. this is also an example of how to use DOS interrupts in your code
* the definitions for this routine are in dos.h
*
* this is faster and smaller than linking with binmode.obj
*/
void set_raw_mode(int handle)
{
union REGS regs;
regs.x.ax=0x4401; // set to function 0x4401: Set Device Data
regs.x.bx=handle; // bx has the handle of the device
regs.x.dx=0x00a0; // dx sets bits 7 & 5: device + raw mode
intdos(®s,®s); // do the interrupt with the registers in regs
// and the output will also be in regs.
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -