void av_url_split(char *proto, int proto_size,

                  char *authorization, int authorization_size,

                  char *hostname, int hostname_size,

                  int *port_ptr,

                  char *path, int path_size,

                  const char *url)

{

    const char *p, *ls, *ls2, *at, *col, *brk;



    if (port_ptr)               *port_ptr = -1;

    if (proto_size > 0)         proto[0] = 0;

    if (authorization_size > 0) authorization[0] = 0;

    if (hostname_size > 0)      hostname[0] = 0;

    if (path_size > 0)          path[0] = 0;



    /* parse protocol */

    if ((p = strchr(url, ':'))) {

        av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));

        p++; /* skip ':' */

        if (*p == '/') p++;

        if (*p == '/') p++;

    } else {

        /* no protocol means plain filename */

        av_strlcpy(path, url, path_size);

        return;

    }



    /* separate path from hostname */

    ls = strchr(p, '/');

    ls2 = strchr(p, '?');

    if(!ls)

        ls = ls2;

    else if (ls && ls2)

        ls = FFMIN(ls, ls2);

    if(ls)

        av_strlcpy(path, ls, path_size);

    else

        ls = &p[strlen(p)]; // XXX



    /* the rest is hostname, use that to parse auth/port */

    if (ls != p) {

        /* authorization (user[:pass]@hostname) */

        if ((at = strchr(p, '@')) && at < ls) {

            av_strlcpy(authorization, p,

                       FFMIN(authorization_size, at + 1 - p));

            p = at + 1; /* skip '@' */

        }



        if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {

            /* [host]:port */

            av_strlcpy(hostname, p + 1,

                       FFMIN(hostname_size, brk - p));

            if (brk[1] == ':' && port_ptr)

                *port_ptr = atoi(brk + 2);

        } else if ((col = strchr(p, ':')) && col < ls) {

            av_strlcpy(hostname, p,

                       FFMIN(col + 1 - p, hostname_size));

            if (port_ptr) *port_ptr = atoi(col + 1);

        } else

            av_strlcpy(hostname, p,

                       FFMIN(ls + 1 - p, hostname_size));

    }

}

void av_url_split(char *proto, int proto_size,

                  char *authorization, int authorization_size,

                  char *hostname, int hostname_size,

                  int *port_ptr,

                  char *path, int path_size,

                  const char *url)

{

    const char *p, *ls, *ls2, *at, *col, *brk;



    if (port_ptr)               *port_ptr = -1;

    if (proto_size > 0)         proto[0] = 0;

    if (authorization_size > 0) authorization[0] = 0;

    if (hostname_size > 0)      hostname[0] = 0;

    if (path_size > 0)          path[0] = 0;



    

    if ((p = strchr(url, ':'))) {

        av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));

        p++; 

        if (*p == '/') p++;

        if (*p == '/') p++;

    } else {

        

        av_strlcpy(path, url, path_size);

        return;

    }



    

    ls = strchr(p, '/');

    ls2 = strchr(p, '?');

    if(!ls)

        ls = ls2;

    else if (ls && ls2)

        ls = FFMIN(ls, ls2);

    if(ls)

        av_strlcpy(path, ls, path_size);

    else

        ls = &p[strlen(p)]; 



    

    if (ls != p) {

        

        if ((at = strchr(p, '@')) && at < ls) {

            av_strlcpy(authorization, p,

                       FFMIN(authorization_size, at + 1 - p));

            p = at + 1; 

        }



        if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {

            

            av_strlcpy(hostname, p + 1,

                       FFMIN(hostname_size, brk - p));

            if (brk[1] == ':' && port_ptr)

                *port_ptr = atoi(brk + 2);

        } else if ((col = strchr(p, ':')) && col < ls) {

            av_strlcpy(hostname, p,

                       FFMIN(col + 1 - p, hostname_size));

            if (port_ptr) *port_ptr = atoi(col + 1);

        } else

            av_strlcpy(hostname, p,

                       FFMIN(ls + 1 - p, hostname_size));

    }

}

void FUNC_0(char *VAR_0, int VAR_1,

                  char *VAR_2, int VAR_3,

                  char *VAR_4, int VAR_5,

                  int *VAR_6,

                  char *VAR_7, int VAR_8,

                  const char *VAR_9)

