VString PartLineDoubleUp(VString line, VString el, VString er){ unsigned char *pos=line, *lpos; if(!rtmsu(line.endu(), el, el, pos)){ return VString(); } lpos=pos+=el.sz; //el.setu(pos+el.sz, line.endu()-pos-el.sz); if(!rtmsu(line.endu(), er, er, pos)){ return VString(); } return VString(lpos, pos-lpos); }
VString dspacevt(VString &line, int s){ // удаление пробелов и табов s - начало конец вернуть; 1,2,4 unsigned char *ln=line, *to=line.endu(); if(s&1) for(ln; ln<to; ln++){ if(*ln!=' ' && *ln!='\t' ) break; } if(s&2) for(to; ln<to; to--){ if(*(to-1)!=' ' && *(to-1)!='\t') break; } if(s&4) return line=VString(ln, to-ln); return VString(ln, to-ln); }
// ParamLine int ParamLine(VString line, VString &name, unsigned char *k, VString *v, int sz){ int count=0; VString t; unsigned char *ln=line, *lln=ln, *to=line.endu(), lk=0, f=1; while(ln<to+1){ if(ln==to || *ln=='.' || *ln==',' || *ln=='=' || *ln=='!' || *ln=='*' || *ln=='/' || *ln=='+'/* || *ln=='-'*/ || *ln=='!' || *ln=='~' || *ln==':'){ t.setu(lln, ln-lln); dspacev(t, 7); if(f){ f=0; name=t; } else{ if(count<sz){ k[count]=lk; v[count]=t; count++; } } lk=*ln; lln=ln+1; } ln++; } return count; }
VString PartLineST(VString line, VString &two){ // one = "Text Part ONe" [Space || Tab] "Text Part Two" -> two unsigned char *ln = line, *to =line.endu(); while(ln < to && (*ln != ' ' || *ln !='\t')) ln ++; if(ln == to){ two.Clean(); return line; } line = line.str(ln - line.data); while(ln < to && (*ln == ' ' || *ln =='\t')) ln ++; two.setu(ln, to - ln); return line; }
VString PartLineTwo(VString line, VString &two, VString el, VString el2){ unsigned char *pos = line, *pos2 = pos; if(!rtms(line.endu(), el, el, pos)) pos = line.endu(); if(!rtms(line.endu(), el2, el2, pos2)) pos2 = line.endu(); pos = pos < pos2 ? pos : pos2; if(pos == line.endu()){ two.Clean(); return line; } two.setu(pos+el.sz, line.endu()-pos-el.sz); return VString(line.uchar(), pos-line.uchar()); }
unsigned int MTime::rpmf_date(unsigned char *ret, unsigned int rsz, const VString line, unsigned int tm, bool gmt, bool eng, BYTE c){ unsigned char *aret=ret, *rt=ret ? ret+rsz : 0; // define unsigned char *ln=line, *to=line.endu(); //LString ret; Itos it; //for(unsigned int i=0; i<line.size(); i++){ for(ln; ln<to; ln++){ if(c){ if(*ln!=c){ if(ret<rt) *ret++=*ln; continue; } ln++; continue; } switch(*ln){ case 'a': if(ret+2<rt){ *ret++= hour<12 ? 'a' : 'p'; *ret++='m'; } else ret+=2; break; case 'A': if(ret+2<rt){ *ret++= hour<12 ? 'a' : 'p'; *ret++='M'; } else ret+=2; break; //ret+=hour<12 ? "AM" : "PM"; break; // b case 'd': ret+=prmf_itos(ret, ret<rt ? rt-ret : 0, day, 10, 2); break; case 'D': if(!eng){ if(ret+3<rt){ memcpy(ret, MTIME_MTDAYS_USE[((year-1970)*365+(year-1970+1)/4+doy+4)%7], 3); } ret+=3; } // ret+=VString(MTIME_MTDAYS_USE[((year-1970)*365+(year-1970+1)/4+doy+4)%7]).Left(3); else { if(ret+3<rt){ memcpy(ret, mtdays[((year-1970)*365+(year-1970+1)/4+doy+4)%7], 3); } ret+=3; } break; //ret+=VString(mtdays[((year-1970)*365+(year-1970+1)/4+doy+4)%7]).Left(3); break; // day name /* case 'F': if(!eng) ret+=MTIME_MTMONTH_USE[month-1]; else ret+=mtmonths[month-1]; break; // month name */ case 'g': ret+=prmf_itos(ret, ret<rt ? rt-ret : 0, hour-(hour>11 ? 12 : 0)); break; case 'h': ret+=prmf_itos(ret, ret<rt ? rt-ret : 0, hour-(hour>11 ? 12 : 0), 10, 2); break; case 'G': ret+=prmf_itos(ret, ret<rt ? rt-ret : 0, hour); break; case 'H': ret+=prmf_itos(ret, ret<rt ? rt-ret : 0, hour, 10, 2); break; case 'i': ret+=prmf_itos(ret, ret<rt ? rt-ret : 0, minute, 10, 2); break; //i /* case 'l': if(!eng) ret+=MTIME_MTDAYS_USE[((year-1970)*365+(year-1970+1)/4+doy+4)%7]; else ret+=mtdays[((year-1970)*365+(year-1970+1)/4+doy+4)%7]; break; // day name case 'J': ret+=it.itos(day); break; case 'L': ret+=(year-2%4)? "0" : "1"; break; */ case 'm': ret+=prmf_itos(ret, ret<rt ? rt-ret : 0, month, 10, 2); break; case 'M': if(!eng){ if(ret+3<rt){ memcpy(ret, MTIME_MTMONTH_USE[month-1], 3); } ret+=3; } else{ if(ret+3<rt){ memcpy(ret, mtmonths[month-1], 3); } ret+=3; } break; /* //M case 'p':{ int d=(::time()-::time()%86400-tm+86400)/86400; if(!eng) if(d<3) ret+=MTIME_MTPDAYS_USE[2-d]; else ret+=MTIME_MTDAYS_USE[((year-1970)*365+(year-1970+1)/4+doy+4)%7]; else if(d<3) ret+=mtdays[2-d]; else ret+=mtdays[((year-1970)*365+(year-1970+1)/4+doy+4)%7]; break; // day name break;} */ // case 'n': ret+=it.itos(month-1); break; case 'O': if(timezone<=0){ if(ret<rt){ *ret='+'; } ret++; } ret+=prmf_itos(ret, ret<rt ? rt-ret : 0, -timezone/60, 10, 2); ret+=prmf_itos(ret, ret<rt ? rt-ret : 0, dstflag, 10, 2); break; case 'r': ret+=rpmf_date(ret, ret<rt ? rt-ret : 0, "D, d M Y H:i:s O", tm, gmt, eng, c); break; case 's': ret+=prmf_itos(ret, ret<rt ? rt-ret : 0, sec, 10, 2); break; case 't': ret+=prmf_itos(ret, ret<rt ? rt-ret : 0, day); break; case 'Y': ret+=prmf_itos(ret, ret<rt ? rt-ret : 0, year); break; case 'y': ret+=prmf_itos(ret, ret<rt ? rt-ret : 0, year%100); break; case 'w': ret+=prmf_itos(ret, ret<rt ? rt-ret : 0, ((year-1970)*365+(year-1970+1)/4+doy+4)%7); break; case 'z': ret+=prmf_itos(ret, ret<rt ? rt-ret : 0, doy); break; /* В строке формата распознаются следующие символы: B - время Swatch Internet I (заглавная i) - "1", если Daylight Savings Time, "0" - в противном случае. //l ('L' в нижнем регистре) - день недели, буквенный, long; например, "Friday" //M - месяц, буквенный, 3 буквы; например, "Jan" O - Разница с временем по Гринвичу, в часах; например, "+0200" r - RFC 822 формат даты; например, "Thu, 21 Dec 2000 16:01:07 +0200" (введён в PHP 4.0.4) S - простой английский суффикс для дня (числа) месяца, 2 символа; т.е. "st", "nd", "rd" или "th" T - установка Timezone/Часовой пояс на данной машине; например, "EST" или "MDT" U - секунды эпохи Unix Epoch (начиная с January 1 1970 00:00:00 GMT) w - день недели, числовой, т.е. от "0" (Sunday) до "6" (Saturday) W - ISO-8601 номер недели в году, недели начинаются с понедельника/Monday (введено в PHP 4.1.0) Z - смещение часового пояса, в секундах (т.е. от "-43200" до "43200"). Смещение часовых поясов к западу от UTC всегда отрицательное, а для поясов в востоку от UTC - всегда положительное. */ default: if(*ln=='\\' && ln+1<to){ if(ret<rt) *ret=*(ln+1); ln++; ret++; } else{ if(ret<rt) *ret=*ln; ret++; } } } return ret-aret; }
VString PartLineOT(VString line, VString el){ // Get One, tvo part unsigned char *pos=line; if(!rtms(line.endu(), el, el, pos)){ return VString(); } return VString(pos+el.sz, line.endu()-pos-el.sz); }
VString PartLineIfO(VString line, VString el){ // Get One If found unsigned char *pos=line; if(!rtms(line.endu(), el, el, pos)){ return VString(); } return VString(line.uchar(), pos-line.uchar()); }
VString PartLineFind(VString line, VString el){ unsigned char *pos=line; if(!rtms(line.endu(), el, el, pos)){ return VString(); } return VString(pos, el); }
// PartLine VString PartLine(VString line, VString &two, VString el){ unsigned char *pos=line; if(!rtms(line.endu(), el, el, pos)){ two.Clean(); return line; } two.setu(pos+el.sz, line.endu()-pos-el.sz); return VString(line.uchar(), pos-line.uchar()); }