文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>使用GNU ReadLine Library实现命令解析器

使用GNU ReadLine Library实现命令解析器

时间:2010-05-31  来源:creatory

使用GNU ReadLine Library实现命令解析器(历史记录,Tab自动补全等) #include <stdio.h>
#include <sys/types.h>
#include <sys/file.h>
#include <sys/stat.h>
#include <sys/errno.h>
#include <readline/readline.h>
#include <readline/history.h>
extern char *getwd ();
extern char *xmalloc ();
/* The names of functions that actually do the manipulation. */
int com_list (char*);
int com_view (char*);
int com_rename (char*);
int com_stat (char*);
int com_pwd (char*);
int com_delete (char*);
int com_help (char*);
int com_cd (char*);
int com_quit (char*);
/* A structure which contains information on the commands this program
   can understand. */
typedef struct {
  char *name;        /* User printable name of the function. */
  Function *func;    /* Function to call to do the job. */
  char *doc;        /* Documentation for this function. */
} COMMAND;
COMMAND commands[] = {
  { "cd", com_cd, "Change to directory DIR" },
  { "delete", com_delete, "Delete FILE" },
  { "help", com_help, "Display this text" },
  { "?", com_help, "Synonym for `help'" },
  { "list", com_list, "List files in DIR" },
  { "ls", com_list, "Synonym for `list'" },
  { "pwd", com_pwd, "Print the current working directory" },
  { "quit", com_quit, "Quit using Fileman" },
  { "rename", com_rename, "Rename FILE to NEWNAME" },
  { "stat", com_stat, "Print out statistics on FILE" },
  { "view", com_view, "View the contents of FILE" },
  { (char *)NULL, (Function *)NULL, (char *)NULL }
};
/* Forward declarations. */
char *stripwhite ();
COMMAND *find_command ();
/* The name of this program, as taken from argv[0]. */
char *progname;
/* When non-zero, this global means the user is done using this program. */
int done;
int
main (argc, argv)
     int argc;
     char **argv;
{
  char *line, *s;
  progname = argv[0];   initialize_readline ();    /* Bind our completer. */   /* Loop reading and executing lines until the user quits. */
  for ( ; done == 0; )
    {
      line = readline ("Jimmy: ");
      if (!line)
        break;
      /* Remove leading and trailing whitespace from the line.
         Then, if there is anything left, add it to the history list
         and execute it. */
      s = stripwhite (line);
      if (*s)
        {
          add_history (s);
          execute_line (s);
        }
      free (line);
    }
  exit (0);
}
/* Execute a command line. */
int
execute_line (line)
     char *line;
{
  register int i;
  COMMAND *command;
  char *word;
  /* Isolate the command word. */
  i = 0;
  while (line[i] && isspace (line[i]))
    i++;
  word = line + i;
  while (line[i] && !isspace (line[i]))
    i++;
  if (line[i])
    line[i++] = '\0';
  command = find_command (word);   if (!command)
    {
      fprintf (stderr, "%s: No such command for FileMan.\n", word);
      return (-1);
    }
  /* Get argument to command, if any. */
  while (isspace (line[i]))
    i++;
  word = line + i;   /* Call the function. */
  return ((*(command->func)) (word));
}
/* Look up NAME as the name of a command, and return a pointer to that
   command. Return a NULL pointer if NAME isn't a command name. */
COMMAND *
find_command (char* name)
{
  int i;
  for (i = 0; commands[i].name; i++)
    if (strcmp (name, commands[i].name) == 0)
      return (&commands[i]);
  return ((COMMAND *)NULL);
}
/* Strip whitespace from the start and end of STRING. Return a pointer
   into STRING. */
char *
stripwhite (char* string)
{
  char *s, *t;
  for (s = string; isspace (*s); s++)
    ;
   
  if (*s == 0)
    return (s);
  t = s + strlen (s) - 1;
  while (t > s && isspace (*t))
    t--;
  *++t = '\0';
  return s;
}

/* Tell the GNU Readline library how to complete. We want to try to complete
   on command names if this is the first word in t
相关阅读 更多 +
排行榜 更多 +
三角符文第一章下载

三角符文第一章下载

角色扮演 下载
嘀嘀动画官方正版下载

嘀嘀动画官方正版下载

趣味娱乐 下载
像素世界僵尸危机安卓版

像素世界僵尸危机安卓版

飞行射击 下载