手机探索者开发实录—代码产生器(下)

手机探索者开发实录代码产生器(下)

 

转载时请注明出处和作者联系方式
作者联系方式:李先静 <xianjimli at hotmail dot com>


代码产生器的代码:


gen_framework.sh

  1. #!/bin/bash
  2. if [ "$2" = "" ]
  3. then
  4.     echo $0 "intf|impl some.def"
  5.     exit 0
  6. fi
  7. ACTION=$1
  8. INPUT=$2
  9. CLASS=${INPUT/.def/}
  10. CLASS_NAME=`echo $CLASS|sed "s/_//g"`
  11. CLASS_UPPER=`echo $CLASS|tr a-z A-Z `
  12. CLASS_LOWER=`echo $CLASS|tr A-Z a-z`
  13. function gen_h_begin()
  14. {
  15.     echo "#ifndef $CLASS_UPPER"$1"_H"
  16.     echo "#define $CLASS_UPPER"$1"_H"
  17.     echo ""
  18.     echo "ME_DECLS_BEGIN"
  19.     echo ""
  20.     return;
  21. }
  22. function gen_h_end()
  23. {
  24.     echo "ME_DECLS_END"
  25.     echo ""
  26.     echo "#endif/*$CLASS_UPPER"$1"_H*/"
  27.     echo ""
  28.     return;
  29. }
  30. function gen_intf()
  31. {
  32.     echo "#include /"mobile_explorer_types.h/""
  33.     gen_h_begin
  34.     echo "struct _$CLASS_NAME;"
  35.     echo "typedef struct _$CLASS_NAME $CLASS_NAME;"
  36.     echo ""
  37.     awk -F: '{
  38.         Class=$3;gsub(/_/, "", Class);
  39.         Func=$4;gsub(/_/, "", Func);
  40.         print "typedef "$2" (*"Class Func"Func)("$5");";
  41.     }' $INPUT
  42.     echo "";
  43.     echo "struct _$CLASS_NAME"
  44.     echo "{"
  45.     awk -F: '{
  46.         Class=$3;gsub(/_/, "", Class);
  47.         Func=$4;gsub(/_/, "", Func);
  48.         print " " Class Func "Func " tolower($4)";";
  49.     }' $INPUT
  50.     echo ""
  51.     echo "  char priv[0];"
  52.     echo "};"
  53.     echo ""
  54.     
  55.     awk -F: '{
  56.         Class=$3;
  57.         Func=$4;
  58.         print "static inline "$2" "tolower(Class) "_" tolower(Func)"("$5")";
  59.         print "{";
  60.         if($2 != "void")
  61.         {
  62.             print " me_return_val_if_fail(thiz != NULL && thiz->"tolower(Func)" != NULL, ME_RET_PARAMS);";
  63.         }
  64.         else
  65.         {
  66.             print " me_return_if_fail(thiz != NULL && thiz->"tolower(Func)" != NULL);";
  67.         }
  68.         print "";
  69.         if($2 != "void")
  70.         {
  71.             printf "    return ";
  72.         }
  73.         else
  74.         {
  75.             printf "    ";
  76.         }
  77.         printf "thiz->"tolower(Func)"(";
  78.         system("./param_gen_call.sh " $5);
  79.         print ");"
  80.         if($2 != "void")
  81.         {
  82.         }
  83.         else
  84.         {
  85.             print "";
  86.             print " return;";
  87.         }
  88.         print "}/n"
  89.     }' $INPUT
  90.     gen_h_end
  91.     return;
  92. }
  93. IMPL=$ACTION
  94. IMPL_UPPER=`echo $IMPL|tr a-z A-Z`
  95. IMPL_LOWER=`echo $IMPL|tr A-Z a-z`
  96. function gen_impl_h
  97. {
  98.     echo "#include <$CLASS_LOWER.h>"
  99.     gen_h_begin "_"$IMPL_UPPER
  100.     echo "$CLASS_NAME* "$CLASS_LOWER"_"$IMPL_LOWER"_create();"
  101.     gen_h_end "_"$IMPL_UPPER
  102.     return;
  103. }
  104. function gen_impl_c
  105. {
  106.     echo "#include <"$CLASS_LOWER"_"$IMPL_LOWER".h>"
  107.     echo ""
  108.     echo "typedef struct _PrivInfo"
  109.     echo "{"
  110.     echo "  unsigned int dummy;"
  111.     echo "}PrivInfo;"
  112.     echo ""
  113.     
  114.     awk -v impl=$IMPL -F:   '{
  115.         Class=$3;
  116.         Func=$4;
  117.         print "static "$2" "tolower(Class) "_"tolower(impl)"_"tolower(Func)"("$5")";
  118.         print "{";
  119.         if($2 != "void")
  120.         {
  121.             print " me_return_val_if_fail(thiz != NULL, ME_RET_PARAMS);";
  122.         }
  123.         else
  124.         {
  125.             print " me_return_if_fail(thiz != NULL);";
  126.         }
  127.         print ""
  128.         print " PrivInfo* priv = (PrivInfo*)thiz->priv;"
  129.         print ""
  130.         if($2 != "void")
  131.         {
  132.             print " return ("$2 ")0;";
  133.         }
  134.         else
  135.         {
  136.             print " return;"
  137.         }
  138.         print "}/n"
  139.     }' $INPUT
  140.     echo ""
  141.     echo "$CLASS_NAME* "$CLASS_LOWER"_"$IMPL_LOWER"_create()"
  142.     echo "{"
  143.     echo "  $CLASS_NAME* thiz = ($CLASS_NAME*)malloc(sizeof($CLASS_NAME) + sizeof(PrivInfo));"
  144.     echo ""
  145.     echo "  if(thiz != NULL)"
  146.     echo "  {"
  147.     awk -v impl=$IMPL -F:   '{
  148.         Class=$3;
  149.         Func=$4;
  150.         print "     thiz->"tolower(Func)" = "tolower(Class) "_"tolower(impl)"_"tolower(Func)";";
  151.     }' $INPUT
  152.     echo "  }"
  153.     echo ""
  154.     echo "  return thiz;"
  155.     echo "}"
  156.     return;
  157. }
  158. if [ "$ACTION" = "intf" ]
  159. then
  160.     echo "gen_intf >$CLASS_LOWER.h"
  161.     gen_intf >$CLASS_LOWER.h
  162. else
  163.     echo "gen_impl_h >$CLASS_LOWER"_"$IMPL_LOWER.h"
  164.     gen_impl_h >$CLASS_LOWER"_"$IMPL_LOWER.h
  165.     echo "gen_impl_c >$CLASS_LOWER"_"$IMPL_LOWER.c"
  166.     gen_impl_c >$CLASS_LOWER"_"$IMPL_LOWER.c
  167. fi


param_gen_call.sh

  1. #!/bin/bash
  2. echo $* |awk -F, '
  3.     {
  4.         for(i = 1; i <= NF; i++) 
  5.         {
  6.             system("./param_gen_call_one.sh " $i);
  7.             if(i != NF)
  8.             {
  9.                 printf(", ");
  10.             }
  11.         }
  12.     }'

param_gen_call_one.sh

  1. #!/bin/bash
  2. echo $* |awk  '{printf $NF}'

~~end~~



原文地址:https://www.cnblogs.com/zhangyunlin/p/6167621.html