char dozwolony(char trescw)
{
if(!((trescw>='a' && trescw<='z') ||
	(trescw>='A' && trescw<='Z') ||
	(trescw>='0' && trescw<='9') ||
	(trescw=='(') ||
	(trescw==')') ||
	(trescw=='!') ||
	(trescw=='@') ||
	(trescw=='#') ||
	(trescw=='%') ||
	(trescw==',') ||
	(trescw=='.') ||
	(trescw==' ') ||
	(trescw=='|') ||
	(trescw=='-') ||
	(trescw==';') ||
	(trescw==39) ||
	(trescw=='~') ||
	(trescw==':') ||
	(trescw=='"') ||
	(trescw=='?') ||
	(trescw=='/')
	)) //dozwolone: "!@#%(),.;'~:"?/"
	    trescw='_';
return trescw;
}

char warthex(char *i)
{
int valu=0;
if(i[1]>='0' && i[1]<='9')
    valu+=(i[1]-48)*16;
else valu+=(toupper(i[1])-55)*16;
if(i[2]>='0' && i[2]<='9')
    valu+=(i[2]-48);
else valu+=(toupper(i[2])-55);
return (char)valu;
}
	
int decode(char *liniap, int max)
{
int k=0,i;
char linia[1000];
if(strlen(liniap)>1000)
    return 0;
for(i=0;i<strlen(liniap);i++) {
    if(liniap[i]=='+')linia[k++]=' ';
    else {
	if(liniap[i]!='%') {
	    linia[k++]=dozwolony(liniap[i]);
	} else {
	    linia[k++]=dozwolony(warthex(liniap+i));
	    i+=2;
	}
    }
}
linia[k]=0;
sprintf(liniap,"%.*s",max-1,linia);
return 0;
}

int decodeqp(char *liniap, int max)
{
int k=0,i;
char linia[5000];
if(strlen(liniap)>5000)
    return 0;
for(i=0;i<strlen(liniap);i++) {
    if(liniap[i]!='=') {
	linia[k++]=liniap[i];
    } else {
	if(i!=strlen(liniap)-1) {
	    linia[k++]=warthex(liniap+i);
	    i+=2;
	}
    }
}
linia[k]=0;
sprintf(liniap,"%.*s",max-1,linia);
return 0;
}

int decodesubiect(char *liniap, int max)
{
int k=0,i,qp=0;
char linia[5000];
if(strlen(liniap)>5000)
    return 0;
for(i=0;i<strlen(liniap);i++) {
    if(liniap[i]=='?' && liniap[i+1]=='=' && qp==1) {
	qp=0;
	i+=2;
    }
    else
    if(liniap[i]!='=') {
	linia[k++]=liniap[i];
    } 
    else
    if(strncasecmp(liniap+i,"=?ISO-8859-2?Q?",15)==0) {
	qp=1;
	i+=14;
    }
    else
    if(qp!=1)
	linia[k++]='=';
    else {
	linia[k++]=warthex(liniap+i);
	i+=2;
    }
}
linia[k]=0;
sprintf(liniap,"%.*s",max-1,linia);
return 0;
}

int dozwolonys(char *liniap)
{
int i;
char linia[4000];
if(strlen(liniap)>4000)
    return 0;
linia[0]=0;
for(i=0;i<strlen(liniap);i++) {
    if(liniap[i]=='<')sprintf(linia,"%s&#x3C;",linia);else
    if(liniap[i]=='>')sprintf(linia,"%s&#x3E;",linia);else
    if(liniap[i]=='[')sprintf(linia,"%s&#x5B;",linia);else
    if(liniap[i]==']')sprintf(linia,"%s&#x5D;",linia);else
    if(liniap[i]=='&')sprintf(linia,"%s&#x38;",linia);else
    if(liniap[i]=='±')sprintf(linia,"%s&#261;",linia);else
    if(liniap[i]=='æ')sprintf(linia,"%s&#263;",linia);else
    if(liniap[i]=='ê')sprintf(linia,"%s&#281;",linia);else
    if(liniap[i]=='³')sprintf(linia,"%s&#322;",linia);else
    if(liniap[i]=='ñ')sprintf(linia,"%s&#324;",linia);else
    if(liniap[i]=='ó')sprintf(linia,"%s&#243;",linia);else
    if(liniap[i]=='¶')sprintf(linia,"%s&#347;",linia);else
    if(liniap[i]=='¼')sprintf(linia,"%s&#378;",linia);else
    if(liniap[i]=='¿')sprintf(linia,"%s&#380;",linia);else
    if(liniap[i]=='¡')sprintf(linia,"%s&#260;",linia);else
    if(liniap[i]=='Æ')sprintf(linia,"%s&#262;",linia);else
    if(liniap[i]=='Ê')sprintf(linia,"%s&#280;",linia);else
    if(liniap[i]=='£')sprintf(linia,"%s&#321;",linia);else
    if(liniap[i]=='Ñ')sprintf(linia,"%s&#323;",linia);else
    if(liniap[i]=='Ó')sprintf(linia,"%s&#211;",linia);else
    if(liniap[i]=='¦')sprintf(linia,"%s&#346;",linia);else
    if(liniap[i]=='¬')sprintf(linia,"%s&#377;",linia);else
    if(liniap[i]=='¯')sprintf(linia,"%s&#379;",linia);else
    sprintf(linia,"%s%c",linia,dozwolony(liniap[i]));
    }
sprintf(liniap,"%s",linia);
return 0;
}
