]> code.citadel.org Git - citadel.git/blobdiff - libcitadel/lib/tools.c
generate_uuid() now generates more or less DCE-compliant uuid's
[citadel.git] / libcitadel / lib / tools.c
index 9060e130c609d7012e639971cbe7cfc1da113aa5..0c012e7955e184d128b589ad547b1bf645ebb767 100644 (file)
@@ -771,19 +771,30 @@ int stripout(char *str, char leftboundary, char rightboundary) {
  * Reduce a string down to a boundarized substring (for example, remove
  * parentheses and anything outside them).
  */
-void stripallbut(char *str, char leftboundary, char rightboundary) {
-       int a;
-
-       for (a = 0; a < strlen(str); ++ a) {
-               if (str[a] == leftboundary) strcpy(str, &str[a+1]);
-       }
-
-       for (a = 0; a < strlen(str); ++ a) {
-               if (str[a] == rightboundary) str[a] = 0;
+long stripallbut(char *str, char leftboundary, char rightboundary) {
+       long len = 0;
+
+       char *lb = NULL;
+       char *rb = NULL;
+
+       lb = strrchr(str, leftboundary);
+       if (lb != NULL) {
+               ++lb;
+               rb = strchr(str, rightboundary);
+               if ((rb != NULL) && (rb >= lb))  {
+                       *rb = 0;
+                       fflush(stderr);
+                       len = (long)rb - (long)lb;
+                       memmove(str, lb, len);
+                       str[len] = 0;
+                       return(len);
+               }
        }
 
+       return (long)strlen(str);
 }
 
+
 char *myfgets(char *s, int size, FILE *stream) {
        char *ret = fgets(s, size, stream);
        char *nl;
@@ -847,12 +858,20 @@ char *strcpy(char *dest, const char *src) {
  * Generate a new, globally unique UID parameter for a calendar etc. object
  */
 void generate_uuid(char *buf) {
-       static int seq = 0;
+       static int seq = (-1);
+
+       if (seq == (-1)) {
+               seq = (int)rand();
+       }
+       ++seq;
+       seq = (seq % 0x0FFF) ;
 
-       sprintf(buf, "%lx-%lx-%x",
-               time(NULL),
+       sprintf(buf, "%08lx-%04lx-4%03x-a%03x-%012lx",
+               (long)time(NULL),
                (long)getpid(),
-               (seq++)
+               seq,
+               seq,
+               (long)rand()
        );
 }