/************************************************************************
qDecoder - Web Application Interface for C/C++ http://www.qDecoder.org
Copyright (C) 2001 The qDecoder Project.
Copyright (C) 1999,2000 Hongik Internet, Inc.
Copyright (C) 1998 Nobreak Technologies, Inc.
Copyright (C) 1996,1997 Seung-young Kim.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Copyright Disclaimer:
Hongik Internet, Inc., hereby disclaims all copyright interest.
President, Christopher Roh, 6 April 2000
Nobreak Technologies, Inc., hereby disclaims all copyright interest.
President, Yoon Cho, 6 April 2000
Seung-young Kim, hereby disclaims all copyright interest.
Author, Seung-young Kim, 6 April 2000
************************************************************************/
#include "qDecoder.h"
#include "qInternal.h"
/**********************************************
** Usage : qArgMake(query string, token array);
** Return: Number of parsed tokens.
** Do : This function parses query string and stores
** each query into token array.
**
** ex) char *query="I am a \"pretty girl\".", *qlist[MAX_TOKENS];
** int queries;
** queries = qArgMake(query, qlist);
**********************************************/
int qArgMake(char *str, char **qlist) {
char *query, *sp, *qp;
int argc;
query = sp = qRemoveSpace(strdup(str));
for(argc = 0; *sp != '\0';) {
switch(*sp) {
case ' ': { /* skip space */
sp++;
break;
}
case '"': { /* Double quotation arounded string */
qlist[argc] = qp = (char *)malloc(strlen(query) + 1);
for(sp++; *sp != '\0'; sp++, qp++) {
if(*sp == '"') { sp++; break; }
*qp = *sp;
}
*qp = '\0';
if(strlen(qlist[argc]) > 0) argc++;
break;
}
default: {
qlist[argc] = qp = (char *)malloc(strlen(query) + 1);
for(; *sp != '\0'; sp++, qp++) {
if(*sp == ' ' || *sp == '"') break;
*qp = *sp;
}
*qp = '\0';
argc++;
break;
}
}
}
qlist[argc] = NULL;
free(query);
return argc;
}
/**********************************************
** Usage : qArgMatch(target string, token array);
** Return: Number of token matched. (Do not allow duplicated token matches)
** This value is not equal to a value of qArgEmprint()
**********************************************/
int qArgMatch(char *str, char **qlist) {
char **qp;
int i;
/* To keep the value i over zero */
if(!*qlist) return 0;
for(qp = qlist, i = 0; *qp != NULL; qp++) if(qStristr(str, *qp)) i++;
return i;
}
/**********************************************
** Usage : qArgPrint(pointer of token array);
** Return: Amount of tokens.
** Do : Print all parsed tokens for debugging.
**********************************************/
int qArgPrint(char **qlist) {
char **qp;
int amount;
qContentType("text/html");
for(amount = 0, qp = qlist; *qp; amount++, qp++) {
printf("'%s' (%d bytes)
\n" , *qp, strlen(*qp));
}
return amount;
}
/**********************************************
** Usage : qArgEmprint(mode, target string, token array);
** Return: Number of matches. (Allow duplicated token matches)
** This value is not equal to a value of qArgMatch().
** Do : Make matched token bold in target string.
**********************************************/
int qArgEmprint(int mode, char *str, char **qlist) {
char *sp, *freestr, *buf, *bp, *op;
int i, j, flag, matches;
if(!*qlist) {
qPuts(mode, str);
return 0;
}
/* Set character pointer */
op = str;
sp = freestr = strdup(str);
qStrupr(sp);
if((bp = buf = (char *)malloc(strlen(str) + 1)) == NULL) qError("Memory allocation fail.");
for(matches = 0; *sp != '\0';) {
for(i = 0, flag = 0; qlist[i] != NULL; i++) {
if(!qStrincmp(sp, qlist[i], strlen(qlist[i]))) {
*bp = '\0'; /* Mark string end */
qPuts(mode, buf); /* flash buffer */
bp = buf; /* reset buffer pointer */
printf("");
for(j = 1; j <= (int)strlen(qlist[i]); j++) {
printf("%c", *op++);
sp++;
}
printf("");
flag = 1;
matches++;
break;
}
}
if(flag == 0) {
*bp++ = *op++;
sp++;
}
}
*bp = '\0'; /* Mark string end */
qPuts(mode, buf); /* Flash buffer */
free(buf);
free(freestr);
return matches;
}
/**********************************************
** Usage : qArgFree(pointer of token array);
** Do : Free malloced token array.
**********************************************/
void qArgFree(char **qlist) {
char **qp;
for(qp = qlist; *qp; qp++) free(*qp);
*qlist = NULL;
}