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

📄 handlers.c

📁 P2P NAP的C实现 P2P在网络应用中越来越流行
💻 C
字号:
/* Copyright (c) 2000  Kevin Sullivan <nite@gis.net> * * Please refer to the COPYRIGHT file for more information. */#include <string.h>#include <stdio.h>#include <ctype.h>#include <stdlib.h>#include <ncurses.h>#include "defines.h"#include "cmds.h"#include "scmds.h"#include "handlers.h"#include "nap.h"#ifdef MEMWATCH  #include "memwatch.h"#endifhandler_t *hndhead;unsigned char *dohandler(handler_t *al, char **tok, int cnt){  char *ret, echr;  char **atok, p[16], pt[2048], tb[2048], *t;  int i, j, acnt, n, l, c;    t = strdup(al->args);    for (i=0;al->args[i]&&al->args[i] == ' ';i++);    if (al->args[i] == '{')  {    for (i=0,c=0;t[i];i++)    {      if (c < 0)        c = 0;      if (t[i] == '{' && !c)      {        t[i] = ' ';        c++;      }      else if (t[i] == '{')        c++;      else if (t[i] == '}' && c == 1)      {        t[i] = ' ';        c--;      }      else if (t[i] == '}')        c--;    }  }    if (t[strlen(t)-1] == '|' || t[strlen(t)-1] == '\n')    t[strlen(t)-1] = 0;    memset(pt, 0, sizeof(pt));  strcpy(pt, t);  free(t);    for (i=0;pt[i];i++)  {    if (pt[i] == '$' || pt[i] == '?')    {      for (j=i,echr=0;;j++)      {        if (!pt[j] || pt[j] == ',' || pt[j] == ' ' || pt[j] == '=' || pt[j] == '!' || pt[j] == '>' || pt[j] == '<')        {          echr = pt[j];          break;        }      }      if (i > 0 && (pt[i-1] == '(' || pt[i-1] == ')' || pt[i-1] == ',' || pt[i-1] == '=' || pt[i-1] == '!' || pt[i-1] == '<' || pt[i-1] == '>' || pt[i-1] == ' '))      {        if (pt[i-1] != ' ')        {          memset(tb, 0, sizeof(tb));          strcpy(tb, pt+i);          strcpy(pt+i+1, tb);          pt[i] = ' ';        }        else          j--;        if (echr && echr != ' ')        {          memset(tb, 0, sizeof(tb));          strcpy(tb, pt+j+1);          strcpy(pt+j+2, tb);          pt[j+1] = ' ';        }      }    }  }    t = strdup(pt);    atok = form_tokso(t, &acnt);  free(t);    for (i=0,j=0;i<acnt;i++)    if (*atok[i] == '$' && atok[i][1])      if (atoi(atok[i]+1) > j)        j = atoi(atok[i]+1);  if ((cnt-1) < j)    return(NULL);    for (i=0;atok[i];i++)  {    if (*atok[i] == '?' && isdigit(atok[i][1]))    {      if (atoi(atok[i]+1) <= (cnt-1))        *atok[i] = '$';      else      {        for (j=1;;j++)        {          if (!isdigit(atok[i][j]) && atok[i][j] != '-')          {            memset(tb, 0, sizeof(tb));            strcpy(tb, atok[i]+j);            strcpy(atok[i], tb);            break;          }        }      }    }  }    for (i=0,l=0;atok[i];i++)  {    if (*atok[i] == '$' && isdigit(atok[i][1]) && !strchr(atok[i], '-'))    {      n = atoi(atok[i]+1);      memset(tb, 0, sizeof(tb));      for (j=1;atok[i][j];j++)        if (!isdigit(atok[i][j]))          break;      strcpy(tb, atok[i]+j);      atok[i] = (char *)realloc(atok[i], strlen(tok[n])+strlen(tb)+1);      strcpy(atok[i], tok[n]);      strcat(atok[i], tb);    }    else if (*atok[i] == '$' && isdigit(atok[i][1]))    {      memset(p, 0, sizeof(p));      for (j=1;;j++)      {        if (!isdigit(atok[i][j]) && atok[i][j] != '-')        {          memset(tb, 0, sizeof(tb));          strcpy(tb, atok[i]+j);          strcpy(atok[i], tb);          break;        }        if (atok[i][j] != '-')          p[j-1] = atok[i][j];      }      n = atoi(p);      memset(pt, 0, sizeof(pt));      for (j=n;tok[j];j++)      {        strcat(pt, tok[j]);        strcat(pt, " ");      }      pt[strlen(pt)-1] = 0;      atok[i] = (char *)realloc(atok[i], strlen(pt)+strlen(tb)+1);      strcpy(atok[i], pt);      strcat(atok[i], tb);    }    else if (*atok[i] == '$' && !strcasecmp(atok[i]+1, "num"))    {      free(atok[i]);      atok[i] = NULL;      msprintf(&atok[i], "%i", cnt-1);    }    else if (*atok[i] == '$' && !strcasecmp(atok[i]+1, "str"))    {      free(atok[i]);      atok[i] = (char *)malloc(4096);      memset(atok[i], 0, 4096);      for (j=0;tok[j];j++)      {        if (*tok[j])        {          strcat(atok[i], tok[j]);          strcat(atok[i], " ");        }      }      atok[i][strlen(atok[i])-1] = 0;      atok[i] = (char *)realloc(atok[i], strlen(atok[i])+1);    }    l+=strlen(atok[i])+1;  }  ret = (char *)malloc(4096);  memset(ret, 0, 4096);    for (i=0;atok[i];i++)  {    if (*atok[i])    {      strcat(ret, atok[i]);      strcat(ret, " ");    }    free(atok[i]);  }    free(atok);    ret[strlen(ret)-1] = 0;  ret = (char *)realloc(ret, strlen(ret)+1);    return((unsigned char *)ret);}int loadhandlers(char *fn){  FILE *f;  handler_t *cur, *cur1=NULL;  char buf[4096], tb[4096];  int i, c, j;    f = fopen(fn, "r");  if (!f)    return(-1);    for (cur=hndhead;cur;cur=cur->next)    cur1 = cur;    while (1)  {    if (fgets(buf, sizeof(buf), f) == NULL)      break;    if (*buf == '#')      continue;    if (buf[strlen(buf)-1] == '\n')      buf[strlen(buf)-1] = 0;    for (i=0,c=0;buf[i];i++)    {      if (buf[i] == ' ')      {        c = 1;        break;      }    }        if (!c)    {      buf[strlen(buf)] = ' ';      fgets(buf+strlen(buf), sizeof(buf)-strlen(buf), f);      if (buf[strlen(buf)-1] == '\n')        buf[strlen(buf)-1] = 0;    }        buf[strlen(buf)] = '\n';        for (c=0,i=0;;i++)    {      if (c < 0)      {        c = 0;        break;      }      if (!buf[i] && c)      {        while (1)        {          memset(tb, 0, sizeof(tb));          if (fgets(tb, sizeof(tb), f) == NULL)	    break;          for (j=0;tb[j]==' ';j++);          if (tb[j] != '#')          {            strcpy(buf+i+1, tb);            buf[i] = ' ';            break;          }        }      }      else if (!buf[i])        break;      if (buf[i] == '{')        c++;      else if (buf[i] == '}')        c--;    }        for (i=0;buf[i];i++)    {      if (buf[i] == '\n')      {        for (j=i+1;buf[j]==' '&&buf[j]!='{';j++);        if (buf[j] == '{')        {          buf[i] = ' ';          strncpy(buf+i+1, buf+j, strlen(buf+j));          buf[strlen(buf)-(j-i)+1] = 0;        }      }    }    if (*buf == ' ')      continue;    for (i=strlen(buf)-1;buf[i] == ' '&&i>=0;i--);    while (buf[i] == '\n')    {      buf[i] = 0;      i--;    }    cur = (handler_t *)malloc(sizeof(handler_t));    for (i=0;buf[i]!=' ';i++);    cur->args = strdup(buf+i+1);    if (buf[0] == '0' && buf[1] == 'x')      cur->op = strtol(buf, (char **)NULL, 16);    else      cur->op = atoi(buf);    cur->next = NULL;    if (!cur1)      hndhead = cur;    else      cur1->next = cur;    cur1 = cur;  } /* while (1) */    fclose(f);    return(1);}int savehandlers(char *fn){  FILE *f;  handler_t *cur;    f = fopen(fn, "w");  if (!f)    return(-1);    for (cur=hndhead;cur;cur=cur->next)    fprintf(f, "%i %s\n", cur->op, cur->args);    fclose(f);    return(1);}

⌨️ 快捷键说明

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