zoukankan      html  css  js  c++  java
  • 手机探索者开发实录—代码产生器(下)

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

     

    转载时请注明出处和作者联系方式
    作者联系方式:李先静 <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~~



  • 相关阅读:
    Spring Boot 返回 XML 数据,一分钟搞定!
    Spring Cloud Alibaba Sentinel 整合 Feign 的设计实现
    周末去面试,进去 5 分钟就出来了…
    Spring Boot 返回 JSON 数据,一分钟搞定!
    Java 11 已发布,String 还能这样玩!
    Hashtable 为什么不叫 HashTable?
    Java 中初始化 List 集合的 6 种方式!
    HashMap 和 Hashtable 的 6 个区别,最后一个没几个人知道!
    毕业不到一年,绩效打了个D!
    poj 3111 K Best (二分搜索之最大化平均值之01分数规划)
  • 原文地址:https://www.cnblogs.com/zhangyunlin/p/6167621.html
Copyright © 2011-2022 走看看