Added toupper function
authorAlan T. DeKok <aland@freeradius.org>
Tue, 21 Sep 2010 08:16:00 +0000 (10:16 +0200)
committerAlan T. DeKok <aland@freeradius.org>
Tue, 21 Sep 2010 08:17:26 +0000 (10:17 +0200)
src/main/xlat.c

index 9c32288..e53300a 100644 (file)
@@ -510,6 +510,8 @@ static size_t xlat_lc(UNUSED void *instance, REQUEST *request,
        char *p, *q;
        char buffer[1024];
 
+       if (outlen <= 1) return 0;
+
        if (!radius_xlat(buffer, sizeof(buffer), fmt, request, func)) {
                *out = '\0';
                return 0;
@@ -527,6 +529,34 @@ static size_t xlat_lc(UNUSED void *instance, REQUEST *request,
 }
 
 
+/*
+ *     Convert a string to uppercase
+ */
+static size_t xlat_uc(UNUSED void *instance, REQUEST *request,
+                      char *fmt, char *out, size_t outlen,
+                      UNUSED RADIUS_ESCAPE_STRING func)
+{
+       char *p, *q;
+       char buffer[1024];
+
+       if (outlen <= 1) return 0;
+
+       if (!radius_xlat(buffer, sizeof(buffer), fmt, request, func)) {
+               *out = '\0';
+               return 0;
+       }
+
+       for (p = buffer, q = out; *p != '\0'; p++, outlen--) {
+               if (outlen <= 1) break;
+
+               *(q++) = toupper((int) *p);
+       }
+
+       *q = '\0';
+
+       return strlen(out);
+}
+
 
 /*
  *     Compare two xlat_t structs, based ONLY on the module name.
@@ -643,6 +673,11 @@ int xlat_register(const char *module, RAD_XLAT_FUNC func, void *instance)
                c = xlat_find("tolower");
                rad_assert(c != NULL);
                c->internal = TRUE;
+
+               xlat_register("toupper", xlat_uc, &xlat_inst[0]);
+               c = xlat_find("toupper");
+               rad_assert(c != NULL);
+               c->internal = TRUE;
        }
 
        /*