0001
0002
0003
0004
0005
0006 meta_in()
0007 {
0008 case "$1" in
0009 [$2]) return 0;;
0010 esac
0011
0012 return 1
0013 }
0014
0015
0016 meta_has_ret()
0017 {
0018 meta_in "$1" "bBiIfFlR"
0019 }
0020
0021
0022 meta_has_acquire()
0023 {
0024 meta_in "$1" "BFIlR"
0025 }
0026
0027
0028 meta_has_release()
0029 {
0030 meta_in "$1" "BFIRs"
0031 }
0032
0033
0034 meta_has_relaxed()
0035 {
0036 meta_in "$1" "BFIR"
0037 }
0038
0039
0040 find_fallback_template()
0041 {
0042 local pfx="$1"; shift
0043 local name="$1"; shift
0044 local sfx="$1"; shift
0045 local order="$1"; shift
0046
0047 local base=""
0048 local file=""
0049
0050
0051
0052
0053
0054
0055 for base in "${pfx}${name}${sfx}${order}" "${name}"; do
0056 file="${ATOMICDIR}/fallbacks/${base}"
0057
0058 if [ -f "${file}" ]; then
0059 printf "${file}"
0060 break
0061 fi
0062 done
0063 }
0064
0065
0066 gen_ret_type() {
0067 local meta="$1"; shift
0068 local int="$1"; shift
0069
0070 case "${meta}" in
0071 [sv]) printf "void";;
0072 [bB]) printf "bool";;
0073 [aiIfFlR]) printf "${int}";;
0074 esac
0075 }
0076
0077
0078 gen_ret_stmt()
0079 {
0080 if meta_has_ret "${meta}"; then
0081 printf "return ";
0082 fi
0083 }
0084
0085
0086 gen_param_name()
0087 {
0088
0089 local name="${1#c}"
0090 printf "${name#*:}"
0091 }
0092
0093
0094 gen_param_type()
0095 {
0096 local type="${1%%:*}"; shift
0097 local int="$1"; shift
0098 local atomic="$1"; shift
0099
0100 case "${type}" in
0101 i) type="${int} ";;
0102 p) type="${int} *";;
0103 v) type="${atomic}_t *";;
0104 cv) type="const ${atomic}_t *";;
0105 esac
0106
0107 printf "${type}"
0108 }
0109
0110
0111 gen_param()
0112 {
0113 local arg="$1"; shift
0114 local int="$1"; shift
0115 local atomic="$1"; shift
0116 local name="$(gen_param_name "${arg}")"
0117 local type="$(gen_param_type "${arg}" "${int}" "${atomic}")"
0118
0119 printf "${type}${name}"
0120 }
0121
0122
0123 gen_params()
0124 {
0125 local int="$1"; shift
0126 local atomic="$1"; shift
0127
0128 while [ "$#" -gt 0 ]; do
0129 gen_param "$1" "${int}" "${atomic}"
0130 [ "$#" -gt 1 ] && printf ", "
0131 shift;
0132 done
0133 }
0134
0135
0136 gen_args()
0137 {
0138 while [ "$#" -gt 0 ]; do
0139 printf "$(gen_param_name "$1")"
0140 [ "$#" -gt 1 ] && printf ", "
0141 shift;
0142 done
0143 }
0144
0145
0146 gen_proto_order_variants()
0147 {
0148 local meta="$1"; shift
0149 local pfx="$1"; shift
0150 local name="$1"; shift
0151 local sfx="$1"; shift
0152
0153 gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "" "$@"
0154
0155 if meta_has_acquire "${meta}"; then
0156 gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "_acquire" "$@"
0157 fi
0158 if meta_has_release "${meta}"; then
0159 gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "_release" "$@"
0160 fi
0161 if meta_has_relaxed "${meta}"; then
0162 gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "_relaxed" "$@"
0163 fi
0164 }
0165
0166
0167 gen_proto_variants()
0168 {
0169 local meta="$1"; shift
0170 local name="$1"; shift
0171 local pfx=""
0172 local sfx=""
0173
0174 meta_in "${meta}" "fF" && pfx="fetch_"
0175 meta_in "${meta}" "R" && sfx="_return"
0176
0177 gen_proto_order_variants "${meta}" "${pfx}" "${name}" "${sfx}" "$@"
0178 }
0179
0180
0181 gen_proto() {
0182 local meta="$1"; shift
0183 for m in $(echo "${meta}" | grep -o .); do
0184 gen_proto_variants "${m}" "$@"
0185 done
0186 }