[augeas-devel] augeas: master - Indicate whether an FA uses character ranges or regexps on transitions

David Lutterkort lutter at fedoraproject.org
Thu Jan 14 18:20:04 UTC 2010


Gitweb:        http://git.fedorahosted.org/git/augeas.git?p=augeas.git;a=commitdiff;h=a7a422ab28781148d703ecb1abc254847c51a2bf
Commit:        a7a422ab28781148d703ecb1abc254847c51a2bf
Parent:        a37681e5f4fa0894be1f982d6782b4aedd49495a
Author:        David Lutterkort <lutter at redhat.com>
AuthorDate:    Wed Jan 13 17:06:51 2010 -0800
Committer:     David Lutterkort <lutter at redhat.com>
CommitterDate: Thu Jan 14 09:31:30 2010 -0800

Indicate whether an FA uses character ranges or regexps on transitions

  * src/fa.c (struct fa): new field trans_re; (fa_as_regexp): set trans_re;
    (fa_dot): print regexp rather than char range if trans_re is set
---
 src/fa.c |   26 ++++++++++++++++++++++----
 1 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/src/fa.c b/src/fa.c
index 6d2f8ca..f0d067a 100644
--- a/src/fa.c
+++ b/src/fa.c
@@ -56,12 +56,18 @@ int fa_minimization_algorithm = FA_MIN_HOPCROFT;
  * is put on this list. Dead/unreachable states are cleared from the list
  * at opportune times (e.g., during minimization) It's poor man's garbage
  * collection
+ *
+ * Normally, transitions are on a character range [min..max]; in
+ * fa_as_regexp, we store regexps on transitions in the re field of each
+ * transition. TRANS_RE indicates that we do that, and is used by fa_dot to
+ * produce proper graphs of an automaton transitioning on regexps.
  */
 struct fa {
     struct state *initial;
     int           deterministic : 1;
     int           minimal : 1;
     unsigned int  nocase : 1;
+    int           trans_re : 1;
 };
 
 /* A state in a finite automaton. Transitions are never shared between
@@ -3941,6 +3947,8 @@ int fa_as_regexp(struct fa *fa, char **regexp, size_t *regexp_len) {
     if (fin == NULL)
         goto error;
 
+    fa->trans_re = 1;
+
     list_for_each(s, fa->initial) {
         r = convert_trans_to_re(s);
         if (r < 0)
@@ -4230,13 +4238,23 @@ void fa_dot(FILE *out, struct fa *fa) {
     fprintf(out, "%s -> \"%p\";\n", fa->deterministic ? "dfa" : "nfa",
             fa->initial);
 
+    struct re_str str;
+    MEMZERO(&str, 1);
     list_for_each(s, fa->initial) {
         for_each_trans(t, s) {
             fprintf(out, "\"%p\" -> \"%p\" [ label = \"", s, t->to);
-            print_char(out, t->min);
-            if (t->min != t->max) {
-                fputc('-', out);
-                print_char(out, t->max);
+            if (fa->trans_re) {
+                re_as_string(t->re, &str);
+                for (int i=0; i < str.len; i++) {
+                    print_char(out, str.rx[i]);
+                }
+                release_re_str(&str);
+            } else {
+                print_char(out, t->min);
+                if (t->min != t->max) {
+                    fputc('-', out);
+                    print_char(out, t->max);
+                }
             }
             fprintf(out, "\" ];\n");
         }




More information about the augeas-devel mailing list