⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zoomsh.c

📁 harvest是一个下载html网页得机器人
💻 C
字号:
/* * $Id: zoomsh.c,v 1.23 2003/07/14 12:59:23 adam Exp $ * * ZOOM-C Shell */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#if HAVE_READLINE_READLINE_H#include <readline/readline.h> #endif#if HAVE_READLINE_HISTORY_H#include <readline/history.h>#endif#include <yaz/xmalloc.h>#include <yaz/log.h>#include <yaz/nmem.h>#include <yaz/zoom.h>#include <yaz/oid.h>#define MAX_CON 100static int next_token (const char **cpp, const char **t_start){    int len = 0;    const char *cp = *cpp;    while (*cp == ' ')	cp++;    if (*cp == '"')    {        cp++;        *t_start = cp;        while (*cp && *cp != '"')        {            cp++;            len++;        }        if (*cp)            cp++;    }    else    {        *t_start = cp;        while (*cp && *cp != ' ' && *cp != '\r' && *cp != '\n')        {            cp++;            len++;        }        if (len == 0)            len = -1;    }    *cpp = cp;    return len;  /* return -1 if no token was read .. */}static int next_token_copy (const char **cpp, char *buf_out, int buf_max){    const char *start;    int len = next_token (cpp, &start);    if (len < 0)    {	*buf_out = 0;	return len;    }    if (len >= buf_max)	len = buf_max-1;    memcpy (buf_out, start, len);    buf_out[len] = '\0';    return len;}static int is_command (const char *cmd_str, const char *this_str, int this_len){    int cmd_len = strlen(cmd_str);    if (cmd_len != this_len)	return 0;    if (memcmp (cmd_str, this_str, cmd_len))	return 0;    return 1;}static void cmd_set (ZOOM_connection *c, ZOOM_resultset *r,		     ZOOM_options options,		     const char **args){    char key[40], val[80];    if (next_token_copy (args, key, sizeof(key)) < 0)    {	printf ("missing argument for set\n");	return ;    }    if (next_token_copy (args, val, sizeof(val)) < 0)	ZOOM_options_set(options, key, 0);    else	ZOOM_options_set(options, key, val);}static void cmd_get (ZOOM_connection *c, ZOOM_resultset *r,		     ZOOM_options options,		     const char **args){    char key[40];    if (next_token_copy (args, key, sizeof(key)) < 0)    {	printf ("missing argument for get\n");    }    else    {        const char *val = ZOOM_options_get(options, key);        printf ("%s = %s\n", key, val ? val : "<null>");    }}static void cmd_close (ZOOM_connection *c, ZOOM_resultset *r,		       ZOOM_options options,		       const char **args){    char host[60];    int i;    next_token_copy (args, host, sizeof(host));    for (i = 0; i<MAX_CON; i++)    {	const char *h;	if (!c[i])	    continue;	if ((h = ZOOM_connection_option_get(c[i], "host"))            && !strcmp (h, host))	{	    ZOOM_connection_destroy (c[i]);	    c[i] = 0;	}	else if (*host == '\0')	{	    ZOOM_connection_destroy (c[i]);	    c[i] = 0;	}    }}static void display_records (ZOOM_connection c,			     ZOOM_resultset r,			     int start, int count){    int i;    for (i = 0; i<count; i++)    {	int pos = i + start;        ZOOM_record rec = ZOOM_resultset_record (r, pos);	const char *db = ZOOM_record_get (rec, "database", 0);	int len, opac_len;	const char *render = ZOOM_record_get (rec, "render", &len);	const char *opac_render = ZOOM_record_get (rec, "opac", &opac_len);	const char *syntax = ZOOM_record_get (rec, "syntax", 0);	/* if rec is non-null, we got a record for display */	if (rec)	{	    char oidbuf[100];	    (void) oid_name_to_dotstring(CLASS_RECSYN, syntax, oidbuf);	    printf ("%d %s %s (%s)\n",		    pos+1, (db ? db : "unknown"), syntax, oidbuf);	    if (render)		fwrite (render, 1, len, stdout);	    printf ("\n");	    if (opac_render)		fwrite (opac_render, 1, opac_len, stdout);	}	        }}static void cmd_show (ZOOM_connection *c, ZOOM_resultset *r,		      ZOOM_options options,		      const char **args){    int i;    char start_str[10], count_str[10];    if (next_token_copy (args, start_str, sizeof(start_str)) >= 0)	ZOOM_options_set (options, "start", start_str);    if (next_token_copy (args, count_str, sizeof(count_str)) >= 0)	ZOOM_options_set (options, "count", count_str);    for (i = 0; i<MAX_CON; i++)	ZOOM_resultset_records (r[i], 0, atoi(start_str), atoi(count_str));    while (ZOOM_event (MAX_CON, c))	;    for (i = 0; i<MAX_CON; i++)    {	int error;	const char *errmsg, *addinfo, *dset;	/* display errors if any */	if (!c[i])	    continue;	if ((error = ZOOM_connection_error_x(c[i], &errmsg, &addinfo, &dset)))	    printf ("%s error: %s (%s:%d) %s\n",		     ZOOM_connection_option_get(c[i], "host"), errmsg,		     dset, error, addinfo);	else if (r[i])	{	    /* OK, no major errors. Display records... */	    int start = ZOOM_options_get_int (options, "start", 0);	    int count = ZOOM_options_get_int (options, "count", 0);	    display_records (c[i], r[i], start, count);	}    }    ZOOM_options_set (options, "count", "0");    ZOOM_options_set (options, "start", "0");}static void cmd_ext (ZOOM_connection *c, ZOOM_resultset *r,                     ZOOM_options options,                     const char **args){    ZOOM_package p[MAX_CON];        int i;        for (i = 0; i<MAX_CON; i++)    {	if (c[i])        {            p[i] = ZOOM_connection_package (c[i], 0);            ZOOM_package_send(p[i], "itemorder");        }        else            p[i] = 0;    }    while (ZOOM_event (MAX_CON, c))	;    for (i = 0; i<MAX_CON; i++)    {	int error;	const char *errmsg, *addinfo, *dset;	/* display errors if any */	if (!p[i])	    continue;	if ((error = ZOOM_connection_error_x(c[i], &errmsg, &addinfo, &dset)))	    printf ("%s error: %s (%s:%d) %s\n",		     ZOOM_connection_option_get(c[i], "host"), errmsg,		     dset, error, addinfo);	else if (p[i])	{            printf ("ok\n");	}        ZOOM_package_destroy (p[i]);    }}static void cmd_debug (ZOOM_connection *c, ZOOM_resultset *r,                       ZOOM_options options,                       const char **args){    yaz_log_init_level(LOG_ALL);}static void cmd_search (ZOOM_connection *c, ZOOM_resultset *r,			ZOOM_options options,			const char **args){    ZOOM_query s;    const char *query_str = *args;    int i;        s = ZOOM_query_create ();    while (*query_str == ' ')        query_str++;    if (memcmp(query_str, "cql:", 4) == 0)    {        ZOOM_query_cql (s, query_str + 4);    }    else if (ZOOM_query_prefix (s, query_str))    {	printf ("Bad PQF: %s\n", query_str);	return;    }    for (i = 0; i<MAX_CON; i++)    {	if (c[i])	{	    ZOOM_resultset_destroy (r[i]);	    r[i] = 0;	}	if (c[i])	    r[i] = ZOOM_connection_search (c[i], s);    }    while (ZOOM_event (MAX_CON, c))	;    for (i = 0; i<MAX_CON; i++)    {	int error;	const char *errmsg, *addinfo, *dset;	/* display errors if any */	if (!c[i])	    continue;	if ((error = ZOOM_connection_error_x(c[i], &errmsg, &addinfo, &dset)))	    printf ("%s error: %s (%s:%d) %s\n",		    ZOOM_connection_option_get(c[i], "host"), errmsg,		    dset, error, addinfo);	else if (r[i])	{	    /* OK, no major errors. Look at the result count */	    int start = ZOOM_options_get_int (options, "start", 0);	    int count = ZOOM_options_get_int (options, "count", 0);	    printf ("%s: %d hits\n", ZOOM_connection_option_get(c[i], "host"),		    ZOOM_resultset_size(r[i]));	    /* and display */	    display_records (c[i], r[i], start, count);	}    }    ZOOM_query_destroy (s);}static void cmd_scan (ZOOM_connection *c, ZOOM_resultset *r,                      ZOOM_options options,                      const char **args){    const char *start_term = *args;    int i;    ZOOM_scanset s[MAX_CON];        while (*start_term == ' ')        start_term++;    for (i = 0; i<MAX_CON; i++)    {        if (c[i])            s[i] = ZOOM_connection_scan(c[i], start_term);        else            s[i] = 0;    }    while (ZOOM_event(MAX_CON, c))        ;    for (i = 0; i<MAX_CON; i++)    {        if (s[i]) {            size_t p, sz = ZOOM_scanset_size(s[i]);            for (p = 0; p < sz; p++)            {                int occ = 0;                int len = 0;                const char *term = ZOOM_scanset_term(s[i], p, &occ, &len);                fwrite(term, 1, len, stdout);                printf (" %d\n", occ);            }                        ZOOM_scanset_destroy(s[i]);        }    }}static void cmd_help (ZOOM_connection *c, ZOOM_resultset *r,		      ZOOM_options options,		      const char **args){    printf ("connect <zurl>\n");    printf ("search <pqf>\n");    printf ("show [<start> [<count>]\n");    printf ("scan <term>\n");    printf ("quit\n");    printf ("close <zurl>\n");    printf ("set <option> [<value>]\n");    printf ("get <option>\n");    printf ("\n");    printf ("options:\n");    printf (" start\n");    printf (" count\n");    printf (" databaseName\n");    printf (" preferredRecordSyntax\n");    printf (" proxy\n");    printf (" elementSetName\n");    printf (" maximumRecordSize\n");    printf (" preferredRecordSize\n");    printf (" async\n");    printf (" piggyback\n");    printf (" group\n");    printf (" user\n");    printf (" pass\n");    printf (" implementationName\n");    printf (" charset\n");    printf (" lang\n");}static void cmd_connect (ZOOM_connection *c, ZOOM_resultset *r,			 ZOOM_options options,			 const char **args){    int error;    const char *errmsg, *addinfo, *dset;    char host[60];    int j, i;    if (next_token_copy (args, host, sizeof(host)) < 0)    {	printf ("missing host after connect\n");	return ;    }    for (j = -1, i = 0; i<MAX_CON; i++)    {	const char *h;	if (c[i] && (h = ZOOM_connection_option_get(c[i], "host")) &&	    !strcmp (h, host))	{	    ZOOM_connection_destroy (c[i]);	    break;	}	else if (c[i] == 0 && j == -1)	    j = i;    }    if (i == MAX_CON)  /* no match .. */    {	if (j == -1)	{	    printf ("no more connection available\n");	    return;	}	i = j;   /* OK, use this one is available */    }    c[i] = ZOOM_connection_create (options);    ZOOM_connection_connect (c[i], host, 0);	    if ((error = ZOOM_connection_error_x(c[i], &errmsg, &addinfo, &dset)))       printf ("%s error: %s (%s:%d) %s\n",	    ZOOM_connection_option_get(c[i], "host"), errmsg,	    dset, error, addinfo);}static int cmd_parse (ZOOM_connection *c, ZOOM_resultset *r,		      ZOOM_options options, 		      const char **buf){    int cmd_len;    const char *cmd_str;    cmd_len = next_token (buf, &cmd_str);    if (cmd_len < 0)	return 1;    if (is_command ("quit", cmd_str, cmd_len))	return 0;    else if (is_command ("set", cmd_str, cmd_len))	cmd_set (c, r, options, buf);    else if (is_command ("get", cmd_str, cmd_len))	cmd_get (c, r, options, buf);    else if (is_command ("connect", cmd_str, cmd_len))	cmd_connect (c, r, options, buf);    else if (is_command ("open", cmd_str, cmd_len))	cmd_connect (c, r, options, buf);    else if (is_command ("search", cmd_str, cmd_len))	cmd_search (c, r, options, buf);    else if (is_command ("find", cmd_str, cmd_len))	cmd_search (c, r, options, buf);    else if (is_command ("show", cmd_str, cmd_len))	cmd_show (c, r, options, buf);    else if (is_command ("close", cmd_str, cmd_len))	cmd_close (c, r, options, buf);    else if (is_command ("help", cmd_str, cmd_len))	cmd_help(c, r, options, buf);    else if (is_command ("ext", cmd_str, cmd_len))	cmd_ext(c, r, options, buf);    else if (is_command ("debug", cmd_str, cmd_len))	cmd_debug(c, r, options, buf);    else if (is_command ("scan", cmd_str, cmd_len))	cmd_scan(c, r, options, buf);    else	printf ("unknown command %.*s\n", cmd_len, cmd_str);    return 2;}void shell(ZOOM_connection *c, ZOOM_resultset *r,           ZOOM_options options){    while (1)    {        char buf[1000];	char *cp;	const char *bp = buf;#if HAVE_READLINE_READLINE_H	char* line_in;	line_in=readline("ZOOM>");	if (!line_in)	    break;#if HAVE_READLINE_HISTORY_H	if (*line_in)	    add_history(line_in);#endif	if(strlen(line_in) > 999) {	    printf("Input line too long\n");	    break;	};	strcpy(buf,line_in);	free (line_in);#else    	printf ("ZOOM>"); fflush (stdout);	if (!fgets (buf, 999, stdin))	    break;#endif 	if ((cp = strchr(buf, '\n')))	    *cp = '\0';	if (!cmd_parse (c, r, options, &bp))	    break;    }}int main (int argc, char **argv){    ZOOM_options options = ZOOM_options_create();    int i, res;    ZOOM_connection z39_con[MAX_CON];    ZOOM_resultset  z39_res[MAX_CON];    nmem_init();    for (i = 0; i<MAX_CON; i++)    {	z39_con[i] = 0;	z39_res[i] = 0;    }    for (i = 0; i<MAX_CON; i++)	z39_con[i] = 0;    res = 1;    for (i = 1; i<argc; i++)    {	const char *bp = argv[i];	res = cmd_parse(z39_con, z39_res, options, &bp);	if (res == 0)  /* received quit */	    break;    }    if (res)  /* do cmdline shell only if not quitting */	shell(z39_con, z39_res, options);    ZOOM_options_destroy(options);    for (i = 0; i<MAX_CON; i++)    {	ZOOM_connection_destroy(z39_con[i]);	ZOOM_resultset_destroy(z39_res[i]);    }    nmem_exit();    exit (0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -