/*
- * Copyright (C) 1994, Index Data I/S
+ * Copyright (C) 1994-1996, Index Data I/S
* All rights reserved.
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: dfa.c,v $
- * Revision 1.11 1996-01-08 19:15:24 adam
+ * Revision 1.12 1996-06-04 10:20:02 adam
+ * Added support for character mapping.
+ *
+ * Revision 1.11 1996/01/08 19:15:24 adam
* Allow single $ in expressions.
*
* Revision 1.10 1996/01/08 09:09:17 adam
return L_CHARS;
}
+static int map_l_char (void)
+{
+ char **mapto;
+ const char *cp0 = expr_ptr-1;
+ int i = 0, len = strlen(cp0);
+
+ if (cp0[0] == 1 && cp0[1])
+ {
+ expr_ptr++;
+ look_ch = cp0[1];
+ return L_CHAR;
+ }
+ if (!parse_info->cmap)
+ return L_CHAR;
+
+ mapto = (*parse_info->cmap) (&cp0, len);
+ assert (mapto);
+
+ expr_ptr = cp0;
+ look_ch = mapto[i][0];
+ logf (LOG_DEBUG, "map from %c to %d", expr_ptr[-1], look_ch);
+ return L_CHAR;
+}
+
static int lex_sub(void)
{
int esc;
if (look_ch == '\"')
{
if (esc)
- return L_CHAR;
+ return map_l_char ();
inside_string = !inside_string;
}
else if (esc || inside_string)
- return L_CHAR;
+ return map_l_char ();
else if (look_ch == '[')
return read_charset();
else
--expr_ptr;
return cc[1];
}
- return L_CHAR;
+ return map_l_char ();
}
return 0;
}
parse_info->use_Tnode = parse_info->max_Tnode = 0;
parse_info->charMap = NULL;
parse_info->charMapSize = 0;
+ parse_info->cmap = NULL;
return parse_info;
}
return dfa;
}
+void dfa_set_cmap (struct DFA *dfa, char **(*cmap)(const char **from, int len))
+{
+ dfa->parse_info->cmap = cmap;
+}
+
int dfa_parse (struct DFA *dfa, const char **pattern)
{
struct Tnode *top;
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: dfap.h,v $
- * Revision 1.3 1996-01-08 09:09:19 adam
+ * Revision 1.4 1996-06-04 10:20:03 adam
+ * Added support for character mapping.
+ *
+ * Revision 1.3 1996/01/08 09:09:19 adam
* Function dfa_parse got 'const' string argument.
* New functions to define char mappings made public.
*
struct Tblock *end; /* end block of Tnodes */
int *charMap;
int charMapSize;
+ char **(*cmap)(const char **from, int len);
};
typedef struct DFA_stateb_ {
/*
- * Copyright (C) 1994, Index Data I/S
+ * Copyright (C) 1994-1996, Index Data I/S
* All rights reserved.
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: lookgrep.c,v $
- * Revision 1.16 1996-05-24 14:46:04 adam
+ * Revision 1.17 1996-06-04 10:20:06 adam
+ * Added support for character mapping.
+ *
+ * Revision 1.16 1996/05/24 14:46:04 adam
* Added dict_grep_cmap function to define user-mapping in grep lookups.
*
* Revision 1.15 1996/03/20 09:35:18 adam
int i, d;
logf (LOG_DEBUG, "dict_lookup_grep '%s' range=%d", pattern, range);
+
+ dfa_set_cmap (dfa, dict->grep_cmap);
+
i = dfa_parse (dfa, &this_pattern);
if (i || *this_pattern)
{
return i;
}
-void dict_grep_cmap (Dict dict, char **(*cmap)(const char **from))
+void dict_grep_cmap (Dict dict, char **(*cmap)(const char **from, int len))
{
dict->grep_cmap = cmap;
}
/*
- * Copyright (C) 1994, Index Data I/S
+ * Copyright (C) 1994-1996, Index Data I/S
* All rights reserved.
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: dfa.h,v $
- * Revision 1.5 1996-01-08 09:09:48 adam
+ * Revision 1.6 1996-06-04 10:20:10 adam
+ * Added support for character mapping.
+ *
+ * Revision 1.5 1996/01/08 09:09:48 adam
* Function dfa_parse got 'const' string argument.
*
* Revision 1.4 1995/01/25 11:31:04 adam
};
struct DFA *dfa_init (void);
+void dfa_set_cmap (struct DFA *dfa,
+ char **(*cmap)(const char **from, int len));
int dfa_parse (struct DFA *, const char **);
void dfa_mkstate (struct DFA *);
void dfa_delete (struct DFA **);
/*
- * Copyright (C) 1994, Index Data I/S
+ * Copyright (C) 1994-1996, Index Data I/S
* All rights reserved.
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: dict.h,v $
- * Revision 1.21 1996-05-24 14:46:07 adam
+ * Revision 1.22 1996-06-04 10:20:10 adam
+ * Added support for character mapping.
+ *
+ * Revision 1.21 1996/05/24 14:46:07 adam
* Added dict_grep_cmap function to define user-mapping in grep lookups.
*
* Revision 1.20 1996/03/20 09:35:23 adam
typedef struct Dict_struct {
int rw;
Dict_BFile dbf;
- char **(*grep_cmap)(const char **from);
+ char **(*grep_cmap)(const char **from, int len);
struct Dict_head head;
} *Dict;
int (*f)(char *name, const char *info, int pos,
void *client));
-void dict_grep_cmap (Dict dict, char **(*cmap)(const char **from));
+void dict_grep_cmap (Dict dict,
+ char **(*cmap)(const char **from, int len));
#define DICT_EOS 0