#include <stdio.h>
#include <string.h>

typedef struct {
  	char *protocol;
  	char *username;
  	char *password;
  	char *host;
  	char *port;
  	char *path;
} url_t;


int urlparse(char *url, url_t *tokens) {
  
  /* return value -1 on invalid URL  */
  
  char *p;
/*  
  tokens->protocol = NULL;
  tokens->username = NULL;
  tokens->password = NULL;
  tokens->host     = NULL;
  tokens->port     = NULL;
  tokens->path     = NULL;
*/
  
  bzero(tokens, sizeof(url_t));
  
  /* URL format: protocol://username:password@host/path */
  
  /* first lets check if we have a protocol */

  if ((p = strstr(url,"://")) == NULL) {
    /* no url */
    return -1;
  }

  /* set pointer at protocol */
  *p = 0;
  tokens->protocol = url;
  p += 3;
  url = p;
  
  /* check if we have a username:password */
  if (strchr(p,'@')) {
    /* we have a username:password */
    if ((p = strchr(p,':')) == NULL) {
      /* no separator for user:pass */
      return -1;
    }
    *p = 0;
    /* set pointer at username */
    tokens->username = url;
    p++;
    url = p;
    
    /* no need to check for return value NULL from strchr here */
    p = strchr(p,'@');
    *p = 0;
    /* set pointer at password */
    tokens->password = url;
    p++;
    url = p;
  }
   
  /* set pointer at hostname */
  
  tokens->host = url;
  
  /* check for port */
  if (p = strchr(url,':')) {
    *p = 0;
    p++;
    url = p;
    /* set pointer at port */
    tokens->port = url;
  }
  
  if (p = strchr(url,'/')) {
    *p = 0;
    p++;
    if (*p != 0) {
      url = p;
      /* set pointer at path */
      tokens->path = url;
    }
  }

  return 0; 

}

int main(int argc, char **argv) {

  url_t  urltok;
  url_t  *urltp;

  urltp = &urltok;
  
  if (argc < 2) {
    printf("%s <url>\n",argv[0]);
    exit(0);
  }
 
  urlparse(argv[1],urltp);
  
  printf("protocol: %s\n",urltp->protocol);
  printf("username: %s\n",urltp->username);
  printf("password: %s\n",urltp->password);
  printf("host    : %s\n",urltp->host);
  printf("port    : %s\n",urltp->port);
  printf("path    : %s\n",urltp->path);

  return 0;
  
}
  

