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

📄 zebrash.c

📁 harvest是一个下载html网页得机器人
💻 C
📖 第 1 页 / 共 2 页
字号:
    return rc;}static int cmd_find( char *args[], WRBUF outbuff){    char *setname=DEFAULTRESULTSET;    int rc;    int hits=0;    WRBUF qry=wrbuf_alloc();    if (0==strstr(args[0],"@attr"))        wrbuf_puts(qry, "@attr 1=/ ");    wrbuf_puts(qry,restargs(args,1));    if (!zh)	onecommand("quickstart", outbuff, "");    wrbuf_printf(outbuff, "find %s\n",wrbuf_buf(qry));    rc=zebra_search_PQF(zh, wrbuf_buf(qry), setname, &hits);    if (0==rc)    {        wrbuf_printf(outbuff,"%d hits found\n",hits);        nextrecno=1;    }    wrbuf_free(qry,1);    return rc;}static int cmd_show( char *args[], WRBUF outbuff){    int start=defargint(args[1], nextrecno);    int nrecs=defargint(args[2],1);    char *setname=defarg(args[3],DEFAULTRESULTSET);    int rc=0;    ZebraRetrievalRecord *recs;    ODR odr;    Z_RecordComposition *pcomp=0;    int i;    oid_value format;    odr=odr_createmem(ODR_ENCODE);    recs= odr_malloc(odr,sizeof(ZebraRetrievalRecord)*nrecs);    rc =z_RecordComposition(odr, &pcomp, 0,"recordComposition");    format=oid_getvalbyname ("xml"); /*FIXME - let the user specify*/    for (i=0;i<nrecs;i++)        recs[i].position=start+i;    rc = zebra_records_retrieve (zh, odr, setname,				 pcomp, format, nrecs,recs);    if (0==rc)    {        for (i=0;i<nrecs;i++)        {            printf("Err %d: %d\n",i,recs[i].errCode);            if (recs[i].buf)            {                wrbuf_printf(outbuff,"Record %d\n", recs[i].position);                wrbuf_write(outbuff, recs[i].buf, recs[i].len);                wrbuf_puts(outbuff, "\n");            } else                wrbuf_printf(outbuff,"NO Record %d\n", recs[i].position);        }        nextrecno=start+nrecs+1;    }    odr_destroy(odr);    return rc;}/**************************************) * Command table, parser, and help  */struct cmdstruct{    char *cmd;    char *args;    char *explanation;    int (*testfunc)(char *args[], WRBUF outbuff);} ; struct cmdstruct cmds[] = {    /* special cases:     *   if text is 0, does not list the command     *   if cmd is "", adds the args (and newline) in command listing     */    { "", "Starting and stopping:", "", 0 },    { "zebra_start",       "[configfile]",       "starts the zebra service. You need to call this first\n"      "if no configfile is given, assumes " DEFAULTCONFIG,       cmd_zebra_start },    { "zebra_stop",   "",       "stops the zebra service",       cmd_zebra_stop },    { "zebra_open", "",        "starts a zebra session. Once you have called zebra_start\n"      "you can call zebra_open to start working",       cmd_zebra_open },    { "zebra_close", "",       "closes a zebra session",       cmd_zebra_close },     { "quickstart", "[configfile]",       "Does a zebra_start, zebra_open, and sets up the log",       cmd_quickstart },       { "", "Log file:","", 0},      { "yaz_log_file",       "[filename]",      "Directs the log to filename (or stderr)",      cmd_yaz_log_file },    { "yaz_log_level",       "[level]",      "Sets the logging level (or returns to default)",      cmd_yaz_log_level },    { "yaz_log_prefix",       "[prefix]",      "Sets the log prefix",      cmd_yaz_log_prefix},        { "logf",       "[level] text...",      "writes an entry in the log",      cmd_logf},        { "", "Error handling:","", 0},    { "err",  "",      "Displays zebra's error status (code, str, add)",      cmd_err},        { "errcode",  "",      "Displays zebra's error code",      cmd_errcode},        { "errstr",  "",      "Displays zebra's error string",      cmd_errstr},        { "erradd",  "",      "Displays zebra's additional error message",      cmd_erradd},          { "", "Admin:","", 0},     { "init",  "",      "Initializes the zebra database, destroying all data in it",      cmd_init},        { "select_database",  "basename",      "Selects a database",      cmd_select_database},        { "create_database", "basename",      "Create database",      cmd_create_database},    { "drop_database", "basename",      "Drop database",      cmd_drop_database},    { "begin_trans", "[rw]",      "Begins a transaction. rw=1 means write, otherwise read-only",      cmd_begin_trans},    { "end_trans","",      "Ends a transaction",      cmd_end_trans},    { "","Updating:","",0},    { "record_insert","record",      "inserts an sgml record into Default",      cmd_record_insert},    { "exchange_record","database record-id action record",      "inserts (1), updates (2), or deletes (3) a record \n"      "record-id must be a unique identifier for the record",      cmd_exchange_record},    { "","Searching and retrieving:","",0},    { "search_pqf","setname query",      "search ",      cmd_search_pqf},    { "find","query",      "simplified search",      cmd_find},    { "f","query",      "simplified search",      cmd_find},    { "show","[start] [numrecs] [resultset]",      "shows a result",      cmd_show},    { "s","[start] [numrecs] [resultset]",      "shows a result",      cmd_show},    { "", "Misc:","", 0},     { "echo", "string",       "ouputs the string",       cmd_echo },    { "q", "",       "exits the program",       cmd_quit },    { "quit", "",       "exits the program",       cmd_quit },    { "help", "[command]",       "Gives help on command, or lists them all",       cmd_help },    { "", "help [command] gives more info on command", "",0 },         {0,0,0,0} /* end marker */}; int onecommand( 		char *line,     /* input line */		WRBUF outbuff,  /* output goes here */		const char *prevout) /* prev output, for 'expect' */{    int i;    char *args[MAX_NO_ARGS];    int nargs;    char argbuf[MAX_ARG_LEN];    logf(LOG_APP,"%s",line);    strncpy(argbuf,line, MAX_ARG_LEN-1);    argbuf[MAX_ARG_LEN-1]='\0'; /* just to be sure */    /*memset(args,'\0',MAX_NO_ARGS*sizeof(char *));*/    nargs=split_args(argbuf, args);    #if 0    for (i = 0; i <= n; i++)    {	const char *cp = args[i];	printf ("args %d :%s:\n", i, cp ? cp : "<null>");    }#endif    if (0==nargs)	    return -90; /* no command on line, too bad */    if (0==strcmp(args[0],"expect"))     {	char *rest;        if (nargs>1) /* args[0] is not yet set, can't use restargs */            rest= line + (args[1]-argbuf); /* rest of the line */        else            return -1; /* need something to expect */	if (0==strstr(prevout,rest))	{	    printf( "Failed expectation, '%s' not found\n", rest);            exit(9); 	}	return 0;    }    for (i=0;cmds[i].cmd;i++)	if (0==strcmp(cmds[i].cmd, args[0])) 	{	    if (nargs>1)		args[0]= line + (args[1]-argbuf); /* rest of the line */	    else		args[0]=""; 	    return ((cmds[i].testfunc)(args,outbuff));	}    wrbuf_printf(outbuff, "Unknown command '%s'. Try help\n",args[0]);    logf(LOG_APP,"Unknown command");    return -90; } static int cmd_help( char *args[], WRBUF outbuff){     int i;    int linelen;    if (args[1])     { /* help for a single command */ 	for (i=0;cmds[i].cmd;i++)	    if (0==strcmp(cmds[i].cmd, args[1])) 	    {                wrbuf_printf(outbuff,"%s  %s\n%s\n",		             cmds[i].cmd, cmds[i].args, 			     cmds[i].explanation);		return 0;	    }	wrbuf_printf(outbuff, "Unknown command '%s'", args[1]);    }    else     { /* list all commands */        linelen=9999;	for (i=0;cmds[i].cmd;i++)        {            if (*cmds[i].cmd)            { /* ordinary command */                if (linelen>50)                {                    wrbuf_puts(outbuff,"\n   ");                    linelen=0;                }                linelen += strlen(cmds[i].cmd) + 2;                wrbuf_printf(outbuff,"%s ", cmds[i].cmd);            } else            { /* section head */                wrbuf_printf(outbuff,"\n%s\n   ",cmds[i].args);                linelen=0;            }	    } /* for */        wrbuf_puts(outbuff,"\n");    }    return 0;} /* If Zebra reports an error after an operation, * append it to the outbuff and log it */static void Zerrors ( WRBUF outbuff){    int ec;    if (!zh)	return ;    ec=zebra_errCode (zh);    if (ec)    {	logf(LOG_APP, "   Zebra error %d: %s, (%s)",	     ec, zebra_errString (zh),	     zebra_errAdd (zh) );	wrbuf_printf(outbuff, "   Zebra error %d: %s, (%s)\n",		     ec, zebra_errString (zh),		     zebra_errAdd (zh) );	zebra_clearError(zh);    }}/**************************************  * The shell */ void shell(){    int rc=0;    WRBUF outbuff=wrbuf_alloc();    char prevout[MAX_OUT_BUFF]=""; /* previous output for 'expect' */    wrbuf_puts(outbuff,"Zebrash at your service");    while (rc!=-99)    {	char *nl_cp;	char buf[MAX_ARG_LEN];	char* line_in = 0;#if HAVE_READLINE_READLINE_H	if (isatty(0)) {	    line_in=readline(PROMPT);	    if (!line_in)		break;#if HAVE_READLINE_HISTORY_H	    if (*line_in)		add_history(line_in);#endif	}#endif	/* line_in != NULL if readine is present and input is a tty */		printf (PROMPT); 	fflush (stdout);	if (line_in)	{	    if(strlen(line_in) > MAX_ARG_LEN-1) {		fprintf(stderr,"Input line too long\n");		break;	    }	    strcpy(buf,line_in);	    free (line_in);	}	else 	{	    if (!fgets (buf, MAX_ARG_LEN-1, stdin))		break; 	}		/* get rid of \n in line */	if ((nl_cp = strchr(buf, '\n')))	    *nl_cp = '\0';	strncpy(prevout, wrbuf_buf(outbuff), MAX_OUT_BUFF);        wrbuf_rewind(outbuff);	rc=onecommand(buf, outbuff, prevout);	if (rc==0)	{	    wrbuf_puts(outbuff, "   OK\n");	    logf(LOG_APP, "OK");	}	else if (rc>-90)	{	    wrbuf_printf(outbuff, "   command returned %d\n",rc);	} 	Zerrors(outbuff);	printf("%s\n", wrbuf_buf(outbuff));    } /* while */    wrbuf_free(outbuff,1);} /* shell() *//************************************** * Main  */ int main (int argc, char ** args){    shell();    return 0;} /* main */

⌨️ 快捷键说明

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