在UNIX系统上进行C++开发,公司规定用vi编辑,所以写个简单脚本,可以根据简单模板简单生成C++代码文件, 可以偷一下懒,文件头也比较规范。里面大量使用awk和sed,这是写sh脚本常用的东东。
第一部分是代码,第二部分是我自己常用的简单模板。
=====================================================================
脚本
=====================================================================
#!/bin/sh
#
################################################################################
#
# Auto-create the code file from the template file.
#
# Author: liangbing
# version: 1.0
# date: 2007-05-19
#
################################################################################
################################################################################
#
# function: print the help
#
################################################################################
usage( )
{
echo "act.sh [-v] [-h] "
echo " Print the help"
echo "act.sh [-t templFileName] [-f codeFileName] [-c classNameList]"
echo " Create the code file by the template file(通过模板生成代码, 完成后自动进入vi编辑)"
echo " classNameList is separated by \":\", 即多个类名之间用冒号分隔"
echo " default template path(如果缺省路径不对,请自己修改脚本act.sh中变量templDefaultPath): "
echo " $templDefaultPath"
echo " .e.g:"
echo " 1. default template path: 使用缺省的模板文件的路径"
echo " AIMC code:"
echo " act.sh -t apisvr -f test.cpp"
echo " act.sh -t h2sg -f test.cpp"
echo " act.sh -t webmail -f test.cpp"
echo " act.sh -t wmail -f test.cpp"
echo ""
echo " common code:"
echo " act.sh -t main -f test.cpp"
echo " act.sh -t head -f test.hpp"
echo " act.sh -t src -f test.cpp"
echo " act.sh -c clsString -f test"
echo " act.sh -c clsString:clsVector:clsList -f test"
echo ""
echo " 2. specified template path: 自己指定模板文件的路径和文件名"
echo " act.sh -t ./yourTempl.cpp -f test.cpp"
echo " act.sh -t ./yourClassTempl -c clsString -f test"
echo " act.sh -t ./yourClassTempl -c clsString:clsVector:clsList -f test"
echo ""
echo " 3. append a class into your existed hpp and cpp file: 追加一个新类到已经存在的头文件和源文件"
echo " act.sh -c clsString -f test"
echo " act.sh -c clsString:clsVector:clsList -f test"
}
################################################################################
#
# function: create the simple file
#
################################################################################
creat_simple_file( )
{
# the definition of the variabl
templFileName=$1
codeFileName=$2
templDefaultPath=$3
# the definiton of the key value
keyFileName=
moduleName=
version=1.0
date=`date "+%Y-%m-%d"`
dateTime=`date "+%Y\/%m\/%d %H:%M:%S"`
# test if the template file is existed
if [ ! -f "$templFileName" ]
then
templFileName=`echo ${templDefaultPath}/${templFileName}.act`
if [ ! -f "$templFileName" ]
then
echo "$templFileName is not existed!"
exit
fi
fi
# test if the code file is existed
if [ -f "$codeFileName" ]
then
vi $codeFileName
exit
fi
# get the path name, the key file name and the module name
keyFileName=`echo $codeFileName | awk -F/ '{print $NF}'`
moduleName=`echo $keyFileName | awk -F. '{print $1}'`
# get the file identifier
dateStr=`date "+%Y%m%d%H%M%S"`
fileIdentifier=`echo $moduleName | tr "[a-z]" "[A-Z]"`
fileIdentifier=`echo ${fileIdentifier}_${dateStr}`
# create the code file
sed "s/<%file_name%>/$keyFileName/g" $templFileName | \
sed "s/<%version%>/$version/g" | \
sed "s/<%login_name%>/$LOGNAME/g" | \
sed "s/<%date%>/$date/g" | \
sed "s/<%module_name%>/$moduleName/g" | \
sed "s/<%file_identifier%>/$fileIdentifier/g" | \
sed "s/<%date_time%>/$dateTime/g" > $codeFileName
vi $codeFileName
}
################################################################################
#
# function: append the class code to the existed hpp and cpp file
#
################################################################################
append_class_code( )
{
# the definition of the variabl
templHeadFileName=`echo ${templDefaultPath}/class.head`
templSrcFileName=`echo ${templDefaultPath}/class.src`
# test if the template file is existed
if [ ! -f "$templSrcFileName" ]
then
echo "$templSrcFileName is not existed!"
exit
elif [ ! -f "$templHeadFileName" ]
then
echo "$templHeadFileName is not existed!"
exit
fi
# append the class code
tempHeadFile=`echo ".temp.head.act"`
tempSrcFile=`echo ".temp.src.act"`
lineNumList=`sed -n "/#endif/=" $codeHeadFileName`
lineNum=`echo $lineNumList | awk '{print $NF}'`
sed "${lineNum}d" $codeHeadFileName > $tempHeadFile
awk '{print $0}' $codeSourceFileName > $tempSrcFile
for className in $classNameList
do
sed "s/<%class_name%>/$className/g" $templHeadFileName >> $tempHeadFile
sed "s/<%class_name%>/$className/g" $templSrcFileName >> $tempSrcFile
done
sed -n "$lineNum"p $codeHeadFileName >> $tempHeadFile
awk '{print $0}' $tempHeadFile > $codeHeadFileName
awk '{print $0}' $tempSrcFile > $codeSourceFileName
# delete the temp file
if [ -f "$tempHeadFile" ]
then
rm $tempHeadFile
fi
if [ -f "$tempSrcFile" ]
then
rm $tempSrcFile
fi
}
################################################################################
#
# function: create the class file
#
################################################################################
creat_class_file( )
{
# the definition of the variabl
templFileName=$1
classNameList=`echo $2 | sed "s/:/ /g"`
codeFileName=$3
templDefaultPath=$4
# the definiton of the key value
version=1.0
date=`date "+%Y-%m-%d"`
dateTime=`date "+%Y\/%m\/%d %H:%M:%S"`
# get template info: the path name, the file name
count=`echo $templFileName | awk -F/ '{print NF}'`
tmpFileName=`echo $templFileName | awk -F/ '{print $NF}'`
templPathName=.
if [ $count -ge 2 ]
then
count=`expr $count - 1`
templPathName=`echo $templFileName | cut -d/ -f1-$count`
fi
templName=`echo $tmpFileName | awk -F. '{print $1}'`
templHeadFileName=`echo ${templPathName}/${templName}.hpp`
templSourceFileName=`echo ${templPathName}/${templName}.cpp`
# test if the template file is existed
if [ ! -f "$templHeadFileName" ]
then
templHeadFileName=`echo ${templDefaultPath}/${templName}.hpp`
if [ ! -f "$templHeadFileName" ]
then
echo "$templHeadFileName is not existed!"
exit
fi
fi
if [ ! -f "$templSourceFileName" ]
then
templSourceFileName=`echo ${templDefaultPath}/${templName}.cpp`
if [ ! -f "$templSourceFileName" ]
then
echo "$templSourceFileName is not existed!"
exit
fi
fi
# get code file info: the path name, the file name
count=`echo $codeFileName | awk -F/ '{print NF}'`
tmpFileName=`echo $codeFileName | awk -F/ '{print $NF}'`
codePathName=.
if [ $count -ge 2 ]
then
count=`expr $count - 1`
codePathName=`echo $codeFileName | cut -d/ -f1-$count`
fi
moduleName=`echo $tmpFileName | awk -F. '{print $1}'`
codeHeadFileName=`echo ${codePathName}/${moduleName}.hpp`
codeSourceFileName=`echo ${codePathName}/${moduleName}.cpp`
keyHeadFileName=`echo ${moduleName}.hpp`
keySourceFileName=`echo ${moduleName}.cpp`
# get the file identifier
dateStr=`date "+%Y%m%d%H%M%S"`
fileIdentifier=`echo $moduleName | tr "[a-z]" "[A-Z]"`
fileIdentifier=`echo ${fileIdentifier}_${dateStr}`
# test if the code file is existed
if [ -f "$codeHeadFileName" -a -f "$codeSourceFileName" ]
then
append_class_code
fi
if [ -f "$codeHeadFileName" ]
then
vi $codeHeadFileName
exit
elif [ -f "$codeSourceFileName" ]
then
vi $codeSourceFileName
exit
fi
# create the class header file
beginLineNum=`sed -n "/<%class_begin%>/=" $templHeadFileName`
endLineNum=`sed -n "/<%class_end%>/=" $templHeadFileName`
headLineNum=`expr $beginLineNum - 1`
sed -n "1,$headLineNum"p $templHeadFileName | \
sed "s/<%file_name%>/$keyHeadFileName/g" | \
sed "s/<%version%>/$version/g" | \
sed "s/<%login_name%>/$LOGNAME/g" | \
sed "s/<%date%>/$date/g" | \
sed "s/<%module_name%>/$moduleName/g" | \
sed "s/<%file_identifier%>/$fileIdentifier/g" | \
sed "s/<%date_time%>/$dateTime/g" > $codeHeadFileName
for className in $classNameList
do
classBeginLineNum=`expr $beginLineNum + 1`
classEndLineNum=`expr $endLineNum - 1`
sed -n "$classBeginLineNum,$classEndLineNum"p $templHeadFileName | \
sed "s/<%class_name%>/$className/g" >> $codeHeadFileName
done
rearLineNum=`expr $endLineNum + 1`
sed -n "$rearLineNum,$"p $templHeadFileName | \
sed "s/<%file_identifier%>/$fileIdentifier/g" >> $codeHeadFileName
# create the class source file
beginLineNum=`sed -n "/<%class_begin%>/=" $templSourceFileName`
endLineNum=`sed -n "/<%class_end%>/=" $templSourceFileName`
headLineNum=`expr $beginLineNum - 1`
sed -n "1,$headLineNum"p $templSourceFileName | \
sed "s/<%file_name%>/$keySourceFileName/g" | \
sed "s/<%version%>/$version/g" | \
sed "s/<%login_name%>/$LOGNAME/g" | \
sed "s/<%date%>/$date/g" | \
sed "s/<%module_name%>/$moduleName/g" | \
sed "s/<%header_file_name%>/$keyHeadFileName/g" | \
sed "s/<%date_time%>/$dateTime/g" > $codeSourceFileName
for className in $classNameList
do
classBeginLineNum=`expr $beginLineNum + 1`
classEndLineNum=`expr $endLineNum - 1`
sed -n "$classBeginLineNum,$classEndLineNum"p $templSourceFileName | \
sed "s/<%class_name%>/$className/g" >> $codeSourceFileName
done
vi $codeHeadFileName
}
################################################################################
#
# The main module
#
################################################################################
# the definition of the variabl
templDefaultPath=/export/home/liangb/aimc/autocreate
templFileName=
codeFileName=
className=
# get the code file name
if [ $# -lt 1 ]
then
usage
exit
else
while getopts hvf:t:c: option
do
case $option in
h)
usage
exit 1 ;;
v)
usage
exit 1 ;;
f)
codeFileName=$OPTARG ;;
t)
templFileName=$OPTARG ;;
c)
className=$OPTARG ;;
?)
usage
exit 1 ;;
esac
done
fi
# test if the code file name is set
if [ -z "$codeFileName" ]
then
echo "You don't input the code file name"
usage
exit
fi
# test if the class template file name is set
if [ -z "$className" ]
then
if [ -z "$templFileName" ]
then
echo "You don't input the template file name"
usage
exit
else
creat_simple_file $templFileName $codeFileName $templDefaultPath
exit
fi
else
if [ -z "$templFileName" ]
then
templFileName=`echo "class"`
fi
creat_class_file $templFileName $className $codeFileName $templDefaultPath
exit
fi
=====================================================================
模板文件
=====================================================================
1. class.hpp
/**
*@file <%file_name%>
*
*@brief <%module_name%>.
*
*@author <%login_name%>
*@date <%date%>
*@version <%version%>
*$Id: <%file_name%>,v <%version%> <%date_time%> <%login_name%> Exp $
*/
#ifndef __<%file_identifier%>_H__
#define __<%file_identifier%>_H__
<%class_begin%>
//////////////////////////////////////////////////////////////////////////////////////////
/**
*@name <%class_name%>
*@brief
*/
class <%class_name%> {
public:
/**
*@brief Default constructor
*/
<%class_name%>( );
/**
*@brief Destructor
*/
~<%class_name%>( );
protected:
private:
/**
*@brief Copy constructor
*/
<%class_name%>( const <%class_name%>& );
/**
*@brief Assignment operator
*/
<%class_name%>& operator=( const <%class_name%>& );
private:
};
<%class_end%>
#endif//__<%file_identifier%>_H__
-------------------------------------------------------------------------------------------------
2. class.cpp
/**
*@file <%file_name%>
*
*@brief <%module_name%>.
*
*@author <%login_name%>
*@date <%date%>
*@version <%version%>
*$Id: <%file_name%>,v <%version%> <%date_time%> <%login_name%> Exp $
*/
#include "<%header_file_name%>"
<%class_begin%>
//////////////////////////////////////////////////////////////////////////////////////////
//
// <%class_name%>
//
//////////////////////////////////////////////////////////////////////////////////////////
// Default constructor
<%class_name%>::<%class_name%>( )
{
}
// Destructor
<%class_name%>::~<%class_name%>( )
{
}
<%class_end%>
-------------------------------------------------------------------------------------
3. class.head
//////////////////////////////////////////////////////////////////////////////////////////
/**
*@name <%class_name%>
*@brief
*/
class <%class_name%> {
public:
/**
*@brief Default constructor
*/
<%class_name%>( );
/**
*@brief Destructor
*/
~<%class_name%>( );
protected:
private:
/**
*@brief Copy constructor
*/
<%class_name%>( const <%class_name%>& );
/**
*@brief Assignment operator
*/
<%class_name%>& operator=( const <%class_name%>& );
private:
};
-------------------------------------------------------------------------------------
4. class.src
//////////////////////////////////////////////////////////////////////////////////////////
//
// <%class_name%>
//
//////////////////////////////////////////////////////////////////////////////////////////
// Default constructor
<%class_name%>::<%class_name%>( )
{
}
// Destructor
<%class_name%>::~<%class_name%>( )
{
}
-------------------------------------------------------------------------------------
5. head.act
/**
*@file <%file_name%>
*
*@brief <%module_name%>.
*
*@author <%login_name%>
*@date <%date%>
*@version <%version%>
*$Id: <%file_name%>,v <%version%> <%date_time%> <%login_name%> Exp $
*/
#ifndef __<%file_identifier%>_H__
#define __<%file_identifier%>_H__
//---------------------------The external header------------------------------------------
//---------------------------The macro definition-----------------------------------------
//---------------------------The variable definition--------------------------------------
//---------------------------The function definition--------------------------------------
#endif//__<%file_identifier%>_H__
-------------------------------------------------------------------------------------
6. main.act
/**
*@file <%file_name%>
*
*@brief <%module_name%>.
*
*@author <%login_name%>
*@date <%date%>
*@version <%version%>
*$Id: <%file_name%>,v <%version%> <%date_time%> <%login_name%> Exp $
*/
#ifdef linux
#include <getopt.h>
#endif
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>
//---------------------------The macro definition-----------------------------------------
#define MODULE_NAME "<%module_name%>"
//---------------------------The variable definition--------------------------------------
//---------------------------The function prototype---------------------------------------
//---------------------------The function definition--------------------------------------
// The main function
int main( int argc, char ** argv )
{
int liRet = 0;
return liRet;
}