Artifact 7e5ae6afbaa499d0c69627ac55d473511d801d2b78b978df5f8f6c2810eaf78d:
- Executable file
mttroot/mtt/cc/mtt_m2cc.sh
— part of check-in
[d9e3b30dc2]
at
2002-05-15 14:22:26
on branch origin/master
— Code for Simulink S-function target written direct to sfun.cc instead of
calling .mexglx files. This eliminates the sfun dependency on Octave
ColumnVectors. sys_sfun.cc should build directly on a MS Windows machine
(can't test this yet).added sfun.zip target to create source code to export. (user: geraint@users.sourceforge.net, size: 5267) [annotate] [blame] [check-ins using] [more...]
#! /bin/sh SYS=$1 REP=$2 TARGET=${3:-cc} PARSER=${4:-indent} IN=${SYS}_${REP}.m OUT=${SYS}_${REP}.${TARGET} TMP=${SYS}_${REP}_m2cc.tmp rep_declarations () { (case ${REP} in simpar) cat <<EOF struct { double first; double dt; double last; int stepfactor; int wmin; int wmax; int wsteps; int input; } mttsimpar; EOF ;; *) ;; esac) echo "" }; rep_footer () { (case ${REP} in simpar) cat <<EOF mttsimpar_map(0) = (double) mttsimpar.first; mttsimpar_map(1) = (double) mttsimpar.last; mttsimpar_map(2) = (double) mttsimpar.dt; mttsimpar_map(3) = (double) mttsimpar.stepfactor; mttsimpar_map(4) = (double) mttsimpar.wmin; mttsimpar_map(5) = (double) mttsimpar.wmax; mttsimpar_map(6) = (double) mttsimpar.wsteps; mttsimpar_map(7) = (double) mttsimpar.input; EOF ;; *) ;; esac) }; find_code () { file_in=${1:-${IN}} portion=${2:-"body"} head=`cat ${file_in} | gawk '($2 == "BEGIN" && $3 == "Code") { print NR }'` foot=`cat ${file_in} | gawk '($2 == "END" && $3 == "Code") { print NR }'` case ${portion} in head) start=0 end=${head} ;; body) start=${head} end=${foot} ;; foot) start=${foot} end=end ;; *) echo "Error in find_code: portion unknown" return -1 ;; esac cat ${file_in} |\ gawk --assign start=${start} --assign end=${end} ' (start < NR && NR < end) { print $0 }' }; strip_junk () { case ${REP} in numpar) grep -v "mttpar = \[\]" ;; switchopen) grep -v "\[open\] = zero" ;; *) cat ;; esac }; fix_comment_delimiter () { # it would be preferable if we didn't use '%' as a delimiter # (a % b) gives the remainder of ((int)a / (int)b) in C/C++ sed 's/[%#]/\/\//g' | sed 's/\/\/\/\//\/\//g' }; decrement_indices () { # first section appends '-1' to container indices # to convert from FORTRAN-type numbering to C-type numbering sed 's/mtta(\([0-9][0-9]*\),\([0-9][0-9]*\))/mtta[\1-1,\2-1]/g' |\ sed 's/mttax(\([0-9][0-9]*\))/mttax[\1-1]/g' |\ sed 's/mttdx(\([0-9][0-9]*\))/mttdx[\1-1]/g' |\ sed 's/mttedx(\([0-9][0-9]*\))/mttedx[\1-1]/g' |\ sed 's/mttpar(\([0-9][0-9]*\))/mttpar[\1-1]/g' |\ sed 's/mttu(\([0-9][0-9]*\))/mttu[\1-1]/g' |\ sed 's/mttx(\([0-9][0-9]*\))/mttx[\1-1]/g' |\ sed 's/mtty(\([0-9][0-9]*\))/mtty[\1-1]/g' |\ sed 's/mttyz(\([0-9][0-9]*\))/mttyz[\1-1]/g' |\ sed 's/mttz(\([0-9][0-9]*\))/mttz[\1-1]/g' |\ sed 's/mttopen(\([0-9][0-9]*\))/mttopen[\1-1]/g' |\ \ # next sections tidy the code up a bit, but are not necessary sed 's/1\-1\([\,\)]\)/0\1/g' |\ sed 's/2\-1\([\,\)]\)/1\1/g' |\ sed 's/3\-1\([\,\)]\)/2\1/g' |\ sed 's/4\-1\([\,\)]\)/3\1/g' |\ sed 's/5\-1\([\,\)]\)/4\1/g' |\ sed 's/6\-1\([\,\)]\)/5\1/g' |\ sed 's/7\-1\([\,\)]\)/6\1/g' |\ sed 's/8\-1\([\,\)]\)/7\1/g' |\ sed 's/9\-1\([\,\)]\)/8\1/g' |\ \ sed 's/10\-1\([\,\)]\)/09\1/g' |\ sed 's/20\-1\([\,\)]\)/19\1/g' |\ sed 's/30\-1\([\,\)]\)/29\1/g' |\ sed 's/40\-1\([\,\)]\)/39\1/g' |\ sed 's/50\-1\([\,\)]\)/49\1/g' |\ sed 's/60\-1\([\,\)]\)/59\1/g' |\ sed 's/70\-1\([\,\)]\)/69\1/g' |\ sed 's/80\-1\([\,\)]\)/79\1/g' |\ sed 's/90\-1\([\,\)]\)/89\1/g' |\ \ sed 's/100\-1\([\,\)]\)/099\1/g' |\ sed 's/200\-1\([\,\)]\)/199\1/g' |\ sed 's/300\-1\([\,\)]\)/299\1/g' |\ sed 's/400\-1\([\,\)]\)/399\1/g' |\ sed 's/500\-1\([\,\)]\)/499\1/g' |\ sed 's/600\-1\([\,\)]\)/599\1/g' |\ sed 's/700\-1\([\,\)]\)/699\1/g' |\ sed 's/800\-1\([\,\)]\)/799\1/g' |\ sed 's/900\-1\([\,\)]\)/899\1/g' |\ sed 's/\([(,]\)0\([0-9]\)/\1\2/g' }; fortran_to_c_paren () { # converts [i] to (i) sed 's/\[\([^[]*\)\]/(\1)/g' } fix_pow () { # matches number^number where number is one or more digits and one or zero decimal points # converts to pow (number, number) sed 's/\([0-9]*\)\(\.\)\{0,1\}\([0-9]*\)\^\([0-9]*\)\(\.\)\{0,1\}\([0-9]*\)/pow \(\1\2\3,\4\5\6\)/g' }; echo Creating ${OUT} case ${TARGET} in sfun) mtt_header ${SYS} ${REP} "sfun" > ${TMP} echo "## END Code" >> ${TMP} find_code ${TMP} head > ${OUT} find_code ${IN} body |\ decrement_indices |\ fix_comment_delimiter |\ fix_pow |\ strip_junk |\ ${PARSER} >> ${OUT} find_code ${TMP} foot >> ${OUT} rm ${TMP} ;; cc | *) mtt_header ${SYS} ${REP} "oct" > ${TMP} find_code ${TMP} head > ${OUT} rep_declarations >> ${OUT} find_code ${IN} body |\ decrement_indices |\ fortran_to_c_paren |\ fix_comment_delimiter |\ fix_pow |\ strip_junk |\ ${PARSER} >> ${OUT} rep_footer >> ${OUT} find_code ${TMP} foot >> ${OUT} rm ${TMP} ;; esac