enventor/src/bin/console.c

109 lines
3.2 KiB
C

#include "common.h"
/*****************************************************************************/
/* Internal method implementation */
/*****************************************************************************/
static void
token_value_get(char *src, char *key_str, char end_key, int offset, char *dst)
{
char *psrc = src;
int count = 0;
psrc += (strlen(key_str) + offset ) * sizeof(char);
while (*psrc != end_key)
dst[count++] = *psrc++;
dst[count] = '\0';
}
static void
error_word_select(Evas_Object *console)
{
const char *console_text = elm_entry_entry_get(console);
if (console_text == NULL) return;
char error_word[1024];
char error_line[1024];
char *error_token, *edc_token;
//parse edc line
if ((edc_token = strstr(console_text, "edc:")))
token_value_get(edc_token, "edc:", ' ', 0, error_line);
else return;
//parse error word
if ((error_token = strstr(console_text, "keyword")))
token_value_get(error_token, "keyword", '\0', 1, error_word);
else if ((error_token = strstr(console_text, "name")))
token_value_get(error_token, "name", '\0', 1, error_word);
else return;
//find error word position
const char *entry_text = enventor_object_text_get(base_enventor_get());
char *utf8 = elm_entry_markup_to_utf8(entry_text);
enventor_object_line_goto(base_enventor_get(), atoi(error_line));
int pos = enventor_object_cursor_pos_get(base_enventor_get());
const char *search_line = utf8 + pos * sizeof(char);
const char *matched = strstr(search_line, error_word);
if (matched == NULL)
{
free(utf8);
return;
}
int start, end;
start = matched - utf8;
end = start + strlen(error_word);
free(utf8);
//select error word
enventor_object_select_region_set(base_enventor_get(), start, end);
}
static void
set_console_error_msg(Evas_Object *console, const char *src)
{
/* We cut error messages since it contains unnecessary information.
Most of the time, first one line has a practical information. */
const char *new_line = "<br/>";
const char *eol = strstr(src, new_line);
if (!eol) return;
char * single_error_msg = alloca((eol - src) + 1);
if (!single_error_msg) return;
strncpy(single_error_msg, src, eol - src);
single_error_msg[eol - src] = '\0';
elm_entry_entry_set(console, single_error_msg);
}
/*****************************************************************************/
/* Externally accessible calls */
/*****************************************************************************/
void
console_text_set(Evas_Object *console, const char *text)
{
set_console_error_msg(console, text);
error_word_select(console);
}
Evas_Object *
console_create(Evas_Object *parent)
{
Evas_Object *obj = elm_entry_add(parent);
elm_entry_scrollable_set(obj, EINA_TRUE);
elm_entry_editable_set(obj, EINA_FALSE);
elm_entry_line_wrap_set(obj, ELM_WRAP_WORD);
elm_object_focus_allow_set(obj, EINA_FALSE);
evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND,
EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
return obj;
}