2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.tizenopensource.org/license
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <stdlib.h> /* strtod */
20 #include <ctype.h> /* isspace */
40 static Eina_List *s_list;
50 unsigned int pd_width;
51 unsigned int pd_height;
71 HAPI double parser_period(struct parser *handle)
73 return handle->period;
76 HAPI int parser_network(struct parser *handle)
78 return handle->network;
81 HAPI int parser_timeout(struct parser *handle)
83 return handle->timeout;
86 HAPI const char *parser_auto_launch(struct parser *handle)
88 return handle->auto_launch;
91 HAPI const char *parser_script(struct parser *handle)
93 return handle->script;
96 HAPI const char *parser_abi(struct parser *handle)
101 HAPI unsigned int parser_size(struct parser *handle)
106 HAPI const char *parser_lb_path(struct parser *handle)
108 return handle->lb_path;
111 HAPI const char *parser_lb_group(struct parser *handle)
113 return handle->lb_group;
116 HAPI const char *parser_pd_path(struct parser *handle)
118 return handle->pd_path;
121 HAPI const char *parser_pd_group(struct parser *handle)
123 return handle->pd_group;
126 HAPI const char *parser_group_str(struct parser *handle)
128 return handle->group;
131 HAPI int parser_secured(struct parser *handle)
133 return handle->secured;
136 HAPI void parser_get_pdsize(struct parser *handle, unsigned int *width, unsigned int *height)
138 *width = handle->pd_width;
139 *height = handle->pd_height;
142 HAPI int parser_pinup(struct parser *handle)
144 return handle->pinup;
147 HAPI int parser_text_lb(struct parser *handle)
149 return handle->text_lb;
152 HAPI int parser_text_pd(struct parser *handle)
154 return handle->text_pd;
157 HAPI int parser_buffer_lb(struct parser *handle)
159 return handle->buffer_lb;
162 HAPI int parser_buffer_pd(struct parser *handle)
164 return handle->buffer_pd;
167 HAPI int parser_find(const char *pkgname)
175 len = strlen(pkgname) * 2 + strlen(CONF_PATH);
177 filename = malloc(len);
181 ret = snprintf(filename, len, CONF_PATH, pkgname, pkgname);
187 DbgPrint("Conf file is %s for package %s\n", filename, pkgname);
189 EINA_LIST_FOREACH(s_list, l, item) {
190 if (!strcmp(item->filename, filename)) {
200 static inline int parse_size(const char *buffer, unsigned int *size)
222 while (state != ERROR && state != END) {
245 w = (w * 10) + (buffer[i] - '0');
275 h = (h * 10) + (buffer[i] - '0');
288 if (w == 1 && h == 1) {
289 *size |= LB_SIZE_1x1;
290 } else if (w == 2 && h == 1) {
291 *size |= LB_SIZE_2x1;
292 } else if (w == 2 && h == 2) {
293 *size |= LB_SIZE_2x2;
294 } else if (w == 4 && h == 1) {
295 *size |= LB_SIZE_4x1;
296 } else if (w == 4 && h == 2) {
297 *size |= LB_SIZE_4x2;
298 } else if (w == 4 && h == 3) {
299 *size |= LB_SIZE_4x3;
300 } else if (w == 4 && h == 4) {
301 *size |= LB_SIZE_4x4;
303 ErrPrint("Invalid size type: %dx%d\n", w, h);
306 if (buffer[i] == ';')
308 else if (buffer[i] == '\0')
319 return *size ? 0 : -1;
324 * This will change the value of "buffer"
326 static inline const char *rtrim(char *buffer)
330 len = strlen(buffer);
331 while (len > 0 && isspace(buffer[len - 1]))
344 * This will change the value of "buffer"
346 static inline char *dup_rtrim(char *buffer)
353 ret = strdup(buffer);
355 ErrPrint("Heap: %s\n", strerror(errno));
362 static void period_handler(struct parser *item, char *buffer)
369 item->period = strtod(buffer, &tmp);
372 static void timeout_handler(struct parser *item, char *buffer)
377 item->timeout = atoi(buffer);
380 static void network_handler(struct parser *item, char *buffer)
385 item->network = !!atoi(buffer);
388 static void auto_launch_handler(struct parser *item, char *buffer)
393 item->auto_launch = strdup(buffer);
394 if (!item->auto_launch) {
395 ErrPrint("Heap: %s\n", strerror(errno));
400 static void size_handler(struct parser *item, char *buffer)
402 if (parse_size(buffer, &item->size) == -1) {
403 ErrPrint("Failed to get size\n");
404 item->size = 0x00000001;
408 static void pd_size_handler(struct parser *item, char *buffer)
410 if (sscanf(buffer, "%ux%u", &item->pd_width, &item->pd_height) != 2)
411 ErrPrint("parse pd size\n");
414 static void text_lb_handler(struct parser *item, char *buffer)
419 item->text_lb = !!atoi(buffer);
422 static void abi_handler(struct parser *item, char *buffer)
424 item->abi = dup_rtrim(buffer);
427 static void script_handler(struct parser *item, char *buffer)
429 item->script = dup_rtrim(buffer);
432 static void buffer_pd_handler(struct parser *item, char *buffer)
437 item->buffer_pd = !!atoi(buffer);
440 static void buffer_lb_handler(struct parser *item, char *buffer)
444 item->buffer_lb = !!atoi(buffer);
447 static void text_pd_handler(struct parser *item, char *buffer)
452 item->text_pd = !!atoi(buffer);
455 static void pinup_handler(struct parser *item, char *buffer)
460 item->pinup = !!atoi(buffer);
463 static void lb_path_handler(struct parser *item, char *buffer)
466 DbgFree(item->lb_path);
468 item->lb_path = dup_rtrim(buffer);
470 ErrPrint("Error: %s\n", strerror(errno));
473 static void group_handler(struct parser *item, char *buffer)
476 DbgFree(item->group);
478 item->group = dup_rtrim(buffer);
480 ErrPrint("Error: %s\n", strerror(errno));
483 static void secured_handler(struct parser *item, char *buffer)
488 item->secured = !!atoi(buffer);
491 static void lb_group_handler(struct parser *item, char *buffer)
494 DbgFree(item->lb_group);
496 item->lb_group = dup_rtrim(buffer);
498 ErrPrint("Error: %s\n", strerror(errno));
501 static void pd_path_handler(struct parser *item, char *buffer)
504 DbgFree(item->pd_path);
506 item->pd_path = dup_rtrim(buffer);
508 ErrPrint("Error: %s\n", strerror(errno));
511 static void pd_group_handler(struct parser *item, char *buffer)
514 DbgFree(item->pd_group);
516 item->pd_group = dup_rtrim(buffer);
518 ErrPrint("Error: %s\n", strerror(errno));
521 HAPI struct parser *parser_load(const char *pkgname)
542 static const struct token_parser {
544 void (*handler)(struct parser *, char *buffer);
545 } token_handler[] = {
548 .handler = period_handler,
552 .handler = timeout_handler,
556 .handler = network_handler,
559 .name = "auto_launch",
560 .handler = auto_launch_handler,
564 .handler = size_handler,
568 .handler = group_handler,
572 .handler = secured_handler,
575 .name = "livebox_path",
576 .handler = lb_path_handler,
579 .name = "livebox_group",
580 .handler = lb_group_handler,
584 .handler = pd_path_handler,
588 .handler = pd_group_handler,
592 .handler = pd_size_handler,
596 .handler = pinup_handler,
599 .name = "text_livebox",
600 .handler = text_lb_handler,
604 .handler = text_pd_handler,
607 .name = "buffer_livebox",
608 .handler = buffer_lb_handler,
612 .handler = buffer_pd_handler,
616 .handler = script_handler,
620 .handler = abi_handler,
629 item = calloc(1, sizeof(*item));
634 len = strlen(CONF_PATH) + strlen(pkgname) * 2;
635 item->filename = malloc(len);
636 if (!item->filename) {
637 ErrPrint("Error: %s\n", strerror(errno));
642 ret = snprintf(item->filename, len, CONF_PATH, pkgname, pkgname);
644 ErrPrint("Error: %s\n", strerror(errno));
645 DbgFree(item->filename);
650 item->lb_path = NULL;
651 item->lb_group = NULL;
654 item->auto_launch = NULL;
655 item->size = 0x00000001;
660 fp = fopen(item->filename, "rt");
662 DbgFree(item->filename);
675 if ((c == EOF) && (state == VALUE)) {
676 DbgPrint("[%s:%d] VALUE state EOF\n", __func__, __LINE__);
682 if (c == CR || c == LF || c == EOF) {
683 buffer[buffer_idx] = '\0';
689 linelen = -1; /* Will be ZERO by follwing increment code */
692 buffer[buffer_idx++] = c;
693 if (buffer_idx == (sizeof(buffer) - 1)) {
694 buffer[buffer_idx] = '\0';
700 if (linelen == 0 && c == '#') {
702 } else if (isspace(c)) {
703 /* Ignore empty space */
712 else if (!isspace(c))
718 buffer[buffer_idx] = '\0';
720 } else if (buffer_idx != 0) {
721 buffer[buffer_idx++] = c;
722 if (buffer_idx >= sizeof(buffer))
727 } else if (isspace(c)) {
728 if (buffer_idx == 0) {
730 } else if (quote == 1) {
731 buffer[buffer_idx++] = c;
732 if (buffer_idx >= sizeof(buffer))
735 buffer[buffer_idx] = '\0';
740 buffer[buffer_idx++] = c;
741 if (buffer_idx >= sizeof(buffer))
751 } else if (isspace(c)) {
755 if (token_handler[token_idx].name[ch_idx] != '\0')
761 /* Now start to find a token! */
765 if (token_handler[token_idx].name[ch_idx] == c) {
770 ungetc(token_handler[token_idx].name[ch_idx], fp);
774 if (token_handler[token_idx].name == NULL)
782 if (c == CR || c == LF || c == EOF) {
792 if (c == LF || c == CR || c == EOF) {
797 * Make the string terminator
799 buffer[buffer_idx] = '\0';
801 if (token_idx >= 0 && token_handler[token_idx].handler)
802 token_handler[token_idx].handler(item, buffer);
810 } else if (isspace(c)) {
826 s_list = eina_list_append(s_list, item);
830 HAPI int parser_unload(struct parser *item)
832 s_list = eina_list_remove(s_list, item);
834 DbgFree(item->auto_launch);
836 DbgFree(item->script);
837 DbgFree(item->group);
838 DbgFree(item->pd_group);
839 DbgFree(item->pd_path);
840 DbgFree(item->lb_group);
841 DbgFree(item->lb_path);
842 DbgFree(item->filename);