{

    const char *VAR_10, *VAR_11, *VAR_12, *VAR_13, *VAR_14, *VAR_15;



    if (VAR_6)               *VAR_6 = -1;

    if (VAR_1 > 0)         VAR_0[0] = 0;

    if (VAR_3 > 0) VAR_2[0] = 0;

    if (VAR_5 > 0)      VAR_4[0] = 0;

    if (VAR_8 > 0)          VAR_7[0] = 0;



    

    if ((VAR_10 = strchr(VAR_9, ':'))) {

        av_strlcpy(VAR_0, VAR_9, FFMIN(VAR_1, VAR_10 + 1 - VAR_9));

        VAR_10++; 

        if (*VAR_10 == '/') VAR_10++;

        if (*VAR_10 == '/') VAR_10++;

    } else {

        

        av_strlcpy(VAR_7, VAR_9, VAR_8);

        return;

    }



    

    VAR_11 = strchr(VAR_10, '/');

    VAR_12 = strchr(VAR_10, '?');

    if(!VAR_11)

        VAR_11 = VAR_12;

    else if (VAR_11 && VAR_12)

        VAR_11 = FFMIN(VAR_11, VAR_12);

    if(VAR_11)

        av_strlcpy(VAR_7, VAR_11, VAR_8);

    else

        VAR_11 = &VAR_10[strlen(VAR_10)]; 



    

    if (VAR_11 != VAR_10) {

        

        if ((VAR_13 = strchr(VAR_10, '@')) && VAR_13 < VAR_11) {

            av_strlcpy(VAR_2, VAR_10,

                       FFMIN(VAR_3, VAR_13 + 1 - VAR_10));

            VAR_10 = VAR_13 + 1; 

        }



        if (*VAR_10 == '[' && (VAR_15 = strchr(VAR_10, ']')) && VAR_15 < VAR_11) {

            

            av_strlcpy(VAR_4, VAR_10 + 1,

                       FFMIN(VAR_5, VAR_15 - VAR_10));

            if (VAR_15[1] == ':' && VAR_6)

                *VAR_6 = atoi(VAR_15 + 2);

        } else if ((VAR_14 = strchr(VAR_10, ':')) && VAR_14 < VAR_11) {

            av_strlcpy(VAR_4, VAR_10,

                       FFMIN(VAR_14 + 1 - VAR_10, VAR_5));

            if (VAR_6) *VAR_6 = atoi(VAR_14 + 1);

        } else

            av_strlcpy(VAR_4, VAR_10,

                       FFMIN(VAR_11 + 1 - VAR_10, VAR_5));

    }

}

void FUNC_0(char *VAR_0, int VAR_1,
char *VAR_2, int VAR_3,
char *VAR_4, int VAR_5,
int *VAR_6,
char *VAR_7, int VAR_8,
const char *VAR_9)
{ const char *VAR_10, *VAR_11, *VAR_12, *VAR_13, *VAR_14, *VAR_15; if (VAR_6)               *VAR_6 = -1; if (VAR_1 > 0)         VAR_0[0] = 0; if (VAR_3 > 0) VAR_2[0] = 0; if (VAR_5 > 0)      VAR_4[0] = 0; if (VAR_8 > 0)          VAR_7[0] = 0; if ((VAR_10 = strchr(VAR_9, ':'))) { av_strlcpy(VAR_0, VAR_9, FFMIN(VAR_1, VAR_10 + 1 - VAR_9)); VAR_10++; if (*VAR_10 == '/') VAR_10++; if (*VAR_10 == '/') VAR_10++; } else { av_strlcpy(VAR_7, VAR_9, VAR_8); return; } VAR_11 = strchr(VAR_10, '/'); VAR_12 = strchr(VAR_10, '?'); if(!VAR_11)
VAR_11 = VAR_12; else if (VAR_11 && VAR_12)
VAR_11 = FFMIN(VAR_11, VAR_12); if(VAR_11)
av_strlcpy(VAR_7, VAR_11, VAR_8); else
VAR_11 = &VAR_10[strlen(VAR_10)]; if (VAR_11 != VAR_10) { if ((VAR_13 = strchr(VAR_10, '@')) && VAR_13 < VAR_11) { av_strlcpy(VAR_2, VAR_10,
FFMIN(VAR_3, VAR_13 + 1 - VAR_10)); VAR_10 = VAR_13 + 1; } if (*VAR_10 == '[' && (VAR_15 = strchr(VAR_10, ']')) && VAR_15 < VAR_11) { av_strlcpy(VAR_4, VAR_10 + 1,
FFMIN(VAR_5, VAR_15 - VAR_10)); if (VAR_15[1] == ':' && VAR_6)
*VAR_6 = atoi(VAR_15 + 2); } else if ((VAR_14 = strchr(VAR_10, ':')) && VAR_14 < VAR_11) { av_strlcpy(VAR_4, VAR_10,
FFMIN(VAR_14 + 1 - VAR_10, VAR_5)); if (VAR_6) *VAR_6 = atoi(VAR_14 + 1); } else av_strlcpy(VAR_4, VAR_10,
FFMIN(VAR_11 + 1 - VAR_10, VAR_5)); } }