返回列表 发帖

opt2byte.LIB命令行开关解析库

本帖最后由 happy886rr 于 2017-1-7 19:54 编辑

[2016/12/06]修复一处笔误。

THE OPT TO BYTE ARRAY LIB, COPYRIGHT@2016~2018 BY HAPPY, VERSION 1.0
opt2byte.LIB

摘要:
=============================================================================
这是可以解析命令行参数的库,用来帮助你快速构建命令行第三方工具的开关解析部分。
从此你无需再写开关解析。
=============================================================================


函数原型:
-----------------------------------------------------------------------------
//OPT转BYTE数组
byte* __cdecl Opt2Byte(
        int argc,                                  //argc
        char** argv,                           //argv
        char* optstr                            //开关正则
);
-----------------------------------------------------------------------------


引入:
-----------------------------------------------------------------------------
#include "opt2byte.h"                            //先引入头文件
#pragram commet(lib,"opt2byte.LIB");  //在项目中引入库文件
-lopt2byte -L./                                       //gcc连接参数
-----------------------------------------------------------------------------


命令开关正则语法:
-----------------------------------------------------------------------------
char* optstr="=/C* /U:utf-8  /CS /T* /D* /M* /?";

在上句opt正则中,其中第一个引号后的等号表示精确开关匹配,
即区分大小写匹配,不为等号则忽略大小写匹配。

其中*代表后继参数,一个*代表/C开关有一个后继参数。
其中:代表连参符,即/U开关后边无需空格即可连接参数,如/U:"utf-8"。
其中无*的开关表示没有任何后继参数。

opt2byte.LIB库,最大可支持99个开关解析,最多处理254个命令行参数。 当然你可以
在源码中修改以使其支持不限量的数目。

opt2byte.LIB库全部为本人原创,且不需要任何其他库文件,效率性能秒杀getopt函数,
无法解析的开关argv[unknown]将存入bp[100~127]的无法解析空间。 bp[0]表示解析状
态,即bp[0]为0时表示正常解析,否则其值为发生错误的argv序号。bp[1~99]为各开关
解析到的命令行参数argv序号。
-----------------------------------------------------------------------------


英译:
-----------------------------------------------------------------------------
THE OPT TO BYTE ARRAY LIB, COPYRIGHT@2016~2018 BY HAPPY, VERSION 1.0
-----------------------------------------------------------------------------
This is a library of command-line arguments  that can  help you quickly build
switch-resolution parts of command-line third-party tools.From then on you do
not have to repeat the write switch every time parsing.
-----------------------------------------------------------------------------
12/05/2016


