]> granicus.if.org Git - graphviz/commitdiff
Add rindex function
authorerg <devnull@localhost>
Tue, 9 Jun 2009 15:51:38 +0000 (15:51 +0000)
committererg <devnull@localhost>
Tue, 9 Jun 2009 15:51:38 +0000 (15:51 +0000)
cmd/gvpr/actions.c
cmd/gvpr/actions.h
cmd/gvpr/compile.c
cmd/gvpr/gprdata
cmd/gvpr/gvpr.1

index c190561e7a979f666b64df275a03a97c5e2e2fa8..a9b6ad85672b04ab648de74be0f11fcb4df32c45 100644 (file)
@@ -54,7 +54,7 @@ Agraph_t *sameG(void *p1, void *p2, char *fn, char *msg)
 }
 
 /* indexOf:
- * Return index of string s2 in string s1, or -1
+ * Return index of leftmost string s2 in string s1, or -1
  */
 int indexOf(char *s1, char *s2)
 {
@@ -76,6 +76,30 @@ int indexOf(char *s1, char *s2)
     return -1;
 }
 
+/* rindexOf:
+ * Return index of rightmost string s2 in string s1, or -1
+ */
+int rindexOf(char *s1, char *s2)
+{
+    char c1 = *s2;
+    char c;
+    char *p;
+    int len1 = strlen(s1);
+    int len2 = strlen(s2);
+
+    if (c1 == '\0')
+       return (len1);
+    p = s1 + (len1 - len2);
+    while (p >= s1) {
+       c = *p;
+       if ((c == c1) && (strncmp(p+1, s2+1, len2-1) == 0))
+           return (p - s1);
+       else
+           p--;
+    }
+    return -1;
+}
+
 /* match:
  * Return index of pattern pat in string str, or -1
  */
index e2f07269e286e2803206bfd89b20eddcbe161c90..388b36f1bb1a4af7062d683fce743441d3d44813 100644 (file)
@@ -29,6 +29,7 @@ extern "C" {
     extern Agobj_t *copy(Agraph_t * g, Agobj_t * obj);
     extern int copyAttr(Agobj_t * obj, Agobj_t * obj1);
     extern int indexOf(char *s1, char *s2);
+    extern int rindexOf(char *s1, char *s2);
     extern int match(char *str, char *pat);
     extern int lockGraph(Agraph_t * g, int);
     extern Agraph_t *compOf(Agraph_t * g, Agnode_t * n);
index 32b50c5abe68c0fe556b7c9e73892fc005511ac3..ccdc5c21a3fe32bc54d8a0f85099d8805908328c 100644 (file)
@@ -1298,6 +1298,9 @@ getval(Expr_t * pgm, Exnode_t * node, Exid_t * sym, Exref_t * ref,
        case F_index:
            v.integer = indexOf(args[0].string, args[1].string);
            break;
+       case F_rindex:
+           v.integer = rindexOf(args[0].string, args[1].string);
+           break;
        case F_match:
            v.integer = match(args[0].string, args[1].string);
            break;
index c50f12d867fd6d60b0fae9ff3d4e458cd32d5b87..e67572d87fc678fabca9b077669075800cac9d99 100644 (file)
@@ -59,6 +59,7 @@ F_nxtedgesg "nxtedge_sg"   FUNCTION E|A(1,G)|A(2,E)|A(3,V)
 F_compof    "compOf"       FUNCTION G|A(1,G)|A(2,V)
 F_kindof    "kindOf"       FUNCTION S|A(1,O)
 F_index     "index"        FUNCTION I|A(1,S)|A(2,S)
+F_rindex    "rindex"       FUNCTION I|A(1,S)|A(2,S)
 F_isedge    "isEdge"       FUNCTION E|A(1,V)|A(2,V)|A(3,S)
 F_isedgesg  "isEdge_sg"    FUNCTION E|A(1,G)|A(2,V)|A(3,V)|A(4,S)
 F_issubedge "isSubedge"    FUNCTION I|A(1,G)|A(2,E)
index 5800a2b1d6b5686f0051893d8085138c64483c2e..5d0cafa38ffdf484bbbf924e0c1d670ccba29faa 100644 (file)
@@ -617,8 +617,10 @@ length of \fIstr\fP, a fatal error occurs.
 returns the length of the string \fIs\fP.
 .TP
 \fBindex\fP(\fIs\fP : \fBstring\fP, \fIt\fP : \fBstring\fP) : \fBint\fP
+.TP
+\fBrindex\fP(\fIs\fP : \fBstring\fP, \fIt\fP : \fBstring\fP) : \fBint\fP
 returns the index of the character in string \fIs\fP where the leftmost
-copy of string \fIt\fP can be found, or \-1 if \fIt\fP is not a 
+(rightmost) copy of string \fIt\fP can be found, or \-1 if \fIt\fP is not a 
 substring of \fIs\fP.
 .TP
 \fBmatch\fP(\fIs\fP : \fBstring\fP, \fIp\fP : \fBstring\fP) : \fBint\fP