pike.git / lib / modules / Protocols.pmod / Bittorrent.pmod / Bencoding.pmod

version» Context lines:

pike.git/lib/modules/Protocols.pmod/Bittorrent.pmod/Bencoding.pmod:1:   #pike __REAL_VERSION__      //! Decodes a Bittorrent bencoded data chunk.   //! @returns   //! @array   //! @elem string|int|array|mapping data - //! The decoded data. UNDEFINED if no data could be decoded. + //! The decoded data. @expr{0@} if no data could be decoded.   //! @elem string remainder   //! The trailing data that wasn't decoded.   //! @endarray   array(string|int|array|mapping) _decode(string what)   { -  if (what=="") return ({UNDEFINED,what}); +  if (what=="") return ({0,what});    if (what==0) error("Cannot decode 0 (zero)\n");       int i;    string s;       switch (what[0])    {    case 'i': // integer    if (sscanf(what,"i%de%s",i,what)<2) -  return ({UNDEFINED,what}); +  return ({0,what});    return ({i,what});       case '0'..'9': // string    if (sscanf(what,"%d:%s",i,s)<2 ||    strlen(s)<i) -  return ({UNDEFINED,what}); +  return ({0,what});    return ({s[..i-1],s[i..]});       case 'l': // list    array res=({});    s=what[1..];    while (s!="")    {    if (s[0]=='e')    return ({res,s[1..]});    array v=_decode(s);    if (v[1]==s)    break;    res+=v[..0];    s=v[1];    } -  return ({UNDEFINED,what}); +  return ({0,what});       case 'd': // dictionary    array keys=({});    array values=({});    s=what[1..];    while (s!="")    {    if (s[0]=='e') return ({mkmapping(keys,values),s[1..]});       array v=_decode(s);    if (v[1]==s) break;    keys+=v[..0];    s=v[1];       v=_decode(s);    if (v[1]==s) break;    values+=v[..0];    s=v[1];    } -  return ({UNDEFINED,what}); +  return ({0,what});       default:    error("Error in Bencoding: unknown prefix %O...\n",    what[..10]);    }   }      //! Decodes a Bittorrent bencoded data chunk and ignores the remaining - //! string. Returns UNDEFINED if the data is incomplete. + //! string. Returns @expr{UNDEFINED@} if the data is incomplete.   string|int|array|mapping decode(string what)   {    array v=_decode(what);    if (v[1]==what) return UNDEFINED;    return v[0];   }      //! Encodes a Bittorrent bencoded data chunk.   string encode(string|int|array|mapping data)   {