8c653cfd78ca5d7953996581d174653c277b8d8b
[fw/sdcc] / sim / ucsim / gui.src / serio.src / fileio.cc
1 /******************************************************************************
2  * to emulate the serial input and output of an 8051 controller               *
3  * fileio.cc - file input and output                                          *
4  ******************************************************************************/
5 #include <sys/types.h>
6 #include <iostream.h>
7 #include <stdlib.h>
8 #include <sys/stat.h>
9 #include <fcntl.h>
10 #include <errno.h>
11 #include <string.h>
12 #include <unistd.h>
13 #include "fileio.hh"
14
15 FileIO::FileIO()
16 {
17
18         // make the input fifo
19         if(mkfifo(DEF_INFILE, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH) == -1) {
20                 if(errno != EEXIST) {
21                         cerr << "mkfifo(): Error number " << errno << " occourred: " << strerror(errno) << "\n";
22                         exit(-1);
23                 }
24         }
25
26         // the input fifo - non blocking
27         if ((fdin = open(DEF_INFILE, O_RDONLY|O_NONBLOCK)) == -1) {
28                 cerr << "open(): Error number " << errno << " occourred: " << strerror(errno) << "\n";
29                 exit(-1);
30         }
31
32         // make the output fifo
33         if(mkfifo(DEF_OUTFILE, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH) == -1) {
34                 if(errno != EEXIST) {
35                         cerr << "mkfifo(): Error number " << errno << " occourred: " << strerror(errno) << "\n";
36                         exit(-1);
37                 }
38         }
39
40         // the output fifo
41         if ((fdout = open(DEF_OUTFILE, O_RDWR|O_NONBLOCK)) == -1) {
42                 cerr << "open(): Error number " << errno << " occourred: " << strerror(errno) << "\n";
43                 exit(-1);
44         }
45 }
46
47 FileIO::FileIO(char *infile, char *outfile)
48 {
49         // make the input fifo
50         if(mkfifo(infile, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH) == -1) {
51                 if(errno != EEXIST) {
52                         cerr << "mkfifo(): Error number " << errno << " occourred: " << strerror(errno);
53                         exit(-1);
54                 }
55         }
56
57         // the input fifo - non blocking
58         if ((fdin = open(infile, O_RDONLY|O_NONBLOCK)) == -1) {
59                 cerr << "open(): Error number " << errno << " occourred: " << strerror(errno);
60                 exit(-1);
61         }
62
63         // make the output fifo
64         if(mkfifo(outfile, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH) == -1) {
65                 if(errno != EEXIST) {
66                         cerr << "mkfifo(): Error number " << errno << " occourred: " << strerror(errno);
67                         exit(-1);
68                 }
69         }
70
71         // the output fifo
72         if ((fdout = open(outfile, O_RDWR|O_NONBLOCK)) == -1) {
73                 cerr << "open(): Error number " << errno << " occourred: " << strerror(errno);
74                 exit(-1);
75         }
76 }
77
78
79 FileIO::~FileIO()
80 {
81         close(fdin);
82         close(fdout);
83 }
84
85 int FileIO::SendByte(char b)
86 {
87         int ret;
88
89         if((ret = write(fdout, &b, 1)) != 1)
90         {
91                 cerr << "write(): Error number " << errno << " occourred: " << strerror(errno);
92                 exit(-1);
93         }
94
95         return(ret);
96 }
97
98
99 int FileIO::RecvByte(char *b)
100 {
101         int ret;
102
103         ret = read(fdin, b, 1);
104
105         if((ret == -1) && (errno != EAGAIN))
106         {
107                 cerr << "read(): Error number " << errno << " occourred: " << strerror(errno);
108                 exit(-1);
109         }
110
111         return(ret);
112 }
113
114 // send a string
115 int FileIO::SendStr(char *str)
116 {
117         int ret;
118
119         if((ret = write(fdout, str, strlen(str))) != (int)strlen(str))
120         {
121                 cerr << "write(): Error number " << errno << " occourred: " << strerror(errno);
122                 exit(-1);
123         }
124
125         return(ret);
126 }
127
128
129 int FileIO::RecvStr(char *str)
130 {
131         int ret;
132
133         ret = read(fdin, str, MAX_SIZ-1);
134         str[MAX_SIZ] = 0;
135
136         if((ret == -1) && (errno != EAGAIN))
137         {
138                 cerr << "read(): Error number " << errno << " occourred: " << strerror(errno);
139                 exit(-1);
140         }
141
142         return(ret);
143 }