[augeas-devel] [PATCH 1/1] libfa utility to experiment operations on finite automaton

Francis Giraldeau francis.giraldeau at revolutionlinux.com
Fri Mar 20 14:49:30 UTC 2009


diff --git a/Makefile.am b/Makefile.am
index 7affe4b..33e7d94 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,4 +1,4 @@
-SUBDIRS=gnulib/lib src gnulib/tests tests man doc
+SUBDIRS=gnulib/lib src gnulib/tests tests man doc examples
 
 ACLOCAL_AMFLAGS = -I gnulib/m4
 
diff --git a/configure.ac b/configure.ac
index 5568d52..2ac12ec 100644
--- a/configure.ac
+++ b/configure.ac
@@ -90,6 +90,7 @@ AC_OUTPUT(Makefile \
           src/Makefile \
           man/Makefile \
           tests/Makefile \
+          examples/Makefile \
 	  doc/Makefile \
 	  doc/naturaldocs/Makefile \
           augeas.pc augeas.spec)
diff --git a/examples/Makefile.am b/examples/Makefile.am
new file mode 100644
index 0000000..c5fbd4f
--- /dev/null
+++ b/examples/Makefile.am
@@ -0,0 +1,13 @@
+
+GNULIB= ../gnulib/lib/libgnu.la
+GNULIB_CFLAGS= -I $(top_srcdir)/gnulib/lib
+
+AM_CFLAGS = @AUGEAS_CFLAGS@ @WARN_CFLAGS@ $(GNULIB_CFLAGS) \
+			-I $(top_builddir)/src
+
+bin_PROGRAMS = fadot
+
+fadot_SOURCES = fadot.c 
+fadot_LDADD = $(top_builddir)/src/libaugeas.la $(GNULIB)
+
+
diff --git a/examples/examples.sh b/examples/examples.sh
new file mode 100755
index 0000000..bc78ff4
--- /dev/null
+++ b/examples/examples.sh
@@ -0,0 +1,21 @@
+#!/bin/sh 
+# create some examples of operations on finite automaton
+
+export PATH=./:$PATH
+
+dest=/tmp/fadot-examples
+mkdir -p $dest
+
+fadot -f $dest/sample.dot     -o show         "[a-z]*"
+fadot -f $dest/concat.dot     -o concat       "[a-b]" "[b-c]"
+fadot -f $dest/union.dot      -o union        "[a-b]" "[b-c]"
+fadot -f $dest/intersect.dot  -o intersect    "[a-b]" "[b-c]"
+fadot -f $dest/complement.dot -o complement   "[a-z]"
+fadot -f $dest/minus.dot      -o minus        "[a-z]" "[a-c]" 
+
+
+for i in $(ls -1 $dest/*.dot|cut -d. -f1); do
+    dot -Tpng -o $i.png $i.dot
+done
+
+echo "Example compilation complete. Results are available in directory $dest"
diff --git a/examples/fadot.c b/examples/fadot.c
new file mode 100644
index 0000000..b44958a
--- /dev/null
+++ b/examples/fadot.c
@@ -0,0 +1,214 @@
+/*
+ * fadot.c: example usage of finite automata library
+ *
+ * Copyright (C) 2009, Francis Giraldeau
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
+ *
+ * Author: Francis Giraldeau <francis.giraldeau at usherbrooke.ca>
+ */
+
+/*
+ * The purpose of this example is to show the usage of libfa
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <string.h>
+#include <getopt.h>
+
+#include "fa.h"
+
+const char *progname;
+
+__attribute__((noreturn))
+static void usage(void) {
+    fprintf(stderr, "\nUsage: %s [OPTIONS] REGEXP\n", progname);
+    fprintf(stderr, "Compile REGEXP and apply operation on them.\n");
+    fprintf(stderr, "\nOptions:\n\n");
+    fprintf(stderr, "  -o OPERATION		one of : show concat union intersect\n");
+    fprintf(stderr, "  	                         complement minus example\n");
+    fprintf(stderr, "  -f DOT_FILE 		Path of output .dot file\n");
+    fprintf(stderr, "  -n         		do not reduce resulting finite automaton\n");
+
+    exit(EXIT_FAILURE);
+}
+
+int main (int argc, char **argv)
+{
+
+	opterr = 0;
+
+	int reduce = 1;
+	char *file_output = NULL;
+	char *operation = NULL;
+	int i;
+	FILE *fd;
+	int c;
+	int nb_regexp = 0;
+
+	progname = argv[0];
+
+    while ((c = getopt (argc, argv, "nf:o:")) != -1)
+    	switch (c)
+    	{
+    	case 'n':
+    		reduce = 0;
+    		break;
+    	case 'f':
+    		file_output = optarg;
+    		break;
+    	case 'o':
+    		operation = optarg;
+    		break;
+    	case '?':
+    		if (optopt == 'o' || optopt == 'f')
+    			fprintf (stderr, "Option -%c requires an argument.\n", optopt);
+    		else if (isprint (optopt))
+    			fprintf (stderr, "Unknown option `-%c'.\n", optopt);
+    		else
+    			fprintf (stderr,
+    					"Unknown option character `\\x%x'.\n",
+    					optopt);
+    		usage();
+    		break;
+    	default:
+            usage();
+            break;
+    	}
+
+    //printf ("reduce = %d, file_output = %s, operation = %s\n",
+    //        reduce, file_output, operation);
+
+    if (!file_output){
+    	printf("\nPlease specify file output with option -f.\n");
+    	usage();
+    }
+
+    if (!operation){
+    	printf("\nPlease specify an operation with option -o.\n");
+    	usage();
+    }
+
+    for (i = optind; i < argc; i++){
+    	nb_regexp++;
+    }
+
+    if (nb_regexp == 0){
+    	printf("Please specify regexp to process.\n");
+    	usage();
+    }
+
+    struct fa* fa_result = NULL;
+
+    if (!strcmp(operation,"show")){
+    	fa_compile(argv[optind], strlen(argv[optind]), &fa_result);
+    } else if (!strcmp(operation,"concat")){
+
+    	if (nb_regexp < 2){
+    		fprintf(stderr,"Please specify 2 or more regexp to concat");
+    		return 1;
+    	}
+
+    	fa_result = fa_make_basic(FA_EPSILON);
+    	struct fa* fa_tmp;
+    	for (i = optind; i < argc; i++){
+    		fa_compile(argv[i], strlen(argv[i]), &fa_tmp);
+    		fa_result = fa_concat(fa_result, fa_tmp);
+    	}
+
+    } else if (!strcmp(operation, "union")){
+
+    	if (nb_regexp < 2){
+    		fprintf(stderr,"Please specify 2 or more regexp to union");
+    		return 1;
+    	}
+
+    	fa_result = fa_make_basic(FA_EMPTY);
+
+    	struct fa* fa_tmp;
+    	for (i = optind; i < argc; i++){
+    		fa_compile(argv[i], strlen(argv[i]), &fa_tmp);
+    		fa_result = fa_union(fa_result, fa_tmp);
+    	}
+
+    } else if (!strcmp(operation, "intersect")){
+
+        	if (nb_regexp < 2){
+        		fprintf(stderr,"Please specify 2 or more regexp to intersect");
+        		return 1;
+        	}
+
+        	fa_compile(argv[optind], strlen(argv[optind]), &fa_result);
+        	struct fa* fa_tmp;
+
+        	for (i = optind+1; i < argc; i++){
+        		fa_compile(argv[i], strlen(argv[i]), &fa_tmp);
+        		fa_result = fa_intersect(fa_result, fa_tmp);
+        	}
+
+    } else if (!strcmp(operation, "complement")){
+
+    	if (nb_regexp >= 2){
+    		fprintf(stderr,"Please specify one regexp to complement");
+    		return 1;
+    	}
+
+		fa_compile(argv[optind], strlen(argv[optind]), &fa_result);
+		fa_result = fa_complement(fa_result);
+
+    } else if (!strcmp(operation, "minus")){
+
+    	if (nb_regexp != 2){
+    		fprintf(stderr,"Please specify 2 regexp for operation minus");
+    		return 1;
+    	}
+
+    	struct fa* fa_tmp1;
+    	struct fa* fa_tmp2;
+    	fa_compile(argv[optind], strlen(argv[optind]), &fa_tmp1);
+    	fa_compile(argv[optind+1], strlen(argv[optind+1]), &fa_tmp2);
+		fa_result = fa_minus(fa_tmp1, fa_tmp2);
+
+    } else if (!strcmp(operation, "example")){
+
+    	if (nb_regexp != 1){
+    		fprintf(stderr,"Please specify one regexp for operation example");
+    		return 1;
+    	}
+
+    	char* word = NULL;
+    	size_t word_len = 0;
+    	fa_compile(argv[optind], strlen(argv[optind]), &fa_result);
+		fa_example(fa_result, &word, &word_len);
+		printf("Example word = %s\n", word);
+
+    }
+
+    if ((fd = fopen(file_output, "w")) == NULL) {
+        fprintf(stderr, "Error while opening file %s \n", file_output);
+        return 1;
+    }
+
+	if (reduce){
+		fa_minimize(fa_result);
+	}
+
+    fa_dot(fd, fa_result);
+
+    return 0;
+
+}
-- 
1.5.6.3




More information about the augeas-devel mailing list