***********************
** FILE NAME : String.h
** SYSTEM NAME : Andromeda X-Windows Encapsulation
-** VERSION NUMBER : $Revision: 1.1 $
+** VERSION NUMBER : $Revision: 1.2 $
**
** DESCRIPTION : Character String class definition
**
/*****************************
$Log: String.h,v $
- Revision 1.1 2002-07-25 08:01:26 arjen
+ Revision 1.2 2002-09-28 06:45:51 arjen
+ New feature: subtring selection by regular expression.
+ Bugfix: use the std: namespace for STL classes istream and ostream
+
+ Revision 1.1 2002/07/25 08:01:26 arjen
First checkin, AXE release 0.2
*****************************/
-// static const char RCSID[] = "$Id: String.h,v 1.1 2002-07-25 08:01:26 arjen Exp $";
+// static const char RCSID[] = "$Id: String.h,v 1.2 2002-09-28 06:45:51 arjen Exp $";
#ifndef STRING_H
#define STRING_H
#include <stdlib.h>
-#include <iostream.h>
+#include <iostream>
#include <string.h>
#include <regex.h>
/*
* Substring selection
+ *
+ * A substring can be selected by a start index and a length or
+ * by matching a regular expression.
+ *
+ * Selecting a substring by regular expression, combined with
+ * the lvalue semantics of the substring class is a particularly
+ * powerful concept. Possible uses are for example:
+ *
+ * (assuming String S, M; regex R;)
+ * M = S(R); -> Returns matching part of S into M.
+ * S(R) = "replacement"; -> replace matching part of S.
+ * S(R) = ""; -> Removes matching part from S.
+ * S(R) == S; -> true if and only if all of S matches R exactly.
*/
substring operator()(int start, int len);
+ substring operator()(const regex &r);
/*
* Input and output
*/
- friend ostream& operator<<(ostream &, const String &);
- friend istream& operator>>(istream &, String &);
+ friend std::ostream& operator<<(std::ostream &, const String &);
+ friend std::istream& operator>>(std::istream &, String &);
/*
* String comparison tests
class regex
{
+ friend class String;
+
regex_t expression;
public:
***********************
** FILE NAME : regex.cpp
** SYSTEM NAME : Andromeda X-Windows Encapsulation
-** VERSION NUMBER : $Revision: 1.1 $
+** VERSION NUMBER : $Revision: 1.2 $
**
** DESCRIPTION : regex class implementation.
**
/*****************************
$Log: regex.cpp,v $
- Revision 1.1 2002-07-25 08:01:27 arjen
+ Revision 1.2 2002-09-28 06:45:51 arjen
+ New feature: subtring selection by regular expression.
+ Bugfix: use the std: namespace for STL classes istream and ostream
+
+ Revision 1.1 2002/07/25 08:01:27 arjen
First checkin, AXE release 0.2
*****************************/
-static const char RCSID[] = "$Id: regex.cpp,v 1.1 2002-07-25 08:01:27 arjen Exp $";
+static const char RCSID[] = "$Id: regex.cpp,v 1.2 2002-09-28 06:45:51 arjen Exp $";
#include <stdio.h>
#include <ctype.h>
{
return regexec(&r.expression, s.p->s, 0, 0, 0) == 0;
}
+
+substring String::operator()(const regex &r)
+{
+ substring sub;
+ regmatch_t match;
+
+ sub.str = this;
+ sub.start = 0;
+ sub.len = 0;
+
+ if (regexec(&r.expression, p->s, 1, &match, 0) == 0)
+ {
+ sub.start = match.rm_so;
+ sub.len = match.rm_eo - match.rm_so;
+ }
+
+ return sub;
+}
+