Beispiel #1
0
char *treplace(char *data,char *search,char *replace) {
    char *newline,*p;

    memChunk *result,*line;
    //ulong resultAllocSize;

    if(!strlen(search))  return data;

#if MDEBUG2
    DBG("treplace(string,se,re)","string  : %s",data);
    DBG("treplace(string,se,re)","search  : %s",search);
    DBG("treplace(string,se,re)","replace : %s",replace);
#endif

    result = memReserve(INPUTLINE_BUFFER_REPLACE_SIZE);
    line   = memReserve(INPUTLINE_BUFFER_REPLACE_SIZE);

    p=data;
    while (sscanf(p,"%[^\n]",line->address)==1) {
        if(p-data>strlen(data)) break;
        newline=mreplace(line->address,search,replace);

        memStrCat(result,newline);
        if (line->address && *(p+strlen(line->address))) memStrCat(result,"\n");
        else break;

        p+=strlen(line->address)+1;
    }
    p=strdup(result->address);
    memFree(result);
    memFree(line);
    return p;
}
Beispiel #2
0
memChunk *memString(char *string) {
	static memChunk *buffer;
	memCheckState ();
	buffer = memReserve (strlen (string) + 1);
	memcpy (buffer->address, string, strlen (string));
	return buffer;
}
Beispiel #3
0
void memStrCat(memChunk *dest, char *string) {
	memChunk result,*temp;

	temp           = memReserve (dest->size + strlen (string)+1);

	result.address = dest->address + strlen (dest->address);
	result.size    = dest->size - strlen (dest->address) + 1;

	memCopy (temp, memString (string));
	memCopy (&result, temp);

	memFree (temp);
}
Beispiel #4
0
void sreplace(char *s,char *orig,char *rep,char multi,long dsize) {
    char *p;
    memChunk *buffer,*string,*result;

    if(!(p=strstr(s, orig))) return;

    buffer=memReserve(dsize);
    string=memString(s);

    memCopy(buffer, string);

    snprintf(buffer->address+(p-s), buffer->size-(p-s),"%s%s", rep, p+strlen(orig));

    result=memString(buffer->address);

    strcpy(s,result->address);	//unsafe

    memFree(string);
    memFree(result);
    memFree(buffer);
}
Beispiel #5
0
char *mreplace(char *string, char *se,char *rep) {
    int    		status,i;
    char		noMatch=0;
    regex_t    	re;
    size_t     	nmatch = 16;
    regmatch_t 	pm[nmatch];
    unsigned long	offset = 0;
    char		field[16];
    char		*res;
    memChunk	*search,*temp,*found,*ffound;

    if(!string)        	return "";
    if(!strlen(se)) 	return string;
    if(!strcmp(se,rep)) 	return string;

    temp   = memStringReserve(string,INPUTLINE_BUFFER_REPLACE_SIZE);
    search = memStringReserve(se,INPUTLINE_BUFFER_REPLACE_SIZE);

    sreplace(search->address,"\\d","[0-9]",1,INPUTLINE_BUFFER_REPLACE_SIZE);

#if MDEBUG2
    sData=strdup(string);
    DBG("mreplace(string,se,re)","string  : %s",sData);
    DBG("mreplace(string,se,re)","search  : %s",search->address);
    DBG("mreplace(string,se,re)","replace : %s",rep);
#endif

    if(regcomp(&re, search->address, REG_EXTENDED) != 0)
        if(regcomp(&re, search->address, REG_EXTENDED<<1)) 	noMatch=1;
    if((status = regexec(&re, string, nmatch, pm, 0))) 		noMatch=1;

    if(noMatch) {
        memFree(temp);
        memFree(search);
        return (char*)string;
    }

    found  = memReserve(INPUTLINE_BUFFER_REPLACE_SIZE);
    ffound = memReserve(INPUTLINE_BUFFER_REPLACE_SIZE);
    while(!status) {
        offset=strlen(temp->address)-strlen(string);
        snprintf(found->address, INPUTLINE_BUFFER_REPLACE_SIZE, "%.*s",
                 (int)(size_t)(pm[0].rm_eo - pm[0].rm_so), &string[pm[0].rm_so]);//,&string[pm[0].rm_so]);
#if MDEBUG3
        printf("------->> found \"%s\" length => %d offset[%d]\n",
               found->address, strlen(temp->address),offset);
#endif
        sreplace(temp->address+offset,found->address,rep,0,INPUTLINE_BUFFER_REPLACE_SIZE-offset);
        for(i=1; i<nmatch; i++) {
            snprintf(ffound->address,INPUTLINE_BUFFER_REPLACE_SIZE, "%.*s",
                     (int)(size_t)(pm[i].rm_eo - pm[i].rm_so), &string[pm[i].rm_so]);//,&string[pm[i].rm_so]);
            snprintf(field,sizeof(field),"\\%d",i);
            if(strlen(ffound->address)) {
                sreplace(temp->address,field,ffound->address,1,INPUTLINE_BUFFER_REPLACE_SIZE);
            } else {
                sreplace(temp->address,field,"",1,INPUTLINE_BUFFER_REPLACE_SIZE);
                continue;
            }
#if MDEBUG3
            printf(">> subfound %2d  '%s' => '%s' length %d\n",
                   i,
                   ffound->address,
                   temp->address,offset);
#endif
        }
        if(offset<0) offset=-offset;
        if(*string && strlen(string+pm[0].rm_eo)) {
            string+=pm[0].rm_eo;
            status = regexec(&re, string, nmatch, pm, 0);
        } else {
            status=-1;
        }
    }
#if MDEBUG2
    DBG("mreplace(string,se,re)","result : %s",temp->address);
#endif
    res=strdup(temp->address);
    memFree(temp);
    memFree(search);
    memFree(found);
    memFree(ffound);
    return res;
}
Beispiel #6
0
memChunk *memStringReserve(char *string, long nbytes) {
	static memChunk *buffer;
	buffer=memReserve (nbytes);
	memCopy (buffer, memString (string));
	return buffer;
}