// cppawk: C preprocessor wrapper around awk // Copyright 2022 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_FIELD_H #define __CPPAWK_FIELD_H #ifndef __CPPAWK_BASE_H #include "base.h" #endif #ifndef __CPPAWK_NARG_PRIV_H #include "narg-priv.h" #endif function delf(__at, __count, __i, __j) { if (!__present(__count)) __count = 1 if (0 < __count && 1 <= __at && __at <= NF) { __i = __at __j = __at + __count while (__j <= NF) $(__i++) = $(__j++) NF = __i - 1; } } function __insf(__at, __count, __i, __j) { if (!__present(__count)) __count = 1 if (NF < __at) NF = __at - 1 if (0 < __count && 1 <= __at) { __i = NF + __count __j = NF NF = __i while (__j >= __at) $(__i--) = $(__j--) return 1 } return 0 } #define __insf_first(arg, n, at) $(at + n - 1) = arg #define __insf_next(prev, arg, n, at) prev; $(at + n - 1) = arg #define insf(at, ...) { \ if (__insf(at, __narg(__VA_ARGS__))) { \ __variaexpand(__insf_first, __insf_next, at, __VA_ARGS__); \ } \ } #endif