1 #include "wmcliphist.h"
4 #define RC_BUF_SIZE 256
12 STATE_EXPRESSION_START
,
20 GList
*action_list
= NULL
;
23 /* add character to buffer */
24 #define add_to_buff(buf, pos, chr) do { \
27 if (pos + 1 == RC_BUF_SIZE) \
32 #define ismywhite(c) (c == '\t' || c == ' ')
36 * returns config/data file name in user's home
39 rcconfig_get_name(char *append
)
41 static gchar fname
[PATH_MAX
];
44 begin_func("rcconfig_get_name");
46 if (!(home
= g_getenv("HOME")))
49 memset(fname
, 0, PATH_MAX
);
50 snprintf(fname
, PATH_MAX
, "%s/.wmcliphist%s", home
, append
);
59 * appends parsed action to action list
62 action_append(char *expr_buf
, char *action_buf
, char *cmd_buf
)
66 begin_func("action_append");
68 action
= g_new0(ACTION
, 1);
70 if (regcomp(&action
->expression
, expr_buf
,
71 REG_EXTENDED
|REG_ICASE
|REG_NOSUB
) != 0) {
76 if (strcmp(action_buf
, "exec") == 0)
77 action
->action
= ACT_EXEC
;
78 else if (strcmp(action_buf
, "submenu") == 0)
79 action
->action
= ACT_SUBMENU
;
80 else if (strcmp(action_buf
, "ignore") == 0)
81 action
->action
= ACT_IGNORE
;
87 action
->command
= g_strdup(cmd_buf
);
89 action_list
= g_list_append(action_list
, action
);
96 * read and parse rcconfig
99 rcconfig_get(char *fname
)
104 STATE state
= STATE_BEGINING
;
105 char direc_buf
[RC_BUF_SIZE
],
106 expr_buf
[RC_BUF_SIZE
],
107 action_buf
[RC_BUF_SIZE
],
108 cmd_buf
[RC_BUF_SIZE
];
110 int error
= 0, eof
= 0;
115 begin_func("rcconfig_get");
117 close(open(fname
, O_CREAT
, S_IRUSR
| S_IWUSR
| S_IRGRP
| S_IROTH
));
119 if ((f_rc
= open(fname
, O_RDONLY
)) < 0) {
120 fprintf(stderr
, ".wmcliphistrc not found\n");
127 byte_cnt
= read(f_rc
, tmp
, 1024);
128 if (byte_cnt
== -1) {
129 fprintf(stderr
, "cannot read .wmcliphistrc\n");
131 } else if (byte_cnt
< 1024) {
143 state
= STATE_DIRECTIVE
;
145 add_to_buff(direc_buf
, buf_index
, c
);
147 state
= STATE_COMMENT
;
148 else if (ismywhite(c
))
151 state
= STATE_BEGINING
;
157 if (c
== '\n' || c
== '\0')
158 state
= STATE_BEGINING
;
161 case STATE_DIRECTIVE
:
163 if (strcmp(direc_buf
, "action") == 0) {
164 state
= STATE_EXPRESSION_START
;
166 } else if (strcmp(direc_buf
, "menukey") == 0) {
169 } else if (strcmp(direc_buf
, "prev_item_key") == 0) {
172 } else if (strcmp(direc_buf
, "exec_item_key") == 0) {
175 } else if (strcmp(direc_buf
, "keep") == 0) {
178 } else if (strcmp(direc_buf
, "lcolor") == 0) {
181 } else if (strcmp(direc_buf
, "autosave") == 0) {
184 } else if (strcmp(direc_buf
,
185 "confirm_exec") == 0) {
188 } else if (strcmp(direc_buf
, "exec_immediately") == 0) {
191 } else if (strcmp(direc_buf
, "exec_middleclick") == 0) {
194 } else if (strcmp(direc_buf
, "exec_hotkey") == 0) {
197 } else if (strcmp(direc_buf
, "auto_take_up") == 0) {
203 } else if (isalpha(c
) || c
== '_') {
204 add_to_buff(direc_buf
, buf_index
, c
);
211 if (c
== '\n' || ismywhite(c
)) {
212 if (strcmp(direc_buf
, "menukey") == 0) {
213 memset(menukey_str
, 0, 32);
216 } else if (strcmp(direc_buf
, "prev_item_key") == 0) {
217 memset(prev_item_key_str
, 0, 32);
218 strncpy(prev_item_key_str
,
220 } else if (strcmp(direc_buf
, "exec_item_key") == 0) {
221 memset(exec_item_key_str
, 0, 32);
222 strncpy(exec_item_key_str
,
224 } else if (strcmp(direc_buf
, "keep") == 0) {
227 } else if (strcmp(direc_buf
, "lcolor")
229 memset(locked_color_str
, 0, 32);
230 strncpy(locked_color_str
,
232 } else if (strcmp(direc_buf
, "autosave") == 0) {
235 } else if (strcmp(direc_buf
,
236 "confirm_exec") == 0) {
237 if (strcasecmp(expr_buf
, "yes") == 0) {
240 } else if (strcmp(direc_buf
, "exec_immediately") == 0) {
241 if (strcasecmp(expr_buf
, "no") == 0) {
244 } else if (strcmp(direc_buf
, "exec_middleclick") == 0) {
245 if (strcasecmp(expr_buf
, "no") == 0) {
246 exec_middleclick
= 0;
248 } else if (strcmp(direc_buf
, "exec_hotkey") == 0) {
249 if (strcasecmp(expr_buf
, "no") == 0) {
252 } else if (strcmp(direc_buf
, "auto_take_up") == 0) {
253 if (strcasecmp(expr_buf
, "no") == 0) {
258 } else if (isgraph(c
))
259 add_to_buff(expr_buf
, buf_index
, c
);
264 if (c
== '\n' || c
== '\0') {
266 state
= STATE_BEGINING
;
267 } else if (ismywhite(c
)) {
269 state
= STATE_COMMENT
;
275 case STATE_EXPRESSION_START
:
277 state
= STATE_EXPRESSION
;
282 case STATE_EXPRESSION
:
284 state
= STATE_EXPRESSION_END
;
288 add_to_buff(expr_buf
, buf_index
, c
);
291 case STATE_EXPRESSION_END
:
292 if (c
!= ' ' && c
!= '\t')
294 if (strcmp(direc_buf
, "action") == 0) {
295 state
= STATE_ACTION
;
303 if (c
== ' ' || c
== '\t') {
304 state
= STATE_COMMAND
;
306 } else if (c
== '\0' || c
== '\n') {
307 if (strcmp(action_buf
, "ignore") == 0) {
308 state
= STATE_BEGINING
;
319 } else if (isalpha(c
))
320 add_to_buff(action_buf
, buf_index
, c
);
326 if (c
== '\n' || c
== '\0') {
327 state
= STATE_BEGINING
;
336 add_to_buff(cmd_buf
, buf_index
, c
);
340 if (!error
&& (!eof
|| i
< byte_cnt
))
344 case STATE_DIRECTIVE
:
346 fprintf(stderr
, "Directive is too long "
347 "(line %d)\n", line
);
349 fprintf(stderr
, "Unknown directive "
350 "(line %d)\n", line
);
352 fprintf(stderr
, "Only letters are "
353 "allowed in directive "
358 case STATE_EXPRESSION_START
:
359 case STATE_EXPRESSION
:
361 fprintf(stderr
, "Expression is too long "
362 "(line %d)\n", line
);
364 fprintf(stderr
, "Expression must be "
365 "enclosed with quotes "
366 "\" (line %d)\n", line
);
369 case STATE_EXPRESSION_END
:
370 fprintf(stderr
, "One space/tab and "
371 "action must follow "
373 " (line %d)\n", line
);
378 fprintf(stderr
, "Only letters are "
382 else if (error
== 101)
383 fprintf(stderr
, "Invalid expression "
384 "(line %d)\n", line
);
386 fprintf(stderr
, "Action is too long "
387 "(line %d)\n", line
);
389 fprintf(stderr
, "Invalid action "
390 "(line %d)\n", line
);
395 fprintf(stderr
, "Invalid directive "
396 "(line %d)\n", line
);
398 fprintf(stderr
, "Value is too long "
399 "(line %d)\n", line
);
401 fprintf(stderr
, "Invalid value "
402 "(line %d)\n", line
);
407 fprintf(stderr
, "Invalid expression "
408 "(line %d)\n", line
);
410 fprintf(stderr
, "Command is too long "
411 "(line %d)\n", line
);
413 fprintf(stderr
, "Invalid action "
414 "(line %d)\n", line
);
419 fprintf(stderr
, "Unknown error "
420 "(line %d)\n", line
);
426 /* everything is OK */
448 begin_func("rcconfig_free");
450 list_node
= action_list
;
452 ACTION
*action
= list_node
->data
;
454 g_free(action
->command
);
455 regfree(&action
->expression
);
457 list_node
= list_node
->next
;
459 g_list_free(action_list
);