int64 ScanInt64(const char *ptr, const char **endptr, int base) { const char *s = ptr; bool minus = false; while(*s && *s <= ' ') s++; if(*s == '+' || *s == '-') minus = (*s++ == '-'); uint64 u = stou64(s, endptr, base); if(~u) return (minus ? -(int64)u : (int64)u); else return Null; }
void RichQtfParser::ReadObject() { Flush(); RichObject obj; if(*term == '#') { term++; #ifdef CPU_64 obj = *(RichObject *)stou64(term, &term); #else obj = *(RichObject *)stou(term, &term); #endif term++; } else { String type; while(IsAlNum(*term) || *term == '_') type.Cat(*term++); Size sz; Key(':'); sz.cx = ReadNumber(); bool keepratio = false; if(Key('&')) keepratio = true; else Key('*'); sz.cy = ReadNumber(); int yd = 0; if(Key('/')) yd = GetNumber(); while(*term && (byte)*term < 32) term++; String odata; if(Key('`')) while(*term) { if(*term == '`') { term++; if(*term == '`') odata.Cat('`'); else break; } else if((byte)*term >= 32) odata.Cat(*term); term++; } else if(Key('(')) { const char *b = term; while(*term && *term != ')') term++; odata = Base64Decode(b, term); if(*term == ')') term++; } else { StringBuffer data; for(;;) { while(*term < 32 && *term > 0) term++; if((byte)*term >= ' ' && (byte)*term <= 127 || *term == '\0') break; byte seven = *term++; for(int i = 0; i < 7; i++) { while((byte)*term < 32 && (byte)*term > 0) term++; if((byte)*term >= ' ' && (byte)*term <= 127 || *term == '\0') break; data.Cat((*term++ & 0x7f) | ((seven << 7) & 0x80)); seven >>= 1; } } odata = data; } obj.Read(type, odata, sz, context); obj.KeepRatio(keepratio); obj.SetYDelta(yd); } paragraph.Cat(obj, format); }