XML-Fast-0.17/000755 000766 000024 00000000000 13125303577 013122 5ustar00monsstaff000000 000000 XML-Fast-0.17/Changes000644 000766 000024 00000002324 13125303564 014412 0ustar00monsstaff000000 000000 Revision history for Perl extension XML::Fast. 0.17 2017-06-30 - Fix nasty bug with CCFLAGS 0.16 2017-06-27 - Fixes for RT tickets 0.15 2015-08-25 - Support emoji 0.14 2013-02-21 - Fix text: undef, attr: undef (useless attr, but worked wrong) 0.11 2010-12-17 - Fix decoding of " (was inserting \0 after ") 0.10 2010-12-01 - Add tests for broken xml's - Fix some error reporting 0.09_01 2010-11-20 - Make fixes for XML like '' (Thanks to Chad ) 0.09 2010-11-27 - Added license to META 0.08 2010-10-24 - One more SvRV checking fix 0.07 2010-10-15 - Fix dummy warning (again ;) 0.06 2010-10-15 - Fix autoclose for second level (like ) 0.05 2010-10-14 - Fix dummy warning 0.04 2010-10-14 - Tests - Replace index() with chrchr() - Use public allocation API (thanks to vovkasm) - Fix SvRV checking - Create static entity definitions 0.03 2010-07-22 Fix parsing of (was faulting) 0.02 2010-07-17 Just remove dummy depencency from test 0.01 Wed Jun 2 01:21:26 2010 - original version; created by h2xs 1.23 with options -A -n XML::Fast XML-Fast-0.17/entities.h000644 000766 000024 00000002101 13123552546 015111 0ustar00monsstaff000000 000000 typedef struct entityref entityref_t; struct entityref { unsigned char c; unsigned char *entity; unsigned int length; unsigned children; entityref_t *more; }; static entityref_t _e_001[1] = { { 'p', "&", 1, 0, NULL } }; static entityref_t _e_002[1] = { { 's', "'", 1, 0, NULL } }; static entityref_t _e_003[1] = { { 'o', NULL, 0, 1, _e_002 } }; static entityref_t _e_004[2] = { { 'm', NULL, 0, 1, _e_001 }, { 'p', NULL, 0, 1, _e_003 } }; static entityref_t _e_005[1] = { { 't', ">", 1, 0, NULL } }; static entityref_t _e_006[1] = { { 't', "<", 1, 0, NULL } }; static entityref_t _e_007[1] = { { 't', "\"", 1, 0, NULL } }; static entityref_t _e_008[1] = { { 'o', NULL, 0, 1, _e_007 } }; static entityref_t _e_009[1] = { { 'u', NULL, 0, 1, _e_008 } }; static entityref_t _e_010[4] = { { 'a', NULL, 0, 2, _e_004 }, { 'g', NULL, 0, 1, _e_005 }, { 'l', NULL, 0, 1, _e_006 }, { 'q', NULL, 0, 1, _e_009 } }; static entityref_t entities[1] = { { '*', NULL, 0, 4, _e_010 } }; XML-Fast-0.17/Fast.xs000644 000766 000024 00000104774 13125303564 014404 0ustar00monsstaff000000 000000 #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "ppport.h" #define XML_DEBUG 0 #define XML_DEVEL 0 #include "xmlfast.h" #if XML_DEBUG #define WHERESTR " at %s line %d.\n" #define WHEREARG __FILE__, __LINE__ #define debug(...) do{ fprintf(stderr, __VA_ARGS__); fprintf(stderr, WHERESTR, WHEREARG); } while(0) #else #define debug(...) #endif #include #include #include #include #ifndef ptr_t typedef void * ptr_t; #endif #ifndef PERL_ARGS_ASSERT_SV_RECODE_TO_UTF8 #define PERL_ARGS_ASSERT_SV_RECODE_TO_UTF8 #endif typedef struct { char *name; unsigned int len; char *fullname; unsigned int fulllen; } xml_node; /* commit 30866c9f74d890c45e8da27ea855468a314a59cf xmlbare 1785/s -- -19% xmlfast 2209/s 24% -- */ #define UTF8_BYTES 1 #define UTF8_UPGRADE 2 #define UTF8_DECODE 3 #define UTF8_EDECODE 4 #define EMIT_WARNS 0x0001 #define TAG_MATCH 0x0002 #define MODE_ORDER 0x1000 #define MODE_TRIM 0x2000 #define MODE_ARRAYS 0x4000 typedef struct { // config unsigned int flags; unsigned int bytes; unsigned int utf8; SV * attr; SV * text; SV * join; SV * cdata; SV * comm; HV * array; // state char *encoding; SV *encode; int depth; unsigned int chainsize; xml_node * chain; HV ** hchain; HV * hcurrent; //just a pointer SV * pi; SV * attrname; SV * textval; SV * error; parser_state * state; } parsestate; typedef struct { // config unsigned int flags; unsigned int bytes; unsigned int utf8; char * attr; STRLEN attl; char * text; char * join; char * cdata; char * comm; HV * array; // state char *encoding; SV *encode; unsigned int chainsize; xml_node * chain; HV ** hchain; HV * hcurrent; //just a pointer SV * pi; SV * attrname; SV * textval; SV * error; /// new I32 depth; I32 ix; SV * result; SV * nested; } compstate; // hv_store to array if already have non-array value #define hv_store_a( hv, key, sv ) \ STMT_START { \ SV **exists; \ char *kv = SvPV_nolen(key); \ int kl = SvCUR(key); \ if( exists = hv_fetch(hv, kv, kl, 0) ) { \ if ( SvROK(*exists) && SvTYPE( SvRV(*exists) ) == SVt_PVAV) { \ AV *av = (AV *) SvRV( *exists ); \ av_push( av, sv ); \ } \ else { \ AV *av = newAV(); \ if (SvROK(*exists)) { \ SvREFCNT_inc(*exists); \ av_push( av, *exists ); \ } else { \ SV *old = newSV(0); \ sv_copypv(old, *exists); \ av_push( av, old ); \ } \ av_push( av, sv ); \ (void) hv_store( hv, kv, kl, newRV_noinc( (SV *) av ), 0 ); \ } \ } else { \ (void) hv_store(hv, kv, kl, sv, 0); \ } \ } STMT_END // hv_store to array, create if not exists #define hv_store_aa( hv, key, sv ) \ STMT_START { \ SV **exists; \ char *kv = SvPV_nolen(key); \ int kl = SvCUR(key); \ if( ( exists = hv_fetch(hv, kv, kl, 0) ) && SvROK(*exists) && (SvTYPE( SvRV(*exists) ) == SVt_PVAV) ) { \ AV *av = (AV *) SvRV( *exists ); \ av_push( av, sv ); \ } \ else { \ AV *av = newAV(); \ av_push( av, sv ); \ (void) hv_store( hv, kv, kl, newRV_noinc( (SV *) av ), 0 ); \ } \ } STMT_END #define xml_sv_decode(ctx, sv) \ STMT_START { \ if (!ctx->bytes && !SvUTF8(sv)) {\ if (ctx->utf8 == UTF8_UPGRADE) { \ SvUTF8_on(sv); \ } \ else if (ctx->utf8 == UTF8_DECODE) { \ sv_utf8_decode(sv); \ } \ else if (ctx->encode) { \ (void) sv_recode_to_utf8(sv, ctx->encode); \ } \ }\ } STMT_END void on_bytes_charset_part(void * pctx, char * data, unsigned int length); void on_bytes_charset(void * pctx, char * data, unsigned int length); void on_tag_close(void * pctx, char * data, unsigned int length); static inline void my_warn(parsestate *ctx, char * format, ...) { //TODO: free all if(!(ctx->flags & EMIT_WARNS)) return; va_list va; va_start(va,format); SV *text = sv_2mortal(newSVpvn("",0)); sv_vcatpvf(text, format, &va); va_end(va); warn("%s",SvPV_nolen(text)); } static inline void DESTROY (parsestate *ctx) { if(ctx->encode) { SvREFCNT_dec(ctx->encode); ctx->encode = 0; } if(ctx->textval) { SvREFCNT_dec(ctx->textval); ctx->textval = 0; } if(ctx->pi) { SvREFCNT_dec(ctx->pi); ctx->pi = 0; } if(ctx->attrname) { SvREFCNT_dec(ctx->attrname); ctx->attrname = 0; } if(ctx->array) { SvREFCNT_dec(ctx->array); ctx->array = 0; } if(ctx->depth > -1) { //fprintf(stderr,"DESTROY Free depth %d\n",ctx->depth); int currdepth = ctx->depth; while(ctx->depth > -1) { //fprintf(stderr,"Free depth %d\n",ctx->depth); on_tag_close(ctx,ctx->chain->name,ctx->chain->len); if (currdepth == ctx->depth) { my_warn(ctx,"Recursion during autoclose tags. depth=%d\n",ctx->depth); break; } } } if (ctx->hchain) { Safefree(ctx->hchain); ctx->hchain = 0; } if (ctx->chain) { Safefree(ctx->chain); ctx->chain = 0; } } static inline void my_croak(parsestate *ctx, char * format, ...) { //TODO: free all DESTROY(ctx); va_list va; va_start(va,format); SV *text = sv_2mortal(newSVpvn("",0)); sv_vcatpvf(text, format, &va); va_end(va); croak("%s",SvPV_nolen(text)); } SV * find_encoding(char * encoding) { dSP; int count; //require_pv("Encode.pm"); ENTER; SAVETMPS; PUSHMARK(SP); XPUSHs(sv_2mortal(newSVpv(encoding, 0))); PUTBACK; count = call_pv("Encode::find_encoding",G_SCALAR); SPAGAIN; if (SvTRUE(ERRSV)) { warn("Shit happens: %s\n", SvPV_nolen(ERRSV)); (void) POPs; } if (count != 1) croak("find_encoding fault: bad number of returned values: %d",count); SV *encode = POPs; SvREFCNT_inc(encode); PUTBACK; FREETMPS; LEAVE; return encode; } SV * get_constant(char * name) { dSP; int count; //require_pv("Encode.pm"); ENTER; SAVETMPS; PUSHMARK(SP); PUTBACK; count = call_pv(name,G_SCALAR); SPAGAIN; if (count != 1) croak("Bad number of returned values: %d",count); SV *value = POPs; sv_dump(value); SvREFCNT_inc(value); PUTBACK; FREETMPS; LEAVE; return value; } SV * sv_recode_from_utf8(pTHX_ SV *sv, SV *encoding) { dVAR; PERL_ARGS_ASSERT_SV_RECODE_TO_UTF8; if (SvPOK(sv) && SvUTF8(sv) && SvROK(encoding)) { SV *bytes; dSP; ENTER; SAVETMPS; save_re_context(); PUSHMARK(sp); EXTEND(SP, 3); XPUSHs(encoding); XPUSHs(sv); XPUSHs(sv_2mortal(newSViv(4))); PUTBACK; call_method("encode", G_SCALAR); SPAGAIN; bytes = POPs; SvREFCNT_inc(bytes); PUTBACK; FREETMPS; LEAVE; return bytes; } return SvPOKp(sv) ? sv : NULL; } void on_comment(void * pctx, char * data,unsigned int length) { #if XML_DEVEL if (!pctx) croak("Context not passed to on_comment"); #endif parsestate *ctx = pctx; SV *sv = newSVpvn(data, length); hv_store_a(ctx->hcurrent, ctx->comm, sv ); } //TODO: Separate on_bytes/on_uchar for non-utf mode void on_pi_attr(parsestate *ctx) { //warn("pi attr '%-.*s'", SvCUR(ctx->attrname), SvPVX(ctx->attrname)); if ( (SvCUR(ctx->attrname) == 8) && (memcmp(SvPV_nolen(ctx->attrname), "encoding", 8) == 0 ) ) { ctx->encoding = (char *) SvPV_nolen(ctx->textval); //printf("Noticed encoding %s\n",ctx->encoding); if ( ( SvCUR(ctx->textval) == 5 ) && ( strncasecmp( ctx->encoding, "utf-8",5 ) == 0 ) ) { if (ctx->bytes) ctx->utf8 = UTF8_BYTES; //printf("Native utf-8 mode (%d)\n",ctx->utf8); } else { ctx->encode = find_encoding(ctx->encoding); ctx->utf8 = 0; if(ctx->text) { //printf("Switch text mode to charset\n"); ctx->state->cb.bytes = on_bytes_charset; ctx->state->cb.bytespart = on_bytes_charset_part; } } } else { //printf("PI %s, attr %s='%s'\n",SvPV_nolen(ctx->pi), SvPV_nolen(ctx->attrname),SvPV_nolen(ctx->textval) ); } sv_2mortal(ctx->attrname); sv_2mortal(ctx->textval); ctx->attrname = ctx->textval = 0; } static inline SV * mkchr(UV chr) { char *end, utf[UTF8_MAXBYTES + 1]; /* if (UTF8_IS_INVARIANT(chr)) { utf[0] = (char)chr; utf[1] = 0; return newSVpvn(utf,2); } */ SV *tmp; end = uvchr_to_utf8(utf, chr); *end = '\0'; tmp = newSVpvn(utf, end-utf); SvUTF8_on(tmp); return tmp; } void on_uchar(void * pctx, wchar_t chr) { #if XML_DEVEL if (!pctx) croak("Context not passed to on_text_part"); #endif parsestate *ctx = pctx; dTHX; if ( !( ctx->attrname || ctx->text ) ) return; if (!ctx->utf8 && ctx->bytes && !UTF8_IS_INVARIANT(chr) ) { if (!ctx->encode) my_croak(ctx,"Can't decode entities in non-utf8, bytes mode"); SV *tmp = mkchr(chr); SV *bytes = sv_recode_from_utf8(aTHX_ tmp, ctx->encode); if (SvCUR(bytes) == 0) { my_warn(ctx,"Can't recode U+%04d entity into %s in bytes mode", chr, ctx->encoding); if (ctx->textval) { sv_catpvn(ctx->textval,"?",1); } else { ctx->textval = newSVpvn("?",1); } sv_2mortal(tmp); sv_2mortal(bytes); return; } //printf("Created char %s / %s / bytes = %s\n",utf, SvPV_nolen(tmp),SvPV_nolen(bytes)); if (ctx->textval) { sv_catsv(ctx->textval,bytes); sv_2mortal(bytes); } else { ctx->textval = bytes; } return; } else { char *start, *end; STRLEN len = 0; if (ctx->textval) { len = SvCUR(ctx->textval); } else { ctx->textval = newSVpvn("",0); } sv_grow(ctx->textval, len + UTF8_MAXBYTES + 1 ); start = end = SvEND(ctx->textval); end = uvchr_to_utf8(start, chr);*end = '\0'; SvCUR_set(ctx->textval,len + end - start); } } void on_bytes_charset_part(void * pctx, char * data, unsigned int length) { #if XML_DEVEL if (!pctx) croak("Context not passed to on_bytes_charset_part"); #endif parsestate *ctx = pctx; if ( !( ctx->attrname || ctx->text ) ) return; if (!length) return; SV *tmp = newSVpvn(data, length); xml_sv_decode(ctx,tmp); if (ctx->textval) { sv_catsv(ctx->textval, tmp); sv_2mortal(tmp); } else { ctx->textval = tmp; } } void on_bytes_charset(void * pctx, char * data, unsigned int length) { #if XML_DEVEL if (!pctx) croak("Context not passed to on_bytes"); #endif parsestate *ctx = pctx; //if (!ctx->textval && !length) { // my_warn(ctx,"Called on_bytes with empty text and empty body"); //} if ( !( ctx->attrname || ctx->text ) ) return; SV *tmp = newSVpvn(data, length); xml_sv_decode(ctx,tmp); if (ctx->textval) { sv_catsv(ctx->textval, tmp); sv_2mortal(tmp); } else { ctx->textval = tmp; } if (ctx->attrname) { if (ctx->pi) { on_pi_attr(ctx); } else { hv_store_a(ctx->hcurrent, ctx->attrname, ctx->textval); } sv_2mortal(ctx->attrname); ctx->attrname = 0; ctx->textval = 0; } else { hv_store_a(ctx->hcurrent, ctx->text, ctx->textval); } ctx->textval = 0; } void on_bytes_part(void * pctx, char * data, unsigned int length) { #if XML_DEVEL if (!pctx) croak("Context not passed to on_bytes_part"); #endif parsestate *ctx = pctx; if ( !( ctx->attrname || ctx->text ) ) return; if (ctx->textval) { if (length > 0) { sv_catpvn(ctx->textval, data, length); } } else { ctx->textval = newSVpvn(data, length); } } void on_bytes(void * pctx, char * data, unsigned int length) { #if XML_DEVEL if (!pctx) croak("Context not passed to on_bytes"); #endif parsestate *ctx = pctx; //if (!ctx->textval && !length) { // my_warn(ctx,"Called on_bytes with empty text and empty body"); //} if ( !( ctx->attrname || ctx->text ) ) return; if (ctx->textval) { if (length > 0) { sv_catpvn(ctx->textval, data, length); } } else { ctx->textval = newSVpvn(data, length); } xml_sv_decode(ctx,ctx->textval); if (ctx->attrname) { if (ctx->pi) { on_pi_attr(ctx); } else { hv_store_a(ctx->hcurrent, ctx->attrname, ctx->textval); } sv_2mortal(ctx->attrname); ctx->attrname = 0; ctx->textval = 0; } else { //printf("text close, store %s\n",SvPV_nolen(ctx->textval)); hv_store_a(ctx->hcurrent, ctx->text, ctx->textval); } ctx->textval = 0; } void on_cdata(void * pctx, char * data,unsigned int length) { #if XML_DEVEL if (!pctx) croak("Context not passed to on_cdata"); #endif parsestate *ctx = pctx; SV *sv = newSVpvn(data, length); xml_sv_decode(ctx,sv); hv_store_a(ctx->hcurrent, ctx->cdata, sv ); } void on_pi_open(void * pctx, char * data, unsigned int length) { #if XML_DEVEL if (!pctx) croak("Context not passed to on_pi_open"); #endif parsestate *ctx = pctx; ctx->pi = newSVpvn(data,length); } void on_pi_close(void * pctx, char * data, unsigned int length) { #if XML_DEVEL if (!pctx) croak("Context not passed to on_pi_close"); #endif parsestate *ctx = pctx; sv_2mortal(ctx->pi); ctx->pi = 0; } void on_tag_open(void * pctx, char * data, unsigned int length) { #if XML_DEVEL if (!pctx) croak("Context not passed to on_tag_open"); #endif parsestate *ctx = pctx; if (ctx->textval) { xml_sv_decode(ctx,ctx->textval); hv_store_a(ctx->hcurrent, ctx->text, ctx->textval); ctx->textval = 0; } HV * hv = newHV(); ctx->depth++; if (ctx->depth >= ctx->chainsize) { warn("XML depth too high. Consider increasing `_max_depth' to at more than %d to avoid reallocations",ctx->chainsize); ctx->chainsize *= 2; Renew( ctx->hchain, ctx->chainsize, HV* ); Renew( ctx->chain, ctx->chainsize, xml_node); } ctx->chain[ctx->depth].len = length; ctx->chain[ctx->depth].name = data; if (ctx->flags & TAG_MATCH) { if (ctx->depth == 0) { ctx->chain[ctx->depth].fulllen = length + 1; Newx(ctx->chain[ctx->depth].fullname, ctx->chain[ctx->depth].fulllen + 1, char); ctx->chain[ctx->depth].fullname[0] = '/'; memcpy(ctx->chain[ctx->depth].fullname+1,data,length); ctx->chain[ctx->depth].fullname[length+1] = 0; //printf("Fullame = %s\n",ctx->chain[ctx->depth].fullname); } else { ctx->chain[ctx->depth].fulllen = ctx->chain[ctx->depth - 1].fulllen + length + 1; Newx(ctx->chain[ctx->depth].fullname, ctx->chain[ctx->depth].fulllen + 1, char); memcpy( ctx->chain[ctx->depth].fullname, ctx->chain[ctx->depth - 1].fullname, ctx->chain[ctx->depth - 1].fulllen ); ctx->chain[ctx->depth].fullname[ ctx->chain[ctx->depth - 1].fulllen ] = '/'; memcpy( ctx->chain[ctx->depth].fullname + ctx->chain[ctx->depth - 1].fulllen + 1, data, length ); ctx->chain[ctx->depth].fullname[ ctx->chain[ctx->depth].fulllen ] = 0; //printf("Fullame = %s\n",ctx->chain[ctx->depth].fullname); } } //printf("node name=%s, fullname=%s\n", SvPV_nolen(ctx->name[ ctx->depth ]),SvPV_nolen(fname)); ctx->hchain[ ctx->depth ] = ctx->hcurrent; ctx->hcurrent = hv; } void on_tag_close(void * pctx, char * data, unsigned int length) { #if XML_DEVEL if (!pctx) croak("Context not passed to on_tag_close"); #endif parsestate *ctx = pctx; SV *tag = sv_2mortal(newSVpvn(data,length)); SV **text; I32 keys = HvKEYS(ctx->hcurrent); SV *svtext = 0; if (ctx->textval) { xml_sv_decode(ctx,ctx->textval); hv_store_a(ctx->hcurrent, ctx->text, ctx->textval); ctx->textval = 0; } if (ctx->depth < 0) { my_warn(ctx,"Ignore unbalanced tag: closed upper than root"); return; } if ( (ctx->chain[ctx->depth].len != length) || (memcmp( ctx->chain[ctx->depth].name, data, length) != 0) ) { int close, depth = ctx->depth; my_warn(ctx,"Unbalanced close tag <%s> depth=%d\n", SvPV_nolen(tag),depth); // checkdepth is used to avoid infinite loops on errors with auto_closing int checkdepth = depth + 10; while (depth > -1 && checkdepth-- > 0) { if ( (ctx->chain[depth].len == length) && (memcmp( ctx->chain[depth].name, data, length) == 0)) { for (close = ctx->depth; close >= depth; close--) { my_warn(ctx,"Force tag close <%.*s> at depth %u", ctx->chain[close].len, ctx->chain[close].name, close); on_tag_close(pctx, ctx->chain[close].name, (STRLEN)ctx->chain[close].len); } depth = -1; break; } depth--; } if (depth != -1) { my_warn(ctx,"Found no open tag for %s. Ignored", SvPV_nolen(tag)); } return; } // Text joining if (ctx->text) { // we may have stored text node text = hv_fetch(ctx->hcurrent, SvPV_nolen(ctx->text), SvCUR(ctx->text), 0); if (text && SvOK(*text)) { if (SvROK(*text) && SvTYPE( SvRV(*text) ) == SVt_PVAV) { AV *av = (AV *) SvRV( *text ); SV **val; I32 len = 0, avlen = av_len(av) + 1; if (ctx->join) { svtext = newSVpvn("",0); if (SvCUR(ctx->join)) { //printf("Join length = %d, avlen=%d\n",SvCUR(*join),avlen); for ( len = 0; len < avlen; len++ ) { if( ( val = av_fetch(av,len,0) ) && SvOK(*val) ) { //printf("Join %s with '%s'\n",SvPV_nolen(*val), SvPV_nolen(ctx->join)); if(len > 0) { sv_catsv(svtext,ctx->join); } //printf("Join %s with '%s'\n",SvPV_nolen(*val), SvPV_nolen(ctx->join)); sv_catsv(svtext,*val); } } } else { //printf("Optimized join loop\n"); for ( len = 0; len < avlen; len++ ) { if( ( val = av_fetch(av,len,0) ) && SvOK(*val) ) { //printf("Join %s with ''\n",SvPV_nolen(*val)); sv_catsv(svtext,*val); } } } //printf("Joined: to %s => '%s'\n",SvPV_nolen(ctx->text),SvPV_nolen(svtext)); SvREFCNT_inc(svtext); (void) hv_store(ctx->hcurrent, SvPV_nolen(ctx->text), SvCUR(ctx->text), svtext, 0); } else // currently unreachable, since if we have single element, it is stored as SV value, not AV //if ( avlen == 1 ) { // Perl_warn("# AVlen=1\n"); // /* works // svtext = newSVpvn("",0); // val = av_fetch(av,0,0); // if (val && SvOK(*val)) { // //svtext = *val; // //SvREFCNT_inc(svtext); // sv_catsv(svtext,*val); // } // */ // val = av_fetch(av,0,0); // if (val) { // svtext = *val; // SvREFCNT_inc(svtext); // hv_store(ctx->hcurrent, SvPV_nolen(ctx->text), SvCUR(ctx->text), svtext, 0); // } //} //else { // Remebmer for use if it is single //warn("# No join\n"); svtext = newRV( (SV *) av ); } } else { svtext = *text; SvREFCNT_inc(svtext); } } } //printf("svtext=(0x%lx) '%s'\n", svtext, svtext ? SvPV_nolen(svtext) : ""); // Text joining if (ctx->depth > -1) { HV *hv = ctx->hcurrent; ctx->hcurrent = ctx->hchain[ ctx->depth ]; ctx->hchain[ ctx->depth ] = (HV *)NULL; ctx->depth--; if (keys == 0) { //printf("Tag %s have no keys\n", SvPV_nolen(tag)); SvREFCNT_dec(hv); SV *sv = newSVpvn("",0); if (ctx->flags & MODE_ARRAYS) { hv_store_aa(ctx->hcurrent, tag, sv); } else if (ctx->array && (hv_exists(ctx->array, data,length ) )) { hv_store_aa(ctx->hcurrent, tag, sv); } else { hv_store_a(ctx->hcurrent, tag, sv); } } else if (keys == 1 && svtext) { //SV *sx = newSVpvn(data, length);sv_2mortal(sx); //printf("Hash in tag '%s' for destruction have refcnt = %d (%lx | %lx)\n",SvPV_nolen(sx),SvREFCNT(hv), hv, ctx->hcurrent); SvREFCNT_inc(svtext); SvREFCNT_dec(hv); //hv_store(ctx->hcurrent, data, length, svtext, 0); if (ctx->flags & MODE_ARRAYS) { //printf("Cast %s as array (all should be)\n",SvPV_nolen(tag)); hv_store_aa(ctx->hcurrent, tag, svtext); } else if (ctx->array && (hv_exists(ctx->array, data,length ) )) { //printf("Cast %s as array\n",SvPV_nolen(tag)); hv_store_aa(ctx->hcurrent, tag, svtext); } else { hv_store_a(ctx->hcurrent, tag, svtext); } } else { SV *sv = newRV_noinc( (SV *) hv ); //printf("Store hash into RV '%lx'\n",sv); //hv_store(ctx->hcurrent, data, length, sv, 0); //printf("Check %s to be array\n",SvPV_nolen(tag)); if (ctx->flags & MODE_ARRAYS) { //printf("Cast %s as array (all should be)\n",SvPV_nolen(tag)); hv_store_aa(ctx->hcurrent, tag, sv); } else if (ctx->array && ( hv_exists(ctx->array, data,length ) )) { //printf("Cast %s as array\n",SvPV_nolen(tag)); hv_store_aa(ctx->hcurrent, tag, sv); } else { hv_store_a(ctx->hcurrent, tag, sv); } } if (svtext) SvREFCNT_dec(svtext); } else { my_croak(ctx,"Bad depth: %d for tag close %s\n",ctx->depth,SvPV_nolen(tag)); } } void on_attr_name(void * pctx, char * data,unsigned int length) { #if XML_DEVEL if (!pctx) croak("Context not passed to on_attr_name"); #endif parsestate *ctx = pctx; if (ctx->textval) { my_croak(ctx,"Have textval=%s, while called attrname\n",SvPV_nolen(ctx->textval)); } //warn("Called attrname on %s '%-.*s'=",ctx->pi ? "pi" : "common", length,data); if (ctx->attrname) { my_croak(ctx,"Called attrname '%-.*s'=, while have attrname='%-.*s'\n",length,data,SvCUR(ctx->attrname),SvPVX(ctx->attrname)); } if (ctx->pi) { ctx->attrname = newSVpvn(data,length); } else { if( ctx->attr ) { //warn("What TF is attr??"); attr prefix ctx->attrname = newSV(length + SvCUR(ctx->attr)); sv_copypv(ctx->attrname, ctx->attr); sv_catpvn(ctx->attrname, data, length); } else { ctx->attrname = newSVpvn(data, length); } } } void on_warn(void * pctx, char * format, ...) { #if XML_DEVEL if (!pctx) croak("Context not passed to on_warn"); #endif //parsestate *ctx = pctx; //if(!(ctx->flags & EMIT_WARNS)) return; va_list va; va_start(va,format); SV *text = sv_2mortal(newSVpvn("",0)); sv_vcatpvf(text, format, &va); warn("%s",SvPV_nolen(text)); va_end(va); } void on_die(void * pctx, char * format, ...) { #if XML_DEVEL if (!pctx) croak("Context not passed to on_die"); #endif parsestate *ctx = pctx; va_list va; va_start(va,format); ctx->error = sv_2mortal(newSVpvn("",0)); sv_vcatpvf(ctx->error, format, &va); //warn("got a die with %s",SvPV_nolen(ctx->error)); va_end(va); } /* #define newRVHV() newRV_noinc((SV *)newHV()) #define rv_hv_store(rv,key,len,sv,f) hv_store((HV*)SvRV(rv), key,len,sv,f) #define rv_hv_fetch(rv,key,len,f) hv_fetch((HV*)SvRV(rv), key,len,f) */ /* void _test() CODE: SV *sv1 = newRVHV(); SV *sv2 = newRVHV(); sv_2mortal(sv1); sv_2mortal(sv2); SV *test = newSVpvn("test",4); rv_hv_store(sv1, "test",4,test,0); SvREFCNT_inc(test); rv_hv_store(sv2, "test",4,test,0); */ #ifndef HePV_nolen #define HePV_nolen(he) ((HeKLEN(he) == HEf_SVKEY) ? \ SvPV_nolen(HeKEY_sv(he)) : \ (HeKEY(he))) #endif //#define strcmp(a,b) ( a && b ? strcmp(a,b) : fprintf(stderr, "Failed to compare %s with %s at %s line %d.\n", a,b,__FILE__,__LINE__)+2 ) #define mystrcmp(a,b) ( a && b ? strcmp(a,b) : 2 ) void h2xout( char *data, compstate *p ) { printf( "%*s", p->depth * 4,"" ); printf( "%s\n", data ); } void h2xoute( char *data, compstate *p ) { printf( "%*s", p->depth * 4,"" ); printf("e(%s)\n", data); } void h2xp( compstate *p, char *f, ... ) { va_list va_args; /* printf( "%*s", p->depth * 4,"" ); va_start(va_args,f); vfprintf(stdout, f, va_args); va_end(va_args); */ va_start(va_args,f); sv_vcatpvf( p->result, f, &va_args ); va_end(va_args); //printf ("\n"); } void h2xpe( compstate *p, char *s ) { char *b = s; while (1) { switch (*s) { warn("%c", *s); case 0: if (b < s) sv_catpvf( p->result, "%-.*s", (int)(s - b), b ); return; case '<': if (b < s) sv_catpvf( p->result, "%-.*s", (int)(s - b), b ); sv_catpvf( p->result, "%s", "<" ); b = s+1; break; case '>': if (b < s) sv_catpvf( p->result, "%-.*s", (int)(s - b), b ); sv_catpvf( p->result, "%s", ">" ); b = s+1; break; case '"': if (b < s) sv_catpvf( p->result, "%-.*s", (int)(s - b), b ); sv_catpvf( p->result, "%s", """ ); b = s+1; break; case '\'': if (b < s) sv_catpvf( p->result, "%-.*s", (int)(s - b), b ); sv_catpvf( p->result, "%s", "'" ); b = s+1; break; case '&': if (b < s) sv_catpvf( p->result, "%-.*s", (int)(s - b), b ); sv_catpvf( p->result, "%s", "&" ); b = s+1; break; default: break; } s++; } } void kv2x ( char *key, SV *val, compstate *p ); void kv2x ( char *key, SV *val, compstate *p ) { char closed; HE* ent; char *nkey; STRLEN i, nlen; AV *av; SV **avv; debug("key=%s, val=%s",key, SvPV_nolen(val)); if ( mystrcmp( key, p->text ) == 0 ) { h2xpe(p, SvPV_nolen( val )); } else if ( mystrcmp( key, p->cdata ) == 0 ) { h2xp(p, ""); } else if ( p->comm && mystrcmp( key, p->comm) == 0 ) { debug("comm: %s", SvPV_nolen( val )); h2xp(p, ""); } else { if (SvROK( val )) { switch ( SvTYPE( SvRV( val ) ) ) { case SVt_PVHV: debug("%s -> hash inside", key); (void) hv_iterinit( (HV *) SvRV( val ) ); h2xp(p, "<%s", key); closed = 0; while ((ent = hv_iternext( (HV *) SvRV( val ) ))) { nkey = HePV(ent, nlen); if ( strncmp( nkey, p->attr, p->attl ) == 0 ) { nkey += p->attl; h2xp(p, " %s=\"",nkey); h2xpe(p, SvPV_nolen(HeVAL(ent))); h2xp(p, "\""); continue; } } (void) hv_iterinit( (HV *) SvRV( val ) ); while ((ent = hv_iternext( (HV *) SvRV( val ) ))) { nkey = HePV(ent, nlen); if ( strncmp( nkey, p->attr, p->attl ) == 0 ) { continue; } debug("Nested %s->%s", nkey, SvPV_nolen(HeVAL(ent))); if (!closed) { closed = 1; h2xp(p,">"); } p->depth++; kv2x( nkey, HeVAL(ent), p ); p->depth--; } if (!closed) { h2xp(p, "/>"); } else { h2xp(p, "",key); } break; case SVt_PVAV: debug("array inside (Multinode)"); av = (AV *) SvRV( val ); nlen = av_len(av) + 1; for ( i = 0; i < nlen; i++ ) { if( ( avv = av_fetch(av,i,0) ) && SvOK(*avv) ) { kv2x( key, *avv, p ); /* //printf("AV.V: %s\n",SvPV_nolen(*avv)); if (closed) { h2xp(p, "<%s", key); closed = 0; } if (SvROK( *avv )) { switch( SvTYPE( SvRV(*avv) ) ) { case SVt_PVHV: //debug ("hv inside av"); (void) hv_iterinit( (HV *) SvRV( *avv ) ); while ((ent = hv_iternext( (HV *) SvRV( *avv ) ))) { nkey = HePV_nolen(ent); if ( strncmp( nkey, p->attr, p->attl ) == 0 ) { nkey += p->attl; h2xp(p, " %s='%s'",nkey, SvPV_nolen(HeVAL(ent))); continue; } } break; case SVt_PVAV: //Ignore attrs from AV in AV //debug ("av inside av"); // Prohibited break; default: debug("Unhandled svtype: %s", SvPV_nolen( *avv )); } } else { } h2xp(p, "", key); closed = 1; */ } } /* debug("array inside. loop 2"); for ( i = 0; i < nlen; i++ ) { if( ( avv = av_fetch(av,i,0) ) && SvOK(*avv) ) { if (SvROK( *avv )) { switch( SvTYPE( SvRV(*avv) ) ) { case SVt_PVHV: (void) hv_iterinit( (HV *) SvRV( *avv ) ); while ((ent = hv_iternext( (HV *) SvRV( *avv ) ))) { nkey = HePV_nolen(ent); if ( strncmp( nkey, p->attr, p->attl ) == 0 ) { continue; } // debug("Nested %s->%s", nkey, SvPV_nolen(HeVAL(ent))); if (!closed) { closed = 1; h2xp(p,">"); } p->depth++; kv2x( nkey, HeVAL(ent), p ); p->depth--; } break; case SVt_PVAV: //AV in AV debug("Array within Array is useless and not supported. Ignoring"); break; default: debug("Unhandled svtype: %s", SvPV_nolen( *avv )); } } else { } } } */ break; default: warn("Bad reference found: %s", SvPV_nolen( SvRV(val) )); break; } } else { if (SvOK(val) && SvCUR(val)) { h2xp(p, "<%s>", key); h2xpe(p, SvPV_nolen(val)); h2xp(p, "", key); } else { h2xp(p, "<%s/>",key); } } } } void h2x ( SV *x, compstate *p ); void h2x ( SV *x, compstate *p ) { HE* ent; SV *val; char *key; STRLEN klen; if (SvROK (x)) { switch( SvTYPE( SvRV(x) ) ) { case SVt_PVHV: (void) hv_iterinit( (HV *) SvRV( x ) ); while ((ent = hv_iternext( (HV *) SvRV( x ) ))) { key = HePV(ent, klen); val = HeVAL(ent); if ( strncmp( key, p->attr, strlen(p->attr) ) == 0 ) { debug("Attribute %s at this level is prohibited", key); continue; } kv2x( key, val, p ); } break; default: warn("skip %s", SvPV_nolen( SvRV(x) )); } } else { warn("skip nonref"); } } MODULE = XML::Fast PACKAGE = XML::Fast void _test() CODE: dTHX; SV * cons = get_constant("Encode::FB_QUIET"); SV * test = newSViv(4); sv_dump(test); printf("Got constant %s\n", SvPV_nolen(cons)); //UV chr = 0x2622; UV chr = 0xAB; char *end, utf[UTF8_MAXBYTES + 1]; SV *encode = find_encoding("windows-1251"); end = uvchr_to_utf8(utf, chr); *end = '\0'; SV *tmp = sv_2mortal(newSVpvn(utf, end-utf)); SvUTF8_on(tmp); SV *bytes = sv_recode_from_utf8(aTHX_ tmp, encode); sv_dump(bytes); printf("Created char %s / %s / bytes = %s\n", utf, SvPV_nolen(tmp), SvPV_nolen(bytes)); //sv_recode_to_utf8(tmp, encode); //printf("Recoded %s\n",SvPV_nolen(tmp)); croak("Force exit"); void _xml2hash(xml_sv,conf) SV *xml_sv; HV *conf; PROTOTYPE: $$ PPCODE: SvGETMAGIC(xml_sv); char *xml = SvPVbyte_nolen(xml_sv); SV * RV; parser_state state; memset(&state,0,sizeof(state)); parsestate ctx; memset(&ctx,0,sizeof(parsestate)); state.ctx = &ctx; ctx.state = &state; SV **key; if ((key = hv_fetch(conf, "order", 5, 0)) && SvTRUE(*key)) { ctx.flags |= MODE_ORDER; } if ((key = hv_fetch(conf, "trim", 4, 0)) && SvTRUE(*key)) { ctx.flags |= MODE_TRIM; } if ((key = hv_fetch(conf, "bytes", 5, 0)) && SvTRUE(*key)) { ctx.bytes = 1; } else { if ((key = hv_fetch(conf, "utf8decode", 10, 0)) && SvTRUE(*key)) { ctx.utf8 = UTF8_DECODE; } else { ctx.utf8 = UTF8_UPGRADE; } } if ((key = hv_fetch(conf, "attr", 4, 0))) { if (SvOK(*key) && SvCUR(*key) > 0 ) { // defined and length ctx.attr = *key; } } if ((key = hv_fetch(conf, "text", 4, 0)) && SvOK(*key)) { ctx.text = *key; } if ((key = hv_fetch(conf, "join", 4, 0)) && SvPOK(*key)) { ctx.join = *key; } if ((key = hv_fetch(conf, "cdata", 5, 0)) && SvPOK(*key)) { ctx.cdata = *key; } if ((key = hv_fetch(conf, "comm", 4, 0)) && SvPOK(*key)) { ctx.comm = *key; } if ((key = hv_fetch(conf, "array", 5, 0)) && SvOK(*key)) { if (SvROK(*key) && SvTYPE( SvRV(*key) ) == SVt_PVAV) { AV *av = (AV *) SvRV( *key ); ctx.array = newHV(); I32 len = 0, avlen = av_len(av) + 1; SV **val; for ( len = 0; len < avlen; len++ ) { if( ( val = av_fetch(av,len,0) ) && SvOK(*val) ) { if(SvPOK(*val)) { (void) hv_store( ctx.array, SvPV_nolen(*val), SvCUR(*val), newSV(0), 0 ); } else { my_croak(&ctx,"Bad enrty in array entry: %s",SvPV_nolen(*val)); } } } } else if (!SvROK(*key)) { //printf("Remember all should be arrays\n"); if (SvTRUE(*key)) { ctx.flags |= MODE_ARRAYS; } } else { my_croak(&ctx,"Bad entry in array: %s",SvPV_nolen(*key)); } } //ctx.flags |= TAG_MATCH; if ((key = hv_fetch(conf, "_max_depth", 10, 0)) && SvOK(*key)) { ctx.chainsize = SvIV(*key); if (ctx.chainsize < 1) { my_croak(&ctx,"_max_depth contains bad value (%d)",ctx.chainsize); } } else { ctx.chainsize = 256; } if (!ctx.bytes) { ctx.encoding = "utf8"; } if (ctx.flags & MODE_ORDER) { my_croak(&ctx,"Ordered mode not implemented yet\n"); } else{ ctx.hcurrent = newHV(); Newx(ctx.chain, ctx.chainsize, xml_node); Newx(ctx.hchain, ctx.chainsize, HV*); ctx.depth = -1; RV = sv_2mortal(newRV_noinc( (SV *) ctx.hcurrent )); state.cb.piopen = on_pi_open; state.cb.piclose = on_pi_close; state.cb.tagopen = on_tag_open; state.cb.tagclose = on_tag_close; state.cb.attrname = on_attr_name; if ((key = hv_fetch(conf, "nowarn", 6, 0)) && SvTRUE(*key)) { // } else { state.cb.warn = on_warn; ctx.flags |= EMIT_WARNS; } state.cb.die = on_die; if(ctx.comm) state.cb.comment = on_comment; if(ctx.cdata) state.cb.cdata = on_cdata; else if(ctx.text) state.cb.cdata = on_bytes; state.cb.bytes = on_bytes; state.cb.bytespart = on_bytes_part; state.cb.uchar = on_uchar; if (!(ctx.flags & MODE_TRIM)) state.save_wsp = 1; } parse(xml,&state); if (ctx.depth > -1 && !ctx.error) { ctx.error = sv_2mortal(newSVpv("Unbalanced tags",0)); } DESTROY(&ctx); if (ctx.error) { croak("%s", SvPV_nolen(ctx.error)); } ST(0) = RV; XSRETURN(1); void _hash2xml(hash,conf) SV *hash; HV *conf; PROTOTYPE: $$ PPCODE: compstate ctx; memset(&ctx,0,sizeof(parsestate)); SV **key; if ((key = hv_fetch(conf, "order", 5, 0)) && SvTRUE(*key)) { ctx.flags |= MODE_ORDER; } if ((key = hv_fetch(conf, "trim", 4, 0)) && SvTRUE(*key)) { ctx.flags |= MODE_TRIM; } /* if ((key = hv_fetch(conf, "bytes", 5, 0)) && SvTRUE(*key)) { ctx.bytes = 1; } else { if ((key = hv_fetch(conf, "utf8decode", 10, 0)) && SvTRUE(*key)) { ctx.utf8 = UTF8_DECODE; } else { ctx.utf8 = UTF8_UPGRADE; } } */ if ((key = hv_fetch(conf, "attr", 4, 0)) && SvPOK(*key)) { ctx.attr = SvPV_nolen(*key); // warn ("Set attr to '%s'", ctx.attr); } else { ctx.attr = "-"; } if ((key = hv_fetch(conf, "text", 4, 0)) && SvPOK(*key)) { ctx.text = SvPV_nolen(*key); } else { ctx.text = "#text"; } if ((key = hv_fetch(conf, "cdata", 5, 0)) && SvPOK(*key)) { ctx.cdata = SvPV_nolen(*key); } else { ctx.cdata = 0; } if ((key = hv_fetch(conf, "comm", 4, 0)) && SvPOK(*key)) { ctx.comm = SvPV_nolen(*key); } else { ctx.comm = 0; } /* if ((key = hv_fetch(conf, "array", 5, 0)) && SvOK(*key)) { if (SvROK(*key) && SvTYPE( SvRV(*key) ) == SVt_PVAV) { AV *av = (AV *) SvRV( *key ); ctx.array = newHV(); I32 len = 0, avlen = av_len(av) + 1; SV **val; for ( len = 0; len < avlen; len++ ) { if( ( val = av_fetch(av,len,0) ) && SvOK(*val) ) { if(SvPOK(*val)) { (void) hv_store( ctx.array, SvPV_nolen(*val), SvCUR(*val), newSV(0), 0 ); } else { //my_croak(&ctx,"Bad enrty in array entry: %s",SvPV_nolen(*val)); } } } } else if (!SvROK(*key)) { //printf("Remember all should be arrays\n"); if (SvTRUE(*key)) { ctx.flags |= MODE_ARRAYS; } } else { //my_croak(&ctx,"Bad entry in array: %s",SvPV_nolen(*key)); } } //ctx.flags |= TAG_MATCH; if (!ctx.bytes) { ctx.encoding = "utf8"; } */ ctx.depth = 0; ctx.ix = 0; ctx.result = sv_2mortal(newSVpv("",0)); //ctx.nested = newSVpv("",0); ctx.attl = strlen(ctx.attr); SvGROW(ctx.result,1024); //SvGROW(ctx.nested,1024); h2x( hash, &ctx); //croak("XXX: %s", SvPV_nolen(ctx.result)); if (ctx.error) { croak("%s", SvPV_nolen(ctx.error)); } ST(0) = ctx.result; XSRETURN(1); XML-Fast-0.17/lib/000755 000766 000024 00000000000 13125303577 013670 5ustar00monsstaff000000 000000 XML-Fast-0.17/LICENSE000644 000766 000024 00000000252 13123552546 014126 0ustar00monsstaff000000 000000 LICENSE This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. Copyright 2009 Mons Anderson, all rights reserved. XML-Fast-0.17/Makefile.PL000644 000766 000024 00000001652 13125303564 015074 0ustar00monsstaff000000 000000 use 5.008008; use ExtUtils::MakeMaker; use Config; our $AUTHOR = -e '.gitignore'; our $CCFLAGS = $Config::Config{ccflags}; $CCFLAGS .= ' -std=c99' unless $CCFLAGS =~ /\Q-std=c99\E/; if ($AUTHOR) { system( 'pod2text lib/XML/Fast.pm > README' ) and die "$!"; $CCFLAGS .= ' -Wunused'; } else { $CCFLAGS .= ' -Wno-parentheses -Wno-pointer-sign'; } WriteMakefile( NAME => 'XML::Fast', VERSION_FROM => 'lib/XML/Fast.pm', # finds $VERSION ABSTRACT_FROM => 'lib/XML/Fast.pm', # retrieve abstract from module PREREQ_PM => { 'Encode' => 0 }, # e.g., Module::Name => 1.1 AUTHOR => 'Mons Anderson ', LIBS => [''], DEFINE => '', INC => '-I.', CCFLAGS => $CCFLAGS, OPTIMIZE => ($AUTHOR ? '-g ' : '').'-O2', OBJECT => 'Fast.o xmlfast.o', # link all the C files too META_ADD => { license => 'perl' }, ); XML-Fast-0.17/MANIFEST000644 000766 000024 00000000751 13125303600 014241 0ustar00monsstaff000000 000000 Changes entities.h Fast.xs lib/XML/Fast.pm LICENSE Makefile.PL MANIFEST MANIFEST.SKIP ppport.h README t/00-load.t t/01-conv.t t/02-doctype.t t/03-reports.t t/04-badxml.t t/05-wrongs.t t/badxml/01.xml t/badxml/02.xml t/reports/01.xml t/reports/02.xml t/reports/03.xml t/reports/04.xml t/reports/05.xml xmlfast.c xmlfast.h META.yml Module YAML meta-data (added by MakeMaker) META.json Module JSON meta-data (added by MakeMaker) XML-Fast-0.17/MANIFEST.SKIP000644 000766 000024 00000001024 13123552546 015015 0ustar00monsstaff000000 000000 # Avoid version control files. \B\.git\b ^\.gitignore$ # Avoid Makemaker generated and utility files. \bMANIFEST\.bak \bMakefile$ \bblib/ \bMakeMaker-\d \bpm_to_blib\.ts$ \bpm_to_blib$ \bblibdirs\.ts$ # 6.18 through 6.25 generated this # Avoid Module::Build generated and utility files. \bBuild$ \b_build/ # Avoid temp and backup files. ~$ \.old$ \#$ \b\.# \.bak$ \.o$ \.bs$ ^Fast\.c$ # Avoid Devel::Cover files. \bcover_db\b # Avoid local testing/dist files ^dist/ ^makeall\.sh$ ^tmp/ ^XML-Fast-.* ^run\.pl$ ^\w+\.pl$XML-Fast-0.17/META.json000644 000766 000024 00000001652 13125303577 014547 0ustar00monsstaff000000 000000 { "abstract" : "Simple and very fast XML - hash conversion", "author" : [ "Mons Anderson " ], "dynamic_config" : 1, "generated_by" : "ExtUtils::MakeMaker version 6.66, CPAN::Meta::Converter version 2.150010", "license" : [ "perl_5" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : "2" }, "name" : "XML-Fast", "no_index" : { "directory" : [ "t", "inc" ] }, "prereqs" : { "build" : { "requires" : { "ExtUtils::MakeMaker" : "0" } }, "configure" : { "requires" : { "ExtUtils::MakeMaker" : "0" } }, "runtime" : { "requires" : { "Encode" : "0" } } }, "release_status" : "stable", "version" : "0.17", "x_serialization_backend" : "JSON::PP version 2.27400" } XML-Fast-0.17/META.yml000644 000766 000024 00000001057 13125303577 014376 0ustar00monsstaff000000 000000 --- abstract: 'Simple and very fast XML - hash conversion' author: - 'Mons Anderson ' build_requires: ExtUtils::MakeMaker: '0' configure_requires: ExtUtils::MakeMaker: '0' dynamic_config: 1 generated_by: 'ExtUtils::MakeMaker version 6.66, CPAN::Meta::Converter version 2.150010' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: '1.4' name: XML-Fast no_index: directory: - t - inc requires: Encode: '0' version: '0.17' x_serialization_backend: 'CPAN::Meta::YAML version 0.018' XML-Fast-0.17/ppport.h000644 000766 000024 00000525406 13123552546 014633 0ustar00monsstaff000000 000000 #if 0 <<'SKIP'; #endif /* ---------------------------------------------------------------------- ppport.h -- Perl/Pollution/Portability Version 3.19 Automatically created by Devel::PPPort running under perl 5.012000. Do NOT edit this file directly! -- Edit PPPort_pm.PL and the includes in parts/inc/ instead. Use 'perldoc ppport.h' to view the documentation below. ---------------------------------------------------------------------- SKIP =pod =head1 NAME ppport.h - Perl/Pollution/Portability version 3.19 =head1 SYNOPSIS perl ppport.h [options] [source files] Searches current directory for files if no [source files] are given --help show short help --version show version --patch=file write one patch file with changes --copy=suffix write changed copies with suffix --diff=program use diff program and options --compat-version=version provide compatibility with Perl version --cplusplus accept C++ comments --quiet don't output anything except fatal errors --nodiag don't show diagnostics --nohints don't show hints --nochanges don't suggest changes --nofilter don't filter input files --strip strip all script and doc functionality from ppport.h --list-provided list provided API --list-unsupported list unsupported API --api-info=name show Perl API portability information =head1 COMPATIBILITY This version of F is designed to support operation with Perl installations back to 5.003, and has been tested up to 5.10.0. =head1 OPTIONS =head2 --help Display a brief usage summary. =head2 --version Display the version of F. =head2 --patch=I If this option is given, a single patch file will be created if any changes are suggested. This requires a working diff program to be installed on your system. =head2 --copy=I If this option is given, a copy of each file will be saved with the given suffix that contains the suggested changes. This does not require any external programs. Note that this does not automagially add a dot between the original filename and the suffix. If you want the dot, you have to include it in the option argument. If neither C<--patch> or C<--copy> are given, the default is to simply print the diffs for each file. This requires either C or a C program to be installed. =head2 --diff=I Manually set the diff program and options to use. The default is to use C, when installed, and output unified context diffs. =head2 --compat-version=I Tell F to check for compatibility with the given Perl version. The default is to check for compatibility with Perl version 5.003. You can use this option to reduce the output of F if you intend to be backward compatible only down to a certain Perl version. =head2 --cplusplus Usually, F will detect C++ style comments and replace them with C style comments for portability reasons. Using this option instructs F to leave C++ comments untouched. =head2 --quiet Be quiet. Don't print anything except fatal errors. =head2 --nodiag Don't output any diagnostic messages. Only portability alerts will be printed. =head2 --nohints Don't output any hints. Hints often contain useful portability notes. Warnings will still be displayed. =head2 --nochanges Don't suggest any changes. Only give diagnostic output and hints unless these are also deactivated. =head2 --nofilter Don't filter the list of input files. By default, files not looking like source code (i.e. not *.xs, *.c, *.cc, *.cpp or *.h) are skipped. =head2 --strip Strip all script and documentation functionality from F. This reduces the size of F dramatically and may be useful if you want to include F in smaller modules without increasing their distribution size too much. The stripped F will have a C<--unstrip> option that allows you to undo the stripping, but only if an appropriate C module is installed. =head2 --list-provided Lists the API elements for which compatibility is provided by F. Also lists if it must be explicitly requested, if it has dependencies, and if there are hints or warnings for it. =head2 --list-unsupported Lists the API elements that are known not to be supported by F and below which version of Perl they probably won't be available or work. =head2 --api-info=I Show portability information for API elements matching I. If I is surrounded by slashes, it is interpreted as a regular expression. =head1 DESCRIPTION In order for a Perl extension (XS) module to be as portable as possible across differing versions of Perl itself, certain steps need to be taken. =over 4 =item * Including this header is the first major one. This alone will give you access to a large part of the Perl API that hasn't been available in earlier Perl releases. Use perl ppport.h --list-provided to see which API elements are provided by ppport.h. =item * You should avoid using deprecated parts of the API. For example, using global Perl variables without the C prefix is deprecated. Also, some API functions used to have a C prefix. Using this form is also deprecated. You can safely use the supported API, as F will provide wrappers for older Perl versions. =item * If you use one of a few functions or variables that were not present in earlier versions of Perl, and that can't be provided using a macro, you have to explicitly request support for these functions by adding one or more C<#define>s in your source code before the inclusion of F. These functions or variables will be marked C in the list shown by C<--list-provided>. Depending on whether you module has a single or multiple files that use such functions or variables, you want either C or global variants. For a C function or variable (used only in a single source file), use: #define NEED_function #define NEED_variable For a global function or variable (used in multiple source files), use: #define NEED_function_GLOBAL #define NEED_variable_GLOBAL Note that you mustn't have more than one global request for the same function or variable in your project. Function / Variable Static Request Global Request ----------------------------------------------------------------------------------------- PL_parser NEED_PL_parser NEED_PL_parser_GLOBAL PL_signals NEED_PL_signals NEED_PL_signals_GLOBAL eval_pv() NEED_eval_pv NEED_eval_pv_GLOBAL grok_bin() NEED_grok_bin NEED_grok_bin_GLOBAL grok_hex() NEED_grok_hex NEED_grok_hex_GLOBAL grok_number() NEED_grok_number NEED_grok_number_GLOBAL grok_numeric_radix() NEED_grok_numeric_radix NEED_grok_numeric_radix_GLOBAL grok_oct() NEED_grok_oct NEED_grok_oct_GLOBAL load_module() NEED_load_module NEED_load_module_GLOBAL my_snprintf() NEED_my_snprintf NEED_my_snprintf_GLOBAL my_sprintf() NEED_my_sprintf NEED_my_sprintf_GLOBAL my_strlcat() NEED_my_strlcat NEED_my_strlcat_GLOBAL my_strlcpy() NEED_my_strlcpy NEED_my_strlcpy_GLOBAL newCONSTSUB() NEED_newCONSTSUB NEED_newCONSTSUB_GLOBAL newRV_noinc() NEED_newRV_noinc NEED_newRV_noinc_GLOBAL newSV_type() NEED_newSV_type NEED_newSV_type_GLOBAL newSVpvn_flags() NEED_newSVpvn_flags NEED_newSVpvn_flags_GLOBAL newSVpvn_share() NEED_newSVpvn_share NEED_newSVpvn_share_GLOBAL pv_display() NEED_pv_display NEED_pv_display_GLOBAL pv_escape() NEED_pv_escape NEED_pv_escape_GLOBAL pv_pretty() NEED_pv_pretty NEED_pv_pretty_GLOBAL sv_2pv_flags() NEED_sv_2pv_flags NEED_sv_2pv_flags_GLOBAL sv_2pvbyte() NEED_sv_2pvbyte NEED_sv_2pvbyte_GLOBAL sv_catpvf_mg() NEED_sv_catpvf_mg NEED_sv_catpvf_mg_GLOBAL sv_catpvf_mg_nocontext() NEED_sv_catpvf_mg_nocontext NEED_sv_catpvf_mg_nocontext_GLOBAL sv_pvn_force_flags() NEED_sv_pvn_force_flags NEED_sv_pvn_force_flags_GLOBAL sv_setpvf_mg() NEED_sv_setpvf_mg NEED_sv_setpvf_mg_GLOBAL sv_setpvf_mg_nocontext() NEED_sv_setpvf_mg_nocontext NEED_sv_setpvf_mg_nocontext_GLOBAL vload_module() NEED_vload_module NEED_vload_module_GLOBAL vnewSVpvf() NEED_vnewSVpvf NEED_vnewSVpvf_GLOBAL warner() NEED_warner NEED_warner_GLOBAL To avoid namespace conflicts, you can change the namespace of the explicitly exported functions / variables using the C macro. Just C<#define> the macro before including C: #define DPPP_NAMESPACE MyOwnNamespace_ #include "ppport.h" The default namespace is C. =back The good thing is that most of the above can be checked by running F on your source code. See the next section for details. =head1 EXAMPLES To verify whether F is needed for your module, whether you should make any changes to your code, and whether any special defines should be used, F can be run as a Perl script to check your source code. Simply say: perl ppport.h The result will usually be a list of patches suggesting changes that should at least be acceptable, if not necessarily the most efficient solution, or a fix for all possible problems. If you know that your XS module uses features only available in newer Perl releases, if you're aware that it uses C++ comments, and if you want all suggestions as a single patch file, you could use something like this: perl ppport.h --compat-version=5.6.0 --cplusplus --patch=test.diff If you only want your code to be scanned without any suggestions for changes, use: perl ppport.h --nochanges You can specify a different C program or options, using the C<--diff> option: perl ppport.h --diff='diff -C 10' This would output context diffs with 10 lines of context. If you want to create patched copies of your files instead, use: perl ppport.h --copy=.new To display portability information for the C function, use: perl ppport.h --api-info=newSVpvn Since the argument to C<--api-info> can be a regular expression, you can use perl ppport.h --api-info=/_nomg$/ to display portability information for all C<_nomg> functions or perl ppport.h --api-info=/./ to display information for all known API elements. =head1 BUGS If this version of F is causing failure during the compilation of this module, please check if newer versions of either this module or C are available on CPAN before sending a bug report. If F was generated using the latest version of C and is causing failure of this module, please file a bug report using the CPAN Request Tracker at L. Please include the following information: =over 4 =item 1. The complete output from running "perl -V" =item 2. This file. =item 3. The name and version of the module you were trying to build. =item 4. A full log of the build that failed. =item 5. Any other information that you think could be relevant. =back For the latest version of this code, please get the C module from CPAN. =head1 COPYRIGHT Version 3.x, Copyright (c) 2004-2009, Marcus Holland-Moritz. Version 2.x, Copyright (C) 2001, Paul Marquess. Version 1.x, Copyright (C) 1999, Kenneth Albanowski. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO See L. =cut use strict; # Disable broken TRIE-optimization BEGIN { eval '${^RE_TRIE_MAXBUF} = -1' if $] >= 5.009004 && $] <= 5.009005 } my $VERSION = 3.19; my %opt = ( quiet => 0, diag => 1, hints => 1, changes => 1, cplusplus => 0, filter => 1, strip => 0, version => 0, ); my($ppport) = $0 =~ /([\w.]+)$/; my $LF = '(?:\r\n|[\r\n])'; # line feed my $HS = "[ \t]"; # horizontal whitespace # Never use C comments in this file! my $ccs = '/'.'*'; my $cce = '*'.'/'; my $rccs = quotemeta $ccs; my $rcce = quotemeta $cce; eval { require Getopt::Long; Getopt::Long::GetOptions(\%opt, qw( help quiet diag! filter! hints! changes! cplusplus strip version patch=s copy=s diff=s compat-version=s list-provided list-unsupported api-info=s )) or usage(); }; if ($@ and grep /^-/, @ARGV) { usage() if "@ARGV" =~ /^--?h(?:elp)?$/; die "Getopt::Long not found. Please don't use any options.\n"; } if ($opt{version}) { print "This is $0 $VERSION.\n"; exit 0; } usage() if $opt{help}; strip() if $opt{strip}; if (exists $opt{'compat-version'}) { my($r,$v,$s) = eval { parse_version($opt{'compat-version'}) }; if ($@) { die "Invalid version number format: '$opt{'compat-version'}'\n"; } die "Only Perl 5 is supported\n" if $r != 5; die "Invalid version number: $opt{'compat-version'}\n" if $v >= 1000 || $s >= 1000; $opt{'compat-version'} = sprintf "%d.%03d%03d", $r, $v, $s; } else { $opt{'compat-version'} = 5; } my %API = map { /^(\w+)\|([^|]*)\|([^|]*)\|(\w*)$/ ? ( $1 => { ($2 ? ( base => $2 ) : ()), ($3 ? ( todo => $3 ) : ()), (index($4, 'v') >= 0 ? ( varargs => 1 ) : ()), (index($4, 'p') >= 0 ? ( provided => 1 ) : ()), (index($4, 'n') >= 0 ? ( nothxarg => 1 ) : ()), } ) : die "invalid spec: $_" } qw( AvFILLp|5.004050||p AvFILL||| CLASS|||n CPERLscope|5.005000||p CX_CURPAD_SAVE||| CX_CURPAD_SV||| CopFILEAV|5.006000||p CopFILEGV_set|5.006000||p CopFILEGV|5.006000||p CopFILESV|5.006000||p CopFILE_set|5.006000||p CopFILE|5.006000||p CopSTASHPV_set|5.006000||p CopSTASHPV|5.006000||p CopSTASH_eq|5.006000||p CopSTASH_set|5.006000||p CopSTASH|5.006000||p CopyD|5.009002||p Copy||| CvPADLIST||| CvSTASH||| CvWEAKOUTSIDE||| DEFSV_set|5.011000||p DEFSV|5.004050||p END_EXTERN_C|5.005000||p ENTER||| ERRSV|5.004050||p EXTEND||| EXTERN_C|5.005000||p F0convert|||n FREETMPS||| GIMME_V||5.004000|n GIMME|||n GROK_NUMERIC_RADIX|5.007002||p G_ARRAY||| G_DISCARD||| G_EVAL||| G_METHOD|5.006001||p G_NOARGS||| G_SCALAR||| G_VOID||5.004000| GetVars||| GvSVn|5.009003||p GvSV||| Gv_AMupdate||| HEf_SVKEY||5.004000| HeHASH||5.004000| HeKEY||5.004000| HeKLEN||5.004000| HePV||5.004000| HeSVKEY_force||5.004000| HeSVKEY_set||5.004000| HeSVKEY||5.004000| HeUTF8||5.011000| HeVAL||5.004000| HvNAMELEN_get|5.009003||p HvNAME_get|5.009003||p HvNAME||| INT2PTR|5.006000||p IN_LOCALE_COMPILETIME|5.007002||p IN_LOCALE_RUNTIME|5.007002||p IN_LOCALE|5.007002||p IN_PERL_COMPILETIME|5.008001||p IS_NUMBER_GREATER_THAN_UV_MAX|5.007002||p IS_NUMBER_INFINITY|5.007002||p IS_NUMBER_IN_UV|5.007002||p IS_NUMBER_NAN|5.007003||p IS_NUMBER_NEG|5.007002||p IS_NUMBER_NOT_INT|5.007002||p IVSIZE|5.006000||p IVTYPE|5.006000||p IVdf|5.006000||p LEAVE||| LVRET||| MARK||| MULTICALL||5.011000| MY_CXT_CLONE|5.009002||p MY_CXT_INIT|5.007003||p MY_CXT|5.007003||p MoveD|5.009002||p Move||| NOOP|5.005000||p NUM2PTR|5.006000||p NVTYPE|5.006000||p NVef|5.006001||p NVff|5.006001||p NVgf|5.006001||p Newxc|5.009003||p Newxz|5.009003||p Newx|5.009003||p Nullav||| Nullch||| Nullcv||| Nullhv||| Nullsv||| ORIGMARK||| PAD_BASE_SV||| PAD_CLONE_VARS||| PAD_COMPNAME_FLAGS||| PAD_COMPNAME_GEN_set||| PAD_COMPNAME_GEN||| PAD_COMPNAME_OURSTASH||| PAD_COMPNAME_PV||| PAD_COMPNAME_TYPE||| PAD_DUP||| PAD_RESTORE_LOCAL||| PAD_SAVE_LOCAL||| PAD_SAVE_SETNULLPAD||| PAD_SETSV||| PAD_SET_CUR_NOSAVE||| PAD_SET_CUR||| PAD_SVl||| PAD_SV||| PERLIO_FUNCS_CAST|5.009003||p PERLIO_FUNCS_DECL|5.009003||p PERL_ABS|5.008001||p PERL_BCDVERSION|5.011000||p PERL_GCC_BRACE_GROUPS_FORBIDDEN|5.008001||p PERL_HASH|5.004000||p PERL_INT_MAX|5.004000||p PERL_INT_MIN|5.004000||p PERL_LONG_MAX|5.004000||p PERL_LONG_MIN|5.004000||p PERL_MAGIC_arylen|5.007002||p PERL_MAGIC_backref|5.007002||p PERL_MAGIC_bm|5.007002||p PERL_MAGIC_collxfrm|5.007002||p PERL_MAGIC_dbfile|5.007002||p PERL_MAGIC_dbline|5.007002||p PERL_MAGIC_defelem|5.007002||p PERL_MAGIC_envelem|5.007002||p PERL_MAGIC_env|5.007002||p PERL_MAGIC_ext|5.007002||p PERL_MAGIC_fm|5.007002||p PERL_MAGIC_glob|5.011000||p PERL_MAGIC_isaelem|5.007002||p PERL_MAGIC_isa|5.007002||p PERL_MAGIC_mutex|5.011000||p PERL_MAGIC_nkeys|5.007002||p PERL_MAGIC_overload_elem|5.007002||p PERL_MAGIC_overload_table|5.007002||p PERL_MAGIC_overload|5.007002||p PERL_MAGIC_pos|5.007002||p PERL_MAGIC_qr|5.007002||p PERL_MAGIC_regdata|5.007002||p PERL_MAGIC_regdatum|5.007002||p PERL_MAGIC_regex_global|5.007002||p PERL_MAGIC_shared_scalar|5.007003||p PERL_MAGIC_shared|5.007003||p PERL_MAGIC_sigelem|5.007002||p PERL_MAGIC_sig|5.007002||p PERL_MAGIC_substr|5.007002||p PERL_MAGIC_sv|5.007002||p PERL_MAGIC_taint|5.007002||p PERL_MAGIC_tiedelem|5.007002||p PERL_MAGIC_tiedscalar|5.007002||p PERL_MAGIC_tied|5.007002||p PERL_MAGIC_utf8|5.008001||p PERL_MAGIC_uvar_elem|5.007003||p PERL_MAGIC_uvar|5.007002||p PERL_MAGIC_vec|5.007002||p PERL_MAGIC_vstring|5.008001||p PERL_PV_ESCAPE_ALL|5.009004||p PERL_PV_ESCAPE_FIRSTCHAR|5.009004||p PERL_PV_ESCAPE_NOBACKSLASH|5.009004||p PERL_PV_ESCAPE_NOCLEAR|5.009004||p PERL_PV_ESCAPE_QUOTE|5.009004||p PERL_PV_ESCAPE_RE|5.009005||p PERL_PV_ESCAPE_UNI_DETECT|5.009004||p PERL_PV_ESCAPE_UNI|5.009004||p PERL_PV_PRETTY_DUMP|5.009004||p PERL_PV_PRETTY_ELLIPSES|5.010000||p PERL_PV_PRETTY_LTGT|5.009004||p PERL_PV_PRETTY_NOCLEAR|5.010000||p PERL_PV_PRETTY_QUOTE|5.009004||p PERL_PV_PRETTY_REGPROP|5.009004||p PERL_QUAD_MAX|5.004000||p PERL_QUAD_MIN|5.004000||p PERL_REVISION|5.006000||p PERL_SCAN_ALLOW_UNDERSCORES|5.007003||p PERL_SCAN_DISALLOW_PREFIX|5.007003||p PERL_SCAN_GREATER_THAN_UV_MAX|5.007003||p PERL_SCAN_SILENT_ILLDIGIT|5.008001||p PERL_SHORT_MAX|5.004000||p PERL_SHORT_MIN|5.004000||p PERL_SIGNALS_UNSAFE_FLAG|5.008001||p PERL_SUBVERSION|5.006000||p PERL_SYS_INIT3||5.006000| PERL_SYS_INIT||| PERL_SYS_TERM||5.011000| PERL_UCHAR_MAX|5.004000||p PERL_UCHAR_MIN|5.004000||p PERL_UINT_MAX|5.004000||p PERL_UINT_MIN|5.004000||p PERL_ULONG_MAX|5.004000||p PERL_ULONG_MIN|5.004000||p PERL_UNUSED_ARG|5.009003||p PERL_UNUSED_CONTEXT|5.009004||p PERL_UNUSED_DECL|5.007002||p PERL_UNUSED_VAR|5.007002||p PERL_UQUAD_MAX|5.004000||p PERL_UQUAD_MIN|5.004000||p PERL_USE_GCC_BRACE_GROUPS|5.009004||p PERL_USHORT_MAX|5.004000||p PERL_USHORT_MIN|5.004000||p PERL_VERSION|5.006000||p PL_DBsignal|5.005000||p PL_DBsingle|||pn PL_DBsub|||pn PL_DBtrace|||pn PL_Sv|5.005000||p PL_bufend|5.011000||p PL_bufptr|5.011000||p PL_compiling|5.004050||p PL_copline|5.011000||p PL_curcop|5.004050||p PL_curstash|5.004050||p PL_debstash|5.004050||p PL_defgv|5.004050||p PL_diehook|5.004050||p PL_dirty|5.004050||p PL_dowarn|||pn PL_errgv|5.004050||p PL_error_count|5.011000||p PL_expect|5.011000||p PL_hexdigit|5.005000||p PL_hints|5.005000||p PL_in_my_stash|5.011000||p PL_in_my|5.011000||p PL_last_in_gv|||n PL_laststatval|5.005000||p PL_lex_state|5.011000||p PL_lex_stuff|5.011000||p PL_linestr|5.011000||p PL_modglobal||5.005000|n PL_na|5.004050||pn PL_no_modify|5.006000||p PL_ofsgv|||n PL_parser|5.009005||p PL_perl_destruct_level|5.004050||p PL_perldb|5.004050||p PL_ppaddr|5.006000||p PL_rsfp_filters|5.004050||p PL_rsfp|5.004050||p PL_rs|||n PL_signals|5.008001||p PL_stack_base|5.004050||p PL_stack_sp|5.004050||p PL_statcache|5.005000||p PL_stdingv|5.004050||p PL_sv_arenaroot|5.004050||p PL_sv_no|5.004050||pn PL_sv_undef|5.004050||pn PL_sv_yes|5.004050||pn PL_tainted|5.004050||p PL_tainting|5.004050||p PL_tokenbuf|5.011000||p POP_MULTICALL||5.011000| POPi|||n POPl|||n POPn|||n POPpbytex||5.007001|n POPpx||5.005030|n POPp|||n POPs|||n PTR2IV|5.006000||p PTR2NV|5.006000||p PTR2UV|5.006000||p PTR2nat|5.009003||p PTR2ul|5.007001||p PTRV|5.006000||p PUSHMARK||| PUSH_MULTICALL||5.011000| PUSHi||| PUSHmortal|5.009002||p PUSHn||| PUSHp||| PUSHs||| PUSHu|5.004000||p PUTBACK||| PerlIO_clearerr||5.007003| PerlIO_close||5.007003| PerlIO_context_layers||5.009004| PerlIO_eof||5.007003| PerlIO_error||5.007003| PerlIO_fileno||5.007003| PerlIO_fill||5.007003| PerlIO_flush||5.007003| PerlIO_get_base||5.007003| PerlIO_get_bufsiz||5.007003| PerlIO_get_cnt||5.007003| PerlIO_get_ptr||5.007003| PerlIO_read||5.007003| PerlIO_seek||5.007003| PerlIO_set_cnt||5.007003| PerlIO_set_ptrcnt||5.007003| PerlIO_setlinebuf||5.007003| PerlIO_stderr||5.007003| PerlIO_stdin||5.007003| PerlIO_stdout||5.007003| PerlIO_tell||5.007003| PerlIO_unread||5.007003| PerlIO_write||5.007003| Perl_signbit||5.009005|n PoisonFree|5.009004||p PoisonNew|5.009004||p PoisonWith|5.009004||p Poison|5.008000||p RETVAL|||n Renewc||| Renew||| SAVECLEARSV||| SAVECOMPPAD||| SAVEPADSV||| SAVETMPS||| SAVE_DEFSV|5.004050||p SPAGAIN||| SP||| START_EXTERN_C|5.005000||p START_MY_CXT|5.007003||p STMT_END|||p STMT_START|||p STR_WITH_LEN|5.009003||p ST||| SV_CONST_RETURN|5.009003||p SV_COW_DROP_PV|5.008001||p SV_COW_SHARED_HASH_KEYS|5.009005||p SV_GMAGIC|5.007002||p SV_HAS_TRAILING_NUL|5.009004||p SV_IMMEDIATE_UNREF|5.007001||p SV_MUTABLE_RETURN|5.009003||p SV_NOSTEAL|5.009002||p SV_SMAGIC|5.009003||p SV_UTF8_NO_ENCODING|5.008001||p SVfARG|5.009005||p SVf_UTF8|5.006000||p SVf|5.006000||p SVt_IV||| SVt_NV||| SVt_PVAV||| SVt_PVCV||| SVt_PVHV||| SVt_PVMG||| SVt_PV||| Safefree||| Slab_Alloc||| Slab_Free||| Slab_to_rw||| StructCopy||| SvCUR_set||| SvCUR||| SvEND||| SvGAMAGIC||5.006001| SvGETMAGIC|5.004050||p SvGROW||| SvIOK_UV||5.006000| SvIOK_notUV||5.006000| SvIOK_off||| SvIOK_only_UV||5.006000| SvIOK_only||| SvIOK_on||| SvIOKp||| SvIOK||| SvIVX||| SvIV_nomg|5.009001||p SvIV_set||| SvIVx||| SvIV||| SvIsCOW_shared_hash||5.008003| SvIsCOW||5.008003| SvLEN_set||| SvLEN||| SvLOCK||5.007003| SvMAGIC_set|5.009003||p SvNIOK_off||| SvNIOKp||| SvNIOK||| SvNOK_off||| SvNOK_only||| SvNOK_on||| SvNOKp||| SvNOK||| SvNVX||| SvNV_set||| SvNVx||| SvNV||| SvOK||| SvOOK_offset||5.011000| SvOOK||| SvPOK_off||| SvPOK_only_UTF8||5.006000| SvPOK_only||| SvPOK_on||| SvPOKp||| SvPOK||| SvPVX_const|5.009003||p SvPVX_mutable|5.009003||p SvPVX||| SvPV_const|5.009003||p SvPV_flags_const_nolen|5.009003||p SvPV_flags_const|5.009003||p SvPV_flags_mutable|5.009003||p SvPV_flags|5.007002||p SvPV_force_flags_mutable|5.009003||p SvPV_force_flags_nolen|5.009003||p SvPV_force_flags|5.007002||p SvPV_force_mutable|5.009003||p SvPV_force_nolen|5.009003||p SvPV_force_nomg_nolen|5.009003||p SvPV_force_nomg|5.007002||p SvPV_force|||p SvPV_mutable|5.009003||p SvPV_nolen_const|5.009003||p SvPV_nolen|5.006000||p SvPV_nomg_const_nolen|5.009003||p SvPV_nomg_const|5.009003||p SvPV_nomg|5.007002||p SvPV_renew|5.009003||p SvPV_set||| SvPVbyte_force||5.009002| SvPVbyte_nolen||5.006000| SvPVbytex_force||5.006000| SvPVbytex||5.006000| SvPVbyte|5.006000||p SvPVutf8_force||5.006000| SvPVutf8_nolen||5.006000| SvPVutf8x_force||5.006000| SvPVutf8x||5.006000| SvPVutf8||5.006000| SvPVx||| SvPV||| SvREFCNT_dec||| SvREFCNT_inc_NN|5.009004||p SvREFCNT_inc_simple_NN|5.009004||p SvREFCNT_inc_simple_void_NN|5.009004||p SvREFCNT_inc_simple_void|5.009004||p SvREFCNT_inc_simple|5.009004||p SvREFCNT_inc_void_NN|5.009004||p SvREFCNT_inc_void|5.009004||p SvREFCNT_inc|||p SvREFCNT||| SvROK_off||| SvROK_on||| SvROK||| SvRV_set|5.009003||p SvRV||| SvRXOK||5.009005| SvRX||5.009005| SvSETMAGIC||| SvSHARED_HASH|5.009003||p SvSHARE||5.007003| SvSTASH_set|5.009003||p SvSTASH||| SvSetMagicSV_nosteal||5.004000| SvSetMagicSV||5.004000| SvSetSV_nosteal||5.004000| SvSetSV||| SvTAINTED_off||5.004000| SvTAINTED_on||5.004000| SvTAINTED||5.004000| SvTAINT||| SvTRUE||| SvTYPE||| SvUNLOCK||5.007003| SvUOK|5.007001|5.006000|p SvUPGRADE||| SvUTF8_off||5.006000| SvUTF8_on||5.006000| SvUTF8||5.006000| SvUVXx|5.004000||p SvUVX|5.004000||p SvUV_nomg|5.009001||p SvUV_set|5.009003||p SvUVx|5.004000||p SvUV|5.004000||p SvVOK||5.008001| SvVSTRING_mg|5.009004||p THIS|||n UNDERBAR|5.009002||p UTF8_MAXBYTES|5.009002||p UVSIZE|5.006000||p UVTYPE|5.006000||p UVXf|5.007001||p UVof|5.006000||p UVuf|5.006000||p UVxf|5.006000||p WARN_ALL|5.006000||p WARN_AMBIGUOUS|5.006000||p WARN_ASSERTIONS|5.011000||p WARN_BAREWORD|5.006000||p WARN_CLOSED|5.006000||p WARN_CLOSURE|5.006000||p WARN_DEBUGGING|5.006000||p WARN_DEPRECATED|5.006000||p WARN_DIGIT|5.006000||p WARN_EXEC|5.006000||p WARN_EXITING|5.006000||p WARN_GLOB|5.006000||p WARN_INPLACE|5.006000||p WARN_INTERNAL|5.006000||p WARN_IO|5.006000||p WARN_LAYER|5.008000||p WARN_MALLOC|5.006000||p WARN_MISC|5.006000||p WARN_NEWLINE|5.006000||p WARN_NUMERIC|5.006000||p WARN_ONCE|5.006000||p WARN_OVERFLOW|5.006000||p WARN_PACK|5.006000||p WARN_PARENTHESIS|5.006000||p WARN_PIPE|5.006000||p WARN_PORTABLE|5.006000||p WARN_PRECEDENCE|5.006000||p WARN_PRINTF|5.006000||p WARN_PROTOTYPE|5.006000||p WARN_QW|5.006000||p WARN_RECURSION|5.006000||p WARN_REDEFINE|5.006000||p WARN_REGEXP|5.006000||p WARN_RESERVED|5.006000||p WARN_SEMICOLON|5.006000||p WARN_SEVERE|5.006000||p WARN_SIGNAL|5.006000||p WARN_SUBSTR|5.006000||p WARN_SYNTAX|5.006000||p WARN_TAINT|5.006000||p WARN_THREADS|5.008000||p WARN_UNINITIALIZED|5.006000||p WARN_UNOPENED|5.006000||p WARN_UNPACK|5.006000||p WARN_UNTIE|5.006000||p WARN_UTF8|5.006000||p WARN_VOID|5.006000||p XCPT_CATCH|5.009002||p XCPT_RETHROW|5.009002||p XCPT_TRY_END|5.009002||p XCPT_TRY_START|5.009002||p XPUSHi||| XPUSHmortal|5.009002||p XPUSHn||| XPUSHp||| XPUSHs||| XPUSHu|5.004000||p XSPROTO|5.010000||p XSRETURN_EMPTY||| XSRETURN_IV||| XSRETURN_NO||| XSRETURN_NV||| XSRETURN_PV||| XSRETURN_UNDEF||| XSRETURN_UV|5.008001||p XSRETURN_YES||| XSRETURN|||p XST_mIV||| XST_mNO||| XST_mNV||| XST_mPV||| XST_mUNDEF||| XST_mUV|5.008001||p XST_mYES||| XS_VERSION_BOOTCHECK||| XS_VERSION||| XSprePUSH|5.006000||p XS||| ZeroD|5.009002||p Zero||| _aMY_CXT|5.007003||p _pMY_CXT|5.007003||p aMY_CXT_|5.007003||p aMY_CXT|5.007003||p aTHXR_|5.011000||p aTHXR|5.011000||p aTHX_|5.006000||p aTHX|5.006000||p add_data|||n addmad||| allocmy||| amagic_call||| amagic_cmp_locale||| amagic_cmp||| amagic_i_ncmp||| amagic_ncmp||| any_dup||| ao||| append_elem||| append_list||| append_madprops||| apply_attrs_my||| apply_attrs_string||5.006001| apply_attrs||| apply||| atfork_lock||5.007003|n atfork_unlock||5.007003|n av_arylen_p||5.009003| av_clear||| av_create_and_push||5.009005| av_create_and_unshift_one||5.009005| av_delete||5.006000| av_exists||5.006000| av_extend||| av_fetch||| av_fill||| av_iter_p||5.011000| av_len||| av_make||| av_pop||| av_push||| av_reify||| av_shift||| av_store||| av_undef||| av_unshift||| ax|||n bad_type||| bind_match||| block_end||| block_gimme||5.004000| block_start||| boolSV|5.004000||p boot_core_PerlIO||| boot_core_UNIVERSAL||| boot_core_mro||| bytes_from_utf8||5.007001| bytes_to_uni|||n bytes_to_utf8||5.006001| call_argv|5.006000||p call_atexit||5.006000| call_list||5.004000| call_method|5.006000||p call_pv|5.006000||p call_sv|5.006000||p calloc||5.007002|n cando||| cast_i32||5.006000| cast_iv||5.006000| cast_ulong||5.006000| cast_uv||5.006000| check_type_and_open||| check_uni||| checkcomma||| checkposixcc||| ckWARN|5.006000||p ck_anoncode||| ck_bitop||| ck_concat||| ck_defined||| ck_delete||| ck_die||| ck_each||| ck_eof||| ck_eval||| ck_exec||| ck_exists||| ck_exit||| ck_ftst||| ck_fun||| ck_glob||| ck_grep||| ck_index||| ck_join||| ck_lfun||| ck_listiob||| ck_match||| ck_method||| ck_null||| ck_open||| ck_readline||| ck_repeat||| ck_require||| ck_return||| ck_rfun||| ck_rvconst||| ck_sassign||| ck_select||| ck_shift||| ck_sort||| ck_spair||| ck_split||| ck_subr||| ck_substr||| ck_svconst||| ck_trunc||| ck_unpack||| ckwarn_d||5.009003| ckwarn||5.009003| cl_and|||n cl_anything|||n cl_init_zero|||n cl_init|||n cl_is_anything|||n cl_or|||n clear_placeholders||| closest_cop||| convert||| cop_free||| cr_textfilter||| create_eval_scope||| croak_nocontext|||vn croak_xs_usage||5.011000| croak|||v csighandler||5.009003|n curmad||| custom_op_desc||5.007003| custom_op_name||5.007003| cv_ckproto_len||| cv_clone||| cv_const_sv||5.004000| cv_dump||| cv_undef||| cx_dump||5.005000| cx_dup||| cxinc||| dAXMARK|5.009003||p dAX|5.007002||p dITEMS|5.007002||p dMARK||| dMULTICALL||5.009003| dMY_CXT_SV|5.007003||p dMY_CXT|5.007003||p dNOOP|5.006000||p dORIGMARK||| dSP||| dTHR|5.004050||p dTHXR|5.011000||p dTHXa|5.006000||p dTHXoa|5.006000||p dTHX|5.006000||p dUNDERBAR|5.009002||p dVAR|5.009003||p dXCPT|5.009002||p dXSARGS||| dXSI32||| dXSTARG|5.006000||p deb_curcv||| deb_nocontext|||vn deb_stack_all||| deb_stack_n||| debop||5.005000| debprofdump||5.005000| debprof||| debstackptrs||5.007003| debstack||5.007003| debug_start_match||| deb||5.007003|v del_sv||| delete_eval_scope||| delimcpy||5.004000| deprecate_old||| deprecate||| despatch_signals||5.007001| destroy_matcher||| die_nocontext|||vn die_where||| die|||v dirp_dup||| div128||| djSP||| do_aexec5||| do_aexec||| do_aspawn||| do_binmode||5.004050| do_chomp||| do_chop||| do_close||| do_dump_pad||| do_eof||| do_exec3||| do_execfree||| do_exec||| do_gv_dump||5.006000| do_gvgv_dump||5.006000| do_hv_dump||5.006000| do_ipcctl||| do_ipcget||| do_join||| do_kv||| do_magic_dump||5.006000| do_msgrcv||| do_msgsnd||| do_oddball||| do_op_dump||5.006000| do_op_xmldump||| do_open9||5.006000| do_openn||5.007001| do_open||5.004000| do_pmop_dump||5.006000| do_pmop_xmldump||| do_print||| do_readline||| do_seek||| do_semop||| do_shmio||| do_smartmatch||| do_spawn_nowait||| do_spawn||| do_sprintf||| do_sv_dump||5.006000| do_sysseek||| do_tell||| do_trans_complex_utf8||| do_trans_complex||| do_trans_count_utf8||| do_trans_count||| do_trans_simple_utf8||| do_trans_simple||| do_trans||| do_vecget||| do_vecset||| do_vop||| docatch||| doeval||| dofile||| dofindlabel||| doform||| doing_taint||5.008001|n dooneliner||| doopen_pm||| doparseform||| dopoptoeval||| dopoptogiven||| dopoptolabel||| dopoptoloop||| dopoptosub_at||| dopoptowhen||| doref||5.009003| dounwind||| dowantarray||| dump_all||5.006000| dump_eval||5.006000| dump_exec_pos||| dump_fds||| dump_form||5.006000| dump_indent||5.006000|v dump_mstats||| dump_packsubs||5.006000| dump_sub||5.006000| dump_sv_child||| dump_trie_interim_list||| dump_trie_interim_table||| dump_trie||| dump_vindent||5.006000| dumpuntil||| dup_attrlist||| emulate_cop_io||| eval_pv|5.006000||p eval_sv|5.006000||p exec_failed||| expect_number||| fbm_compile||5.005000| fbm_instr||5.005000| feature_is_enabled||| fetch_cop_label||5.011000| filter_add||| filter_del||| filter_gets||| filter_read||| find_and_forget_pmops||| find_array_subscript||| find_beginning||| find_byclass||| find_hash_subscript||| find_in_my_stash||| find_runcv||5.008001| find_rundefsvoffset||5.009002| find_script||| find_uninit_var||| first_symbol|||n fold_constants||| forbid_setid||| force_ident||| force_list||| force_next||| force_version||| force_word||| forget_pmop||| form_nocontext|||vn form||5.004000|v fp_dup||| fprintf_nocontext|||vn free_global_struct||| free_tied_hv_pool||| free_tmps||| gen_constant_list||| get_arena||| get_aux_mg||| get_av|5.006000||p get_context||5.006000|n get_cvn_flags||5.009005| get_cv|5.006000||p get_db_sub||| get_debug_opts||| get_hash_seed||| get_hv|5.006000||p get_isa_hash||| get_mstats||| get_no_modify||| get_num||| get_op_descs||5.005000| get_op_names||5.005000| get_opargs||| get_ppaddr||5.006000| get_re_arg||| get_sv|5.006000||p get_vtbl||5.005030| getcwd_sv||5.007002| getenv_len||| glob_2number||| glob_assign_glob||| glob_assign_ref||| gp_dup||| gp_free||| gp_ref||| grok_bin|5.007003||p grok_hex|5.007003||p grok_number|5.007002||p grok_numeric_radix|5.007002||p grok_oct|5.007003||p group_end||| gv_AVadd||| gv_HVadd||| gv_IOadd||| gv_SVadd||| gv_autoload4||5.004000| gv_check||| gv_const_sv||5.009003| gv_dump||5.006000| gv_efullname3||5.004000| gv_efullname4||5.006001| gv_efullname||| gv_ename||| gv_fetchfile_flags||5.009005| gv_fetchfile||| gv_fetchmeth_autoload||5.007003| gv_fetchmethod_autoload||5.004000| gv_fetchmethod_flags||5.011000| gv_fetchmethod||| gv_fetchmeth||| gv_fetchpvn_flags|5.009002||p gv_fetchpvs|5.009004||p gv_fetchpv||| gv_fetchsv||5.009002| gv_fullname3||5.004000| gv_fullname4||5.006001| gv_fullname||| gv_get_super_pkg||| gv_handler||5.007001| gv_init_sv||| gv_init||| gv_name_set||5.009004| gv_stashpvn|5.004000||p gv_stashpvs|5.009003||p gv_stashpv||| gv_stashsv||| he_dup||| hek_dup||| hfreeentries||| hsplit||| hv_assert||5.011000| hv_auxinit|||n hv_backreferences_p||| hv_clear_placeholders||5.009001| hv_clear||| hv_common_key_len||5.010000| hv_common||5.010000| hv_copy_hints_hv||| hv_delayfree_ent||5.004000| hv_delete_common||| hv_delete_ent||5.004000| hv_delete||| hv_eiter_p||5.009003| hv_eiter_set||5.009003| hv_exists_ent||5.004000| hv_exists||| hv_fetch_ent||5.004000| hv_fetchs|5.009003||p hv_fetch||| hv_free_ent||5.004000| hv_iterinit||| hv_iterkeysv||5.004000| hv_iterkey||| hv_iternext_flags||5.008000| hv_iternextsv||| hv_iternext||| hv_iterval||| hv_kill_backrefs||| hv_ksplit||5.004000| hv_magic_check|||n hv_magic||| hv_name_set||5.009003| hv_notallowed||| hv_placeholders_get||5.009003| hv_placeholders_p||5.009003| hv_placeholders_set||5.009003| hv_riter_p||5.009003| hv_riter_set||5.009003| hv_scalar||5.009001| hv_store_ent||5.004000| hv_store_flags||5.008000| hv_stores|5.009004||p hv_store||| hv_undef||| ibcmp_locale||5.004000| ibcmp_utf8||5.007003| ibcmp||| incline||| incpush_if_exists||| incpush_use_sep||| incpush||| ingroup||| init_argv_symbols||| init_debugger||| init_global_struct||| init_i18nl10n||5.006000| init_i18nl14n||5.006000| init_ids||| init_interp||| init_main_stash||| init_perllib||| init_postdump_symbols||| init_predump_symbols||| init_stacks||5.005000| init_tm||5.007002| instr||| intro_my||| intuit_method||| intuit_more||| invert||| io_close||| isALNUMC|5.006000||p isALNUM||| isALPHA||| isASCII|5.006000||p isBLANK|5.006001||p isCNTRL|5.006000||p isDIGIT||| isGRAPH|5.006000||p isGV_with_GP|5.009004||p isLOWER||| isPRINT|5.004000||p isPSXSPC|5.006001||p isPUNCT|5.006000||p isSPACE||| isUPPER||| isXDIGIT|5.006000||p is_an_int||| is_gv_magical_sv||| is_handle_constructor|||n is_list_assignment||| is_lvalue_sub||5.007001| is_uni_alnum_lc||5.006000| is_uni_alnumc_lc||5.006000| is_uni_alnumc||5.006000| is_uni_alnum||5.006000| is_uni_alpha_lc||5.006000| is_uni_alpha||5.006000| is_uni_ascii_lc||5.006000| is_uni_ascii||5.006000| is_uni_cntrl_lc||5.006000| is_uni_cntrl||5.006000| is_uni_digit_lc||5.006000| is_uni_digit||5.006000| is_uni_graph_lc||5.006000| is_uni_graph||5.006000| is_uni_idfirst_lc||5.006000| is_uni_idfirst||5.006000| is_uni_lower_lc||5.006000| is_uni_lower||5.006000| is_uni_print_lc||5.006000| is_uni_print||5.006000| is_uni_punct_lc||5.006000| is_uni_punct||5.006000| is_uni_space_lc||5.006000| is_uni_space||5.006000| is_uni_upper_lc||5.006000| is_uni_upper||5.006000| is_uni_xdigit_lc||5.006000| is_uni_xdigit||5.006000| is_utf8_alnumc||5.006000| is_utf8_alnum||5.006000| is_utf8_alpha||5.006000| is_utf8_ascii||5.006000| is_utf8_char_slow|||n is_utf8_char||5.006000| is_utf8_cntrl||5.006000| is_utf8_common||| is_utf8_digit||5.006000| is_utf8_graph||5.006000| is_utf8_idcont||5.008000| is_utf8_idfirst||5.006000| is_utf8_lower||5.006000| is_utf8_mark||5.006000| is_utf8_print||5.006000| is_utf8_punct||5.006000| is_utf8_space||5.006000| is_utf8_string_loclen||5.009003| is_utf8_string_loc||5.008001| is_utf8_string||5.006001| is_utf8_upper||5.006000| is_utf8_xdigit||5.006000| isa_lookup||| items|||n ix|||n jmaybe||| join_exact||| keyword||| leave_scope||| lex_end||| lex_start||| linklist||| listkids||| list||| load_module_nocontext|||vn load_module|5.006000||pv localize||| looks_like_bool||| looks_like_number||| lop||| mPUSHi|5.009002||p mPUSHn|5.009002||p mPUSHp|5.009002||p mPUSHs|5.011000||p mPUSHu|5.009002||p mXPUSHi|5.009002||p mXPUSHn|5.009002||p mXPUSHp|5.009002||p mXPUSHs|5.011000||p mXPUSHu|5.009002||p mad_free||| madlex||| madparse||| magic_clear_all_env||| magic_clearenv||| magic_clearhint||| magic_clearisa||| magic_clearpack||| magic_clearsig||| magic_dump||5.006000| magic_existspack||| magic_freearylen_p||| magic_freeovrld||| magic_getarylen||| magic_getdefelem||| magic_getnkeys||| magic_getpack||| magic_getpos||| magic_getsig||| magic_getsubstr||| magic_gettaint||| magic_getuvar||| magic_getvec||| magic_get||| magic_killbackrefs||| magic_len||| magic_methcall||| magic_methpack||| magic_nextpack||| magic_regdata_cnt||| magic_regdatum_get||| magic_regdatum_set||| magic_scalarpack||| magic_set_all_env||| magic_setamagic||| magic_setarylen||| magic_setcollxfrm||| magic_setdbline||| magic_setdefelem||| magic_setenv||| magic_sethint||| magic_setisa||| magic_setmglob||| magic_setnkeys||| magic_setpack||| magic_setpos||| magic_setregexp||| magic_setsig||| magic_setsubstr||| magic_settaint||| magic_setutf8||| magic_setuvar||| magic_setvec||| magic_set||| magic_sizepack||| magic_wipepack||| make_matcher||| make_trie_failtable||| make_trie||| malloc_good_size|||n malloced_size|||n malloc||5.007002|n markstack_grow||| matcher_matches_sv||| measure_struct||| memEQ|5.004000||p memNE|5.004000||p mem_collxfrm||| mem_log_common|||n mess_alloc||| mess_nocontext|||vn mess||5.006000|v method_common||| mfree||5.007002|n mg_clear||| mg_copy||| mg_dup||| mg_find||| mg_free||| mg_get||| mg_length||5.005000| mg_localize||| mg_magical||| mg_set||| mg_size||5.005000| mini_mktime||5.007002| missingterm||| mode_from_discipline||| modkids||| mod||| more_bodies||| more_sv||| moreswitches||| mro_get_from_name||5.011000| mro_get_linear_isa_dfs||| mro_get_linear_isa||5.009005| mro_get_private_data||5.011000| mro_isa_changed_in||| mro_meta_dup||| mro_meta_init||| mro_method_changed_in||5.009005| mro_register||5.011000| mro_set_mro||5.011000| mro_set_private_data||5.011000| mul128||| mulexp10|||n my_atof2||5.007002| my_atof||5.006000| my_attrs||| my_bcopy|||n my_betoh16|||n my_betoh32|||n my_betoh64|||n my_betohi|||n my_betohl|||n my_betohs|||n my_bzero|||n my_chsize||| my_clearenv||| my_cxt_index||| my_cxt_init||| my_dirfd||5.009005| my_exit_jump||| my_exit||| my_failure_exit||5.004000| my_fflush_all||5.006000| my_fork||5.007003|n my_htobe16|||n my_htobe32|||n my_htobe64|||n my_htobei|||n my_htobel|||n my_htobes|||n my_htole16|||n my_htole32|||n my_htole64|||n my_htolei|||n my_htolel|||n my_htoles|||n my_htonl||| my_kid||| my_letoh16|||n my_letoh32|||n my_letoh64|||n my_letohi|||n my_letohl|||n my_letohs|||n my_lstat||| my_memcmp||5.004000|n my_memset|||n my_ntohl||| my_pclose||5.004000| my_popen_list||5.007001| my_popen||5.004000| my_setenv||| my_snprintf|5.009004||pvn my_socketpair||5.007003|n my_sprintf|5.009003||pvn my_stat||| my_strftime||5.007002| my_strlcat|5.009004||pn my_strlcpy|5.009004||pn my_swabn|||n my_swap||| my_unexec||| my_vsnprintf||5.009004|n need_utf8|||n newANONATTRSUB||5.006000| newANONHASH||| newANONLIST||| newANONSUB||| newASSIGNOP||| newATTRSUB||5.006000| newAVREF||| newAV||| newBINOP||| newCONDOP||| newCONSTSUB|5.004050||p newCVREF||| newDEFSVOP||| newFORM||| newFOROP||| newGIVENOP||5.009003| newGIVWHENOP||| newGP||| newGVOP||| newGVREF||| newGVgen||| newHVREF||| newHVhv||5.005000| newHV||| newIO||| newLISTOP||| newLOGOP||| newLOOPEX||| newLOOPOP||| newMADPROP||| newMADsv||| newMYSUB||| newNULLLIST||| newOP||| newPADOP||| newPMOP||| newPROG||| newPVOP||| newRANGE||| newRV_inc|5.004000||p newRV_noinc|5.004000||p newRV||| newSLICEOP||| newSTATEOP||| newSUB||| newSVOP||| newSVREF||| newSV_type|5.009005||p newSVhek||5.009003| newSViv||| newSVnv||| newSVpvf_nocontext|||vn newSVpvf||5.004000|v newSVpvn_flags|5.011000||p newSVpvn_share|5.007001||p newSVpvn_utf8|5.011000||p newSVpvn|5.004050||p newSVpvs_flags|5.011000||p newSVpvs_share||5.009003| newSVpvs|5.009003||p newSVpv||| newSVrv||| newSVsv||| newSVuv|5.006000||p newSV||| newTOKEN||| newUNOP||| newWHENOP||5.009003| newWHILEOP||5.009003| newXS_flags||5.009004| newXSproto||5.006000| newXS||5.006000| new_collate||5.006000| new_constant||| new_ctype||5.006000| new_he||| new_logop||| new_numeric||5.006000| new_stackinfo||5.005000| new_version||5.009000| new_warnings_bitfield||| next_symbol||| nextargv||| nextchar||| ninstr||| no_bareword_allowed||| no_fh_allowed||| no_op||| not_a_number||| nothreadhook||5.008000| nuke_stacks||| num_overflow|||n offer_nice_chunk||| oopsAV||| oopsHV||| op_clear||| op_const_sv||| op_dump||5.006000| op_free||| op_getmad_weak||| op_getmad||| op_null||5.007002| op_refcnt_dec||| op_refcnt_inc||| op_refcnt_lock||5.009002| op_refcnt_unlock||5.009002| op_xmldump||| open_script||| pMY_CXT_|5.007003||p pMY_CXT|5.007003||p pTHX_|5.006000||p pTHX|5.006000||p packWARN|5.007003||p pack_cat||5.007003| pack_rec||| package||| packlist||5.008001| pad_add_anon||| pad_add_name||| pad_alloc||| pad_block_start||| pad_check_dup||| pad_compname_type||| pad_findlex||| pad_findmy||| pad_fixup_inner_anons||| pad_free||| pad_leavemy||| pad_new||| pad_peg|||n pad_push||| pad_reset||| pad_setsv||| pad_sv||5.011000| pad_swipe||| pad_tidy||| pad_undef||| parse_body||| parse_unicode_opts||| parser_dup||| parser_free||| path_is_absolute|||n peep||| pending_Slabs_to_ro||| perl_alloc_using|||n perl_alloc|||n perl_clone_using|||n perl_clone|||n perl_construct|||n perl_destruct||5.007003|n perl_free|||n perl_parse||5.006000|n perl_run|||n pidgone||| pm_description||| pmflag||| pmop_dump||5.006000| pmop_xmldump||| pmruntime||| pmtrans||| pop_scope||| pregcomp||5.009005| pregexec||| pregfree2||5.011000| pregfree||| prepend_elem||| prepend_madprops||| printbuf||| printf_nocontext|||vn process_special_blocks||| ptr_table_clear||5.009005| ptr_table_fetch||5.009005| ptr_table_find|||n ptr_table_free||5.009005| ptr_table_new||5.009005| ptr_table_split||5.009005| ptr_table_store||5.009005| push_scope||| put_byte||| pv_display|5.006000||p pv_escape|5.009004||p pv_pretty|5.009004||p pv_uni_display||5.007003| qerror||| qsortsvu||| re_compile||5.009005| re_croak2||| re_dup_guts||| re_intuit_start||5.009005| re_intuit_string||5.006000| readpipe_override||| realloc||5.007002|n reentrant_free||| reentrant_init||| reentrant_retry|||vn reentrant_size||| ref_array_or_hash||| refcounted_he_chain_2hv||| refcounted_he_fetch||| refcounted_he_free||| refcounted_he_new_common||| refcounted_he_new||| refcounted_he_value||| refkids||| refto||| ref||5.011000| reg_check_named_buff_matched||| reg_named_buff_all||5.009005| reg_named_buff_exists||5.009005| reg_named_buff_fetch||5.009005| reg_named_buff_firstkey||5.009005| reg_named_buff_iter||| reg_named_buff_nextkey||5.009005| reg_named_buff_scalar||5.009005| reg_named_buff||| reg_namedseq||| reg_node||| reg_numbered_buff_fetch||| reg_numbered_buff_length||| reg_numbered_buff_store||| reg_qr_package||| reg_recode||| reg_scan_name||| reg_skipcomment||| reg_temp_copy||| reganode||| regatom||| regbranch||| regclass_swash||5.009004| regclass||| regcppop||| regcppush||| regcurly|||n regdump_extflags||| regdump||5.005000| regdupe_internal||| regexec_flags||5.005000| regfree_internal||5.009005| reghop3|||n reghop4|||n reghopmaybe3|||n reginclass||| reginitcolors||5.006000| reginsert||| regmatch||| regnext||5.005000| regpiece||| regpposixcc||| regprop||| regrepeat||| regtail_study||| regtail||| regtry||| reguni||| regwhite|||n reg||| repeatcpy||| report_evil_fh||| report_uninit||| require_pv||5.006000| require_tie_mod||| restore_magic||| rninstr||| rsignal_restore||| rsignal_save||| rsignal_state||5.004000| rsignal||5.004000| run_body||| run_user_filter||| runops_debug||5.005000| runops_standard||5.005000| rvpv_dup||| rxres_free||| rxres_restore||| rxres_save||| safesyscalloc||5.006000|n safesysfree||5.006000|n safesysmalloc||5.006000|n safesysrealloc||5.006000|n same_dirent||| save_I16||5.004000| save_I32||| save_I8||5.006000| save_adelete||5.011000| save_aelem||5.004050| save_alloc||5.006000| save_aptr||| save_ary||| save_bool||5.008001| save_clearsv||| save_delete||| save_destructor_x||5.006000| save_destructor||5.006000| save_freeop||| save_freepv||| save_freesv||| save_generic_pvref||5.006001| save_generic_svref||5.005030| save_gp||5.004000| save_hash||| save_hek_flags|||n save_helem_flags||5.011000| save_helem||5.004050| save_hints||| save_hptr||| save_int||| save_item||| save_iv||5.005000| save_lines||| save_list||| save_long||| save_magic||| save_mortalizesv||5.007001| save_nogv||| save_op||| save_padsv_and_mortalize||5.011000| save_pptr||| save_pushi32ptr||| save_pushptri32ptr||| save_pushptrptr||| save_pushptr||5.011000| save_re_context||5.006000| save_scalar_at||| save_scalar||| save_set_svflags||5.009000| save_shared_pvref||5.007003| save_sptr||| save_svref||| save_vptr||5.006000| savepvn||| savepvs||5.009003| savepv||| savesharedpvn||5.009005| savesharedpv||5.007003| savestack_grow_cnt||5.008001| savestack_grow||| savesvpv||5.009002| sawparens||| scalar_mod_type|||n scalarboolean||| scalarkids||| scalarseq||| scalarvoid||| scalar||| scan_bin||5.006000| scan_commit||| scan_const||| scan_formline||| scan_heredoc||| scan_hex||| scan_ident||| scan_inputsymbol||| scan_num||5.007001| scan_oct||| scan_pat||| scan_str||| scan_subst||| scan_trans||| scan_version||5.009001| scan_vstring||5.009005| scan_word||| scope||| screaminstr||5.005000| search_const||| seed||5.008001| sequence_num||| sequence_tail||| sequence||| set_context||5.006000|n set_numeric_local||5.006000| set_numeric_radix||5.006000| set_numeric_standard||5.006000| setdefout||| share_hek_flags||| share_hek||5.004000| si_dup||| sighandler|||n simplify_sort||| skipspace0||| skipspace1||| skipspace2||| skipspace||| softref2xv||| sortcv_stacked||| sortcv_xsub||| sortcv||| sortsv_flags||5.009003| sortsv||5.007003| space_join_names_mortal||| ss_dup||| stack_grow||| start_force||| start_glob||| start_subparse||5.004000| stashpv_hvname_match||5.011000| stdize_locale||| store_cop_label||| strEQ||| strGE||| strGT||| strLE||| strLT||| strNE||| str_to_version||5.006000| strip_return||| strnEQ||| strnNE||| study_chunk||| sub_crush_depth||| sublex_done||| sublex_push||| sublex_start||| sv_2bool||| sv_2cv||| sv_2io||| sv_2iuv_common||| sv_2iuv_non_preserve||| sv_2iv_flags||5.009001| sv_2iv||| sv_2mortal||| sv_2num||| sv_2nv||| sv_2pv_flags|5.007002||p sv_2pv_nolen|5.006000||p sv_2pvbyte_nolen|5.006000||p sv_2pvbyte|5.006000||p sv_2pvutf8_nolen||5.006000| sv_2pvutf8||5.006000| sv_2pv||| sv_2uv_flags||5.009001| sv_2uv|5.004000||p sv_add_arena||| sv_add_backref||| sv_backoff||| sv_bless||| sv_cat_decode||5.008001| sv_catpv_mg|5.004050||p sv_catpvf_mg_nocontext|||pvn sv_catpvf_mg|5.006000|5.004000|pv sv_catpvf_nocontext|||vn sv_catpvf||5.004000|v sv_catpvn_flags||5.007002| sv_catpvn_mg|5.004050||p sv_catpvn_nomg|5.007002||p sv_catpvn||| sv_catpvs|5.009003||p sv_catpv||| sv_catsv_flags||5.007002| sv_catsv_mg|5.004050||p sv_catsv_nomg|5.007002||p sv_catsv||| sv_catxmlpvn||| sv_catxmlsv||| sv_chop||| sv_clean_all||| sv_clean_objs||| sv_clear||| sv_cmp_locale||5.004000| sv_cmp||| sv_collxfrm||| sv_compile_2op||5.008001| sv_copypv||5.007003| sv_dec||| sv_del_backref||| sv_derived_from||5.004000| sv_destroyable||5.010000| sv_does||5.009004| sv_dump||| sv_dup_inc_multiple||| sv_dup||| sv_eq||| sv_exp_grow||| sv_force_normal_flags||5.007001| sv_force_normal||5.006000| sv_free2||| sv_free_arenas||| sv_free||| sv_gets||5.004000| sv_grow||| sv_i_ncmp||| sv_inc||| sv_insert_flags||5.011000| sv_insert||| sv_isa||| sv_isobject||| sv_iv||5.005000| sv_kill_backrefs||| sv_len_utf8||5.006000| sv_len||| sv_magic_portable|5.011000|5.004000|p sv_magicext||5.007003| sv_magic||| sv_mortalcopy||| sv_ncmp||| sv_newmortal||| sv_newref||| sv_nolocking||5.007003| sv_nosharing||5.007003| sv_nounlocking||| sv_nv||5.005000| sv_peek||5.005000| sv_pos_b2u_midway||| sv_pos_b2u||5.006000| sv_pos_u2b_cached||| sv_pos_u2b_forwards|||n sv_pos_u2b_midway|||n sv_pos_u2b||5.006000| sv_pvbyten_force||5.006000| sv_pvbyten||5.006000| sv_pvbyte||5.006000| sv_pvn_force_flags|5.007002||p sv_pvn_force||| sv_pvn_nomg|5.007003|5.005000|p sv_pvn||5.005000| sv_pvutf8n_force||5.006000| sv_pvutf8n||5.006000| sv_pvutf8||5.006000| sv_pv||5.006000| sv_recode_to_utf8||5.007003| sv_reftype||| sv_release_COW||| sv_replace||| sv_report_used||| sv_reset||| sv_rvweaken||5.006000| sv_setiv_mg|5.004050||p sv_setiv||| sv_setnv_mg|5.006000||p sv_setnv||| sv_setpv_mg|5.004050||p sv_setpvf_mg_nocontext|||pvn sv_setpvf_mg|5.006000|5.004000|pv sv_setpvf_nocontext|||vn sv_setpvf||5.004000|v sv_setpviv_mg||5.008001| sv_setpviv||5.008001| sv_setpvn_mg|5.004050||p sv_setpvn||| sv_setpvs|5.009004||p sv_setpv||| sv_setref_iv||| sv_setref_nv||| sv_setref_pvn||| sv_setref_pv||| sv_setref_uv||5.007001| sv_setsv_cow||| sv_setsv_flags||5.007002| sv_setsv_mg|5.004050||p sv_setsv_nomg|5.007002||p sv_setsv||| sv_setuv_mg|5.004050||p sv_setuv|5.004000||p sv_tainted||5.004000| sv_taint||5.004000| sv_true||5.005000| sv_unglob||| sv_uni_display||5.007003| sv_unmagic||| sv_unref_flags||5.007001| sv_unref||| sv_untaint||5.004000| sv_upgrade||| sv_usepvn_flags||5.009004| sv_usepvn_mg|5.004050||p sv_usepvn||| sv_utf8_decode||5.006000| sv_utf8_downgrade||5.006000| sv_utf8_encode||5.006000| sv_utf8_upgrade_flags_grow||5.011000| sv_utf8_upgrade_flags||5.007002| sv_utf8_upgrade_nomg||5.007002| sv_utf8_upgrade||5.007001| sv_uv|5.005000||p sv_vcatpvf_mg|5.006000|5.004000|p sv_vcatpvfn||5.004000| sv_vcatpvf|5.006000|5.004000|p sv_vsetpvf_mg|5.006000|5.004000|p sv_vsetpvfn||5.004000| sv_vsetpvf|5.006000|5.004000|p sv_xmlpeek||| svtype||| swallow_bom||| swap_match_buff||| swash_fetch||5.007002| swash_get||| swash_init||5.006000| sys_init3||5.010000|n sys_init||5.010000|n sys_intern_clear||| sys_intern_dup||| sys_intern_init||| sys_term||5.010000|n taint_env||| taint_proper||| tmps_grow||5.006000| toLOWER||| toUPPER||| to_byte_substr||| to_uni_fold||5.007003| to_uni_lower_lc||5.006000| to_uni_lower||5.007003| to_uni_title_lc||5.006000| to_uni_title||5.007003| to_uni_upper_lc||5.006000| to_uni_upper||5.007003| to_utf8_case||5.007003| to_utf8_fold||5.007003| to_utf8_lower||5.007003| to_utf8_substr||| to_utf8_title||5.007003| to_utf8_upper||5.007003| token_free||| token_getmad||| tokenize_use||| tokeq||| tokereport||| too_few_arguments||| too_many_arguments||| uiv_2buf|||n unlnk||| unpack_rec||| unpack_str||5.007003| unpackstring||5.008001| unshare_hek_or_pvn||| unshare_hek||| unsharepvn||5.004000| unwind_handler_stack||| update_debugger_info||| upg_version||5.009005| usage||| utf16_to_utf8_reversed||5.006001| utf16_to_utf8||5.006001| utf8_distance||5.006000| utf8_hop||5.006000| utf8_length||5.007001| utf8_mg_pos_cache_update||| utf8_to_bytes||5.006001| utf8_to_uvchr||5.007001| utf8_to_uvuni||5.007001| utf8n_to_uvchr||| utf8n_to_uvuni||5.007001| utilize||| uvchr_to_utf8_flags||5.007003| uvchr_to_utf8||| uvuni_to_utf8_flags||5.007003| uvuni_to_utf8||5.007001| validate_suid||| varname||| vcmp||5.009000| vcroak||5.006000| vdeb||5.007003| vdie_common||| vdie_croak_common||| vdie||| vform||5.006000| visit||| vivify_defelem||| vivify_ref||| vload_module|5.006000||p vmess||5.006000| vnewSVpvf|5.006000|5.004000|p vnormal||5.009002| vnumify||5.009000| vstringify||5.009000| vverify||5.009003| vwarner||5.006000| vwarn||5.006000| wait4pid||| warn_nocontext|||vn warner_nocontext|||vn warner|5.006000|5.004000|pv warn|||v watch||| whichsig||| write_no_mem||| write_to_stderr||| xmldump_all||| xmldump_attr||| xmldump_eval||| xmldump_form||| xmldump_indent|||v xmldump_packsubs||| xmldump_sub||| xmldump_vindent||| yyerror||| yylex||| yyparse||| yywarn||| ); if (exists $opt{'list-unsupported'}) { my $f; for $f (sort { lc $a cmp lc $b } keys %API) { next unless $API{$f}{todo}; print "$f ", '.'x(40-length($f)), " ", format_version($API{$f}{todo}), "\n"; } exit 0; } # Scan for possible replacement candidates my(%replace, %need, %hints, %warnings, %depends); my $replace = 0; my($hint, $define, $function); sub find_api { my $code = shift; $code =~ s{ / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]*) | "[^"\\]*(?:\\.[^"\\]*)*" | '[^'\\]*(?:\\.[^'\\]*)*' }{}egsx; grep { exists $API{$_} } $code =~ /(\w+)/mg; } while () { if ($hint) { my $h = $hint->[0] eq 'Hint' ? \%hints : \%warnings; if (m{^\s*\*\s(.*?)\s*$}) { for (@{$hint->[1]}) { $h->{$_} ||= ''; # suppress warning with older perls $h->{$_} .= "$1\n"; } } else { undef $hint } } $hint = [$1, [split /,?\s+/, $2]] if m{^\s*$rccs\s+(Hint|Warning):\s+(\w+(?:,?\s+\w+)*)\s*$}; if ($define) { if ($define->[1] =~ /\\$/) { $define->[1] .= $_; } else { if (exists $API{$define->[0]} && $define->[1] !~ /^DPPP_\(/) { my @n = find_api($define->[1]); push @{$depends{$define->[0]}}, @n if @n } undef $define; } } $define = [$1, $2] if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(.*)}; if ($function) { if (/^}/) { if (exists $API{$function->[0]}) { my @n = find_api($function->[1]); push @{$depends{$function->[0]}}, @n if @n } undef $function; } else { $function->[1] .= $_; } } $function = [$1, ''] if m{^DPPP_\(my_(\w+)\)}; $replace = $1 if m{^\s*$rccs\s+Replace:\s+(\d+)\s+$rcce\s*$}; $replace{$2} = $1 if $replace and m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+)}; $replace{$2} = $1 if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+).*$rccs\s+Replace\s+$rcce}; $replace{$1} = $2 if m{^\s*$rccs\s+Replace (\w+) with (\w+)\s+$rcce\s*$}; if (m{^\s*$rccs\s+(\w+(\s*,\s*\w+)*)\s+depends\s+on\s+(\w+(\s*,\s*\w+)*)\s+$rcce\s*$}) { my @deps = map { s/\s+//g; $_ } split /,/, $3; my $d; for $d (map { s/\s+//g; $_ } split /,/, $1) { push @{$depends{$d}}, @deps; } } $need{$1} = 1 if m{^#if\s+defined\(NEED_(\w+)(?:_GLOBAL)?\)}; } for (values %depends) { my %s; $_ = [sort grep !$s{$_}++, @$_]; } if (exists $opt{'api-info'}) { my $f; my $count = 0; my $match = $opt{'api-info'} =~ m!^/(.*)/$! ? $1 : "^\Q$opt{'api-info'}\E\$"; for $f (sort { lc $a cmp lc $b } keys %API) { next unless $f =~ /$match/; print "\n=== $f ===\n\n"; my $info = 0; if ($API{$f}{base} || $API{$f}{todo}) { my $base = format_version($API{$f}{base} || $API{$f}{todo}); print "Supported at least starting from perl-$base.\n"; $info++; } if ($API{$f}{provided}) { my $todo = $API{$f}{todo} ? format_version($API{$f}{todo}) : "5.003"; print "Support by $ppport provided back to perl-$todo.\n"; print "Support needs to be explicitly requested by NEED_$f.\n" if exists $need{$f}; print "Depends on: ", join(', ', @{$depends{$f}}), ".\n" if exists $depends{$f}; print "\n$hints{$f}" if exists $hints{$f}; print "\nWARNING:\n$warnings{$f}" if exists $warnings{$f}; $info++; } print "No portability information available.\n" unless $info; $count++; } $count or print "Found no API matching '$opt{'api-info'}'."; print "\n"; exit 0; } if (exists $opt{'list-provided'}) { my $f; for $f (sort { lc $a cmp lc $b } keys %API) { next unless $API{$f}{provided}; my @flags; push @flags, 'explicit' if exists $need{$f}; push @flags, 'depend' if exists $depends{$f}; push @flags, 'hint' if exists $hints{$f}; push @flags, 'warning' if exists $warnings{$f}; my $flags = @flags ? ' ['.join(', ', @flags).']' : ''; print "$f$flags\n"; } exit 0; } my @files; my @srcext = qw( .xs .c .h .cc .cpp -c.inc -xs.inc ); my $srcext = join '|', map { quotemeta $_ } @srcext; if (@ARGV) { my %seen; for (@ARGV) { if (-e) { if (-f) { push @files, $_ unless $seen{$_}++; } else { warn "'$_' is not a file.\n" } } else { my @new = grep { -f } glob $_ or warn "'$_' does not exist.\n"; push @files, grep { !$seen{$_}++ } @new; } } } else { eval { require File::Find; File::Find::find(sub { $File::Find::name =~ /($srcext)$/i and push @files, $File::Find::name; }, '.'); }; if ($@) { @files = map { glob "*$_" } @srcext; } } if (!@ARGV || $opt{filter}) { my(@in, @out); my %xsc = map { /(.*)\.xs$/ ? ("$1.c" => 1, "$1.cc" => 1) : () } @files; for (@files) { my $out = exists $xsc{$_} || /\b\Q$ppport\E$/i || !/($srcext)$/i; push @{ $out ? \@out : \@in }, $_; } if (@ARGV && @out) { warning("Skipping the following files (use --nofilter to avoid this):\n| ", join "\n| ", @out); } @files = @in; } die "No input files given!\n" unless @files; my(%files, %global, %revreplace); %revreplace = reverse %replace; my $filename; my $patch_opened = 0; for $filename (@files) { unless (open IN, "<$filename") { warn "Unable to read from $filename: $!\n"; next; } info("Scanning $filename ..."); my $c = do { local $/; }; close IN; my %file = (orig => $c, changes => 0); # Temporarily remove C/XS comments and strings from the code my @ccom; $c =~ s{ ( ^$HS*\#$HS*include\b[^\r\n]+\b(?:\Q$ppport\E|XSUB\.h)\b[^\r\n]* | ^$HS*\#$HS*(?:define|elif|if(?:def)?)\b[^\r\n]* ) | ( ^$HS*\#[^\r\n]* | "[^"\\]*(?:\\.[^"\\]*)*" | '[^'\\]*(?:\\.[^'\\]*)*' | / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]* ) ) }{ defined $2 and push @ccom, $2; defined $1 ? $1 : "$ccs$#ccom$cce" }mgsex; $file{ccom} = \@ccom; $file{code} = $c; $file{has_inc_ppport} = $c =~ /^$HS*#$HS*include[^\r\n]+\b\Q$ppport\E\b/m; my $func; for $func (keys %API) { my $match = $func; $match .= "|$revreplace{$func}" if exists $revreplace{$func}; if ($c =~ /\b(?:Perl_)?($match)\b/) { $file{uses_replace}{$1}++ if exists $revreplace{$func} && $1 eq $revreplace{$func}; $file{uses_Perl}{$func}++ if $c =~ /\bPerl_$func\b/; if (exists $API{$func}{provided}) { $file{uses_provided}{$func}++; if (!exists $API{$func}{base} || $API{$func}{base} > $opt{'compat-version'}) { $file{uses}{$func}++; my @deps = rec_depend($func); if (@deps) { $file{uses_deps}{$func} = \@deps; for (@deps) { $file{uses}{$_} = 0 unless exists $file{uses}{$_}; } } for ($func, @deps) { $file{needs}{$_} = 'static' if exists $need{$_}; } } } if (exists $API{$func}{todo} && $API{$func}{todo} > $opt{'compat-version'}) { if ($c =~ /\b$func\b/) { $file{uses_todo}{$func}++; } } } } while ($c =~ /^$HS*#$HS*define$HS+(NEED_(\w+?)(_GLOBAL)?)\b/mg) { if (exists $need{$2}) { $file{defined $3 ? 'needed_global' : 'needed_static'}{$2}++; } else { warning("Possibly wrong #define $1 in $filename") } } for (qw(uses needs uses_todo needed_global needed_static)) { for $func (keys %{$file{$_}}) { push @{$global{$_}{$func}}, $filename; } } $files{$filename} = \%file; } # Globally resolve NEED_'s my $need; for $need (keys %{$global{needs}}) { if (@{$global{needs}{$need}} > 1) { my @targets = @{$global{needs}{$need}}; my @t = grep $files{$_}{needed_global}{$need}, @targets; @targets = @t if @t; @t = grep /\.xs$/i, @targets; @targets = @t if @t; my $target = shift @targets; $files{$target}{needs}{$need} = 'global'; for (@{$global{needs}{$need}}) { $files{$_}{needs}{$need} = 'extern' if $_ ne $target; } } } for $filename (@files) { exists $files{$filename} or next; info("=== Analyzing $filename ==="); my %file = %{$files{$filename}}; my $func; my $c = $file{code}; my $warnings = 0; for $func (sort keys %{$file{uses_Perl}}) { if ($API{$func}{varargs}) { unless ($API{$func}{nothxarg}) { my $changes = ($c =~ s{\b(Perl_$func\s*\(\s*)(?!aTHX_?)(\)|[^\s)]*\))} { $1 . ($2 eq ')' ? 'aTHX' : 'aTHX_ ') . $2 }ge); if ($changes) { warning("Doesn't pass interpreter argument aTHX to Perl_$func"); $file{changes} += $changes; } } } else { warning("Uses Perl_$func instead of $func"); $file{changes} += ($c =~ s{\bPerl_$func(\s*)\((\s*aTHX_?)?\s*} {$func$1(}g); } } for $func (sort keys %{$file{uses_replace}}) { warning("Uses $func instead of $replace{$func}"); $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g); } for $func (sort keys %{$file{uses_provided}}) { if ($file{uses}{$func}) { if (exists $file{uses_deps}{$func}) { diag("Uses $func, which depends on ", join(', ', @{$file{uses_deps}{$func}})); } else { diag("Uses $func"); } } $warnings += hint($func); } unless ($opt{quiet}) { for $func (sort keys %{$file{uses_todo}}) { print "*** WARNING: Uses $func, which may not be portable below perl ", format_version($API{$func}{todo}), ", even with '$ppport'\n"; $warnings++; } } for $func (sort keys %{$file{needed_static}}) { my $message = ''; if (not exists $file{uses}{$func}) { $message = "No need to define NEED_$func if $func is never used"; } elsif (exists $file{needs}{$func} && $file{needs}{$func} ne 'static') { $message = "No need to define NEED_$func when already needed globally"; } if ($message) { diag($message); $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_$func\b.*$LF//mg); } } for $func (sort keys %{$file{needed_global}}) { my $message = ''; if (not exists $global{uses}{$func}) { $message = "No need to define NEED_${func}_GLOBAL if $func is never used"; } elsif (exists $file{needs}{$func}) { if ($file{needs}{$func} eq 'extern') { $message = "No need to define NEED_${func}_GLOBAL when already needed globally"; } elsif ($file{needs}{$func} eq 'static') { $message = "No need to define NEED_${func}_GLOBAL when only used in this file"; } } if ($message) { diag($message); $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_${func}_GLOBAL\b.*$LF//mg); } } $file{needs_inc_ppport} = keys %{$file{uses}}; if ($file{needs_inc_ppport}) { my $pp = ''; for $func (sort keys %{$file{needs}}) { my $type = $file{needs}{$func}; next if $type eq 'extern'; my $suffix = $type eq 'global' ? '_GLOBAL' : ''; unless (exists $file{"needed_$type"}{$func}) { if ($type eq 'global') { diag("Files [@{$global{needs}{$func}}] need $func, adding global request"); } else { diag("File needs $func, adding static request"); } $pp .= "#define NEED_$func$suffix\n"; } } if ($pp && ($c =~ s/^(?=$HS*#$HS*define$HS+NEED_\w+)/$pp/m)) { $pp = ''; $file{changes}++; } unless ($file{has_inc_ppport}) { diag("Needs to include '$ppport'"); $pp .= qq(#include "$ppport"\n) } if ($pp) { $file{changes} += ($c =~ s/^($HS*#$HS*define$HS+NEED_\w+.*?)^/$1$pp/ms) || ($c =~ s/^(?=$HS*#$HS*include.*\Q$ppport\E)/$pp/m) || ($c =~ s/^($HS*#$HS*include.*XSUB.*\s*?)^/$1$pp/m) || ($c =~ s/^/$pp/); } } else { if ($file{has_inc_ppport}) { diag("No need to include '$ppport'"); $file{changes} += ($c =~ s/^$HS*?#$HS*include.*\Q$ppport\E.*?$LF//m); } } # put back in our C comments my $ix; my $cppc = 0; my @ccom = @{$file{ccom}}; for $ix (0 .. $#ccom) { if (!$opt{cplusplus} && $ccom[$ix] =~ s!^//!!) { $cppc++; $file{changes} += $c =~ s/$rccs$ix$rcce/$ccs$ccom[$ix] $cce/; } else { $c =~ s/$rccs$ix$rcce/$ccom[$ix]/; } } if ($cppc) { my $s = $cppc != 1 ? 's' : ''; warning("Uses $cppc C++ style comment$s, which is not portable"); } my $s = $warnings != 1 ? 's' : ''; my $warn = $warnings ? " ($warnings warning$s)" : ''; info("Analysis completed$warn"); if ($file{changes}) { if (exists $opt{copy}) { my $newfile = "$filename$opt{copy}"; if (-e $newfile) { error("'$newfile' already exists, refusing to write copy of '$filename'"); } else { local *F; if (open F, ">$newfile") { info("Writing copy of '$filename' with changes to '$newfile'"); print F $c; close F; } else { error("Cannot open '$newfile' for writing: $!"); } } } elsif (exists $opt{patch} || $opt{changes}) { if (exists $opt{patch}) { unless ($patch_opened) { if (open PATCH, ">$opt{patch}") { $patch_opened = 1; } else { error("Cannot open '$opt{patch}' for writing: $!"); delete $opt{patch}; $opt{changes} = 1; goto fallback; } } mydiff(\*PATCH, $filename, $c); } else { fallback: info("Suggested changes:"); mydiff(\*STDOUT, $filename, $c); } } else { my $s = $file{changes} == 1 ? '' : 's'; info("$file{changes} potentially required change$s detected"); } } else { info("Looks good"); } } close PATCH if $patch_opened; exit 0; sub try_use { eval "use @_;"; return $@ eq '' } sub mydiff { local *F = shift; my($file, $str) = @_; my $diff; if (exists $opt{diff}) { $diff = run_diff($opt{diff}, $file, $str); } if (!defined $diff and try_use('Text::Diff')) { $diff = Text::Diff::diff($file, \$str, { STYLE => 'Unified' }); $diff = <
$tmp") { print F $str; close F; if (open F, "$prog $file $tmp |") { while () { s/\Q$tmp\E/$file.patched/; $diff .= $_; } close F; unlink $tmp; return $diff; } unlink $tmp; } else { error("Cannot open '$tmp' for writing: $!"); } return undef; } sub rec_depend { my($func, $seen) = @_; return () unless exists $depends{$func}; $seen = {%{$seen||{}}}; return () if $seen->{$func}++; my %s; grep !$s{$_}++, map { ($_, rec_depend($_, $seen)) } @{$depends{$func}}; } sub parse_version { my $ver = shift; if ($ver =~ /^(\d+)\.(\d+)\.(\d+)$/) { return ($1, $2, $3); } elsif ($ver !~ /^\d+\.[\d_]+$/) { die "cannot parse version '$ver'\n"; } $ver =~ s/_//g; $ver =~ s/$/000000/; my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/; $v = int $v; $s = int $s; if ($r < 5 || ($r == 5 && $v < 6)) { if ($s % 10) { die "cannot parse version '$ver'\n"; } } return ($r, $v, $s); } sub format_version { my $ver = shift; $ver =~ s/$/000000/; my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/; $v = int $v; $s = int $s; if ($r < 5 || ($r == 5 && $v < 6)) { if ($s % 10) { die "invalid version '$ver'\n"; } $s /= 10; $ver = sprintf "%d.%03d", $r, $v; $s > 0 and $ver .= sprintf "_%02d", $s; return $ver; } return sprintf "%d.%d.%d", $r, $v, $s; } sub info { $opt{quiet} and return; print @_, "\n"; } sub diag { $opt{quiet} and return; $opt{diag} and print @_, "\n"; } sub warning { $opt{quiet} and return; print "*** ", @_, "\n"; } sub error { print "*** ERROR: ", @_, "\n"; } my %given_hints; my %given_warnings; sub hint { $opt{quiet} and return; my $func = shift; my $rv = 0; if (exists $warnings{$func} && !$given_warnings{$func}++) { my $warn = $warnings{$func}; $warn =~ s!^!*** !mg; print "*** WARNING: $func\n", $warn; $rv++; } if ($opt{hints} && exists $hints{$func} && !$given_hints{$func}++) { my $hint = $hints{$func}; $hint =~ s/^/ /mg; print " --- hint for $func ---\n", $hint; } $rv; } sub usage { my($usage) = do { local(@ARGV,$/)=($0); <> } =~ /^=head\d$HS+SYNOPSIS\s*^(.*?)\s*^=/ms; my %M = ( 'I' => '*' ); $usage =~ s/^\s*perl\s+\S+/$^X $0/; $usage =~ s/([A-Z])<([^>]+)>/$M{$1}$2$M{$1}/g; print < }; my($copy) = $self =~ /^=head\d\s+COPYRIGHT\s*^(.*?)^=\w+/ms; $copy =~ s/^(?=\S+)/ /gms; $self =~ s/^$HS+Do NOT edit.*?(?=^-)/$copy/ms; $self =~ s/^SKIP.*(?=^__DATA__)/SKIP if (\@ARGV && \$ARGV[0] eq '--unstrip') { eval { require Devel::PPPort }; \$@ and die "Cannot require Devel::PPPort, please install.\\n"; if (eval \$Devel::PPPort::VERSION < $VERSION) { die "$0 was originally generated with Devel::PPPort $VERSION.\\n" . "Your Devel::PPPort is only version \$Devel::PPPort::VERSION.\\n" . "Please install a newer version, or --unstrip will not work.\\n"; } Devel::PPPort::WriteFile(\$0); exit 0; } print <$0" or die "cannot strip $0: $!\n"; print OUT "$pl$c\n"; exit 0; } __DATA__ */ #ifndef _P_P_PORTABILITY_H_ #define _P_P_PORTABILITY_H_ #ifndef DPPP_NAMESPACE # define DPPP_NAMESPACE DPPP_ #endif #define DPPP_CAT2(x,y) CAT2(x,y) #define DPPP_(name) DPPP_CAT2(DPPP_NAMESPACE, name) #ifndef PERL_REVISION # if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION)) # define PERL_PATCHLEVEL_H_IMPLICIT # include # endif # if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL))) # include # endif # ifndef PERL_REVISION # define PERL_REVISION (5) /* Replace: 1 */ # define PERL_VERSION PATCHLEVEL # define PERL_SUBVERSION SUBVERSION /* Replace PERL_PATCHLEVEL with PERL_VERSION */ /* Replace: 0 */ # endif #endif #define _dpppDEC2BCD(dec) ((((dec)/100)<<8)|((((dec)%100)/10)<<4)|((dec)%10)) #define PERL_BCDVERSION ((_dpppDEC2BCD(PERL_REVISION)<<24)|(_dpppDEC2BCD(PERL_VERSION)<<12)|_dpppDEC2BCD(PERL_SUBVERSION)) /* It is very unlikely that anyone will try to use this with Perl 6 (or greater), but who knows. */ #if PERL_REVISION != 5 # error ppport.h only works with Perl version 5 #endif /* PERL_REVISION != 5 */ #ifndef dTHR # define dTHR dNOOP #endif #ifndef dTHX # define dTHX dNOOP #endif #ifndef dTHXa # define dTHXa(x) dNOOP #endif #ifndef pTHX # define pTHX void #endif #ifndef pTHX_ # define pTHX_ #endif #ifndef aTHX # define aTHX #endif #ifndef aTHX_ # define aTHX_ #endif #if (PERL_BCDVERSION < 0x5006000) # ifdef USE_THREADS # define aTHXR thr # define aTHXR_ thr, # else # define aTHXR # define aTHXR_ # endif # define dTHXR dTHR #else # define aTHXR aTHX # define aTHXR_ aTHX_ # define dTHXR dTHX #endif #ifndef dTHXoa # define dTHXoa(x) dTHXa(x) #endif #ifdef I_LIMITS # include #endif #ifndef PERL_UCHAR_MIN # define PERL_UCHAR_MIN ((unsigned char)0) #endif #ifndef PERL_UCHAR_MAX # ifdef UCHAR_MAX # define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX) # else # ifdef MAXUCHAR # define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR) # else # define PERL_UCHAR_MAX ((unsigned char)~(unsigned)0) # endif # endif #endif #ifndef PERL_USHORT_MIN # define PERL_USHORT_MIN ((unsigned short)0) #endif #ifndef PERL_USHORT_MAX # ifdef USHORT_MAX # define PERL_USHORT_MAX ((unsigned short)USHORT_MAX) # else # ifdef MAXUSHORT # define PERL_USHORT_MAX ((unsigned short)MAXUSHORT) # else # ifdef USHRT_MAX # define PERL_USHORT_MAX ((unsigned short)USHRT_MAX) # else # define PERL_USHORT_MAX ((unsigned short)~(unsigned)0) # endif # endif # endif #endif #ifndef PERL_SHORT_MAX # ifdef SHORT_MAX # define PERL_SHORT_MAX ((short)SHORT_MAX) # else # ifdef MAXSHORT /* Often used in */ # define PERL_SHORT_MAX ((short)MAXSHORT) # else # ifdef SHRT_MAX # define PERL_SHORT_MAX ((short)SHRT_MAX) # else # define PERL_SHORT_MAX ((short) (PERL_USHORT_MAX >> 1)) # endif # endif # endif #endif #ifndef PERL_SHORT_MIN # ifdef SHORT_MIN # define PERL_SHORT_MIN ((short)SHORT_MIN) # else # ifdef MINSHORT # define PERL_SHORT_MIN ((short)MINSHORT) # else # ifdef SHRT_MIN # define PERL_SHORT_MIN ((short)SHRT_MIN) # else # define PERL_SHORT_MIN (-PERL_SHORT_MAX - ((3 & -1) == 3)) # endif # endif # endif #endif #ifndef PERL_UINT_MAX # ifdef UINT_MAX # define PERL_UINT_MAX ((unsigned int)UINT_MAX) # else # ifdef MAXUINT # define PERL_UINT_MAX ((unsigned int)MAXUINT) # else # define PERL_UINT_MAX (~(unsigned int)0) # endif # endif #endif #ifndef PERL_UINT_MIN # define PERL_UINT_MIN ((unsigned int)0) #endif #ifndef PERL_INT_MAX # ifdef INT_MAX # define PERL_INT_MAX ((int)INT_MAX) # else # ifdef MAXINT /* Often used in */ # define PERL_INT_MAX ((int)MAXINT) # else # define PERL_INT_MAX ((int)(PERL_UINT_MAX >> 1)) # endif # endif #endif #ifndef PERL_INT_MIN # ifdef INT_MIN # define PERL_INT_MIN ((int)INT_MIN) # else # ifdef MININT # define PERL_INT_MIN ((int)MININT) # else # define PERL_INT_MIN (-PERL_INT_MAX - ((3 & -1) == 3)) # endif # endif #endif #ifndef PERL_ULONG_MAX # ifdef ULONG_MAX # define PERL_ULONG_MAX ((unsigned long)ULONG_MAX) # else # ifdef MAXULONG # define PERL_ULONG_MAX ((unsigned long)MAXULONG) # else # define PERL_ULONG_MAX (~(unsigned long)0) # endif # endif #endif #ifndef PERL_ULONG_MIN # define PERL_ULONG_MIN ((unsigned long)0L) #endif #ifndef PERL_LONG_MAX # ifdef LONG_MAX # define PERL_LONG_MAX ((long)LONG_MAX) # else # ifdef MAXLONG # define PERL_LONG_MAX ((long)MAXLONG) # else # define PERL_LONG_MAX ((long) (PERL_ULONG_MAX >> 1)) # endif # endif #endif #ifndef PERL_LONG_MIN # ifdef LONG_MIN # define PERL_LONG_MIN ((long)LONG_MIN) # else # ifdef MINLONG # define PERL_LONG_MIN ((long)MINLONG) # else # define PERL_LONG_MIN (-PERL_LONG_MAX - ((3 & -1) == 3)) # endif # endif #endif #if defined(HAS_QUAD) && (defined(convex) || defined(uts)) # ifndef PERL_UQUAD_MAX # ifdef ULONGLONG_MAX # define PERL_UQUAD_MAX ((unsigned long long)ULONGLONG_MAX) # else # ifdef MAXULONGLONG # define PERL_UQUAD_MAX ((unsigned long long)MAXULONGLONG) # else # define PERL_UQUAD_MAX (~(unsigned long long)0) # endif # endif # endif # ifndef PERL_UQUAD_MIN # define PERL_UQUAD_MIN ((unsigned long long)0L) # endif # ifndef PERL_QUAD_MAX # ifdef LONGLONG_MAX # define PERL_QUAD_MAX ((long long)LONGLONG_MAX) # else # ifdef MAXLONGLONG # define PERL_QUAD_MAX ((long long)MAXLONGLONG) # else # define PERL_QUAD_MAX ((long long) (PERL_UQUAD_MAX >> 1)) # endif # endif # endif # ifndef PERL_QUAD_MIN # ifdef LONGLONG_MIN # define PERL_QUAD_MIN ((long long)LONGLONG_MIN) # else # ifdef MINLONGLONG # define PERL_QUAD_MIN ((long long)MINLONGLONG) # else # define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3)) # endif # endif # endif #endif /* This is based on code from 5.003 perl.h */ #ifdef HAS_QUAD # ifdef cray #ifndef IVTYPE # define IVTYPE int #endif #ifndef IV_MIN # define IV_MIN PERL_INT_MIN #endif #ifndef IV_MAX # define IV_MAX PERL_INT_MAX #endif #ifndef UV_MIN # define UV_MIN PERL_UINT_MIN #endif #ifndef UV_MAX # define UV_MAX PERL_UINT_MAX #endif # ifdef INTSIZE #ifndef IVSIZE # define IVSIZE INTSIZE #endif # endif # else # if defined(convex) || defined(uts) #ifndef IVTYPE # define IVTYPE long long #endif #ifndef IV_MIN # define IV_MIN PERL_QUAD_MIN #endif #ifndef IV_MAX # define IV_MAX PERL_QUAD_MAX #endif #ifndef UV_MIN # define UV_MIN PERL_UQUAD_MIN #endif #ifndef UV_MAX # define UV_MAX PERL_UQUAD_MAX #endif # ifdef LONGLONGSIZE #ifndef IVSIZE # define IVSIZE LONGLONGSIZE #endif # endif # else #ifndef IVTYPE # define IVTYPE long #endif #ifndef IV_MIN # define IV_MIN PERL_LONG_MIN #endif #ifndef IV_MAX # define IV_MAX PERL_LONG_MAX #endif #ifndef UV_MIN # define UV_MIN PERL_ULONG_MIN #endif #ifndef UV_MAX # define UV_MAX PERL_ULONG_MAX #endif # ifdef LONGSIZE #ifndef IVSIZE # define IVSIZE LONGSIZE #endif # endif # endif # endif #ifndef IVSIZE # define IVSIZE 8 #endif #ifndef PERL_QUAD_MIN # define PERL_QUAD_MIN IV_MIN #endif #ifndef PERL_QUAD_MAX # define PERL_QUAD_MAX IV_MAX #endif #ifndef PERL_UQUAD_MIN # define PERL_UQUAD_MIN UV_MIN #endif #ifndef PERL_UQUAD_MAX # define PERL_UQUAD_MAX UV_MAX #endif #else #ifndef IVTYPE # define IVTYPE long #endif #ifndef IV_MIN # define IV_MIN PERL_LONG_MIN #endif #ifndef IV_MAX # define IV_MAX PERL_LONG_MAX #endif #ifndef UV_MIN # define UV_MIN PERL_ULONG_MIN #endif #ifndef UV_MAX # define UV_MAX PERL_ULONG_MAX #endif #endif #ifndef IVSIZE # ifdef LONGSIZE # define IVSIZE LONGSIZE # else # define IVSIZE 4 /* A bold guess, but the best we can make. */ # endif #endif #ifndef UVTYPE # define UVTYPE unsigned IVTYPE #endif #ifndef UVSIZE # define UVSIZE IVSIZE #endif #ifndef sv_setuv # define sv_setuv(sv, uv) \ STMT_START { \ UV TeMpUv = uv; \ if (TeMpUv <= IV_MAX) \ sv_setiv(sv, TeMpUv); \ else \ sv_setnv(sv, (double)TeMpUv); \ } STMT_END #endif #ifndef newSVuv # define newSVuv(uv) ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv)) #endif #ifndef sv_2uv # define sv_2uv(sv) ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv))) #endif #ifndef SvUVX # define SvUVX(sv) ((UV)SvIVX(sv)) #endif #ifndef SvUVXx # define SvUVXx(sv) SvUVX(sv) #endif #ifndef SvUV # define SvUV(sv) (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv)) #endif #ifndef SvUVx # define SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv)) #endif /* Hint: sv_uv * Always use the SvUVx() macro instead of sv_uv(). */ #ifndef sv_uv # define sv_uv(sv) SvUVx(sv) #endif #if !defined(SvUOK) && defined(SvIOK_UV) # define SvUOK(sv) SvIOK_UV(sv) #endif #ifndef XST_mUV # define XST_mUV(i,v) (ST(i) = sv_2mortal(newSVuv(v)) ) #endif #ifndef XSRETURN_UV # define XSRETURN_UV(v) STMT_START { XST_mUV(0,v); XSRETURN(1); } STMT_END #endif #ifndef PUSHu # define PUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG; } STMT_END #endif #ifndef XPUSHu # define XPUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END #endif #ifdef HAS_MEMCMP #ifndef memNE # define memNE(s1,s2,l) (memcmp(s1,s2,l)) #endif #ifndef memEQ # define memEQ(s1,s2,l) (!memcmp(s1,s2,l)) #endif #else #ifndef memNE # define memNE(s1,s2,l) (bcmp(s1,s2,l)) #endif #ifndef memEQ # define memEQ(s1,s2,l) (!bcmp(s1,s2,l)) #endif #endif #ifndef MoveD # define MoveD(s,d,n,t) memmove((char*)(d),(char*)(s), (n) * sizeof(t)) #endif #ifndef CopyD # define CopyD(s,d,n,t) memcpy((char*)(d),(char*)(s), (n) * sizeof(t)) #endif #ifdef HAS_MEMSET #ifndef ZeroD # define ZeroD(d,n,t) memzero((char*)(d), (n) * sizeof(t)) #endif #else #ifndef ZeroD # define ZeroD(d,n,t) ((void)memzero((char*)(d), (n) * sizeof(t)), d) #endif #endif #ifndef PoisonWith # define PoisonWith(d,n,t,b) (void)memset((char*)(d), (U8)(b), (n) * sizeof(t)) #endif #ifndef PoisonNew # define PoisonNew(d,n,t) PoisonWith(d,n,t,0xAB) #endif #ifndef PoisonFree # define PoisonFree(d,n,t) PoisonWith(d,n,t,0xEF) #endif #ifndef Poison # define Poison(d,n,t) PoisonFree(d,n,t) #endif #ifndef Newx # define Newx(v,n,t) New(0,v,n,t) #endif #ifndef Newxc # define Newxc(v,n,t,c) Newc(0,v,n,t,c) #endif #ifndef Newxz # define Newxz(v,n,t) Newz(0,v,n,t) #endif #ifndef PERL_UNUSED_DECL # ifdef HASATTRIBUTE # if (defined(__GNUC__) && defined(__cplusplus)) || defined(__INTEL_COMPILER) # define PERL_UNUSED_DECL # else # define PERL_UNUSED_DECL __attribute__((unused)) # endif # else # define PERL_UNUSED_DECL # endif #endif #ifndef PERL_UNUSED_ARG # if defined(lint) && defined(S_SPLINT_S) /* www.splint.org */ # include # define PERL_UNUSED_ARG(x) NOTE(ARGUNUSED(x)) # else # define PERL_UNUSED_ARG(x) ((void)x) # endif #endif #ifndef PERL_UNUSED_VAR # define PERL_UNUSED_VAR(x) ((void)x) #endif #ifndef PERL_UNUSED_CONTEXT # ifdef USE_ITHREADS # define PERL_UNUSED_CONTEXT PERL_UNUSED_ARG(my_perl) # else # define PERL_UNUSED_CONTEXT # endif #endif #ifndef NOOP # define NOOP /*EMPTY*/(void)0 #endif #ifndef dNOOP # define dNOOP extern int /*@unused@*/ Perl___notused PERL_UNUSED_DECL #endif #ifndef NVTYPE # if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) # define NVTYPE long double # else # define NVTYPE double # endif typedef NVTYPE NV; #endif #ifndef INT2PTR # if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE) # define PTRV UV # define INT2PTR(any,d) (any)(d) # else # if PTRSIZE == LONGSIZE # define PTRV unsigned long # else # define PTRV unsigned # endif # define INT2PTR(any,d) (any)(PTRV)(d) # endif #endif #ifndef PTR2ul # if PTRSIZE == LONGSIZE # define PTR2ul(p) (unsigned long)(p) # else # define PTR2ul(p) INT2PTR(unsigned long,p) # endif #endif #ifndef PTR2nat # define PTR2nat(p) (PTRV)(p) #endif #ifndef NUM2PTR # define NUM2PTR(any,d) (any)PTR2nat(d) #endif #ifndef PTR2IV # define PTR2IV(p) INT2PTR(IV,p) #endif #ifndef PTR2UV # define PTR2UV(p) INT2PTR(UV,p) #endif #ifndef PTR2NV # define PTR2NV(p) NUM2PTR(NV,p) #endif #undef START_EXTERN_C #undef END_EXTERN_C #undef EXTERN_C #ifdef __cplusplus # define START_EXTERN_C extern "C" { # define END_EXTERN_C } # define EXTERN_C extern "C" #else # define START_EXTERN_C # define END_EXTERN_C # define EXTERN_C extern #endif #if defined(PERL_GCC_PEDANTIC) # ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN # define PERL_GCC_BRACE_GROUPS_FORBIDDEN # endif #endif #if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__cplusplus) # ifndef PERL_USE_GCC_BRACE_GROUPS # define PERL_USE_GCC_BRACE_GROUPS # endif #endif #undef STMT_START #undef STMT_END #ifdef PERL_USE_GCC_BRACE_GROUPS # define STMT_START (void)( /* gcc supports ``({ STATEMENTS; })'' */ # define STMT_END ) #else # if defined(VOIDFLAGS) && (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__) # define STMT_START if (1) # define STMT_END else (void)0 # else # define STMT_START do # define STMT_END while (0) # endif #endif #ifndef boolSV # define boolSV(b) ((b) ? &PL_sv_yes : &PL_sv_no) #endif /* DEFSV appears first in 5.004_56 */ #ifndef DEFSV # define DEFSV GvSV(PL_defgv) #endif #ifndef SAVE_DEFSV # define SAVE_DEFSV SAVESPTR(GvSV(PL_defgv)) #endif #ifndef DEFSV_set # define DEFSV_set(sv) (DEFSV = (sv)) #endif /* Older perls (<=5.003) lack AvFILLp */ #ifndef AvFILLp # define AvFILLp AvFILL #endif #ifndef ERRSV # define ERRSV get_sv("@",FALSE) #endif /* Hint: gv_stashpvn * This function's backport doesn't support the length parameter, but * rather ignores it. Portability can only be ensured if the length * parameter is used for speed reasons, but the length can always be * correctly computed from the string argument. */ #ifndef gv_stashpvn # define gv_stashpvn(str,len,create) gv_stashpv(str,create) #endif /* Replace: 1 */ #ifndef get_cv # define get_cv perl_get_cv #endif #ifndef get_sv # define get_sv perl_get_sv #endif #ifndef get_av # define get_av perl_get_av #endif #ifndef get_hv # define get_hv perl_get_hv #endif /* Replace: 0 */ #ifndef dUNDERBAR # define dUNDERBAR dNOOP #endif #ifndef UNDERBAR # define UNDERBAR DEFSV #endif #ifndef dAX # define dAX I32 ax = MARK - PL_stack_base + 1 #endif #ifndef dITEMS # define dITEMS I32 items = SP - MARK #endif #ifndef dXSTARG # define dXSTARG SV * targ = sv_newmortal() #endif #ifndef dAXMARK # define dAXMARK I32 ax = POPMARK; \ register SV ** const mark = PL_stack_base + ax++ #endif #ifndef XSprePUSH # define XSprePUSH (sp = PL_stack_base + ax - 1) #endif #if (PERL_BCDVERSION < 0x5005000) # undef XSRETURN # define XSRETURN(off) \ STMT_START { \ PL_stack_sp = PL_stack_base + ax + ((off) - 1); \ return; \ } STMT_END #endif #ifndef XSPROTO # define XSPROTO(name) void name(pTHX_ CV* cv) #endif #ifndef SVfARG # define SVfARG(p) ((void*)(p)) #endif #ifndef PERL_ABS # define PERL_ABS(x) ((x) < 0 ? -(x) : (x)) #endif #ifndef dVAR # define dVAR dNOOP #endif #ifndef SVf # define SVf "_" #endif #ifndef UTF8_MAXBYTES # define UTF8_MAXBYTES UTF8_MAXLEN #endif #ifndef CPERLscope # define CPERLscope(x) x #endif #ifndef PERL_HASH # define PERL_HASH(hash,str,len) \ STMT_START { \ const char *s_PeRlHaSh = str; \ I32 i_PeRlHaSh = len; \ U32 hash_PeRlHaSh = 0; \ while (i_PeRlHaSh--) \ hash_PeRlHaSh = hash_PeRlHaSh * 33 + *s_PeRlHaSh++; \ (hash) = hash_PeRlHaSh; \ } STMT_END #endif #ifndef PERLIO_FUNCS_DECL # ifdef PERLIO_FUNCS_CONST # define PERLIO_FUNCS_DECL(funcs) const PerlIO_funcs funcs # define PERLIO_FUNCS_CAST(funcs) (PerlIO_funcs*)(funcs) # else # define PERLIO_FUNCS_DECL(funcs) PerlIO_funcs funcs # define PERLIO_FUNCS_CAST(funcs) (funcs) # endif #endif /* provide these typedefs for older perls */ #if (PERL_BCDVERSION < 0x5009003) # ifdef ARGSproto typedef OP* (CPERLscope(*Perl_ppaddr_t))(ARGSproto); # else typedef OP* (CPERLscope(*Perl_ppaddr_t))(pTHX); # endif typedef OP* (CPERLscope(*Perl_check_t)) (pTHX_ OP*); #endif #ifndef isPSXSPC # define isPSXSPC(c) (isSPACE(c) || (c) == '\v') #endif #ifndef isBLANK # define isBLANK(c) ((c) == ' ' || (c) == '\t') #endif #ifdef EBCDIC #ifndef isALNUMC # define isALNUMC(c) isalnum(c) #endif #ifndef isASCII # define isASCII(c) isascii(c) #endif #ifndef isCNTRL # define isCNTRL(c) iscntrl(c) #endif #ifndef isGRAPH # define isGRAPH(c) isgraph(c) #endif #ifndef isPRINT # define isPRINT(c) isprint(c) #endif #ifndef isPUNCT # define isPUNCT(c) ispunct(c) #endif #ifndef isXDIGIT # define isXDIGIT(c) isxdigit(c) #endif #else # if (PERL_BCDVERSION < 0x5010000) /* Hint: isPRINT * The implementation in older perl versions includes all of the * isSPACE() characters, which is wrong. The version provided by * Devel::PPPort always overrides a present buggy version. */ # undef isPRINT # endif #ifndef isALNUMC # define isALNUMC(c) (isALPHA(c) || isDIGIT(c)) #endif #ifndef isASCII # define isASCII(c) ((c) <= 127) #endif #ifndef isCNTRL # define isCNTRL(c) ((c) < ' ' || (c) == 127) #endif #ifndef isGRAPH # define isGRAPH(c) (isALNUM(c) || isPUNCT(c)) #endif #ifndef isPRINT # define isPRINT(c) (((c) >= 32 && (c) < 127)) #endif #ifndef isPUNCT # define isPUNCT(c) (((c) >= 33 && (c) <= 47) || ((c) >= 58 && (c) <= 64) || ((c) >= 91 && (c) <= 96) || ((c) >= 123 && (c) <= 126)) #endif #ifndef isXDIGIT # define isXDIGIT(c) (isDIGIT(c) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F')) #endif #endif #ifndef PERL_SIGNALS_UNSAFE_FLAG #define PERL_SIGNALS_UNSAFE_FLAG 0x0001 #if (PERL_BCDVERSION < 0x5008000) # define D_PPP_PERL_SIGNALS_INIT PERL_SIGNALS_UNSAFE_FLAG #else # define D_PPP_PERL_SIGNALS_INIT 0 #endif #if defined(NEED_PL_signals) static U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT; #elif defined(NEED_PL_signals_GLOBAL) U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT; #else extern U32 DPPP_(my_PL_signals); #endif #define PL_signals DPPP_(my_PL_signals) #endif /* Hint: PL_ppaddr * Calling an op via PL_ppaddr requires passing a context argument * for threaded builds. Since the context argument is different for * 5.005 perls, you can use aTHXR (supplied by ppport.h), which will * automatically be defined as the correct argument. */ #if (PERL_BCDVERSION <= 0x5005005) /* Replace: 1 */ # define PL_ppaddr ppaddr # define PL_no_modify no_modify /* Replace: 0 */ #endif #if (PERL_BCDVERSION <= 0x5004005) /* Replace: 1 */ # define PL_DBsignal DBsignal # define PL_DBsingle DBsingle # define PL_DBsub DBsub # define PL_DBtrace DBtrace # define PL_Sv Sv # define PL_bufend bufend # define PL_bufptr bufptr # define PL_compiling compiling # define PL_copline copline # define PL_curcop curcop # define PL_curstash curstash # define PL_debstash debstash # define PL_defgv defgv # define PL_diehook diehook # define PL_dirty dirty # define PL_dowarn dowarn # define PL_errgv errgv # define PL_error_count error_count # define PL_expect expect # define PL_hexdigit hexdigit # define PL_hints hints # define PL_in_my in_my # define PL_laststatval laststatval # define PL_lex_state lex_state # define PL_lex_stuff lex_stuff # define PL_linestr linestr # define PL_na na # define PL_perl_destruct_level perl_destruct_level # define PL_perldb perldb # define PL_rsfp_filters rsfp_filters # define PL_rsfp rsfp # define PL_stack_base stack_base # define PL_stack_sp stack_sp # define PL_statcache statcache # define PL_stdingv stdingv # define PL_sv_arenaroot sv_arenaroot # define PL_sv_no sv_no # define PL_sv_undef sv_undef # define PL_sv_yes sv_yes # define PL_tainted tainted # define PL_tainting tainting # define PL_tokenbuf tokenbuf /* Replace: 0 */ #endif /* Warning: PL_parser * For perl versions earlier than 5.9.5, this is an always * non-NULL dummy. Also, it cannot be dereferenced. Don't * use it if you can avoid is and unless you absolutely know * what you're doing. * If you always check that PL_parser is non-NULL, you can * define DPPP_PL_parser_NO_DUMMY to avoid the creation of * a dummy parser structure. */ #if (PERL_BCDVERSION >= 0x5009005) # ifdef DPPP_PL_parser_NO_DUMMY # define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \ (croak("panic: PL_parser == NULL in %s:%d", \ __FILE__, __LINE__), (yy_parser *) NULL))->var) # else # ifdef DPPP_PL_parser_NO_DUMMY_WARNING # define D_PPP_parser_dummy_warning(var) # else # define D_PPP_parser_dummy_warning(var) \ warn("warning: dummy PL_" #var " used in %s:%d", __FILE__, __LINE__), # endif # define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \ (D_PPP_parser_dummy_warning(var) &DPPP_(dummy_PL_parser)))->var) #if defined(NEED_PL_parser) static yy_parser DPPP_(dummy_PL_parser); #elif defined(NEED_PL_parser_GLOBAL) yy_parser DPPP_(dummy_PL_parser); #else extern yy_parser DPPP_(dummy_PL_parser); #endif # endif /* PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf depends on PL_parser */ /* Warning: PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf * Do not use this variable unless you know exactly what you're * doint. It is internal to the perl parser and may change or even * be removed in the future. As of perl 5.9.5, you have to check * for (PL_parser != NULL) for this variable to have any effect. * An always non-NULL PL_parser dummy is provided for earlier * perl versions. * If PL_parser is NULL when you try to access this variable, a * dummy is being accessed instead and a warning is issued unless * you define DPPP_PL_parser_NO_DUMMY_WARNING. * If DPPP_PL_parser_NO_DUMMY is defined, the code trying to access * this variable will croak with a panic message. */ # define PL_expect D_PPP_my_PL_parser_var(expect) # define PL_copline D_PPP_my_PL_parser_var(copline) # define PL_rsfp D_PPP_my_PL_parser_var(rsfp) # define PL_rsfp_filters D_PPP_my_PL_parser_var(rsfp_filters) # define PL_linestr D_PPP_my_PL_parser_var(linestr) # define PL_bufptr D_PPP_my_PL_parser_var(bufptr) # define PL_bufend D_PPP_my_PL_parser_var(bufend) # define PL_lex_state D_PPP_my_PL_parser_var(lex_state) # define PL_lex_stuff D_PPP_my_PL_parser_var(lex_stuff) # define PL_tokenbuf D_PPP_my_PL_parser_var(tokenbuf) # define PL_in_my D_PPP_my_PL_parser_var(in_my) # define PL_in_my_stash D_PPP_my_PL_parser_var(in_my_stash) # define PL_error_count D_PPP_my_PL_parser_var(error_count) #else /* ensure that PL_parser != NULL and cannot be dereferenced */ # define PL_parser ((void *) 1) #endif #ifndef mPUSHs # define mPUSHs(s) PUSHs(sv_2mortal(s)) #endif #ifndef PUSHmortal # define PUSHmortal PUSHs(sv_newmortal()) #endif #ifndef mPUSHp # define mPUSHp(p,l) sv_setpvn(PUSHmortal, (p), (l)) #endif #ifndef mPUSHn # define mPUSHn(n) sv_setnv(PUSHmortal, (NV)(n)) #endif #ifndef mPUSHi # define mPUSHi(i) sv_setiv(PUSHmortal, (IV)(i)) #endif #ifndef mPUSHu # define mPUSHu(u) sv_setuv(PUSHmortal, (UV)(u)) #endif #ifndef mXPUSHs # define mXPUSHs(s) XPUSHs(sv_2mortal(s)) #endif #ifndef XPUSHmortal # define XPUSHmortal XPUSHs(sv_newmortal()) #endif #ifndef mXPUSHp # define mXPUSHp(p,l) STMT_START { EXTEND(sp,1); sv_setpvn(PUSHmortal, (p), (l)); } STMT_END #endif #ifndef mXPUSHn # define mXPUSHn(n) STMT_START { EXTEND(sp,1); sv_setnv(PUSHmortal, (NV)(n)); } STMT_END #endif #ifndef mXPUSHi # define mXPUSHi(i) STMT_START { EXTEND(sp,1); sv_setiv(PUSHmortal, (IV)(i)); } STMT_END #endif #ifndef mXPUSHu # define mXPUSHu(u) STMT_START { EXTEND(sp,1); sv_setuv(PUSHmortal, (UV)(u)); } STMT_END #endif /* Replace: 1 */ #ifndef call_sv # define call_sv perl_call_sv #endif #ifndef call_pv # define call_pv perl_call_pv #endif #ifndef call_argv # define call_argv perl_call_argv #endif #ifndef call_method # define call_method perl_call_method #endif #ifndef eval_sv # define eval_sv perl_eval_sv #endif /* Replace: 0 */ #ifndef PERL_LOADMOD_DENY # define PERL_LOADMOD_DENY 0x1 #endif #ifndef PERL_LOADMOD_NOIMPORT # define PERL_LOADMOD_NOIMPORT 0x2 #endif #ifndef PERL_LOADMOD_IMPORT_OPS # define PERL_LOADMOD_IMPORT_OPS 0x4 #endif #ifndef G_METHOD # define G_METHOD 64 # ifdef call_sv # undef call_sv # endif # if (PERL_BCDVERSION < 0x5006000) # define call_sv(sv, flags) ((flags) & G_METHOD ? perl_call_method((char *) SvPV_nolen_const(sv), \ (flags) & ~G_METHOD) : perl_call_sv(sv, flags)) # else # define call_sv(sv, flags) ((flags) & G_METHOD ? Perl_call_method(aTHX_ (char *) SvPV_nolen_const(sv), \ (flags) & ~G_METHOD) : Perl_call_sv(aTHX_ sv, flags)) # endif #endif /* Replace perl_eval_pv with eval_pv */ #ifndef eval_pv #if defined(NEED_eval_pv) static SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error); static #else extern SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error); #endif #ifdef eval_pv # undef eval_pv #endif #define eval_pv(a,b) DPPP_(my_eval_pv)(aTHX_ a,b) #define Perl_eval_pv DPPP_(my_eval_pv) #if defined(NEED_eval_pv) || defined(NEED_eval_pv_GLOBAL) SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error) { dSP; SV* sv = newSVpv(p, 0); PUSHMARK(sp); eval_sv(sv, G_SCALAR); SvREFCNT_dec(sv); SPAGAIN; sv = POPs; PUTBACK; if (croak_on_error && SvTRUE(GvSV(errgv))) croak(SvPVx(GvSV(errgv), na)); return sv; } #endif #endif #ifndef vload_module #if defined(NEED_vload_module) static void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args); static #else extern void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args); #endif #ifdef vload_module # undef vload_module #endif #define vload_module(a,b,c,d) DPPP_(my_vload_module)(aTHX_ a,b,c,d) #define Perl_vload_module DPPP_(my_vload_module) #if defined(NEED_vload_module) || defined(NEED_vload_module_GLOBAL) void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args) { dTHR; dVAR; OP *veop, *imop; OP * const modname = newSVOP(OP_CONST, 0, name); /* 5.005 has a somewhat hacky force_normal that doesn't croak on SvREADONLY() if PL_compling is true. Current perls take care in ck_require() to correctly turn off SvREADONLY before calling force_normal_flags(). This seems a better fix than fudging PL_compling */ SvREADONLY_off(((SVOP*)modname)->op_sv); modname->op_private |= OPpCONST_BARE; if (ver) { veop = newSVOP(OP_CONST, 0, ver); } else veop = NULL; if (flags & PERL_LOADMOD_NOIMPORT) { imop = sawparens(newNULLLIST()); } else if (flags & PERL_LOADMOD_IMPORT_OPS) { imop = va_arg(*args, OP*); } else { SV *sv; imop = NULL; sv = va_arg(*args, SV*); while (sv) { imop = append_elem(OP_LIST, imop, newSVOP(OP_CONST, 0, sv)); sv = va_arg(*args, SV*); } } { const line_t ocopline = PL_copline; COP * const ocurcop = PL_curcop; const int oexpect = PL_expect; #if (PERL_BCDVERSION >= 0x5004000) utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(FALSE, 0), veop, modname, imop); #else utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(), modname, imop); #endif PL_expect = oexpect; PL_copline = ocopline; PL_curcop = ocurcop; } } #endif #endif #ifndef load_module #if defined(NEED_load_module) static void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...); static #else extern void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...); #endif #ifdef load_module # undef load_module #endif #define load_module DPPP_(my_load_module) #define Perl_load_module DPPP_(my_load_module) #if defined(NEED_load_module) || defined(NEED_load_module_GLOBAL) void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...) { va_list args; va_start(args, ver); vload_module(flags, name, ver, &args); va_end(args); } #endif #endif #ifndef newRV_inc # define newRV_inc(sv) newRV(sv) /* Replace */ #endif #ifndef newRV_noinc #if defined(NEED_newRV_noinc) static SV * DPPP_(my_newRV_noinc)(SV *sv); static #else extern SV * DPPP_(my_newRV_noinc)(SV *sv); #endif #ifdef newRV_noinc # undef newRV_noinc #endif #define newRV_noinc(a) DPPP_(my_newRV_noinc)(aTHX_ a) #define Perl_newRV_noinc DPPP_(my_newRV_noinc) #if defined(NEED_newRV_noinc) || defined(NEED_newRV_noinc_GLOBAL) SV * DPPP_(my_newRV_noinc)(SV *sv) { SV *rv = (SV *)newRV(sv); SvREFCNT_dec(sv); return rv; } #endif #endif /* Hint: newCONSTSUB * Returns a CV* as of perl-5.7.1. This return value is not supported * by Devel::PPPort. */ /* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */ #if (PERL_BCDVERSION < 0x5004063) && (PERL_BCDVERSION != 0x5004005) #if defined(NEED_newCONSTSUB) static void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv); static #else extern void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv); #endif #ifdef newCONSTSUB # undef newCONSTSUB #endif #define newCONSTSUB(a,b,c) DPPP_(my_newCONSTSUB)(aTHX_ a,b,c) #define Perl_newCONSTSUB DPPP_(my_newCONSTSUB) #if defined(NEED_newCONSTSUB) || defined(NEED_newCONSTSUB_GLOBAL) /* This is just a trick to avoid a dependency of newCONSTSUB on PL_parser */ /* (There's no PL_parser in perl < 5.005, so this is completely safe) */ #define D_PPP_PL_copline PL_copline void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv) { U32 oldhints = PL_hints; HV *old_cop_stash = PL_curcop->cop_stash; HV *old_curstash = PL_curstash; line_t oldline = PL_curcop->cop_line; PL_curcop->cop_line = D_PPP_PL_copline; PL_hints &= ~HINT_BLOCK_SCOPE; if (stash) PL_curstash = PL_curcop->cop_stash = stash; newSUB( #if (PERL_BCDVERSION < 0x5003022) start_subparse(), #elif (PERL_BCDVERSION == 0x5003022) start_subparse(0), #else /* 5.003_23 onwards */ start_subparse(FALSE, 0), #endif newSVOP(OP_CONST, 0, newSVpv((char *) name, 0)), newSVOP(OP_CONST, 0, &PL_sv_no), /* SvPV(&PL_sv_no) == "" -- GMB */ newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv)) ); PL_hints = oldhints; PL_curcop->cop_stash = old_cop_stash; PL_curstash = old_curstash; PL_curcop->cop_line = oldline; } #endif #endif /* * Boilerplate macros for initializing and accessing interpreter-local * data from C. All statics in extensions should be reworked to use * this, if you want to make the extension thread-safe. See ext/re/re.xs * for an example of the use of these macros. * * Code that uses these macros is responsible for the following: * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts" * 2. Declare a typedef named my_cxt_t that is a structure that contains * all the data that needs to be interpreter-local. * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t. * 4. Use the MY_CXT_INIT macro such that it is called exactly once * (typically put in the BOOT: section). * 5. Use the members of the my_cxt_t structure everywhere as * MY_CXT.member. * 6. Use the dMY_CXT macro (a declaration) in all the functions that * access MY_CXT. */ #if defined(MULTIPLICITY) || defined(PERL_OBJECT) || \ defined(PERL_CAPI) || defined(PERL_IMPLICIT_CONTEXT) #ifndef START_MY_CXT /* This must appear in all extensions that define a my_cxt_t structure, * right after the definition (i.e. at file scope). The non-threads * case below uses it to declare the data as static. */ #define START_MY_CXT #if (PERL_BCDVERSION < 0x5004068) /* Fetches the SV that keeps the per-interpreter data. */ #define dMY_CXT_SV \ SV *my_cxt_sv = get_sv(MY_CXT_KEY, FALSE) #else /* >= perl5.004_68 */ #define dMY_CXT_SV \ SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY, \ sizeof(MY_CXT_KEY)-1, TRUE) #endif /* < perl5.004_68 */ /* This declaration should be used within all functions that use the * interpreter-local data. */ #define dMY_CXT \ dMY_CXT_SV; \ my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*,SvUV(my_cxt_sv)) /* Creates and zeroes the per-interpreter data. * (We allocate my_cxtp in a Perl SV so that it will be released when * the interpreter goes away.) */ #define MY_CXT_INIT \ dMY_CXT_SV; \ /* newSV() allocates one more than needed */ \ my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\ Zero(my_cxtp, 1, my_cxt_t); \ sv_setuv(my_cxt_sv, PTR2UV(my_cxtp)) /* This macro must be used to access members of the my_cxt_t structure. * e.g. MYCXT.some_data */ #define MY_CXT (*my_cxtp) /* Judicious use of these macros can reduce the number of times dMY_CXT * is used. Use is similar to pTHX, aTHX etc. */ #define pMY_CXT my_cxt_t *my_cxtp #define pMY_CXT_ pMY_CXT, #define _pMY_CXT ,pMY_CXT #define aMY_CXT my_cxtp #define aMY_CXT_ aMY_CXT, #define _aMY_CXT ,aMY_CXT #endif /* START_MY_CXT */ #ifndef MY_CXT_CLONE /* Clones the per-interpreter data. */ #define MY_CXT_CLONE \ dMY_CXT_SV; \ my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\ Copy(INT2PTR(my_cxt_t*, SvUV(my_cxt_sv)), my_cxtp, 1, my_cxt_t);\ sv_setuv(my_cxt_sv, PTR2UV(my_cxtp)) #endif #else /* single interpreter */ #ifndef START_MY_CXT #define START_MY_CXT static my_cxt_t my_cxt; #define dMY_CXT_SV dNOOP #define dMY_CXT dNOOP #define MY_CXT_INIT NOOP #define MY_CXT my_cxt #define pMY_CXT void #define pMY_CXT_ #define _pMY_CXT #define aMY_CXT #define aMY_CXT_ #define _aMY_CXT #endif /* START_MY_CXT */ #ifndef MY_CXT_CLONE #define MY_CXT_CLONE NOOP #endif #endif #ifndef IVdf # if IVSIZE == LONGSIZE # define IVdf "ld" # define UVuf "lu" # define UVof "lo" # define UVxf "lx" # define UVXf "lX" # else # if IVSIZE == INTSIZE # define IVdf "d" # define UVuf "u" # define UVof "o" # define UVxf "x" # define UVXf "X" # endif # endif #endif #ifndef NVef # if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && \ defined(PERL_PRIfldbl) && (PERL_BCDVERSION != 0x5006000) /* Not very likely, but let's try anyway. */ # define NVef PERL_PRIeldbl # define NVff PERL_PRIfldbl # define NVgf PERL_PRIgldbl # else # define NVef "e" # define NVff "f" # define NVgf "g" # endif #endif #ifndef SvREFCNT_inc # ifdef PERL_USE_GCC_BRACE_GROUPS # define SvREFCNT_inc(sv) \ ({ \ SV * const _sv = (SV*)(sv); \ if (_sv) \ (SvREFCNT(_sv))++; \ _sv; \ }) # else # define SvREFCNT_inc(sv) \ ((PL_Sv=(SV*)(sv)) ? (++(SvREFCNT(PL_Sv)),PL_Sv) : NULL) # endif #endif #ifndef SvREFCNT_inc_simple # ifdef PERL_USE_GCC_BRACE_GROUPS # define SvREFCNT_inc_simple(sv) \ ({ \ if (sv) \ (SvREFCNT(sv))++; \ (SV *)(sv); \ }) # else # define SvREFCNT_inc_simple(sv) \ ((sv) ? (SvREFCNT(sv)++,(SV*)(sv)) : NULL) # endif #endif #ifndef SvREFCNT_inc_NN # ifdef PERL_USE_GCC_BRACE_GROUPS # define SvREFCNT_inc_NN(sv) \ ({ \ SV * const _sv = (SV*)(sv); \ SvREFCNT(_sv)++; \ _sv; \ }) # else # define SvREFCNT_inc_NN(sv) \ (PL_Sv=(SV*)(sv),++(SvREFCNT(PL_Sv)),PL_Sv) # endif #endif #ifndef SvREFCNT_inc_void # ifdef PERL_USE_GCC_BRACE_GROUPS # define SvREFCNT_inc_void(sv) \ ({ \ SV * const _sv = (SV*)(sv); \ if (_sv) \ (void)(SvREFCNT(_sv)++); \ }) # else # define SvREFCNT_inc_void(sv) \ (void)((PL_Sv=(SV*)(sv)) ? ++(SvREFCNT(PL_Sv)) : 0) # endif #endif #ifndef SvREFCNT_inc_simple_void # define SvREFCNT_inc_simple_void(sv) STMT_START { if (sv) SvREFCNT(sv)++; } STMT_END #endif #ifndef SvREFCNT_inc_simple_NN # define SvREFCNT_inc_simple_NN(sv) (++SvREFCNT(sv), (SV*)(sv)) #endif #ifndef SvREFCNT_inc_void_NN # define SvREFCNT_inc_void_NN(sv) (void)(++SvREFCNT((SV*)(sv))) #endif #ifndef SvREFCNT_inc_simple_void_NN # define SvREFCNT_inc_simple_void_NN(sv) (void)(++SvREFCNT((SV*)(sv))) #endif #ifndef newSV_type #if defined(NEED_newSV_type) static SV* DPPP_(my_newSV_type)(pTHX_ svtype const t); static #else extern SV* DPPP_(my_newSV_type)(pTHX_ svtype const t); #endif #ifdef newSV_type # undef newSV_type #endif #define newSV_type(a) DPPP_(my_newSV_type)(aTHX_ a) #define Perl_newSV_type DPPP_(my_newSV_type) #if defined(NEED_newSV_type) || defined(NEED_newSV_type_GLOBAL) SV* DPPP_(my_newSV_type)(pTHX_ svtype const t) { SV* const sv = newSV(0); sv_upgrade(sv, t); return sv; } #endif #endif #if (PERL_BCDVERSION < 0x5006000) # define D_PPP_CONSTPV_ARG(x) ((char *) (x)) #else # define D_PPP_CONSTPV_ARG(x) (x) #endif #ifndef newSVpvn # define newSVpvn(data,len) ((data) \ ? ((len) ? newSVpv((data), (len)) : newSVpv("", 0)) \ : newSV(0)) #endif #ifndef newSVpvn_utf8 # define newSVpvn_utf8(s, len, u) newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0) #endif #ifndef SVf_UTF8 # define SVf_UTF8 0 #endif #ifndef newSVpvn_flags #if defined(NEED_newSVpvn_flags) static SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags); static #else extern SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags); #endif #ifdef newSVpvn_flags # undef newSVpvn_flags #endif #define newSVpvn_flags(a,b,c) DPPP_(my_newSVpvn_flags)(aTHX_ a,b,c) #define Perl_newSVpvn_flags DPPP_(my_newSVpvn_flags) #if defined(NEED_newSVpvn_flags) || defined(NEED_newSVpvn_flags_GLOBAL) SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags) { SV *sv = newSVpvn(D_PPP_CONSTPV_ARG(s), len); SvFLAGS(sv) |= (flags & SVf_UTF8); return (flags & SVs_TEMP) ? sv_2mortal(sv) : sv; } #endif #endif /* Backwards compatibility stuff... :-( */ #if !defined(NEED_sv_2pv_flags) && defined(NEED_sv_2pv_nolen) # define NEED_sv_2pv_flags #endif #if !defined(NEED_sv_2pv_flags_GLOBAL) && defined(NEED_sv_2pv_nolen_GLOBAL) # define NEED_sv_2pv_flags_GLOBAL #endif /* Hint: sv_2pv_nolen * Use the SvPV_nolen() or SvPV_nolen_const() macros instead of sv_2pv_nolen(). */ #ifndef sv_2pv_nolen # define sv_2pv_nolen(sv) SvPV_nolen(sv) #endif #ifdef SvPVbyte /* Hint: SvPVbyte * Does not work in perl-5.6.1, ppport.h implements a version * borrowed from perl-5.7.3. */ #if (PERL_BCDVERSION < 0x5007000) #if defined(NEED_sv_2pvbyte) static char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp); static #else extern char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp); #endif #ifdef sv_2pvbyte # undef sv_2pvbyte #endif #define sv_2pvbyte(a,b) DPPP_(my_sv_2pvbyte)(aTHX_ a,b) #define Perl_sv_2pvbyte DPPP_(my_sv_2pvbyte) #if defined(NEED_sv_2pvbyte) || defined(NEED_sv_2pvbyte_GLOBAL) char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp) { sv_utf8_downgrade(sv,0); return SvPV(sv,*lp); } #endif /* Hint: sv_2pvbyte * Use the SvPVbyte() macro instead of sv_2pvbyte(). */ #undef SvPVbyte #define SvPVbyte(sv, lp) \ ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK) \ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &lp)) #endif #else # define SvPVbyte SvPV # define sv_2pvbyte sv_2pv #endif #ifndef sv_2pvbyte_nolen # define sv_2pvbyte_nolen(sv) sv_2pv_nolen(sv) #endif /* Hint: sv_pvn * Always use the SvPV() macro instead of sv_pvn(). */ /* Hint: sv_pvn_force * Always use the SvPV_force() macro instead of sv_pvn_force(). */ /* If these are undefined, they're not handled by the core anyway */ #ifndef SV_IMMEDIATE_UNREF # define SV_IMMEDIATE_UNREF 0 #endif #ifndef SV_GMAGIC # define SV_GMAGIC 0 #endif #ifndef SV_COW_DROP_PV # define SV_COW_DROP_PV 0 #endif #ifndef SV_UTF8_NO_ENCODING # define SV_UTF8_NO_ENCODING 0 #endif #ifndef SV_NOSTEAL # define SV_NOSTEAL 0 #endif #ifndef SV_CONST_RETURN # define SV_CONST_RETURN 0 #endif #ifndef SV_MUTABLE_RETURN # define SV_MUTABLE_RETURN 0 #endif #ifndef SV_SMAGIC # define SV_SMAGIC 0 #endif #ifndef SV_HAS_TRAILING_NUL # define SV_HAS_TRAILING_NUL 0 #endif #ifndef SV_COW_SHARED_HASH_KEYS # define SV_COW_SHARED_HASH_KEYS 0 #endif #if (PERL_BCDVERSION < 0x5007002) #if defined(NEED_sv_2pv_flags) static char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); static #else extern char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); #endif #ifdef sv_2pv_flags # undef sv_2pv_flags #endif #define sv_2pv_flags(a,b,c) DPPP_(my_sv_2pv_flags)(aTHX_ a,b,c) #define Perl_sv_2pv_flags DPPP_(my_sv_2pv_flags) #if defined(NEED_sv_2pv_flags) || defined(NEED_sv_2pv_flags_GLOBAL) char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags) { STRLEN n_a = (STRLEN) flags; return sv_2pv(sv, lp ? lp : &n_a); } #endif #if defined(NEED_sv_pvn_force_flags) static char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); static #else extern char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); #endif #ifdef sv_pvn_force_flags # undef sv_pvn_force_flags #endif #define sv_pvn_force_flags(a,b,c) DPPP_(my_sv_pvn_force_flags)(aTHX_ a,b,c) #define Perl_sv_pvn_force_flags DPPP_(my_sv_pvn_force_flags) #if defined(NEED_sv_pvn_force_flags) || defined(NEED_sv_pvn_force_flags_GLOBAL) char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags) { STRLEN n_a = (STRLEN) flags; return sv_pvn_force(sv, lp ? lp : &n_a); } #endif #endif #if (PERL_BCDVERSION < 0x5008008) || ( (PERL_BCDVERSION >= 0x5009000) && (PERL_BCDVERSION < 0x5009003) ) # define DPPP_SVPV_NOLEN_LP_ARG &PL_na #else # define DPPP_SVPV_NOLEN_LP_ARG 0 #endif #ifndef SvPV_const # define SvPV_const(sv, lp) SvPV_flags_const(sv, lp, SV_GMAGIC) #endif #ifndef SvPV_mutable # define SvPV_mutable(sv, lp) SvPV_flags_mutable(sv, lp, SV_GMAGIC) #endif #ifndef SvPV_flags # define SvPV_flags(sv, lp, flags) \ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pv_flags(sv, &lp, flags)) #endif #ifndef SvPV_flags_const # define SvPV_flags_const(sv, lp, flags) \ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ ? ((lp = SvCUR(sv)), SvPVX_const(sv)) : \ (const char*) sv_2pv_flags(sv, &lp, flags|SV_CONST_RETURN)) #endif #ifndef SvPV_flags_const_nolen # define SvPV_flags_const_nolen(sv, flags) \ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ ? SvPVX_const(sv) : \ (const char*) sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, flags|SV_CONST_RETURN)) #endif #ifndef SvPV_flags_mutable # define SvPV_flags_mutable(sv, lp, flags) \ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) : \ sv_2pv_flags(sv, &lp, flags|SV_MUTABLE_RETURN)) #endif #ifndef SvPV_force # define SvPV_force(sv, lp) SvPV_force_flags(sv, lp, SV_GMAGIC) #endif #ifndef SvPV_force_nolen # define SvPV_force_nolen(sv) SvPV_force_flags_nolen(sv, SV_GMAGIC) #endif #ifndef SvPV_force_mutable # define SvPV_force_mutable(sv, lp) SvPV_force_flags_mutable(sv, lp, SV_GMAGIC) #endif #ifndef SvPV_force_nomg # define SvPV_force_nomg(sv, lp) SvPV_force_flags(sv, lp, 0) #endif #ifndef SvPV_force_nomg_nolen # define SvPV_force_nomg_nolen(sv) SvPV_force_flags_nolen(sv, 0) #endif #ifndef SvPV_force_flags # define SvPV_force_flags(sv, lp, flags) \ ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvn_force_flags(sv, &lp, flags)) #endif #ifndef SvPV_force_flags_nolen # define SvPV_force_flags_nolen(sv, flags) \ ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \ ? SvPVX(sv) : sv_pvn_force_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, flags)) #endif #ifndef SvPV_force_flags_mutable # define SvPV_force_flags_mutable(sv, lp, flags) \ ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \ ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) \ : sv_pvn_force_flags(sv, &lp, flags|SV_MUTABLE_RETURN)) #endif #ifndef SvPV_nolen # define SvPV_nolen(sv) \ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ ? SvPVX(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC)) #endif #ifndef SvPV_nolen_const # define SvPV_nolen_const(sv) \ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ ? SvPVX_const(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC|SV_CONST_RETURN)) #endif #ifndef SvPV_nomg # define SvPV_nomg(sv, lp) SvPV_flags(sv, lp, 0) #endif #ifndef SvPV_nomg_const # define SvPV_nomg_const(sv, lp) SvPV_flags_const(sv, lp, 0) #endif #ifndef SvPV_nomg_const_nolen # define SvPV_nomg_const_nolen(sv) SvPV_flags_const_nolen(sv, 0) #endif #ifndef SvPV_renew # define SvPV_renew(sv,n) STMT_START { SvLEN_set(sv, n); \ SvPV_set((sv), (char *) saferealloc( \ (Malloc_t)SvPVX(sv), (MEM_SIZE)((n)))); \ } STMT_END #endif #ifndef SvMAGIC_set # define SvMAGIC_set(sv, val) \ STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \ (((XPVMG*) SvANY(sv))->xmg_magic = (val)); } STMT_END #endif #if (PERL_BCDVERSION < 0x5009003) #ifndef SvPVX_const # define SvPVX_const(sv) ((const char*) (0 + SvPVX(sv))) #endif #ifndef SvPVX_mutable # define SvPVX_mutable(sv) (0 + SvPVX(sv)) #endif #ifndef SvRV_set # define SvRV_set(sv, val) \ STMT_START { assert(SvTYPE(sv) >= SVt_RV); \ (((XRV*) SvANY(sv))->xrv_rv = (val)); } STMT_END #endif #else #ifndef SvPVX_const # define SvPVX_const(sv) ((const char*)((sv)->sv_u.svu_pv)) #endif #ifndef SvPVX_mutable # define SvPVX_mutable(sv) ((sv)->sv_u.svu_pv) #endif #ifndef SvRV_set # define SvRV_set(sv, val) \ STMT_START { assert(SvTYPE(sv) >= SVt_RV); \ ((sv)->sv_u.svu_rv = (val)); } STMT_END #endif #endif #ifndef SvSTASH_set # define SvSTASH_set(sv, val) \ STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \ (((XPVMG*) SvANY(sv))->xmg_stash = (val)); } STMT_END #endif #if (PERL_BCDVERSION < 0x5004000) #ifndef SvUV_set # define SvUV_set(sv, val) \ STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \ (((XPVIV*) SvANY(sv))->xiv_iv = (IV) (val)); } STMT_END #endif #else #ifndef SvUV_set # define SvUV_set(sv, val) \ STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \ (((XPVUV*) SvANY(sv))->xuv_uv = (val)); } STMT_END #endif #endif #if (PERL_BCDVERSION >= 0x5004000) && !defined(vnewSVpvf) #if defined(NEED_vnewSVpvf) static SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args); static #else extern SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args); #endif #ifdef vnewSVpvf # undef vnewSVpvf #endif #define vnewSVpvf(a,b) DPPP_(my_vnewSVpvf)(aTHX_ a,b) #define Perl_vnewSVpvf DPPP_(my_vnewSVpvf) #if defined(NEED_vnewSVpvf) || defined(NEED_vnewSVpvf_GLOBAL) SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args) { register SV *sv = newSV(0); sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); return sv; } #endif #endif #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf) # define sv_vcatpvf(sv, pat, args) sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)) #endif #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf) # define sv_vsetpvf(sv, pat, args) sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)) #endif #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg) #if defined(NEED_sv_catpvf_mg) static void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...); static #else extern void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...); #endif #define Perl_sv_catpvf_mg DPPP_(my_sv_catpvf_mg) #if defined(NEED_sv_catpvf_mg) || defined(NEED_sv_catpvf_mg_GLOBAL) void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...) { va_list args; va_start(args, pat); sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); SvSETMAGIC(sv); va_end(args); } #endif #endif #ifdef PERL_IMPLICIT_CONTEXT #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg_nocontext) #if defined(NEED_sv_catpvf_mg_nocontext) static void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...); static #else extern void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...); #endif #define sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext) #define Perl_sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext) #if defined(NEED_sv_catpvf_mg_nocontext) || defined(NEED_sv_catpvf_mg_nocontext_GLOBAL) void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...) { dTHX; va_list args; va_start(args, pat); sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); SvSETMAGIC(sv); va_end(args); } #endif #endif #endif /* sv_catpvf_mg depends on sv_catpvf_mg_nocontext */ #ifndef sv_catpvf_mg # ifdef PERL_IMPLICIT_CONTEXT # define sv_catpvf_mg Perl_sv_catpvf_mg_nocontext # else # define sv_catpvf_mg Perl_sv_catpvf_mg # endif #endif #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf_mg) # define sv_vcatpvf_mg(sv, pat, args) \ STMT_START { \ sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \ SvSETMAGIC(sv); \ } STMT_END #endif #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg) #if defined(NEED_sv_setpvf_mg) static void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...); static #else extern void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...); #endif #define Perl_sv_setpvf_mg DPPP_(my_sv_setpvf_mg) #if defined(NEED_sv_setpvf_mg) || defined(NEED_sv_setpvf_mg_GLOBAL) void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...) { va_list args; va_start(args, pat); sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); SvSETMAGIC(sv); va_end(args); } #endif #endif #ifdef PERL_IMPLICIT_CONTEXT #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg_nocontext) #if defined(NEED_sv_setpvf_mg_nocontext) static void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...); static #else extern void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...); #endif #define sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext) #define Perl_sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext) #if defined(NEED_sv_setpvf_mg_nocontext) || defined(NEED_sv_setpvf_mg_nocontext_GLOBAL) void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...) { dTHX; va_list args; va_start(args, pat); sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); SvSETMAGIC(sv); va_end(args); } #endif #endif #endif /* sv_setpvf_mg depends on sv_setpvf_mg_nocontext */ #ifndef sv_setpvf_mg # ifdef PERL_IMPLICIT_CONTEXT # define sv_setpvf_mg Perl_sv_setpvf_mg_nocontext # else # define sv_setpvf_mg Perl_sv_setpvf_mg # endif #endif #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf_mg) # define sv_vsetpvf_mg(sv, pat, args) \ STMT_START { \ sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \ SvSETMAGIC(sv); \ } STMT_END #endif #ifndef newSVpvn_share #if defined(NEED_newSVpvn_share) static SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash); static #else extern SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash); #endif #ifdef newSVpvn_share # undef newSVpvn_share #endif #define newSVpvn_share(a,b,c) DPPP_(my_newSVpvn_share)(aTHX_ a,b,c) #define Perl_newSVpvn_share DPPP_(my_newSVpvn_share) #if defined(NEED_newSVpvn_share) || defined(NEED_newSVpvn_share_GLOBAL) SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash) { SV *sv; if (len < 0) len = -len; if (!hash) PERL_HASH(hash, (char*) src, len); sv = newSVpvn((char *) src, len); sv_upgrade(sv, SVt_PVIV); SvIVX(sv) = hash; SvREADONLY_on(sv); SvPOK_on(sv); return sv; } #endif #endif #ifndef SvSHARED_HASH # define SvSHARED_HASH(sv) (0 + SvUVX(sv)) #endif #ifndef HvNAME_get # define HvNAME_get(hv) HvNAME(hv) #endif #ifndef HvNAMELEN_get # define HvNAMELEN_get(hv) (HvNAME_get(hv) ? (I32)strlen(HvNAME_get(hv)) : 0) #endif #ifndef GvSVn # define GvSVn(gv) GvSV(gv) #endif #ifndef isGV_with_GP # define isGV_with_GP(gv) isGV(gv) #endif #ifndef WARN_ALL # define WARN_ALL 0 #endif #ifndef WARN_CLOSURE # define WARN_CLOSURE 1 #endif #ifndef WARN_DEPRECATED # define WARN_DEPRECATED 2 #endif #ifndef WARN_EXITING # define WARN_EXITING 3 #endif #ifndef WARN_GLOB # define WARN_GLOB 4 #endif #ifndef WARN_IO # define WARN_IO 5 #endif #ifndef WARN_CLOSED # define WARN_CLOSED 6 #endif #ifndef WARN_EXEC # define WARN_EXEC 7 #endif #ifndef WARN_LAYER # define WARN_LAYER 8 #endif #ifndef WARN_NEWLINE # define WARN_NEWLINE 9 #endif #ifndef WARN_PIPE # define WARN_PIPE 10 #endif #ifndef WARN_UNOPENED # define WARN_UNOPENED 11 #endif #ifndef WARN_MISC # define WARN_MISC 12 #endif #ifndef WARN_NUMERIC # define WARN_NUMERIC 13 #endif #ifndef WARN_ONCE # define WARN_ONCE 14 #endif #ifndef WARN_OVERFLOW # define WARN_OVERFLOW 15 #endif #ifndef WARN_PACK # define WARN_PACK 16 #endif #ifndef WARN_PORTABLE # define WARN_PORTABLE 17 #endif #ifndef WARN_RECURSION # define WARN_RECURSION 18 #endif #ifndef WARN_REDEFINE # define WARN_REDEFINE 19 #endif #ifndef WARN_REGEXP # define WARN_REGEXP 20 #endif #ifndef WARN_SEVERE # define WARN_SEVERE 21 #endif #ifndef WARN_DEBUGGING # define WARN_DEBUGGING 22 #endif #ifndef WARN_INPLACE # define WARN_INPLACE 23 #endif #ifndef WARN_INTERNAL # define WARN_INTERNAL 24 #endif #ifndef WARN_MALLOC # define WARN_MALLOC 25 #endif #ifndef WARN_SIGNAL # define WARN_SIGNAL 26 #endif #ifndef WARN_SUBSTR # define WARN_SUBSTR 27 #endif #ifndef WARN_SYNTAX # define WARN_SYNTAX 28 #endif #ifndef WARN_AMBIGUOUS # define WARN_AMBIGUOUS 29 #endif #ifndef WARN_BAREWORD # define WARN_BAREWORD 30 #endif #ifndef WARN_DIGIT # define WARN_DIGIT 31 #endif #ifndef WARN_PARENTHESIS # define WARN_PARENTHESIS 32 #endif #ifndef WARN_PRECEDENCE # define WARN_PRECEDENCE 33 #endif #ifndef WARN_PRINTF # define WARN_PRINTF 34 #endif #ifndef WARN_PROTOTYPE # define WARN_PROTOTYPE 35 #endif #ifndef WARN_QW # define WARN_QW 36 #endif #ifndef WARN_RESERVED # define WARN_RESERVED 37 #endif #ifndef WARN_SEMICOLON # define WARN_SEMICOLON 38 #endif #ifndef WARN_TAINT # define WARN_TAINT 39 #endif #ifndef WARN_THREADS # define WARN_THREADS 40 #endif #ifndef WARN_UNINITIALIZED # define WARN_UNINITIALIZED 41 #endif #ifndef WARN_UNPACK # define WARN_UNPACK 42 #endif #ifndef WARN_UNTIE # define WARN_UNTIE 43 #endif #ifndef WARN_UTF8 # define WARN_UTF8 44 #endif #ifndef WARN_VOID # define WARN_VOID 45 #endif #ifndef WARN_ASSERTIONS # define WARN_ASSERTIONS 46 #endif #ifndef packWARN # define packWARN(a) (a) #endif #ifndef ckWARN # ifdef G_WARN_ON # define ckWARN(a) (PL_dowarn & G_WARN_ON) # else # define ckWARN(a) PL_dowarn # endif #endif #if (PERL_BCDVERSION >= 0x5004000) && !defined(warner) #if defined(NEED_warner) static void DPPP_(my_warner)(U32 err, const char *pat, ...); static #else extern void DPPP_(my_warner)(U32 err, const char *pat, ...); #endif #define Perl_warner DPPP_(my_warner) #if defined(NEED_warner) || defined(NEED_warner_GLOBAL) void DPPP_(my_warner)(U32 err, const char *pat, ...) { SV *sv; va_list args; PERL_UNUSED_ARG(err); va_start(args, pat); sv = vnewSVpvf(pat, &args); va_end(args); sv_2mortal(sv); warn("%s", SvPV_nolen(sv)); } #define warner Perl_warner #define Perl_warner_nocontext Perl_warner #endif #endif /* concatenating with "" ensures that only literal strings are accepted as argument * note that STR_WITH_LEN() can't be used as argument to macros or functions that * under some configurations might be macros */ #ifndef STR_WITH_LEN # define STR_WITH_LEN(s) (s ""), (sizeof(s)-1) #endif #ifndef newSVpvs # define newSVpvs(str) newSVpvn(str "", sizeof(str) - 1) #endif #ifndef newSVpvs_flags # define newSVpvs_flags(str, flags) newSVpvn_flags(str "", sizeof(str) - 1, flags) #endif #ifndef sv_catpvs # define sv_catpvs(sv, str) sv_catpvn(sv, str "", sizeof(str) - 1) #endif #ifndef sv_setpvs # define sv_setpvs(sv, str) sv_setpvn(sv, str "", sizeof(str) - 1) #endif #ifndef hv_fetchs # define hv_fetchs(hv, key, lval) hv_fetch(hv, key "", sizeof(key) - 1, lval) #endif #ifndef hv_stores # define hv_stores(hv, key, val) hv_store(hv, key "", sizeof(key) - 1, val, 0) #endif #ifndef gv_fetchpvn_flags # define gv_fetchpvn_flags(name, len, flags, svt) gv_fetchpv(name, flags, svt) #endif #ifndef gv_fetchpvs # define gv_fetchpvs(name, flags, svt) gv_fetchpvn_flags(name "", sizeof(name) - 1, flags, svt) #endif #ifndef gv_stashpvs # define gv_stashpvs(name, flags) gv_stashpvn(name "", sizeof(name) - 1, flags) #endif #ifndef SvGETMAGIC # define SvGETMAGIC(x) STMT_START { if (SvGMAGICAL(x)) mg_get(x); } STMT_END #endif #ifndef PERL_MAGIC_sv # define PERL_MAGIC_sv '\0' #endif #ifndef PERL_MAGIC_overload # define PERL_MAGIC_overload 'A' #endif #ifndef PERL_MAGIC_overload_elem # define PERL_MAGIC_overload_elem 'a' #endif #ifndef PERL_MAGIC_overload_table # define PERL_MAGIC_overload_table 'c' #endif #ifndef PERL_MAGIC_bm # define PERL_MAGIC_bm 'B' #endif #ifndef PERL_MAGIC_regdata # define PERL_MAGIC_regdata 'D' #endif #ifndef PERL_MAGIC_regdatum # define PERL_MAGIC_regdatum 'd' #endif #ifndef PERL_MAGIC_env # define PERL_MAGIC_env 'E' #endif #ifndef PERL_MAGIC_envelem # define PERL_MAGIC_envelem 'e' #endif #ifndef PERL_MAGIC_fm # define PERL_MAGIC_fm 'f' #endif #ifndef PERL_MAGIC_regex_global # define PERL_MAGIC_regex_global 'g' #endif #ifndef PERL_MAGIC_isa # define PERL_MAGIC_isa 'I' #endif #ifndef PERL_MAGIC_isaelem # define PERL_MAGIC_isaelem 'i' #endif #ifndef PERL_MAGIC_nkeys # define PERL_MAGIC_nkeys 'k' #endif #ifndef PERL_MAGIC_dbfile # define PERL_MAGIC_dbfile 'L' #endif #ifndef PERL_MAGIC_dbline # define PERL_MAGIC_dbline 'l' #endif #ifndef PERL_MAGIC_mutex # define PERL_MAGIC_mutex 'm' #endif #ifndef PERL_MAGIC_shared # define PERL_MAGIC_shared 'N' #endif #ifndef PERL_MAGIC_shared_scalar # define PERL_MAGIC_shared_scalar 'n' #endif #ifndef PERL_MAGIC_collxfrm # define PERL_MAGIC_collxfrm 'o' #endif #ifndef PERL_MAGIC_tied # define PERL_MAGIC_tied 'P' #endif #ifndef PERL_MAGIC_tiedelem # define PERL_MAGIC_tiedelem 'p' #endif #ifndef PERL_MAGIC_tiedscalar # define PERL_MAGIC_tiedscalar 'q' #endif #ifndef PERL_MAGIC_qr # define PERL_MAGIC_qr 'r' #endif #ifndef PERL_MAGIC_sig # define PERL_MAGIC_sig 'S' #endif #ifndef PERL_MAGIC_sigelem # define PERL_MAGIC_sigelem 's' #endif #ifndef PERL_MAGIC_taint # define PERL_MAGIC_taint 't' #endif #ifndef PERL_MAGIC_uvar # define PERL_MAGIC_uvar 'U' #endif #ifndef PERL_MAGIC_uvar_elem # define PERL_MAGIC_uvar_elem 'u' #endif #ifndef PERL_MAGIC_vstring # define PERL_MAGIC_vstring 'V' #endif #ifndef PERL_MAGIC_vec # define PERL_MAGIC_vec 'v' #endif #ifndef PERL_MAGIC_utf8 # define PERL_MAGIC_utf8 'w' #endif #ifndef PERL_MAGIC_substr # define PERL_MAGIC_substr 'x' #endif #ifndef PERL_MAGIC_defelem # define PERL_MAGIC_defelem 'y' #endif #ifndef PERL_MAGIC_glob # define PERL_MAGIC_glob '*' #endif #ifndef PERL_MAGIC_arylen # define PERL_MAGIC_arylen '#' #endif #ifndef PERL_MAGIC_pos # define PERL_MAGIC_pos '.' #endif #ifndef PERL_MAGIC_backref # define PERL_MAGIC_backref '<' #endif #ifndef PERL_MAGIC_ext # define PERL_MAGIC_ext '~' #endif /* That's the best we can do... */ #ifndef sv_catpvn_nomg # define sv_catpvn_nomg sv_catpvn #endif #ifndef sv_catsv_nomg # define sv_catsv_nomg sv_catsv #endif #ifndef sv_setsv_nomg # define sv_setsv_nomg sv_setsv #endif #ifndef sv_pvn_nomg # define sv_pvn_nomg sv_pvn #endif #ifndef SvIV_nomg # define SvIV_nomg SvIV #endif #ifndef SvUV_nomg # define SvUV_nomg SvUV #endif #ifndef sv_catpv_mg # define sv_catpv_mg(sv, ptr) \ STMT_START { \ SV *TeMpSv = sv; \ sv_catpv(TeMpSv,ptr); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef sv_catpvn_mg # define sv_catpvn_mg(sv, ptr, len) \ STMT_START { \ SV *TeMpSv = sv; \ sv_catpvn(TeMpSv,ptr,len); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef sv_catsv_mg # define sv_catsv_mg(dsv, ssv) \ STMT_START { \ SV *TeMpSv = dsv; \ sv_catsv(TeMpSv,ssv); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef sv_setiv_mg # define sv_setiv_mg(sv, i) \ STMT_START { \ SV *TeMpSv = sv; \ sv_setiv(TeMpSv,i); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef sv_setnv_mg # define sv_setnv_mg(sv, num) \ STMT_START { \ SV *TeMpSv = sv; \ sv_setnv(TeMpSv,num); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef sv_setpv_mg # define sv_setpv_mg(sv, ptr) \ STMT_START { \ SV *TeMpSv = sv; \ sv_setpv(TeMpSv,ptr); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef sv_setpvn_mg # define sv_setpvn_mg(sv, ptr, len) \ STMT_START { \ SV *TeMpSv = sv; \ sv_setpvn(TeMpSv,ptr,len); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef sv_setsv_mg # define sv_setsv_mg(dsv, ssv) \ STMT_START { \ SV *TeMpSv = dsv; \ sv_setsv(TeMpSv,ssv); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef sv_setuv_mg # define sv_setuv_mg(sv, i) \ STMT_START { \ SV *TeMpSv = sv; \ sv_setuv(TeMpSv,i); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef sv_usepvn_mg # define sv_usepvn_mg(sv, ptr, len) \ STMT_START { \ SV *TeMpSv = sv; \ sv_usepvn(TeMpSv,ptr,len); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef SvVSTRING_mg # define SvVSTRING_mg(sv) (SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_vstring) : NULL) #endif /* Hint: sv_magic_portable * This is a compatibility function that is only available with * Devel::PPPort. It is NOT in the perl core. * Its purpose is to mimic the 5.8.0 behaviour of sv_magic() when * it is being passed a name pointer with namlen == 0. In that * case, perl 5.8.0 and later store the pointer, not a copy of it. * The compatibility can be provided back to perl 5.004. With * earlier versions, the code will not compile. */ #if (PERL_BCDVERSION < 0x5004000) /* code that uses sv_magic_portable will not compile */ #elif (PERL_BCDVERSION < 0x5008000) # define sv_magic_portable(sv, obj, how, name, namlen) \ STMT_START { \ SV *SvMp_sv = (sv); \ char *SvMp_name = (char *) (name); \ I32 SvMp_namlen = (namlen); \ if (SvMp_name && SvMp_namlen == 0) \ { \ MAGIC *mg; \ sv_magic(SvMp_sv, obj, how, 0, 0); \ mg = SvMAGIC(SvMp_sv); \ mg->mg_len = -42; /* XXX: this is the tricky part */ \ mg->mg_ptr = SvMp_name; \ } \ else \ { \ sv_magic(SvMp_sv, obj, how, SvMp_name, SvMp_namlen); \ } \ } STMT_END #else # define sv_magic_portable(a, b, c, d, e) sv_magic(a, b, c, d, e) #endif #ifdef USE_ITHREADS #ifndef CopFILE # define CopFILE(c) ((c)->cop_file) #endif #ifndef CopFILEGV # define CopFILEGV(c) (CopFILE(c) ? gv_fetchfile(CopFILE(c)) : Nullgv) #endif #ifndef CopFILE_set # define CopFILE_set(c,pv) ((c)->cop_file = savepv(pv)) #endif #ifndef CopFILESV # define CopFILESV(c) (CopFILE(c) ? GvSV(gv_fetchfile(CopFILE(c))) : Nullsv) #endif #ifndef CopFILEAV # define CopFILEAV(c) (CopFILE(c) ? GvAV(gv_fetchfile(CopFILE(c))) : Nullav) #endif #ifndef CopSTASHPV # define CopSTASHPV(c) ((c)->cop_stashpv) #endif #ifndef CopSTASHPV_set # define CopSTASHPV_set(c,pv) ((c)->cop_stashpv = ((pv) ? savepv(pv) : Nullch)) #endif #ifndef CopSTASH # define CopSTASH(c) (CopSTASHPV(c) ? gv_stashpv(CopSTASHPV(c),GV_ADD) : Nullhv) #endif #ifndef CopSTASH_set # define CopSTASH_set(c,hv) CopSTASHPV_set(c, (hv) ? HvNAME(hv) : Nullch) #endif #ifndef CopSTASH_eq # define CopSTASH_eq(c,hv) ((hv) && (CopSTASHPV(c) == HvNAME(hv) \ || (CopSTASHPV(c) && HvNAME(hv) \ && strEQ(CopSTASHPV(c), HvNAME(hv))))) #endif #else #ifndef CopFILEGV # define CopFILEGV(c) ((c)->cop_filegv) #endif #ifndef CopFILEGV_set # define CopFILEGV_set(c,gv) ((c)->cop_filegv = (GV*)SvREFCNT_inc(gv)) #endif #ifndef CopFILE_set # define CopFILE_set(c,pv) CopFILEGV_set((c), gv_fetchfile(pv)) #endif #ifndef CopFILESV # define CopFILESV(c) (CopFILEGV(c) ? GvSV(CopFILEGV(c)) : Nullsv) #endif #ifndef CopFILEAV # define CopFILEAV(c) (CopFILEGV(c) ? GvAV(CopFILEGV(c)) : Nullav) #endif #ifndef CopFILE # define CopFILE(c) (CopFILESV(c) ? SvPVX(CopFILESV(c)) : Nullch) #endif #ifndef CopSTASH # define CopSTASH(c) ((c)->cop_stash) #endif #ifndef CopSTASH_set # define CopSTASH_set(c,hv) ((c)->cop_stash = (hv)) #endif #ifndef CopSTASHPV # define CopSTASHPV(c) (CopSTASH(c) ? HvNAME(CopSTASH(c)) : Nullch) #endif #ifndef CopSTASHPV_set # define CopSTASHPV_set(c,pv) CopSTASH_set((c), gv_stashpv(pv,GV_ADD)) #endif #ifndef CopSTASH_eq # define CopSTASH_eq(c,hv) (CopSTASH(c) == (hv)) #endif #endif /* USE_ITHREADS */ #ifndef IN_PERL_COMPILETIME # define IN_PERL_COMPILETIME (PL_curcop == &PL_compiling) #endif #ifndef IN_LOCALE_RUNTIME # define IN_LOCALE_RUNTIME (PL_curcop->op_private & HINT_LOCALE) #endif #ifndef IN_LOCALE_COMPILETIME # define IN_LOCALE_COMPILETIME (PL_hints & HINT_LOCALE) #endif #ifndef IN_LOCALE # define IN_LOCALE (IN_PERL_COMPILETIME ? IN_LOCALE_COMPILETIME : IN_LOCALE_RUNTIME) #endif #ifndef IS_NUMBER_IN_UV # define IS_NUMBER_IN_UV 0x01 #endif #ifndef IS_NUMBER_GREATER_THAN_UV_MAX # define IS_NUMBER_GREATER_THAN_UV_MAX 0x02 #endif #ifndef IS_NUMBER_NOT_INT # define IS_NUMBER_NOT_INT 0x04 #endif #ifndef IS_NUMBER_NEG # define IS_NUMBER_NEG 0x08 #endif #ifndef IS_NUMBER_INFINITY # define IS_NUMBER_INFINITY 0x10 #endif #ifndef IS_NUMBER_NAN # define IS_NUMBER_NAN 0x20 #endif #ifndef GROK_NUMERIC_RADIX # define GROK_NUMERIC_RADIX(sp, send) grok_numeric_radix(sp, send) #endif #ifndef PERL_SCAN_GREATER_THAN_UV_MAX # define PERL_SCAN_GREATER_THAN_UV_MAX 0x02 #endif #ifndef PERL_SCAN_SILENT_ILLDIGIT # define PERL_SCAN_SILENT_ILLDIGIT 0x04 #endif #ifndef PERL_SCAN_ALLOW_UNDERSCORES # define PERL_SCAN_ALLOW_UNDERSCORES 0x01 #endif #ifndef PERL_SCAN_DISALLOW_PREFIX # define PERL_SCAN_DISALLOW_PREFIX 0x02 #endif #ifndef grok_numeric_radix #if defined(NEED_grok_numeric_radix) static bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send); static #else extern bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send); #endif #ifdef grok_numeric_radix # undef grok_numeric_radix #endif #define grok_numeric_radix(a,b) DPPP_(my_grok_numeric_radix)(aTHX_ a,b) #define Perl_grok_numeric_radix DPPP_(my_grok_numeric_radix) #if defined(NEED_grok_numeric_radix) || defined(NEED_grok_numeric_radix_GLOBAL) bool DPPP_(my_grok_numeric_radix)(pTHX_ const char **sp, const char *send) { #ifdef USE_LOCALE_NUMERIC #ifdef PL_numeric_radix_sv if (PL_numeric_radix_sv && IN_LOCALE) { STRLEN len; char* radix = SvPV(PL_numeric_radix_sv, len); if (*sp + len <= send && memEQ(*sp, radix, len)) { *sp += len; return TRUE; } } #else /* older perls don't have PL_numeric_radix_sv so the radix * must manually be requested from locale.h */ #include dTHR; /* needed for older threaded perls */ struct lconv *lc = localeconv(); char *radix = lc->decimal_point; if (radix && IN_LOCALE) { STRLEN len = strlen(radix); if (*sp + len <= send && memEQ(*sp, radix, len)) { *sp += len; return TRUE; } } #endif #endif /* USE_LOCALE_NUMERIC */ /* always try "." if numeric radix didn't match because * we may have data from different locales mixed */ if (*sp < send && **sp == '.') { ++*sp; return TRUE; } return FALSE; } #endif #endif #ifndef grok_number #if defined(NEED_grok_number) static int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep); static #else extern int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep); #endif #ifdef grok_number # undef grok_number #endif #define grok_number(a,b,c) DPPP_(my_grok_number)(aTHX_ a,b,c) #define Perl_grok_number DPPP_(my_grok_number) #if defined(NEED_grok_number) || defined(NEED_grok_number_GLOBAL) int DPPP_(my_grok_number)(pTHX_ const char *pv, STRLEN len, UV *valuep) { const char *s = pv; const char *send = pv + len; const UV max_div_10 = UV_MAX / 10; const char max_mod_10 = UV_MAX % 10; int numtype = 0; int sawinf = 0; int sawnan = 0; while (s < send && isSPACE(*s)) s++; if (s == send) { return 0; } else if (*s == '-') { s++; numtype = IS_NUMBER_NEG; } else if (*s == '+') s++; if (s == send) return 0; /* next must be digit or the radix separator or beginning of infinity */ if (isDIGIT(*s)) { /* UVs are at least 32 bits, so the first 9 decimal digits cannot overflow. */ UV value = *s - '0'; /* This construction seems to be more optimiser friendly. (without it gcc does the isDIGIT test and the *s - '0' separately) With it gcc on arm is managing 6 instructions (6 cycles) per digit. In theory the optimiser could deduce how far to unroll the loop before checking for overflow. */ if (++s < send) { int digit = *s - '0'; if (digit >= 0 && digit <= 9) { value = value * 10 + digit; if (++s < send) { digit = *s - '0'; if (digit >= 0 && digit <= 9) { value = value * 10 + digit; if (++s < send) { digit = *s - '0'; if (digit >= 0 && digit <= 9) { value = value * 10 + digit; if (++s < send) { digit = *s - '0'; if (digit >= 0 && digit <= 9) { value = value * 10 + digit; if (++s < send) { digit = *s - '0'; if (digit >= 0 && digit <= 9) { value = value * 10 + digit; if (++s < send) { digit = *s - '0'; if (digit >= 0 && digit <= 9) { value = value * 10 + digit; if (++s < send) { digit = *s - '0'; if (digit >= 0 && digit <= 9) { value = value * 10 + digit; if (++s < send) { digit = *s - '0'; if (digit >= 0 && digit <= 9) { value = value * 10 + digit; if (++s < send) { /* Now got 9 digits, so need to check each time for overflow. */ digit = *s - '0'; while (digit >= 0 && digit <= 9 && (value < max_div_10 || (value == max_div_10 && digit <= max_mod_10))) { value = value * 10 + digit; if (++s < send) digit = *s - '0'; else break; } if (digit >= 0 && digit <= 9 && (s < send)) { /* value overflowed. skip the remaining digits, don't worry about setting *valuep. */ do { s++; } while (s < send && isDIGIT(*s)); numtype |= IS_NUMBER_GREATER_THAN_UV_MAX; goto skip_value; } } } } } } } } } } } } } } } } } } numtype |= IS_NUMBER_IN_UV; if (valuep) *valuep = value; skip_value: if (GROK_NUMERIC_RADIX(&s, send)) { numtype |= IS_NUMBER_NOT_INT; while (s < send && isDIGIT(*s)) /* optional digits after the radix */ s++; } } else if (GROK_NUMERIC_RADIX(&s, send)) { numtype |= IS_NUMBER_NOT_INT | IS_NUMBER_IN_UV; /* valuep assigned below */ /* no digits before the radix means we need digits after it */ if (s < send && isDIGIT(*s)) { do { s++; } while (s < send && isDIGIT(*s)); if (valuep) { /* integer approximation is valid - it's 0. */ *valuep = 0; } } else return 0; } else if (*s == 'I' || *s == 'i') { s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; s++; if (s == send || (*s != 'F' && *s != 'f')) return 0; s++; if (s < send && (*s == 'I' || *s == 'i')) { s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; s++; if (s == send || (*s != 'I' && *s != 'i')) return 0; s++; if (s == send || (*s != 'T' && *s != 't')) return 0; s++; if (s == send || (*s != 'Y' && *s != 'y')) return 0; s++; } sawinf = 1; } else if (*s == 'N' || *s == 'n') { /* XXX TODO: There are signaling NaNs and quiet NaNs. */ s++; if (s == send || (*s != 'A' && *s != 'a')) return 0; s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; s++; sawnan = 1; } else return 0; if (sawinf) { numtype &= IS_NUMBER_NEG; /* Keep track of sign */ numtype |= IS_NUMBER_INFINITY | IS_NUMBER_NOT_INT; } else if (sawnan) { numtype &= IS_NUMBER_NEG; /* Keep track of sign */ numtype |= IS_NUMBER_NAN | IS_NUMBER_NOT_INT; } else if (s < send) { /* we can have an optional exponent part */ if (*s == 'e' || *s == 'E') { /* The only flag we keep is sign. Blow away any "it's UV" */ numtype &= IS_NUMBER_NEG; numtype |= IS_NUMBER_NOT_INT; s++; if (s < send && (*s == '-' || *s == '+')) s++; if (s < send && isDIGIT(*s)) { do { s++; } while (s < send && isDIGIT(*s)); } else return 0; } } while (s < send && isSPACE(*s)) s++; if (s >= send) return numtype; if (len == 10 && memEQ(pv, "0 but true", 10)) { if (valuep) *valuep = 0; return IS_NUMBER_IN_UV; } return 0; } #endif #endif /* * The grok_* routines have been modified to use warn() instead of * Perl_warner(). Also, 'hexdigit' was the former name of PL_hexdigit, * which is why the stack variable has been renamed to 'xdigit'. */ #ifndef grok_bin #if defined(NEED_grok_bin) static UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); static #else extern UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); #endif #ifdef grok_bin # undef grok_bin #endif #define grok_bin(a,b,c,d) DPPP_(my_grok_bin)(aTHX_ a,b,c,d) #define Perl_grok_bin DPPP_(my_grok_bin) #if defined(NEED_grok_bin) || defined(NEED_grok_bin_GLOBAL) UV DPPP_(my_grok_bin)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) { const char *s = start; STRLEN len = *len_p; UV value = 0; NV value_nv = 0; const UV max_div_2 = UV_MAX / 2; bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; bool overflowed = FALSE; if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) { /* strip off leading b or 0b. for compatibility silently suffer "b" and "0b" as valid binary numbers. */ if (len >= 1) { if (s[0] == 'b') { s++; len--; } else if (len >= 2 && s[0] == '0' && s[1] == 'b') { s+=2; len-=2; } } } for (; len-- && *s; s++) { char bit = *s; if (bit == '0' || bit == '1') { /* Write it in this wonky order with a goto to attempt to get the compiler to make the common case integer-only loop pretty tight. With gcc seems to be much straighter code than old scan_bin. */ redo: if (!overflowed) { if (value <= max_div_2) { value = (value << 1) | (bit - '0'); continue; } /* Bah. We're just overflowed. */ warn("Integer overflow in binary number"); overflowed = TRUE; value_nv = (NV) value; } value_nv *= 2.0; /* If an NV has not enough bits in its mantissa to * represent a UV this summing of small low-order numbers * is a waste of time (because the NV cannot preserve * the low-order bits anyway): we could just remember when * did we overflow and in the end just multiply value_nv by the * right amount. */ value_nv += (NV)(bit - '0'); continue; } if (bit == '_' && len && allow_underscores && (bit = s[1]) && (bit == '0' || bit == '1')) { --len; ++s; goto redo; } if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) warn("Illegal binary digit '%c' ignored", *s); break; } if ( ( overflowed && value_nv > 4294967295.0) #if UVSIZE > 4 || (!overflowed && value > 0xffffffff ) #endif ) { warn("Binary number > 0b11111111111111111111111111111111 non-portable"); } *len_p = s - start; if (!overflowed) { *flags = 0; return value; } *flags = PERL_SCAN_GREATER_THAN_UV_MAX; if (result) *result = value_nv; return UV_MAX; } #endif #endif #ifndef grok_hex #if defined(NEED_grok_hex) static UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); static #else extern UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); #endif #ifdef grok_hex # undef grok_hex #endif #define grok_hex(a,b,c,d) DPPP_(my_grok_hex)(aTHX_ a,b,c,d) #define Perl_grok_hex DPPP_(my_grok_hex) #if defined(NEED_grok_hex) || defined(NEED_grok_hex_GLOBAL) UV DPPP_(my_grok_hex)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) { const char *s = start; STRLEN len = *len_p; UV value = 0; NV value_nv = 0; const UV max_div_16 = UV_MAX / 16; bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; bool overflowed = FALSE; const char *xdigit; if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) { /* strip off leading x or 0x. for compatibility silently suffer "x" and "0x" as valid hex numbers. */ if (len >= 1) { if (s[0] == 'x') { s++; len--; } else if (len >= 2 && s[0] == '0' && s[1] == 'x') { s+=2; len-=2; } } } for (; len-- && *s; s++) { xdigit = strchr((char *) PL_hexdigit, *s); if (xdigit) { /* Write it in this wonky order with a goto to attempt to get the compiler to make the common case integer-only loop pretty tight. With gcc seems to be much straighter code than old scan_hex. */ redo: if (!overflowed) { if (value <= max_div_16) { value = (value << 4) | ((xdigit - PL_hexdigit) & 15); continue; } warn("Integer overflow in hexadecimal number"); overflowed = TRUE; value_nv = (NV) value; } value_nv *= 16.0; /* If an NV has not enough bits in its mantissa to * represent a UV this summing of small low-order numbers * is a waste of time (because the NV cannot preserve * the low-order bits anyway): we could just remember when * did we overflow and in the end just multiply value_nv by the * right amount of 16-tuples. */ value_nv += (NV)((xdigit - PL_hexdigit) & 15); continue; } if (*s == '_' && len && allow_underscores && s[1] && (xdigit = strchr((char *) PL_hexdigit, s[1]))) { --len; ++s; goto redo; } if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) warn("Illegal hexadecimal digit '%c' ignored", *s); break; } if ( ( overflowed && value_nv > 4294967295.0) #if UVSIZE > 4 || (!overflowed && value > 0xffffffff ) #endif ) { warn("Hexadecimal number > 0xffffffff non-portable"); } *len_p = s - start; if (!overflowed) { *flags = 0; return value; } *flags = PERL_SCAN_GREATER_THAN_UV_MAX; if (result) *result = value_nv; return UV_MAX; } #endif #endif #ifndef grok_oct #if defined(NEED_grok_oct) static UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); static #else extern UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); #endif #ifdef grok_oct # undef grok_oct #endif #define grok_oct(a,b,c,d) DPPP_(my_grok_oct)(aTHX_ a,b,c,d) #define Perl_grok_oct DPPP_(my_grok_oct) #if defined(NEED_grok_oct) || defined(NEED_grok_oct_GLOBAL) UV DPPP_(my_grok_oct)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) { const char *s = start; STRLEN len = *len_p; UV value = 0; NV value_nv = 0; const UV max_div_8 = UV_MAX / 8; bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; bool overflowed = FALSE; for (; len-- && *s; s++) { /* gcc 2.95 optimiser not smart enough to figure that this subtraction out front allows slicker code. */ int digit = *s - '0'; if (digit >= 0 && digit <= 7) { /* Write it in this wonky order with a goto to attempt to get the compiler to make the common case integer-only loop pretty tight. */ redo: if (!overflowed) { if (value <= max_div_8) { value = (value << 3) | digit; continue; } /* Bah. We're just overflowed. */ warn("Integer overflow in octal number"); overflowed = TRUE; value_nv = (NV) value; } value_nv *= 8.0; /* If an NV has not enough bits in its mantissa to * represent a UV this summing of small low-order numbers * is a waste of time (because the NV cannot preserve * the low-order bits anyway): we could just remember when * did we overflow and in the end just multiply value_nv by the * right amount of 8-tuples. */ value_nv += (NV)digit; continue; } if (digit == ('_' - '0') && len && allow_underscores && (digit = s[1] - '0') && (digit >= 0 && digit <= 7)) { --len; ++s; goto redo; } /* Allow \octal to work the DWIM way (that is, stop scanning * as soon as non-octal characters are seen, complain only iff * someone seems to want to use the digits eight and nine). */ if (digit == 8 || digit == 9) { if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) warn("Illegal octal digit '%c' ignored", *s); } break; } if ( ( overflowed && value_nv > 4294967295.0) #if UVSIZE > 4 || (!overflowed && value > 0xffffffff ) #endif ) { warn("Octal number > 037777777777 non-portable"); } *len_p = s - start; if (!overflowed) { *flags = 0; return value; } *flags = PERL_SCAN_GREATER_THAN_UV_MAX; if (result) *result = value_nv; return UV_MAX; } #endif #endif #if !defined(my_snprintf) #if defined(NEED_my_snprintf) static int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...); static #else extern int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...); #endif #define my_snprintf DPPP_(my_my_snprintf) #define Perl_my_snprintf DPPP_(my_my_snprintf) #if defined(NEED_my_snprintf) || defined(NEED_my_snprintf_GLOBAL) int DPPP_(my_my_snprintf)(char *buffer, const Size_t len, const char *format, ...) { dTHX; int retval; va_list ap; va_start(ap, format); #ifdef HAS_VSNPRINTF retval = vsnprintf(buffer, len, format, ap); #else retval = vsprintf(buffer, format, ap); #endif va_end(ap); if (retval < 0 || (len > 0 && (Size_t)retval >= len)) Perl_croak(aTHX_ "panic: my_snprintf buffer overflow"); return retval; } #endif #endif #if !defined(my_sprintf) #if defined(NEED_my_sprintf) static int DPPP_(my_my_sprintf)(char * buffer, const char * pat, ...); static #else extern int DPPP_(my_my_sprintf)(char * buffer, const char * pat, ...); #endif #define my_sprintf DPPP_(my_my_sprintf) #define Perl_my_sprintf DPPP_(my_my_sprintf) #if defined(NEED_my_sprintf) || defined(NEED_my_sprintf_GLOBAL) int DPPP_(my_my_sprintf)(char *buffer, const char* pat, ...) { va_list args; va_start(args, pat); vsprintf(buffer, pat, args); va_end(args); return strlen(buffer); } #endif #endif #ifdef NO_XSLOCKS # ifdef dJMPENV # define dXCPT dJMPENV; int rEtV = 0 # define XCPT_TRY_START JMPENV_PUSH(rEtV); if (rEtV == 0) # define XCPT_TRY_END JMPENV_POP; # define XCPT_CATCH if (rEtV != 0) # define XCPT_RETHROW JMPENV_JUMP(rEtV) # else # define dXCPT Sigjmp_buf oldTOP; int rEtV = 0 # define XCPT_TRY_START Copy(top_env, oldTOP, 1, Sigjmp_buf); rEtV = Sigsetjmp(top_env, 1); if (rEtV == 0) # define XCPT_TRY_END Copy(oldTOP, top_env, 1, Sigjmp_buf); # define XCPT_CATCH if (rEtV != 0) # define XCPT_RETHROW Siglongjmp(top_env, rEtV) # endif #endif #if !defined(my_strlcat) #if defined(NEED_my_strlcat) static Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size); static #else extern Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size); #endif #define my_strlcat DPPP_(my_my_strlcat) #define Perl_my_strlcat DPPP_(my_my_strlcat) #if defined(NEED_my_strlcat) || defined(NEED_my_strlcat_GLOBAL) Size_t DPPP_(my_my_strlcat)(char *dst, const char *src, Size_t size) { Size_t used, length, copy; used = strlen(dst); length = strlen(src); if (size > 0 && used < size - 1) { copy = (length >= size - used) ? size - used - 1 : length; memcpy(dst + used, src, copy); dst[used + copy] = '\0'; } return used + length; } #endif #endif #if !defined(my_strlcpy) #if defined(NEED_my_strlcpy) static Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size); static #else extern Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size); #endif #define my_strlcpy DPPP_(my_my_strlcpy) #define Perl_my_strlcpy DPPP_(my_my_strlcpy) #if defined(NEED_my_strlcpy) || defined(NEED_my_strlcpy_GLOBAL) Size_t DPPP_(my_my_strlcpy)(char *dst, const char *src, Size_t size) { Size_t length, copy; length = strlen(src); if (size > 0) { copy = (length >= size) ? size - 1 : length; memcpy(dst, src, copy); dst[copy] = '\0'; } return length; } #endif #endif #ifndef PERL_PV_ESCAPE_QUOTE # define PERL_PV_ESCAPE_QUOTE 0x0001 #endif #ifndef PERL_PV_PRETTY_QUOTE # define PERL_PV_PRETTY_QUOTE PERL_PV_ESCAPE_QUOTE #endif #ifndef PERL_PV_PRETTY_ELLIPSES # define PERL_PV_PRETTY_ELLIPSES 0x0002 #endif #ifndef PERL_PV_PRETTY_LTGT # define PERL_PV_PRETTY_LTGT 0x0004 #endif #ifndef PERL_PV_ESCAPE_FIRSTCHAR # define PERL_PV_ESCAPE_FIRSTCHAR 0x0008 #endif #ifndef PERL_PV_ESCAPE_UNI # define PERL_PV_ESCAPE_UNI 0x0100 #endif #ifndef PERL_PV_ESCAPE_UNI_DETECT # define PERL_PV_ESCAPE_UNI_DETECT 0x0200 #endif #ifndef PERL_PV_ESCAPE_ALL # define PERL_PV_ESCAPE_ALL 0x1000 #endif #ifndef PERL_PV_ESCAPE_NOBACKSLASH # define PERL_PV_ESCAPE_NOBACKSLASH 0x2000 #endif #ifndef PERL_PV_ESCAPE_NOCLEAR # define PERL_PV_ESCAPE_NOCLEAR 0x4000 #endif #ifndef PERL_PV_ESCAPE_RE # define PERL_PV_ESCAPE_RE 0x8000 #endif #ifndef PERL_PV_PRETTY_NOCLEAR # define PERL_PV_PRETTY_NOCLEAR PERL_PV_ESCAPE_NOCLEAR #endif #ifndef PERL_PV_PRETTY_DUMP # define PERL_PV_PRETTY_DUMP PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_QUOTE #endif #ifndef PERL_PV_PRETTY_REGPROP # define PERL_PV_PRETTY_REGPROP PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_LTGT|PERL_PV_ESCAPE_RE #endif /* Hint: pv_escape * Note that unicode functionality is only backported to * those perl versions that support it. For older perl * versions, the implementation will fall back to bytes. */ #ifndef pv_escape #if defined(NEED_pv_escape) static char * DPPP_(my_pv_escape)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags); static #else extern char * DPPP_(my_pv_escape)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags); #endif #ifdef pv_escape # undef pv_escape #endif #define pv_escape(a,b,c,d,e,f) DPPP_(my_pv_escape)(aTHX_ a,b,c,d,e,f) #define Perl_pv_escape DPPP_(my_pv_escape) #if defined(NEED_pv_escape) || defined(NEED_pv_escape_GLOBAL) char * DPPP_(my_pv_escape)(pTHX_ SV *dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags) { const char esc = flags & PERL_PV_ESCAPE_RE ? '%' : '\\'; const char dq = flags & PERL_PV_ESCAPE_QUOTE ? '"' : esc; char octbuf[32] = "%123456789ABCDF"; STRLEN wrote = 0; STRLEN chsize = 0; STRLEN readsize = 1; #if defined(is_utf8_string) && defined(utf8_to_uvchr) bool isuni = flags & PERL_PV_ESCAPE_UNI ? 1 : 0; #endif const char *pv = str; const char * const end = pv + count; octbuf[0] = esc; if (!(flags & PERL_PV_ESCAPE_NOCLEAR)) sv_setpvs(dsv, ""); #if defined(is_utf8_string) && defined(utf8_to_uvchr) if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count)) isuni = 1; #endif for (; pv < end && (!max || wrote < max) ; pv += readsize) { const UV u = #if defined(is_utf8_string) && defined(utf8_to_uvchr) isuni ? utf8_to_uvchr((U8*)pv, &readsize) : #endif (U8)*pv; const U8 c = (U8)u & 0xFF; if (u > 255 || (flags & PERL_PV_ESCAPE_ALL)) { if (flags & PERL_PV_ESCAPE_FIRSTCHAR) chsize = my_snprintf(octbuf, sizeof octbuf, "%"UVxf, u); else chsize = my_snprintf(octbuf, sizeof octbuf, "%cx{%"UVxf"}", esc, u); } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) { chsize = 1; } else { if (c == dq || c == esc || !isPRINT(c)) { chsize = 2; switch (c) { case '\\' : /* fallthrough */ case '%' : if (c == esc) octbuf[1] = esc; else chsize = 1; break; case '\v' : octbuf[1] = 'v'; break; case '\t' : octbuf[1] = 't'; break; case '\r' : octbuf[1] = 'r'; break; case '\n' : octbuf[1] = 'n'; break; case '\f' : octbuf[1] = 'f'; break; case '"' : if (dq == '"') octbuf[1] = '"'; else chsize = 1; break; default: chsize = my_snprintf(octbuf, sizeof octbuf, pv < end && isDIGIT((U8)*(pv+readsize)) ? "%c%03o" : "%c%o", esc, c); } } else { chsize = 1; } } if (max && wrote + chsize > max) { break; } else if (chsize > 1) { sv_catpvn(dsv, octbuf, chsize); wrote += chsize; } else { char tmp[2]; my_snprintf(tmp, sizeof tmp, "%c", c); sv_catpvn(dsv, tmp, 1); wrote++; } if (flags & PERL_PV_ESCAPE_FIRSTCHAR) break; } if (escaped != NULL) *escaped= pv - str; return SvPVX(dsv); } #endif #endif #ifndef pv_pretty #if defined(NEED_pv_pretty) static char * DPPP_(my_pv_pretty)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags); static #else extern char * DPPP_(my_pv_pretty)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags); #endif #ifdef pv_pretty # undef pv_pretty #endif #define pv_pretty(a,b,c,d,e,f,g) DPPP_(my_pv_pretty)(aTHX_ a,b,c,d,e,f,g) #define Perl_pv_pretty DPPP_(my_pv_pretty) #if defined(NEED_pv_pretty) || defined(NEED_pv_pretty_GLOBAL) char * DPPP_(my_pv_pretty)(pTHX_ SV *dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags) { const U8 dq = (flags & PERL_PV_PRETTY_QUOTE) ? '"' : '%'; STRLEN escaped; if (!(flags & PERL_PV_PRETTY_NOCLEAR)) sv_setpvs(dsv, ""); if (dq == '"') sv_catpvs(dsv, "\""); else if (flags & PERL_PV_PRETTY_LTGT) sv_catpvs(dsv, "<"); if (start_color != NULL) sv_catpv(dsv, D_PPP_CONSTPV_ARG(start_color)); pv_escape(dsv, str, count, max, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR); if (end_color != NULL) sv_catpv(dsv, D_PPP_CONSTPV_ARG(end_color)); if (dq == '"') sv_catpvs(dsv, "\""); else if (flags & PERL_PV_PRETTY_LTGT) sv_catpvs(dsv, ">"); if ((flags & PERL_PV_PRETTY_ELLIPSES) && escaped < count) sv_catpvs(dsv, "..."); return SvPVX(dsv); } #endif #endif #ifndef pv_display #if defined(NEED_pv_display) static char * DPPP_(my_pv_display)(pTHX_ SV * dsv, const char * pv, STRLEN cur, STRLEN len, STRLEN pvlim); static #else extern char * DPPP_(my_pv_display)(pTHX_ SV * dsv, const char * pv, STRLEN cur, STRLEN len, STRLEN pvlim); #endif #ifdef pv_display # undef pv_display #endif #define pv_display(a,b,c,d,e) DPPP_(my_pv_display)(aTHX_ a,b,c,d,e) #define Perl_pv_display DPPP_(my_pv_display) #if defined(NEED_pv_display) || defined(NEED_pv_display_GLOBAL) char * DPPP_(my_pv_display)(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim) { pv_pretty(dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP); if (len > cur && pv[cur] == '\0') sv_catpvs(dsv, "\\0"); return SvPVX(dsv); } #endif #endif #endif /* _P_P_PORTABILITY_H_ */ /* End of File ppport.h */ XML-Fast-0.17/README000644 000766 000024 00000011307 13125303566 014002 0ustar00monsstaff000000 000000 NAME XML::Fast - Simple and very fast XML - hash conversion SYNOPSIS use XML::Fast; my $hash = xml2hash $xml; my $hash2 = xml2hash $xml, attr => '.', text => '~'; DESCRIPTION This module implements simple, state machine based, XML parser written in C. It could parse and recover some kind of broken XML's. If you need XML validator, use XML::LibXML RATIONALE Another similar module is XML::Bare. I've used it for some time, but it have some failures: * If your XML have node with TextNode, then CDATANode, then again TextNode, you'll got broken value * It doesn't support charsets * It doesn't support any kind of entities. So, after count of tries to fix XML::Bare I've decided to write parser from scratch. Here is some features and principles: * It uses minimal count of memory allocations. * All XML is parsed in 1 scan. * All values are copied from source XML only once (to destination keys/values) * If some types of nodes (for ex comments) are ignored, there are no memory allocations/copy for them. I've removed benchmark results, since they are very different for different xml's. Sometimes XML::Bare is faster, sometimes not. So, XML::Fast mainly should be considered not "faster-than-bare", but "format-other-than-bare" EXPORT xml2hash $xml, [ %options ] hash2xml $hash, [ %options ] OPTIONS order [ = 0 ] Not implemented yet. Strictly keep the output order. When enabled, structures become more complex, but xml could be completely reverted. attr [ = '-' ] Attribute prefix => { node => { -attr => "test" } } text [ = '#text' ] Key name for storing text When undef, text nodes will be ignored text => { node => { sub => '', '#text' => "test" } } join [ = '' ] Join separator for text nodes, splitted by subnodes Ignored when "order" in effect # default: xml2hash( 'Test1Test2' ) : { item => { sub => '', '~' => 'Test1Test2' } }; xml2hash( 'Test1Test2', join => '+' ) : { item => { sub => '', '~' => 'Test1+Test2' } }; trim [ = 1 ] Trim leading and trailing whitespace from text nodes cdata [ = undef ] When defined, CDATA sections will be stored under this key # cdata = undef => { node => 'test' } # cdata = '#' => { node => { '#' => 'test' } } comm [ = undef ] When defined, comments sections will be stored under this key When undef, comments will be ignored # comm = undef => { node => { sub => '' } } # comm = '/' => { node => { sub => '', '/' => 'comm' } } array => 1 Force all nodes to be kept as arrays. # no array => { node => { sub => '' } } # array = 1 => { node => [ { sub => [ '' ] } ] } array => [ 'node', 'names'] Force nodes with names to be stored as arrays # no array => { node => { sub => '' } } # array => ['sub'] => { node => { sub => [ '' ] } } utf8decode => 1 Force decoding of utf8 sequences, instead of just upgrading them (may be useful for broken xml) SEE ALSO * XML::Bare Another fast parser * XML::LibXML The most powerful XML parser for perl. If you don't need to parse gigabytes of XML ;) * XML::Hash::LX XML parser, that uses XML::LibXML for parsing and then constructs hash structure, identical to one, generated by this module. (At least, it should ;)). But of course it is much more slower, than XML::Fast LIMITATIONS * Does not support wide charsets (UTF-16/32) (see RT71534 ) TODO * Ordered mode (as implemented in XML::Hash::LX) * Create hash2xml, identical to one in XML::Hash::LX * Partial content event-based parsing (I need this for reading XML streams) Patches, propositions and bug reports are welcome ;) AUTHOR Mons Anderson, COPYRIGHT AND LICENSE Copyright (C) 2010 Mons Anderson This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. XML-Fast-0.17/t/000755 000766 000024 00000000000 13125303577 013365 5ustar00monsstaff000000 000000 XML-Fast-0.17/xmlfast.c000644 000766 000024 00000040331 13123552546 014745 0ustar00monsstaff000000 000000 #include "xmlfast.h" #define case_wsp \ case 0xa : context->line_number++; \ case 0x9 :\ case 0xd :\ case 0x20 #ifndef XML_DEBUG #define XML_DEBUG 0 #endif #if XML_DEBUG #define WHERESTR " at %s line %d.\n" #define WHEREARG __FILE__, __LINE__ #define debug(...) do{ fprintf(stderr, __VA_ARGS__); fprintf(stderr, WHERESTR, WHEREARG); } while(0) #else #define debug(...) #endif #define DOCUMENT_START 0 #define LT_OPEN 1 #define COMMENT_OPEN 2 #define CDATA_OPEN 3 #define PI 4 #define CONTENT_WAIT 5 #define TAG_OPEN 6 #define TAG_CLOSE 7 #define TEXT_READ 8 #define TEXT_DATA 9 #define TEXT_INITWSP 10 #define TEXT_WSP 11 #define DOCUMENT_ABORTED 12 static char *STATE[DOCUMENT_ABORTED+1] = { "DOCUMENT_START" ,"LT_OPEN" ,"COMMENT_OPEN" ,"CDATA_OPEN" ,"PI" ,"CONTENT_WAIT" ,"TAG_OPEN" ,"TAG_CLOSE" ,"TEXT_READ" ,"TEXT_DATA" ,"TEXT_INITWSP" ,"TEXT_WSP" ,"DOCUMENT_ABORTED" }; static inline char * eat_wsp(parser_state * context, char *p) { while (1) { switch (*p) { case 0: return p; case_wsp : break; default: return p; } p++; } } static inline char * eatback_wsp(parser_state * context, char *p) { while (1) { switch (*p) { case 0: return p; case_wsp : break; default: return p; } p--; } } static inline char *parse_entity (parser_state * context, char *p) { //return p+1; entityref_t *cur_ent; char *at; at = p; unsigned int i; if (*(p+1) == '#') { p+=2; wchar_t chr = 0; if (*p == 'x') { p++; while(1) { if (*p >= '0' && *p <= '9') { chr *= 16; chr += (*p++ - '0'); } else if (*p >= 'a' && *p <= 'f') { chr *= 16; chr += (*p++ - 'a' + 10); } else if (*p >= 'A' && *p <= 'F') { chr *= 16; chr += (*p++ - 'A' + 10); } else break; } } else { while(*p >= '0' && *p <= '9') { chr *= 10; chr += (*p++ - '0'); } } if ( *p == ';' ) p++; if (chr > 0 && chr <= 0x2FFFF) { if (context->cb.uchar) context->cb.uchar(context->ctx, chr); } else { if (context->cb.warn) { char back = *p; *p = 0; context->cb.warn(context->ctx,"Bad entity value %s",at); *p = back; } if (context->cb.bytespart) context->cb.bytespart(context->ctx, at, p - at); } return p; } cur_ent = entities; next_ent: if (*p == 0) return 0; p++; if (*p == ';') { if (cur_ent && cur_ent->entity) { p++; goto ret; } else { goto no_ent; } } for (i=0; i < cur_ent->children; i++) { if (cur_ent->more[i].c == *p) { cur_ent = &cur_ent->more[i]; goto next_ent; } } if (cur_ent && cur_ent->entity) { goto ret; } no_ent: if (p == at) p++; if (context->cb.bytespart) context->cb.bytespart(context->ctx, at, p - at); return p; ret: if (context->cb.bytespart) context->cb.bytespart(context->ctx, cur_ent->entity, cur_ent->length); return p; } /* static void print_chain (xml_node *chain, int depth) { int i; xml_node * node; printf(":>> "); for (i=0; i < depth; i++) { node = &chain[i]; printf("%s",node->name); if (i < depth-1 )printf(" > "); } printf("\n"); } */ static inline char *parse_attrs(char *p, parser_state * context) { void * ctx = context->ctx; xml_callbacks * cb = &context->cb; char state = 0; /* * state=0 - default, waiting for attr name or /?> * state=1 - reading attr name * state=2 - reading attr value */ char wait = 0; char loop = 1; char *at,*end; p = eat_wsp(context, p); while(loop) { switch(state) { case 0: // waiting for attr name //printf("Want attr name, char='%c'\n",*p); while(state == 0) { switch(*p) { case 0 : if (context->cb.die) context->cb.die(ctx,"Document aborted"); return 0; case_wsp : p = eat_wsp(context, p); break; case '>' : case '?' : case '/' : return p; default : state = 1; } } break; case 1: //reading attr name at = p; end = 0; //printf("Want = (%c)\n",*p); while(state == 1) { switch(*p) { case 0 : if (context->cb.die) context->cb.die(ctx,"Document aborted");return 0; case_wsp : end = p; p = eat_wsp(context, p); if (*p != '=') { if (context->cb.die) context->cb.die(ctx,"No = after whitespace while reading attr name"); return 0; } case '=': if (!end) end = p; if (cb->attrname) cb->attrname( ctx, at, end - at ); p = eat_wsp(context, p + 1); state = 2; break; default: p++; } } break; case 2: wait = 0; //printf("Want quote (%c)\n",*p); while(state == 2) { switch(*p) { case 0 : if (context->cb.die) context->cb.die(ctx,"Document aborted");return 0; case '\'': case '"': if (!wait) { // got open quote //printf("\tgot open quote <%c>\n",*p); wait = *p; p++; at = p; break; } else if (*p == wait) { // got close quote //printf("\tgot close quote <%c>\n",*p); state = 0; if(cb->bytes) cb->bytes( ctx, at, p - at ); p = eat_wsp(context, p+1); break; } case '&': if (wait) { //printf("Got entity begin (%s)\n",buffer); if (p > at && cb->bytespart) cb->bytespart( ctx, at, p - at ); if( p = parse_entity(context, p) ) { at = p; break; } } else { if (context->cb.die) context->cb.die(ctx,"Not waiting for & in state 2"); return 0; } default: p++; } } break; default: if (context->cb.warn) context->cb.warn(ctx, "default, state=%d, char='%c'\n",state, *p); return 0; } } return p; } void parse (char * xml, parser_state * context) { void * ctx = context->ctx; xml_callbacks * cb = &context->cb; context->line_number = 1; char *p, *at, *start, *end, *search, buffer[BUFFER]; memset(&buffer,0,BUFFER); unsigned int state, len; unsigned char textstate; p = xml; /* xml_node *seek, *reverse; context->chain_size = 64; Newx( context->chain, context->chain_size, xml_node); context->root = context->chain; */ context->state = DOCUMENT_START; next: while (1) { switch(*p) { case 0: goto eod; case '<': context->state = LT_OPEN; p++; switch (*p) { case 0: goto eod; case '!': p++; if(*p == 0) goto eod; if ( strncmp( p, "--", 2 ) == 0 ) { context->state = COMMENT_OPEN; p+=2; search = strstr(p,"-->"); if (search) { if (cb->comment) { cb->comment( ctx, p, search - p ); } p = search + 3; } else xml_error("Comment node not terminated"); context->state = CONTENT_WAIT; goto next; } else if ( strncmp( p, "[CDATA[", 7 ) == 0) { context->state = CDATA_OPEN; p+=7; search = strstr(p,"]]>"); if (search) { if (cb->cdata) { cb->cdata( ctx, p, search - p); } p = search + 3; } else xml_error("Cdata node not terminated"); context->state = CONTENT_WAIT; goto next; } else if ( strncmp(p, "DOCTYPE", 7 ) == 0 ) { p += 7; //p = eat_wsp(p); state = 0; while(state == 0) { switch(*p) { case 0 : xml_error("Doctype not properly terminated"); break; case '[': state = 1; p++; break; case '>': state = 2; p++; break; default : p++; } } if (state == 1) { search = strchr(p,']'); if (search) { //printf("search = %s\n",search); p = eat_wsp(context,search+1); if (*p == '>') { p++; state = 2; } else { xml_error("Doctype not properly terminated"); } } else { xml_error("Doctype intSubset not terminated"); } } //fprintf(stderr,"after doctype: %s\n",p); context->state = CONTENT_WAIT; goto next; } else { xml_error("Malformed document after state = PI; state = 0; p++; at = p; while(state == 0) { switch(*p) { case 0 : xml_error("Processing instruction not terminated"); case_wsp : if (p > at) { debug("PI: want attrs"); end = p; state = 1; break; } else xml_error("Bad processing instruction"); case '?': end = p; p++; if (*p == '>') { p++; state = 3; } else xml_error("Processing instruction not terminated"); break; default: p++; } } if (cb->piopen) cb->piopen( context->ctx, at, end - at ); if (state == 1) { if (!( at = parse_attrs(p,context) )) xml_error("Error parsing PI attributes"); p = at; state = 2; } debug("CB> Got pi name state=%d next='%c'\n",state,*p); if (state == 2) { if (*p == '?' && *(p+1) == '>') { debug("PI correctly closed\n"); p+=2; state = 3; } else xml_error("Processing instruction not terminated"); } if (state != 3) xml_error("Internal error: Bad state after processing instruction"); if (cb->piclose) cb->piclose( context->ctx, at, end - at ); context->state = CONTENT_WAIT; goto next; case '/': // context->state = TAG_CLOSE; p++; at = p; search = strchr(p,'>'); if (search) { p = search + 1; search = eatback_wsp(context, search-1)+1; len = search - at; // DISABLE BALANCING if (len == 0 ) xml_error("Empty close tag name"); if(cb->tagclose) cb->tagclose(ctx, at, len); context->state = CONTENT_WAIT; goto next; // DISABLE BALANCING /* if (context->depth == 0) { if (context->cb.warn) context->cb.warn(context->ctx,"Need to close tag upper than root. Ignored"); context->state = CONTENT_WAIT; goto next; } if (strncmp(context->chain->name, at, len) == 0) { if(cb->tagclose) cb->tagclose(ctx, at, len); context->depth--; context->chain--; } else { if(len+1 > BUFFER) { snprintf(buffer,BUFFER,"%s",at); } else { snprintf(buffer,len+1,"%s",at); } //printf("NODE CLOSE '%s' (unbalanced)\n",buffer); reverse = seek = context->chain; while( seek > context->root ) { seek--; if (strncmp(seek->name, at, len) == 0) { if (context->cb.warn) context->cb.warn(context->ctx,"Found early opened node %s",seek->name); while(context->chain >= seek) { if(cb->tagclose) cb->tagclose(ctx, context->chain->name, context->chain->len); Safefree(context->chain->name); context->chain--; context->depth--; } //optional feature: auto-opening tags //for (seek = chain+2; seek <= reverse; seek++) { // //printf("Auto open %s\n",seek->name); // chain++; // curr_depth++; // *chain = *(chain+1); // if(cb->tagopen) cb->tagopen(ctx, chain->name, chain->len); // //print_chain(root, curr_depth); //} //optional feature: auto-opening tags seek = 0; break; } } if (seek) { if (cb->warn) cb->warn(context->ctx,"Found no open node until root for '%s' at line %d, char %d. Ignored",buffer, context->line_number, p - xml); } else { // TODO ?? } } context->state = CONTENT_WAIT; goto next; */ } else xml_error("Close tag not terminated"); default: // state = 0; context->state = TAG_OPEN; debug("open tag: %.10s...",p); while(state < 3) { switch(state) { case 0: at = p; while(state == 0) { switch(*p) { case 0: xml_error("Unterminated node"); case_wsp : if (p > at) { state = 1; break; } else xml_error("Bad node open"); case '/': case '>': if (p > at) { state = 2; break; } else xml_error("Bad node open"); default: p++; } } len = p - at; /* if (context->depth + 1 > context->chain_size) { seek = context->root; context->chain_size *= 2; Renew( context->root, context->chain_size, xml_node); context->chain = context->root + (context->chain - seek); } if (context->depth++ != 0) context->chain++; context->chain->len = p - at; context->chain->name = safemalloc( context->chain->len + 1 ); memcpy(context->chain->name, at, context->chain->len); context->chain->name[context->chain->len] = '\0'; if (cb->tagopen) cb->tagopen( ctx, at, context->chain->len ); */ debug("opened tag: <%.*s>", p - at, at); if (cb->tagopen) cb->tagopen( ctx, at, p - at ); break; case 1: if (search = parse_attrs(p,context)) { p = search; state = 2; } else xml_error("Error parsing node attributes"); case 2: while(state == 2) { switch(*p) { case 0 : xml_error("Unterminated node"); case_wsp : p = eat_wsp(context, p); case '/' : debug("close tag now: %s -> <%.*s>", at, len, at); if (cb->tagclose) cb->tagclose( ctx, at, len ); /*Safefree(context->chain->name); context->chain--; context->depth--;*/ p = eat_wsp(context, p+1); break; case '>' : state = 3; p++; break; default : xml_error("Bad char at the end of tag"); } } context->state = CONTENT_WAIT; goto next; } } } break; default: context->state = TEXT_READ; start = at = p; char *lastwsp = 0; if (!context->save_wsp) { p = eat_wsp(context, p); if (p > at) start = at = p; } textstate = TEXT_DATA; while (1) { switch(*p) { case 0 : case '<': //if (p > at) { if (!context->save_wsp && textstate == TEXT_WSP) { //printf("Skip trailing whitespace chardata=%d wspdata=%d\n", lastwsp - at, p - lastwsp); } else { lastwsp = p; } if(cb->bytes) { if (lastwsp > at) { cb->bytes(ctx, at, lastwsp - at ); } else { if (p > start) cb->bytes(ctx, "", 0 ); // explicitly terminate } } //} context->state = CONTENT_WAIT; if (*p == 0) goto eod; goto next; case_wsp : if (textstate == TEXT_DATA) { lastwsp = p; } textstate = TEXT_WSP; p++; break; default: textstate = TEXT_DATA; if (*p == '&') { if (p > at && cb->bytespart) cb->bytespart(ctx, at, p - at); if( p = parse_entity(context,p) ) { at = p; break; } else { goto fault; } } p++; } } textstate = TEXT_INITWSP; break; } } //printf("parse done\n"); //Safefree(context->root); return; eod: //printf("End of document, context->state=%d\n",context->state); switch(context->state) { case DOCUMENT_START: if (context->cb.warn) context->cb.warn(ctx,"Empty document"); return; case LT_OPEN: case COMMENT_OPEN: case CDATA_OPEN: case PI: case TAG_OPEN: case TAG_CLOSE: if (context->cb.die) context->cb.die(context->ctx,"Bad document end, state = %s",STATE[context->state]); break; case TEXT_READ: if (context->cb.warn) context->cb.warn(ctx,"Need to call text cb at the end of document"); break; case CONTENT_WAIT: /* if (context->depth == 0) { //printf("END ok\n"); } else { printf("Document aborted\n"); //print_chain(chain,curr_depth); } */ break; default: if (context->cb.warn) context->cb.warn(ctx,"Bad context->state %d at the end of document\n",context->state); } fault: //Safefree(context->root); return; } XML-Fast-0.17/xmlfast.h000644 000766 000024 00000004712 13123553116 014747 0ustar00monsstaff000000 000000 #ifndef _XML_FAST_H_ #define _XML_FAST_H_ #include #include #include #include #include "entities.h" #ifndef safemalloc #define safemalloc malloc #endif #ifndef safecalloc #define safecalloc calloc #endif #ifndef safefree #define safefree free #endif #ifndef saferealloc #define saferealloc realloc #endif #ifndef Newx #define Newx(v,n,t) (v = ( (t*)safemalloc((size_t)((n)*sizeof(t))) ) ) #endif #ifndef Newxz #define Newxz(v,n,t) (v = ( (t*)safecalloc((n),sizeof(t)) ) ) #endif #ifndef Renew #define Renew(v,n,t) (v = ( (t*)saferealloc((void *)(v),(size_t)((n)*sizeof(t))) ) ) #endif #ifndef Safefree #define Safefree(d) safefree((void *)(d)) #endif #define PROCESSING_INSTRUCTION 0x0001 #define TEXT_NODE 0x0002 typedef struct { char * str; char * val; } entity; typedef struct { char *name; char *value; } xml_attr; typedef void (*xml_callback)(void *,char *, unsigned int, unsigned int); typedef struct { void (*piopen)(void *,char *, unsigned int); void (*piclose)(void *,char *, unsigned int); void (*comment)(void *,char *, unsigned int); void (*cdata)(void *,char *, unsigned int); void (*tagopen)(void *,char *, unsigned int); void (*attrname)(void *,char *, unsigned int); void (*tagclose)(void *,char *, unsigned int); void (*bytespart)(void *, char *, unsigned int); void (*bytes)(void *, char *, unsigned int); void (*uchar)(void *, wchar_t); void (*warn)(void *, char *, ...); void (*die)(void *, char *, ...); } xml_callbacks; /* typedef struct { char *name; unsigned int len; } xml_node; */ typedef struct { unsigned line_number; char * last_newline; unsigned int save_wsp; unsigned int state; /* unsigned int chain_size; xml_node * root; xml_node * chain; int depth; */ unsigned int pathsize; unsigned int pathlen; char * path; xml_callbacks cb; void * ctx; // context for the caller, black box for us } parser_state; // BUFFER used for some dummy copy operations. May be safely reduced to smaller numbers #define BUFFER 4096 #define xml_error(x) do { \ if (context->cb.die) \ context->cb.die(context->ctx,"Error at char %ld (%1s): %s", p-xml, *p ? p : "\\0", x); \ else \ fprintf(stderr,"Error at char %ld (%1s): %s\n", p-xml, *p ? p : "\\0", x); \ goto fault; \ } while (0) //Max string lengh for entity name, with trailing '\0' extern void parse (char * xml, parser_state * state); #endif XML-Fast-0.17/t/00-load.t000644 000766 000024 00000001003 13123552546 014700 0ustar00monsstaff000000 000000 #!/usr/bin/env perl # Before `make install' is performed this script should be runnable with # `make test'. After `make install' it should work as `perl XML-Fast.t' ######################### # change 'tests => 1' to 'tests => last_test_to_print'; use strict; use warnings; use Test::More tests => 1; BEGIN { use_ok('XML::Fast') }; ######################### # Insert your test code below, the Test::More module is use()ed here so read # its man page ( perldoc Test::More ) for help writing this test script. XML-Fast-0.17/t/01-conv.t000644 000766 000024 00000021254 13123552546 014741 0ustar00monsstaff000000 000000 #!/use/bin/perl -w use strict; use Test::More; BEGIN { my $add = 0; eval {require Test::NoWarnings;Test::NoWarnings->import; ++$add; 1 } or diag "Test::NoWarnings missed, skipping no warnings test"; plan tests => 27 + $add; eval {require Data::Dumper;Data::Dumper::Dumper(1)} and *dd = sub ($) { Data::Dumper->new([$_[0]])->Indent(0)->Terse(1)->Quotekeys(0)->Useqq(1)->Purity(1)->Dump } or *dd = \&explain; } use XML::Fast 'xml2hash'; # Parsing our $xml1 = q{ a mid b last }; our $xml2 = q{ first & mid & last }; our $xml3 = q{ first & x & last }; our $data; { is_deeply $data = xml2hash($xml1), {root => {'-at' => 'key',nest => {'#text' => 'firstmidlast',vv => '',v => ['a',{'-at' => 'a','#text' => 'b'}]}}}, 'default (1)' or diag dd($data),"\n"; } { is_deeply $data = xml2hash($xml1, cdata => '#cdata'), {root => {'-at' => 'key',nest => {'#cdata' => 'first','#text' => 'midlast',vv => '',v => ['a',{'-at' => 'a','#text' => 'b'}]}}}, 'default (1)' or diag dd($data),"\n"; } { is_deeply $data = xml2hash($xml2), {root => {'-at' => 'key',nest => 'first & mid & last'}}, 'default (2)' or diag dd($data),"\n"; } { is_deeply $data = xml2hash($xml3), {root => {'-at' => 'key',nest => {'#text' => 'first && last',v => 'x'}}}, 'default (3)' or diag dd($data),"\n"; } { is_deeply $data = xml2hash($xml2, join => '+'), {root => {'-at' => 'key',nest => 'first & mid & last'}}, 'join => + (2)' or diag dd($data),"\n"; } { is_deeply $data = xml2hash($xml3, join => '+'), {root => {'-at' => 'key',nest => { '#text' => 'first &+& last', v => 'x' } }}, 'join => + (3)' or diag dd($data),"\n"; } { is_deeply $data = xml2hash($xml1, array => ['root']), {root => [{'-at' => 'key',nest => {'#text' => 'firstmidlast',vv => '',v => ['a',{'-at' => 'a','#text' => 'b'}]}}]}, 'array => root (1)', or diag dd($data),"\n"; } { is_deeply $data = xml2hash($xml1, array => ['nest']), {root => {'-at' => 'key',nest => [{'#text' => 'firstmidlast',vv => '',v => ['a',{'-at' => 'a','#text' => 'b'}]}]}}, 'array => nest (1)', or diag dd($data),"\n"; } { is_deeply $data = xml2hash($xml1, array => 1), {root => [{'-at' => 'key',nest => [{'#text' => 'firstmidlast',vv => [''],v => ['a',{'-at' => 'a','#text' => 'b'}]}]}]}, 'array => 1 (1)', or diag dd($data),"\n"; } { no utf8; use bytes; is_deeply $data = xml2hash("тест☢"), {text => "\x{442}\x{435}\x{441}\x{442}\x{2622}"}, 'utf8.1', or diag explain($data),"\n"; ok utf8::is_utf8($data->{text}), "utf flag ok"; is_deeply $data = xml2hash("тест", bytes => 1), {text => "тест"}, 'utf8.2', or diag explain($data),"\n"; ok !utf8::is_utf8($data->{text}), "utf flag not set"; is_deeply $data = xml2hash("", bytes => 1), {text => ""}, 'utf8.3', or diag explain($data),"\n"; ok !utf8::is_utf8($data->{text}), "utf flag not set"; is_deeply $data = xml2hash(""), {text => "\x{442}\x{435}\x{441}\x{442}"}, 'utf8.4', or diag explain($data),"\n"; ok utf8::is_utf8($data->{text}), "utf flag set"; is_deeply $data = xml2hash("0"), {text => "\x{442}\x{435}\x{441}\x{442}0"}, '1251 + low entity', or diag explain($data),"\n"; ok utf8::is_utf8($data->{text}), "utf flag set"; { is_deeply $data = xml2hash("☢\"""), {text => "\x{442}\x{435}\x{441}\x{442}\x{2622}\"\""}, '1251 + high entity (char mode)', or diag explain($data),"\n"; ok utf8::is_utf8($data->{text}), "utf flag set"; } { is_deeply $data = xml2hash("", bytes => 1, nowarn => 1), {text => "?"}, '1251 + high entity (bytes mode)', or diag explain($data),"\n"; ok !utf8::is_utf8($data->{text}), "utf flag not set"; } { is_deeply $data = xml2hash("«", bytes => 1), {text => ""}, '1251 + high entity (bytes mode), fits to charset', or diag explain($data),"\n"; ok !utf8::is_utf8($data->{text}), "utf flag not set"; } } { is_deeply $data = xml2hash($xml1, array => 1), {root => [{'-at' => 'key',nest => [{'#text' => 'firstmidlast',vv => [''],v => ['a',{'-at' => 'a','#text' => 'b'}]}]}]}, 'array => 1 (1)', or diag explain($data),"\n"; } { is_deeply $data = xml2hash(""), { handshake => '' }, 'empty root', or diag explain($data),"\n"; } __END__ =for rem hash casting is useless and not implemented { is_deeply $data = xml2hash($xml1, hash => ['vv'] ), {root => {'-at' => 'key',nest => {'#text' => 'firstmidlast',vv => {'#text' => ''},v => ['a',{'-at' => 'a','#text' => 'b'}]}}}, 'hash => vv (1)', or diag dd($data),"\n"; } { is_deeply $data = xml2hash($xml1, hash => 1), {root => {'-at' => 'key',nest => {'#text' => 'firstmidlast',vv => {'#text' => ''},v => [{ '#text' => 'a'},{'-at' => 'a','#text' => 'b'}]}}}, 'hash => 1 (1)', or diag dd($data),"\n"; } =cut { is_deeply $data = xml2hash($xml1, attr => '+'), {root => {'+at' => 'key',nest => {'#text' => 'firstmidlast',vv => '',v => ['a',{'+at' => 'a','#text' => 'b'}]}}}, 'attr => + (1)' or diag dd($data),"\n"; } { local $X2H{attr} = '+'; is_deeply $data = xml2hash($xml1), {root => {'+at' => 'key',nest => {'#text' => 'firstmidlast',vv => '',v => ['a',{'+at' => 'a','#text' => 'b'}]}}}, 'X2H.attr = + (1)' or diag dd($data),"\n"; } { is_deeply $data = xml2hash($xml1, text => ''), {root => {'-at' => 'key',nest => {'' => 'firstmidlast',vv => '',v => ['a',{'-at' => 'a','' => 'b'}]}}}, 'text => "" (1)' or diag dd($data),"\n"; } { local $X2H{text} = ''; is_deeply $data = xml2hash($xml1), {root => {'-at' => 'key',nest => {'' => 'firstmidlast',vv => '',v => ['a',{'-at' => 'a','' => 'b'}]}}}, 'X2H.text = "" (1)' or diag dd($data),"\n"; } { is_deeply $data = xml2hash($xml1, join => ' '), {root => {'-at' => 'key',nest => {'#text' => 'first mid last',vv => '',v => ['a',{'-at' => 'a','#text' => 'b'}]}}}, 'join => " " (1)' or diag dd($data),"\n"; } { local $X2H{join} = ' '; is_deeply $data = xml2hash($xml1), {root => {'-at' => 'key',nest => {'#text' => 'first mid last',vv => '',v => ['a',{'-at' => 'a','#text' => 'b'}]}}}, 'X2H.join = " " (1)' or diag dd($data),"\n"; } { is_deeply $data = xml2hash(q{}, comm => '#comment'), {root => {'#comment' => 'test'}}, 'comment node' or diag dd($data),"\n"; } { is_deeply $data = xml2hash(q{test}, text => '#textnode'), {root => { -x => 1, '#textnode' => 'test' }}, 'text node' or diag dd($data),"\n"; } { is_deeply $data = xml2hash(q{}, cdata => '#cdata'), {root => { -x => 1, '#cdata' => 'test' }}, 'cdata node' or diag dd($data),"\n"; } # Composing # Due to unpredictable order of hash keys # { node => { a => 1, b => 2 } } # could be one of: # 12 # 21 # So, in tests used more complex form with predictable order: # { node => [ { a => 1 }, { b => 2 } ] } # which produce always # 12 our $xml = qq{\n}; { is $data = hash2xml( { node => [ { -attr => "test" }, { sub => 'test' }, { tx => { '#text' => ' zzzz ' } } ] } ), qq{$xmltestzzzz\n}, 'default 1', ; } { is $data = hash2xml( { node => [ { _attr => "test" }, { sub => 'test' }, { tx => { '#text' => 'zzzz' } } ] }, attr => '_' ), qq{$xmltestzzzz\n}, 'attr _', ; } { is $data = hash2xml( { node => [ { -attr => "test" }, { sub => 'test' }, { tx => { '~' => 'zzzz' } } ] }, text => '~' ), qq{$xmltestzzzz\n}, 'text ~', ; } { is $data = hash2xml( { node => { sub => [ " \t\n", 'test' ] } }, trim => 1 ), qq{$xmltest\n}, 'trim 0', ; is $data = hash2xml( { node => { sub => [ " \t\n", 'test' ] } }, trim => 0 ), qq{$xml \t\ntest\n}, 'trim 1', ; } { is $data = hash2xml( { node => { sub => { '@' => 'test' } } }, cdata => '@' ), qq{$xml\n}, 'cdata @', ; } { is $data = hash2xml( { node => { sub => { '/' => 'test' } } },comm => '/' ), qq{$xml\n}, 'comm /', ; } XML-Fast-0.17/t/02-doctype.t000644 000766 000024 00000001724 13123552546 015444 0ustar00monsstaff000000 000000 #!/use/bin/perl -w use strict; use Test::More; BEGIN { my $add = 0; eval {require Test::NoWarnings;Test::NoWarnings->import; ++$add; 1 } or diag "Test::NoWarnings missed, skipping no warnings test"; plan tests => 3 + $add; eval {require Data::Dumper;Data::Dumper::Dumper(1)} and *dd = sub ($) { Data::Dumper->new([$_[0]])->Indent(0)->Terse(1)->Quotekeys(0)->Useqq(1)->Purity(1)->Dump } or *dd = \&explain; } use XML::Fast 'xml2hash'; # Parsing my $xml0 = q{}; my $xml1 = q{ ]> Hello! }; my $xml2 = q{Hello!}; our $data; { is_deeply $data = xml2hash($xml0), {}, 'doctype 0' or diag dd($data),"\n"; } { is_deeply $data = xml2hash($xml1), { greeting => 'Hello!' }, 'doctype 1' or diag dd($data),"\n"; } { is_deeply $data = xml2hash($xml2), { greeting => 'Hello!' }, 'doctype 2' or diag dd($data),"\n"; } XML-Fast-0.17/t/03-reports.t000644 000766 000024 00000000674 13123552546 015477 0ustar00monsstaff000000 000000 #!/use/bin/perl -w use strict; use Test::More; BEGIN { my $add = 0; eval {require Test::NoWarnings;Test::NoWarnings->import; ++$add; 1 } or diag "Test::NoWarnings missed, skipping no warnings test"; plan tests => @{[ ]} + $add; } use XML::Fast 'xml2hash'; for () { diag "testing file $_"; my $xml = do { local $/; open my $f,'<',$_; <$f> }; my $xx = XML::Fast::xml2hash($xml); ok ref $xx, "success $_"; } XML-Fast-0.17/t/04-badxml.t000644 000766 000024 00000000541 13123552546 015242 0ustar00monsstaff000000 000000 #!/use/bin/perl -w use strict; use Test::More; BEGIN { plan tests => 0+@{[ ]}; } use XML::Fast 'xml2hash'; for () { diag "testing file $_"; my $xml = do { local $/; open my $f,'<',$_; <$f> }; local $SIG{__WARN__} = sub {}; my $xx = XML::Fast::xml2hash($xml); ok ref $xx, "success $_"; } exit; require Test::NoWarnings;XML-Fast-0.17/t/05-wrongs.t000644 000766 000024 00000005164 13123552546 015321 0ustar00monsstaff000000 000000 #!/use/bin/perl -w use strict; use Test::More; BEGIN { my $add = 0; eval {require Test::NoWarnings;1 } and *had_no_warnings = \&Test::NoWarnings::had_no_warnings or *had_no_warnings = sub {} and diag "Test::NoWarnings missed, skipping no warnings test"; #plan tests => 26 + $add; eval {require Data::Dumper;Data::Dumper::Dumper(1)} and *dd = sub ($) { Data::Dumper->new([$_[0]])->Indent(0)->Terse(1)->Quotekeys(0)->Useqq(1)->Purity(1)->Dump } or *dd = \&explain; } use XML::Fast 'xml2hash'; sub dies_ok(&;@) { my $code = shift; my $name = pop || 'line '.(caller)[2]; my $qr = shift; local $@; if( eval { $code->(); 1} ) { fail $name; } else { if ($qr) { like $@,$qr,"$name - match ok"; } else { diag "died with $@"; } pass $name; } } dies_ok { xml2hash('<') } qr/Bad document end/, 'open tag'; dies_ok { xml2hash('') } qr/Error parsing PI attributes/, 'PI bad attrs'; { local $TODO = 'bad EOD tracking'; } dies_ok { xml2hash('') } qr/Error parsing node attributes/, 'node bad attrs'; dies_ok { xml2hash('<>') } qr/Bad node open/, 'null node'; dies_ok { xml2hash('') } qr/Empty close tag name/, 'null / node'; had_no_warnings(); done_testing();XML-Fast-0.17/t/badxml/000755 000766 000024 00000000000 13125303577 014634 5ustar00monsstaff000000 000000 XML-Fast-0.17/t/reports/000755 000766 000024 00000000000 13125303577 015063 5ustar00monsstaff000000 000000 XML-Fast-0.17/t/reports/01.xml000644 000766 000024 00000261702 13123552546 016035 0ustar00monsstaff000000 000000 Артём Сапегин http://sapegin.livejournal.com/ Артём Сапегин - LiveJournal.com artem@sapegin.ru Fri, 06 Aug 2010 08:43:39 GMT LiveJournal / LiveJournal.com sapegin 3669774 personal http://l-userpic.livejournal.com/96787621/3669774 Артём Сапегин http://sapegin.livejournal.com/ 100 100 http://sapegin.livejournal.com/395982.html Fri, 06 Aug 2010 08:43:39 GMT Медведь со штативом в зубах artem@sapegin.ru http://sapegin.livejournal.com/395982.html <p>Продолжим тему <a href="http://birdwatcher.ru/entry/4097" title="О сложностях, подстерегающих фото- и видеоанималистов">любви животных и фотографов</a>. Перед вами медведь, отнявший у одного из туристов штатив, — <span class="nobr">медведю-то</span> оно всяко нужнее.</p> <p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/08/alg_polar_bear_tripod.jpg" alt="Медведь со штативом в зубах" title="Медведь со штативом в зубах" width="485" height="365" /><br /> <small>© National News/ZUMApress.com, <a href="http://www.nydailynews.com/lifestyle/pets/2010/04/15/2010-04-15_camerashy_polar_bear_charges_tourist_group_takes_off_with_tripod.html">отсюда</a></small></p><div style="text-align:right"><small><a href="http://birdwatcher.ru/entry/4710" title="Birdwatcher.ru">#</a></small></div> http://sapegin.livejournal.com/395982.html О фотографии Фотографы public 2 http://sapegin.livejournal.com/395604.html Mon, 26 Jul 2010 09:53:17 GMT Последний свет на Куршской косе artem@sapegin.ru http://sapegin.livejournal.com/395604.html <div style="overflow:hidden;height:600px;text-align:center"><img src="http://decisivemoment.ru/photos/Kurshskaya_Kosa_2010/2010-07-08_5D_8031_Artem_Sapegin.jpg" alt="Последний свет на Куршской косе" width="900" height="613" /></div> <p><small>Куршская коса, <a href="http://decisivemoment.ru/Kurshskaya_Kosa_2010">Калининградская область</a>, <a href="http://decisivemoment.ru/Kurshskaya_Kosa_2010/2010-07-08_5D_8031_Artem_Sapegin">информация о снимке</a>.</small></p> <p>Все дюны на Куршской косе расположены со стороны Куршского залива (его видно на правой части фотографии). Через всю косу примерно посередине идёт автомобильная дорога; сбоку от неё — небольшой слой леса, редколесье (дюны, покрытые кустами и редкими деревьями), а уж потом и сами дюны. Через лес довольно часто проложены просеки, поэтому заблудиться тут, в <span class="nobr">общем-то</span>, негде; хотя я хорошо умею это делать.</p><div style="text-align:right"><small><a href="http://birdwatcher.ru/entry/4700" title="Birdwatcher.ru">#</a></small></div> http://sapegin.livejournal.com/395604.html Куршская коса Пейзажи Поездки Мои фотографии Цветные public 32 http://sapegin.livejournal.com/395507.html Wed, 21 Jul 2010 10:48:16 GMT Птичьи следы на дюне artem@sapegin.ru http://sapegin.livejournal.com/395507.html <div style="overflow:hidden;height:600px;text-align:center"><img src="http://decisivemoment.ru/photos/Kurshskaya_Kosa_2010/2010-07-01_5D_7191_Artem_Sapegin.jpg" alt="Птичьи следы на дюне" width="900" height="613" /></div> <p><small>Куршская коса, <a href="http://decisivemoment.ru/Kurshskaya_Kosa_2010">Калининградская область</a>, <a href="http://decisivemoment.ru/Kurshskaya_Kosa_2010/2010-07-01_5D_7191_Artem_Sapegin">информация о снимке</a>.</small></p> <p>Следов на дюнах множество, причём самых разных: табунов человекообразных, ходивших на пляж; <a href="http://decisivemoment.ru/Kurshskaya_Kosa_2010/2010-07-01_5D_7149_Artem_Sapegin" title="Фотохомяк Ольгавладимировна в бескрайних песках Куршской косы">фотохомяков</a>; разных птиц и животных. Есть даже <del datetime="2010-07-21T09:52:09+00:00">следы инопланетян</del> <a href="http://www.jmg-galleries.com/blog/2010/07/19/in-search-of-zen/" title="Следы травы на песке">вот такие</a> штуки. Здесь прохаживалась, предположительно, чайка.</p> <p>На заднем плане опять Куршский залив. А ниже можно наблюдать процесс создания этой фотографии.</p><a name="cutid1"></a><p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/07/artem-sapegin-in-dunes.jpg" alt="Артём Сапегин в дюнах на Куршской косе" title="Артём Сапегин в дюнах на Куршской косе" width="640" height="480" /><br /> <small>Айфонографировала <a href="http://airve.livejournal.com/" title="Блог фотохомяка Ольгивладимировны">Ольгавладимировна</a>.</small></p><a name='cutid1-end'></a><div style="text-align:right"><small><a href="http://birdwatcher.ru/entry/4690" title="Birdwatcher.ru">#</a></small></div> http://sapegin.livejournal.com/395507.html Куршская коса Пейзажи Поездки Мои фотографии public 9 http://sapegin.livejournal.com/395230.html Mon, 19 Jul 2010 08:12:37 GMT Балтийское море после заката artem@sapegin.ru http://sapegin.livejournal.com/395230.html <div style="overflow:hidden;height:600px;text-align:center"><img src="http://decisivemoment.ru/photos/Kurshskaya_Kosa_2010/2010-07-06_5D_7750_Artem_Sapegin.jpg" alt="Балтийское море после заката" width="900" height="613" /></div> <p><small>Балтийское море, Куршская коса, <a href="http://decisivemoment.ru/Kurshskaya_Kosa_2010">Калининградская область</a>, <a href="http://decisivemoment.ru/Kurshskaya_Kosa_2010/2010-07-06_5D_7750_Artem_Sapegin">информация о снимке</a>.</small></p> <p>Это место я нашёл, просматривая фотографии на <a href="http://www.panoramio.com/">Panoramio</a>. Мне казалось (ну, я на это очень надеялся), что оно будет несколько ближе, чем в 30 минутах ходьбы по пляжу. Погода в этот раз была отличная; и даже облачко, с которыми на косе вообще было туго, приплыло в нужную часть кадра. В гостевой дом я вернулся к полуночи и получасовая прогулка по тёплому пляжу в сумерках мне даже понравилась, хотя и была весьма утомительной.</p><div style="text-align:right"><small><a href="http://birdwatcher.ru/entry/4687" title="Birdwatcher.ru">#</a></small></div> http://sapegin.livejournal.com/395230.html Куршская коса Пейзажи Поездки Мои фотографии Цветные public 66 http://sapegin.livejournal.com/394846.html Fri, 16 Jul 2010 09:17:54 GMT Маленькое обращение к новым читателям artem@sapegin.ru http://sapegin.livejournal.com/394846.html В последнее время ботов стало так много, что я просто физически не могу просматривать журналы всех, кто меня добавляет. Из-за этого уже пропустил несколько интересных авторов, что не хорошо. А потому у меня маленькая просьба к добавившим меня в друзья в последние месяцев несколько — напишите, пожалуйста, пару слов о себе (можно просто написать «привет» — уже будет ясно, что вы не робот :) Спасибо! http://sapegin.livejournal.com/394846.html public 62 http://sapegin.livejournal.com/394620.html Wed, 14 Jul 2010 07:07:39 GMT Ветер artem@sapegin.ru http://sapegin.livejournal.com/394620.html <div style="overflow:hidden;height:600px;text-align:center"><img src="http://decisivemoment.ru/photos/Kurshskaya_Kosa_2010/2010-07-01_5D_7156_Artem_Sapegin.jpg" alt="Ветер" width="900" height="613" /></div> <p><small>Куршская коса, <a href="http://decisivemoment.ru/Kurshskaya_Kosa_2010">Калининградская область</a>, <a href="http://decisivemoment.ru/Kurshskaya_Kosa_2010/2010-07-01_5D_7156_Artem_Sapegin">информация о снимке</a>.</small></p> <p>Если в посёлке погода была относительно спокойной, то в дюнах дул сильнейший ветер. Что, конечно, приводило к некоторым трудностям при съёмке. Поставил штатив и ждёшь, с пультом в руках, когда ветер стихнет. Сделал кадр и ждёшь снова, чтобы сделать ещё один дубль. Но можно сделать из недостатка достоинство — ветер раскачивает растения и это иногда можно использовать на фотографиях, как здесь или на <a href="http://birdwatcher.ru/entry/4553" title="Закат на Куршской косе">одной из предыдущих</a>. Фотография становится более живой.</p> <p>На заднем плане — Куршский залив.</p><div style="text-align:right"><small><a href="http://birdwatcher.ru/entry/4572" title="Birdwatcher.ru">#</a></small></div> http://sapegin.livejournal.com/394620.html Природа Куршская коса Поездки Мои фотографии Цветные public 11 http://sapegin.livejournal.com/394388.html Tue, 13 Jul 2010 10:36:38 GMT Качество или количество, или Меньше сюжетов, больше кадров artem@sapegin.ru http://sapegin.livejournal.com/394388.html <p>Виталий Прокопенко <a href="http://blog.vitphoto.com/2010/07/02/quality-vs-quantity/" title="Quality vs. Quantity">затронул в своём блоге</a> интересную тему: качество против количества. У меня в последнее время тоже накопилось несколько мыслей на эту тему.</p> <p>В последнее время я стараюсь придерживаться принципа «меньше сюжетов, больше кадров». То есть вместо быстрой пробежки с камерой и поклацивания в разные стороны, более тщательный выбор сюжета и более полная и вдумчивая его проработка. Никаких «дома в фотошопе поправлю». Всё, что можно сделать при съёмке, надо делать при съёмке. Может быть стоит немного поднять или опустить камеру, чтобы горизонт не сливался с крышей; или стоит чуть подождать, чтобы вон то облако было в нужном месте.</p> <p>Тут очень помогает штатив. Раньше я не верил людям, которые говорили, что штатив положительно влияет не только на техническую сторону фотографии, но и на художественную. Теперь я знаю, что эти люди были правы. Действительно влияет. Более того, позволяет спокойно просмотреть весь кадр; сделать столько дублей, сколько нужно, без необходимости постоянно держать камеру неподвижно.</p> <p>Не менее важен отбор фотографий. Отбор никогда не бывает слишком строгим: 10 отличных фотографий всегда лучше, чем 10 отличных среди 100 просто хороших. Освободившееся время можно потратить на более тщательную и вдумчивую обработку оставшихся лучших фотографий.</p> <p>Сюда же я бы отнёс предварительную визуализацию, то есть попытку полностью представить конечный кадр перед съёмкой, включая всю обработку. Но это у меня пока совсем не получается.</p><div style="text-align:right"><small><a href="http://birdwatcher.ru/entry/4569" title="Birdwatcher.ru">#</a></small></div> http://sapegin.livejournal.com/394388.html Фотомысли О фотографии public 23 http://sapegin.livejournal.com/393527.html Fri, 18 Jun 2010 12:48:36 GMT О мечтах artem@sapegin.ru http://sapegin.livejournal.com/393527.html <p>А вы задумывались о том, где хотели бы жить и чем заниматься? Не прямо сейчас, а вообще. Через пять лет, например, или через десять. Или вообще на пенсии.</p> <p>Я представляю маленький старый город на берегу моря. Город очень похож на <a href="http://birdwatcher.ru/entry/2837" title="Музыка из аудиокниг Макса Фрая">Ехо Макса Фрая</a>. Вижу жену с арфой в зубах, играющую по вечерам на веранде; много-много такс, с которыми мы гуляем по берегу моря на закате; кофе в маленькой кафешке по утрам и булочки в ближайшей пекарне (не убитые целлофаном); поездки в магазин на <a href="http://www.lookatme.ru/flows/v-gorode/posts/96156-vespa" title="Гид по ретро-скутерам">скутере</a>; конюшню рядом с домом, где можно взять лошадей и поехать <a href="http://www.panorama-trails.com/spain/horse-riding-holidays.html" title="Horse riding holidays Spain">кататься по пляжу</a> или лесу, которые, конечно, тоже совсем недалеко; маленькие путешествия к ближайшим замкам по выходным и отпуск больше двух раз в год.</p> <p>А вот с родом деятельности мне пока не всё ясно. В <span class="nobr">общем-то</span>, меня устраивают два моих основных занятия — веб-разработка и фотография. Причём примерно в тех пропорциях, которые есть сейчас: большая часть программирования на работе, чуть-чуть дома; большая часть фотографии для себя, чуть-чуть за деньги. Наверное, это и правильно. Разве что я был бы рад немного увеличить общую долю фотографии и работал бы дома, а не в офисе (если я когда-нибудь научусь это делать).</p> <p>А о чём мечтаете вы?</p><div style="text-align:right"><small><a href="http://birdwatcher.ru/entry/4550" title="Birdwatcher.ru">#</a></small></div> http://sapegin.livejournal.com/393527.html Жизнь public 23 http://sapegin.livejournal.com/393419.html Fri, 18 Jun 2010 07:37:54 GMT Первая выставка таксы Десси artem@sapegin.ru http://sapegin.livejournal.com/393419.html <p>В прошлое воскресенье такса Десси побывала на своей первой выставке. Даже на двух сразу: CAC и монопородной. И даже кое-что там получила: на первой <abbr title="Лучшая сука">ЛС</abbr> и <abbr title="Юный кандидат в чемпионы России">JunCAC</abbr>; а на второй <abbr title="Лучший юниор">ЛЮ</abbr> и <abbr title="Юный кандидат в чемпионы клуба">ЮКЧК</abbr> и 3-е место. В это воскресенье опять идём на выставку.</p> <p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/06/2010-06-13_5D_6819_Artem_Sapegin.jpg" alt="Такса Десси с призами" title="Такса Десси с призами" width="800" height="439" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 50 f/1.4 USM, f/5,6, 1/160 с, 640 ISO, Июнь 2010 г.</span></p> <p>Далее фотографии таксы Десси на выставке и немного фотографий других такс там же.</p><a name="cutid1"></a><p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/06/2010-06-13_5D_6614_Artem_Sapegin.jpg" alt="Такса Десси на выставке" title="Такса Десси на выставке" width="523" height="799" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 109 мм, f/4,5, 1/800 с, 250 ISO, Июнь 2010 г.</span></p> <p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/06/2010-06-13_5D_6625_Artem_Sapegin.jpg" alt="Такса Десси на выставке" title="Такса Десси на выставке" width="523" height="799" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 135 мм, f/4,5, 1/640 с, 250 ISO, Июнь 2010 г.</span></p> <p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/06/2010-06-13_5D_6627_Artem_Sapegin.jpg" alt="Такса Десси на выставке" title="Такса Десси на выставке" width="523" height="799" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 200 мм, f/4,5, 1/640 с, 250 ISO, Июнь 2010 г.</span></p> <p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/06/2010-06-13_5D_6643_Artem_Sapegin.jpg" alt="Такса Десси на выставке" title="Такса Десси на выставке" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 172 мм, f/4,5, 1/640 с, 250 ISO, Июнь 2010 г.</span></p> <p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/06/2010-06-13_5D_6661_Artem_Sapegin.jpg" alt="Такса Десси на выставке" title="Такса Десси на выставке" width="523" height="799" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 70 мм, f/4,5, 1/640 с, 250 ISO, Июнь 2010 г.</span></p> <p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/06/2010-06-13_5D_6673_Artem_Sapegin.jpg" alt="Такса Десси на выставке" title="Такса Десси на выставке" width="523" height="799" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 81 мм, f/4,5, 1/640 с, 250 ISO, Июнь 2010 г.</span></p> <p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/06/2010-06-13_5D_6701_Artem_Sapegin.jpg" alt="Такса Десси на выставке" title="Такса Десси на выставке" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 98 мм, f/4,5, 1/1000 с, 400 ISO, Июнь 2010 г.</span></p> <p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/06/2010-06-13_5D_6715_Artem_Sapegin.jpg" alt="Такса Десси на выставке" title="Такса Десси на выставке" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 168 мм, f/7,1, 1/400 с, 400 ISO, Июнь 2010 г.</span></p> <p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/06/2010-06-13_5D_6759_Artem_Sapegin.jpg" alt="Такса Десси на выставке" title="Такса Десси на выставке" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 84 мм, f/5,6, 1/400 с, 250 ISO, Июнь 2010 г.</span></p> <p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/06/2010-06-13_5D_6764_Artem_Sapegin.jpg" alt="Такса Десси на выставке" title="Такса Десси на выставке" width="523" height="799" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 100 мм, f/5,6, 1/400 с, 250 ISO, Июнь 2010 г.</span></p> <p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/06/2010-06-13_5D_6787_Artem_Sapegin.jpg" alt="Такса Десси на выставке" title="Такса Десси на выставке" width="523" height="799" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 73 мм, f/5,6, 1/320 с, 250 ISO, Июнь 2010 г.</span></p> <p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/06/2010-06-13_5D_6790_Artem_Sapegin.jpg" alt="Такса Десси на выставке" title="Такса Десси на выставке" width="523" height="799" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 113 мм, f/5,6, 1/320 с, 250 ISO, Июнь 2010 г.</span></p> <p> </p> <p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/06/2010-06-13_5D_6562_Artem_Sapegin.jpg" alt="Девушка с таксой" title="Девушка с таксой" width="523" height="799" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 98 мм, f/5,6, 1/500 с, 400 ISO, Июнь 2010 г.</span></p> <p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/06/2010-06-13_5D_6571_Artem_Sapegin.jpg" alt="Такса в сумке" title="Такса в сумке" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 122 мм, f/5,6, 1/800 с, 500 ISO, Июнь 2010 г.</span></p> <p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/06/2010-06-13_5D_6607_Artem_Sapegin.jpg" alt="Девушка с таксой" title="Девушка с таксой" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 159 мм, f/4,5, 1/2000 с, 250 ISO, Июнь 2010 г.</span></p> <p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/06/2010-06-13_5D_6678_Artem_Sapegin.jpg" alt="Такса Десси с другом" title="Такса Десси с другом" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 140 мм, f/4,5, 1/200 с, 250 ISO, Июнь 2010 г.</span></p> <p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/06/2010-06-13_5D_6679_Artem_Sapegin.jpg" alt="Такса" title="Такса" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 184 мм, f/4,5, 1/250 с, 400 ISO, Июнь 2010 г.</span></p> <p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/06/2010-06-13_5D_6719_Artem_Sapegin.jpg" alt="Такса" title="Такса" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 176 мм, f/4,5, 1/250 с, 800 ISO, Июнь 2010 г.</span></p> <p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/06/2010-06-13_5D_6726_Artem_Sapegin.jpg" alt="Девочка с таксой" title="Девочка с таксой" width="523" height="799" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 118 мм, f/4,5, 1/1600 с, 320 ISO, Июнь 2010 г.</span></p> <p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/06/2010-06-13_5D_6743_Artem_Sapegin.jpg" alt="Такса в сумке" title="Такса в сумке" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 126 мм, f/5,6, 1/800 с, 250 ISO, Июнь 2010 г.</span></p> <p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/06/2010-06-13_5D_6748_Artem_Sapegin.jpg" alt="Девушка с таксой" title="Девушка с таксой" width="523" height="799" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 131 мм, f/5,6, 1/320 с, 250 ISO, Июнь 2010 г.</span></p> <p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/06/2010-06-13_5D_6779_Artem_Sapegin.jpg" alt="Девушка с таксой" title="Девушка с таксой" width="523" height="799" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 94 мм, f/5,6, 1/400 с, 250 ISO, Июнь 2010 г.</span></p> <p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/06/2010-06-13_5D_6785_Artem_Sapegin.jpg" alt="Девочка с таксой" title="Девочка с таксой" width="523" height="799" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 135 мм, f/5,6, 1/320 с, 250 ISO, Июнь 2010 г.</span></p> <p>И ещё немножко фотографий <a href="http://foto.mail.ru/mail/artem-sapegin/7/">в альбоме</a>.</p><a name='cutid1-end'></a><div style="text-align:right"><small><a href="http://birdwatcher.ru/entry/4541" title="Birdwatcher.ru">#</a></small></div> http://sapegin.livejournal.com/393419.html Такса public 50 http://sapegin.livejournal.com/393016.html Fri, 11 Jun 2010 11:51:44 GMT Кружка для фотографа artem@sapegin.ru http://sapegin.livejournal.com/393016.html <p><span class="nobr">По-моему</span>, прекрасно — хочу <a href="http://www.the-digital-picture.com/Reviews/Canon-EF-70-200mm-f-4.0-L-USM-Lens-Mug-Review.aspx">такую</a>.</p> <p style="text-align:center"><a href="http://www.the-digital-picture.com/Reviews/Canon-EF-70-200mm-f-4.0-L-USM-Lens-Mug-Review.aspx"><img src="http://birdwatcher.ru/wp-content/uploads/2010/06/Canon-EF-70-200mm-f-4.0-L-USM-Lens-Mug-Tripod-Mount.jpg" alt="Кружка Canon EF 70-200mm f/4.0 L USM Lens Mug" title="Кружка Canon EF 70-200mm f/4.0 L USM Lens Mug" width="600" height="668" /></a></p><div style="text-align:right"><small><a href="http://birdwatcher.ru/entry/4511" title="Birdwatcher.ru">#</a></small></div> http://sapegin.livejournal.com/393016.html Фототехника О фотографии Юмор public 23 http://sapegin.livejournal.com/392938.html Wed, 26 May 2010 06:50:11 GMT О бессмысленных подписях artem@sapegin.ru http://sapegin.livejournal.com/392938.html <p>Много говорилось о том, зачем нужны подписи на фотографиях. Есть вполне очевидные причины: это для того мифического процента зрителей, кто, увидев украденную у автора фотографию, захочет узнать о нём больше или подписать его фотографию у себя.</p> <p>Но вот чего я совсем не могу понять, так это зачем и для кого нужны подписи, по которым определить автора никак нельзя: инициалы, баянные ники, нечитаемые шрифты и т. п. Это в сто раз хуже, чем полное отсутствие подписи. И пользы никому не приносит, и зрителю мешает.</p> <p>Достаточно зайти в <span class='ljuser ljuser-name_ru_foto' lj:user='ru_foto' style='white-space: nowrap;'><a href='http://community.livejournal.com/ru_foto/profile'><img src='http://l-stat.livejournal.com/img/community.gif' alt='[info]' width='16' height='16' style='vertical-align: bottom; border: 0; padding-right: 1px;' /></a><a href='http://community.livejournal.com/ru_foto/'><b>ru_foto</b></a></span>, чтобы понять, о чём я: <a href="http://i632.photobucket.com/albums/uu41/Smartyyulia/Austria/070909_Viena/IMG_4309.jpg" title="Фотография с бессмысленной подписью № 1">1</a>, <a href="http://pics.livejournal.com/lexx_w_born/pic/000fxpk9" title="Фотография с бессмысленной подписью № 2">2</a>, <a href="http://data4.gallery.ru/albums/gallery/89019-39219-32326959-m750x740.jpg" title="Фотография с бессмысленной подписью № 3">3</a>, <a href="http://img-fotki.yandex.ru/get/3909/klabukovva.c/0_30d5f_f1555abb_orig" title="Фотография с бессмысленной подписью № 4">4</a>, <a href="http://pics.livejournal.com/nasedkin/pic/0012d2hy" title="Фотография с бессмысленной подписью № 5">5</a>, <a href="http://img-fotki.yandex.ru/get/4214/miledi666z.41/0_377f3_b4ac73dd_XL" title="Фотография с бессмысленной подписью № 6">6</a>, <a href="http://pics.livejournal.com/gipsywerewolf/pic/0048zad7" title="Фотография с бессмысленной подписью № 7">7</a>. Сможете найти авторов по таким подписям? <span class="nobr">Так-то</span>.</p> <p>P. S. Да, и в XXI веке уже вполне можно использовать знак копирайта, а не букву «C» в скобках. Но лучше, конечно, просто писать имя-фамилию и/или адрес сайта («http://» и «www.» тоже в XXI веке писать не стоит). И, пожалуйста, не пишите слово «фотограф» (тем более «photographer») — и так ясно, что не ассенизатор.</p> <p>P. P. S. Лично мне очень нравится, как сделаны подписи на <a href="http://1x.com/">1x.com</a>. Попробуйте сохранить картинку или открыть отдельно. Жаль, в ЖЖ так сделать не получится (разве что на странице журнала, но не в ленте).</p><div style="text-align:right"><small><a href="http://birdwatcher.ru/entry/4506" title="Birdwatcher.ru">#</a></small></div> http://sapegin.livejournal.com/392938.html Фотомысли Идиоты О фотографии public 56 http://sapegin.livejournal.com/392567.html Wed, 12 May 2010 10:01:54 GMT 26 ₯ artem@sapegin.ru http://sapegin.livejournal.com/392567.html <p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/05/2009-07-19_5D_8096_Olga_Flegontova.jpg" alt="Артёммихалыч на Домбае" title="Артёммихалыч на Домбае" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 17-40 f/4L USM @ 38 мм, f/9, 1/200 с, 100 ISO, Июль 2009 г.</span></p><div style="text-align:right"><small><a href="http://birdwatcher.ru/entry/4501" title="Birdwatcher.ru">#</a></small></div> http://sapegin.livejournal.com/392567.html Жизнь Семейный альбом Артём Сапегин public 70 http://sapegin.livejournal.com/392297.html Wed, 28 Apr 2010 07:19:06 GMT Что такое конструктивная критика artem@sapegin.ru http://sapegin.livejournal.com/392297.html <blockquote> <p>Конструктивная критика – попытка логически обосновать и оправдать субъективные ощущения от просмотра работы.</p> <p><span class='ljuser ljuser-name_uncsam' lj:user='uncsam' style='white-space: nowrap;'><a href='http://uncsam.livejournal.com/profile'><img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /></a><a href='http://uncsam.livejournal.com/'><b>uncsam</b></a></span>, <a href="http://uncsam.livejournal.com/59247.html">отсюда</a>.</p> </blockquote><div style="text-align:right"><small><a href="http://birdwatcher.ru/entry/4498" title="Birdwatcher.ru">#</a></small></div> http://sapegin.livejournal.com/392297.html Фотоссылки О фотографии public 8 http://sapegin.livejournal.com/391795.html Tue, 20 Apr 2010 05:53:25 GMT Встреча такс в Воронцовском парке artem@sapegin.ru http://sapegin.livejournal.com/391795.html <p>Побывали с таксой Десси на первой таксовке. Правда Десси постоянно обижала маленькая чёрная такса Марта, но в целом нам понравилось. В конце хозяин Марты даже подарил Десси пакетик вкусняшек и, кажется, Десси их простила. Хотим ещё.</p> <p>Можно посмотреть <a href="http://fotki.yandex.ru/users/artemsapegin/album/94546/" title="Встреча такс в Воронцовском парке">полный альбом</a> (~50 фотографий). И огромное спасибо Юле <span class='ljuser ljuser-name_ph_t_grapher' lj:user='ph_t_grapher' style='white-space: nowrap;'><a href='http://ph-t-grapher.livejournal.com/profile'><img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /></a><a href='http://ph-t-grapher.livejournal.com/'><b>ph_t_grapher</b></a></span> за организацию встречи.</p> <p>P. S. Извиняюсь за публикацию со второй попытки. Яндекс-фоткам — луч диареи.</p> <p style="text-align:center"><img src="http://tida.sapegin.ru/dessi/nedessi/taksovka_20100417/2010-04-17_5D_5861_Artem_Sapegin.jpg" alt="Таксы" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 70 мм, f/5,6, 1/1000 с, 1000 ISO, Апрель 2010 г.</span></p><a name="cutid1"></a><p style="text-align:center"><img src="http://tida.sapegin.ru/dessi/nedessi/taksovka_20100417/2010-04-17_5D_5830_Artem_Sapegin.jpg" alt="Таксы" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 154 мм, f/5,6, 1/1000 с, 1000 ISO, Апрель 2010 г.</span></p> <p style="text-align:center"><img src="http://tida.sapegin.ru/dessi/nedessi/taksovka_20100417/2010-04-17_5D_5832_Artem_Sapegin.jpg" alt="Таксы" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 122 мм, f/5,6, 1/1000 с, 1000 ISO, Апрель 2010 г.</span></p> <p style="text-align:center"><img src="http://tida.sapegin.ru/dessi/nedessi/taksovka_20100417/2010-04-17_5D_5836_Artem_Sapegin.jpg" alt="Таксы" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 81 мм, f/5,6, 1/1000 с, 1000 ISO, Апрель 2010 г.</span></p> <p style="text-align:center"><img src="http://tida.sapegin.ru/dessi/nedessi/taksovka_20100417/2010-04-17_5D_5843_Artem_Sapegin.jpg" alt="Таксы" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 200 мм, f/5,6, 1/1000 с, 1000 ISO, Апрель 2010 г.</span></p> <p style="text-align:center"><img src="http://tida.sapegin.ru/dessi/nedessi/taksovka_20100417/2010-04-17_5D_5848_Artem_Sapegin.jpg" alt="Таксы" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 200 мм, f/5,6, 1/1000 с, 1000 ISO, Апрель 2010 г.</span></p> <p style="text-align:center"><img src="http://tida.sapegin.ru/dessi/nedessi/taksovka_20100417/2010-04-17_5D_5854_Artem_Sapegin.jpg" alt="Таксы" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 200 мм, f/5,6, 1/1000 с, 1000 ISO, Апрель 2010 г.</span></p> <p style="text-align:center"><img src="http://tida.sapegin.ru/dessi/nedessi/taksovka_20100417/2010-04-17_5D_5857_Artem_Sapegin.jpg" alt="Таксы" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 159 мм, f/5,6, 1/1000 с, 1000 ISO, Апрель 2010 г.</span></p> <p style="text-align:center"><img src="http://tida.sapegin.ru/dessi/nedessi/taksovka_20100417/2010-04-17_5D_5863_Artem_Sapegin.jpg" alt="Таксы" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 200 мм, f/5,6, 1/1000 с, 1000 ISO, Апрель 2010 г.</span></p> <p style="text-align:center"><img src="http://tida.sapegin.ru/dessi/nedessi/taksovka_20100417/2010-04-17_5D_5926_Artem_Sapegin.jpg" alt="Таксы" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 200 мм, f/5,6, 1/1000 с, 1600 ISO, Апрель 2010 г.</span></p> <p style="text-align:center"><img src="http://tida.sapegin.ru/dessi/nedessi/taksovka_20100417/2010-04-17_5D_5875_Artem_Sapegin.jpg" alt="Таксы" width="523" height="799" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 180 мм, f/5,6, 1/400 с, 1000 ISO, Апрель 2010 г.</span></p> <p style="text-align:center"><img src="http://tida.sapegin.ru/dessi/nedessi/taksovka_20100417/2010-04-17_5D_5883_Artem_Sapegin.jpg" alt="Таксы" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 122 мм, f/5,6, 1/800 с, 1600 ISO, Апрель 2010 г.</span></p> <p style="text-align:center"><img src="http://tida.sapegin.ru/dessi/nedessi/taksovka_20100417/2010-04-17_5D_5887_Artem_Sapegin.jpg" alt="Таксы" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 94 мм, f/5,6, 1/800 с, 1600 ISO, Апрель 2010 г.</span></p> <p style="text-align:center"><img src="http://tida.sapegin.ru/dessi/nedessi/taksovka_20100417/2010-04-17_5D_5893_Artem_Sapegin.jpg" alt="Таксы" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 81 мм, f/5,6, 1/800 с, 1600 ISO, Апрель 2010 г.</span></p> <p style="text-align:center"><img src="http://tida.sapegin.ru/dessi/nedessi/taksovka_20100417/2010-04-17_5D_5900_Artem_Sapegin.jpg" alt="Таксы" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 78 мм, f/10, 1/500 с, 1600 ISO, Апрель 2010 г.</span></p> <p style="text-align:center"><img src="http://tida.sapegin.ru/dessi/nedessi/taksovka_20100417/2010-04-17_5D_5907_Artem_Sapegin.jpg" alt="Таксы" width="700" height="717" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 81 мм, f/5,6, 1/800 с, 1600 ISO, Апрель 2010 г.</span></p> <p style="text-align:center"><img src="http://tida.sapegin.ru/dessi/nedessi/taksovka_20100417/2010-04-17_5D_5923_Artem_Sapegin.jpg" alt="Таксы" width="523" height="799" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 81 мм, f/5,6, 1/1000 с, 1600 ISO, Апрель 2010 г.</span></p> <p style="text-align:center"><img src="http://tida.sapegin.ru/dessi/nedessi/taksovka_20100417/2010-04-17_5D_5928_Artem_Sapegin.jpg" alt="Таксы" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 176 мм, f/5,6, 1/1000 с, 1600 ISO, Апрель 2010 г.</span></p> <p style="text-align:center"><img src="http://tida.sapegin.ru/dessi/nedessi/taksovka_20100417/2010-04-17_5D_5931_Artem_Sapegin.jpg" alt="Таксы" width="523" height="799" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 94 мм, f/5,6, 1/1000 с, 1600 ISO, Апрель 2010 г.</span></p> <p style="text-align:center"><img src="http://tida.sapegin.ru/dessi/nedessi/taksovka_20100417/2010-04-17_5D_5956_Artem_Sapegin.jpg" alt="Таксы" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 113 мм, f/5,6, 1/800 с, 1600 ISO, Апрель 2010 г.</span></p> <p style="text-align:center"><img src="http://tida.sapegin.ru/dessi/nedessi/taksovka_20100417/2010-04-17_5D_5960_Artem_Sapegin.jpg" alt="Таксы" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 200 мм, f/5,6, 1/3200 с, 1600 ISO, Апрель 2010 г.</span></p> <p style="text-align:center"><img src="http://tida.sapegin.ru/dessi/nedessi/taksovka_20100417/2010-04-17_5D_5967_Artem_Sapegin.jpg" alt="Таксы" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 200 мм, f/4,5, 1/6400 с, 1600 ISO, Апрель 2010 г.</span></p> <p style="text-align:center"><img src="http://tida.sapegin.ru/dessi/nedessi/taksovka_20100417/2010-04-17_5D_5969_Artem_Sapegin.jpg" alt="Таксы" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 200 мм, f/4,5, 1/2500 с, 1600 ISO, Апрель 2010 г.</span></p> <p style="text-align:center"><img src="http://tida.sapegin.ru/dessi/nedessi/taksovka_20100417/2010-04-17_5D_5974_Artem_Sapegin.jpg" alt="Таксы" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 118 мм, f/4,5, 1/2000 с, 1600 ISO, Апрель 2010 г.</span></p> <p style="text-align:center"><img src="http://tida.sapegin.ru/dessi/nedessi/taksovka_20100417/2010-04-17_5D_6017_Artem_Sapegin.jpg" alt="Таксы" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 159 мм, f/5,6, 1/1000 с, 800 ISO, Апрель 2010 г.</span></p> <p style="text-align:center"><img src="http://tida.sapegin.ru/dessi/nedessi/taksovka_20100417/2010-04-17_5D_6035_Artem_Sapegin.jpg" alt="Таксы" width="800" height="552" /><span class="exifInfo" style="display:none">Canon EOS 5D, Canon EF 70-200 f/4L USM @ 168 мм, f/5,6, 1/1000 с, 1250 ISO, Апрель 2010 г.</span></p><a name='cutid1-end'></a><div style="text-align:right"><small><a href="http://birdwatcher.ru/entry/4490" title="Birdwatcher.ru">#</a></small></div> http://sapegin.livejournal.com/391795.html Живая природа Такса Репортаж Мои фотографии Цветные public 22 http://sapegin.livejournal.com/391222.html Mon, 19 Apr 2010 10:28:14 GMT Сервис для хранения фотографий artem@sapegin.ru http://sapegin.livejournal.com/391222.html <p>Посоветуйте удобный сайт, куда можно выложить пачку семейных фотографий в большом разрешении так, чтобы их могли посмотреть и скачать понравившиеся. Массовая загрузка в каком-нибудь виде крайне желательна.</p><div style="text-align:right"><small><a href="http://birdwatcher.ru/entry/4482" title="Birdwatcher.ru">#</a></small></div> http://sapegin.livejournal.com/391222.html О фотографии Вопросы Интернет public 47 http://sapegin.livejournal.com/390918.html Mon, 12 Apr 2010 06:32:37 GMT Такса Десси во всей её длине artem@sapegin.ru http://sapegin.livejournal.com/390918.html <p style="text-align:center"><img src="http://decisivemoment.ru/photos/Dachshund/2010-04-11_5D_5666_Artem_Sapegin.jpg" alt="Такса Десси во всей её длине" width="800" height="419" /></p> <p><a href="http://decisivemoment.ru/Dachshund">Все фотографии</a> таксы Десси.</p><div style="text-align:right"><small><a href="http://birdwatcher.ru/entry/4480" title="Birdwatcher.ru">#</a></small></div> http://sapegin.livejournal.com/390918.html Живая природа Такса Мои фотографии Цветные public 6 http://sapegin.livejournal.com/390626.html Thu, 01 Apr 2010 08:23:12 GMT Начинается набор в Школу Одномерной Фотографии artem@sapegin.ru http://sapegin.livejournal.com/390626.html <p>Наскучила обыденная плоская фотография? Не можете найти в себе силы фотографировать? Хочется чего-нибудь нового и оригинального? Привлечь внимание противоположного пола? Удивить друзей и коллег? Тогда вы попали туда, куда нужно!</p> <p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/04/1d-photo-1.jpg" alt="Рассвет с радугой" title="Рассвет с радугой" width="800" height="4" /></p> <p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/04/1d-photo-2.jpg" alt="Железная дорога на берегу моря" title="Железная дорога на берегу моря" width="800" height="4" /></p> <p>В нашей школе вы освоите самую современную технику фотосъёмки — <strong>одномерную фотографию</strong>.</p><a name="cutid1"></a><p>Курс состоит из 9 лекций и проводится с использованием современных авторских методик. После каждой лекции вы получаете домашнее задание, результаты которого подробно разбираются преподавателем.</p> <p>Программа обучения:</p> <p>1. Введение. Особенности одномерной фотографии и её отличия от традиционной фотографии.</p> <p>2. Оборудование, необходимо для одномерной фотографии: матрицы, мегапиксели, объективы; никон или кенон; цифра или плёнка.</p> <p>3. Экспозиция в одномерной фотографии. Режимы замера, использование гистограммы в качестве пикселограммы.</p> <p>4. Композиция. Непреложные законы композиции: закон трёх точек. Симметрия, использование точек и линий.</p> <p>5. Сюжеты для одномерной фотографии. Что, где и когда нужно снимать, чтобы получить максимально зашибенные фотографии.</p> <p>6. Продвинутые съёмочные техники: съёмка с проводкой, подбросом, подвыподвертом; с крышечкой на объективе; сквозь пальцы и т. п.</p> <p>7. Обработка одномерных фотографий на компьютере. Выбор программ, настройка рабочей среды. Инструмент Single Row Marquee Tool в Photoshop.</p> <p>8. Печать одномерных фотографий. Увеличение, алгоритмы интерполяции, выбор формата и бумаги.</p> <p>9. Дополнительная лекция повышенной сложности. Точечная фотография.</p> <p>Занятия будут проходить в режиме on-line (через компьютерную сеть Internet) два раза в неделю. Для того, чтобы записаться необходимо лишь отметиться в этом посте и разместить у себя в журнале ссылку на этот пост. Занятия абсолютно бесплатны! Спешите, количество мест ограничено!</p> <p>В конце курса каждый слушатель получит диплом «фотохудожник-одномерист».</p> <p><strong>О преподавателе</strong></p> <p>Артём Сапегин — известный в рунете пользователь фотокамер Кенон. Родился в 1984 году, фотосъёмкой занимается с 2004 года. Сотрудничает с известнейшими во всём мире изданиями, такими как LiveJournal (США), Фотосайт (Россия), 500px (Канада) и другими. Член жюри международного конкурса «Лучший русский фотоблог». Ведущий блога Birdwatcher.ru (более 1000 читателей). Создатель проекта «Пейзажисты России». Член Союза охраны хомяков. Владелец таксы.</p> <p><strong>О школе</strong></p> <p>Школа Одномерной Фотографии была основана в 2009 году и быстро получила мировую известность благодаря новаторскому подходу к обучению, оригинальным курсам и отличным преподавателям. Школа Одномерной Фотографии изменила судьбу многих людей, жизнь которых, казалось бы, уже шла под откос; но после обучения в Школе Одномерной Фотографии круто пошла в гору.</p> <p style="text-align:center"> <form method="post" action="http://www.livejournal.com/update.bml"> <input type="hidden" name="subject" value="Школа Одномерной Фотографии"> <input type="hidden" name="event" value="Я записался в &lt;a href=&quot;http://sapegin.livejournal.com/390626.html&quot;&gt;Школу Одномерной Фотографии&lt;/a&gt; к &lt;lj user=&quot;sapegin&quot;&gt;!"> <input type="submit" value="Записаться!"></form></p><a name='cutid1-end'></a><div style="text-align:right"><small><a href="http://birdwatcher.ru/entry/4463" title="Birdwatcher.ru">#</a></small></div> http://sapegin.livejournal.com/390626.html О фотографии Школа Одномерной Фотографии public 16 http://sapegin.livejournal.com/390144.html Wed, 31 Mar 2010 07:40:00 GMT Лучшая книга о фотографии, или Один способ улучшить ваши фотографии не покупая новую технику artem@sapegin.ru http://sapegin.livejournal.com/390144.html <table> <tr> <td valign="top"> <p>Дэвид Душемин сочинил <a href="http://www.pixelatedimage.com/blog/2010/03/a-crazy-idea/" title="David duChemin: A Crazy Idea">гениальную электронную книгу</a> (правда это пока только проект, реальной книги ещё нет и не известно, будет ли). Книга отвечает на вопрос «Как улучшить фотографии без покупки нового железа», ответ на который довольно прост: «Перестаньте покупать железо». Вот <span class="nobr">так-то</span>.</p> <p>Если книга всё-таки появится в виде файла, обязательно включу в свои <a href="http://birdwatcher.ru/books/photography" title="Книги о фотографии">книжные</a> <a href="http://birdwatcher.ru/entry/4410" title="Что почитать о пейзажной (и не только) фотографии">списки</a>. Такую книгу я бы хотел даже на бумаге.</p> </td> <td valign="top"> <img src="http://birdwatcher.ru/wp-content/uploads/2010/03/one-cover.jpg" alt="ONE, One Way To Improve Your Craft Without Buying Gear" title="ONE, One Way To Improve Your Craft Without Buying Gear" width="150" height="201" /> </td> </tr> </table><div style="text-align:right"><small><a href="http://birdwatcher.ru/entry/4454" title="Birdwatcher.ru">#</a></small></div> http://sapegin.livejournal.com/390144.html Фотоссылки О фотографии Юмор Книги public 21 http://sapegin.livejournal.com/389790.html Mon, 29 Mar 2010 08:50:22 GMT О «Золотой черепахе» и чуде artem@sapegin.ru http://sapegin.livejournal.com/389790.html <p>Вторые выходные ходим по выставкам: <a href="http://www.equiros.ru/" title="Лошадиная выствка">Эквирос</a>, <a href="http://rkf.org.ru/shows/eurasia/2010.html" title="Собачья выставка">Евразия</a>, <a href="http://animalphoto.ru/" title="Лучшие фотографии дикой природы">Золотая черепаха</a>. Сегодня о последней.</p><a name="cutid1"></a><p>На «Золотую черепаху» мы пошли в последний день, с любимой женой <span class='ljuser ljuser-name_airve' lj:user='airve' style='white-space: nowrap;'><a href='http://airve.livejournal.com/profile'><img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /></a><a href='http://airve.livejournal.com/'><b>airve</b></a></span>, <span class='ljuser ljuser-name_chucker_mpa' lj:user='chucker_mpa' style='white-space: nowrap;'><a href='http://chucker-mpa.livejournal.com/profile'><img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /></a><a href='http://chucker-mpa.livejournal.com/'><b>chucker_mpa</b></a></span> и его девушкой. Когда пришли, то увидели огромную очередь на вход (потом выяснилось, что очередь <em>в кассу</em>). Но когда дошли примерно до середины, с нами произошло чудо: к нам подошли две бабушки и подарили два приглашения (каждое на двоих). Почему они выбрали именно нас — большая загадка, но нам было очень приятно.</p> <p>Сама выставка в целом понравилась. Не буду говорить о выборе жюри — об этом <a href="http://d-konstantinov.livejournal.com/540054.html">уже</a> <a href="http://samebody.livejournal.com/69420.html">достаточно</a> <a href="http://vvp-tm.livejournal.com/309889.html">сказали</a> и я, в основном, согласен. Но хорошие работы на выставке есть и их стоило посмотреть.</p> <p>Показалось, что качество (техническое и художественное) фотографий стало лучше по сравнению с прошлым годом. Совсем жести в этот раз почти не было. Не всегда согласен с выбором формата — <span class="nobr">что-то</span> растянуто слишком сильно, а <span class="nobr">что-то</span> стоило бы напечатать крупнее. А ещё верстальщика альбома давно пора уволить и взять нормального.</p> <p>P. S. А уж про людей, которым жалко 900 рублей за альбом, и которым, бедненьким, приходится переснимать каждую фотографию на мобильник, я уже писал <a href="http://birdwatcher.ru/entry/3377">в прошлом году</a>.</p> <p>P. P. S. Забыл написать, что на выставке была ещё небольшая экспозиция лучших фотографий французского конкурса <a href="http://www.festiphoto-montier.org/afpanEN.htm" title="Сайт конкурса">Animalière et de Nature de Montier-en-Der</a>. Многие работы очень интересные, жаль их нет в выставочном альбоме (их можно посмотреть на сайте конкурса).</p><a name='cutid1-end'></a><div style="text-align:right"><small><a href="http://birdwatcher.ru/entry/4440" title="Birdwatcher.ru">#</a></small></div> http://sapegin.livejournal.com/389790.html События О фотографии public 4 http://sapegin.livejournal.com/389255.html Fri, 26 Mar 2010 08:23:18 GMT Content Aware Fill — новый мегаинструмент Photoshop CS5 artem@sapegin.ru http://sapegin.livejournal.com/389255.html <p>В Photoshop CS5 появится новый волшебный и очень полезный инструмент — Content Aware Fill, который позволит автоматически удалять с изображения лишние элементы, причём так, что фон под ними будет дорисовываться Фотошопом как будто ничего на этом месте и не было. Пока можно посмотреть <a href="http://www.youtube.com/watch?v=NH0aEp1oDOI">коротенькое видео</a>.</p> <p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/03/content_aware_fill.jpg" alt="Content Aware Fill" title="Content Aware Fill" width="800" height="157" class="alignnone size-full wp-image-4431" /></p><div style="text-align:right"><small><a href="http://birdwatcher.ru/entry/4430" title="Birdwatcher.ru">#</a></small></div> http://sapegin.livejournal.com/389255.html О фотографии photoshop public 19 http://sapegin.livejournal.com/389090.html Thu, 25 Mar 2010 07:29:45 GMT Панорамки в семейный альбом artem@sapegin.ru http://sapegin.livejournal.com/389090.html <p>Панорамы я снимать, в <span class="nobr">общем-то</span>, не умею, и делаю это довольно редко (обычно выходит не больше штук пяти за одну поездку), а уж до склейки и обработки вообще редко доходит. Сейчас пробую клеить с помощью Autopano, а не Фотошопа. Пока нравится. По клику — картинки побольше.</p> <p style="text-align:center"><a href="http://decisivemoment.ru/big/2009-09-17_5D_Green_Mountains_Pano_Artem_Sapegin_big.jpg"><img src="http://decisivemoment.ru/photos/Zubova_Schel_2009/2009-09-17_5D_Green_Mountains_Pano_Artem_Sapegin.jpg" alt="Горы, покрытые лесом" width="800" height="320" /></a></p> <p>Зубова щель, 6 вертикальных кадров.</p><a name="cutid1"></a><p style="text-align:center"><a href="http://decisivemoment.ru/big/2009-07-20_5D_Dombai_Rainy_Pano_Artem_Sapegin_big.jpg"><img src="http://decisivemoment.ru/photos/Dombai_2009/2009-07-20_5D_Dombai_Rainy_Pano_Artem_Sapegin.jpg" alt="Горы перед дождём" width="800" height="287" /></a></p> <p>Домбай, 9 вертикальных кадров.</p> <p style="text-align:center"><a href="http://decisivemoment.ru/big/2009-07-21_5D_Dombai_Elevator_Pano_Artem_Sapegin_big.jpg"><img src="http://decisivemoment.ru/photos/Dombai_2009/2009-07-21_5D_Dombai_Elevator_Pano_Artem_Sapegin.jpg" alt="Горы" width="800" height="359" /></a></p> <p>Домбай, 4 горизонтальных кадра. Снято с подъёмника. Было жутко неудобно, потому что приходилось разворачиваться назад, а подъёмник был сидячим.</p><a name='cutid1-end'></a><div style="text-align:right"><small><a href="http://birdwatcher.ru/entry/4425" title="Birdwatcher.ru">#</a></small></div> http://sapegin.livejournal.com/389090.html Домбай Зубова щель Пейзажи Поездки Цветные public 10 http://sapegin.livejournal.com/388429.html Wed, 24 Mar 2010 09:56:18 GMT Рассвет с радугой artem@sapegin.ru http://sapegin.livejournal.com/388429.html <p style="text-align:center"><img src="http://decisivemoment.ru/photos/Zubova_Schel_2009/2009-09-21_5D_1751_Artem_Sapegin.jpg" alt="Рассвет с радугой" width="800" height="552" /></p> <p><a href="http://decisivemoment.ru/Zubova_Schel_2009">Адлер</a>, сентябрь 2009. Наверное, уже достал всех адлерскими рассветами. Всё, это последняя картинка, больше нет.</p><div style="text-align:right"><small><a href="http://birdwatcher.ru/entry/4407" title="Birdwatcher.ru">#</a></small></div> http://sapegin.livejournal.com/388429.html Зубова щель Пейзажи Поездки Мои фотографии Цветные public 9 http://sapegin.livejournal.com/388026.html Tue, 23 Mar 2010 12:27:02 GMT Вышел Lightroom 3 Beta 2 artem@sapegin.ru http://sapegin.livejournal.com/388026.html <p><span class="nobr">Наконец-то</span> обновилась бета-версия нового Лайтрума. Думаю, многих уже достали глюки первой бета-версии (а возвращаться обратно на 2-й Лайтрум не хочется, <span class="nobr">результат-то</span> в новом лучше).</p> <p style="text-align:center"><img src="http://birdwatcher.ru/wp-content/uploads/2010/03/lightroom3b2.png" width="262" height="47" alt="Lightroom 3 Beta 2" /></p><a name="cutid1"></a><p>Изменения обещают довольно приятные. Вот они:</p> <p>— Переделанный и ускоренный <strong>импорт фотографий</strong>. Было лучше, чем раньше, а теперь должно стать совсем хорошо. Посмотрим.<br /> — <strong>Поддержка видео</strong>. Теперь можно смотреть и отбирать фотографии и видео вместе. Мне не актуально, но шаг правильный.<br /> — <strong>Дистанционное управление камерой</strong> (Tethered Capture, не знаю, как это называется <span class="nobr">по-русски</span>). Теперь можно управлять некоторыми (пока) камерами прямо из Лайтрума.<br /> — <strong>Повышение резкости и шумоподавление</strong>. Вернулось, пропавшее в первой бета-версии, яркостное шумоподавление. Кроме того, теперь фотографии по умолчанию (т. е. при выключенном шумодаве) имеют большую детализацию и резкость (но и чуть больший шум), а фотограф волен сам решать, что для него важнее.<br /> — <strong>Виньетирование</strong>. Вернули (в дополнение к новым режимам) старое виньетирование после кадрирования. Говорят, что есть эстеты, которым нравится именно такое.<br /> — <strong>Настоящие кривые</strong>. Вот это, наверное, самое важное улучшение. Я его ждал уже несколько лет (и, думаю, не я один). Теперь фанаты ACR не смогут говорить нам, что их конвертер лучше, потому что там есть кривые.<br /> — <strong>Смена ориентации кадрирования</strong>. Наверное, потрясающая возможность, но мне не лень просто растянуть рамку в нужном направлении.<br /> — Улучшенный интерфейс <strong>версий обработки</strong> (Process Version). Должен стать заметнее и понятнее. Актуально для файлов, проявленных в предыдущих версиях Лайтрума.<br /> — <strong>Водяные знаки</strong>. Много улучшений, правда не все работают в Виндоусе. В первой бете мне так и не удалось заставить работать эту штуку.<br /> — Улучшены алгоритмы инструментов <strong>Fill Light и Highlight Recovery</strong>.<br /> — И некоторые другие улучшения.</p> <p><a href="http://labs.adobe.com/technologies/lightroom3/">Скачать</a> можно с Adobe Labs.</p><a name='cutid1-end'></a><div style="text-align:right"><small><a href="http://birdwatcher.ru/entry/4397" title="Birdwatcher.ru">#</a></small></div> http://sapegin.livejournal.com/388026.html О фотографии lightroom public 20 http://sapegin.livejournal.com/387594.html Tue, 23 Mar 2010 07:37:14 GMT Железная дорога на берегу моря artem@sapegin.ru http://sapegin.livejournal.com/387594.html <p style="text-align:center"><img src="http://decisivemoment.ru/photos/Zubova_Schel_2009/2009-09-18_5D_1198_Artem_Sapegin.jpg" alt="Железная дорога на берегу моря" width="800" height="552" /></p> <p><a href="http://decisivemoment.ru/Zubova_Schel_2009">Зубова щель</a>, сентябрь 2009.</p><div style="text-align:right"><small><a href="http://birdwatcher.ru/entry/4395" title="Birdwatcher.ru">#</a></small></div> http://sapegin.livejournal.com/387594.html Город и архитектура Зубова щель Поездки Мои фотографии Цветные public 16 http://sapegin.livejournal.com/387373.html Mon, 22 Mar 2010 08:22:49 GMT Деревянный домик в горах artem@sapegin.ru http://sapegin.livejournal.com/387373.html <p style="text-align:center"><img src="http://decisivemoment.ru/photos/Dombai_2009/2009-07-21_20D_4429_Artem_Sapegin.jpg" alt="Деревянный домик в горах" width="523" height="799" /></p> <p><a href="http://decisivemoment.ru/Dombai_2009">Домбай</a>, июль 2009 г.</p><div style="text-align:right"><small><a href="http://birdwatcher.ru/entry/4393" title="Birdwatcher.ru">#</a></small></div> http://sapegin.livejournal.com/387373.html Домбай Пейзажи Поездки Мои фотографии Цветные public 14 XML-Fast-0.17/t/reports/02.xml000644 000766 000024 00000137531 13123552546 016040 0ustar00monsstaff000000 000000 Ружейников Игорь http://ahav10.livejournal.com/ Ружейников Игорь - LiveJournal.com Mon, 09 Aug 2010 08:50:01 GMT LiveJournal / LiveJournal.com ahav10 14223960 personal http://l-userpic.livejournal.com/68339299/14223960 Ружейников Игорь http://ahav10.livejournal.com/ 100 100 http://ahav10.livejournal.com/128819.html Mon, 09 Aug 2010 08:50:01 GMT " На самом деле, я Бэтмен". http://ahav10.livejournal.com/128819.html &nbsp;Старшие мои дети планово свалили к морю.Младшая совершенно неожиданно вместе с мамой ейной( по совместительству с Моей Боевой Подругой) на неделю свинтила в Симбирск( там жарко ,но не горит). До &nbsp;эскейпа все вышеперечисленные были похожи на зомби различных размеров .Я ж при всём этом( тьфу-тьфу) как то даже и не сильно отмечаю наличие физического дискомфорта.Может я Супермен и Новый Мессия? Или все изменения &nbsp;в моём бренном теле ограниченны &nbsp;последствиями &nbsp;длительного кислородного голодания. Ну, там... изменённое сознание, неадекват в плане оценки своих сил и возможностей..<br />&quot; Я увидел своё отражение в зеркале и подумал:&quot;какой же я красивый!&quot; (А.Аверченко &quot;Чад&quot;).<br />Прикольно. http://ahav10.livejournal.com/128819.html public 5 http://ahav10.livejournal.com/128518.html Fri, 06 Aug 2010 18:01:05 GMT " Без кипеша! Бабки или капец!" http://ahav10.livejournal.com/128518.html &nbsp; А &nbsp;ведь ничего в видеомузыке, да и вообще в интертейменте за три с лишним десятка лет не изменилось. Может, и хорошо.<br /><lj-embed id="72" /> http://ahav10.livejournal.com/128518.html public 0 http://ahav10.livejournal.com/128361.html Fri, 06 Aug 2010 17:31:25 GMT о почвенных журнализмах http://ahav10.livejournal.com/128361.html &nbsp;Сонм отечественных традиционных и сетевых(!) изданий &nbsp;вдул новость про &quot;гаитянского репера &quot; Вайклефа Джина.Мол, собирается стать президентом всеми забытой родины. Тон сообщений русских &quot;шакалов ротационных машин&quot; дружески-снисходительный. Мол, какой то&quot;гаитянский репер&quot; тоже в политику. Почти никто не поинтересовался, что это за человек. Что популярность этого &quot;дурачка&quot; в сотни раз превосходит ньюзрукомы и газетыру, а доходы не только вливания в вышеназванные издания ,но и бюджет самой Гаити. &nbsp;А вы говорите музыкальная журналистика на родине Юрия Николаева, или просто журналистика..<br />На видео гаитянский паренёк с малоизвестным британским спасителем алкоголиков. &nbsp;В этом концерте принимали участие музыканты, совокупное влияние которых на мировоззрение не может сравниться ни с ООН ни с Европарламентом, ни с обамами-ахамдмниджажами -медведевыми.Даже Биг-Мак отдыхает.<br /><lj-embed id="71" /><br />&nbsp; http://ahav10.livejournal.com/128361.html public 4 http://ahav10.livejournal.com/128249.html Fri, 06 Aug 2010 11:29:17 GMT Корейцы-они такие.Они под пытками не сломаются. http://ahav10.livejournal.com/128249.html &nbsp; 06.08.2010 15:19 &mdash;<br />Лужков не собирается прерывать отпуск из-за смога<br /><br />Пресс-секретарь московского мэра Юрия Лужкова Сергей Цой заявил, что не видит причин для возвращения мэра из отпуска в Москву.<br />&laquo;А какие проблемы? У нас что, в Москве чрезвычайная ситуация, кризисная ситуация, у нас в чем проблема в Москве? - заявил он Life News. - Это проблема Москвы? Кризисная ситуация в Москве?&raquo;<br />На вопрос же о том, что ужасный смог, окутавший город, резкое ухудшение самочувствия большинства горожан - разве не типичная чрезвычайная ситуация, Сергей Цой ответил, что &laquo;кризисной ситуации в Москве нет&raquo;, а смог - проблема не Москвы.<br />&laquo;Что можно сделать в Москве в этой ситуации? - задается вопросом пресс-секретарь Лужкова. - Если нужно просто приехать и порисоваться, это одна ситуация. Но все, что нужно сделать в Москве, все сделано, отработана система&raquo;.<br />&laquo;Кризисная ситуация сосредоточена не здесь, - уточняет он. - А для решения проблемы, которую мы сейчас видим, делается все. Но ее источник находится в Подмосковье и ближайших регионах&raquo;, - заявил Цой.<br />На вопрос, где именно проводит свой отпуск мэр Москвы, Сергей Цой ответил: &laquo;Если мы захотим вам это сказать, мы скажем&raquo;. &laquo;Газета.Ru&raquo; http://ahav10.livejournal.com/128249.html public 16 http://ahav10.livejournal.com/127892.html Wed, 04 Aug 2010 09:52:42 GMT Умер автор самой жизнеутверждающей эпитафии. http://ahav10.livejournal.com/127892.html RiP, что ли..<br /><lj-embed id="70" /> http://ahav10.livejournal.com/127892.html public 1 http://ahav10.livejournal.com/127741.html Mon, 02 Aug 2010 19:17:29 GMT Ну как так!? http://ahav10.livejournal.com/127741.html &nbsp;А вы говорите средство Макропулоса...ну ладно, не говорите, думаете...<br /><lj-embed id="69" /> http://ahav10.livejournal.com/127741.html public 0 http://ahav10.livejournal.com/127435.html Mon, 02 Aug 2010 18:46:35 GMT генератор банальности достоин колесования...или пиздюлей, что ли ему навалять http://ahav10.livejournal.com/127435.html &nbsp; <p class="MsoNormal">Вам кажется ,что самые страшные спутники невиданной жары это пожары, смог и бесноватость Шойгу? Вам думается , что сопутствующие погодной аномалии тахикардия, недостаток кислорода и детские капризы, это самое страшное? Нет! Самое страшное и неотвратимое, и посему ещё более страшное, это пламенный отзыв<span style="mso-spacerun:yes">&nbsp; </span>на шутку природы-реакция непризнанных, но плодовитых писателей. Вот увидите, не пройдёт и трёх дней после того, как &laquo;тонкая красная линия&raquo; свалит к двадцати шести, мы будем наслаждаться на просторах всех наших интернетов следующими перлами:</p> <p class="MsoNormal"><o:p>&nbsp;</o:p>..Это было тем жарким летом&hellip;марево, стоящее над городом&hellip; и даже асфальт плавился, не выдерживая&hellip;тьма накрыла вечный город ( не важно , что это уже было, не важно)&hellip; люди пытались спастись от жары в&hellip;казалось, что даже камни..</p> <p class="MsoNormal"><o:p>&nbsp;</o:p>Нам придётся начитаться всей этой муры. Пусть даже только вступительных фраз. Но это будет посильнее( любая банальность).&nbsp;</p> http://ahav10.livejournal.com/127435.html public 8 http://ahav10.livejournal.com/127148.html Fri, 23 Jul 2010 17:49:45 GMT сказки для мальчиков http://ahav10.livejournal.com/127148.html &nbsp;Ну очень люблю я эту песню.Видать не наигрался.<br /><br /><lj-embed id="68" /> http://ahav10.livejournal.com/127148.html public 3 http://ahav10.livejournal.com/126931.html Fri, 23 Jul 2010 17:12:31 GMT Активатор. http://ahav10.livejournal.com/126931.html &nbsp; &nbsp;Я спокойно переношу некоторое отклонение градусника вверх(как и вниз впрочем), но судя по всему не весь я. Мысль занимающая меня последние несколько часов могла появиться только из-за&quot;излишеств всяких нехороших&quot;, или по причине перегрева ВГМ. Я пытаюсь найти название своему &nbsp;занятию..ну ,за которое я основную часть денег получаю.Кроме придуманного мною &quot;радиоактиватора&quot; ничего в перегретый не приходит.Журналист-слишком стреноженно. Пи...бол-слишком расплывчато. Радиоведущий-на уборщицу в привокзальном кафе похоже.Да..Загадка. http://ahav10.livejournal.com/126931.html public 3 http://ahav10.livejournal.com/126513.html Wed, 21 Jul 2010 10:36:00 GMT Сэр Том.. http://ahav10.livejournal.com/126513.html &nbsp;Короткое перевоплощение.<br /><lj-embed id="67" /> http://ahav10.livejournal.com/126513.html public 0 http://ahav10.livejournal.com/126372.html Wed, 21 Jul 2010 10:21:38 GMT Опять нескладуха. http://ahav10.livejournal.com/126372.html &nbsp;Шин в августе в Москве, а я опять за несколько тысяч км. от лучшего в мире борца с трезвостью. FBS!<br /><br /><br /><lj-embed id="66" /> http://ahav10.livejournal.com/126372.html public 0 http://ahav10.livejournal.com/126134.html Thu, 15 Jul 2010 11:19:54 GMT WIR WOLLEN.... http://ahav10.livejournal.com/126134.html Здесь всё: Мюнхенский пивной, Разгром Стены, Надежды и Утраты последних 150 лет.Здесь всё! Никакого Фёдора Михайловича, только Гёте и Рильке.<br /><br /><lj-embed id="64" /><lj-embed id="65" /><br /> http://ahav10.livejournal.com/126134.html public 0 http://ahav10.livejournal.com/125820.html Sun, 11 Jul 2010 15:31:24 GMT "Триумф юдоли". http://ahav10.livejournal.com/125820.html <a href="http://rutube.ru/tracks/3380392.html?v=f4f1c36f0cb27ba95caa3d521c70f1b1">rutube.ru/tracks/3380392.html</a><br /><br />Наша &nbsp;&quot;Серая радость&quot;.<br /><br />Может я в детство впадаю. Это! У меня в стране!!Коммунистов хочу, сионистов, левых имаженистов!!! Кого угодно, хоть армию поклонников Ласкового мая. Можно Красные бригады, усиленные Менсоном Чарьзом, &nbsp;Кизи Кеном и всем преп. составом&nbsp; Хогвартса. Стреножьте анацефалов!<br /><br />&nbsp;&nbsp; http://ahav10.livejournal.com/125820.html public 4 http://ahav10.livejournal.com/125521.html Wed, 07 Jul 2010 07:07:44 GMT 70!!! http://ahav10.livejournal.com/125521.html Peace, чувак!<br /><br /><lj-embed id="63" /> http://ahav10.livejournal.com/125521.html public 1 http://ahav10.livejournal.com/125196.html Wed, 30 Jun 2010 07:34:09 GMT Уже даже не смешно. http://ahav10.livejournal.com/125196.html &nbsp;<a href="http://www.gazeta.ru/news/business/2010/06/30/n_1514166.shtml">www.gazeta.ru/news/business/2010/06/30/n_1514166.shtml</a><br /><br /><br />&nbsp; А если в Молдове решат отечать день радостного воссоединения с Советским Союзом в 1939 году песнями и народными гуляниями, то мы признаем молдавское вино лучшим и полезнейшим в мире.Можно ещё будет выкинуть с рынка французов и итальянцев, дабы освободить полки для молдован. http://ahav10.livejournal.com/125196.html public 1 http://ahav10.livejournal.com/125147.html Mon, 28 Jun 2010 11:43:17 GMT Не очень суровые будни. http://ahav10.livejournal.com/125147.html &nbsp;Если кому интересно.<br />С этой недели &quot;Танцы с волками&quot; выходят по вторникам и четвергам &nbsp;20 -22. http://ahav10.livejournal.com/125147.html public 8 http://ahav10.livejournal.com/124748.html Tue, 22 Jun 2010 18:18:50 GMT Есть для чего играть. http://ahav10.livejournal.com/124748.html &nbsp;....ТЬ! Я давно не видел и не слышал ничего более настоящего! Оказывается не только Гагу смотрят десятки миллионов челов.<br /><br /><br /><lj-embed id="62" /> http://ahav10.livejournal.com/124748.html public 9 http://ahav10.livejournal.com/124524.html Fri, 18 Jun 2010 18:38:45 GMT Блюз-тупая, ограниченная, cамая лучшая музыка на свете. http://ahav10.livejournal.com/124524.html &nbsp; Ещё один малоизвестный музыкант. Не Рома Зверь, но всёж. &nbsp;Новая пластиночка Bingo &nbsp;после ста лет молчания.<br /><br /><lj-embed id="61" /> http://ahav10.livejournal.com/124524.html public 4 http://ahav10.livejournal.com/124191.html Fri, 11 Jun 2010 19:40:59 GMT Оправдывая собственное распизд....о. http://ahav10.livejournal.com/124191.html &nbsp; <dl> <dt> <span lang="ru-RU">ТЫ НИКОГДА НЕ СТАНЕШЬ ВЗОРОСЛЫМ.</span></dt><dt> <br /> </dt><dt> <span lang="ru-RU">Даже самые восторженные от стартующей жизни мальчики и девочки не имеют иллюзий по поводу &laquo;звёздного&raquo; пути радиоактиватора. Им не мерещатся ковровые дорожки и в грёзах лимузины не отвозят их после </span><span lang="en-US">party </span><span lang="ru-RU">к трапу самолёта, улетающего в страну вечного солнца и дешёвой дури. Надёжа и опора, наша завтрашняя, молодёжь т.&nbsp;е., прекрасно знает какой стороной падает бутерброд и где текут бурные потоки белых и чёрных гонораров. Она, поросль эта юная неокрепшая знает, что на карте место радиоактиватора соседствует , если не с пустынной сушью, то уж с редко орошаемыми степями точно. Поэтому большинство неофитов воспринимает радио исключительно как необходимую ступень на шаткой стремянке медиа инициации. Некоторые правда в этом себе не признаются довольно долго. Настолько долго, что родные, друзья, любовницы и домашние зверюшки начинают верить в радиоактиваторское предначертание персонажа. И продолжается это до неминуемой у большинства поры взросления, мужания и прочей мути. &laquo;Повзрослев&raquo; недоактиватор начинает понимать, что то здесь, на радио, не то. Дискомфортно и вообще... по-детски как то.</span></dt><dt> <span lang="ru-RU">Мировые законы , что шоу-бизнеса, что масс медиа нам не то что не писаны, но подвергаются изрядному толкованию, вплоть до полного извращения. Такие вещи как &laquo;пейола&raquo;( проплаченные музыкальные эфиры) или манипулирование с рейтингами на удивление быстро привились на чахлые ростки российской индустрии развлечений. Не беда, что ноу-хау эти в странах звериного капитализма изничтожены на корню уж лет как двадцать, у нас навоз питательнее. Растёт шириться и множится. А вот, что касается современных тенденций и трендов, тут нам пока торопиться почему то не хочется. А одним из важнейших принципов их буржуйских развлекательных законов является отрицание старости как явления. Не стариков, заметим, с этим у них как раз всё по другому, а старости или чрезмерного взросления. Глупо говорить о почтенных, мудрых старцах глядя на Джаггера и подельника его Ричардса Кита.&laquo;Умудрённый жизненным опытом&raquo; Ховард Стерн может приводиться только в горячечном бреду. Пожилая , почтенная Опра Уинфри...Ну, вы поняли. А популярности у этих наймитов буржуазии чуть больше, чем у всех наших медиа и шоу индустрий вместе взятых. Да и мастерства, между прочим. И вся эта популярность и мастерство схлопнулись бы как сверхновые, в наносекунды, стань бы Мик, Кит, Опра или Ховард &laquo; давать солидного&raquo;. </span><span lang="en-US"> </span><span lang="ru-RU"> У нас же стремление к &laquo;значимости &laquo; и &laquo; солидности&raquo; вторая после гонорарного экстаза движущая сила, заставляющая молодых и не очень людей смотреться в зеркало медиа успеха. Обрастание костюмами и животами, воспитанное презрение к метро и автобусам, подпускание рокочущих ноток в конце фразы и пауза в середине предложения как цезура. Только таким воспринимает себя в будущем мальчик, впервые оказавшийся в радиостудии. Ну, может и не каждый мальчик, а процентов эдак девяносто радио рекрутов. Именно поэтому активаторами становятся уж никак не больше оставшихся десяти. А так, ещё меньше. </span> </dt><dt> <span lang="ru-RU">Горькая , может для кого то правда, если хочешь долго и востребовано говорить слова в микрофон смирись с простой мыслью-ТЫ НИКОГДА НЕ ПОВЗРАСЛЕЕШЬ! Ты никогда не сможешь стать &laquo;солидным&raquo;. Слушатель &laquo;солидности&raquo; не прощает. Медленное и чрезмерное весомое разжёвывание собственных мыслей по поводу дефицита бюджета третьего квартала Калининградской области или, исполненное тайного знания, мычание в ответ на реплику оппонента достойно другого применения. Слово достойно здесь употребляется мной по привычке, поскольку в непрофессионализме достойного мало. А тот самый &laquo;профессионализм&raquo; на радио определяется только умением держать аудиторию. Держать, это так просто. Ну, делать только то, что направленно на отвлечение шаловливых ручек дорогих &laquo;ушастых&raquo;.Переключиться ведь норовят, ироды! А ты не даёшь. И если у тебя в арсенале только твоя &laquo;солидность&raquo;, пусть даже вкупе с богатым жизненным опытом, место твоё точно не на радио. На российском телевизионическом ящике, скорее всего. Там таких любят и даже иногда финансово поощряют. Вы когда нибудь видели хохочущего телеведущего? Вы когда нибудь слышали от богов телевизора примеры лексики, выходящие за нормы языка партийных конференций времён хрущёвской оттепели. Про облачения большинства теле гуру даже вспоминать тоскливо. Потому как, по каким -то странным отечественным законам масс медиа, в ящике нужно быть &laquo;солидным&raquo;, необходимо быть безвременно постаревшим, архиважно казаться похожим на воспитателя детского сада для трудных детей ясельного возраста. А ещё лучше, быть им. А то что аудитория отечественных телеканалов окончательно &laquo;сшагренилась&raquo;, то это так, происки тридцати-сорокалетних детишек, упрямо не желающих в спальне надевать пары и тройки дорогой шерсти.</span></dt><dt> <span lang="ru-RU">Смеясь в микрофон изредка своим и чаще чужим шуткам, рисуя голосом картинки от которых у одних шерсть дыбом, а у прочих горячий одобрямс ты закрываешь себе путь к синекурам голубого(спокойно) экрана. Отказываясь от сладостных эфирных образов полковника Скалозуба и крепкого хозяйственника Собакевича, ты ставишь крест на успехе в рекламоёмкой среде домохозяек за пятдесят. Мало того, возможно ты такой отщепенец, что рассказ о твоих любовных похождениях в берлинском зоопарке из газеты &laquo;Жизнь&raquo; ( с фотографиями, разумеется) тебе не нужен. Поздравляю, тебе не стать взрослым. Зато ты можешь стать радиоактиватором. Хорошее занятие для людей любого возраста.</span></dt></dl> http://ahav10.livejournal.com/124191.html public 10 http://ahav10.livejournal.com/124108.html Wed, 09 Jun 2010 15:08:41 GMT Вся правда о проекте Народный гараж. http://ahav10.livejournal.com/124108.html &nbsp;Вот что такое настоящий народный &quot;гараж&quot;.<br /><lj-embed id="60" /> http://ahav10.livejournal.com/124108.html public 10 http://ahav10.livejournal.com/123832.html Sun, 06 Jun 2010 15:04:35 GMT Патриоты-мстители. http://ahav10.livejournal.com/123832.html <a href="http://www.gazeta.ru/news/lastnews/2010/06/06/n_1504004.shtml">www.gazeta.ru/news/lastnews/2010/06/06/n_1504004.shtml</a>&nbsp;<br /><br /><br /><br />Я так понимаю, что это патриоты за деяния Пилсудского отомситили.Молодцы.А ещё говорят, что у нас ОМОН плохой. http://ahav10.livejournal.com/123832.html public 6 http://ahav10.livejournal.com/123400.html Wed, 02 Jun 2010 21:15:37 GMT Самая грустная глава. http://ahav10.livejournal.com/123400.html &nbsp; <dl> <dt><p lang="ru-RU"><font size="2">Галеры &laquo;работы над собой&raquo;.</font></p></dt><dt><p lang="ru-RU"><br />&nbsp;</p></dt><dt> <font size="2"><span lang="ru-RU">Когда нарушившая фруктовое эмбарго парочка изгонялась из &laquo;</span></font><font size="2"><span lang="en-US">all inclusive&rdquo; </span></font><font size="2"><span lang="ru-RU">никто не мог и предположить, что инструкции по добыванию хлеба насущного в поте лица своего будут иметь такое широкое толкование. Отрыв траншей, перетаскивание мешков с песком и замена коробки передач без подъёмника в дождь на улице оказались для человека детской забавой по сравнению с непонятной максимой &laquo; работы над собой&raquo;. Не позволяй душе лениться-великолепная фраза для праздничного завершения пубертатного периода, и то не для каждого. Переживания юной плоти с трудолюбием души связывают только отличницы средней школы, которых воспитали строгие родители, с упорством муравья скрывающие от своих чад тот факт, что &laquo;Сказку о царе Салтане&raquo; и &laquo;Гаврилиаду&raquo; написал один и тот же человек. Ответ на вопрос, чем ленивая душа отличается от работящей, без смеха дать невозможно. Даже, если существование этой неопределённой строго субстанции не вызывает у вас сомнений. Ну, смешно же говорить о том, что у -неё -него &laquo;работящая душа&raquo; ! В поте лица своего!!! Или: &laquo; Ваша душа в этом году на вакации когда уходит?&raquo;.Душа заболела и взяла больничный. Хотя, подсознательно мы чувствуем, что это непонятное, пришедшее в наш язык из арамейского бестселлера надо неким образом подстёгивать и даже приводить в рабочее состояние при полном отсутствии взаимопонимания.</span></font></dt><dt> <font size="2"><span lang="ru-RU">Абулия считается редко встречающимся заболеванием. Однако, поработав радиоактиватором и понаблюдав за реакцией коллег на их собственные эфиры и прислушавшись к себе самому вы поймёте, что этим редким недугом тотального безволия поражены, если не все говорящие-пишущие, то половина-уж точно. Более вероятно, что наслаждаются своей абулией и пестуют её все, однако половине удаётся это скрывать, даже от себя. Отсутствие интереса к тому, о чём ты говоришь и невозможность этот интерес симулировать-проблема, сопоставимая с важностью симуляции половой функции...хоть какой -нибудь. Интерес к предмету, он ведь просто так не возникает. Это только любовь приходит ниоткуда, если верить поэтам песенникам, а интерес, он плод работы мозгов, или, если хотите, того самого духа. Совершенно невозможно проявлять искренний интерес к трудам Эриха Фромма, если ты не заставил себя прочесть хоть одну его работу. Хотя, мне даже после прочтения не удалось. Ну это так , к слову...Каким образом можно неподдельно(поддельно то можно) интересоваться задачей уменьшения тарифов железнодорожных грузоперевозок на Дальнем Востоке, если слово тариф ты ассоциируешь только с руомингом при поездке в Камбоджу? Хорошо, когда тебе надо подготовить программу с темой, спущенной сверху. Тут никакого личного интереса и не требуется. Если ты крепкий хояйств..извините, профессионал и микрофон заплёвываешь не один год, то интерс тебе не потребуется. Довольно будет простого человеческого страха перед увольнением или сливом в плохой сегмент. Это самые сильные аргументы в деле совершенствования собственной радиоактивности. А вот что делать, если указивок и заданий не существует, а находишься ты в более или менее свободном плавании? Мол, ты творец, ты и придумывай. А вот здесь уже никак не обойтись без &laquo;не позволяй душе лениться&raquo;. В смысле, симуляцией интереса не обойдёшься. Дорогие радиослушатели, они почему то эту симуляцию, не то что за версту, за тысячи эфирных километров чуют. Чуют и приёмнички, гады, переключить норовят, когда ты имитируешь неподдельную заинтересованность, пытаясь без ошибок произнести слово( сегодня только прочитанное) &laquo;гештальтпсихология&raquo;.</span></font></dt><dt> <font size="2"><span lang="ru-RU">Это только на первый взгляд на свете много вещей, идей и явлений, которые нас действительно интересуют. На самом деле, нехитрый набор медийного прилавка да нереализованные подростковые фантазии, вот два основных источника наших интересов. А радиоактиваторы, они не с Марса, они тоже люди, и от прочих отличаются только тем, что на генерации чужого интереса деньги зарабатывают. </span></font><font size="2"><span lang="en-US"> </span></font><font size="2"><span lang="ru-RU">А чужой интерес без собственного хреново генерируется. Можно говорить и даже &laquo;вещать&raquo; о разных штуках в которых ты ну ничегошеньки не понимаешь. Как говорила героиня Ирины Муравьёвой из &laquo;Москва слезам не верит&raquo;:Ляпай! Но ляпая с уверенностью&raquo;. Можно вспомнить основной постулат успеха радиоактиватора-неважно что, важно как. Именно это &laquo;как&raquo; привлечёт внимание и не даст слушателю ни малейшей возможности вытащить вас из ушей. Но, оборони вас создатель, говорить о вещах, которые вам не интересны, не прикалывают, не тащат и т.&nbsp;д. Даже, если в студии нет веб камеры и презрение вашей утомлённой нижней губы никому не видно, слышно всё это как крик муэдзина на Ай-Софья поутру. Хорошо, то есть слышно. Громко. Читать заранее заготовленный текст, интерактивничать со слушателями, задавать вопросы экспертам-всё бестолку. Серая жижа вашего пофигизма прорвётся через любую профессионально возведённую плотину. И останется только ждать коды нетленной песенки Зеппов </span></font><font size="2"><span lang="en-US">&rdquo;</span></font><font size="2"><span lang="ru-RU"> </span></font><font size="2"><span lang="en-US">W</span></font><font size="2"><span lang="ru-RU">hen the levee breaks&raquo;.</span></font></dt><dt> <font size="2"><span lang="ru-RU">Ну совсем ничего не получиться, если интерес у себя не свиагрить. И вот тут совершенно по другому, не по детски начинаешь перечитывать слова о &laquo; душе лениться&raquo;. Без пафоса благоговейного, но с интересом. Работаешь, стало быть, над собой. Исходник вроде посредственный, а результат-Уорхол и Фаберже на одних торгах. Да и интересно это, &laquo;над собой&raquo;.</span></font></dt></dl> http://ahav10.livejournal.com/123400.html public 0 http://ahav10.livejournal.com/123313.html Wed, 02 Jun 2010 17:24:23 GMT Без драйва нет лайфа. http://ahav10.livejournal.com/123313.html &nbsp;Три с половиной любителя Тома Петти в нашей необьятной ждут новый альбом, который станет бомбой..для трёх с половиной любителей. Я сам , брат, из этих.<br /><br /><lj-embed id="59" /> http://ahav10.livejournal.com/123313.html public 1 http://ahav10.livejournal.com/123013.html Tue, 01 Jun 2010 19:13:50 GMT Жалкое подобие Петра Налича. http://ahav10.livejournal.com/123013.html Ну сколько можно нас кормить графикой и комп. технологиями. Ведь давно известно, что люди так играть не умеют! Прекратите обманывать российских меломанов!!!<br /><lj-embed id="58" /><br />&nbsp; http://ahav10.livejournal.com/123013.html public 1 http://ahav10.livejournal.com/122785.html Tue, 01 Jun 2010 13:16:56 GMT Вознесенский. http://ahav10.livejournal.com/122785.html &nbsp;<em>Кончину чую. Но не знаю часа.<br />Плоть ищет утешенья в кутеже.<br />Жизнь плоти опостылела душе.<br />Душа зовет отчаянную чашу!<br />Мир заблудился в непролазной чаще <br />средь ядовитых гадов и ужей.<br />Как черви, лезут сплетни из ушей.<br />И истина сегодня - гость редчайший.<br />Устал я ждать. Я верить устаю.<br />Когда ж взойдет, Господь, что Ты посеял?<br />Нас в срамоте застанет смерти час.<br />Нам не постигнуть истину Твою.<br />Нам даже в смерти не найти спасенья.<br />И отвернутся ангелы от нас.</em> http://ahav10.livejournal.com/122785.html public 1 XML-Fast-0.17/t/reports/03.xml000644 000766 000024 00000753337 13123552546 016051 0ustar00monsstaff000000 000000 Рюмин Алексей http://alex-ryumin.livejournal.com/ Рюмин Алексей - LiveJournal.com Mon, 28 Sep 2009 14:49:01 GMT LiveJournal / LiveJournal.com alex_ryumin 18618066 personal http://l-userpic.livejournal.com/85510986/18618066 Рюмин Алексей http://alex-ryumin.livejournal.com/ 88 100 http://alex-ryumin.livejournal.com/16093.html Mon, 28 Sep 2009 14:49:01 GMT Спасибо:) http://alex-ryumin.livejournal.com/16093.html Друзья! <br /><br />Еще раз хотел всем выразить свою благодарность за добрые слова! Для меня очень важно, что все это путешествие было для вас интересным и вдохновляющим. И вдохновляющим не обязательно только на путешествия, но на возможность посмотреть на мечту каждого из нас под другим углом, и поверить что ее достижение не такое уж и не реальное, как кажеться на первый взгляд. Ведь по сути, мечты у нас такие разные, а пути к ним всегда чем-то похожи: нашими страхами, собственноручно возведенными преградами на пути к ним , сомнениями и т.д.<br />По приезду в Москву друзья меня взяли в оборот после полугодовой разлуки, поэтому все никак не могу добраться до компьютера и смонтировать финальный ролик. Но планирую до субботы сделать его и выложить в сеть.<br />Москва в первый же день накрыла такой массой негатива, что чуть не согнулся...:( Видимо отвык совсем в Монголии от таких отрацательных эмоций и напряжения в воздухе, и сначала опешил. Но уже помаленьку вхожу в темп:)<br />Главное продолжать верить в чудеса, искренне улыбаться и тогда, даже в таком городе как Москва, найдется много людей которые с удовольствием улыбнуться в ответ.<br />И все будет хорошо:) <br />Как и должно быть!<br /><br />Ваш Алекс http://alex-ryumin.livejournal.com/16093.html shoutaim Словения Сербия путешественник Трансевразия Алексей Рюмин Экспедиция Испания livejournal велопутешествие ВелоТрансЕвразия Канны ТрансЕвразия lovi.tv sony Байкальские приключения Новосибирск Италия граница Монако Тарелка & Талер Владивосток азия саморазвитие Франция европа Руян видео Хорватия мечта Мадрид Китай skylink coca-cola путешествия s7 грусть Рюмин Ницца Азия Россия путешествие путешественники Казахстан авиабилеты Молдавия дороги.ру Монголия Путешествия прорыв велосипед Румыния Алтай encounter люди одиночество Сибирь Украина победа trek Европа public 11 http://alex-ryumin.livejournal.com/15687.html Fri, 25 Sep 2009 06:22:28 GMT Решение принято http://alex-ryumin.livejournal.com/15687.html Ну что, друзья, я получил результаты обследования коленного сустава и проконсультировался еще раз с хирургом.<br /><br />Во-первых, хотел сказать огромное спасибо всем кто прислал мне информацию по возможным проблемам с суставами у велосипедистов и о том, как с ними бороться и вообще ухаживать за суставами. <br />Во-вторых, спасибо за поддержку моральную, которую вы мне оказали. Это реально мне помогло в эту трудную минуту. Мне очень сложно было принять решение, и даже после получения результатов анализа. <br /><br />А диагноз следующий: дегенерация медиального мениска. Хирург показал мне фотографии (МРТ) моей коленки, на которой видно темные пятна на внутреннем мениске, которые свидетельствуют о его истончении.<br />«…Предрасполагающими моментами для полного разрыва, не поврежденного ранее, мениска являются дегенеративные явления и воспалительные процессы в нем…» (источник: <a href="http://www.sportmedicine.ru/meniscus.php">http://www.sportmedicine.ru/meniscus.php</a>).<br />Рекомендация хирурга была в необходимости отдыха в течение 3 недель, за которые мениск по идее, но не факт, должен восстановиться, а также лечении сустава.<br /><br />В итоге я принял решение завершить проект «ВелоТрансЕвразия: из Мадрида во Владивосток» в Улан-Баторе.<br />Как это не прискорбно, но приходится отказываться от его завершения, когда до финиша осталось совсем чуть-чуть, около 2800 км. <br />Самое неприятное в этой ситуации, что ее не преодолеть просто усилием воли, не проехать, стиснув зубы или нарочито улыбаясь назло всему… Точнее можно, но последствия могут быть плачевными для реализации всем моих последующих проектов и задумок.<br /><br />НО, на этом этот журнал не закрывается, именно по этому он и называется не ТрансЕвразия, а моим именем. Дальше предстоит подготовка к ТрансГренландии, поиск партнеров и напарника, и непосредственно сама экспедиция. Я и мои друзья из штаба многое поняли и многому научились за эти месяцы, поэтому следующий проект, а также сам процесс подготовки к нему, обещает быть более масштабным и самое главное насыщенным на впечатления и эмоции, переживания и внутренние открытия. О чем я непременно буду рассказывать, и буду показывать!<br /><br />До скорой встречи!<br />Ваш Алекс http://alex-ryumin.livejournal.com/15687.html shoutaim Словения Сербия путешественник Трансевразия Алексей Рюмин Экспедиция Испания livejournal велопутешествие ВелоТрансЕвразия Канны ТрансЕвразия lovi.tv sony Байкальские приключения Новосибирск Италия граница Монако Тарелка & Талер Владивосток азия саморазвитие Франция европа Руян видео Хорватия мечта Мадрид Китай skylink coca-cola путешествия s7 грусть Рюмин Ницца Азия Россия путешествие путешественники Казахстан авиабилеты Молдавия дороги.ру Монголия Путешествия прорыв велосипед Румыния Алтай encounter люди одиночество Сибирь Украина победа trek Европа public 17 http://alex-ryumin.livejournal.com/15419.html Wed, 16 Sep 2009 09:16:14 GMT Монголия не отпускает…:( http://alex-ryumin.livejournal.com/15419.html <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt"><font face="Times New Roman" size="3">14.09 в 11 утра я покинул Улан-Батор и направился в сторону китайской границы. Дорога до Чойра (230 км) была асфальтовая и ровная как в Испании. А учитывая практически отсутствие на ней машин, все полоса была исключительно моя и ехал как хотел, а редкие попутные машины без проблем обгоняли меня по встречке. Красота. Первый день я ехал, и душа пела, кричала и неслась впереди велосипеда!!!:)</font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;</span>Ночью я поставил палатку в поле в 100 метрах от дороги, а когда уже готовил ужин ко мне подъехал монгольский пастух, возвращавшийся домой со стадом коз. Пригласил меня к себе в юрту, но мне было лень паковать вещи обратно, снимать палатку и я отказался. Потом, в темноте пожаловали еще два пастуха, гнавшие табун лошадей на ночной выпас. Один из них сносно говорил по-русски. Поболтали о лошадях и моем железном коне:) Они пожелали мне удачи и ускакали, оставив табун постись недалеко от моей палатки.</font></font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt"><font face="Times New Roman" size="3">А на утро 15.09 началось.</font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt"><font face="Times New Roman" size="3">Сначала, на разминке я почувствовал боль в правом коленном суставе. Но боль, такую, которая не один десяток раз была у меня за время Экспедиции. Поэтому я не придал особого значения.</font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt"><font face="Times New Roman" size="3">Вообще я считаю, что подобного рода экспедиции, непременно связаны с болью и физическими преодолениями, не говоря уже о психологических. Колени у меня, по сути, начали болеть еще в Италии, т.е. 4 с небольшим месяца назад. Иногда боль была резкой и невыносимой (как в Казахстане и Юге Сибири), а иногда просто ноющей или просто колени похрустывали. Болели руки, шея, поясница, а про зад я вообще не говорю:)))))</font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt"><font face="Times New Roman" size="3">Это чем-то похоже на профессиональный спорт, который неразрывно связан с травмами, и здоровья не прибавляет. Фальк, мой знакомый немец, путешествующий на велотандеме с женой из Мюнхена в Пекин, которого я повстречал в Казахстане, подтверждал мои мысли на этот счет. А он ни много ни мало марафонец (легкоатлет) и веломарафонец (если не ошибаюсь с дистанцией &ndash; 700 км, знающие люди поправьте, если ошибся). </font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt"><font face="Times New Roman" size="3">Так вот, возвращаясь к тому дню. Через 4 часа педалирования почувствовал жжение внутри сустава, но такое же как было не раз и раньше. А еще через пол-часа колено пронзила резкая боль, аж померкло в глазах и нога перестала гнуться. Точнее больно очень было сгибать (режущая боль). Час постоял, поразминал ее и решил снова поехать. И через 100 метров еще сильнее шибануло&hellip; После 2-х часовых размышлений и душевных мучений, решил вернуться на попутке в Улан-Батор.</font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt"><font face="Times New Roman" size="3">А сегодня 16.09 сходил в клинику.</font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt"><font face="Times New Roman" size="3">Кстати, к слову сказать, в УБ есть корейская клиника, европейского уровня, лучшая в городе. С хорошим немецким оборудованием. Где меня осмотрел хирург и сказал, что, мол, молодой человек, скорее всего вы стерли себе хрящи в суставе. Но как говориться, вскрытие покажет, поэтому отправил меня на МРТ (магнитно-резонансную томографию). Результат будет в пятницу или в субботу. Стоит сие удовольствие 200.000 тугриков. 140 баксов, пришлось раскошелиться.</font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt"><o:p><font face="Times New Roman" size="3">И&nbsp;еще что странно, когда хожу колено не болит, но стоит посидеть или полежать минут 20, а затем встать, как опять колено пронзает боль...</font></o:p></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt"><font face="Times New Roman" size="3">У меня огромная просьба к коллегам велосипедистам, а также спортсменам и просто знающим людям (может хирурги читают мой блог:))</font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt"><font face="Times New Roman" size="3">Если кто сталкивался с подобным, проходил через это напишите плиз и скажите, как с этим бороться.<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P.S. Духом не падаю, буду ждать результатов, чтобы решать как быть дальше. </font></p> http://alex-ryumin.livejournal.com/15419.html shoutaim Словения Сербия путешественник Трансевразия Алексей Рюмин Экспедиция Испания livejournal велопутешествие ВелоТрансЕвразия Канны ТрансЕвразия lovi.tv sony Байкальские приключения Новосибирск Италия граница Монако Тарелка & Талер Владивосток азия саморазвитие Франция европа Руян видео Хорватия мечта Мадрид Китай skylink coca-cola путешествия s7 грусть Рюмин Ницца Азия Россия путешествие путешественники Казахстан авиабилеты Молдавия дороги.ру Монголия Путешествия прорыв велосипед Румыния Алтай encounter люди одиночество Сибирь Украина победа trek Европа public 14 http://alex-ryumin.livejournal.com/15242.html Sun, 13 Sep 2009 11:59:15 GMT Завершение эпопеи с кареткой http://alex-ryumin.livejournal.com/15242.html Ну вот, дорогие мои, подходит к заключению мое вынужденное, но очень насыщенное на впечатления пребывание в Улан-Баторе. Завтра (14.09.) в 6:20 утра каретка прибывает на вокзал, и ориентировочно с 9 до 10 часов утра я выезжаю из Улан-Батора в сторону Китайской границы, до которой около 700 км.<br /><br /><a name="cutid1"></a>Окончательный вариант пересылки каретки из Москвы в Улан-Батор выглядел следующим образом. <br />Наш партнер, авиакомпания S7 предложила нам доставить посылку с деталью ближайшим рейсом до Иркутска, откуда уже до Улан-Батора ежедневно ходит поезд, и есть возможность передать с проводником посылку мне. <br />Хочу сказать спасибо Волкову Игорю (Начальнику отдела развития корпоративной культуры и внутренних коммуникаций директората по работе с персоналом S7) и Андрею Макееву (представителю центрального офиса S7 в Иркутске) за помощь в доставке посылки до Иркутска, а также Анатолию Казакевичу &ndash; путешественнику и Генеральному директору туристической компании &laquo;Байкальские приключения&raquo;&nbsp;<br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152677/xlarge/155059717.jpg" /><br /><br />(www.go-baikal.ru) <br />за передачу посылки с проводником поезда Иркутск &ndash; Улан-Батор. <br />И естественно моим любимым из штаба экспедиции! <br /><br />И вообще настроение у меня просто на необычайной высоте. Я рад, что я двигаюсь дальше. Я рад, что до Китая, крайнего этапа моей экспедиции, осталось 700 км, да и вообще до финиша уже осталось совсем ничего!!! Чуть более 3000 км&hellip; УРА!!! <br />И самое главное, я рад, что в Улан-Баторе мне удалось много пообщаться по Скайпу с моей ненаглядной принцессой! Это был наверно один из самых лучших мне подарков от Монголии. <br /><br />И вот под это замечательное настроение у меня получился вот такой вот небольшой видеоролик, на заводную песню монгольской ска-группы L Guards. Что называется, впал в детство:))) <br /><lj-embed id="15" /><br /><br />Если у кого возникнет вопрос: &laquo;А что курил Капрал Лев в тот день?&raquo;, отвечаю &ndash; он даже не пьет. Это состояние души, называемое shoutaim. Кто не понял, смотрите здесь (www.shoutaim.ru). <br /><br />Но как говориться головы не теряем и дальше двигаемся аккуратно и с широко открытыми глазами. <br /><br />P.S. Начал учить китайский язык. Выучил уже основные фразы, а также цифры и их написание иероглифами.<a name='cutid1-end'></a> http://alex-ryumin.livejournal.com/15242.html shoutaim Словения Сербия путешественник Трансевразия Алексей Рюмин Экспедиция Испания livejournal велопутешествие ВелоТрансЕвразия Канны ТрансЕвразия lovi.tv sony Байкальские приключения Новосибирск Италия граница Монако Тарелка & Талер Владивосток азия саморазвитие Франция европа Руян видео Хорватия мечта Мадрид Китай skylink coca-cola путешествия s7 грусть Рюмин Ницца Азия Россия путешествие путешественники Казахстан авиабилеты Молдавия дороги.ру Монголия Путешествия прорыв велосипед Румыния Алтай encounter люди одиночество Сибирь Украина победа trek Европа public 5 http://alex-ryumin.livejournal.com/14854.html Sat, 12 Sep 2009 13:21:15 GMT Еще раз про Улан-Батор, а также новый интернационал и консульство банановой республики в Монголии… http://alex-ryumin.livejournal.com/14854.html Поскольку любой город за границей для путешественника начинается, правильно, с поиска места ночлега, то я бы хотел рассказать про сие явление в Улан-Баторе. Когда я ехал первый день по городу, то у меня создалось впечатление что большая часть жителей города вместе с туристами живет в отелях. Они везде и всюду, и их просто неприлично много. Дорогие и красивые снаружи (внутри не был) и откровенные общаги, причем зачастую соседствуют друг с другом. Хотя стоит отметить, дороговизна и звездность отеля в Улан-Баторе абсолютно не означает, что в отеле будет, допустим, горячая вода. 35 баксов, а воды нет&hellip; Так что спрашивайте заранее, правда могут сказать, что пока нет, но вечером она появится с 18 до 24&hellip; На самом же деле, может и не появиться&hellip; видимо опять же от кармы зависит:) Азия. У меня в первый день так и не появилась&hellip; <br /><a name="cutid1"></a><font style="background-color: #ffffff">В общем, так и влачил бы я свое жалкое существование в 12 долларовом отеле без Интернета и воды горячей днем, если бы не Костя. Ему один знакомый мотоциклист порекомендовал некий &laquo;LG guesthouse&raquo; недалеко от ж/д вокзала. Где он собственно и остановился и меня туда же переманил. Поселились мы с ним в 2-х местном люксе за 9 долларов с носа в день (сторговались на скидку в 1 доллар каждому:) за то, что на долго остановились оба). <br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036578.jpg" /> <br /><br />Но за эти 9 долларов у нас и интернет Wi-Fi, благодаря чему я имею возможность каждый день общаться со штабом и не только;) <br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036704.jpg" /> <br /><br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036710.jpg" /> <br />Лева: &laquo;Как же ты там без нас, совсем один&hellip;ох-ох-ох&raquo; <br /><br />и постоянно горячая вода (бойлеры везде), и собственная кухня с плитой и полным набором посуды, холодильник и еще за 3 доллара могут 3 кг белья постирать, высушить и погладить:) <br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036582.jpg" /> <br /><br />На сей кухне я своим новым друзьям Косте и гиду по конным турам по Монголии Джейн приготовил овощной салат: <br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036641.jpg" /> <br /><br />вот такой вот: <br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036683.jpg" /> <br /><br />Весь персонал разговаривает по-английски и некоторые по-русски. <br />Если селиться в обычные комнаты с 2-х ярусными кроватями на 4 места, как в обычных хостелях, то будет и того дешевле с носа (6$). <br />В общем, если кто намылиться в Улан-Батор или будет здесь проездом, очень рекомендую. <br />Вот координаты и фото снаружи: <br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036604.jpg" /> <br /><br />Tel: 976-70118243; 976-99858419; 976-91002311 <br />lg_guest@yahoo.com <br />lg@mbox.mn <br />www.lg.url.mn <br />Люксовые комнаты (те что на двоих и в которой мы жили) лучше бронировать заранее. А то нам пришлось на 2 дня съехать в обычный номер, т.к. этот был забронирован на те дни. <br /><br />Ну а теперь собственно город. <br />Это он, знакомьтесь. <br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036636.jpg" /> <br /><br />Наверно не каждому известно, что на самом деле родина ливерпульской четверки вовсе не Ливерпуль, а Улан-Батор, и каждый второй монгол &ndash; битломан до мозга костей, именно поэтому в центре города им установили монумент, весьма интересный, правда смысл мне его понятен только на половину (не понял, почему Пол стоит в такой позе. Понятно, почему отдельно, но вот почему так?). <br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036539.jpg" /> <br /><br />Поскольку Улан-Батор (здесь и далее просто УБ) столица, как и любой столице, ей не чужды пробки. Газюка и смог стоит страшный. <br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036679.jpg" /> <br /><br />Но видимо тяга к корням у части населения так сильна, что многие ходят в национальных костюмах, причем не только пожилые, но и люди среднего возраста, а также живут в юртах на окраинах города. <br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036656.jpg" /> <br /><br />Кафешек по городу разбросано не меньше, чем гостиниц. Дорогие для иностранцев (с салатами от 5000 Тугриков (3,5$) и Основными блюдами от 9000 тугриков (6,2$)), естественно мы туда и не ходили, кроме как поглазеть на меню, подивиться, да на людей трапезничающих там посмотреть. Понятное дело 100% это иностранцы. <br />Мы же ходили в обычные кафешки, с виду вызывающие недоверие своей антисанитарийностью, по меркам белого человека, но очень вкусно готовящие за нормальные цены (салатик 1000 тугриков (0,7$) и основные блюда от 2500 тугриков (1,7$)). Пока еще, из моих новых знакомых, никто ни разу на горшок не бегал после них. <br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036647.jpg" /> <br /><br />В каждой забегаловке готовят местное блюдо Бууз (Читается как буз, только с долгой &laquo;у&raquo;). По сути это наши манты, только ну очень жирные и из баранины. Но вкусныееее:) и стоят от 200 до 350 тугриков за штуку. Красота:) <br /><br />Ну и вот вам немножко красоты из Музея эээ&hellip;, в общем музея: <br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036660.jpg" /> <br /><br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036668.jpg" /> <br /><br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036671.jpg" /> <br /><br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036644.jpg" /> <br /><br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036664.jpg" /> <br /><br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036687.jpg" /> <br /><br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036694.jpg" /> <br /><br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036652.jpg" /> <br /><br />Этот кинжал напомнил мне летающий кинжал из какого-то фильма, он еще кусал там главного героя за руку. Тока вот так и не вспомнил, что за фильм. <br /><br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036632.jpg" /> <br /><br />В российском посольстве Костя познакомился с тремя парнями из Германии, Великобритании и Аргентины. Ну и потом меня тоже с ними познакомил. Тоби из Германии просто путешествует по Евразии вот уже как 7 месяцев, правда 4 из них он работал учителем немецкого языка в Непале. <br />Тоби <br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036600.jpg" /> <br /><br />Гильермо (не путать с Капетилио&hellip; пишу и самому аж смешно, что такое знаю:)))) из Аргентины, участвовал в автопробеге MongolRally не поверите на чем&hellip; на машине скорой помощи. Он ее привез в Монголию как предмет благотворительной помощи&hellip; Конечно похвально, но, я думаю, что когда машина проехала больше 10 000 км через азиатские страны, то &laquo;скорой&raquo; помощи от этой машины ждать я бы уже не стал&hellip;:) <br />Гильермо, Анна и Тоби <br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036559.jpg" /> <br /><br />Пита, поскольку он единственный в нашей пестрой компании был носителем английского языка, мало кто понимал, и зачем и как он приехал в Монголию мне выяснить не удалось&hellip; <br />Пит <br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036586.jpg" /> <br /><br />И мы все вместе. Пьем пиво у Битлов. <br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036592.jpg" /> <br /><br />Российское посольство в Улан-Баторе является чем-то вроде клуба знакомств для иностранцев. Почему, объясню попозже. <br />В нем же мы встретили и познакомились, и более того потащили с собой на местный черный рынок, девушку Анну из Франции. Она жила в Монголии месяц, по 2 недели в двух семьях, изучала так сказать культуру местного быта. <br />Но объединяло их всех одно. Трудности с получением российской визы. <br />Что меня больше всего удивило, это то, что работает консульство на прием документов от иностранных граждан с 14 до 15 часов, т.е. 1 час&hellip;!?!?!? Можно было бы сказать &laquo;да сколько там иностранцев получает визу в Россию в УБ&hellip; полторы калеки&raquo; Да вот в том то и дело, что нет&hellip; Очереди неплохие, по 8-10 человек стоят, а, учитывая что на одного человека уходит в среднем 15-20 минут, считайте сами&hellip; <br />Костя ходил 4 раза уже, сначала попросили регистрацию в Монголии, которую в монгольском РОВД ему отказались делать, поскольку она делается только, если вы находитесь в Монголии уже более 30 дней. Когда он пришел обратно, то ему сказали ну ничего, только вот приглашения из Москвы недостаточно, надо брони отелей из всех городов по вашему маршруту где вы будете останавливаться&hellip; ОК&hellip; помог я ему сделать брони через hotels.com, которые после получения визы, естественно отменяются&hellip; помог мой опыт оформления шенгена&hellip;:))) Опять что-то там не срослось&hellip; В общем пока не подключили болгарского посла и тот не позвонил в российское консульство дело с мертвой точки не сдвинулось бы&hellip; <br />Тоби и Гильермо сдавали документы 3 раза и каждый раз им с улыбкой говорили, что визу им не дадут потому как у них нет того-то и того-то&hellip; <br />На 4-й раз дали. Вот они, счастливые обладатели российских виз: <br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036674.jpg" /> <br /><br />Другие Американцы рассказывали, что ходят уже 9 раз&hellip; <br />Причем самое интересное, что в официальном документе написано, что нужен только паспорт, фото, анкета и все&hellip; а по факту требуют все что в голову придет, причем каждый раз с какой-то изощренной изобретательностью&hellip; Я так говорю, поскольку много наобщался там с гражданами разных стран, состоящих в этом клубе по несчастью&hellip; <br />Я думал, тока, что только консульства Немцев и Америконцев в Москве такие мозгае&hellip;круты <br />Анна даже сказала &ldquo;Now I hate Russia&rdquo;, не зная еще, что я из России, на что Гильермо давясь от смеха и хлопая меня по плечу сказал &ldquo;Alex, don&rsquo;t be upset&hellip;&rdquo; Естественно я не обиделся, но Анна залилась краской:) <br /><br />По рынку мы бродили часа 2, и купили Косте свитерок из верблюжьей шерсти за 20 евро. Там целые ряды с изделиями из шерсти верблюдов и яков. <br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036596.jpg" /> <br /><br />А вообще на рынке продают всякое барахло: <br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036526.jpg" /> <br /><br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036719.jpg" /> <br /><br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036734.jpg" /> <br /><br />На рынке Анна спросила у меня, протягивая стаканчик с желтой жидкостью: &laquo;Алекс, ты когда-нибудь пробовал квас?&raquo;. Наивная французская женщина:) Да мы можно сказать на нем взросли&hellip; Только вот в отличии от монгол мы Хуйтен Квас не пили <br /><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150152067/xlarge/155036571.jpg" /> <br /><br />а пили нормальный, домашний:) <br />Не судите строго, но сразу в голове родился диалог у бочонка с квасом: <br />- Бабуль, каков квасок то у тебя? <br />- Хуйтен милок, хуйтен&hellip; <br />- А чё так? <br />- Какая жизнь, таков и квасок&hellip; <br /><br />Ваш Алекс <br /><br />P.S. Как-то нехорошо на грустной ноте закончилось&hellip; Нет, на самом деле жизнь у нас отличная, и Хуйтен в переводе с монгольского означает всего лишь холодный.</font><a name='cutid1-end'></a> http://alex-ryumin.livejournal.com/14854.html shoutaim Словения Сербия путешественник Трансевразия Алексей Рюмин Экспедиция Испания livejournal велопутешествие ВелоТрансЕвразия Канны ТрансЕвразия lovi.tv sony Новосибирск Италия граница Монако Владивосток азия саморазвитие Франция европа Руян видео Хорватия мечта Мадрид Китай skylink coca-cola путешествия s7 грусть Рюмин Ницца Азия Россия путешествие путешественники Казахстан авиабилеты Молдавия дороги.ру Монголия Путешествия прорыв велосипед Румыния Алтай encounter люди одиночество Сибирь Украина победа trek Европа public 8 http://alex-ryumin.livejournal.com/14712.html Tue, 08 Sep 2009 12:49:25 GMT Сага о DHL (не геройская…) http://alex-ryumin.livejournal.com/14712.html В нынешних поисках вариантов пересылки магической каретки в Улан-Батор мои друзья из Штаба снова обратились в известную компанию DHL. Почему снова? Потому как мы уже имели опыт пересылки ноутбука мне Европу в замен взятого с собой, но об этом чуть далее, так сказать в хронологии убывания:)<br />Далее приведу историю переписки с компанией:<br /><br />03.09.2009<br />«Уважаемые коллеги!<br /><br />В продолжение телефонного разговора разрешите еще раз пригласить вас к партнерству в интересном проекте - одиночном велопробеге "ВелоТрансЕвразия"<br />Наш путешественник Алексей Рюмин - москвич, корпорат - решил изменить свою жизнь и в апреле с.г. отправился из Мадрида во Владивосток на велосипеде. Совершенно один!<br />Мы представляем Штаб проекта - квартет единомышленников, решивших поддержать путешественника.<br />За время проекта мы в четвертый раз обращаемся в компанию DHL: то ноутбук доставить в Европу, то документы на визу и паспорт - обратно... И вот теперь - поломка: нам необходимо доставить небольшую деталь велосипеда в Улан-Батор...<br />Хотя настоящий проект не коммерческий, его уже поддержали авиакомпания "S7", компания Coca-Cola, компания Скай Линк, компания "Экспедиция".<br />Проектом заинтересовались СМИ: в Новосибирске, Астане, Барнауле встречу путешественника широко освещали крупные СМИ городов.<br />Проект широко освещается в Интернете. Отчеты о проекте смотрите здесь:<br /><a href="http://www.youtube.com/transeurasia">http://www.youtube.com/transeurasia</a><br /><a href="http://alex-ryumin.livejournal.com/">http://alex-ryumin.livejournal.com/</a><br /> В настоящее время готовится серия передач на канале "ВЕСТИ" о пробеге "ВелоТрансЕвразия".<br />Штаб готовит встречу Алексея Рюмина и пресс-конференцию в Москве в середине октября 2009 года.<br />А весной 2010 года стартует новый проект с Алексеем Рюминым "Пересечение Гренландии на снегоступах"<br />Надеемся увидеть вас в числе Партнеров проекта "ВелоТрансЕвразия" и других наших проектов. Готовы обсудить детали участия в любом удобном для вас формате.<br /><br />Спасибо за внимание,<br />Лев Кузьминых,<br />Координатор проекта<br />+7 495 995 8477»<br /><br />На что мы получили ответ:<br /><br />04.09.2009<br />«Уважаемый Лев, добрый день!<br /><br />Прежде всего, хочу поблагодарить Вас за доверие, оказанное компании DHL! Мы будем рады и в дальнейшем доставлять необходимые грузы и корреспонденцию не только на пути следования путешественников, но и в других странах мира.<br />К сожалению, в связи с экономической ситуацией бюджет на проведение и участие в различного рода мероприятиях, акциях, а так же спонсорская поддержка проектов, временно приостановлен...<br />Мы благодарим вас за приглашение к сотрудничеству, но, на данный момент вынуждены отказаться...<br />Надеюсь, в дальнейшем обстоятельства позволят нам осуществить совместные проекты!<br />Спасибо!<br /><br />С уважением,<br />Best regards,<br />Natalia Khomskaya<br />Assistant to Commercial Director Russia»<br /><br />И так сказать заключительный ответ:<br /><br />«Уважаемая Наталья, спасибо за проявленное внимание, точнее, за невнимание, тем не менее... Речи о конкретных рекламных бюджетах не велось: суть обращения сводилась к помощи в доставке важной детали для велосипеда в Монголию.<br /><br />Также, извините нас за то, что так часто пользовались вашими услугами в такое сложное для вас время. Вероятно, в связи именно с экономическими трудностями, на которые вы ссылаетесь, оборудование, отправленное в Европу нашему подшефному Рюмину, в течение двух недель гонялось за велосипедистом с опозданием в 5 дней... По правде сказать, я был совершенно иного мнения о нравах DHL. Обращаясь к вам, я считал, что компания находится в сильной позиции...<br /><br />В настоящее время мы занимаемся исследованием рынка транспортных услуг. Одна из компаний станет нашим партнером.<br /><br />Еще раз извините за беспокойство.<br />С ув. Лев Кузьминых,<br />Координатор проекта<br />+7 495 995 8477»<br /><br />Прочитав эту переписку штаба с DHL, а также вспомнив свой предыдущий опыт поиска партнеров для прошлого проекта (альпинистского), мне опять «за Державу стало обидно». Объясню почему.<br /><br />Во многих Российских компаниях, в т.ч. и в филиалах и представительствах крупных транснациональных компаний к подобным проектам относятся как к попрошайкам. И дело тут не в рекламных бюджетах. Почему? Да хотя бы потому, что тот же DHL, но в Болгарии, в той же самой «непростой экономической ситуации» стал партнером мотопутешественника Кости, о котором я уже писал, и предоставляет ему возможность пересылок запчастей и пр. из Болгарии по всему свету. Напрашивается вопрос «или она только у нас эта “непростая экономическая ситуация”»??? Эх, опять у нас все через жопу:)<br />Я помню, когда обращался в российские офисы Sony и Panasonic год назад, так мои обращения были просто удалены без прочтения (пришли отчеты с почтового сервера).<br />И заметьте, в изначальном письме действительно не шло речи о какой-то спонсорской помощи, мы не благотворительная организация в хорошем смысле этого слова, и не ищем спонсоров, мы ищем партнеров в любых проявлениях партнерских взаимоотношений, в т.ч. и по будущим проектам.<br />А вообще по моим наблюдениям это образ мышления среднего и низшего менеджмента – отсутствие креатива в мозгах, неспособность увидеть новые возможности. В среде топ-менеджмента креатив есть, но пока до него доберешься через дремучий лес 2-х предыдущих уровней, немало копий поломается.<br />Помню разговор ребят из штаба с сотрудником одного из теперь уже наших партнеров, который утверждал нам, что топ-менеджеру данной организации абсолютно не интересно участие во встрече со всей бизнес-элитой Новосибирска?!?!? Для меня, да и для всех нас это звучало, ну, по крайней мере, по-идиотски. Связавшись непосредственно с топ-менеджером, естественно мы услышали в ответ полную заинтересованность в участии.<br />Думаю, надо уже бить тревогу а-ля «к России незаметно подкралась эпидемия ослиного гриппа»…:))<br /><br />Немного повторюсь, но, на мой взгляд, это прямое подтверждение, что большинство людей в России перестали замечать необычное вокруг себя, перестали видеть новые возможности, БИЗНЕС возможности, новые пути решения старых задач. В таком формате работы не мудрено, что случается кризис, и он ударяет больнее по тем, у кого меньше воображения и внимания к окружающему миру. Зачастую мы пытаемся решать новые задачи в быстро меняющемся мире, используя старые методы, а когда ничего не получается, думаем «чтож за хрень то такая?». На самом деле, я и сам полгода назад был точно таким же, болел гриппом:) А теперь взглянул на это со стороны.<br /><br />Компания S7, SkyLink, «Экспедиция», Coca-Cola с удовольствием решили стать нашими партнерами, да и не только они, достаточно взглянуть на press wall с пресс-конференции «ВелоТрансЕвразии» в Новосибирске.<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150150543/xlarge/154989482.jpg" /><br /><br />За что, им опять же огромное спасибо, в т.ч. и за подтверждение собственным примером того, что не все так плохо у нас как кажется с первого взгляда. <br /><br />А и совсем забыл про историю с ноутбуком, о которой упомянул в начале поста. Около 3,5 мес. назад мне понадобилось получить другой ноутбук из Москвы. Естественно мы обратились в DHL, где нам сказали, что в любую точку мира доставим за 5 дней и вы его получите. Я тогда был в Италии и все подсчитав, дал добро чтобы слали в Карловац (городок в Хорватии) в заранее оговоренный отель. В Карловац я опоздал на 2 дня (т.е. прошло уже 7 дней, но когда появился в отеле, мне сказали что посылки нет. Позвонив в DHL, мне сказали что мой ноут на таможне, и его можно будет забрать через 2 дня… Ждать 2 дня и потратить еще 100 евро на отели я был не намерен, поэтому мы просто устроили скандал DHL, которые поняли, что действительно лоханулись, а все телефонные разговоры и договоренности записаны, и после долгих переговоров и угроз судами (штаб у меня боевой!!!:), согласились отправить в любой другой город по маршруту моего следования. Я предложил им сербский Новый Сад. Они согласились. Приехав туда на велосипеде, заметьте на велосипеде (а это, если память не изменяет дня 3 или 4), нам сказали, что они туда не успевают доставить?!?!? Я плакал от смеха…:) Обозначили следующий пункт Кишинев. И вот именно в Кишиневе мне только удалось получить ноутбук без каких-либо проблем и проволочек с растаможкой, и то благодаря профессионализму работников кишиневского офиса DHL.<br /><br />P.S. Кому показалось, что это обида на отказ от сотрудничества, скажу, следующее. Год назад, я обратился по телефону в компанию Гала-Гала (фирма-производитель сублимированных продуктов для туристов и альпинистов) с предложением о партнерстве, так там мужчина, ответственный за связи с общественностью, просто послал меня на х…, сказав, что мы (видимо альпинисты и туристы) их зае… и у них и без наших партнерств все хорошо продается. Вот так вот прямо матом в трубку:)) Мне было смешно до обоссачки, и абсолютно не обидно, потому как это было искренне! Без всякой там «Спасибо, что пользуетесь нашей продукцией, но идите нах». http://alex-ryumin.livejournal.com/14712.html shoutaim Словения Сербия путешественник Трансевразия Алексей Рюмин Экспедиция Испания livejournal велопутешествие ВелоТрансЕвразия Канны ТрансЕвразия lovi.tv sony Новосибирск Италия граница Монако Владивосток азия саморазвитие Франция европа Руян видео Хорватия мечта Мадрид Китай skylink coca-cola путешествия s7 грусть Рюмин Ницца Азия Россия путешествие путешественники Казахстан авиабилеты Молдавия дороги.ру Монголия Путешествия прорыв велосипед Румыния Алтай encounter люди одиночество Сибирь Украина победа trek Европа public 15 http://alex-ryumin.livejournal.com/14490.html Sun, 06 Sep 2009 08:06:37 GMT Разыскивается бортпроводник или бортпроводница:) http://alex-ryumin.livejournal.com/14490.html Друзья, обращаюсь к Вам за помощью!<br /><br />Как вы знаете мой велосипед сломался, а нужной детали в Монголии найти не удалось. Единственное решение проблемы которое мы со штабом видим в настоящий момент это покупка ее в Москве и пересылка в Улан-Батор. Но есть одно НО. Пересылка транспортными компаниями (допустим DHL) стоит порядка 100 Евро и длится 5 дней, что очень долго.<br /><br />Но как известно, вселенная это совокупность безграничного множества вариантов решения разных задач, нам пришла в голову идея переслать эту деталь с бортпроводником авиарейсов, летающих из Москвы в Улан-Батор.<br /><br />А просьба вот в чем. Есть ли у кого из Вас знакомые или друзья в авиакомпаниях, через которых можно было бы выйти на бортпроводника и передать ему эту деталь. В Москве это сделают ребята из штаба, а в Улан-Баторе я бы ее забрал в порту. Так будет гораздо быстрее, чем транспортными компаниями. Из российских компаний летает только Аэрофлот. Но может у Вас есть знакомые в других авиакомпаниях, которые могут знать кого-то в Аэрофлоте.<br /><br />Вот собственно и сама деталь:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150147436/xlarge/154872074.jpg" /><br /><br />Заранее спасибо!<br /><br />Ваш Алекс http://alex-ryumin.livejournal.com/14490.html shoutaim Словения Сербия путешественник Трансевразия Алексей Рюмин Экспедиция Испания livejournal велопутешествие ВелоТрансЕвразия Канны ТрансЕвразия lovi.tv sony Новосибирск Италия граница Монако Владивосток азия саморазвитие Франция европа Руян видео Хорватия мечта Мадрид Китай skylink coca-cola путешествия s7 грусть Рюмин Ницца Азия Россия путешествие путешественники Казахстан авиабилеты Молдавия дороги.ру Монголия Путешествия прорыв велосипед Румыния Алтай encounter люди одиночество Сибирь Украина победа trek Европа public 16 http://alex-ryumin.livejournal.com/14166.html Sun, 06 Sep 2009 03:51:00 GMT Долгая дорога в Улан-Батор или Монгольские заметки http://alex-ryumin.livejournal.com/14166.html Как я уже Вам писал в предыдущем посте, в городе Ховд я понял, что жить подшипнику в моей каретке осталось от силы максимум километров 100. Поэтому я принял решение добираться со своим конем транспортом до Улан-Батора. Принять решение в Монголии просто, а вот найти этот транспорт и добраться не очень:)))<br /><br />Дело в том, что в Монголии по-русски понимает только пожилая часть населения, в основном кому за 60 и больше. Есть конечно, кто понимает, и гораздо моложе, но очень редко. А по-английски только молодежь и то редкая. Стандартный прием «немого кино» не проходит, ну не понимают они язык жестов. Я когда искал в Улан-Баторе веломагазин, я даже в блокноте рисовал им велосипед и магазин, и педали крутил, и плясал и танцевал… ну не понимают они, то в супермаркет отправят, то стоят и смотрят, как на театр одного актера… иногда смеются:) <br /><br />Нашел место, откуда ходят машины из Ховда в Улан-Батор, я тоже совершенно случайно, хотя как мы знаем ничего случайного не бывает. В отеле, где я остановился, поселился бизнесмен из Казахстана. И вот когда я плясал вокруг дамы на рецепшн ритуальный танец междугородного автобуса, он вышел на этаж, втирая что-то по мобильному своему подчиненному. Я рванул сразу к нему и собственно он мне и сказал, что можно добраться двумя путями. Первый, быстрый, но дорогой – самолетом в этот же день за 220 долларов. Второй, дешевый, но долгий – на буханке (русский микроавтобусик, похожий на буханку хлеба с круглыми фарами) за 2 суток и за 50 долларов. Угадайте, какой я выбрал.<br /><br />В буханку нас влезло 24 человека! Я, еще 2 иностранца и 21 монгол, включая водителя. Позже иностранец сказал сакраментальное «Алекс, теперь я знаю, что пространство и время могут растягиваться».<br /><br />Вообще процесс погрузки в автобус дальнего следования в Азии это целый ритуал… Тут надо не забыть выпить водки, поторговаться со всеми о цене, особенно если этот всеми везет с собой велосипед, собрать со всего города передачки во все города следования по маршруту. Позже поняв, что насобирали столько много, что просто не влазит даже в две буханки, надо ехать к другу за багажником на крышу. Потом начинается распихивание мешков с картошкой, арбузами (кстати, в Монголии они маленькие, с большой кулак величиной) и прочей фигней, а также ковров, коробок с разным хламом под сидения и в проход. Затем что не влезло, закидывается на крышу и привязывается, туда же прописали мой велик. А потом начинается самое интересное – посадка пассажиров. Сначала я думал, что с нами едет 6 человек, самых активно толкавшихся у буханки, но потом по-тихому в нее начали залазить один за одним монголы. Кто знает, что такое буханка и 24 человека – попробуйте совместить это. Но это было бы ничего, если проехать надо было бы 2 квартала. А ехать надо было 2 дня (48 часов) и спать в машине и все это по дорогам, которые я Вам показывал в предыдущем посте!!! Иногда мне казалось, что мы отрывались от земли, так нас швыряло… <br /><br />Благо, после первой ночи 2 иностранца и 3 монголки вышли в городе Алтай. Стало полегче.<br />Кстати иностранцы, пожилой бельгиец профессор экономики и его жена итальянка, очень нервничали по поводу всего: что это опасно, когда столько народу в машине, что они не инвестируют денег в дороги, так как это экономически неразумно, что никто не понимает его ни по-английски, ни по-русски (он кстати хорошо говорил по-русски), что никто не знает сколько времени осталось ехать до Алтая… По поводу последнего я промолчал, подумав про себя, что они еще сами не знают, приедем ли мы вообще или нет, а по поводу всего остального я ему сказал: «Это же Азия, принимай ее проще! Если карма хорошая, то все будет хорошо, а если плохая, то тебе уже ничего не поможет». Он видимо к этому был не очень готов, отправляясь сюда. <br /><br />Честно я тоже. До меня осознание этого, а вместе с ним внутреннее спокойствие и философское отношение ко всему происходящему пришло только на 4-5 день.<br />В Улан-Баторе я так веломагазин и не нашел, все пути вели к рынку Нарантул, на котором продавались б/у запчасти к великам, причем каретки были там с посадкой шатунов на квадрат, ужаснее наверное нет ничего. Продавцы даже не удосужились протереть от грязи, продаваемые ими кассеты, каретки, втулки и пр.<br /><br />Но вот, что касается остального, то тут гуляй рванина от рубля и выше!!! На рынке можно найти все что душе угодно, кроме, наверное, мебели, машин и дорогой аппаратуры! Эх, жаль у меня нет ни денег лишних, ни места в велорюкзаке, а то я бы себе пару сапог мужских прихватил бы отсюда. На рынке был целый ряд сапог, начиная от национальных, в которых ходят лихие монгольские степные хлопцы, и до вполне стильных и даже откровенно футуристических. <br />В общем, придется ребятам из штаба покупать каретку в Москве и пересылать ее мне в Улан-Батор, каким образом пока не ясно. Решаем, что быстрее и не очень дорого. Но в любом случае в Улан-Баторе я зависаю на несколько дней.<br /><br />И совершенно не случайно:), я узнал, что в это-же время в Улан-Батор приехал мой новый знакомый путешественник, байкер Костя из Болгарии, про которого я Вам уже писал! Он заехал в Монголию со стороны Улан-Удэ. Сегодня мы с ним пошатались по городу<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150147354/xlarge/154867978.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150147354/xlarge/154867976.jpg" /><br /><br />посидели в кафе<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150147354/xlarge/154867979.jpg" /><br /><br />А сегодня мы поселились в одной комнате в гестхаусе, так получается гораздо дешевле.<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150147354/xlarge/154867974.jpg" /><br />Оба за работой<br /><br />А, учитывая то, что в Улан-Баторе он зависает на неделю, т.к. ему надо доделать работу над его сайтом (www.fireinside.bg), а я зависаю на неделю, т.к. буду ждать каретку из Москвы, то для нас обоих это и выгодно, и просто очень здорово, провести время в незнакомом городе в отличной кампании.<br /><br />А вот теперь собственно и монгольские заметки.<br /><br />Начнем с самого главного, с цветков жизни. С детей.<br />Отношение у меня к ним сложилось неоднозначное. В приграничном селе Цаган-Нур, на меня накинулась толпа детишек лет 7-10 с криками Хелло и Подарок. Причем не просто накинулась, они как заправские бандиты с большой дороги, просто отважно перекрыли мне путь своими телами. Я пытался с ними подружиться, но моя дружба их интересовала меньше, чем содержимое моего рюкзака, они хватали все, что у меня было привязано к велосипеду (покрышки, коврик, бутылки с водой, штатив и пр.) и тащили на себя крича «подарок, подарок». Я понял, что надо делать ноги, а точнее колеса, но они намертво вцепились в мой рюкзак и бежали так за мной еще метров 100. Позже вечером, я выяснил, что детишки облегчили меня на одну 2-х литровую бутылку воды и старую цепь, которую я вез в наружном кармане рюкзака, на всякий крайний случай.<br />А вот в крупных городах, дети наоборот, мне мило улыбались, говорили Хелло и махали руками. Я чувствовал себя прямо дедушкой Лениным каким-то:)<br />Взрослые монголы, они как дети, либо наивные, либо хитрые, но всегда добродушные и отзывчивые. В крупных городах, конечно, они похитрее и очень любят окучивать иностранцев. Для них тут все в разы дороже, исключая, наверное, только супермаркеты, где все по чеку. Азия… Надо ее воспринимать проще:)<br />Пьяные монголы в большинстве своем добродушные, но приставучие. Так что лучше не связываться, а то весь мозг вынесут. Меня один такой, пока грузились в буханку в Ховде достал до чертиков, все пытался со своей сестрой познакомить, то с ним водки выпить, то рассказывал что он тоже русский, т.к. родился в Иркутске.<br />В Монголии очень любят мясо и молочные продукты. Например сыр, сушеный до степени кирпича.<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150147354/xlarge/154867977.jpg" /><br /><br />Но очень вкусный, хотя он на любителя, так как очень кислый. Грызу его с удовольствием<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150147354/xlarge/154867975.jpg" /><br /><br />А еще русские песни. У меня сейчас дискотека в здании напротив, так там сейчас поет Киркоров с Машей Распутиной:) А народ колбасится – нравиться:)<br /><br />Да, и совсем забыл, монгольские девушки. Вы знаете, красота их своеобразна, они, так же как и монгольский сыр – на любителя. Я вот лучше как-то сырок погрызу…<br /><br />З.Ы. Беру свои слова обратно, по поводу связи и Интернета в Монголии.<br />Интернет в Монголии есть в каждом крупном городе, причем в большинстве Интернет-кафе есть наушники с микрофоном и вебкамера. О как. Такого, честно, я еще нигде не видел, кроме западной Европы.<br />А связь есть везде, где есть более менее крупный поселок. Конечно, отъехав от него, да и собственно от любого крупного города на 5-10 километров, то она заканчивается. Но все же жить можно! http://alex-ryumin.livejournal.com/14166.html shoutaim Словения Сербия путешественник Трансевразия Алексей Рюмин Экспедиция Испания livejournal велопутешествие ВелоТрансЕвразия Канны ТрансЕвразия lovi.tv sony Новосибирск Италия граница Монако Владивосток азия саморазвитие Франция европа Руян видео Хорватия мечта Мадрид Китай skylink coca-cola путешествия s7 грусть Рюмин Ницца Азия Россия путешествие путешественники Казахстан авиабилеты Молдавия дороги.ру Монголия Путешествия прорыв велосипед Румыния Алтай encounter люди одиночество Сибирь Украина победа trek Европа public 7 http://alex-ryumin.livejournal.com/14041.html Fri, 04 Sep 2009 04:24:04 GMT Итак, Монголия http://alex-ryumin.livejournal.com/14041.html В 12 часов по полудню я приехал в Ташанту (ударение на последний слог), небольшая деревушка на границе с Монголией в Республике Алтай.<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150146025/xlarge/154824532.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150146025/xlarge/154824534.jpg" /><br /><br />У ворот пограничного пункта уже выстроилась очередь из машин. Я окинул ее взглядом и выделил несколько потенциально интересных мне машин, разрисованных и расклеенных разными наклейками. Машин участвующих в автопробеге MongolRally. Большинство участников которой из Великобритании и Ирландии. Почему они так были интересны мне, спросите Вы. Ну, на это есть 2 причины. Во-первых, я очень часто их видел на дорогах пока ехал по Горному Алтаю, как выяснилось позже, только из Великобритании выехало более 50 машин, и мне очень хотелось поподробнее узнать об этом мероприятии и познакомиться поближе с ними. А во-вторых, поскольку погранпукт Ташанта-ЦагаанНуур является автомобильным, пересекать его можно только на авто, и мне необходимо было к кому-то залезть с велосипедом в машину:)<br />К моему удивлению, среди них оказалось не так уж и много разговорчивых ребят. Кроме Дэвида из Великобритании. Отличный мужик. Мало того, что просто путешествует по миру таким вот образом, так он еще участвует в программе развития системы обучения глухих и слепых детей в слаборазвитых странах. И для этого он ехал в Улан-Батор, чтобы наладить там контакт с местными активистами и потом из Англии помогать им и координировать их деятельность. Откровенный респект и уважуха!!!<br />Более того, он с удовольствием согласился меня провезти через границу. Велик был погружен на крышу их Пежошки (которая Partner по-моему), а мой багаж и собственно я в заднее пространство автомобиля (багажник и сложенные задние сидения). К слову сказать, все авто в данном пробеге автомобили класса Golf (маленькие и смешные), а едут из Лондона в Улан-Батор, через Киргизию, Туркмению и прочие страны с «хорошими» дорогами. О как!!! На джипе навороченном каждое дурило картонное сможет, а на такой вот вошке попробуй доскочи:)<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150146025/xlarge/154824536.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150146025/xlarge/154824524.jpg" /><br /><br />В 16:30 мы пересекли границу Монголии и оказались во владениях потомков Тимучина.<br />Дэвид и его спутник Пит очень хотели есть, в общем то и я тоже, так что мы решили заскочить в кафешку возле пропускного пункта с Монгольской стороны. И сразу попали в местный колорит:)<br />Это кафешка, а точнее дом, где готовят для туристов манты и чай:) В принципе там же и спят… те кто готовит:)<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150146025/xlarge/154824511.jpg" /><br /><br />А это Дэвид с Питом и Я<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150146025/xlarge/154824509.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150146025/xlarge/154824538.jpg" /><br /><br />С ними я доехал до ближайшего крупного города Улгий (80 км от границы), в котором даже есть аэропорт внутренних авиалиний. Здесь я заправился продуктами, водой и вышел в Интернет, после долгого перерыва. А на следующий день выдвинулся в обратный путь в сторону границы, чтобы попасть на свою северную дорогу. В Улан-Батор из западной части Монголии можно попасть двумя путями: по северу, через Улангом и Мурэн, а так же по югу, через Улгий, Ховд, Алтай и Лун. <br />Ближе к вечеру я добрался до городка Цаган-Нур, где меня в гости пригласила семья монгол, они меня кормили, поили, спать уложили, а на утро как выяснилось за все это они захотели 10 долларов:)))) А еще весь вечер они у меня клянчили подарки. Смотрят на куртку и спрашивают «Еще есть?», «Подарка, подарка»… И потом показывают разные подарки предыдущих гостей: куртки гортексовые, шляпы ковбойские, открытки с Большим каньоном, кроссовки 48 размера…:) Они эти кроссовки с такой обидой мне показывали, мол «подарили, а носить не кому, большие», а потом добавляли «давай меняться»…:) с моим 42. Забавные они… толи и вправду такие, толи под дурачков прикидываются…:) Но в целом люди хорошие… я потом на дороге еще раз главу семейства их встретил, он на работу в Улгий ехал на мотоцикле, так он меня яблоком и конфетами угостил.<br />Чай пьют они как лошади. «Цай пей – карашооо», «корсак (живот) полный – карашоо».<br />А вот про северную дорогу они сказали мне, что это был не самый лучший выбор, т.к. до Улангома дорога плохая (позже поехав по югу, я увидел хорошие дороги, и подумал, что же тогда «плохая дорога» по-монгольски???), к тому же пересеченная множеством рек и речушек, которые надо переходить вброд, т.к. мостов тоже нет…<br />На самом деле, большинство туристов и все местные для попадания в Улан-Батор используют Южную дорогу.<br />В общем, после небольших раздумий, а также учитывая ограниченность по срокам Китайской визы, я решил вернуться в Ульгий и поехать по Южной дороге.<br />Кстати по пути из Ульгия до Цаган-Нура я встретил двух девушек из MongolRally. Натали из Великобритании и Эсперанту (по-нашенски Надежду) из Мадрида. Я подумал «Как им не страшно, ездить вдвоем… двум девчонкам…» Отважные дамочки. Только вот их тачка уже больше походила на джип.<br />Натали<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150146025/xlarge/154824523.jpg" /><br />Надежда<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150146025/xlarge/154824521.jpg" /><br />Ну а потом из Ульгий я поехал в сторону Ховда, первого крупного города на моем пути. И тут собственно началось. Достаточно сказать, что на путь длинной 210 км я затратил 3 дня… при чем раньше, даже по плохим дорогам в Казахстане у меня редко уходило на это больше 1,5-2 дней… Средняя скорость упала до 7 км/час и вот почему:<br />Сначала все было вроде бы даже ничего, в горизонт уходили вполне накатанные колеи, правда, иногда, расходящиеся в разные стороны:)<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150146025/xlarge/154824500.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150146025/xlarge/154824501.jpg" /><br /><br />Порой меня раздражал, этот широкий, многополосный монгольский хайвэй:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150146025/xlarge/154824529.jpg" /><br /><br />А вот потом пошло не до смеха.<br />Угадайте где дорога:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150146025/xlarge/154824503.jpg" /><br /><br />Ну и для всей красоты монгольской жизни, следом начались камушки на дороге:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150146025/xlarge/154824504.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150146025/xlarge/154824506.jpg" /><br /><br />Все это могло бы порядком поднадоесть через пару дней, если бы не красоты, открывающиеся вокруг. Но красота не обычная, а красота ощущения пространства и твоего одиночества в нем, когда за 80 км пройденного пути, среди бесчисленного количества сопок и гор, мимо тебя проезжает всего 5 машин и больше за весь день ты не видишь ни души.<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150146025/xlarge/154824512.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150146025/xlarge/154824513.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150146025/xlarge/154824515.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150146025/xlarge/154824516.jpg" /><br /><br />Что еще было интересным для меня, так это то, что в этой стране я абсолютно не боялся ставить палатку у дороги. Если в других странах, особенно в России у меня всегда было чувство тревоги, когда я ночевал в лесах или лесопосадках у дороги (что самое обидное именно в России пару раз эти опасения не были напрасными).<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150146025/xlarge/154824525.jpg" /><br /><br />Мимо проезжали редкие машины, люди в них с изумлением смотрели на меня и мой «лагерь»… кто-то даже махал рукой:) <br />Один раз, мимо моей палатки в 50 метрах проехал монгол на лошади с собакой, распевая какие-то национальные песни. Так он даже не удосужил меня и взглядом.<br />Толи атмосфера здесь такая, полная спокойствия и безмятежности. Время как будто в этой стране остановилось. В отдалении от крупных городов люди ведут все тот же образ жизни, что тысячу лет назад. За редким исключением наличия семей имеющих свой китайский мотоцикл и сотовые телефоны.<br />И даже в крупных городах, «спальные районы» обязательно усеяны юртами. Во дворе может стоять одноэтажный капитальный дом, с электричеством, но и даже в этом случае все равно рядом с ним будет стоять юрта. Видимо у монголов это на генетическом уровне… Кочевник, думается мне, это образ мышления, и от него никуда не деться.<br />Правда, был день, когда поставив палатку, я начал испытывать привычное беспокойство, но не мог понять его причину. А ночью разразился ураган, палатку трепало на ветру, а поскольку она у меня суперлегкая с тонкими дугами и из тонкой ткани (Vaude Hogan Ultralight I), то я реально перетухал, что сейчас внешний тент сорвет или поломает дуги. Я даже уже решил для себя, что если это произойдет, я выйду, сложу дуги, сниму тент или его остатки и лягу спать в сложенной палатке, предварительно прижав ее края камнями. В ту ночь поспал я всего пару часов… Но ничего, палатка выдержала, только несмотря на «герметичность» внутреннего тента, через москитную сетку внутрь палатки надуло кучи песка. А учитывая, что я сплю головой к входу и собственно к этой противомоскитной сетке, такие же кучи песка были у меня в волосах и бороде:)<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150146025/xlarge/154824527.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150146025/xlarge/154824528.jpg" /><br /><br />Уже ближе к городу Ховд (за 40 км) дорога приняла откровенно пустынный вид – песок, песок и еще раз песок. Колеса постоянно вязли в нем, гуляли и в тот день я падал и матерился, падал и матерился и снова падал…<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150146025/xlarge/154824507.jpg" /><br /><br />Но просторы вокруг меня завораживали. Жаль мой фотоаппарат не может передать всю глубину этих ландшафтов.<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150146025/xlarge/154824517.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150146025/xlarge/154824518.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150146025/xlarge/154824520.jpg" /><br /><br />И я был по-своему счастлив<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150146025/xlarge/154824530.jpg" /><br /><br />А потом я приехал в город Ховд:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150146025/xlarge/154824535.jpg" /><br /><br />Где после долгих ковыряний с велосипедом, я установил причину постоянно нарастающего хруста, раздававшегося последние два дня из области каретки (штука на которую крепятся шатуны с педалями) – у меня развалился подшипник. Точнее он не развалился, но уже был на пределе того. Дальше с таким ехать было просто опасно, он мог заклинить через 2, а может и через 100 км… где-нибудь посредине пустыни. И тогда пришлось бы мне ждать попутного грузовика, который смог бы меня подобрать вместе с велосипедом. А, учитывая, что за последние 3 дня я видел всего 2 таких, и не факт что они ехали до Улан-Батора, перспектива могла бы быть безрадостной.<br />Таким образом, было принято решение дуть в Улан-Батор, к сожалению, единственный город в Монголии, где можно найти нужную мне каретку (Shimano Tiagra). Либо, еще как вариант, ребята из штаба в Москве, ищут ее в свою очередь в Москве, и постараются прислать ее в Улан-Батор. Так что через пару часов гружусь в буханку, следующую из Ховда до Улан-Батора, и буду трястись в ней три дня с моим конем на крыше.<br />Что самое грустное в этой истории то, что отказала тот узел, от которого я меньше всего ожидал проблем.<br /><br /><br />P.S. Сегодня (31.08) просматривал свои старые фотографии и наткнулся на фото сделанное в аэропорту в день вылета в Европу, так сказать в день старта экспедиции, и сравнил ее с фото сделанным на днях в Монголии. Вот что вышло:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150146025/xlarge/154824499.jpg" /> http://alex-ryumin.livejournal.com/14041.html shoutaim Словения Сербия путешественник Трансевразия Алексей Рюмин Экспедиция Испания livejournal велопутешествие ВелоТрансЕвразия Канны ТрансЕвразия lovi.tv sony Новосибирск Италия граница Монако Владивосток азия саморазвитие Франция европа Руян видео Хорватия мечта Мадрид Китай skylink coca-cola путешествия s7 грусть Рюмин Ницца Азия Россия путешествие путешественники Казахстан авиабилеты Молдавия дороги.ру Монголия Путешествия прорыв велосипед Румыния Алтай encounter люди одиночество Сибирь Украина победа trek Европа public 20 http://alex-ryumin.livejournal.com/13795.html Tue, 25 Aug 2009 10:34:05 GMT Через Горный Алтай http://alex-ryumin.livejournal.com/13795.html Как всегда в предыдущих постах я забыл выложить фото. А именно фотографии от границы Казахстан-Россия до Новосибирска.<br />Итак,<br /><br />поля подсолнечника:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150138576/xlarge/154587545.jpg" /><br /><br />Село Забавное:)<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150138576/xlarge/154587354.jpg" /><br /><br />Я всегда знал, что Москва это большой колхоз, и в алтайском крае нашел этому подтверждение:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150138576/xlarge/154587484.jpg" /><br /><br />Ну и чем-то меня зацепило название «Серп-молот»:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150138602/xlarge/154587915.jpg" /><br /><br />Боевой конь мой начал обрастать всякими сумками, бутылками и прочим барахлом и стал походить на настоящий экспедиционный велосипед:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150138576/xlarge/154587133.jpg" /><br /><br />А сам я стал походить на Бармалея Бармалеича, оброс совсем<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150138602/xlarge/154587885.jpg" /><br /><br />Но, не смотря на это, остался смело смотрящим вперед романтиком:)<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150138576/xlarge/154587122.jpg" /><br /><br />Фото сделано на берегу реки Катунь, недалеко от Маймы. В тот день еще было солнечно и можно было позагорать. А потом пошел дождь. И шел он 5 дней (по крайней мере, сегодня, когда я пишу этот пост, идет пятый день). То мелкий моросящий, то ливнем, то переставал на часок другой).<br />Не смотря холмистый на рельеф местности еду резво, по 110-120 км в день. Но устаю.<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150138602/xlarge/154587877.jpg" /><br /><br />А вокруг красоты, по своей величественности сравнимые, наверное, только с полупустынями Юга Казахстана.<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150138576/xlarge/154587409.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150138576/xlarge/154587162.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150138576/xlarge/154587593.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150138576/xlarge/154587609.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150138576/xlarge/154587628.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150138576/xlarge/154587578.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150138576/xlarge/154587201.jpg" /><br /><br />На пути от Бийска до Ташанты перед путешественником встают 3 перевала. Но если для автомобилиста они пустяковые, то велосипедистам придется немного вспотеть. Первые два из них называются «перевал Семинский» и «перевал Чике-Таман», а третий не помню:)<br />Первый представляет собой затяжной тягун длинной в 9 км и, на мой взгляд, ничего интересного не представляет:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150138602/xlarge/154587910.jpg" /><br /><br />А вот второй гораздо интереснее, хотя он и короткий, всего 4 км. Интереснее он красотой видов с него открывающихся, а также самим подъемом, а именно крутизной и серпантинами. Иной раз приходилось спешиваться и втаскивать моего коня волоком:)<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150138602/xlarge/154587882.jpg" /><br /><br />В самом низу фото виднеется начало серпантина на перевал:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150138602/xlarge/154587903.jpg" /><br /><br />И его продолжение, где-то в середине:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150138602/xlarge/154587893.jpg" /><br /><br />На самом перевале стоит табличка с историей названия перевала:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150138602/xlarge/154587900.jpg" /><br /><br />На самом перевале я совершенно случайно познакомился с мужчиной по имени Евгений и его супругой:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150138576/xlarge/154587324.jpg" /><br /><br />И как оказалось, он несколько дней назад прочитал статью обо мне в газете и узнал меня на перевале.<br />А когда я уже спускался с перевала они еще раз догнали меня на своей машине, пожелали хорошей дороги и спросили меня «поеду ли я в Гренландию»!!! Так вот, что самое радостное для меня было в этой истории, этот то, что человек, прочитав статью, настолько проникся, что не только запомнил как меня зовут, но и то, что я собираюсь в следующем году в Гренландию. Значит, что-то зажглось у человека внутри, и может быть даже загорелись с новой силой какие-то идеи и мечты. Кто знает… Очень надеюсь что так, ведь в тот момент от осознания того, что кому-то настолько понравилось то, что я делаю, мне стало настолько радостно на душе, что побежали мурашки по коже:)<br /><br />А потом, уже под вечер, я увидел кэмпинг слева от дороги, куда и свернул. И каково же было мое удивление и радость, когда в этом кэмпинге я снова увидел этих замечательных людей. Такие вот удивительные вещи происходят:) Мы жарили шашлык, пили коньяк, болтали и смеялись.<br /><br />Вообще, эта дорога по горному Алтаю настолько была насыщена разными встречами. Я встретил ребят велотуристов из Питера:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150138609/xlarge/154587987.jpg" /><br /><br />Рядом с Акташом встретил горных туристов из Минска Костю, Владислава и Светлану<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150138576/xlarge/154587443.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150138576/xlarge/154587154.jpg" /><br /><br />Но самое прикольное то, что я встретил ребят из Encounter, возвращавшихся с покорения двух горных вершин на Алтае. Они меня встречали, когда я еще только въезжал в Новосибирск, и на следующий день уехали в горы, и в тот день мы еще думали «как будет здорово, если мы встретимся еще раз где-нибудь по дороге в Горном Алтае». Собственно так и вышло:)<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150138602/xlarge/154587890.jpg" /><br /><br />После поселка Кош-Агач (что в переводе с алтайского означает «прощай дерево») ландшафты действительно пошли лысые и больше похожие на пустыню и лишь вдалеке виднелись белые шапки горных вершин Алтая:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150138576/xlarge/154587170.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150138576/xlarge/154587177.jpg" /><br /><br />И 24 августа я приехал в Ташанту, где находится пограничный переход с Монголией. Наконец то я приехал туда, куда так стремился 4,5 месяца. Всего в 20 км от меня была она – Монголия.<br /><br />В тот же день я пересек границу, и приключения-впечатления начались, а точнее посыпались на меня с какой-то невероятной силой…<br />Но это уже другая история, которую, я обязательно расскажу Вам.<br /><br />Ваш Алекс http://alex-ryumin.livejournal.com/13795.html shoutaim Мадрид Китай путешественник Алексей Рюмин Экспедиция skylink coca-cola s7 велопутешествие ВелоТрансЕвразия lovi.tv sony Новосибирск Азия Владивосток Монголия Руян велосипед encounter Алтай Сибирь trek Европа public 12 http://alex-ryumin.livejournal.com/13407.html Tue, 25 Aug 2009 09:26:03 GMT Размышления на тему... http://alex-ryumin.livejournal.com/13407.html 4,5 месяца в пути. Огромное количество времени, чтобы подумать обо всем на свете, о семье, о работе, о людях меня окружающих, о новых проектах и о Вселенной. Да, вот именно о ней я бы хотел с Вами поговорить. Т.к. поговорить у меня последнее время прямо не с кем. Точнее нет, был один парень по имени Коста из Болгарии, но об этом чуть позже.<br />Так вот, Вселенная. Что она из себя по-вашему представляет? У каждого будет наверное свой ответ. <br />А вот за мои 4,5 месячные наблюдения за разными людьми, успешными и не очень, счастливыми и несчастными, за их поведением, я увидел следующую картину.<br />Представьте себе неимоверное и даже не немыслимое переплетение материи, всевозможных энергий, полей, и самое главное человеческих мыслей, намерений, действий, целей и мечтаний. Да, да, да именно наших мыслей, действий и материи. Все это крепко связано в один «гигантский клубок». И каждая составляющая своими «колебаниями» может влиять на другие составляющие. Слабо выраженные цели и действия из разряда «круто было бы» возбуждают несильные колебания в этом переплетении, и по сути ничего не происходит. Они как бы растворяются в огромной массе, не вызываю никакого резонанса. Сильные же цели и волевые действия, зачастую являющиеся тем самым «первым шагом», вызывают резонанс, волнами прокатывающийся по этим переплетениям, возбуждая в мозгах других людей «колебания», создавая «колебания в пространстве» вокруг себя и таким образом получая ответные шаги со стороны окружающего мира, или того самого переплетения, что я и называю Вселенной. Иногда они не очень хорошие, а иногда превышают все наши ожидания, и зачастую они приходят от туда, откуда мы их совсем не ждем. Кто-то называет это чудесами. Они правы. Кто-то говорит, что Вселенная как «джин», исполняющий любые желания, надо только уметь «просить». Эти тоже правы. Кто-то говорит про визуализацию и ее магическое действие. И эти тоже чертовски правы. Я думаю все это из одной оперы или балета, балета Вселенной.<br />Так вот, в самом начале, я хотел рассказать Вам о неком Косте из Болгарии.<br />В Республике Алтай, я повстречал мотопутешественника одиночку, из Болгарии, которого звали Коста, или просто Костя. Он художник. Путешествуя, он ведет свой журнал и видеоканал, как и я. Мы с ним поговорили о разных вещах, и когда я рассказал ему о своем видении Вселенной, он не то, что бы полностью был со мной согласен, он сказал, что в своем путешествии он открыл для себя абсолютно то же самое.<br /><br />На фото он слева.<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150138561/xlarge/154586535.jpg" /><br /><br />Что из этого следует, пока не знаю. Знаю, найдется какой-нибудь Фома, уверенно воскликнувший «у дураков мысли сходятся». Ну и шут с ним. Пока я знаю только одно, что ничего случайного не бывает, ничего. Все с нами происходящее, есть плод наших помыслов, желаний и действий. Надо только не бояться открываться этим якобы «случайностям», и не бояться тех перемен, которые они принесут за собой.<br /><br />Ваш Алекс http://alex-ryumin.livejournal.com/13407.html shoutaim Мадрид Китай путешественник Алексей Рюмин Экспедиция skylink coca-cola s7 велопутешествие ВелоТрансЕвразия lovi.tv sony Новосибирск Азия Владивосток Монголия Руян велосипед encounter Алтай Сибирь trek Европа public 1 http://alex-ryumin.livejournal.com/13208.html Thu, 13 Aug 2009 13:18:00 GMT Последние новости из Новосибирска http://alex-ryumin.livejournal.com/13208.html Дорога из Астаны до Новосибирска была не очень веселой. Всю дорогу лил дождь, с редкими перерывами и просветами на небе. Одежду можно было выжимать, чем собственно я и занимался. Сушилась она прямо на мне на ветру в моменты пауз дождя.<br />Въехать в Россию я мог двумя путями, один через Карасук, а другой через Кулунду, причем один из них был длинней в целом, но привел бы меня на границу с РФ в тот же день, а другой наоборот, другой был короче в целом, но привел бы меня на границу с РФ на следующий день. Догадайтесь какой я выбрал?:) Да, мне так хотелось поскорее заехать в Россию, что я вкрутил по полной весь день и к 19 часам был на границе. Это была первая граница, которую я проходил целый час. Сначала меня «пытали» на казахстанской части, заставили мои рюкзаки потрошить. А потом на российской части у меня в первый раз решили заглянуть в рюкзаки, но увидев пустые консервные банки (для которых я не нашел мусорки по дороге, а в поле выкинуть совести не хватило), печенье и грязное белье на самом верху, желание лезть в него дальше у них отпало:)<br />Таким образом на прохождение границы у меня ушел 1 час. Не много, но и не мало, учитывая мои предыдущие погранпереходы, которые я проходил максимум за 30 минут.<br />Дождь не утихал. В 9 вечера я нашел место для ночлега, в небольшой лесополосе возле железной дороги. Но когда я зашел в этот лесок, я понял что попал, попал в комариное логово. Помните как меня ела мошка возле Астрахани? Было еще видео, где они тучей облепили мою палатку. Так вот тут было тоже самое, но только одни комары, без мошки. Комары на Алтае напоминают носорогов по размеру:) Без трепа, в тот день я лег спать весь красный… пожрали гады:)<br />Вы знаете, когда я первый раз въезжал в Россию после Европы и Украины, у меня мурашки по коже бежали, хотелось петь песни и орать «я дома!!!». Эмоции переполняли. А вот сейчас, несмотря на то, что в России я не был больше месяца, я ничего подобного не испытал. Просто въехал и ничего. <br />Отношение народа сразу переменилось, как будто попал на другую планету. О чем и решил рассказать в своем коротком сюжете.<br /><lj-embed id="10" /><br /><br />А дальше я въехал в Новосибирск. И тут началось такое!!! Но прежде необходимо устроить Вам небольшой экскурс в историю. Дело в том, что в июне этого года к моему штабу в лице Жени, присоединились два потрясающих и креативных человека – Яна и Лев. Именно благодаря ним удалось организовать целую программу моей встречи в Новосибирске, как городе, делящим мой маршрут на половину. А именно кортеж из велосипедистов и авто Международной сети Encounter, байкеров из новосибирского байк-клуба «NoRules», а также из оранжевых джипов нового партнера проекта Компании «Экспедиция». Была организована встреча в ресторане «Экспедиция. Северная кухня» с бизнес-элитой Новосибирска.<br /><lj-embed id="11" /><br /><br />А 11 числа была организована пресс-конференция так же в ресторане «Экспедиция. Северная кухня» с печатными изданиями города.<br />Также меня пригласили на съемки передачи утро на телеканале «СТС Мир».<br /><lj-embed id="12" /><br /><br />И что самое главное сделали отличный, я бы даже сказал продвинутый, по содержанию сюжет для телевидения раскрывающий понятие Дауншифтинг. Что такое Дауншифтинг? И какое отношение это имеет к моей экспедиции? На оба эти вопроса Вы найдете ответ в следующем сюжете. Смотрим:)<br /><lj-embed id="13" /><br /><br />Еще мне сделали монгольскую визу! Ура! Так что завтра (14.08) я еду в сторону Барнаула, Горно-Алтайска, Бийска и наконец Ташанты, где я въеду на территорию Монголии.<br />Монголия. При этом слове мое сердце начинает биться с утроенной силой. С каждым днем она становиться все ближе и ближе…<br /><br />До встречи в эфире,<br />С любовью,<br />Ваш Алекс<br /><br />З.Ы. Не обижайтесь и не пугайтесь, если я пропаду из вида на большой срок. Я скоро въеду туда, где виртуальное пространство развито гораздо слабее, чем реальное:) В общем, Интернета в Монголии нет, как секса в СССР:) http://alex-ryumin.livejournal.com/13208.html shoutaim Мадрид Китай путешественник Алексей Рюмин Экспедиция skylink coca-cola s7 велопутешествие ВелоТрансЕвразия lovi.tv sony Новосибирск Азия Владивосток Монголия Руян велосипед encounter Алтай Сибирь trek Европа public 6 http://alex-ryumin.livejournal.com/12949.html Wed, 12 Aug 2009 15:58:30 GMT Интервью в новосибирске и видеосюжет послуживший вступлением для пресс-конференции в Новосибирске http://alex-ryumin.livejournal.com/12949.html Привет Друзья!<br /><br />6 августа я въехал в Новосибирск. Поскольку этот город ознаменовал завершение первой половины моего пути, мне устроили в Новосибирске встречу на высшем уровне. О которой читайте и смотрите новый видеосюжет в ближайшем посте. А пока представляю вашему вниманию интервью для местного телевидения.<br /><lj-embed id="8" /><br /><br />Также представляю видеосюжет, открывавший пресс-конференцию велоэкспедиции "ВелоТрансЕвразия из Мадрида во Владивосток" в Новосибирске.<br /><lj-embed id="9" /><br /><br />Подробнее об этом также в ближайшем посте.<br /><br />С наилучшими пожеланиями,<br />Ваш Алекс http://alex-ryumin.livejournal.com/12949.html shoutaim Мадрид Китай путешественник Алексей Рюмин Экспедиция skylink coca-cola s7 велопутешествие ВелоТрансЕвразия sony Новосибирск Азия Владивосток дороги.ру Монголия Руян велосипед encounter Алтай Сибирь trek Европа public 6 http://alex-ryumin.livejournal.com/12781.html Wed, 12 Aug 2009 15:36:22 GMT Астана http://alex-ryumin.livejournal.com/12781.html Я очень хотел попасть в Астану, по многим причинам. Во-первых, мне раньше много рассказывали про этот город и как он отстроился, во-вторых, это был ближайший пункт после Астрахани, где меня встречали ребята из Encounter, ну и в-третьих я планировал в Астане получить китайскую визу, а это значило как минимум 5-тидневный отдых в столице.<br />Энкаунтеровцы встретили меня практически прямо на въезде в город и на следующий день повели выгуливать. Их оказалось очень много:)<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150129223/xlarge/154235749.jpg" /><br /><br />Они оказались на редкость веселые, поэтому веселились мы не переставая, на улице<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150129223/xlarge/154235755.jpg" /><br /><br />в квартире<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150129223/xlarge/154235761.jpg" /><br /><br />и даже с полицейскими <br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150129223/xlarge/154235758.jpg" /><br /><br />Пока все фотографируются и показывают в камеру разные сакральные знаки, настоящие путешественники, наученные долгими голодными вечерами, под шумок тырят со стола пельмени и прочие вкусности:)<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150129223/xlarge/154235753.jpg" /><br /><br />Очень забавный случай вышел с экскурсиями. В тот день, вечером, когда меня повезли в центр показывать местные архитектурные ансамбли и замысловатые памятники, выяснилось что по непонятным причинам, подсветка отключена. По вытянутым лицам парней, я понял, что они видят такое впервые. Но дальше было больше. Через несколько дней, мы поехали смотреть фонтаны, тоже с подсветкой:). Подъезжая к ним, издалека я увидел действительно красивый фонтан, переливающийся всеми цветами радуги, но как вы уже догадались, когда мы к ним подъехали подсветку выключили вместе с фонтанами:)<br />Китайскую визу я получил без особых проблем. Поскольку для получения китайской визы необходимо приглашение с Китайской стороны, то я решил полностью переложить вопрос получения визы на тур. фирму, где за 12000 тенге (2400 руб.) мне ее и сделали.<br /><br />Ну а потом была авария, про которую я уже писал, и которая задержала меня в Астане еще на 7 дней, до 26 июля. Таким образом, в Астане я пробыл 18 дней!!!<br />Если бы не Костя (Masaniy) и его мама Татьяна Аркадьевна, любезно предоставившие мне крышу над головой и еду, уехал бы я из Астаны голодранцем. Столица. Город не дешевый. Спасибо Вам огромное! <br /><br />Что самое интересное, я начал потихоньку привыкать к местным речевым оборотам и слэнгу. Начал ориентироваться в улицах в центральных районах. Организм начал забывать ежедневные нагрузки и перестраиваться на обычный повседневный режим жизни. Но дорога манила меня, и желание ехать нарастало с каждым днем задержки в Астане. Старт был запланирован на 26 число, но проснувшись в 7 утра я увидел, что за окном идет ливень. Время старта откладывалось… В тот день дождь не прекращался вплоть до 16 часов, таким образом я решил отложить отъезд на следующий день. 27 числа я наконец то выехал из Астаны и поехал в сторону границы с РФ. http://alex-ryumin.livejournal.com/12781.html shoutaim Мадрид Китай путешественник Алексей Рюмин Экспедиция skylink coca-cola s7 велопутешествие ВелоТрансЕвразия sony Новосибирск Азия Владивосток Монголия Руян велосипед encounter Алтай Сибирь trek Европа public 3 http://alex-ryumin.livejournal.com/12508.html Sat, 25 Jul 2009 10:07:23 GMT Выздоровление http://alex-ryumin.livejournal.com/12508.html Всем привет!<br /><br />У меня отличные новости! Сегодня мне сняли швы, рана срослась отлично, еще пару дней похожу в повязке, а потом можно будет ее совсем снять. Завтра с утра выезжаю в путь в сторону Новосибирска.<br />Единственное, что получается не очень хорошо, это то, что теперь я не смогу заехать в Омск, из-за этого непредвиденного семидневного "отдыха" в Астане. Я принял решение ехать сразу в Новосибирск. Олег, Дима очень жаль что не получится с вами увидеться, но как говориться "в другой раз":)<br /><br /><lj-embed id="7" /><br /><br />Ваш Алекс http://alex-ryumin.livejournal.com/12508.html shoutaim Словения Сербия Астана Испания livejournal велопутешествие ТрансЕвразия sony граница Италия саморазвитие Франция видео Хорватия мечта Китай путешествия Рюмин Азия Россия путешествие путешественники Казахстан Молдавия Монголия велосипед прорыв Румыния encounter люди одиночество Украина победа Европа trek public 8 http://alex-ryumin.livejournal.com/12182.html Sat, 18 Jul 2009 10:57:58 GMT Назад в будущ... точнее в Астану http://alex-ryumin.livejournal.com/12182.html Друзья, всем привет!<br /> У меня 2 новости, прям как начало анекдота:) Одна хорошая, другая не очень.<br /> Хорошая – мне дали китайскую визу, сроком до 13 октября, так что хочешь не хочешь, а 13 октября надо выехать с территории Китая и пересечь границу возле поселка Пограничный. Другой вопрос как это сделать. Почему? А вот теперь о не очень хорошей новости.<br /> Сегодня 18 июля, в обед, когда я выезжал из Астаны в сторону Барнаула, меня сбила машина. Я попытался удержаться, но меня просто кинуло на бок и поделать я уже ничего не мог. В итоге рваная рана на локте, а точнее дырка до сустава, 4 шва и резинка изнутри наружу (в локте, зачем я так и не понял). Сделали прививку от столбняка. Сказали, что через 10 дней снимут швы и можно будет продолжать ехать. Очень надеюсь что так, ибо сроки у меня жмут не по детски, не хочется зад морозить в Монголии и Дальнем Востоке в октябре, ноябре.<br /> Подробнее расскажу в небольшом интервью, которое хочу снять сегодня-завтра.<br /> Настроение боевое! Прерывать экспедицию не намерен. Буду держать вас в курсе, по мере того, что будут говорить врачи о заживлении раны.<br /><br />Ваш Алекс http://alex-ryumin.livejournal.com/12182.html Словения Сербия Астана еда Монпелье Испания livejournal велопутешествие Канны ТрансЕвразия Одесса sony граница Италия Монако Волгоград саморазвитие Франция энкаунтер тоска видео Хорватия мечта Мадрид Китай россия Барселона путешествия Рюмин Ницца Азия Россия Актюбе путешествие путешественники Казахстан Виза Молдавия украина Монголия Белград прорыв велосипед Румыния Астрахань одиночество люди Украина победа trek Европа public 10 http://alex-ryumin.livejournal.com/11801.html Fri, 17 Jul 2009 13:56:27 GMT 6-й видеосюжет http://alex-ryumin.livejournal.com/11801.html Наконец-то я доделал 6-й видеосюжет. Он дался мне не просто, рождался тяжело и мучительно.<br />Сегодня звонил в фирму, делающую мне китайскую визу, сказали что завтра с утра должно быть все готово. Если так, то завтра с утра выдвигаюсь из Астаны в сторону Павлодара и планирую там быть во вторник вечером.<br /><br />Ваш Алекс<br /><br /><lj-embed id="6" /> http://alex-ryumin.livejournal.com/11801.html Словения Сербия Астана еда Монпелье Испания livejournal велопутешествие Канны ТрансЕвразия Одесса sony граница Италия Монако Волгоград саморазвитие Франция энкаунтер тоска видео Хорватия мечта Мадрид Китай россия Барселона путешествия Рюмин Ницца Азия Россия Актюбе путешествие путешественники Казахстан Виза Молдавия украина Монголия Белград прорыв велосипед Румыния Астрахань одиночество люди Украина победа trek Европа public 5 http://alex-ryumin.livejournal.com/11748.html Fri, 10 Jul 2009 12:30:04 GMT Первые пролемы с авторскими правами http://alex-ryumin.livejournal.com/11748.html Друзья, мой 5-й сюжет был заблокирован на портале youtube.ru для просмотра в большинстве стран мира, кроме некоторый, и что удивительно в эти "кроме" вошло США:)<br />Авторские права связанные с музыкой в ролике.<br />Поэтому выкладываю его еще раз в свой блог, но с портала nedoma.ru<br /><br /><lj-embed id="5" /> http://alex-ryumin.livejournal.com/11748.html Словения Сербия Астана еда Трансевразия Монпелье велопутешествие ТрансЕвразия Одесса sony Италия Волгоград саморазвитие европа Париж Хорватия мечта Мадрид россия Ницца Россия Новый Сад Актюбе рюмин Молдавия Виза Эйфелева Башня Монголия прорыв Астрахань одиночество Велопутешествие победа trek welcome Испания livejournal Канны граница Монако азия Франция энкаунтер тоска видео Китай Барселона путешествия грусть трансЕвразия проводы Азия путешествие путешественники авиабилеты Казахстан украина Путешествия Белград велосипед Румыния люди Украина Европа public 1 http://alex-ryumin.livejournal.com/11362.html Fri, 10 Jul 2009 10:43:52 GMT С белых крыш на лошадиный базар http://alex-ryumin.livejournal.com/11362.html Сегодня 6 июля. Я отрастил бороду и стал похож на маджахеда.<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150104415/xlarge/153276556.jpg" /><br />Хочется на Алтай и в Монголию. Не знаю почему, но мне все больше и больше кажется, что в Монголии что-то случится, что-то важное и очень мне нужное. Еще в период подготовки к экспедиции я всегда заворожено смотрел на этот участок пути, а теперь она вообще не уходит у меня из головы.<br />Настроение последние дни философско-лирическое, хотя местные жители своим гостеприимством не дают особо поразмышлять о смысле жизни, чему я собственно и рад… в смысле гостеприимству.<br />Но, как это уже стало традицией, давайте по порядку.<br />Ну, во-первых, я пересек 7000-ый рубеж. УРА!!!:))) По сути это середина моего маршрута. (прим.: когда выкладывал этот пост накрутилось уже больше 7800км).<br />Как я уже говорил раньше, при продвижении на север страны, ландшафт начал меняться, появилась зеленая трава, все чаще стали попадаться поля с пшеницей. Я въезжал в хлебную часть страны, поднятую целину.<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150104415/xlarge/153276547.jpg" /><br />Единственное что не менялось это дурацкие скульптуры на обочинах, как например, вот этот человечек из покрышек<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150104415/xlarge/153276575.jpg" /><br />Стало холоднее, 2 дня вообще шли дожди. Я даже оделся в термобелье и куртку. <br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150104415/xlarge/153276568.jpg" /><br />Ехать, конечно, под дождем противно, штаны сразу намокают и ехать становиться очень холодно. Поэтому когда дождь усиливался я останавливался и просто садился на корточки на обочине, прислонившись спиной к байку, и наблюдал проносящиеся мимо фуры, поднимающие столбы водяной пыли за собой. Но вот что в этом всем было замечательного, так это облака. Они поражали своими формами и цветом. И казалось, что миллионы тонн свинца застыли в небе причудливыми формам, и вот-вот упадут на тебя. Жаль фото, совсем не передают те цвета и тот объем этого поистине потрясающего зрелища.<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150104415/xlarge/153276562.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150104415/xlarge/153276564.jpg" /><br />А ночью начался дождь с грозой, и поднялся сильный ветер. Было жутковато, скажу вам, учитывая то, что палатка была самым высоким и одиноко стоящим объектом в поле, что увеличивало шанс удара молнии в нее. А когда сверкала молния (в паре километров, судя по промежутку между молнией и раскатом грома) на пару минут глаза слепли от яркой вспышки в темноте. <br />А потом снова начались удивительные знакомства:)<br />Сначала я повстречал у железнодорожного переезда кампанию рыбаков на джипе, только почему то они до озера не доехали, а стояли бухали в машине у переезда. Естественно мы с ними разболтались примерно на 150 грамм:))) И стоит отдать должное ребятам, они угостили меня вкусной кониной и завернули в дорогу еще.<br />А где-то через 40 км в тот же день мне повстречалась кампания милиционеров, а как ни странно у них тоже был джип (УАЗик) и тоже водка!!!:))) Видимо конец рабочего дня отмечали:) С ними мы разболтались еще на 100 грамм:)))<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150104415/xlarge/153276559.jpg" /><br />После этого дорога подо мной полетела особенно легко и незатейливо, ноги налились приятной усталостью:) День прошел не зря:)<br />На самом деле мне еще ни разу не попадались милиционеры (в Казахстане милиция называется полициясы) которые проверяли бы мою регистрацию, вымогали деньги и пр. Хотя я очень много читал про то, как вымогают деньги с туристов под разными предлогами и уловками.<br />А через несколько дней, в пятницу, я приехал в небольшой поселок Аулеколь, где поселился в доме отдыха и совершенно случайно в кафе познакомился с кампанией девушек, банковских служащих, так сказать провожающих рабочую неделю бутылочкой водочки:) Они меня пригласили к себе за столик и…, в общем, в тот вечер, я опять, так и не смог пописать в свой блог, как того хотел:)<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150104415/xlarge/153276542.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150104415/xlarge/153276545.jpg" /><br />Иногда я вспоминаю фильм Тима Копа (австралийца пересекшего Россию, Монголию и Китай с напарником на велосипедах) про их путешествие и начинаю понимать почему они ехали целых 14 месяцев – их наверное в каждом селе поили нещадно:) Как они еще не спились тогда:) Хорошо что я поехал через Казахстан:)<br />А после я въехал в Есиль, так называемые ворота целины, где началось вообще самое интересное!<br />Еду по селу, смотрю впереди дорога перекопана совсем, я подъезжаю к рабочим и спрашиваю «как объехать это дело и двинуться в сторону поселка Жаксы». Они мне все подробно рассказали и начали расспрашивать «кто, куда, откуда?» и фотографироваться. Так вот когда фотографировались, к нам подъехал на джипе мужчина, деловой и презентабельной внешности и начал тоже интересоваться мной. Оказалось, это был Аким (Глава) Есильского района Ерин Сергей Анатольевич (второй справа).<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150104415/xlarge/153276550.jpg" /><br />А дальше началось как в восточной сказке:) Оказалось у них в этот день проводился финальный этап районного чемпионата по футболу в поддержку здорового образа жизни молодежи, и соответственно на праздник собралось много народу. Меня отвели в отдельную юрту, где накормили до отвала, напоили чаем, я познакомился с Имамом Есильского района, и в присутствии журналистов торжественно вручили подарки (футболку и майку с символикой района, а также местное одеяние халат и шапку) как почетному гостю! Я попросил скинуть мне фотографии, которые сделала журналистка, так что как придут, сразу размещу!<br />А потом Сергей Анатольевич позвонил в соседний Жаксынский район в село Жаксы (переводится как хорошо), где меня так хорошо встретили, что на следующее утро я еле встал и уж тем более еле сел на велосипед. Сначала был ресторан, а потом в гостинице мы познакомились с ребятами из Венгрии, которые работали в Жаксах инженерами-консультантами на строительстве элеватора. В час ночи я не выдержал и по слабацки завалился спать, а ребята куралесили до 4-х:))<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150104415/xlarge/153276551.jpg" /><br />(рядом со мной в зеленой майке Руководитель аппарата Акима Жакснского района, а остальные – ребята из Венгрии). Фото плохого качества, т.к. мы еще могли стоять ровно, подпирая друг друга в пятером, а вот фотографу было тяжело одному, да еще и фотоаппаратом в нас целиться:)<br />Географическая справка:<br />Есиль является так называемыми «воротами целины», именно через это город сюда приезжали со всего Союза «поднимать целину». Вот сюда видимо, судя по указателю, приезжали хохлы:))<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150104415/xlarge/153276572.jpg" /><br />(снято в Казахстане)<br /><br />P.S. Вот такие зверюшки толпами бегают по пшеничным полям и совсем не боятся человека, снимал его минуты две в разных позах с 4 метров, а он стоял и смотрел на меня. И только когда я случайно издал металлический звук, он ускакал, тряся жирными боками, к себе в нору.<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150104415/xlarge/153276540.jpg" /><br /><br />P.S.S. Почему с Белых крыш на лошадиный базар? Актюбе в переводе с казахского означает Белые (ак) крыши (тюбе), а Атбасар (город рядом с Астаной) – лошадиный (ат) базар (басар). По крайней мере, мне так объяснили местные жители.<br /><br />P.S.S.S. Мой очень хороший друг Саша, который меня поддерживает и всячески помогает, продает сейчас машину Шкоду Фелицию. Вот решил помочь ему как могу, разместив ссылку на его объявление <a href="http://www.avtomedia.ru/cars/offer/425416.htm">http://www.avtomedia.ru/cars/offer/425416.htm</a> http://alex-ryumin.livejournal.com/11362.html Словения Сербия Астана еда Трансевразия Монпелье велопутешествие ТрансЕвразия Одесса sony Италия Волгоград саморазвитие европа Париж Хорватия мечта Мадрид россия Ницца Россия Новый Сад Актюбе рюмин Молдавия Виза Эйфелева Башня Монголия прорыв Астрахань одиночество Велопутешествие победа trek welcome Испания livejournal Канны граница Монако азия Франция энкаунтер тоска видео Китай Барселона путешествия грусть трансЕвразия проводы Азия путешествие путешественники авиабилеты Казахстан украина Путешествия Белград велосипед Румыния люди Украина Европа public 14 http://alex-ryumin.livejournal.com/11246.html Thu, 09 Jul 2009 13:38:43 GMT Когда TransEurasia встретила CrossEurasia http://alex-ryumin.livejournal.com/11246.html Здравствуйте мои дорогие и любимые!:) Наконец то я добрался до Интернета. Хотя с другой стороны я провел пять замечательных дней в пустынях или полупустынях (не знаю как правильно будет назвать) Казахстана и если бы там был Интернет, думаю это только испортило бы все впечатления. Но давайте по порядку.<br />Как я уже и говорил раньше, 17 июня я въехал на территорию Казахстана. Первый более-менее крупный населенный пункт на моем пути было село (райцентр) Ганюшкино, где я собственно и решил остановиться на ночь в отеле за 11 евро. Это вообще отдельная история, т.к. за эти деньги меня поселили в номер, где не было замка в двери, но хозяйка сказала не бойтесь, здесь больше никого нет и никто ничего не тронет:) Когда я спросил ее, а где можно помыться, она отвела меня в душевую, все показала, а потом добавила что воды у них нет 8-) <br />- А как же тогда мне помыться???<br />- Ну, я могу вам дать ведро с водой.<br />- С горячей?<br />- А может вы холодной помоетесь?<br />- ??? Да, как-то хотелось бы горячей…<br />После такого диалога она притащила мне ведро теплой воды. Жизнь стала веселее:)<br />На утро следующего дня, в этом же селе я решил сделать себе регистрацию. По закону в Казахстане все иностранные граждане обязаны зарегистрироваться в РУВД в течение 5 дней (календарный, а не рабочих). <br />После недолгих поисков РУВД мне показали нужного мне человека из миграционной службы. Он с минуту повертел мой паспорт в руках, посмотрел в потолок, на своего коллегу, который сделал недовольную гримасу, а потом, пристально посмотрев на меня, сказал: «А может вы в Атырау зарегистрируетесь?». Я и сам хотел это сделать в Атырау (крупный город), но не успевал туда доехать до начала выходных, и попросту бы тогда не успел сделать ее в 5-тидневный срок. Поэтому, я начал уже по заученной схеме, втирать ему, что еду из Мадрида по Владивосток, на велосипеде, долго и до Атырау не успеваю и бла-бла-бла… Дальше, как всегда, состоялся разговор «нормального человека» с «психом», которому непонятно почему дома не сидится, и после небольших уговоров он все-таки согласился сделать свою работу. <br />Вся процедура регистрации заключалась в необходимости отсканировать мне загранпаспорт, заполнить заявление, после чего мне тут же внесли запись в миграционную карту о регистрации на срок до 31 июля:) при этом написали в графе «Адрес временного проживания» адрес отеля:)<br />Вообще, как рекомендация, тем кто решит поехать по Казахстану, делать регистрацию в маленьких городах или райцентрах, а не в крупных, и уж тем более не в столице. Никаких очередей, непонятных заявлений, типа «…приводите хозяев квартиры с документами на квартиру, права собственности и пр…». Все просто и быстро, главное включать обаяние и навык болтологии и тогда все пройдет «на ура». Кстати, двух немцев (о которых чуть позже) он все-таки завернул в Атырау, только потому, что они по-русски плохо говорили и соответственно не могли уговорить его чуть-чуть поработать:)<br />Дорога до Атырау заняла у меня 3 дня.<br />Центральная площадь которого оказалась довольно красивой:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094202/xlarge/152962476.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094202/xlarge/152962521.jpg" /><br />Без особых приключений, только всегда хотелось ужасно пить. Температура была под 50 на солнце, а тени собственно нигде и не было.<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094202/xlarge/152962453.jpg" /><br />По дороге попадались различные забавные статуи, наверное, чтобы хоть как-то разнообразить монотонный ландшафт:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094202/xlarge/152962490.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094202/xlarge/152962494.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094202/xlarge/152962500.jpg" /><br />А небольшие поселки напоминали картинки их кино производства киностудии «Казахфильм»:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094202/xlarge/152962425.jpg" /><br />А затем началось самое интересное и замечательное.<br />Прибыв в Атырау и после долгих поисков дешевого отеля, я с третьей попытки нашел небольшой отель «Лаети», который все-таки оказался нифига не дешевым, но дальше искать у меня уже не было никакого желания. И на парковке, позади отеля, где мне разрешили приковать своего железного коня, гляжу, стоит пристегнутый велосипед лежачий-тандем на двоих!!! Я минут 5 стоял и смотрел на него, как баран на новые ворота или как говорят в Германии «Как свинья на часовой механизм»:) пока ко мне не подошел молодой паренек, с улыбкой до ушей и светящийся как католик, увидевший Папу. <br />Оказалось в этом же отеле остановились на ночь семейная пара из Германии, 25 летний паренек Фальк и его 23 летняя жена с русским именем Катя, которые едут из Германии в Пекин, через Казахстан и Киргизию.<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094202/xlarge/152962508.jpg" /><br />А когда я узнал, что наши маршруты совпадают на ближайшие 5 дней, я был просто вне себя от радости.<br />Причем, как оказалось потом, это была самая трудная часть моего пути по Казахстану, в плане качества дорог, а точнее полного его отсутствия.<br />Началось все с небольшого ухудшения покрытия:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094202/xlarge/152962428.jpg" /><br />Которое потом превратилось в щебенку:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094202/xlarge/152962431.jpg" /><br />А затем и вовсе в колею, а местами и множество колей посреди степи:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094202/xlarge/152962435.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094202/xlarge/152962439.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094202/xlarge/152962443.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094202/xlarge/152962445.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094202/xlarge/152962450.jpg" /><br />Тандем Фалька и Кати в такой местности смотрелся не менее фантастично, чем корабль марсиан:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094202/xlarge/152962515.jpg" /><br />А когда они заезжали со мной в маленькие села, посмотреть на них сбегалось все село, начиная от стариков и заканчивая жутко кричащей и норовящей на все нажать и покрутить толпой детей. Для них это был настоящий ужас, и я их понимаю, ведь любая поломка или «свистнутая» в суматохе вещь могли принести им серьезные трудности с продолжением их экспедиции. Но при этом они держались молодцом – всегда улыбались, смеялись и терпеливо отвечали на одни и те же вопросы местных. Раз по 30 на дню.<br />Я тоже выглядел довольно неплохо в пустыне, как мне показалось:)))<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094202/xlarge/152962528.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094202/xlarge/152962532.jpg" /><br />Особенно мое самое больное место;)<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094202/xlarge/152962538.jpg" /><br />Все эти 5 дней нас мучила жара, которую вынести могли не все:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094202/xlarge/152962456.jpg" /><br />У ребят был термометр, и макисмальная температура, которую мы засекли на нем была 48 градусов. При этом надо было по такой жаре ежедневно крутить педали по 8-10 часов.<br />Отдыхали и обедали прямо на обочине:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094202/xlarge/152962472.jpg" /><br />А на ночь останавливались в укромных местах в 100-150 метрах от дороги, подальше от сел:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094202/xlarge/152962501.jpg" /><br />Не знаю почему, но именно здесь я полюбил жару, что раньше для меня было просто мучением. И я полюбил пустыню, именно полюбил, песок больше похожий на пыль, жару, летящие из под ног клубы песочной пыли:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094202/xlarge/152962484.jpg" /><br />действительно она чем то завораживает, и когда уже после, я поехал один в сторону Актюбе, окружающий меня ландшафт начал меняться, появилась трава, деревья и небольшие лесопосадки, температура упала до 30. И в этот момент я понял, что завидую ребятам, так как они поехали на юг Казахстана и им предстоит еще целый месяц ехать по пустыням. Ну что ж, в следующий раз. Тем более у меня впереди Монголия, не менее, а скорее даже и более интересная, хоть и не такая жаркая.<br />В последний день нашего совместного катания мы нашли речку, в которой можно было помыться, что мы собственно и сделали с парой дальнобойщиков, остановивщихся у этой реки за тем же.<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094202/xlarge/152962462.jpg" /><br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094202/xlarge/152962470.jpg" /><br />Вообще с ребятами, мы сразу нашли общий язык. На мое удивление у нас оказалось столько общего, не то чтобы в хобби, а именно во взглядах на жизнь, на разные проблемы в мире, в отношении окружающей среды, в религии. А сколько раз мы ржали вместе до слез, именно до слез, это просто не перечесть:))) Иногда даже до боли в животе:))) Просто потрясающие люди!<br />Я их пригласил в Москву в следующем году, обещал угостить настоящей черной икрой и сделать им приглашение для визы, а они меня пригласили на ОктоберФест:)<br />Так что, ТрансЕвразия приносит мне не только новые открытия в своем внутреннем мире, и новые ощущения, но еще и новых друзей за границей. http://alex-ryumin.livejournal.com/11246.html Словения Сербия еда Трансевразия Монпелье Испания welcome livejournal велопутешествие Канны ТрансЕвразия Одесса sony Италия граница Монако Волгоград азия саморазвитие европа Франция энкаунтер тоска видео Париж Хорватия мечта Мадрид Китай россия путешествия Барселона грусть проводы трансЕвразия Ницца Азия Россия Новый Сад путешественники путешествие Казахстан авиабилеты рюмин Молдавия Виза украина Эйфелева Башня Монголия Белград Путешествия прорыв велосипед Румыния Астрахань одиночество люди Украина Велопутешествие победа trek Европа public 1 http://alex-ryumin.livejournal.com/10785.html Thu, 09 Jul 2009 13:11:56 GMT Новые фото о старом:) http://alex-ryumin.livejournal.com/10785.html Появились новые фото из Волгограда и Астрахани.<br /><br />Волгоград<br /><br />Ребята из Encounter, которые провожают меня в дорогу в Астрахань:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094201/xlarge/152962338.jpg" /><br />(слева на право: Антон, Я, Паша, Дима)<br />Перед этим я хорошенько отдохнул посидев под деревом:)<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094201/xlarge/152962359.jpg" /><br />Расставаться было очень грустно, но мы веселились:) Наверное, все таки в России так принято, когда грустно мы смеемся, а от радости плачем:)<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094201/xlarge/152962364.jpg" /><br />Ну и затем я уехал.<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094201/xlarge/152962366.jpg" /><br /><br />Астрахань<br /><br />Помимо лазания по крышам, катались еще на колесе обозрения:<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094201/xlarge/152962344.jpg" /><br />Рамиль и Леха<br />Я тоже катался на карусели<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094201/xlarge/152962356.jpg" /><br />Я и Надя<br />Еще на мотоцикле с клеевой обезьянкой на борту:)<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094201/xlarge/152962351.jpg" /><br />На самом деле это фото сделано в одном астраханском ресторане, где собственно и стоит этот разрисованный «Урал».<br />Ну и конечно дурачились:)<br /><img src="http://arioumine.users.photofile.ru/photo/arioumine/150094201/xlarge/152962341.jpg" /> http://alex-ryumin.livejournal.com/10785.html Словения Сербия еда Трансевразия Монпелье Испания welcome livejournal велопутешествие Канны ТрансЕвразия Одесса sony Италия граница Монако Волгоград азия саморазвитие европа Франция энкаунтер тоска видео Париж Хорватия мечта Мадрид Китай россия путешествия Барселона грусть проводы трансЕвразия Ницца Азия Россия Новый Сад путешественники путешествие Казахстан авиабилеты рюмин Молдавия Виза украина Эйфелева Башня Монголия Белград Путешествия прорыв велосипед Румыния Астрахань одиночество люди Украина Велопутешествие победа trek Европа public 0 http://alex-ryumin.livejournal.com/10152.html Thu, 09 Jul 2009 03:37:32 GMT http://alex-ryumin.livejournal.com/10152.html Друзья, всем привет из Астаны!<br /><br />К сожалению в Казахстане заблокирован прямой доступ к ЖЖ:( Поэтому я не мог так долго ничего выложить, ни даже откомментировать ваши письма и вопросы:(<br />Сейчас в Астане с моими друзьями из Энкаунтера мы пробуем разрешить этот вопрос через разные прокси и пр. вещи (в которых я ничего не понимаю:) Но то фото криво выкладываюся, то вообще нет возможности разместить фото. В общем я думаю все получиться, надо только подождать пару дней.<br />В Астане я планирую задержаться на 5-7 дней, хочу получить визу в Китай.<br /><br />Ваш Алекс http://alex-ryumin.livejournal.com/10152.html public 2 http://alex-ryumin.livejournal.com/9495.html Wed, 08 Jul 2009 20:57:36 GMT Маршрут http://alex-ryumin.livejournal.com/9495.html &nbsp;<span class="Apple-style-span" style="font-weight: bold; ">Маршрут</span> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt"><o:p>&nbsp;</o:p></p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Друзья, огромное всем спасибо за то огромное количество приглашений из разных городов России и не только, которые Вы мне присылаете. Вы просто даже не можете представить, что такое ехать по 50 градусной жаре по песку, мечтая о стакане простой холодной воды и вдруг получить сообщение типа &laquo;Алексей будете ехать по Дальнему Востоку, заезжайте в Благовещенск, мы вас встретим&raquo;&hellip;:) Это просто потрясающе!!!</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Спасибо за приглашения и поддержку ребятам из Твери, Благовещенска, Уфы, Астаны, команде <span lang="EN-US" style="mso-ansi-language:EN-US">Dragons</span> (<span lang="EN-US" style="mso-ansi-language:EN-US">Encounter</span>) из Минска:)</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Сейчас нахожусь в Актюбе (Казахстан).</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">А дальнейший мой маршрут выглядит следующим образом:</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt"><o:p>&nbsp;</o:p></p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt"><b style="mso-bidi-font-weight:normal"><i style="mso-bidi-font-style:normal">Казахстан<o:p></o:p></i></b></p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Актюбе</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Кустанай &ndash; пока не точно, т.к. может сверну за 200 км до Кустаная вправо на бездорожье в районе Адаевки и поеду на Жаксы, через Семиозерное и Октябрьское, уж очень понравилось по пескам ездить:)</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Астана &ndash; здесь планирую провести недельку, т.к. хочу получить китайскую визу, через турфирму (т.к. необходимо приглашение)</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Щучинск &ndash; в районе этого города сверну на второстепенные дороги и поеду в сторону Омска</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt"><o:p>&nbsp;</o:p></p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt"><b style="mso-bidi-font-weight:normal"><i style="mso-bidi-font-style:normal">Россия<o:p></o:p></i></b></p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Омск (в Омск планирую приехать в последней декаде июля)</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Новосибирск</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Бердск</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Новоалтайск</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Барнаул &ndash; пока точно не знаю</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Бийск</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Горно-Алтайск</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Ташанта &ndash; небольшой поселок на Алтае на границе с Монголией. Собственно где и находится погранпереход.</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt"><o:p>&nbsp;</o:p></p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt"><b style="mso-bidi-font-weight:normal"><i style="mso-bidi-font-style:normal">Монголия (если кому-то это о чем-то скажет, кроме одного города или двух-трех:)<o:p></o:p></i></b></p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Цаганнуур</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Улаангом</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Зуунговь</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Баруунтуруун - :)))</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Тэс</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Цэцэрлэг</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Цагаан-Уул</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Бурэнтогтох</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Морон</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Тосонценгэл</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Их-Уул</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">В общем не буду вас и себя (ужасно сложно писать такие названия:) больше мучать:)))</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Дальше в Булган</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Улаанбаатар &ndash; или по-русски Улан-Батор</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Чойр</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Сайншанд &ndash; почти как <span lang="EN-US" style="mso-ansi-language:EN-US">Sunshine</span><span lang="EN-US"> </span>:)))</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Замын-Ууд</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt"><o:p>&nbsp;</o:p></p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt"><b style="mso-bidi-font-weight:normal"><i style="mso-bidi-font-style:normal">Китай<o:p></o:p></i></b></p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Эрлянь-Хотэ &ndash; пограничный городок на границе с Монголией из которого я двинусь в сторону <span lang="EN-US" style="mso-ansi-language:EN-US">Tongliao</span>, правда, не знаю пока по какой дороге, буду смотреть ближе к делу.</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt"><st1:city w:st="on"><st1:place w:st="on"><span lang="EN-US" style="mso-ansi-language:EN-US">Changchun</span></st1:place></st1:city><span lang="EN-US" style="mso-ansi-language:EN-US"><o:p></o:p></span></p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt"><st1:city w:st="on"><st1:place w:st="on"><span lang="EN-US" style="mso-ansi-language:EN-US">Harbin</span></st1:place></st1:city><span lang="EN-US" style="mso-ansi-language:EN-US"><o:p></o:p></span></p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt"><st1:city w:st="on"><st1:place w:st="on"><span lang="EN-US" style="mso-ansi-language:EN-US">Mudanjiang</span></st1:place></st1:city><span lang="EN-US" style="mso-ansi-language:EN-US"><o:p></o:p></span></p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Суйфэнхэ</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt"><o:p>&nbsp;</o:p></p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt"><b style="mso-bidi-font-weight:normal"><i style="mso-bidi-font-style:normal">Россия (Дальний Восток)<o:p></o:p></i></b></p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Пограничный &ndash; пограничный городок:)</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Уссурийск</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Артем</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Владивосток</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt"><o:p>&nbsp;</o:p></p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt">Собственно вот так будут выглядеть последующие 3-4 месяца моего движения:)</p> <p class="MsoNormal" style="text-align:justify;text-indent:27.0pt"><o:p>&nbsp;</o:p></p> http://alex-ryumin.livejournal.com/9495.html Словения Сербия еда Трансевразия Монпелье Испания welcome livejournal велопутешествие Канны ТрансЕвразия Одесса sony Италия граница Монако Волгоград азия саморазвитие европа Франция энкаунтер тоска видео Париж Хорватия мечта Мадрид Китай россия путешествия Барселона грусть проводы трансЕвразия Ницца Азия Россия Новый Сад путешественники путешествие Казахстан авиабилеты рюмин Молдавия Виза украина Эйфелева Башня Монголия Белград Путешествия прорыв велосипед Румыния Астрахань одиночество люди Украина Велопутешествие победа trek Европа public 2 http://alex-ryumin.livejournal.com/9446.html Sat, 20 Jun 2009 11:51:10 GMT Надежды, острые ощущения, счастливое спасение и Железный Дровосек http://alex-ryumin.livejournal.com/9446.html Я выжил! Со мною случились невероятные события и я заключил или точнее воплотил их в новом фильме, который представляю твоему вниманию. Спасибо что ты со мной! Чувствую твою поддержку. Вспоминаю Украину с теплотой...<br />Новый фильм о степях Казахстана, наводнённых всеразличными закусочными и кафе, о многомиллионном стаде летающих людоедов (а я не Люда), остановить которую способен только Ужасный Пчеловод и мой единственный верный спутник -лягуш.<br />Мне очень важно твоё мнение обо всём, что происходит со мной и вокруг меня, т.к. если ты смотришь этот фильм,<br />значит это для чего-то тебе дано, это важно для тебя. И мы оба знаем, что каждый миг человеческого бытия наполнен энергией развития и только в человеческом теле мы имеем возможность расти духовно, что позволяет нам стать Абсолютом (ссылка на спонсора)...именно для этого я устремляюсь вперёд без оглядки, именно там, впереди - я.<br />Ещё одно достижение экспедиции - первый спонсор-партнёр, который разделил моё мироощущение, компанию Encounter(сайт:EN.CX) Отныне мы вместе идём на Китай.<br />Уверен, нас будет больше. Присоединяйся! Ссылка на видеоролик: http://www.youtube.com/watch?v=rfH1BgIWQl0 <br /><br /><lj-embed id="4" /><br /><br /> http://alex-ryumin.livejournal.com/9446.html Словения Сербия Астана еда Трансевразия Монпелье велопутешествие ТрансЕвразия Одесса sony Италия Волгоград саморазвитие европа Париж Хорватия мечта Мадрид россия Ницца Россия Новый Сад Актюбе рюмин Молдавия Виза Эйфелева Башня Монголия прорыв Астрахань одиночество Велопутешествие победа trek welcome Испания livejournal Канны граница Монако азия Франция энкаунтер тоска видео Китай Барселона путешествия грусть трансЕвразия проводы Азия путешествие путешественники авиабилеты Казахстан украина Путешествия Белград велосипед Румыния люди Украина Европа artistic public 9 http://alex-ryumin.livejournal.com/8964.html Mon, 15 Jun 2009 11:57:47 GMT Астрахань, окончание подготовки и бесконечное множество вариантов http://alex-ryumin.livejournal.com/8964.html <br /><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt; text-align: justify"><font face="Times New Roman" size="3">В Волгограде, блуждая по городу в поисках веломагазинов и туалета, я случайно наткнулся на торговый центр в котором был магазинчик для рыболовов, где я увидел и решил купить противомоскитную сетку, и как потом оказалось очень правильно, что купил.</font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt; text-align: justify"><font face="Times New Roman" size="3">Еще на въезде в Астраханскую обл. бригада дорожных рабочих, отдыхающая в своей подсобке и пригласившая меня к ним попить воды, предупредила меня что впереди меня ждут тучи мошки, я им поверил, но и представить не мог, что ее будет столько! Это был просто какой-то кошмар. Она лезла всюду, в нос, глаза, уши, залезала под сетку, кусала&hellip; Вечером залезая в палатку, приходилось терпеть жуткую духоту, т.к. открыть ее было невозможно, из-за миллиардов летающих дьяволят снаружи. (<i style="mso-bidi-font-style: normal">прим.: на фото не снял, но будет в следующем видеосюжете</i>).</font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt; text-align: justify"><font face="Times New Roman" size="3">Ландшафт начал меняться в сторону полупустыни, деревья и посадки стали появляться все реже и реже.</font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt; text-align: justify"><font face="Times New Roman" size="3"><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150085553/xlarge/152666750.jpg" /></font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt; text-align: justify"><font size="3"><font face="Times New Roman">Погода первый раз показала свои зубки, чуть-чуть совсем, но мне этого хватило чтобы понять что может меня ждать впереди. На горизонте буквально за полчаса сформировалось грозовое облако, и еще за добралось до меня, поднялся ужасный ветер, поднявший в воздух тучи песка и буквально сбивавший меня с ног. Благо, по счастливой случайности в близи оказалась автобусная остановка от населенного пункта, находящегося в нескольких километрах от дороги, где я и укрылся от непогоды, в которой также нашла временный приют от непогоды семья из Узбекистана, так что скучать нам не пришлось.<span style="mso-spacerun: yes">&nbsp; </span></font></font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt; text-align: justify"><font face="Times New Roman" size="3">Еще со мной произошел такой случай.</font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt; text-align: justify"><font face="Times New Roman" size="3">Как то вечером, ища место для ночлега, я подъезжал к селу Никольское, что в Астраханской области, и увидел большую церковь:</font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt; text-align: justify"><font face="Times New Roman" size="3"><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150085553/xlarge/152666785.jpg" /></font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt; text-align: justify"><font face="Times New Roman" size="3">В которой я собственно решил попросить приюта на ночь. Как потом мне рассказала девушка, живущая при этой церкви, раньше это была третья по величине церковь в России, но теперь уже нет. Также при церкви есть приют для девочек. Нут, так вот у этой девушки я и попросил разрешения поставить палатку на территории церкви, на заднем дворе. Она пошла поговорить по этому поводу с батюшкой, в то время как я гулял и смотреть саму церковь.</font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt; text-align: justify"><font face="Times New Roman" size="3">Вернувшись, она, с речью выпускницы дипломатической академии, вежливо и деликатно, сказала мне, что я могу поставить палатку в лесу на берегу Волги, в паре километров от церкви, там живописные места, и в целом в деревне у них люд хороший, приветливый и меня там никто не тронет:))) Я все понял, зачем и раскланялся и поехал дальше по дороге в сторону Астрахани искать место для ночлега. Почему они отказали мне в ночлеге, я так и не понял, не берусь судить никого, но я всегда представлял, что в монастырях и церквях с приходами можно всегда найти путнику приют.</font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt; text-align: justify"><font face="Times New Roman" size="3">Еще я научился просить воду на дороге у проезжающих мимо авто. Вчера, когда у меня закончилась вода, а пить из-за жары страшно хотелось, я взял пустую бутылку в руки и начал махать ей перед проезжающими машинами. Самый прикол, что остановилась восьмая по счету машина, Ягуар в пятиста метрах от меня, сдала назад, медленно открылось тонированное стекло, от туда высунулась рука и протянула мне бутылку воды. Я взял, сказал &laquo;Огромное спасибо&raquo;, водитель &ndash; молодой парень в темных очках, не глядя на меня, кивнул головой, закрыл стекло и подняв облако пыли умчал в горизонт. Со стороны это смотрелось воистину грандиозно, как в кино:)))</font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt; text-align: justify"><font face="Times New Roman" size="3">Вообще я не перестаю утверждаться во мнении что мир, вселенная, это пространство с бесконечным множеством вариантов решения любых ситуаций. Вот например, еще один случай с водой. Мне надо было пополнить запасы воды, и я пару раз совался в придорожные кафешки с просьбой налить воды, на что мне отвечали, что вода у них привозная, и осталось мало, мол хотите пить, покупайте. Я было начал создавать себе стереотип в голове, что правильно, ведь кафе это бизнес, хочешь пить &ndash; покупай. И можно даже не заезжать в них с такими вопросами. Но проезжая мимо очередной, я все таки решил попробовать еще раз, и когда я зашел, женщина продавец сказала &laquo;Ого, к нам пожаловал велосипедист! Я тоже раньше занималась велосипедом&raquo;. Мы с ней разговорились и в итоге, она подарила мне бутылку ледяной воды из холодильника, мороженое и еще хотела тарелку супа налить! Но поскольку я недавно поел, то от супа отказался:) </font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt; text-align: justify"><font face="Times New Roman" size="3">Получается, мы сами себе часто в голове создаем стереотип, что та или иная ситуация в жизни протекает только так и ни как иначе, хотя на самом деле, вариантов может быть бесконечное множество, надо только искать и делать! И все получится! И если кто-то говорит что что-то невозможно, он явно врет:) Любая задача имеет решения, надо только не терять надежды и не выстраивать самому себе в голове барьеров по ее решению. </font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt; text-align: justify"><o:p><font face="Times New Roman" size="3">&nbsp;</font></o:p></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt; text-align: justify"><font face="Times New Roman" size="3">В Астрахани меня также встретил главный представитель <span lang="EN-US" style="mso-ansi-language: EN-US">Encounter</span><span lang="EN-US"> </span>в Астрахани Алексей и его друзья Надя и Рамиль, у которого я и вписался на время пребывания в городе.</font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt; text-align: justify"><font face="Times New Roman" size="3">Мне устроили неординарную экскурсию по городу: мы поднялись на крышу 14-и этажки и смотрели на город с высоты птичьего полета:) Лазили по крышам как в детстве:)</font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt; text-align: justify"><font face="Times New Roman" size="3">Потом гуляли по набережной</font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt; text-align: justify"><font face="Times New Roman" size="3"><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150085553/xlarge/152666758.jpg" /></font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt; text-align: justify"><font size="3"><font face="Times New Roman">мимо памятника Петру <span lang="EN-US" style="mso-ansi-language: EN-US">I</span></font></font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt; text-align: justify"><font face="Times New Roman" size="3"><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150085553/xlarge/152666764.jpg" /></font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt; text-align: justify"><font face="Times New Roman" size="3">И фонтанов, один из которых музыкальный, меняет свои формы в такт играющей музыки</font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt; text-align: justify"><font face="Times New Roman" size="3"><img alt="" src="http://arioumine.users.photofile.ru/photo/arioumine/150085553/xlarge/152666779.jpg" /></font></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt; text-align: justify"><i style="mso-bidi-font-style: normal"><font size="3"><font face="Times New Roman">(слева на право: Леха, Надя и Я)<o:p></o:p></font></font></i></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt; text-align: justify"><i style="mso-bidi-font-style: normal"><o:p><font face="Times New Roman" size="3">&nbsp;</font></o:p></i></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 27pt; text-align: justify"><font size="3"><font face="Times New Roman">Завтра я выдвигаюсь в Казахстан, где начинается основная по трудности и, надеюсь, по объему впечатлений, часть моей экспедиции. Позади остались 2 месяца тренировки.<i style="mso-bidi-font-style: normal"><o:p></o:p></i></font></font></p> http://alex-ryumin.livejournal.com/8964.html Азия Китай Казахстан путешествия Монголия велопутешествие Астрахань ТрансЕвразия sony trek Европа public 9 XML-Fast-0.17/t/reports/04.xml000644 000766 000024 00000121456 13123552546 016041 0ustar00monsstaff000000 000000 Yuliya Ruzhechka journal http://alitoit-looloo.livejournal.com/ Yuliya Ruzhechka journal - LiveJournal.com Fri, 30 Jul 2010 17:41:01 GMT LiveJournal / LiveJournal.com alitoit_looloo 8105871 personal http://l-userpic.livejournal.com/50023361/8105871 Yuliya Ruzhechka journal http://alitoit-looloo.livejournal.com/ 90 100 http://alitoit-looloo.livejournal.com/114382.html Fri, 30 Jul 2010 17:41:01 GMT http://alitoit-looloo.livejournal.com/114382.html <a href="http://s278.photobucket.com/albums/kk107/Ruzhechka/?action=view&amp;current=kup_zhzh_01.jpg" target="_blank"><img src="http://i278.photobucket.com/albums/kk107/Ruzhechka/kup_zhzh_01.jpg" border="0" alt="Photobucket"></a> http://alitoit-looloo.livejournal.com/114382.html photo public 0 http://alitoit-looloo.livejournal.com/114059.html Sun, 25 Jul 2010 23:55:37 GMT http://alitoit-looloo.livejournal.com/114059.html &nbsp;выходные были рабочими <strike>(неужели и суббота, и воскресенье уже успели пройти?.)</strike>, чему и рада :)&nbsp; <br /><a target="_blank" href="http://s278.photobucket.com/albums/kk107/Ruzhechka/?action=view&amp;current=zhara_zhzh_01.jpg"><img alt="Photobucket" border="0" src="http://i278.photobucket.com/albums/kk107/Ruzhechka/zhara_zhzh_01.jpg" /> <br /></a> <br /> <br />в фонтане творилось нечто мега-позитивное и мега-мокрое. люди с ведёрками и водяными пистолетами пугали (читай,&nbsp;обливали) прохожих, обливали друг друга, кидали (или сами кидались?)) в фонтан, так что площадка вокруг фонтана быстро превратилась в большую лужу. а там и до речки было уже недалеко..<br />а у персонажа на фотографии кроме красного зонтика были ещё очки для подводного плаванья) http://alitoit-looloo.livejournal.com/114059.html photo public 4 http://alitoit-looloo.livejournal.com/113553.html Fri, 23 Jul 2010 12:29:43 GMT пятничный юмор=) http://alitoit-looloo.livejournal.com/113553.html &nbsp;Если вы на свою свадьбу <br />Оператора позвали <br />И фотографа к тому же, <br />И ведущего еще, <br />То кормить их всех не надо - <br />Обойдутся троглодиты, <br />Вы им деньги заплатили, <br />Пусть питаются на них. <br />Даже стульев им не ставьте, <br />Отдыхать они не любят, <br />Это ж роботы, не люди! <br />У них в пузе батарейки, <br />Запасные в рюкзаках. <br />В перерывах они тихо <br />Постоят в тени у стенки. <br />Ну, а если будут падать <br />От усталости внезапно, <br />Подойдите и смотрите <br />На них грозно сверху вниз. <br />И скажите: &quot;Что такое? <br />Ну-ка, встаньте-ка сейчас же! <br />Вы чего тут развалились, <br />Я ведь деньги вам плачу!&quot; <br />И они, конечно, встанут <br />И пойдут работать дальше. <br />Все равно их не кормите, <br />Обойдутся как-нибудь.. <br />А еще их в ресторане <br />Отгоняйте от розеток, <br />Чтоб они не заряжали <br />Батарейки там свои.<br />И конечно же, в итоге <br />Попросите скинуть равы <br />Хоть они и не нужны вам, <br />Все равно пусть отдают<br />И потребуйте отдачу <br />Материала прям на завтра, <br />Потому как улетает <br />Дядя Коля через день.<br />Если утром ваш фотограф, <br />Обнаглев, полезет с просьбой: <br />&quot;Позовите, когда платье <br />Вы начнете надевать&quot;,<br />Вы пощечину влепите, <br />И маманю позовите, <br />Ишь, удумал, окаянный! <br />Вон из комнаты, пошляк!!!<br />Берегите пуще глаза <br />От фотографов подвязку! <br />Обожают извращенцы <br />Фоткать свадебный интим!<br />А еще смотрите, туфли <br />Чтоб не брали из коробки! <br />Вам потом носить те туфли. <br />Вдруг там мало ли чего!<br />На прогулке заявите: <br />&quot;Нам невесту на ладошке, <br />Жениха нам на букете <br />Не забудьте поснимать&quot;.<br />Ну, а если вдруг фотограф <br />Или, может, оператор <br />Отказался снять такое, <br />Плюньте на спину ему.<br />Пусть снимают дублей двести, <br />Ну, а лучше, если триста, <br />Как вы тянитесь к букету <br />Напряженно над капотом.<br />А еще гостям скажите,<br />У которых есть зеркалки, <br />Чтоб фотографу закрыли <br />С места классного обзор.<br />Потому что ваши гости <br />Снимут круче раз так в тыщи, <br />А фотограф облажался, <br />Чё за спины наснимал?<br />Если с марком гость явился <br />Или вдруг пятак имеет, <br />А фотограф заявился <br />На D сорок поснимать,<br />Не забудьте вашим марком <br />Да с нацепленною элькой <br />Перед носом у бедняги <br />Влево-вправо помахать.<br />И, конечно, не забудьте, <br />Что фотографа услуги <br />Стоят максимум три тыщи: <br />В загсе больше не берут!!! <br />А снимают ведь не хуже <br />И работают там быстро, <br />И на фотках у них резко <br />И красиво все стоят. <br />И не верьте вы пройдохам <br />Тем особенно с Майведа, <br />Что они, мол, креатива <br />Вам наделают с душой. <br />Но вы только посмотрите, <br />У одних из них все жёлто, <br />У других же все не резко, <br />Не умеют они фоткать, <br />Денег ваших лишь хотят.<br />Ну а если ваш фотограф <br />Наснимал так, что на фоне <br />Все размыто, все не резко, <br />Ну а если крупным планом - <br />Резкий только правый глаз<br />Покажите ему фотки, <br />Что снимала тетя Галя. <br />Резкий там даже окурок, <br />Что лежал за 30 метров.<br />Объясните шарлатану - <br />не умеет он снимать. http://alitoit-looloo.livejournal.com/113553.html public 16 http://alitoit-looloo.livejournal.com/112786.html Thu, 15 Jul 2010 22:34:52 GMT http://alitoit-looloo.livejournal.com/112786.html &nbsp;<br /> <a target="_blank" href="http://s278.photobucket.com/albums/kk107/Ruzhechka/?action=view&amp;current=zhzh_pod_01.jpg"><img alt="Photobucket" border="0" src="http://i278.photobucket.com/albums/kk107/Ruzhechka/zhzh_pod_01.jpg" /><br /><br /></a>&nbsp;мирное и позитивное мероприятие в Беларуси,&nbsp;оказывается,&nbsp;незаконное,&nbsp;несанкционированное и вообще &quot;здесь нельзя собираться!&quot; <br />но бой подушками в честь 600-летия Грюнвальдской битвы состоялся. благодаря толковым инициаторам. кого-то на подходе забрали дяди в форме,&nbsp;они же постоянно говорили о том,&nbsp;что всё это незаконно и все могут быть задержаны, одного из организаторов будут завтра (то есть уже сегодня) судить... наверное,&nbsp;самое подходящее для этого слово - &quot;обидно&quot;. обидно за страну,&nbsp;где нельзя веселиться и собираться вместе,&nbsp;если на то нет приказа или как минимум разрешения. http://alitoit-looloo.livejournal.com/112786.html photo public 5 http://alitoit-looloo.livejournal.com/112386.html Sun, 11 Jul 2010 17:17:02 GMT http://alitoit-looloo.livejournal.com/112386.html про небо и тех, кто верит в то,&nbsp;что люди тоже летают<br /><a target="_blank" href="http://s278.photobucket.com/albums/kk107/Ruzhechka/?action=view&amp;current=air_zhzh_1.jpg"><img alt="Photobucket" border="0" src="http://i278.photobucket.com/albums/kk107/Ruzhechka/air_zhzh_1.jpg" /></a> <br /> <br />слёт воздухоплавателей недалеко от Минска. ещё картинки можно посмотреть <a href="http://gazetaby.com/index.php?sn_nid=29973&amp;sn_cat=41">здесь</a>. <br /> <br /><a target="_blank" href="http://s278.photobucket.com/albums/kk107/Ruzhechka/?action=view&amp;current=air_zhzh_2.jpg"><img alt="Photobucket" border="0" src="http://i278.photobucket.com/albums/kk107/Ruzhechka/air_zhzh_2.jpg" /></a> http://alitoit-looloo.livejournal.com/112386.html photo Piazzolla Piazzolla public 0 http://alitoit-looloo.livejournal.com/112144.html Sat, 03 Jul 2010 11:10:10 GMT http://alitoit-looloo.livejournal.com/112144.html <a target="_blank" href="http://s278.photobucket.com/albums/kk107/Ruzhechka/?action=view&amp;current=art_zhzh_1.jpg"><img alt="Photobucket" border="0" src="http://i278.photobucket.com/albums/kk107/Ruzhechka/art_zhzh_1.jpg" /></a> <br /> <br />&nbsp;В Минске открылась новая галерея. Креативно,&nbsp;с добрыми целями и отличной выставкой. <br />почитать про енто можно <a href="http://gazetaby.com/index.php?sn_nid=29780&amp;sn_cat=35">здесь</a>, посетить точно стоит:) http://alitoit-looloo.livejournal.com/112144.html photo public 0 http://alitoit-looloo.livejournal.com/112102.html Wed, 30 Jun 2010 20:01:45 GMT http://alitoit-looloo.livejournal.com/112102.html <span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;; mso-fareast-font-family:&quot;Times New Roman&quot;;letter-spacing:-.05pt;mso-ansi-language: RU;mso-fareast-language:RU;mso-bidi-language:AR-SA">&quot;Душевно здоров тот, </span><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;; mso-fareast-font-family:&quot;Times New Roman&quot;;letter-spacing:.05pt;mso-ansi-language: RU;mso-fareast-language:RU;mso-bidi-language:AR-SA">кто находится в душевном равновесии и </span><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;;mso-fareast-font-family: &quot;Times New Roman&quot;;letter-spacing:.3pt;mso-ansi-language:RU;mso-fareast-language: RU;mso-bidi-language:AR-SA">хорошо себя чувствует. Такое состояние не есть, однако, состояние, которое двигало бы </span><span style="font-size:12.0pt; font-family:&quot;Times New Roman&quot;;mso-fareast-font-family:&quot;Times New Roman&quot;; mso-ansi-language:RU;mso-fareast-language:RU;mso-bidi-language:AR-SA">человека на великие дела.&quot;<br />Эрнст Кречмер<br /></span> http://alitoit-looloo.livejournal.com/112102.html public 2 http://alitoit-looloo.livejournal.com/111726.html Tue, 29 Jun 2010 20:01:51 GMT так мило http://alitoit-looloo.livejournal.com/111726.html <lj-embed id="2" /> http://alitoit-looloo.livejournal.com/111726.html public 2 http://alitoit-looloo.livejournal.com/111364.html Mon, 28 Jun 2010 09:10:17 GMT http://alitoit-looloo.livejournal.com/111364.html <a target="_blank" href="http://s278.photobucket.com/albums/kk107/Ruzhechka/?action=view&amp;current=zhzh_b2g.jpg"><img alt="Photobucket" border="0" src="http://i278.photobucket.com/albums/kk107/Ruzhechka/zhzh_b2g.jpg" /></a> <br /> <br />Be2Gether. крем от загара и минимум одежды в этом году вытеснили дождевики и резиновые сапоги:) а хорошая погода не способствовала трудовым подвигам:) приятно просыпаться от того, что возле соседних палаток кто-то играет на гитаре Knocking on heaven's door, валяться под солнцем, слушая джаз, гулять и разглядывать всё вокруг,&nbsp;разговаривать часами ночью, видеть радостные лица и улыбаться.&nbsp;<br /> <br /><a target="_blank" href="http://s278.photobucket.com/albums/kk107/Ruzhechka/?action=view&amp;current=zhzh_b2g_2.jpg"><img alt="Photobucket" border="0" src="http://i278.photobucket.com/albums/kk107/Ruzhechka/zhzh_b2g_2.jpg" /></a> http://alitoit-looloo.livejournal.com/111364.html photo public 4 http://alitoit-looloo.livejournal.com/111131.html Wed, 23 Jun 2010 19:32:02 GMT http://alitoit-looloo.livejournal.com/111131.html <a target="_blank" href="http://s278.photobucket.com/albums/kk107/Ruzhechka/?action=view&amp;current=kupalle_zhzh1.jpg"><img alt="Photobucket" border="0" src="http://i278.photobucket.com/albums/kk107/Ruzhechka/kupalle_zhzh1.jpg" /></a> <br />так странно,&nbsp;когда день из 24 часа вырастает в 48 часов и больше. работы,&nbsp;учёбы,&nbsp;мыслей. но не сна. <br />погодка осенняя. состояние между Купалье и Be2Gether странное. как говорится,&nbsp;резиновые сапожки и дождевики упакованы, состояние странное (не плохое, не хорошее,&nbsp;а,&nbsp;<strike>выражаясь чужими словами, &quot;и так, и так&quot;,</strike>&nbsp;именно странное). http://alitoit-looloo.livejournal.com/111131.html мысли photo public 5 http://alitoit-looloo.livejournal.com/111093.html Tue, 22 Jun 2010 09:12:49 GMT http://alitoit-looloo.livejournal.com/111093.html <a target="_blank" href="http://s278.photobucket.com/albums/kk107/Ruzhechka/?action=view&amp;current=zhzh_03.jpg"><img alt="Photobucket" border="0" src="http://i278.photobucket.com/albums/kk107/Ruzhechka/zhzh_03.jpg" /></a> <br /> <br /><a target="_blank" href="http://s278.photobucket.com/albums/kk107/Ruzhechka/?action=view&amp;current=zhzh_01.jpg"><img alt="Photobucket" border="0" src="http://i278.photobucket.com/albums/kk107/Ruzhechka/zhzh_01.jpg" /></a> <br /> <br />я тут снимаю красивые концерты, ем вредную еду и сню сны, которые тяжело отделить от реальности. а что у вас?&nbsp; http://alitoit-looloo.livejournal.com/111093.html photo Gidon Kremer "Cafe 1930" Gidon Kremer "Cafe 1930" public 17 http://alitoit-looloo.livejournal.com/110810.html Sat, 19 Jun 2010 11:50:04 GMT http://alitoit-looloo.livejournal.com/110810.html <a target="_blank" href="http://s278.photobucket.com/albums/kk107/Ruzhechka/?action=view&amp;current=igor_jankovsky.jpg"><img alt="Photobucket" border="0" src="http://i278.photobucket.com/albums/kk107/Ruzhechka/igor_jankovsky.jpg" /></a> <br />Игорь Янковский http://alitoit-looloo.livejournal.com/110810.html фото photo Gidon Kremer Gidon Kremer public 0 http://alitoit-looloo.livejournal.com/110401.html Thu, 17 Jun 2010 12:44:34 GMT http://alitoit-looloo.livejournal.com/110401.html &nbsp;когда истекают все сроки ожиданий,&nbsp;волнение, когда-то сошедшее на нет,&nbsp;возвращается волнообразно. думаешь,&nbsp;стараешься концентрироваться на другом,&nbsp;но иногда ловишь себя на том,&nbsp;что уже несколько минут медитативно смотришь на страницу с почтой. и начинаешь смеяться.<br />всё в мире появляется в самый нужный и подходящий момент, когда человек к этому готов.&nbsp; http://alitoit-looloo.livejournal.com/110401.html мысли public 0 http://alitoit-looloo.livejournal.com/110202.html Mon, 14 Jun 2010 18:07:47 GMT http://alitoit-looloo.livejournal.com/110202.html <a target="_blank" href="http://s278.photobucket.com/albums/kk107/Ruzhechka/?action=view&amp;current=noch.jpg"><img alt="Photobucket" border="0" src="http://i278.photobucket.com/albums/kk107/Ruzhechka/noch.jpg" /></a> http://alitoit-looloo.livejournal.com/110202.html photo public 0 http://alitoit-looloo.livejournal.com/109824.html Sun, 13 Jun 2010 00:33:11 GMT http://alitoit-looloo.livejournal.com/109824.html ливень,&nbsp;ночь и Bonobo. прекрасно ведь.&nbsp; http://alitoit-looloo.livejournal.com/109824.html Bonobo Bonobo public 0 http://alitoit-looloo.livejournal.com/109671.html Sat, 12 Jun 2010 13:20:58 GMT http://alitoit-looloo.livejournal.com/109671.html <a target="_blank" href="http://s278.photobucket.com/albums/kk107/Ruzhechka/?action=view&amp;current=kozy_1.jpg"><img alt="Photobucket" border="0" src="http://i278.photobucket.com/albums/kk107/Ruzhechka/kozy_1.jpg" /></a> http://alitoit-looloo.livejournal.com/109671.html photo public 6 http://alitoit-looloo.livejournal.com/109341.html Wed, 02 Jun 2010 21:59:33 GMT http://alitoit-looloo.livejournal.com/109341.html <a target="_blank" href="http://s278.photobucket.com/albums/kk107/Ruzhechka/?action=view&amp;current=zhzh_1-13.jpg"><img alt="Photobucket" border="0" src="http://i278.photobucket.com/albums/kk107/Ruzhechka/zhzh_1-13.jpg" /></a> <br /> <br />Sweden-Belarus. 1:0 http://alitoit-looloo.livejournal.com/109341.html photo Bonobo Bonobo public 0 http://alitoit-looloo.livejournal.com/109279.html Wed, 02 Jun 2010 10:07:27 GMT http://alitoit-looloo.livejournal.com/109279.html <a target="_blank" href="http://s278.photobucket.com/albums/kk107/Ruzhechka/?action=view&amp;current=dakota_01.jpg"><img alt="Photobucket" border="0" src="http://i278.photobucket.com/albums/kk107/Ruzhechka/dakota_01.jpg" /><br /></a> Дакота http://alitoit-looloo.livejournal.com/109279.html photo Richard Cheese Richard Cheese public 2 http://alitoit-looloo.livejournal.com/108834.html Sun, 30 May 2010 15:23:30 GMT special Sunday feelings http://alitoit-looloo.livejournal.com/108834.html <a target="_blank" href="http://s278.photobucket.com/albums/kk107/Ruzhechka/?action=view&amp;current=ka_01.jpg"><img alt="Photobucket" border="0" src="http://i278.photobucket.com/albums/kk107/Ruzhechka/ka_01.jpg" /></a> <br /> <a name="cutid1"></a><br /><a target="_blank" href="http://s278.photobucket.com/albums/kk107/Ruzhechka/?action=view&amp;current=ka_02.jpg"><img alt="Photobucket" border="0" src="http://i278.photobucket.com/albums/kk107/Ruzhechka/ka_02.jpg" /></a> <br /> <br /><a target="_blank" href="http://s278.photobucket.com/albums/kk107/Ruzhechka/?action=view&amp;current=ka_03.jpg"><img alt="Photobucket" border="0" src="http://i278.photobucket.com/albums/kk107/Ruzhechka/ka_03.jpg" /></a><a name='cutid1-end'></a> http://alitoit-looloo.livejournal.com/108834.html photo public 2 http://alitoit-looloo.livejournal.com/108627.html Sun, 30 May 2010 15:19:54 GMT http://alitoit-looloo.livejournal.com/108627.html <a target="_blank" href="http://s278.photobucket.com/albums/kk107/Ruzhechka/?action=view&amp;current=ve_01.jpg"><img alt="Photobucket" border="0" src="http://i278.photobucket.com/albums/kk107/Ruzhechka/ve_01.jpg" /></a> <br />Вера Брежнева.&nbsp; http://alitoit-looloo.livejournal.com/108627.html photo Nouvelle Vague "In a manner of speaking' Nouvelle Vague "In a manner of speaking' public 7 http://alitoit-looloo.livejournal.com/108506.html Fri, 28 May 2010 18:08:02 GMT http://alitoit-looloo.livejournal.com/108506.html <a target="_blank" href="http://s278.photobucket.com/albums/kk107/Ruzhechka/?action=view&amp;current=basket_01.jpg"><img alt="Photobucket" border="0" src="http://i278.photobucket.com/albums/kk107/Ruzhechka/basket_01.jpg" /></a> http://alitoit-looloo.livejournal.com/108506.html photo public 0 http://alitoit-looloo.livejournal.com/108178.html Mon, 24 May 2010 16:50:33 GMT http://alitoit-looloo.livejournal.com/108178.html <a target="_blank" href="http://s278.photobucket.com/albums/kk107/Ruzhechka/?action=view&amp;current=vilnius.jpg"><img alt="Photobucket" border="0" src="http://i278.photobucket.com/albums/kk107/Ruzhechka/vilnius.jpg" /></a> <br /> <br /><p class="MsoNormal"><p class="MsoNormal">&nbsp; <em><span style="font-size:smaller;">&nbsp; Воротишься на родину. Ну что ж.</span></em></p><p class="MsoNormal"><em><span style="font-size:smaller;"><span style="mso-spacerun:yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>Гляди вокруг, кому еще ты нужен,</span></em></p><p class="MsoNormal"><em><span style="font-size:smaller;"><span style="mso-spacerun:yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>кому теперь в друзья ты попадешь?</span></em></p><p class="MsoNormal"><em><span style="font-size:smaller;"><span style="mso-spacerun:yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>Воротишься, купи себе на ужин</span></em></p><p class="MsoNormal"><o:p><em><span style="font-size:smaller;">&nbsp;</span></em></o:p></p><p class="MsoNormal"><em><span style="font-size:smaller;"><span style="mso-spacerun:yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>какого-нибудь сладкого вина,</span></em></p><p class="MsoNormal"><em><span style="font-size:smaller;"><span style="mso-spacerun:yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>смотри в окно и думай понемногу:</span></em></p><p class="MsoNormal"><em><span style="font-size:smaller;"><span style="mso-spacerun:yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>во всем твоя одна, твоя вина,</span></em></p><p class="MsoNormal"><em><span style="font-size:smaller;"><span style="mso-spacerun:yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>и хорошо. Спасибо. Слава Богу.</span></em></p><p class="MsoNormal"><o:p><em><span style="font-size:smaller;">&nbsp;</span></em></o:p></p><p class="MsoNormal"><em><span style="font-size:smaller;"><span style="mso-spacerun:yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>Как хорошо, что некого винить,</span></em></p><p class="MsoNormal"><em><span style="font-size:smaller;"><span style="mso-spacerun:yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>как хорошо, что ты никем не связан,</span></em></p><p class="MsoNormal"><em><span style="font-size:smaller;"><span style="mso-spacerun:yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>как хорошо, что до смерти любить</span></em></p><p class="MsoNormal"><em><span style="font-size:smaller;"><span style="mso-spacerun:yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>тебя никто на свете не обязан.</span></em></p><p class="MsoNormal"><o:p><em><span style="font-size:smaller;">&nbsp;</span></em></o:p></p><p class="MsoNormal"><em><span style="font-size:smaller;"><span style="mso-spacerun:yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>Как хорошо, что никогда во тьму</span></em></p><p class="MsoNormal"><em><span style="font-size:smaller;"><span style="mso-spacerun:yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>ничья рука тебя не провожала,</span></em></p><p class="MsoNormal"><em><span style="font-size:smaller;"><span style="mso-spacerun:yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>как хорошо на свете одному</span></em></p><p class="MsoNormal"><em><span style="font-size:smaller;"><span style="mso-spacerun:yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>идти пешком с шумящего вокзала.</span></em></p><p class="MsoNormal"><o:p><em><span style="font-size:smaller;">&nbsp;</span></em></o:p></p><p class="MsoNormal"><em><span style="font-size:smaller;"><span style="mso-spacerun:yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>Как хорошо, на родину спеша,</span></em></p><p class="MsoNormal"><em><span style="font-size:smaller;"><span style="mso-spacerun:yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>поймать себя в словах неоткровенных</span></em></p><p class="MsoNormal"><em><span style="font-size:smaller;"><span style="mso-spacerun:yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>и вдруг понять, как медленно душа</span></em></p><p class="MsoNormal"><em><span style="font-size:smaller;"><span style="mso-spacerun:yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>заботится о новых переменах.</span></em></p><em><span style="font-size:smaller;"> <span style="mso-spacerun:yes">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></em></p><p class="MsoNormal"><em><span style="font-size:smaller;"><span style="mso-spacerun:yes">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>Иосиф Бродский</span></em> <br />&nbsp;</p> <br /> &nbsp; http://alitoit-looloo.livejournal.com/108178.html Tom Waits Tom Waits public 6 http://alitoit-looloo.livejournal.com/107921.html Tue, 11 May 2010 06:54:41 GMT прыходзьце :) http://alitoit-looloo.livejournal.com/107921.html Падведзены вынікі &quot;Прэс-фота Беларусі 2010&quot;&nbsp;<br /><br />Цырымонія ўзнагароджання адбудзецца 12 траўня ў 17.00 у НВЦ &laquo;Белэкспа&raquo; &mdash; вул. Я.Купалы, 27.<br /><br />Там жа будзе працаваць выстава лепшых здымкаў па выніках конкурсу. <br /><br />Удзел у &quot;Прэс-фота Беларусі 2010&quot; прынялі 96 беларускіх фатографаў, што працуюць у нацыянальных і замежных СМІ. На конкурс было даслана 1200 працаў - адзінкавых фота і серыяў. http://alitoit-looloo.livejournal.com/107921.html public 0 http://alitoit-looloo.livejournal.com/107744.html Thu, 06 May 2010 21:19:48 GMT Мельница моды 2010 http://alitoit-looloo.livejournal.com/107744.html <a target="_blank" href="http://s278.photobucket.com/albums/kk107/Ruzhechka/?action=view&amp;current=zhzh_1_m.jpg"><img alt="Photobucket" border="0" src="http://i278.photobucket.com/albums/kk107/Ruzhechka/zhzh_1_m.jpg" /></a><a name="cutid1"></a><br /><br /> <a target="_blank" href="http://s278.photobucket.com/albums/kk107/Ruzhechka/?action=view&amp;current=zhzh_3_m.jpg"><img alt="Photobucket" border="0" src="http://i278.photobucket.com/albums/kk107/Ruzhechka/zhzh_3_m.jpg" /></a><br /><br /> <a target="_blank" href="http://s278.photobucket.com/albums/kk107/Ruzhechka/?action=view&amp;current=zhzh_2_m.jpg"><img alt="Photobucket" border="0" src="http://i278.photobucket.com/albums/kk107/Ruzhechka/zhzh_2_m.jpg" /></a><a name='cutid1-end'></a> http://alitoit-looloo.livejournal.com/107744.html photo Tom Waits Tom Waits public 10 http://alitoit-looloo.livejournal.com/107302.html Wed, 05 May 2010 18:11:36 GMT http://alitoit-looloo.livejournal.com/107302.html <a href="http://s278.photobucket.com/albums/kk107/Ruzhechka/?action=view&amp;current=zhzh_1-12.jpg" target="_blank"><img src="http://i278.photobucket.com/albums/kk107/Ruzhechka/zhzh_1-12.jpg" border="0" alt="Karakuli theatre"></a> презентация театра танца "Каракули" http://alitoit-looloo.livejournal.com/107302.html photo Regina Spektor Regina Spektor public 0 XML-Fast-0.17/t/reports/05.xml000644 000766 000024 00000000004 13123552546 016023 0ustar00monsstaff000000 000000 XML-Fast-0.17/t/badxml/01.xml000644 000766 000024 00000000021 13123552546 015567 0ustar00monsstaff000000 000000 XML-Fast-0.17/t/badxml/02.xml000644 000766 000024 00000000156 13123552546 015601 0ustar00monsstaff000000 000000 XML-Fast-0.17/lib/XML/000755 000766 000024 00000000000 13125303577 014330 5ustar00monsstaff000000 000000 XML-Fast-0.17/lib/XML/Fast.pm000644 000766 000024 00000012531 13125303564 015561 0ustar00monsstaff000000 000000 package XML::Fast; use 5.008008; use strict; use warnings;no warnings 'uninitialized'; use Encode; use base 'Exporter'; our @EXPORT_OK = our @EXPORT = qw( xml2hash hash2xml ); our $VERSION = '0.17'; use XSLoader; XSLoader::load('XML::Fast', $VERSION); sub xml2hash($;%) { my $xml = shift; my %args = ( order => 0, # not impl attr => '-', # ok text => '#text', # ok join => '', # ok trim => 1, # ok cdata => undef, # ok + fallback -> text comm => undef, # ok @_ ); _xml2hash($xml,\%args); } sub hash2xml($;%) { my $xml = shift; my %args = ( order => 0, # not impl attr => '-', # ok text => '#text', # ok join => '', # ok trim => 1, # ok cdata => undef, # ok + fallback -> text comm => undef, # ok @_ ); _hash2xml($xml,\%args); } 1; __END__ =head1 NAME XML::Fast - Simple and very fast XML - hash conversion =head1 SYNOPSIS use XML::Fast; my $hash = xml2hash $xml; my $hash2 = xml2hash $xml, attr => '.', text => '~'; =head1 DESCRIPTION This module implements simple, state machine based, XML parser written in C. It could parse and recover some kind of broken XML's. If you need XML validator, use L =head1 RATIONALE Another similar module is L. I've used it for some time, but it have some failures: =over 4 =item * If your XML have node with TextNode, then CDATANode, then again TextNode, you'll got broken value =item * It doesn't support charsets =item * It doesn't support any kind of entities. =back So, after count of tries to fix L I've decided to write parser from scratch. Here is some features and principles: =over 4 =item * It uses minimal count of memory allocations. =item * All XML is parsed in 1 scan. =item * All values are copied from source XML only once (to destination keys/values) =item * If some types of nodes (for ex comments) are ignored, there are no memory allocations/copy for them. =back I've removed benchmark results, since they are very different for different xml's. Sometimes XML::Bare is faster, sometimes not. So, XML::Fast mainly should be considered not C, but C =head1 EXPORT =head2 xml2hash $xml, [ %options ] =head2 hash2xml $hash, [ %options ] =head1 OPTIONS =over 4 =item order [ = 0 ] B. B keep the output order. When enabled, structures become more complex, but xml could be completely reverted. =item attr [ = '-' ] Attribute prefix => { node => { -attr => "test" } } =item text [ = '#text' ] Key name for storing text When undef, text nodes will be ignored text => { node => { sub => '', '#text' => "test" } } =item join [ = '' ] Join separator for text nodes, splitted by subnodes Ignored when C in effect # default: xml2hash( 'Test1Test2' ) : { item => { sub => '', '~' => 'Test1Test2' } }; xml2hash( 'Test1Test2', join => '+' ) : { item => { sub => '', '~' => 'Test1+Test2' } }; =item trim [ = 1 ] Trim leading and trailing whitespace from text nodes =item cdata [ = undef ] When defined, CDATA sections will be stored under this key # cdata = undef => { node => 'test' } # cdata = '#' => { node => { '#' => 'test' } } =item comm [ = undef ] When defined, comments sections will be stored under this key When undef, comments will be ignored # comm = undef => { node => { sub => '' } } # comm = '/' => { node => { sub => '', '/' => 'comm' } } =item array => 1 Force all nodes to be kept as arrays. # no array => { node => { sub => '' } } # array = 1 => { node => [ { sub => [ '' ] } ] } =item array => [ 'node', 'names'] Force nodes with names to be stored as arrays # no array => { node => { sub => '' } } # array => ['sub'] => { node => { sub => [ '' ] } } =item utf8decode => 1 Force decoding of utf8 sequences, instead of just upgrading them (may be useful for broken xml) =back =head1 SEE ALSO =over 4 =item * L Another fast parser =item * L The most powerful XML parser for perl. If you don't need to parse gigabytes of XML ;) =item * L XML parser, that uses L for parsing and then constructs hash structure, identical to one, generated by this module. (At least, it should ;)). But of course it is much more slower, than L =back =head1 LIMITATIONS =over 4 =item * Does not support wide charsets (UTF-16/32) (see L) =back =head1 TODO =over 4 =item * Ordered mode (as implemented in L) =item * Create hash2xml, identical to one in L =item * Partial content event-based parsing (I need this for reading XML streams) =back Patches, propositions and bug reports are welcome ;) =head1 AUTHOR Mons Anderson, Emons@cpan.orgE =head1 COPYRIGHT AND LICENSE Copyright (C) 2010 Mons Anderson This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut