Index: app/src/ser/Makefile
===================================================================
--- app/src/ser/Makefile	(revision 25ae32e4c2354e0ed6756bbe1de83f39cd814652)
+++ app/src/ser/Makefile	(revision 25ae32e4c2354e0ed6756bbe1de83f39cd814652)
@@ -0,0 +1,11 @@
+
+ser:
+
+copy:
+ifdef UTT_BIN_DIR
+	cp ser ${UTT_BIN_DIR}
+endif
+
+clean:
+
+uninstall:
Index: app/src/ser/ser
===================================================================
--- app/src/ser/ser	(revision 25ae32e4c2354e0ed6756bbe1de83f39cd814652)
+++ app/src/ser/ser	(revision 25ae32e4c2354e0ed6756bbe1de83f39cd814652)
@@ -0,0 +1,168 @@
+#!/usr/bin/perl
+
+#package:        UAM Text Tools
+#component:      ser (pattern search tool)
+#author:         Tomasz Obrêbski
+
+use strict;
+use Getopt::Long;
+
+my $SHARE_DIR="/usr/share/utt";
+my $USER_DIR="$ENV{HOME}/.utt/share";
+
+#use lib "$ENV{HOME}/.utt/lib/perl";
+#use attr;
+
+Getopt::Long::Configure('no_ignore_case_always');
+
+my $help=0;
+my $pattern=0;
+my $only_matching=0;
+my $no_markers=0;
+my $macros=0;
+my $flextemplate=0;
+my $flex=0;
+my $morfield='lem';
+
+my $configfile1="../../conf/ser.conf";
+my $configfile2="../conf/ser.conf";
+
+#read configuration files###########################
+my $file;
+foreach $file ($configfile1, $configfile2){
+  if(open(CONFIG, $file)){
+  	while (<CONFIG>) {
+  		chomp;                  
+      		s/#.*//;                
+	      	s/^\s+//;               
+      		s/\s+$//;               
+    		next unless length;     
+    		my ($name, $value) = split(/\s*=\s*/, $_, 2);
+    		if(($name eq "pattern")or($name eq "e")){
+			$pattern=$value;
+    		}
+    		elsif($name eq "morph"){
+			$morfield=$value;
+    		}
+    		elsif(($name eq "only-matching")or($name eq "m")){
+			$only_matching=1;
+    		}
+    		elsif(($name eq "no-markers")or($name eq "M")){
+			$no_markers=1;
+    		}
+    		elsif($name eq "define"){
+			$macros=$value;
+    		}
+    		elsif($name eq "flex-template"){
+			$flextemplate=$value;
+    		}
+    		elsif($name eq "flex"){
+			$flex=1;
+    		}
+    		elsif(($name eq "help")or($name eq "h")){
+			$help=1;
+    		}
+    	
+	} 
+  	close CONFIG;
+  }
+}
+#########################################################
+
+GetOptions("pattern|e=s" => \$pattern,
+           "morph=s" => \$morfield,
+	   "only-matching|m" => \$only_matching,
+           "no-markers|M" => \$no_markers,
+	   "define=s" => \$macros,
+	   "flex-template=s" => \$flextemplate,
+	   "flex" => \$flex,
+	   "help|h" => \$help);
+
+if($help)
+{
+    print <<'END'
+Usage: ser [OPTIONS] [file ..]
+
+Options:
+   --help -h                      Help.
+   --pattern=PATTERN -e	PATTERN   Search pattern.
+   --morph=STRING                 Field containing morphological information (default 'lem').
+   --define=FILE                  Read macrodefinitions from FILE.
+   --flex-template=FILE           Read flex code template from FILE.
+   --only-matching -m		  Print only fragments matching PATTERN.
+   --no-markers -M                Do not print BOM and EOM markers [TODO].
+   --flex                         Print only the generated flex code and exit.
+END
+;
+    exit 0;
+}
+
+die("$0: no pattern given.\n") unless $pattern;
+
+die("$0: flex template file not found") unless
+    $flextemplate or
+    -e "$USER_DIR/ser.l.template" and $flextemplate="$USER_DIR/ser.l.template" or
+    -e "$SHARE_DIR/ser.l.template" and $flextemplate="$SHARE_DIR/ser.l.template";
+
+die("$0: macro file not found") unless
+    $macros or
+    -e "$USER_DIR/terms.m4" and $macros="$USER_DIR/terms.m4" or
+    -e "$SHARE_DIR/terms.m4" and $macros="$SHARE_DIR/terms.m4";
+
+
+#$pattern =~ s/cat\(([^)]+)\)/'cat('.pre($1).')'/ge;
+# quoting escaped commas /NIE DZIA£A/
+$pattern =~ s/\\,/\\`\\`\\,''/g;
+
+# protecting backslash
+$pattern =~ s/\\/\\\\\\/g;
+
+# discarding spaces
+$pattern =~ s/\s+/\\`'/g; #` 
+
+my $flexpattern = `echo \"$pattern\" | m4 --define=ENDOFSEGMENT=\\\\n --define=MORFIELD=$morfield $macros - 2>/dev/null`;
+
+die("Incorrect pattern (m4).") if $? >> 8;
+
+
+chomp $flexpattern;
+
+# <> expansion
+$flexpattern =~ s/<([^>]+)>/`echo $1 | tag2re`/ge;
+
+# restricting the value of the . special symbol
+$flexpattern =~ s/\./[^ \\t\\n\\r\\f]/g;
+
+# perl-like shortcuts for character classes
+# perl exact
+$flexpattern =~ s/\\s/[ \\t]/g;
+$flexpattern =~ s/\\S/[^ \\t\\n\\r\\f]/g;
+$flexpattern =~ s/\\d/[0-9]/g;
+$flexpattern =~ s/\\D/[^0-9 \\t\\n\\r\\f]/g;
+$flexpattern =~ s/\\w/[a-z±æê³ñó¶Œ¿A-Z¡ÆÊ£ÑÓŠ¬¯0-9_]/g;
+$flexpattern =~ s/\\W/[^a-z±æê³ñó¶Œ¿A-Z¡ÆÊ£ÑÓŠ¬¯0-9_ \\t\\n\\r\\f]/g;
+# extensions
+$flexpattern =~ s/\\l/[a-z±æê³ñó¶Œ¿]/g; #lowercase letter
+$flexpattern =~ s/\\L/[A-Z¡ÆÊ£ÑÓŠ¬¯]/g; #upercase letter
+
+# protecting slash
+$flexpattern =~ s/\//\\\//g;
+
+my $defaultaction = ($only_matching) ? '' : 'ECHO';
+
+# docelowo posrednie pliki powinny byc w jakims tempie !!!
+
+system "m4 \"--define=PATTERN=$flexpattern\" \"--define=DEFAULTACTION=$defaultaction\" $flextemplate > $USER_DIR/ser.l";
+
+if($flex)
+{
+    system "cat $USER_DIR/ser.l";
+    exit 0;
+}
+
+system "flex -o$USER_DIR/ser.c $USER_DIR/ser.l";
+system "cc -O3 -o $USER_DIR/ser.executable $USER_DIR/ser.c -lfl";
+system "$USER_DIR/ser.executable";
+
+system "rm -f $USER_DIR/ser.{l,c,executable}";
+
