示例#1
0
文件: faup.c 项目: pombredanne/faup
int main(int argc, char **argv)
{
    faup_handler_t *fh;
    int ret = 0;

    char *tld_file=NULL;

    faup_options_t *faup_opts;
    int opt;
    int skip_file_check = 0;

    int tld_pos;

    bool has_module = false;


    faup_opts = faup_options_new();
    if (!faup_opts) {
        fprintf(stderr, "Error: cannot allocate faup options!\n" );
        return -1;
    }

    if ((argc > 1) && (!strcmp(argv[1],"$"))) {
        // Handle some specific shell operations
        return faup_handle_shell(argc, argv);
    }

    while ((opt = getopt(argc, argv, "apld:vo:utf:m:")) != -1) {
        switch(opt) {
        case 'a':
            skip_file_check = 1;
            break;
        case 'd':
            if (optarg) {
                faup_opts->sep_char = optarg[0];
            }
            break;
        case 'p':
            faup_opts->print_header = 1;
            break;
        case 'l':
            faup_opts->fields |= FAUP_URL_FIELD_LINE;
            faup_opts->print_line = 1;
            break;
        case 'm':
            for (optind--; optind < argc - 1;) {
                // In case we parse the next option, we shall stop!
                if (argv[optind][0] == '-') {
                    break;
                }

                optind++;

                if (!has_module) {
                    // This is our first argument
                    // we push our first arg: 'optarg'
                    faup_opts->modules_argv = realloc(faup_opts->modules_argv, faup_opts->modules_argc + 1);
                    faup_opts->modules_argv[faup_opts->modules_argc] = strdup(optarg);

                    faup_opts->modules_argc++;
                    has_module = 1;
                }


                // In case we parse the next option, we shall stop!
                // In case the next argument is the last, that means this is the url, not the module
                if ((argv[optind][0] == '-') | (optind == argc - 1)) {
                    break;
                }

                faup_opts->modules_argv = realloc(faup_opts->modules_argv, faup_opts->modules_argc + 1);
                faup_opts->modules_argv[faup_opts->modules_argc] = strdup(argv[optind]);
                faup_opts->modules_argc++;
            }

            if (has_module) {
                faup_opts->exec_modules = FAUP_MODULES_EXECARG;
            } else {
                faup_opts->exec_modules = FAUP_MODULES_NOEXEC;
            }
            break;
        case 'f':
            faup_opts->fields = faup_options_get_field_from_name(optarg);
            break;
        case 'o':
            faup_opts->output = faup_options_get_output_from_name(optarg);

            if (faup_opts->output == FAUP_OUTPUT_NONE) {
                fprintf(stderr, "invalid output option '%s'!\n", optarg);
                faup_options_free(faup_opts);
                exit(1);
            }

            break;
        case 't':
            faup_options_disable_tld_above_one(faup_opts);
            break;
        case 'u':
            faup_tld_update();
            faup_options_free(faup_opts);
            exit(0);
            break;
        case 'v':
            printf("faup v%s\n", faup_get_version());
            faup_tld_datadir_print();
            faup_options_free(faup_opts);
            exit(0);
            break;
        default:
            print_help(argv);
            faup_options_free(faup_opts);
            exit(1);
        }
    }

    fh = faup_init(faup_opts);

//	printf("Lart arg:'%s'\n", argv[optind+1]);


    if (isatty(fileno(stdin))) {
        faup_opts->input_source = FAUP_INPUT_SOURCE_ARGUMENT;

        if (argc < 2) {
            print_help(argv);
            faup_options_free(faup_opts);
            faup_terminate(fh);
            exit(1);
        }

        if (!argv[optind]) {
            faup_options_free(faup_opts);
            exit(1);
        }

        if (!skip_file_check) {
            if (strlen(argv[optind]) < FAUP_MAXPATHLEN) {
                FILE *fp = fopen(argv[optind], "r");
                if (fp) {
                    faup_opts->input_source = FAUP_INPUT_SOURCE_FILE;
                    ret = run_from_stream(fh, fp);
                    fclose(fp);
                    goto terminate;
                }
            }
        }

        faup_decode(fh, argv[optind], strlen(argv[optind]));

        faup_output(fh, stdout);
    } else {       	/* We read from stdin */
        faup_opts->input_source = FAUP_INPUT_SOURCE_PIPE;
        run_from_stream(fh, stdin);
    }

terminate:
    faup_options_free(faup_opts);
    faup_terminate(fh);

    return ret;
}
示例#2
0
文件: faup.c 项目: adulau/faup
int main(int argc, char **argv)
{
	faup_handler_t *fh;
	char *strbuf=NULL;

	char *tld_file=NULL;

	faup_options_t faup_opts;
	int opt;

	int tld_pos;

	faup_options_defaults(&faup_opts);

	fh = faup_init();


//	tld_tree = faup_tld_tree_new();
//	tld_pos = get_tld_pos(tld_tree, argv[1]);
//	printf("TLD Pos:%d\n", tld_pos);

	while ((opt = getopt(argc, argv, "pld:vo:ut")) != -1) {
	  switch(opt) {
	  case 'p':
	    faup_opts.print_header = 1;
	    break;
	  case 'l':
	    faup_opts.print_line = 1;
	    break;
	  case 'd':
	    faup_opts.sep_char = optarg[0];
	    break;
	  case 'o':
	  	if (!strcmp("csv", optarg)) {
	  		faup_opts.output = FAUP_OUTPUT_CSV;
	  	} else if (!strcmp("json", optarg)) {
	  		faup_opts.output = FAUP_OUTPUT_JSON;
	  	} else {
	  		fprintf(stderr, "invalid output option '%s'!\n", optarg);
	  		exit(1);
	  	}
	  	break;
	  case 't':
	  	faup_opts.tld_tree = faup_tld_tree_new();
	  	faup_opts.tld_greater_extraction = 1;
	  	break;
	  case 'u':
	  	faup_tld_update();
	  	exit(0);
	  	break;
	  case 'v':
	    printf("faup v%s\n", faup_get_version());
	    exit(0);
	    break;
	  default:
	    print_help(argv);
	    exit(1);
	  }
	}

	if (isatty(fileno(stdin))) {
		if (argc < 2) {
			print_help(argv);
			exit(1);
		}
		if (faup_opts.print_header) {
		        print_header(faup_opts.print_header, faup_opts.sep_char);
		}

		if (!argv[optind]) {
		  exit(1);
		}

		faup_decode(fh, argv[optind], strlen(argv[optind]), &faup_opts);

		switch(faup_opts.output) {
			case FAUP_OUTPUT_JSON:
				faup_output_json(fh, stdout);
				break;
			default:
				if (faup_opts.print_line) {
		 			printf("0%c", faup_opts.sep_char);
				}
				faup_output_csv(fh, faup_opts.sep_char, stdout);
				printf("\n");
				break;			
		}
	} else {       	/* We read from stdin */
		long line_nb = 1;
		if (faup_opts.print_header) {
		        print_header(faup_opts.print_line, faup_opts.sep_char);
		}
		while (!feof(stdin)) {
			strbuf = readline(stdin);
			if (!strbuf) {
				break;
			}
			if (strbuf[0] == '\0') {
				break;
			}

			faup_decode(fh, strbuf, strlen(strbuf), &faup_opts);		
			switch(faup_opts.output) {
				case FAUP_OUTPUT_JSON:
					faup_output_json(fh, stdout);
					break;
				default:
					if (faup_opts.print_line) {
				        printf("%ld%c", line_nb, faup_opts.sep_char);
					}
					faup_output_csv(fh, ',', stdout);
					printf("\n");
					break;
			}	

			free(strbuf);
			line_nb++;
		}
	}

	faup_terminate(fh);

	return 0;
}