// cppawk: C preprocessor wrapper around awk // Kaz Kylheku // // BSD-2 License // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. #ifndef __CPPAWK_CASE_PRIV_H #define __CPPAWK_CASE_PRIV_H #ifndef __CPPAWK_NARG_PRIV #include "narg-priv.h" #endif #ifndef __CPPAWK_BASE_H #include "base.h" #endif #if __have_switch #define __ca_first(x) case x: #define __ca_next(p, x) p case x: #define __mx_first(x) __of(x) #define __mx_next(p, x) p case x: #define __case_temps __ign #define __case(expr) switch (expr) #define __of(...) __varexpand(__ca_first, __ca_next, __VA_ARGS__) {{{ #define __matching(...) __varexpand(__ca_first, __ca_next, __VA_ARGS__) {{{ #define __mixed(x, y) __varexpand(__ca_first, __ca_next, __splice(x)) \ __varexpand(__ca_first, __ca_next, __splice(y)) {{{ #define __cbreak break; }}} #define __cfall }}} #define __cret(val) return val; }}} #define __otherwise default: {{{ #else #define __clause(expr) if (__pass || (expr) && (__pass = 1)) #define __of_first(x) (__val == (x)) #define __of_next(p, x) p || (__val == (x)) #define __mtch_first(x) (__val ~ (x)) #define __mtch_next(p, \ x) p || (__val ~ (x)) #define __case_temps __val, __once, __pass #define __case(expr) for ((__once = 1) && (__pass = 0) || (__val = expr); \ __once; \ __once = 0) #define __of(...) __clause(__varexpand(__of_first, __of_next, \ __VA_ARGS__)) {{{ #define __matching(...) __clause(__varexpand(__mtch_first, mtch_next, \ __VA_ARGS__)) {{{ #define __mixed(x, y) __clause(__varexpand(__of_first, __of_next, \ __splice(x)) || \ __varexpand(__mtch_first, __mtch_next, \ __splice(y))) {{{ #define __cbreak break; }}} #define __creturn(val) return val; }}} #define __cfall }}} #define __cret(val) return val; }}} #define __otherwise if (__pass = 1) {{{ #endif #endif