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

📄 termcap.c

📁 android-w.song.android.widget
💻 C
📖 第 1 页 / 共 2 页
字号:
  fab.fab$l_fna = fn;  fab.fab$b_fns = strlen(fn);  fab.fab$l_nam = &nam;  fab.fab$l_fop = FAB$M_NAM;  nam.nam$l_esa = esa;  nam.nam$b_ess = sizeof esa;  return SYS$PARSE(&fab, 0, 0) == RMS$_NORMAL;}#else /* !VMS */#ifdef MSDOS /* MW, May 1993 */static intvalid_filename_p (fn)     char *fn;{  return *fn == '\\' || *fn == '/' ||    (*fn >= 'A' && *fn <= 'z' && fn[1] == ':');}#else#define valid_filename_p(fn) (*(fn) == '/')#endif#endif /* !VMS *//* Find the termcap entry data for terminal type NAME   and store it in the block that BP points to.   Record its address for future use.   If BP is null, space is dynamically allocated.   Return -1 if there is some difficulty accessing the data base   of terminal types,   0 if the data base is accessible but the type NAME is not defined   in it, and some other value otherwise.  */__private_extern__inttgetent (bp, name)     char *bp, *name;{  register char *termcap_name;  register int fd;  struct buffer buf;  register char *bp1;  char *bp2;  char *term;  int malloc_size = 0;  register int c;  char *tcenv;			/* TERMCAP value, if it contains :tc=.  */  char *indirect = NULL;	/* Terminal type in :tc= in TERMCAP value.  */  int filep;#ifdef INTERNAL_TERMINAL  /* For the internal terminal we don't want to read any termcap file,     so fake it.  */  if (!strcmp (name, "internal"))    {      term = INTERNAL_TERMINAL;      if (!bp)	{	  malloc_size = 1 + strlen (term);	  bp = (char *) xmalloc (malloc_size);	}      strcpy (bp, term);      goto ret;    }#endif /* INTERNAL_TERMINAL */  /* For compatibility with programs like `less' that want to     put data in the termcap buffer themselves as a fallback.  */  if (bp)    term_entry = bp;  termcap_name = getenv ("TERMCAP");  if (termcap_name && *termcap_name == '\0')    termcap_name = NULL;#if 0#if defined (MSDOS) && !defined (TEST)  if (termcap_name && (*termcap_name == '\\'		       || *termcap_name == '/'		       || termcap_name[1] == ':'))    dostounix_filename(termcap_name);#endif#endif  filep = termcap_name && valid_filename_p (termcap_name);  /* If termcap_name is non-null and starts with / (in the un*x case, that is),     it is a file name to use instead of /etc/termcap.     If it is non-null and does not start with /,     it is the entry itself, but only if     the name the caller requested matches the TERM variable.  */  if (termcap_name && !filep && !strcmp (name, getenv ("TERM")))    {      indirect = tgetst1 (find_capability (termcap_name, "tc"), (char **) 0);      if (!indirect)	{	  if (!bp)	    bp = termcap_name;	  else	    strcpy (bp, termcap_name);	  goto ret;	}      else	{			/* It has tc=.  Need to read /etc/termcap.  */	  tcenv = termcap_name; 	  termcap_name = NULL;	}    }  if (!termcap_name || !filep)    termcap_name = TERMCAP_FILE;  /* Here we know we must search a file and termcap_name has its name.  */#ifdef MSDOS  fd = open (termcap_name, O_RDONLY|O_TEXT, 0);#else  fd = open (termcap_name, O_RDONLY, 0);#endif  if (fd < 0)    return -1;  buf.size = BUFSIZE;  /* Add 1 to size to ensure room for terminating null.  */  buf.beg = (char *) xmalloc (buf.size + 1);  term = indirect ? indirect : name;  if (!bp)    {      malloc_size = indirect ? strlen (tcenv) + 1 : buf.size;      bp = (char *) xmalloc (malloc_size);    }  bp1 = bp;  if (indirect)    /* Copy the data from the environment variable.  */    {      strcpy (bp, tcenv);      bp1 += strlen (tcenv);    }  while (term)    {      /* Scan the file, reading it via buf, till find start of main entry.  */      if (scan_file (term, fd, &buf) == 0)	{	  close (fd);	  free (buf.beg);	  if (malloc_size)	    free (bp);	  return 0;	}      /* Free old `term' if appropriate.  */      if (term != name)	free (term);      /* If BP is malloc'd by us, make sure it is big enough.  */      if (malloc_size)	{	  malloc_size = bp1 - bp + buf.size;	  termcap_name = (char *) xrealloc (bp, malloc_size);	  bp1 += termcap_name - bp;	  bp = termcap_name;	}      bp2 = bp1;      /* Copy the line of the entry from buf into bp.  */      termcap_name = buf.ptr;      while ((*bp1++ = c = *termcap_name++) && c != '\n')	/* Drop out any \ newline sequence.  */	if (c == '\\' && *termcap_name == '\n')	  {	    bp1--;	    termcap_name++;	  }      *bp1 = '\0';      /* Does this entry refer to another terminal type's entry?	 If something is found, copy it into heap and null-terminate it.  */      term = tgetst1 (find_capability (bp2, "tc"), (char **) 0);    }  close (fd);  free (buf.beg);  if (malloc_size)    bp = (char *) xrealloc (bp, bp1 - bp + 1); ret:  term_entry = bp;  return 1;}/* Given file open on FD and buffer BUFP,   scan the file from the beginning until a line is found   that starts the entry for terminal type STR.   Return 1 if successful, with that line in BUFP,   or 0 if no entry is found in the file.  */static intscan_file (str, fd, bufp)     char *str;     int fd;     register struct buffer *bufp;{  register char *end;  bufp->ptr = bufp->beg;  bufp->full = 0;  bufp->ateof = 0;  *bufp->ptr = '\0';  lseek (fd, 0L, 0);  while (!bufp->ateof)    {      /* Read a line into the buffer.  */      end = NULL;      do	{	  /* if it is continued, append another line to it,	     until a non-continued line ends.  */	  end = gobble_line (fd, bufp, end);	}      while (!bufp->ateof && end[-2] == '\\');      if (*bufp->ptr != '#'	  && name_match (bufp->ptr, str))	return 1;      /* Discard the line just processed.  */      bufp->ptr = end;    }  return 0;}/* Return nonzero if NAME is one of the names specified   by termcap entry LINE.  */static intname_match (line, name)     char *line, *name;{  register char *tem;  if (!compare_contin (line, name))    return 1;  /* This line starts an entry.  Is it the right one?  */  for (tem = line; *tem && *tem != '\n' && *tem != ':'; tem++)    if (*tem == '|' && !compare_contin (tem + 1, name))      return 1;  return 0;}static intcompare_contin (str1, str2)     register char *str1, *str2;{  register int c1, c2;  while (1)    {      c1 = *str1++;      c2 = *str2++;      while (c1 == '\\' && *str1 == '\n')	{	  str1++;	  while ((c1 = *str1++) == ' ' || c1 == '\t');	}      if (c2 == '\0')	{	  /* End of type being looked up.  */	  if (c1 == '|' || c1 == ':')	    /* If end of name in data base, we win.  */	    return 0;	  else	    return 1;        }      else if (c1 != c2)	return 1;    }}/* Make sure that the buffer <- BUFP contains a full line   of the file open on FD, starting at the place BUFP->ptr   points to.  Can read more of the file, discard stuff before   BUFP->ptr, or make the buffer bigger.   Return the pointer to after the newline ending the line,   or to the end of the file, if there is no newline to end it.   Can also merge on continuation lines.  If APPEND_END is   non-null, it points past the newline of a line that is   continued; we add another line onto it and regard the whole   thing as one line.  The caller decides when a line is continued.  */static char *gobble_line (fd, bufp, append_end)     int fd;     register struct buffer *bufp;     char *append_end;{  register char *end;  register int nread;  register char *buf = bufp->beg;  register char *tem;  if (!append_end)    append_end = bufp->ptr;  while (1)    {      end = append_end;      while (*end && *end != '\n') end++;      if (*end)        break;      if (bufp->ateof)	return buf + bufp->full;      if (bufp->ptr == buf)	{	  if (bufp->full == bufp->size)	    {	      bufp->size *= 2;	      /* Add 1 to size to ensure room for terminating null.  */	      tem = (char *) xrealloc (buf, bufp->size + 1);	      bufp->ptr = (bufp->ptr - buf) + tem;	      append_end = (append_end - buf) + tem;	      bufp->beg = buf = tem;	    }	}      else	{	  append_end -= bufp->ptr - buf;	  bcopy (bufp->ptr, buf, bufp->full -= bufp->ptr - buf);	  bufp->ptr = buf;	}      if (!(nread = read (fd, buf + bufp->full, bufp->size - bufp->full)))	bufp->ateof = 1;      bufp->full += nread;      buf[bufp->full] = '\0';    }  return end + 1;}#ifdef TEST#ifdef NULL#undef NULL#endif#include <stdio.h>main (argc, argv)     int argc;     char **argv;{  char *term;  char *buf;  term = argv[1];  printf ("TERM: %s\n", term);  buf = (char *) tgetent (0, term);  if ((int) buf <= 0)    {      printf ("No entry.\n");      return 0;    }  printf ("Entry: %s\n", buf);  tprint ("cm");  tprint ("AL");  printf ("co: %d\n", tgetnum ("co"));  printf ("am: %d\n", tgetflag ("am"));}tprint (cap)     char *cap;{  char *x = tgetstr (cap, 0);  register char *y;  printf ("%s: ", cap);  if (x)    {      for (y = x; *y; y++)	if (*y <= ' ' || *y == 0177)	  printf ("\\%0o", *y);	else	  putchar (*y);      free (x);    }  else    printf ("none");  putchar ('\n');}#endif /* TEST */

⌨️ 快捷键说明

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