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

📄 cexpand.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
/*	Copyright (c) 1984 AT&T	*//*	  All Rights Reserved  	*//*	THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T	*//*	The copyright notice above does not evidence any   	*//*	actual or intended publication of such source code.	*/#ifndef lintstatic	char sccsid[] = "@(#)cexpand.c 1.1 92/07/30 SMI"; /* from S5R3 1.4 */#endif#include <stdio.h>#include <ctype.h>#include "print.h"#define BACKSLASH	'\\'#define BACKBACK	"\\\\"extern char *strcat();static char retbuffer[1024];static char ret2buffer[1024];/*    Remove the padding sequences from the input string.    Return the new string without the padding sequences    and the padding itself in padbuffer.*/char *rmpadding (str, padbuffer, padding)register char *str, *padbuffer;int *padding;{    static char rmbuffer[1024];    register char ch;    register char *pbufptr;    register char *retptr = rmbuffer;    char *svbufptr;    int padbylines = 0;    int paddigits = 0;    int paddecimal = 0;    padbuffer[0] = rmbuffer[0] = '\0';    if (padding)	*padding = 0;    if (str == NULL)	return rmbuffer;    while (ch = (*str++ & 0377))	switch (ch)	    {	    case '$':		if (*str == '<')		    {		    svbufptr = ++str;		/* skip '<' */		    /* copy number */		    pbufptr = padbuffer;		    for ( ; *str && isdigit (*str) ; str++)			{			*svbufptr++ = *str;			*pbufptr++ = *str;			}		    *pbufptr = '\0';		    paddigits += atoi (padbuffer);		    /* check for decimal */		    if (*str == '.')			{			str++;			pbufptr = padbuffer;			for ( ; *str && isdigit (ch) ; str++)			    {			    *svbufptr++ = *str;			    *pbufptr++ = *str;			    }			*pbufptr = '\0';			paddecimal += atoi (padbuffer);			}		    for ( ; (*str == '*') || (*str == '/') ; str++)			{			if (*str == '*')			    padbylines = 1;			/* Termcap does not support mandatory padding */			/* marked with /. Just remove it. */			else			    {			    extern char *progname;			    (void) fprintf (stderr,				"%s: mandatory padding removed\n", progname);			    }			}		    /* oops, not a padding spec after all */		    /* put us back after the '$<' */		    if (*str != '>')			{			str = svbufptr;			*retptr++ = '$';			*retptr++ = '<';			}		    else			str++;		/* skip the '>' */		    /* Flag padding info that is not at the end */		    /* of the string. */		    if (*str != '\0')			{			extern char *progname;			(void) fprintf (stderr,			    "%s: padding information moved to end\n", progname);			}		    }		else		    *retptr++ = ch;		break;	    default:		*retptr++ = ch;	    }    *retptr = '\0';    if (paddecimal > 10)	{	paddigits += paddecimal / 10;	paddecimal %= 10;	}    if (paddigits > 0 && paddecimal > 0)	(void) sprintf (padbuffer, "%d.%d", paddigits, paddecimal);    else if (paddigits > 0)	(void) sprintf (padbuffer, "%d", paddigits);    else if (paddecimal > 0)	(void) sprintf (padbuffer, ".%d", paddecimal);    if (padbylines)	(void) strcat (padbuffer, "*");    if (padding)	*padding = paddecimal;    return rmbuffer;}/*    Convert a character, making appropriate changes to make it printable    for a termcap source entry. Change escape, tab, etc., into their    appropriate equivalents. Return the number of characters printed.*/char *cconvert(string)char *string;{    register int c;    register char *retptr = retbuffer;    retbuffer[0] = '\0';    if (string == NULL)	return retbuffer;    while (c = *string++)	{	/* should check here to make sure that there is enough room */	/* in retbuffer and realloc it if necessary. */	c &= 0377;	/* we ignore the return value from sprintf because BSD/V7 */	/* systems return a (char *) rather than an int. */	if (c >= 0200)	    { (void) sprintf (retptr, "\\%.3o", c); retptr += 4; }	else if (c == '\033')	    { (void) sprintf (retptr, "\\E"); retptr += 2; }	else if (c == '\t')	    { (void) sprintf (retptr, "\\t"); retptr += 2; }	else if (c == '\b')	    { (void) sprintf (retptr, "\\b"); retptr += 2; }	else if (c == '\f')	    { (void) sprintf (retptr, "\\f"); retptr += 2; }	else if (c == '\n')	    { (void) sprintf (retptr, "\\n"); retptr += 2; }	else if (c == '\r')	    { (void) sprintf (retptr, "\\r"); retptr += 2; }	/* unfortunately \: did not work */	else if (c == ':')	    { (void) sprintf (retptr, "\\072"); retptr += 4; }	else if (c == '^')	    { (void) sprintf (retptr, "\\^"); retptr += 2; }	else if (c == BACKSLASH)	    { (void) sprintf (retptr, BACKBACK); retptr += 2; }	else if (c < ' ' || c == 0177)	    { (void) sprintf (retptr, "^%c", c ^ 0100); retptr += 2; }	else	    { (void) sprintf (retptr, "%c", c); retptr++; }	}    *retptr = '\0';    return retbuffer;}/*    Convert the terminfo string into a termcap string.    Most of the work is done by rmpadding() above and cconvert(); this    function mainly just pieces things back together. A pointer to the    return buffer is returned.    NOTE: Some things can not be done at all: converting the terminfo    parameterized strings into termcap parameterized strings.*/char *cexpand (str)register char *str;{    char padbuffer[512];    char *retptr;    retptr = rmpadding (str, padbuffer, (int *) 0);    (void) sprintf (ret2buffer, "%s%s", padbuffer, cconvert(retptr));    return ret2buffer;}/*    Print out a string onto a stream, changing unprintables into    termcap printables.*/int cpr (stream, string)register FILE *stream;register char *string;{    register char *ret;    if (string != NULL)	{	ret = cexpand (string);	(void) fprintf (stream, "%s", ret);	return strlen(ret);	}    else	return 0;}

⌨️ 快捷键说明

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