#include #include #include #include /* schemes are case sensitive but cononicals are lower case. domain is case insensitive. return it lowercased. port is optional and in decimal path scheme://username:password@domain:port/path?query_string#fragment_id mailto:username@domain optional stuff: scheme, username, password, port, path, query_string, fragment_id */ /* #define DEFAULT_SCHEME "http" #define DEFAULT_USERNAME "anonymous" #define DEFAULT_PASSWORD "anonymous" #define DEFAULT_PORT "80" #define DEFAULT_QUERY_STRING "" #define DEFAULT_FRAGMENT_ID "" #define DEFAULT_SCHEME "DEFAULT" #define DEFAULT_USERNAME "DEFAULT" #define DEFAULT_PASSWORD "DEFAULT" #define DEFAULT_PORT "DEFAULT" #define DEFAULT_PATH "DEFAULT" #define DEFAULT_QUERY_STRING "DEFAULT" #define DEFAULT_FRAGMENT_ID "DEFAULT" */ #define AorB(a,b) ((a)?(a):(b)) #define F_SCHEME 1<<0 #define F_USERNAME 1<<1 #define F_PASSWORD 1<<2 #define F_DOMAIN 1<<3 #define F_PORT 1<<4 #define F_PATH 1<<5 #define F_QUERY_STRING 1<<6 #define F_FRAGMENT_ID 1<<7 char *long_opts[]={"scheme","username","password","domain","port","path","query_string","fragment_id",0}; char *short_opts[]={"s","u","k","d","P","p","q","f"}; int main(int argc,char *argv[]) { char *line; char *scheme=0; char *username=0; char *password=0; char *domain=0; char *port=0; char *path=0; char *query_string=0; char *fragment_id=0; char sport[10]; struct servent *serv; //exactly 8 parts! let's store that in a byte. unsigned char flags=0; int i; int size=1024; char using_stdin=1; char malloced=0; if(argc > 1) { if(!strcmp(argv[1],"--help") || !strcmp(argv[1],"-h")) { printf("usage: echo urls | cuturl [options]\n"); printf("usage: cuturl [options] url [options] [url]\n\n"); printf("options: \n"); for(i=0;long_opts[i];i++) { printf(" -%s|--%s\n",short_opts[i],long_opts[i]); } printf("To set default values use environment variables like: CUTURL_[OPTION]\n"); return 2; } } while(1) { scheme=0; username=0; password=0; domain=0; port=0; path=0; query_string=0; fragment_id=0; if(!using_stdin) flags=0; if(argc > 1) { for(argc--,argv++;argc>0;argc--,argv++) { for(i=0;long_opts[i];i++) { if(!strncmp(*argv,"--",2)) { if(!strcmp(*argv+2,long_opts[i])) { flags|=(1<s_port)); port=AorB(port,AorB(getenv("CUTURL_PORT"),(serv?sport:"DEFAULT"))); //port=AorB(port,AorB(getenv("CUTURL_PORT"),"DEFAULT")); path=AorB(path,AorB(getenv("CUTURL_PATH"),"DEFAULT")); query_string=AorB(query_string,AorB(getenv("CUTURL_QUERY_STRING"),"DEFAULT")); fragment_id=AorB(fragment_id,AorB(getenv("CUTURL_FRAGMENT_ID"),"DEFAULT")); if(flags) { if(flags&F_SCHEME) printf("%s\n",scheme); if(flags&F_USERNAME) printf("%s\n",username); if(flags&F_PASSWORD) printf("%s\n",password); if(flags&F_DOMAIN) printf("%s\n",domain); if(flags&F_PORT) printf("%s\n",port); if(flags&F_PATH) printf("%s\n",path); if(flags&F_QUERY_STRING) printf("%s\n",query_string); if(flags&F_FRAGMENT_ID) printf("%s\n",fragment_id); } else { printf("scheme: %s\n",scheme); printf("username: %s\n",username); printf("password: %s\n",password); printf("domain: %s\n",domain); printf("port: %s\n",port); printf("path: %s\n",path); printf("query_string: %s\n",query_string); printf("fragment_id: %s\n",fragment_id); } if(malloced) { free(line); malloced=0; } else { line=0; } } return 0; }