1#!/bin/bash
2#
3# make-qhull_qh.sh [libqhull_r] [sed-only] [files] -- Derive src/qhull-qh/ from src/libqhull_r with 'qh' macros
4#
5# $Id: //main/2019/qhull/eg/make-qhull_qh.sh#2 $$Change: 2672 $
6# $DateTime: 2019/06/06 15:21:49 $$Author: bbarber $
7
8if [[ "$1" == "" ]]; then
9    echo "eg/make-qhull_qh.sh libqhull_r | sed-only | <directory-file-list> -- convert 'qh->' to macro 'qh'"
10    echo "  creates 'src/qhull_qh/' unless 'DEST=destination eg/make-qhull_qh.sh ..."
11    exit
12fi
13# set -v
14SEDONLY=0
15if [[ "$1" == "libqhull_r" ]]; then
16    SOURCES="src/libqhull_r src/qconvex src/qdelaunay src/qhalf src/qhull src/qvoronoi src/rbox src/testqset_r src/user_eg src/user_eg2"
17    DEST=${DEST:-src/qhull_qh}
18    if [[ $# -gt 1 ]]; then
19        echo "eg/make-qhull_qh.sh: 'libqhull_r' does not take source directories.  It converts qhull files in '$SOURCES' to '$DEST'"
20        exit 1
21    fi
22elif [[ "$1" == "sed-only" ]]; then
23    SEDONLY=1
24    DEST=${DEST:-.}
25    if [[ $# -gt 1 ]]; then
26        echo "eg/make-qhull_qh.sh: 'sedonly' does not take source directories.  It converts qhull files in '$DEST' from 'qh->' to the macro 'qh'"
27        exit 1
28    fi
29else
30    SOURCES="$@"
31    DEST=${DEST:-src/qhull_qh}
32fi
33
34if [[ $SEDONLY -ne 1 ]]; then
35    if [[ -d $DEST ]]; then
36        echo "To rebuild '$DEST' from '$SOURCES'"
37        if [[ "$DEST" == "src/qhull_qh" ]]; then
38            echo "    make cleanall; eg/make-qhull_qh.sh $@"
39        else
40            echo "    rm -rf '$DEST'; eg/make-qhull_qh.sh $@"
41        fi
42        exit 1
43    fi
44    for F in $SOURCES; do
45        if [[ ! -d $F && ! -r $F ]]; then
46            echo "eg/make-qhull_qh.sh: source '$F' not found.  Execute make-qhull_qh.sh from a Qhull directory with $SOURCES"
47            exit 1
48        fi
49    done
50    echo eg/make-qhull_qh.sh: Create "'$DEST/' from '$SOURCES'"
51    mkdir $DEST || exit 1
52    echo -e "eg/make-qhull_qh.sh created '$DEST' to compare reentrant with non-reentrant Qhull" >$DEST/README.txt
53    echo -e "\nSource directories and files -- $SOURCES" >>$DEST/README.txt
54    echo -e "\n'make cleanall' deletes 'src/qhull_qh/'\n" >>$DEST/README.txt
55    date >>$DEST/README.txt
56    for X in $SOURCES; do
57        if [[ -d $X ]]; then
58            for F in $X/*_r.* $X/*_ra.*  $X/*.def; do
59                if [[ -f $F ]]; then
60                    G="$(echo ${F##*/} | sed -e 's/_r\././'  -e 's/_ra\./_a./')"
61                    # echo "$F => $DEST/$G"
62                    cp -p $F $DEST/$G || exit 1
63                 fi
64            done
65            if [[ -f $X/Makefile && ! -f $DEST/Makefile ]]; then
66                cp -p $X/Makefile $DEST/ || exit 1
67            fi
68            if [[ -f $X/index.htm && ! -f $DEST/index.htm ]]; then
69                cp -p $X/index.htm $DEST/ || exit 1
70            fi
71        elif [[ -f $X ]]; then
72            G="$(echo ${X##*/} | sed -e 's/_r\././' -e 's/_ra\./_a./')"
73            # echo "$X => $DEST/$G"
74            cp -p $X $DEST/$G || exit 1
75        fi
76    done
77fi
78
79echo Convert 'qh->' to 'qh ', etc.
80if [[ -w $DEST/Makefile ]]; then
81    sed -i -r \
82        -e 's/_r$//' \
83        -e 's/_r / /g' \
84        -e 's|_r/|/|g' \
85        -e 's/_r\.a/.a/g' \
86        -e 's/_r\.c/.c/g' \
87        -e 's/_r\.h/.h/g' \
88        -e 's/_r\.o/.o/g' \
89        -e 's/_ra\.h/_a.h/g' \
90        $DEST/Makefile || exit 1
91fi
92for F in $DEST/*.c $DEST/*.h; do
93    sed -i -r \
94        -e 's/\(qhT \*qh, /(/' \
95        -e ' /ifdef __cplusplus/,/^$/ d' \
96        -e 's/\(qhT \*qh(.*)\)/(void\1)/' \
97        -e 's/_r$//' \
98        -e 's/_r([ /:])/\1/g' \
99        -e 's/_r\.c/.c/g' \
100        -e 's/_r\.h/.h/g' \
101        -e 's/_r\.o/.o/g' \
102        -e 's/_ra\.h/_a.h/g' \
103        -e 's/ \|\| \!qh\)/)/' \
104        -e 's/_rbox\(qh, qh->/_rbox(rbox./' \
105        -e ' /QHULL_UNUSED\(qh\)/ d' \
106        -e 's/qh->rbox_([^c])/rbox.\1/g' \
107        -e 's/\(qh, (.*) \)$/( \1 )/' \
108        -e 's/\(qh, (.*) \) \{ \.\.\. \}$/( \1 ) { ... }/' \
109        -e 's/\(qh *\)$/( )/' \
110        -e 's/\(qhB?, /(/g' \
111        -e 's/\(qhB?\)/()/g' \
112        -e 's/\(qh /(/g' \
113        -e 's/qh->qhmem/qhmem/g' \
114        -e 's/qh->qhstat\./qhstat /g' \
115        -e 's/qh->/qh /g' \
116        -e 's/qhull_r-/qhull-/g' \
117        -e "s/Needed for qhT in libqhull.h/Needed for qhT in libqhull_r.h.  Here for compatibility/" \
118        -e ' /ifdef __cplusplus/,/^$/ d' \
119        -e ' /qh may be NULL/ d' \
120        -e ' /For libqhull_r,/ d' \
121        -e ' /reentrant only/ d' \
122        -e ' /assumes qh defined/ d' \
123        -e ' /^ *\/\*.*\.cpp -- / d' \
124        $F
125        # sed requires space before search expressions, /.../
126    if which u2d >/dev/null 2>&1; then
127        u2d $F
128    fi
129done
130for F in $DEST/*.htm; do
131    sed -i -r \
132        -e 's|_r/|/|g' \
133        -e 's/_r\.c/.c/g' \
134        -e 's/_r\.h/.h/g' \
135        -e 's/_ra\.h/_a.h/g' \
136        $F
137    if which u2d >/dev/null 2>&1; then
138        u2d $F
139    fi
140done
141echo -e "\nCompare '$DEST' to 'src/libqhull', 'src/qdelaunay', etc.  Do not ignore minor differences."
142