compiler/libec: (#341, #351, #644, #771) Improved enum type matching and type handlin...
[sdk] / ecere / src / sys / DualPipe.ec
1 #include <stdarg.h>
2
3 namespace sys;
4
5 import "System"
6
7 default:
8 // IMPLEMENTATION OF THESE IS IN _DualPipe.c
9 void DualPipe_Destructor(_DualPipe * dp);
10 void DualPipe_CloseInput(_DualPipe * dp);
11 void DualPipe_CloseOutput(_DualPipe * dp);
12 int DualPipe_Read(_DualPipe * dp, byte * buffer, uint size, uint count);
13 int DualPipe_Write(_DualPipe * dp, byte * buffer, uint size, uint count);
14 bool DualPipe_Getc(_DualPipe * dp, char * ch);
15 bool DualPipe_Putc(_DualPipe * dp, char ch);
16 bool DualPipe_Puts(_DualPipe * dp, char * string);
17 bool DualPipe_Seek(_DualPipe * dp, int pos, FileSeekMode mode);
18 uint DualPipe_Tell(_DualPipe * dp);
19 bool DualPipe_Eof(_DualPipe * dp);
20 bool DualPipe_GetSize(_DualPipe * dp);
21 bool DualPipe_Peek(_DualPipe * dp);
22 void DualPipe_Terminate(_DualPipe * dp);
23 int DualPipe_GetExitCode(_DualPipe * dp);
24 int DualPipe_GetProcessID(_DualPipe * dp);
25 void DualPipe_Wait(_DualPipe * dp);
26 _DualPipe * _DualPipeOpen(PipeOpenMode mode, char * commandLine, char * env, void ** inputPtr, void ** outputPtr);
27
28 private:
29
30 public class PipeOpenMode { public bool output:1, error:1, input:1, showWindow:1; };
31
32 public class DualPipe : File
33 {
34    void * dp;
35
36    ~DualPipe() { DualPipe_Destructor(dp); }
37    void CloseInput() { (input != null) ? File::CloseInput() : DualPipe_CloseInput(dp); }
38    void CloseOutput() { (output != null) ? File::CloseOutput() : DualPipe_CloseOutput(dp); }
39    int Read(byte * buffer, uint size, uint count) { return DualPipe_Read(dp, buffer, size, count); }
40    int Write(byte * buffer, uint size, uint count) { return output ? File::Write(buffer, size, count) : DualPipe_Write(dp, buffer, size, count); }
41    bool Getc(char * ch) { return input ? File::Getc(ch) : DualPipe_Getc(dp, ch); }
42    bool Putc(char ch) { return output ? File::Putc(ch) : DualPipe_Putc(dp, ch); }
43    bool Puts(char * string) { return output ? (File::Puts(string), File::Flush()) : DualPipe_Puts(dp, string); }
44    bool Seek(int pos, FileSeekMode mode) { return (input || output) ? File::Seek(pos, mode) : DualPipe_Seek(dp, pos, mode); }
45    uint Tell() { return (input || output) ? File::Tell() : DualPipe_Tell(dp); }
46    bool Eof() { return DualPipe_Eof(dp); }
47    uint GetSize() { return (input || output) ? File::GetSize() : DualPipe_GetSize(dp); }
48
49 public:
50    bool Peek() { return DualPipe_Peek(dp); }
51    void Terminate() { DualPipe_Terminate(dp); }
52    int GetExitCode() { return DualPipe_GetExitCode(dp); }
53    int GetProcessID() { return DualPipe_GetProcessID(dp); }
54    void Wait() { DualPipe_Wait(dp); }
55 };
56
57 public DualPipe DualPipeOpenf(PipeOpenMode mode, char * command, ...)
58 {
59    char commandLine[MAX_F_STRING];
60    va_list args;
61    va_start(args, command);
62    vsnprintf(commandLine, sizeof(commandLine), command, args);
63    commandLine[sizeof(commandLine)-1] = 0;
64    va_end(args);
65    return DualPipeOpen(mode, commandLine);
66 }
67
68 public DualPipe DualPipeOpen(PipeOpenMode mode, char * commandLine)
69 {
70    void * input, * output;
71    void * f = _DualPipeOpen(mode, commandLine, null, &input, &output);
72    if(f)
73       return DualPipe { dp = f, input = input, output = output };
74    return null;
75 }
76
77 public DualPipe DualPipeOpenEnvf(PipeOpenMode mode, char * env, char * command, ...)
78 {
79    char commandLine[MAX_F_STRING];
80    va_list args;
81    va_start(args, command);
82    vsnprintf(commandLine, sizeof(commandLine), command, args);
83    commandLine[sizeof(commandLine)-1] = 0;
84    va_end(args);
85    return DualPipeOpenEnv(mode, env, commandLine);
86 }
87
88 public DualPipe DualPipeOpenEnv(PipeOpenMode mode, char * env, char * commandLine)
89 {
90    void * input, * output;
91    void * f = _DualPipeOpen(mode, commandLine, env, &input, &output);
92    if(f)
93       return DualPipe { dp = f, input = input, output = output };
94    return null;
95 }