核心代码:
/*
OPT转BYTE库
THE OPT TO BYTE ARRAY LIB, COPYRIGHT@2016~2018 BY HAPPY, VERSION 1.0
opt2byte.LIB
LINK: -lopt2byte -L./
*/
#ifndef byte
typedef unsigned char byte;
#endif
#ifndef calloc
#include <stdlib.h>
#endif
//OPT转BYTE数组函数
byte* Opt2Byte(int argc, char** argv, char* optstr)
{
//计算有效参数数目
int oargc=argc-1;
//接收指针
char** oargv=argv;
//参数累加器
int i=0;
//无法解析参数的存放区间
int unknown=100;
//optstr首字符为等号,则视为所有开关均区分大小写
byte  ostrcase=(*optstr=='=')?1:0;
//判断是否开启大小写,进而修正ostr
char* ostr=(ostrcase==1)?optstr+1:optstr;
//opt比特数组
byte* bp=(byte*)calloc(128, sizeof(byte));
//如果没有参数,则置bp数组首位为255
if(oargc==0){bp[0]=0xFF;}
//开启主循环
while((++i)<=oargc){
//扫描指针归位
char* op=ostr;
//开关序号归位
int   m=0;
while(*op!='\0'){
//过滤空格
while(*op==' '){op++;}
//开关序号累加器
m++;
//将参数送入比较器
char* vp=oargv[i];
while(*vp!='\0'){
//临时辅助指针
char tp1=*op, tp2=*vp;
//ostrcase为0,则忽略大写比较
if(ostrcase==0){
tp1=('a'<= tp1 && tp1<='z')?tp1-32:tp1;
tp2=('a'<= tp2 && tp2<='z')?tp2-32:tp2;
}
//不相等则中断
if(tp1!=tp2){break;}
op++, vp++;
}
//vp指针移到末尾,则视为解析成功
if(
(*vp=='\0')  &&
(
*op==' ' ||
*op=='*' ||
*op=='\0'
)
){
//判断是否为连参开关
if(*(op-1)==':'){
bp[m]=i;
break;
//判断是否为无参数开关
}else if(*op==' '||*op=='\0'){
bp[m]=i;
break;
//判断是否为带参数开关
}else if(*op=='*' && i+1<=oargc){
bp[m]=i+1;
break;
//无法识别的开关末端,将错误位置存入bp首位
}else{
bp[0]=i;
return bp;
}
}else{
//扫描指针后移
while(*op!='\0'&& *op!=' '){op++;}
}
}
//判断是否为无法解析的参数,并存入 unknown区间
if(bp[m]!=i && bp[m]!=i+1 && *op!='*'){
bp[unknown++]=i;
continue;
}
//如果为*代表有后继参数,则参数器累加。
while(*op=='*'){
op++, i++;
if(i>oargc){
bp[0]=i-1;
return bp;
}
//如果为开关符且参数不足,则将错误位置存入bp首位
if(oargv[i][0]==ostr[0]){
bp[0]=i;
return bp;
}
}
}
//返回byte数组指针
return bp;
}COPY
使用示例:
#include <stdio.h>
#include "opt2byte.h"
int main(int argc, char** argv)
{
int i;
char* optstr="=/D**  /U: /S /T";                           //这里填写命令开关正则
byte* bp=Opt2Byte(argc, argv, optstr);                   //这里用来接收转化后的BYTE数组
if(bp[0]==255){printf("没有任何参数\n");}
if(bp[0]!=0){printf("在%s附近出现错误,可能是缺少参数,或是无法解析的开关\n", argv[bp[0]]);}
                  
for(i=1; i<=4; i++){printf("%d\n",bp[i]); }            //打印分析后的开关BYTE数组参数
return 0;
}COPY
下载,base64加权码
@echo off
setlocal enabledelayedexpansion
::*********BASE64 加权解码器*********
set $=set [#]&CALL :BASE64_PRESS&set [$]=A&((for %%Z in ([,],{,},_,$,#,-,@) do (set [$]=![$]!![$]!&for %%S in (![$]!) do (for /l %%i in (1,1,6) do (!$!%%i=![#]%%i:%%Z=%%S!))))&for /l %%i in (1,1,6) do (set/p=![#]%%i:.=!<NUL))>opt2byte.BSEP&certutil -decode opt2byte.BSEP opt2byte.zip&pause&exit /b
::***********************************
:BASE64_PRESS
!$!1=UEsDBAo][BNPhkk}E]bGliL1BLAwQU]C[gs4VJYL47QeI]WAQ[Dg[AGxpYi9vcHQyYnl0ZS5o09fi5eL0Dwi5vsopMsT11N/rL3etP/V3/yOgaIiHqwJQRiHEXwEkp+AYFOQYqeDj6aSj4OwfEBnk6e4R4mBkYGhWByQsgGoUPBwDAiJ1FMJcg4I9/f0UDPUMgMbkF5QYJVWWpOoBdQK57s7OQDP8vK0UdHNgUgq6Pnr6vFxaQMzLpZyZlpeSmqYAkuDlKqksSAXxSvOKM9PzUlMUkjMSi8By1kClqXkpmWkgTfr6KH7g5QKp0FKIj09OSU3OUfAHWuQEFNHIzCtRSCxKT9YBm6OlBeKUQTkKQOcUlxRpAg0GAFBLAwQU]C[OT4ZJ/6T4/ccC[B8B[AE]GxpYi9vcHQyYnl0ZS5MSUKFVN1r01AUv2mjbrXsKkynT3YwJ4h07ZSRbnOII5vIOhXJBF3tug8/oDBxiVMws7gEEq7FPXQP/h8jICuY1WI7fBmdDwP7EKWCpT74IMheGs9tu63DOQ8k95xffufr3nvS2ht5PPGgz9Xh2S3+C5wvwAXOcwGPx0eBXW/4zm0xx1wIIQaekfC1R2Ln5WfiFJoGZRwU73THvtH8Pl9XV1dl7dyKNsQ4EZXjsByuaCzjFaeeimhHYg6EXsHqrlIr6T3o+ph3MiJG0P5yCflM7/jMzH9oKAY8Qf92a+Tm/I9RIjRk+PwkwIQ/clUXCjHuIk7wWWwEs/NfGGZFD6bf0ir0oTY2w7bFQP1Oo+i8SYSCmpOcH5Cd4S3KIXIhIFv4dQ8YGT5JaURKY+OgYmLFD6C2QgQ34S3CvtT5pbjYjuLJM5WaNj1Sc509gI0mwMTfNp8k8hI2WpScOBx/ss2Xs0gLLmtr0iktq308F+k9OeuMlTxaCDBqaetVe4Pjl7H6C1wGB6pRDkDo0jt4+XOQASdSfjO2eRYnzMY1rJaAqKxKjcWvtSKUVbxoVpmLKTUl
!$!2=lQBQh23bJrIVDzNEThLBxAbb0sNbUhQCSXMDPaHCi874UjsttFYvCbqJnCbNb7BxiHNg5RPtoe8sVj+D0k895vIQSNsoZzUH4c359Oidu+HQe8KniWBhoyF+e3cuMRHYEBcgn5iCo7KInNfcLYO6nNdDFpxLYL0olW1byWG1G4rdo1XlGOCxObtb9PlNZZWCKek0beAGCVn9tIcr2ICjCsI5J8umxrpgO4qz4LUDa6wL9gFw2IriT0gIpWsn6urvL0YrDgJ10I4WW8FaAOmDtul4NSPvvYfRqdrNLNsI3We2Z2yi/taytZWBeXAwf9/q+kmin53Mc0dV25H6KXJUOHvEqZsg5z844YlINDq9VR7Ug5oouv2X+ANQSwMECg][FU+GSQ}Q[ABzcmMvUEsDBBQ]IAPxOhkmqG0n40gQ[HIJ[AO]c3JjL29wdDJieXRlLmOdVf9PWlcU/xkS/odrlhR4gPBYujTibaeLnWamGmeWmM4fBB/1pfh4AaRr1f0vnclmqcsiAxGQuVZEit2TiYLLErO0S7fGNFl1qbaGZPfc+97j6TJ/2A/w7pfP+ZzPOefec92cxWwaGBxuJLpHhntWn5HZcG8PIitoeADBGuoaGuoaQf193U700cDgyFDfx73DH3o9/Adfkr8rBIN6uwYHR5zos56hT/sGbiC+3UNownLM678bE9qJJZn29934pAO5QtoycvW3uy1mjvws5vfEoDQuBBFsWMyxu7IAsykpKt6ShHEUmBiL0D0fgQrSuBhsmQTGQqFwAOZSIDQ1LqDOaGw8JPrbJ662wBaz260HWWk2Xua+qzQtZqDk0ABR1E1GNlGKobHIrYCTOuQ4mMTVCSK6o7GI3WKeRiQat3ultPm8Vq1+k1QqzUqzuAqrQBAGBgx/Lt5HkYAo1Cq79eXdA0Cp5ACMAzAOMB35468rtdKxxiZij76r7GfmC8+UN4BKF1MvMusbJyu/a8gp6bYUviNh3tOyYJorjUY9
!$!3=c6ok0uXc+tzCzmGlpiQ239aqq4ns3g9vN04y9dRR9X41RUxoYVCYGAXGogK2cYwBYyu22q/xHS3q9erSVmUj83o1Ufqbmc8tFE6WTqr7u02w1wOlbNimc2Lefo2xOvgONjDqXSw/3YMCIVUNh/wyttGRnZXaxnuvOFFUvCeEg3TDbvdZzNS+/Ef2dC1fq0KGINL6ml8GskpDySsJ7+XLNFlBG6sR9tin/fJNzyj2fHH9um9WUwEh1Y9//jafAfidCTEk2GwOh2jvxNTQPk3dEeST+bU/oarZl0reBMZayDIOq3FRvuxe9TC3DihYgWohNMkqS62YD5LsNmz93GMFByawzDYfb67uLr+moBaKlAMRUFh2OKhqRmLw1DpDJtMkARkxhYeQnc2fygeL5cJW6ZguM9lxmQYYvymOGkxUt/Gz4gjTo18qi8vz9XeQAbZG72lM5jER6SQDLyZmPg2vHQEl4YHi5N483iEnJwUyGEQMGo6JR3NkAkKbdczaiYEbXboEn05svUeOJBm53vd2kI9PR3tbaC9De3W0l6G9KnpW05bMb/2WLu8c1smxRroaQtuGCZqck4gwdltNtgkS7yTZ0jKrnhzgicuQje1SulB8oCS12wa39vsn2a8ZMyFmPJBUzJKKiFB1UY1DqzOamTmzwv1rhdhbzAjmduoAmVjqkMlwT5XEo4WkAgdEj46zhWUXbycMHXpVTeRCTI5iUcsmi1udsI+RU9mHwwSsatJmhVBUQECuyp+Z0UX+Tx+pk4t9cFYosujgDdfT6MbBX+gIumplafGvdBFcFB8sbZJG9jD1SjlS8vW11IvygV+G/mF0bvDgMQQSEWJTEYk0rDOny2jRahm5o+2SSnnu9pNg2PjcHW/ddDqymM+mSXsd0kXW/ZJfgXbtWdBeCqg7zUsbFiFt2tjBI90vp1WKbKrmDoceZiAsxURpSvCdUwK9V0lwqXeLr2rV3NHKU60Jw7d0DC3p/hyVYOxjui92
!$!4=p0TtShGZ4tUz5VRz7dKqeS7ZVIkuA0qZOd3YBt/JfOM56PjvokLfUfse+KC9mwzOeb7AL/zN0rcjk87vwZsEr4723hstCOofUEsDBBQ]IAPiyhUmzJRLhPwU[O8M[AK]cmVhZG1lLnR4dLVW/08TZxj/mUvuf3jXxQSQcoXIJmKX6WTTxAyCuIQ4Yo72oBfbu+56xZBF/xe8bZJa41qva2kpJ3BAW/S4tNcyicEFyebCgEiTblG77H16lsIU/aW8bdrkeZ/n83x/3qf/fDfq6e1H/T3o7EB/NzrT13dmAF28cLYFfdHTO9B34avz/Z+329o+uYl/TmIedP5Mb+9AC/qmu+/ShZ6vUVurjSR4r9g+NCYyrViQJEgiH8gGpDhJ2Ot5MOx6ZlFJZ43kulaaez2zrethLVOOqMq6FMzNPZB/3im8VJ8pfy09npxMTpgckdVUOZqc/GH6KeYLTP4KsmElWhiXSELOyUvqM21Nf2481uXqLdzY63kgIiQRv5cpG3f1R6dIwlrPQxIUhTO4EoD8Zcorf5IEpKIZXb3qcDION+rByTmLKY0k0cByIqKFEUcLeu+hKGBCWMDhooXmZpAZbfmQwOieAMIF4ROF9wpAuPNlY5ckmrrqHhL4ZMupTShCaz0PSXzMcg6338kgy17Vuyzv9XQ5BaY8imrq1L9Y3ivQIwLtQQ7e42HERjc71GLZ30CWpq6D8sbq8raqFHRAUdZNFKu7KoKsF1sp9KFDUSMOx0wwmYOOOZJw5+aiE0cZ7tM+0cnyra7PDkkB2ADl7aFZrrFW5/sKuIkkvieJ/9Wo3WKnzmEGRF0+hahLiOq3dNWCll9/sPNwW5dhltQKFkOYLTbkte91l6nObBQTuqmrCgHDKZnL5FcCiXvxYkSttSr05HDjkPeKbfAjuw1b2IBNbNij2e3tHR1ANckNXgF7NtxomUvk9JQW1yCb33IW6KCGhhuM28cc5DNWj/liyeTr+6XlgrylFaWg
!$!5=klafZBZTofRjkJWCid3MorYWnYDJZ05IjGf6caViwiCAV+ArfxUlqGafremwgpN3c+PRglaKF03cqtOgd89PnCe2613ycDvMC42sva0LsaftJ/Dv8eNmKA7j33P7mBOcwBayg29CQxJv7BcY0S9wyAZkkrhxJK2wv1pyO0fSFh8qYTDDWE0vT29gHrCjoEtBk10LvM0vBdHCRgE/ltlErBRJxedDW5np6TupKLix8OP8hhQkiSl58Z9oQS7q47ps0lJ/TL4KJ7QASBi78dKsUbuFZ5QkALVZfhnaihenHpoVN5OMlSok6hyg53QgVK/HJVPmFDDMBMNa9JUUnJKpy8AaL4aewmut5GMvpmQlXZ1nYAj2xeIXh60nLVUIba3ZLDzwpdow+/Uc3FtgiVjZlotKunD7fqGzM1aqLgRA/+U3+acHW+0dJ2L7No9xCUVCqYT6DJYSiLchz24WdH0tpmaNzOTCBiCFE8trM0pEzZRV5V1aU3fCihYITaeWjLuyLAUXs+GE/jwbAGsXNpZemRNfCuq3ZzO6oT6Z20yHRhgRg8BGAXk52L6VzvVz1zj+OjeYvCP/ntrEjdBms91sa/90MKJWuZX8FM4RqrQxRAhoKzJJPAxCwCtkLWDLhOAuX74vmZGIvjB2sV8RLRC9lX4JIyWigkZ9Nz4/LoGim52dWDD2N9hCEhW7khG1FrQa99E8Q7eyR/Hq12dPttbZKBfrQ/hLI7xECLQwhvjhylpBc06rm+UYGON+D8OJPoREFy0iB80h5GLcXjTG+9F3ftZxzT2Ghvys24knqO86KzpcVoHx8W6/yPIc8tKC6HsLVXSxgtMKd2NI5Hm3r/VLgfdgMsMhnqtAO3mMx/EictGjWIBHAuNlaBF40HWBxWuLqQwxowy2W2Q9DCjzsdxIa93j1NZO2TooyM5/UEsBAh8ACg][E0+GSQ}QAJ{[Q{AGxpYi8KAC{EAGADGIjv8Y0/SAcYiO/xjT9IBwLl+V
!$!6=/tO0gFQSwECHwAU]C[gs4VJYL47QeI]WAQ[DgAk{AC]Ai]bGliL29wdDJieXRlLmgKAC{EAGABSirFcA0/SASuYC9pjT9IBK5gL2mNP0gFQSwECHwAU]C[OT4ZJ/6T4/ccC[B8B[AE[k{AC]AwAQ[bGliL29wdDJieXRlLkxJQgoAI{QAYAIUaxPVjT9IBJbnB9WNP0gElucH1Y0/SAVBLAQIf[o][BVPhkk}EACQ{AE]CUE[BzcmMvCgAg][ABABgAgWEv/mNP0gGBYS/+Y0/SARp2aAL8TtIBUEsBAh8AF]AgA/E6GSaobSfjSB[Acgk[A4AJ{[g]RwQ[HNyYy9vcHQyYnl0ZS5jCgAg][ABABgAZOdl4mNP0gGL+Q3aY0/SAYv5DdpjT9IBUEsBAh8AF]AgA+LKFSbMlEuE/BQ[7ww[AoAJ{[g]RQk[HJlYWRtZS50eHQKAC{EAGABJGiYyA0/SAYv5DdpjT9IBi/kN2mNP0gFQSwUG][YABgAqAg[rA4]A
goto :EOFCOPY
3

评分人数

返回列表