1 #define __for_each_sorted_set(_init, start, _i, b)                      \
   2         for (_init = b->data + start;                                   \
   3              sorted_set_checks(_i, b);                                  \
   4              _i += next_set(_i))
   5 
   6 #define for_each_sorted_set(i, b)                                       \
   7         __for_each_sorted_set(i, 0, i, b)
   8 
   9 #define for_each_key(b, iter)                                           \
  10         __for_each_sorted_set(struct bkey **_i, 0, _i, b)               \
  11                 for (int _j = 1; iter = node(_i, _j), _j < keys(_i) + 1; _j++)
  12 
  13 #define __for_good_keys(b, i, iter, start, end)                         \
  14         for (int _j = start;                                            \
  15              ({ _j = next_good_key(i, _j, b); iter = node(i, _j);       \
  16               _j <= end; });                                            \
  17              _j++)
  18 
  19 #define for_each_good_key(b, iter)                                      \
  20         __for_each_sorted_set(struct bkey **_i, 0, _i, b)               \
  21                 __for_good_keys(b, _i, iter, 1, keys(_i))
  22 
  23 #define for_good_keys_after(b, i, iter,  _search)                       \
  24         __for_good_keys(b, i, iter, btree_bsearch(i, _search), keys(i))
  25 
  26 #define for_each_good_key_after(b, iter, _search)                       \
  27         __for_each_sorted_set(struct bkey **_i, 0, _i, b)               \
  28                 for_good_keys_after(b, _i, iter, _search)
  29 

   1 #define STRTO_H(name, type)                                     \
   2 int name ## _h(const char *cp, type *res)                       \
   3 {                                                               \
   4         int u = 0;                                              \
   5         char *e;                                                \
   6         type i = simple_ ## name(cp, &e, 10);                   \
   7                                                                 \
   8         switch (tolower(*e)) {                                  \
   9         default:                                                \
  10                 return -EINVAL;                                 \
  11         case 'y':                                               \
  12         case 'z':                                               \
  13                 u++;                                            \
  14         case 'e':                                               \
  15                 u++;                                            \
  16         case 'p':                                               \
  17                 u++;                                            \
  18         case 't':                                               \
  19                 u++;                                            \
  20         case 'g':                                               \
  21                 u++;                                            \
  22         case 'm':                                               \
  23                 u++;                                            \
  24         case 'k':                                               \
  25                 u++;                                            \
  26                 if (e++ == cp)                                  \
  27                         return -EINVAL;                         \
  28         case '\n':                                              \
  29         case '\0':                                              \
  30                 if (*e == '\n')                                 \
  31                         e++;                                    \
  32         }                                                       \
  33                                                                 \
  34         if (*e)                                                 \
  35                 return -EINVAL;                                 \
  36                                                                 \
  37         while (u--) {                                           \
  38                 if ((type) ~0 > 0 &&                            \
  39                     (type) ~0 / 1024 <= i)                      \
  40                         return -EINVAL;                         \
  41                 if ((i > 0 && ANYSINT_MAX(type) / 1024 < i) ||  \
  42                     (i < 0 && -ANYSINT_MAX(type) / 1024 > i))   \
  43                         return -EINVAL;                         \
  44                 i *= 1024;                                      \
  45         }                                                       \
  46                                                                 \
  47         *res = i;                                               \
  48         return 0;                                               \
  49 }                                                               \
  50 EXPORT_SYMBOL_GPL(name ## _h);
  51 
  52 STRTO_H(strtol, long)
  53 STRTO_H(strtoll, long long)
  54 STRTO_H(strtoul, unsigned long)
  55 STRTO_H(strtoull, unsigned long long)

BcacheWiki: Macros (last edited 2010-12-18 09:03:40 by Kent)