[前][次][番号順一覧][スレッド一覧]

ruby-changes:17226

From: akr <ko1@a...>
Date: Sun, 12 Sep 2010 04:28:21 +0900 (JST)
Subject: [ruby-changes:17226] Ruby:r29226 (trunk): * process.c (rlimit_resource_name2int): use STRCASECMP to avoid

akr	2010-09-12 04:28:07 +0900 (Sun, 12 Sep 2010)

  New Revision: 29226

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=29226

  Log:
    * process.c (rlimit_resource_name2int): use STRCASECMP to avoid
      ALLOCA_N.

  Modified files:
    trunk/ChangeLog
    trunk/process.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 29225)
+++ ChangeLog	(revision 29226)
@@ -1,3 +1,8 @@
+Sun Sep 12 04:27:13 2010  Tanaka Akira  <akr@f...>
+
+	* process.c (rlimit_resource_name2int): use STRCASECMP to avoid
+	  ALLOCA_N.
+
 Sat Sep 11 16:47:41 2010  Nobuyoshi Nakada  <nobu@r...>
 
 	* hash.c (ruby_setenv): raise if putenv and SetEnvironmentVariable
Index: process.c
===================================================================
--- process.c	(revision 29225)
+++ process.c	(revision 29226)
@@ -3578,79 +3578,95 @@
 static int
 rlimit_resource_name2int(const char *name, int casetype)
 {
-    size_t len = strlen(name);
-    if (16 < len) return -1;
-    if (casetype == 1) {
-        size_t i;
-        char *name2 = ALLOCA_N(char, len+1);
-        for (i = 0; i < len; i++) {
-            if (!ISLOWER(name[i]))
-                return -1;
-            name2[i] = TOUPPER(name[i]);
-        }
-        name2[len] = '\0';
-        name = name2;
-    }
+    int resource;
+    const char *p;
+#define RESCHECK(r) \
+    do { \
+        if (STRCASECMP(name, #r) == 0) { \
+            resource = RLIMIT_##r; \
+            goto found; \
+        } \
+    } while (0)
 
-    switch (*name) {
+    switch (TOUPPER(*name)) {
       case 'A':
 #ifdef RLIMIT_AS
-        if (strcmp(name, "AS") == 0) return RLIMIT_AS;
+        RESCHECK(AS);
 #endif
         break;
 
       case 'C':
 #ifdef RLIMIT_CORE
-        if (strcmp(name, "CORE") == 0) return RLIMIT_CORE;
+        RESCHECK(CORE);
 #endif
 #ifdef RLIMIT_CPU
-        if (strcmp(name, "CPU") == 0) return RLIMIT_CPU;
+        RESCHECK(CPU);
 #endif
         break;
 
       case 'D':
 #ifdef RLIMIT_DATA
-        if (strcmp(name, "DATA") == 0) return RLIMIT_DATA;
+        RESCHECK(DATA);
 #endif
         break;
 
       case 'F':
 #ifdef RLIMIT_FSIZE
-        if (strcmp(name, "FSIZE") == 0) return RLIMIT_FSIZE;
+        RESCHECK(FSIZE);
 #endif
         break;
 
       case 'M':
 #ifdef RLIMIT_MEMLOCK
-        if (strcmp(name, "MEMLOCK") == 0) return RLIMIT_MEMLOCK;
+        RESCHECK(MEMLOCK);
 #endif
         break;
 
       case 'N':
 #ifdef RLIMIT_NOFILE
-        if (strcmp(name, "NOFILE") == 0) return RLIMIT_NOFILE;
+        RESCHECK(NOFILE);
 #endif
 #ifdef RLIMIT_NPROC
-        if (strcmp(name, "NPROC") == 0) return RLIMIT_NPROC;
+        RESCHECK(NPROC);
 #endif
         break;
 
       case 'R':
 #ifdef RLIMIT_RSS
-        if (strcmp(name, "RSS") == 0) return RLIMIT_RSS;
+        RESCHECK(RSS);
 #endif
         break;
 
       case 'S':
 #ifdef RLIMIT_STACK
-        if (strcmp(name, "STACK") == 0) return RLIMIT_STACK;
+        RESCHECK(STACK);
 #endif
 #ifdef RLIMIT_SBSIZE
-        if (strcmp(name, "SBSIZE") == 0) return RLIMIT_SBSIZE;
+        RESCHECK(SBSIZE);
 #endif
         break;
     }
     return -1;
+
+  found:
+    switch (casetype) {
+      case 0:
+        for (p = name; *p; p++)
+            if (!ISUPPER(*p))
+                return -1;
+        break;
+
+      case 1:
+        for (p = name; *p; p++)
+            if (!ISLOWER(*p))
+                return -1;
+        break;
+
+      default:
+        rb_bug("unexpected casetype");
+    }
+    return resource;
+#undef RESCHECK
 }
 
 static int

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]