version 1.4.31b
[polyglot.git] / engine.c
1 // engine.c\r
2 \r
3 // includes\r
4 \r
5 #include <stdlib.h>\r
6 #include <stdarg.h>\r
7 #include <string.h>\r
8 #include <errno.h>\r
9 \r
10 \r
11 #include "engine.h"\r
12 #include "option.h"\r
13 #include "pipex.h"\r
14 #include "util.h"\r
15 \r
16 // defines\r
17 \r
18 #define StringSize 4096\r
19 \r
20 // variables\r
21 \r
22 static int write_index = 0;\r
23 static char write_buffer[StringSize];\r
24 engine_t Engine[1];\r
25 \r
26 // functions\r
27 \r
28 // set_affinity()\r
29 \r
30 void set_affinity(engine_t *engine, int value){\r
31     pipex_set_affinity(engine->pipex,value);\r
32 }\r
33 \r
34 // engine_set_nice_value()\r
35 \r
36 void engine_set_nice_value(engine_t *engine, int value){\r
37     pipex_set_priority(engine->pipex,value);\r
38 }\r
39 \r
40 // engine_send_queue()\r
41 \r
42 void engine_send_queue(engine_t * engine, const char *format, ...) {\r
43     va_list arg_list;\r
44     if(write_index>=StringSize){\r
45         my_fatal("engine_send_queue(): write_buffer overflow\n");\r
46     }\r
47     va_start(arg_list,format);\r
48     write_index += vsnprintf(write_buffer + write_index,\r
49                              StringSize-write_index,\r
50                              format,\r
51                              arg_list);\r
52     va_end(arg_list);\r
53 }\r
54 \r
55 // engine_send()\r
56 \r
57 void engine_send(engine_t * engine, const char *format, ...) {\r
58     va_list arg_list;\r
59     if(write_index>=StringSize){\r
60         my_fatal("engine_send(): write_buffer overflow\n");\r
61     }\r
62     va_start(arg_list,format);\r
63     vsnprintf(write_buffer + write_index,\r
64               StringSize-write_index,\r
65               format,\r
66               arg_list);\r
67     va_end(arg_list);\r
68     pipex_writeln(engine->pipex,write_buffer);\r
69     write_index = 0;\r
70 }\r
71 \r
72 // engine_close()\r
73 \r
74 void engine_close(engine_t * engine){\r
75     char string[StringSize];\r
76     pipex_send_eof(engine->pipex);\r
77         // TODO: Timeout\r
78     while (!engine_eof(engine)) { \r
79       engine_get(Engine,string);\r
80     }\r
81     pipex_exit(engine->pipex);\r
82 }\r
83 \r
84 // engine_open()\r
85 \r
86 void engine_open(engine_t * engine){\r
87     int affinity;\r
88     char *my_dir;\r
89     if( (my_dir = my_getcwd( NULL, 0 )) == NULL )\r
90         my_fatal("engine_open(): no current directory: %s\n",strerror(errno));\r
91     if(my_chdir(option_get_string("EngineDir"))){\r
92         my_fatal("engine_open(): cannot change directory: %s\n",strerror(errno));\r
93     }\r
94     pipex_open(engine->pipex,"Engine",option_get_string("EngineCommand"));\r
95     if(pipex_active(engine->pipex)){\r
96             //play with affinity (bad idea)\r
97         affinity=option_get_int("Affinity");\r
98         if(affinity!=-1) set_affinity(engine,affinity); //AAA\r
99             //lets go back\r
100         my_chdir(my_dir);\r
101             // set a low priority\r
102         if (option_get_bool("UseNice")){\r
103             my_log("POLYGLOT Adjust Engine Piority\n");\r
104             engine_set_nice_value(engine, option_get_int("NiceValue"));\r
105         }\r
106     }\r
107     \r
108 }\r
109 \r
110 bool engine_active(engine_t *engine){\r
111     return pipex_active(engine->pipex);\r
112 }\r
113 \r
114 bool engine_eof(engine_t *engine){\r
115     return pipex_eof(engine->pipex);\r
116 }\r
117 \r
118 bool engine_get_non_blocking(engine_t * engine, char *string){\r
119     return pipex_readln_nb(engine->pipex,string);\r
120  }\r
121 \r
122 void engine_get(engine_t * engine, char *string){\r
123     pipex_readln(engine->pipex,string);\r
124 }\r
125 \r
126 \r