/******************************************************************* * parse_file */ static void parse_file( INCL_FILE *pFile, int src ) { char buffer[1024]; char *include; int line = 0; FILE *file; if (is_generated( pFile->name )) { /* file is generated during make, don't try to open it */ pFile->filename = xstrdup( pFile->name ); return; } file = src ? open_src_file( pFile ) : open_include_file( pFile ); if (!file) return; while (fgets( buffer, sizeof(buffer)-1, file )) { char quote; char *p = buffer; line++; while (*p && isspace(*p)) p++; if (*p++ != '#') continue; while (*p && isspace(*p)) p++; if (strncmp( p, "include", 7 )) continue; p += 7; while (*p && isspace(*p)) p++; if (*p != '\"' && *p != '<' ) continue; quote = *p++; if (quote == '<') quote = '>'; include = p; while (*p && (*p != quote)) p++; if (!*p) { fprintf( stderr, "%s:%d: Malformed #include directive\n", pFile->filename, line ); exit(1); } *p = 0; add_include( pFile, include, line, (quote == '>') ); } fclose(file); }
static int edit_read_syntax_rules (WEdit * edit, FILE * f, char **args, int args_size) { FILE *g = NULL; char *fg, *bg, *attrs; char last_fg[32] = "", last_bg[32] = "", last_attrs[64] = ""; char whole_right[512]; char whole_left[512]; char *l = 0; int save_line = 0, line = 0; struct context_rule **r, *c = NULL; int num_words = -1, num_contexts = -1; int result = 0; int argc; int i, j; int alloc_contexts = MAX_CONTEXTS, alloc_words_per_context = MAX_WORDS_PER_CONTEXT, max_alloc_words_per_context = MAX_WORDS_PER_CONTEXT; args[0] = NULL; edit->is_case_insensitive = FALSE; strcpy (whole_left, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_01234567890"); strcpy (whole_right, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_01234567890"); r = edit->rules = g_malloc0 (alloc_contexts * sizeof (struct context_rule *)); if (!edit->defines) edit->defines = g_tree_new ((GCompareFunc) strcmp); for (;;) { char **a; size_t len; line++; l = 0; len = read_one_line (&l, f); if (len == 0) { if (g) { fclose (f); f = g; g = 0; line = save_line + 1; MC_PTR_FREE (error_file_name); MC_PTR_FREE (l); len = read_one_line (&l, f); if (len == 0) break; else xx_lowerize_line (edit, l, len); } else { break; } } else { xx_lowerize_line (edit, l, len); } argc = get_args (l, args, args_size); a = args + 1; if (!args[0]) { /* do nothing */ } else if (!strcmp (args[0], "include")) { if (g || argc != 2) { result = line; break; } g = f; f = open_include_file (args[1]); if (!f) { MC_PTR_FREE (error_file_name); result = line; break; } save_line = line; line = 0; } else if (!strcmp (args[0], "caseinsensitive")) { edit->is_case_insensitive = TRUE; } else if (!strcmp (args[0], "wholechars")) { check_a; if (!strcmp (*a, "left")) { a++; g_strlcpy (whole_left, *a, sizeof (whole_left)); } else if (!strcmp (*a, "right")) { a++; g_strlcpy (whole_right, *a, sizeof (whole_right)); } else { g_strlcpy (whole_left, *a, sizeof (whole_left)); g_strlcpy (whole_right, *a, sizeof (whole_right)); } a++; check_not_a; } else if (!strcmp (args[0], "context")) { check_a; if (num_contexts == -1) { if (strcmp (*a, "default")) { /* first context is the default */ break_a; } a++; c = r[0] = g_malloc0 (sizeof (struct context_rule)); c->left = g_strdup (" "); c->right = g_strdup (" "); num_contexts = 0; } else { /* Terminate previous context. */ r[num_contexts - 1]->keyword[num_words] = NULL; c = r[num_contexts] = g_malloc0 (sizeof (struct context_rule)); if (!strcmp (*a, "exclusive")) { a++; c->between_delimiters = 1; } check_a; if (!strcmp (*a, "whole")) { a++; c->whole_word_chars_left = g_strdup (whole_left); c->whole_word_chars_right = g_strdup (whole_right); } else if (!strcmp (*a, "wholeleft")) { a++; c->whole_word_chars_left = g_strdup (whole_left); } else if (!strcmp (*a, "wholeright")) { a++; c->whole_word_chars_right = g_strdup (whole_right); } check_a; if (!strcmp (*a, "linestart")) { a++; c->line_start_left = 1; } check_a; c->left = g_strdup (*a++); check_a; if (!strcmp (*a, "linestart")) { a++; c->line_start_right = 1; } check_a; c->right = g_strdup (*a++); c->first_left = *c->left; c->first_right = *c->right; } c->keyword = g_malloc (alloc_words_per_context * sizeof (struct key_word *)); num_words = 1; c->keyword[0] = g_malloc0 (sizeof (struct key_word)); subst_defines (edit->defines, a, &args[1024]); fg = *a; if (*a) a++; bg = *a; if (*a) a++; attrs = *a; if (*a) a++; g_strlcpy (last_fg, fg ? fg : "", sizeof (last_fg)); g_strlcpy (last_bg, bg ? bg : "", sizeof (last_bg)); g_strlcpy (last_attrs, attrs ? attrs : "", sizeof (last_attrs)); c->keyword[0]->color = this_try_alloc_color_pair (fg, bg, attrs); c->keyword[0]->keyword = g_strdup (" "); check_not_a; alloc_words_per_context = MAX_WORDS_PER_CONTEXT; if (++num_contexts >= alloc_contexts) { struct context_rule **tmp; alloc_contexts += 128; tmp = g_realloc (r, alloc_contexts * sizeof (struct context_rule *)); r = tmp; } } else if (!strcmp (args[0], "spellcheck")) { if (!c) { result = line; break; } c->spelling = 1; } else if (!strcmp (args[0], "keyword")) { struct key_word *k; if (num_words == -1) break_a; check_a; k = r[num_contexts - 1]->keyword[num_words] = g_malloc0 (sizeof (struct key_word)); if (!strcmp (*a, "whole")) { a++; k->whole_word_chars_left = g_strdup (whole_left); k->whole_word_chars_right = g_strdup (whole_right); } else if (!strcmp (*a, "wholeleft")) { a++; k->whole_word_chars_left = g_strdup (whole_left); } else if (!strcmp (*a, "wholeright")) { a++; k->whole_word_chars_right = g_strdup (whole_right); } check_a; if (!strcmp (*a, "linestart")) { a++; k->line_start = 1; } check_a; if (!strcmp (*a, "whole")) { break_a; } k->keyword = g_strdup (*a++); k->first = *k->keyword; subst_defines (edit->defines, a, &args[1024]); fg = *a; if (*a) a++; bg = *a; if (*a) a++; attrs = *a; if (*a) a++; if (!fg) fg = last_fg; if (!bg) bg = last_bg; if (!attrs) attrs = last_attrs; k->color = this_try_alloc_color_pair (fg, bg, attrs); check_not_a; if (++num_words >= alloc_words_per_context) { struct key_word **tmp; alloc_words_per_context += 1024; if (alloc_words_per_context > max_alloc_words_per_context) max_alloc_words_per_context = alloc_words_per_context; tmp = g_realloc (c->keyword, alloc_words_per_context * sizeof (struct key_word *)); c->keyword = tmp; } } else if (*(args[0]) == '#') { /* do nothing for comment */ } else if (!strcmp (args[0], "file")) { break; } else if (!strcmp (args[0], "define")) { char *key = *a++; char **argv; if (argc < 3) break_a; argv = g_tree_lookup (edit->defines, key); if (argv != NULL) mc_defines_destroy (NULL, argv, NULL); else key = g_strdup (key); argv = g_new (char *, argc - 1); g_tree_insert (edit->defines, key, argv); while (*a != NULL) { *argv++ = g_strdup (*a++); } *argv = NULL; } else { /* anything else is an error */
static int edit_read_syntax_rules (WEdit * edit, FILE * f, char **args, int args_size) { FILE *g = NULL; char *fg, *bg, *attrs; char last_fg[32] = "", last_bg[32] = "", last_attrs[64] = ""; char whole_right[512]; char whole_left[512]; char *l = NULL; int save_line = 0, line = 0; context_rule_t *c = NULL; gboolean no_words = TRUE; int result = 0; args[0] = NULL; edit->is_case_insensitive = FALSE; strcpy (whole_left, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_01234567890"); strcpy (whole_right, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_01234567890"); edit->rules = g_ptr_array_new (); if (edit->defines == NULL) edit->defines = g_tree_new ((GCompareFunc) strcmp); while (TRUE) { char **a; size_t len; int argc; line++; l = NULL; len = read_one_line (&l, f); if (len != 0) xx_lowerize_line (edit, l, len); else { if (g == NULL) break; fclose (f); f = g; g = NULL; line = save_line + 1; MC_PTR_FREE (error_file_name); MC_PTR_FREE (l); len = read_one_line (&l, f); if (len == 0) break; xx_lowerize_line (edit, l, len); } argc = get_args (l, args, args_size); a = args + 1; if (args[0] == NULL) { /* do nothing */ } else if (strcmp (args[0], "include") == 0) { if (g != NULL || argc != 2) { result = line; break; } g = f; f = open_include_file (args[1]); if (f == NULL) { MC_PTR_FREE (error_file_name); result = line; break; } save_line = line; line = 0; } else if (strcmp (args[0], "caseinsensitive") == 0) { edit->is_case_insensitive = TRUE; } else if (strcmp (args[0], "wholechars") == 0) { check_a; if (strcmp (*a, "left") == 0) { a++; g_strlcpy (whole_left, *a, sizeof (whole_left)); } else if (strcmp (*a, "right") == 0) { a++; g_strlcpy (whole_right, *a, sizeof (whole_right)); } else { g_strlcpy (whole_left, *a, sizeof (whole_left)); g_strlcpy (whole_right, *a, sizeof (whole_right)); } a++; check_not_a; } else if (strcmp (args[0], "context") == 0) { syntax_keyword_t *k; check_a; if (edit->rules->len == 0) { /* first context is the default */ if (strcmp (*a, "default") != 0) break_a; a++; c = g_new0 (context_rule_t, 1); g_ptr_array_add (edit->rules, c); c->left = g_strdup (" "); c->right = g_strdup (" "); } else { /* Start new context. */ c = g_new0 (context_rule_t, 1); g_ptr_array_add (edit->rules, c); if (strcmp (*a, "exclusive") == 0) { a++; c->between_delimiters = TRUE; } check_a; if (strcmp (*a, "whole") == 0) { a++; c->whole_word_chars_left = g_strdup (whole_left); c->whole_word_chars_right = g_strdup (whole_right); } else if (strcmp (*a, "wholeleft") == 0) { a++; c->whole_word_chars_left = g_strdup (whole_left); } else if (strcmp (*a, "wholeright") == 0) { a++; c->whole_word_chars_right = g_strdup (whole_right); } check_a; if (strcmp (*a, "linestart") == 0) { a++; c->line_start_left = TRUE; } check_a; c->left = g_strdup (*a++); check_a; if (strcmp (*a, "linestart") == 0) { a++; c->line_start_right = TRUE; } check_a; c->right = g_strdup (*a++); c->first_left = *c->left; c->first_right = *c->right; } c->keyword = g_ptr_array_new (); k = g_new0 (syntax_keyword_t, 1); g_ptr_array_add (c->keyword, k); no_words = FALSE; subst_defines (edit->defines, a, &args[ARGS_LEN]); fg = *a; if (*a != NULL) a++; bg = *a; if (*a != NULL) a++; attrs = *a; if (*a != NULL) a++; g_strlcpy (last_fg, fg != NULL ? fg : "", sizeof (last_fg)); g_strlcpy (last_bg, bg != NULL ? bg : "", sizeof (last_bg)); g_strlcpy (last_attrs, attrs != NULL ? attrs : "", sizeof (last_attrs)); k->color = this_try_alloc_color_pair (fg, bg, attrs); k->keyword = g_strdup (" "); check_not_a; } else if (strcmp (args[0], "spellcheck") == 0) { if (c == NULL) { result = line; break; } c->spelling = TRUE; } else if (strcmp (args[0], "keyword") == 0) { context_rule_t *last_rule; syntax_keyword_t *k; if (no_words) break_a; check_a; last_rule = CONTEXT_RULE (g_ptr_array_index (edit->rules, edit->rules->len - 1)); k = g_new0 (syntax_keyword_t, 1); g_ptr_array_add (last_rule->keyword, k); if (strcmp (*a, "whole") == 0) { a++; k->whole_word_chars_left = g_strdup (whole_left); k->whole_word_chars_right = g_strdup (whole_right); } else if (strcmp (*a, "wholeleft") == 0) { a++; k->whole_word_chars_left = g_strdup (whole_left); } else if (strcmp (*a, "wholeright") == 0) { a++; k->whole_word_chars_right = g_strdup (whole_right); } check_a; if (strcmp (*a, "linestart") == 0) { a++; k->line_start = TRUE; } check_a; if (strcmp (*a, "whole") == 0) break_a; k->keyword = g_strdup (*a++); subst_defines (edit->defines, a, &args[ARGS_LEN]); fg = *a; if (*a != NULL) a++; bg = *a; if (*a != NULL) a++; attrs = *a; if (*a != NULL) a++; if (fg == NULL) fg = last_fg; if (bg == NULL) bg = last_bg; if (attrs == NULL) attrs = last_attrs; k->color = this_try_alloc_color_pair (fg, bg, attrs); check_not_a; } else if (*(args[0]) == '#') { /* do nothing for comment */ } else if (strcmp (args[0], "file") == 0) { break; } else if (strcmp (args[0], "define") == 0) { char *key = *a++; char **argv; if (argc < 3) break_a; argv = g_tree_lookup (edit->defines, key); if (argv != NULL) mc_defines_destroy (NULL, argv, NULL); else key = g_strdup (key); argv = g_new (char *, argc - 1); g_tree_insert (edit->defines, key, argv); while (*a != NULL) *argv++ = g_strdup (*a++); *argv = NULL; } else {