// test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
#define CGI_MAX_SOCKET 256
#define CGI_MAX_BUF 1024
#define CGI_MAX_LEN 256
#include <stdio.h>
long long atoll(const char* str)
{
long long e = 0;
long long tmpKeep = 0;
int i = 0;
const int len = strlen(str);
if (len <= 0) {
goto EXIT_FUN;
}
if (str[0] == '-') {
e = atoll(str + 1);
e = (-e);
goto EXIT_FUN;
}
for (i = 0; i < len; i++) {
if (str[i] > '9' || str[i] < '0') {
break;
}
tmpKeep = e;
e *= 10;
e += (((long long)(str[i] - '0')) & 0x00000000000000FF);
if (tmpKeep > e) {
/* 越界 */
e = 0;
goto EXIT_FUN;
}
}
EXIT_FUN:
return e;
}
static int GetStrParamValue(const char *purl, const char *pkey, char *pkeyvalue,int maxlen)
{
const char *phead;
const char *pdst = purl;
const char *pend = purl;
char *presult = NULL;
int len = 0;
//find key
// printf("purl:%s pkey:%s\n",purl,pkey);
while(1){
phead = strstr(pdst, pkey);
if (!phead)
{
return -1;
}
presult = (char*)(phead - 1); //split chart
// printf("presult %x\n",presult[0]);
if ((presult[0] == 0x3f) || (presult[0] == 0x26)) //0x3f->? 0x26->&
{
break;
}
pdst += strlen(pkey);
}
// printf("phead0:%s\n",phead);
//move phead to start of value,eg:value=12345;,then move phead=12345;
phead = phead + strlen(pkey) ;
//find key end
pend = strstr(phead, "&");
//if find end of key
if (pend)
{ //find end of key
len = pend - phead;
if (len > maxlen){
len = maxlen;
}
memcpy(pkeyvalue, phead, len);
//printf("phead1:%s pend:%s===len=%d\n",phead,pend,len);
return 0;
}
//not find end of key,this is cgi end
len = strlen(phead);
if (len > maxlen){
len = maxlen;
}
memcpy(pkeyvalue, phead, len);
//printf("keyvalue:%s phead2:%s\n",pkey,phead);
return 0;
}
#define NON_NUM '0'
static int hex2num(char c)
{
if (c>='0' && c<='9') return c - '0';
if (c>='a' && c<='z') return c - 'a' + 10;
if (c>='A' && c<='Z') return c - 'A' + 10;
return NON_NUM;
}
static int URLDecode(const char* str, const int strSize, char* result, const int resultSize)
{
char ch,ch1,ch2;
int i;
int j = 0;//record result index
if ((str==NULL) || (result==NULL) || (strSize<=0) || (resultSize<=0)) {
return 0;
}
for ( i=0; (i<strSize) && (j<resultSize); ++i) {
ch = str[i];
switch (ch) {
case '+':
result[j++] = ' ';
break;
case '%':
if (i+2<strSize) {
ch1 = hex2num(str[i+1]);//high 4 bit
ch2 = hex2num(str[i+2]);//low 4 bit
if ((ch1!=NON_NUM) && (ch2!=NON_NUM))
result[j++] = (char)((ch1<<4) | ch2);
i += 2;
break;
} else {
break;
}
default:
result[j++] = ch;
break;
}
}
result[j] = 0;
return j;
}
int GetKeyValue(char *pparam,char *pkey,char *pvalue)
{
int iRet = -1;
int len = strlen(pkey);
char keyname[CGI_MAX_LEN];
char keyvalue[CGI_MAX_LEN];
char decoderbuf[CGI_MAX_LEN];
// printf("get key value=%d value:%s\n",len,pkey);
// printf("pparam:%s pkey:%s pvalue:%s\n",pparam,pkey,pvalue);
//check maxlen
if( (!pparam) || (!pkey) || (!pvalue)){
return iRet;
}
memset(keyname,0x00,CGI_MAX_LEN);
strcpy(keyname,pkey);
keyname[len]='=';
// printf("get key value1 pkey=%s\n",keyname);
memset(keyvalue,0x00,CGI_MAX_LEN);
iRet = GetStrParamValue(pparam, keyname, keyvalue,CGI_MAX_LEN - 1);
if (iRet == 0x00){
memset(decoderbuf,0x00,CGI_MAX_LEN);
URLDecode(keyvalue,CGI_MAX_LEN,decoderbuf,CGI_MAX_LEN-1);
strcpy(pvalue,decoderbuf);
// printf("pvalue:%s\n",pvalue);
}
// printf("get key value2=%d\n",iRet);
return iRet;
}
int GetKeyInt(char *pparam,char *pkey,int *pvalue)
{
int iRet = -1;
char keyvalue[CGI_MAX_LEN];
memset( keyvalue, 0x00, CGI_MAX_LEN );
iRet = GetKeyValue(pparam, pkey, keyvalue);
//printf("iRet %d pkey:%s keyvalue:%s\n",iRet,pkey,keyvalue);
if (iRet == 0x00){
*pvalue = atoi(keyvalue);
//printf("*pvalue=%d\n", *pvalue);
}
return iRet;
}
int GetKeyLong(char *pparam,char *pkey,long long *pvalue)
{
int iRet = -1;
char keyvalue[CGI_MAX_LEN];
memset( keyvalue, 0x00, CGI_MAX_LEN );
iRet = GetKeyValue(pparam, pkey, keyvalue);
//printf("iRet %d pkey:%s keyvalue:%s\n",iRet,pkey,keyvalue);
if (iRet == 0x00){
*pvalue = atoll(keyvalue);
printf("*pvalue=%lld, keyvalue=%s\n", *pvalue, keyvalue);
}
return iRet;
}
int GetKeyStr(char *pparam,char *pkey,char *pvalue,int maxlen)
{
int iRet = -1;
int len = 0;
char keyvalue[CGI_MAX_LEN];
memset( keyvalue, 0x00, CGI_MAX_LEN );
// printf("pparam:%s pkey:%s keyvalue:%s\n",pparam,pkey,keyvalue);
iRet = GetKeyValue(pparam, pkey, keyvalue);
if (iRet == 0x00){
len = strlen(keyvalue);
memset(pvalue,0x00,maxlen);
if (len > maxlen){
len = maxlen;
}
memcpy(pvalue,keyvalue,len);
iRet = 0x00;
}
return iRet;
}
int _tmain(int argc, _TCHAR* argv[])
{
//char value[100];
int value = 0;
int *pvalue = &value;
// GetStrParamValue("https://www.baidu.com/s?wd=error%20C2440%3A%20","wd",value,100);
GetKeyInt("https://www.baidu.com/s?wd=error%20C2440%3A%20&abc=123","abc",pvalue);
cout<<value<<endl;
system("PAUSE");
return 0;
}