示例#1
0
// Copy and shrink string by inserting an ellipsis in the middle (if necessary), given destination pointer, maximum destination
// length (excluding the trailing null), source pointer, and source length.  Destination buffer is assumed to be at least
// maxlen + 1 bytes in size.  If source length is zero, source string is assumed to be null terminated.  Return dest.
char *strfit(char *destp,size_t maxlen,char *srcp,size_t srclen) {
	size_t slen,len,cutsize;
	char *strp,*ellipsis;

	// Check for minimum shrinking parameters.
	slen = (srclen == 0) ? strlen(srcp) : srclen;
	if(maxlen < 5 || slen <= maxlen)

		// Dest or source too short, so just copy the maximum.
		(void) stplcpy(destp,srcp,(slen < maxlen ? slen : maxlen) + 1);
	else {
		// Determine maximum number of characters can copy from source.
		if(maxlen < 30) {
			ellipsis = "..";			// Use shorter ellipsis for small dest.
			len = 2;
			}
		else {
			ellipsis = "...";
			len = 3;
			}
		cutsize = slen - maxlen + len;			// Number of characters to leave out of middle of source.
		len = (slen - cutsize) / 2;			// Length of initial segment (half of what will be copied).
								// Include white space at end first segment if present.
		if(((strp = srcp + len)[0] == ' ' || strp[0] == '\t') && strp[-1] != ' ' && strp[-1] != '\t')
			++len;
		strp = stplcpy(destp,srcp,len + 1);		// Copy initial segment.
		strp = stpcpy(strp,ellipsis);			// Add ellipsis.
								// Copy last segment.
		stplcpy(strp,srcp + cutsize + len,slen - cutsize - len + 1);
		}

	return destp;
	}
示例#2
0
// Check string for an identifier or keyword.  If found, set *srcpp to first invalid character, set *lenp to word length (if
// lenp not NULL), and return symbol; otherwise, return s_nil.
enum e_sym getident(char **srcpp,ushort *lenp) {
	int i;
	ushort len;
	enum e_sym sym;
	char *srcp,*srcp0 = *srcpp;

	if(!isident1(*srcp0))
		return s_nil;

	// Valid identifier found; find terminator.
	srcp = srcp0 + strspn(srcp0,identchars);

	// Query type?
	if(*srcp == TKC_QUERY) {
		*srcpp = srcp + 1;
		if(lenp != NULL)
			*lenp = *srcpp - srcp0;
		return s_identq;
		}

	// Check if keyword.
	sym = s_ident;
	char idbuf[(len = srcp - srcp0) + 1];
	stplcpy(idbuf,srcp0,len + 1);
	if((i = binary(idbuf,kwname,NKEYWORDS)) >= 0) {
		sym = kwtab[i].s;
		if(lenp != NULL)
			*lenp = len;
		}

	// Return results.
	*srcpp = srcp;
	return sym;
	}
示例#3
0
void _start(void)
{
    struct utsname name;
    const char text_sysname[] = "sysname: ";
    const char text_nodename[] = "nodename: ";
    const char text_release[] = "release: ";
    const char text_version[] = "version: ";
    const char text_machine[] = "machine: ";
    const char text_domainname[] = "domainname: ";
    char buffer[sizeof(text_sysname) + sizeof(name.sysname) +
                sizeof(text_nodename) + sizeof(name.nodename) +
                sizeof(text_release) + sizeof(name.release) +
                sizeof(text_version) + sizeof(name.version) +
                sizeof(text_machine) + sizeof(name.machine) +
                sizeof(text_domainname) + sizeof(name.domainname) + 1];
    char *ptr;

    if (_uname(&name) < 0) {
        write_string(2, "Error: uname failed\n");
        exit(1);
    }
    ptr = buffer;
    ptr = stplcpy(ptr, text_sysname, sizeof(text_sysname) - 1);
    ptr = stplcpy(ptr, name.sysname, sizeof(name.sysname));
    *ptr++ = '\n';
    ptr = stplcpy(ptr, text_nodename, sizeof(text_nodename) - 1);
    ptr = stplcpy(ptr, name.nodename, sizeof(name.nodename));
    *ptr++ = '\n';
    ptr = stplcpy(ptr, text_release, sizeof(text_release) - 1);
    ptr = stplcpy(ptr, name.release, sizeof(name.release));
    *ptr++ = '\n';
    ptr = stplcpy(ptr, text_version, sizeof(text_version) - 1);
    ptr = stplcpy(ptr, name.version, sizeof(name.version));
    *ptr++ = '\n';
    ptr = stplcpy(ptr, text_machine, sizeof(text_machine) - 1);
    ptr = stplcpy(ptr, name.machine, sizeof(name.machine));
    *ptr++ = '\n';
    ptr = stplcpy(ptr, text_domainname, sizeof(text_domainname) - 1);
    ptr = stplcpy(ptr, name.domainname, sizeof(name.domainname));
    *ptr++ = '\n';
    write_all(1, buffer, (size_t)(ptr - buffer));
    exit(0);
}