Platon Technologies
not logged in Login Registration
EnglishSlovak
open source software development celebrating 10 years of open source development! Friday, April 19, 2024

File: [Platon] / libplaton / platon / html / Tag.cpp (download)

Revision 1.7, Wed Oct 2 20:13:57 2002 UTC (21 years, 6 months ago) by nepto


Changes since 1.6: +1 -1 lines

Fixed #include directives according to created #include policy.

#ifdef __cplusplus

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <platon/str/strctype.h>
#include <platon/html/Tag.h>

htmlTag::htmlTag(void){
    params=0;
    name=NULL;
    param=value=NULL;
}

htmlTag::~htmlTag(void){
    free();
}

int htmlTag::init(char*s){
    int i=1;
    char*pom;

    if(s[0]!=HTML_TAG_BEGIN)return(-1);
    free();

    while(s[i]==HTML_TAG_SEPARATOR)i++;
    if((name=getString(s+i))==NULL)return(-1);
    if(name[0]!=HTML_TAG_COMMENT)strlwr(name);
    i+=strlen(name);

    while(1){
        while(s[i]==HTML_TAG_SEPARATOR)i++;
        if((pom=getString(s+i))==NULL)break;
        i+=strlen(pom);
        if((param=(char**)realloc(param,sizeof(char*)*(params+1)))==NULL)
            return(-1);
        if((value=(char**)realloc(value,sizeof(char*)*(params+1)))==NULL)
            return(-1);

        param[params]=pom;
        value[params]=strchr(param[params],HTML_TAG_VALUE);
        if(value[params]!=NULL){
            value[params][0]='\0';
            value[params]++;
        }
        else value[params]=strchr(param[params],'\0');
        if(name[0]!=HTML_TAG_COMMENT)strlwr(param[params]);
        params++;
    }
    return(params);
}

void htmlTag::writeToFile(FILE*f){
    int k;
    fputc(HTML_TAG_BEGIN,f);
    fputs(name,f);
    for(k=0;k<params;k++){
        fputc(HTML_TAG_SEPARATOR,f);
        fputs(param[k],f);
        if(strlen(value[k])){
            fputc(HTML_TAG_VALUE,f);
            fputs(value[k],f);
        }
    }
    fputc(HTML_TAG_END,f);
}

int htmlTag::getIndexParam(const char*a_param){
    register int k;
    for(k=0;k<params;k++)if(!strcmp(a_param,param[k]))return(k);
    return(-1);
}

int htmlTag::getIndexValue(const char*a_value){
    register int k;
    for(k=0;k<params;k++)if(!strcmp(a_value,value[k]))return(k);
    return(-1);
}


/*
 * add... methods.
 */

int htmlTag::addParam(const char*a_param){
    return(addParam(a_param,""));
}

int htmlTag::addParam(const char*a_param,const char*a_value){
    /* printf("addParam() start: params=%d\n",params); */
    if(a_param==NULL)return(-1);
    if(a_value==NULL)return(addParam(a_param));

    if((param=(char**)realloc(param,sizeof(char*)*(params+1)))==NULL)return(-1);
    if((value=(char**)realloc(value,sizeof(char*)*(params+1)))==NULL)return(-1);
    param[params]=
        (char*)malloc(sizeof(char)
                      *(strlen(a_param)+1+strlen(a_value)+strlen(a_value)*1));
    if(param[params]==NULL)return(-1);

    strcpy(param[params],a_param);
    if(strlen(a_value)){
        value[params]=strchr(param[params],'\0')+1;
        strcpy(value[params],a_value);
    }
    else value[params]=strchr(param[params],'\0');

    params++;

    /*  printf("addParam() end: params=%d\n",params); */
    return(0);
}

int htmlTag::removeParam(int index){
    register int k;
    if(index>=0&&index<params){
        ::free(param[index]);
        params--;
        for(k=index;k<params;k++){
            param[k]=param[k+1];
            value[k]=value[k+1];
        }
        if(params>0){
            if((param=(char**)realloc(param,sizeof(char*)*params))==NULL)
                return(-1);
            if((value=(char**)realloc(value,sizeof(char*)*params))==NULL)
                return(-1);
        }
        else{
            ::free(param);
            param=NULL;
            ::free(value);
            value=NULL;
        }
    }
    return(0);
}

int htmlTag::removeValue(int index){
    if(index>=0&&index<params){
        param[index]=(char*)realloc(param[index],
                sizeof(char)*(strlen(param[index])+1));
        if(param[index]==NULL)return(-1);
        value[index]=strchr(param[index],'\0');
    }
    return(0);
}

    int htmlTag::removeParam(const char*a_param){
        while(getIndexParam(a_param)>=0)
            if(removeParam(getIndexParam(a_param))<0)return(-1);
        return(0);
    }

    int htmlTag::removeValue(const char*a_value){
        while(getIndexValue(a_value)>=0)
            if(removeValue(getIndexValue(a_value))<0)return(-1);
        return(0);
    }

    int htmlTag::removeValueParam(const char*a_param){
        while(getIndexParam(a_param)>=0)
            if(removeValue(getIndexParam(a_param))<0)return(-1);
        return(0);
    }

void htmlTag::print(void){
    register int k;
    fprintf(stdout,"TAG: %s / PARAMETERS: %d\n",name,params);
    for(k=0;k<params;k++){
        fprintf(stdout,"  %d: %s%c%s\n",k,param[k],HTML_TAG_VALUE,value[k]);
    }
}

/* Private methods. */
void htmlTag::free(void){
    register int k;
    if(name!=NULL)::free(name);
    for(k=0;k<params;k++)if(param[k]!=NULL)::free(param[k]);
    if(param!=NULL)::free(param);
    if(value!=NULL)::free(value);
    params=0;
}

int htmlTag::paramLength(char*s){
    int ret=0;
    if(s[0]==HTML_TAG_COMMENT)ret=strlen(s)-1;
    else{
        while(1){
            if(s[ret]==HTML_TAG_QUOTES)
                while(1){
                    ret++;
                    if(s[ret]==HTML_TAG_QUOTES)break;
                    if(s[ret]=='\0')break;
                }
            if(s[ret]==HTML_TAG_SEPARATOR)break;
            if(s[ret]==HTML_TAG_END)break;
            if(s[ret]=='\0')break;
            ret++;
        }
    }
    return(ret);
}

char*htmlTag::getString(char*s){
    char*ret;
    unsigned len=paramLength(s);

    if(!len)return(NULL);

    if((ret=(char*)malloc(sizeof(char)*(len+1)))!=NULL){
        strncpy(ret,s,len);
        ret[len]='\0';
    }
    return(ret);
}

#endif /* #ifdef __cplusplus */


Platon Group <platon@platon.org> http://platon.org/
Copyright © 2002-2006 Platon Group
Site powered by Metafox CMS
Go to Top