/*
* Manipulation routines for BREGEXP list
*
- * Eric Bollengier, Mars 2007
+ * Eric Bollengier, March 2007
*
* Version $Id$
*
BREGEXP *self = (BREGEXP *)malloc(sizeof(BREGEXP));
memset(self, 0, sizeof(BREGEXP));
- self->nmatch = 20;
-
if (!self->extract_regexp(motif)) {
// Dmsg0(100, "bregexp: extract_regexp error\n");
printf("bregexp: extract_regexp error\n");
return NULL;
}
+ static int _start[RE_NREGS];
+ static int _end[RE_NREGS];
+
self->result = get_pool_memory(PM_FNAME);
+ self->result[0] = '\0';
+
+#ifdef HAVE_REGEX_H
+ /* TODO: que devient cette memoire... */
+ self->_regs_match = (int *) malloc (2*RE_NREGS * sizeof(int));
+
+ self->regs.num_regs = RE_NREGS;
+ self->regs.start = self->_regs_match;
+ self->regs.end = self->_regs_match+(RE_NREGS * sizeof(int));
+#endif
return self;
}
+void free_bregexp(BREGEXP *self)
+{
+ Dmsg0(500, "bregexp: freeing BREGEXP object\n");
+
+ if (self->expr) {
+ free(self->expr);
+ }
+ if (self->result) {
+ free_pool_memory(self->result);
+ }
+ if (self->_regs_match) {
+ free(self->_regs_match);
+ }
+
+ regfree(&self->preg);
+ free(self);
+}
+
+void free_bregexps(alist *bregexps)
+{
+ Dmsg0(500, "bregexp: freeing all BREGEXP object\n");
+
+ BREGEXP *elt;
+ foreach_alist(elt, bregexps) {
+ free_bregexp(elt);
+ }
+}
+
bool BREGEXP::extract_regexp(const char *motif)
{
char sep = motif[0];
char *search = (char *) motif + 1;
char *replace;
- int options = REG_EXTENDED;
+ int options = REG_EXTENDED | REG_NEWLINE;
bool ok = false;
bool found_motif = false;
if (*search == 'i') {
options |= REG_ICASE;
}
+ if (*search == 'g') {
+ /* recherche multiple*/
+ }
search++;
}
// Dmsg1(100, "bregexp: compile error: %s\n", prbuf);
return false;
}
-
- return true;
-}
-
-void free_bregexp(BREGEXP *self)
-{
- Dmsg0(500, "bregexp: freeing BREGEXP object\n");
-
- if (self->expr) {
- free(self->expr);
- }
- if (self->result) {
- free_pool_memory(self->result);
- }
- regfree(&self->preg);
- free(self);
+ return true;
}
-void free_bregexps(alist *bregexps)
-{
- Dmsg0(500, "bregexp: freeing all BREGEXP object\n");
-
- BREGEXP *elt;
- foreach_alist(elt, bregexps) {
- free_bregexp(elt);
- }
-}
+#ifndef HAVE_REGEX_H
+ #define BREGEX_CAST unsigned
+#else
+ #define BREGEX_CAST const
+#endif
/* return regexp->result */
char *BREGEXP::replace(const char *fname)
{
- struct re_registers regs;
int flen = strlen(fname);
- int rc = re_search(&preg, fname, flen, 0, flen, ®s);
+ int rc = re_search(&preg, (BREGEX_CAST char*) fname, flen, 0, flen, ®s);
if (rc < 0) {
printf("E: regex mismatch\n");
}
}
+ /* we copy what is out of the match */
strcpy(result + i, fname + regs->end[0]);
return result;
printf("result=%s\n", result?result:"(null)");
}
+#ifdef TEST
+
int main(int argc, char **argv)
{
BREGEXP *reg;
exit(0);
}
+#endif
/*
* Bacula BREGEXP Structure definition for FileDaemon
- * Eric Bollengier Mars 2007
+ * Eric Bollengier March 2007
* Version $Id$
*/
/*
#ifndef __BREG_H_
#define __BREG_H_ 1
+//#undef HAVE_REGEX_H
#ifndef HAVE_REGEX_H
#include "bregex.h"
* BREGEXP *breg = new_bregexp("!/prod!/test!");
* char *filename = breg->replace("/prod/data.dat");
* or
- * filename = breg->result;
+ * char *filename = breg->result;
* free_bregexp(breg);
*/
POOLMEM *expr; /* search epression */
POOLMEM *subst; /* substitution */
regex_t preg; /* regex_t result of regcomp() */
-
- int nmatch;
+ struct re_registers regs; /* contains match */
+
+ int *_regs_match;
char *return_fname(const char *fname, int len); /* return fname as result */
char *edit_subst(const char *fname, struct re_registers *regs);
--- /dev/null
+/*
+ * Test program for testing regular expressions.
+ *
+ * Kern Sibbald, MMVI
+ *
+ */
+/*
+ Bacula® - The Network Backup Solution
+
+ Copyright (C) 2006-2006 Free Software Foundation Europe e.V.
+
+ The main author of Bacula is Kern Sibbald, with contributions from
+ many others, a complete list can be found in the file AUTHORS.
+ This program is Free Software; you can redistribute it and/or
+ modify it under the terms of version two of the GNU General Public
+ License as published by the Free Software Foundation plus additions
+ that are listed in the file LICENSE.
+
+ This program 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA.
+
+ Bacula® is a registered trademark of John Walker.
+ The licensor of Bacula is the Free Software Foundation Europe
+ (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
+ Switzerland, email:ftf@fsfeurope.org.
+*/
+
+/*
+ * If you define BACULA_REGEX, bregex will be built with the
+ * Bacula bregex library, which is the same code that we
+ * use on Win32, thus using Linux, you can test your Win32
+ * expressions. Otherwise, this program will link with the
+ * system library routines.
+ */
+//#define BACULA_REGEX
+
+#include "bacula.h"
+#include <stdio.h>
+#include "lib/breg.h"
+
+
+static void usage()
+{
+ fprintf(stderr,
+"\n"
+"Usage: bregex [-d debug_level] -f <data-file> -e /test/test2/\n"
+" -f specify file of data to be matched\n"
+" -e specify expression\n"
+" -? print this message.\n"
+"\n");
+
+ exit(1);
+}
+
+
+int main(int argc, char *const *argv)
+{
+ regex_t preg;
+ char prbuf[500];
+ char *fname = NULL;
+ char *expr = NULL;
+ int rc, ch;
+ char data[1000];
+ char pat[500];
+ FILE *fd;
+ bool match_only = true;
+ int lineno;
+ bool no_linenos = false;
+
+
+ setlocale(LC_ALL, "");
+ bindtextdomain("bacula", LOCALEDIR);
+ textdomain("bacula");
+
+ while ((ch = getopt(argc, argv, "d:f:e:")) != -1) {
+ switch (ch) {
+ case 'd': /* set debug level */
+ debug_level = atoi(optarg);
+ if (debug_level <= 0) {
+ debug_level = 1;
+ }
+ break;
+
+ case 'f': /* data */
+ fname = optarg;
+ break;
+
+ case 'e':
+ expr = optarg;
+ break;
+
+ case '?':
+ default:
+ usage();
+
+ }
+ }
+ argc -= optind;
+ argv += optind;
+
+ if (!fname) {
+ printf("A data file must be specified.\n");
+ usage();
+ }
+
+ if (!expr) {
+ printf("An expression must be specified.\n");
+ usage();
+ }
+
+ OSDependentInit();
+
+ BREGEXP *reg;
+
+ reg = new_bregexp(expr);
+
+ if (!reg) {
+ printf("Can't use %s as 'sed' expression\n", expr);
+ exit (1);
+ }
+
+ fd = fopen(fname, "r");
+ if (!fd) {
+ printf(_("Could not open data file: %s\n"), fname);
+ exit(1);
+ }
+
+ while (fgets(data, sizeof(data)-1, fd)) {
+ strip_trailing_newline(data);
+ reg->replace(data);
+ printf("%s\n", reg->result);
+ }
+ fclose(fd);
+ free_bregexp(reg);
+ exit(0);
+}
+/*
+ TODO:
+ - ajout /g
+
+ - tests
+ * test avec /i (visiblement il ne marche pas sur bregexp.c)
+ * test avec un sed et faire un diff
+ * test avec une boucle pour voir les fuites
+ * tester les cas possibles pour la compilation d'une expression
+ - manque le depart, le milieu, la fin, utilise des groupes sans
+ reference...
+
+*/