[asterisk-commits] rizzo: trunk r94820 - /trunk/channels/console_gui.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Wed Dec 26 17:00:29 CST 2007
Author: rizzo
Date: Wed Dec 26 17:00:29 2007
New Revision: 94820
URL: http://svn.digium.com/view/asterisk?view=rev&rev=94820
Log:
use fread instead of mmap to read in the comment area from the keypad.
fread is simpler and more portable, and there is no performance gain
in using mmap.
Modified:
trunk/channels/console_gui.c
Modified: trunk/channels/console_gui.c
URL: http://svn.digium.com/view/asterisk/trunk/channels/console_gui.c?view=diff&rev=94820&r1=94819&r2=94820
==============================================================================
--- trunk/channels/console_gui.c (original)
+++ trunk/channels/console_gui.c Wed Dec 26 17:00:29 2007
@@ -661,82 +661,57 @@
static void keypad_setup(struct gui_info *gui, const char *kp_file)
{
- int fd = -1;
- void *p = NULL;
- off_t l = 0;
+ FILE *fd;
+ char buf[1024];
+ const char region[] = "region";
+ int reg_len = strlen(region);
+ int in_comment = 0;
if (gui->keypad)
return;
gui->keypad = get_keypad(kp_file);
if (!gui->keypad)
return;
-
+ /* now try to read the keymap from the file. */
+ fd = fopen(kp_file, "r");
+ if (fd == NULL) {
+ ast_log(LOG_WARNING, "fail to open %s\n", kp_file);
+ return;
+ }
/*
* If the keypad image has a comment field, try to read
- * the button location from there. The block must be
- * keypad_entry = token shape x0 y0 x1 y1 h
+ * the button location from there. The block must start with
+ * a comment (or empty) line, and continue with entries like:
+ * region = token shape x0 y0 x1 y1 h
* ...
- * (basically, lines have the same format as config file entries.
- * same as the keypad_entry.
+ * (basically, lines have the same format as config file entries).
* You can add it to a jpeg file using wrjpgcom
*/
- do { /* only once, in fact */
- const char region[] = "region";
- int reg_len = strlen(region);
- const unsigned char *s, *e;
-
- fd = open(kp_file, O_RDONLY);
- if (fd < 0) {
- ast_log(LOG_WARNING, "fail to open %s\n", kp_file);
+ while (fgets(buf, sizeof(buf), fd)) {
+ char *s;
+
+ if (!strstr(buf, region)) { /* no keyword yet */
+ if (!in_comment) /* still waiting for initial comment block */
+ continue;
+ else
+ break;
+ }
+ if (!in_comment) { /* first keyword, reset previous entries */
+ keypad_cfg_read(gui, "reset");
+ in_comment = 1;
+ }
+ s = ast_skip_blanks(buf);
+ ast_trim_blanks(s);
+ if (memcmp(s, region, reg_len))
+ break; /* keyword not found */
+ s = ast_skip_blanks(s + reg_len); /* space between token and '=' */
+ if (*s++ != '=') /* missing separator */
break;
- }
- l = lseek(fd, 0, SEEK_END);
- if (l <= 0) {
- ast_log(LOG_WARNING, "fail to lseek %s\n", kp_file);
- break;
- }
- p = mmap(NULL, l, PROT_READ, 0, fd, 0);
- if (p == NULL) {
- ast_log(LOG_WARNING, "fail to mmap %s size %ld\n", kp_file, (long)l);
- break;
- }
- e = (const unsigned char *)p + l;
- for (s = p; s < e - 20 ; s++) {
- if (!memcmp(s, region, reg_len)) { /* keyword found */
- /* reset previous entries */
- keypad_cfg_read(gui, "reset");
- break;
- }
- }
- for ( ;s < e - 20; s++) {
- char buf[256];
- const unsigned char *s1;
- if (index(" \t\r\n", *s)) /* ignore blanks */
- continue;
- if (*s > 127) /* likely end of comment */
- break;
- if (memcmp(s, region, reg_len)) /* keyword not found */
- break;
- s += reg_len;
- l = MIN(sizeof(buf), e - s);
- ast_copy_string(buf, s, l);
- s1 = ast_skip_blanks(buf); /* between token and '=' */
- if (*s1++ != '=') /* missing separator */
- break;
- if (*s1 == '>') /* skip => */
- s1++;
- keypad_cfg_read(gui, ast_skip_blanks(s1));
- /* now wait for a newline */
- s1 = s;
- while (s1 < e - 20 && !index("\r\n", *s1) && *s1 < 128)
- s1++;
- s = s1;
- }
- } while (0);
- if (p)
- munmap(p, l);
- if (fd >= 0)
- close(fd);
+ if (*s == '>') /* skip '>' if present */
+ s++;
+ keypad_cfg_read(gui, ast_skip_blanks(s));
+ }
+ fclose(fd);
}
/* [re]set the main sdl window, useful in case of resize */
More information about the asterisk-commits
mailing list