Mercurial > emacs
view src/doprnt.c @ 4146:0c681748d0ce
* xfns.c (Fx_open_connection): Don't trust HAVE_XRMSETDATABASE;
use XrmSetDatabase only when HAVE_X11R5 is defined.
* xfns.c (Vx_resource_name): Renamed from Vxrdb_name, and made a
lisp-visible variable, so lisp/term/x-win.el can set it. Doc it
for "internal use only"; no need for NEWS entry.
(validate_x_resource_name): New function.
(Fx_get_resource): Doc fix. References to Vxrdb_name renamed. Call
validate_x_resource_name.
(x_window): References to Vxrdb_name renamed. Call
validate_x_resource_name.
(Fx_open_connection): References to Vxrdb_name renamed. Instead
of setting and validating its value here, just call
validate_x_resource_name.
(syms_of_xfns): Add DEFVAR_LISP for Vx_resource_name.
* xfns.c (x_set_frame_parameters): Don't set the frame's size and
position unless those parameters are actually specified in ALIST.
* xrdb.c: Implement search for app-defaults directory and
localized default databases, along with some other functionality
provided by Xt.
#include <stdio.h>, since we call sprintf.
[emacs] (malloc, realloc, free): #define these to xmalloc,
xrealloc, and xfree.
(x_get_string_resource, file_p): Add forward declarations for
these.
(x_customization_string): New variable.
(x_get_customization_string): New function.
(gethomedir): Return malloc'ed space of the right size, instead of
writing into a fixed-size buffer; this means that our callers do
not impose an arbitrary limit on file name length.
(magic_file_p): Rewrite of decode_magic; actually do the
substitutions, instead of expanding all %-escapes to "". Support
the customization string. Return 0 or the expanded file name,
instead of just zero or one. Allocate the space for the expanded
file name ourselves, instead of writing into a fixed-size buffer
passed to us; this removes an arbitrary limit.
(search_magic_path): Rewrite of magic_searchpath_decoder. Return
0 or the expanded file name, instead of just zero or one.
Allocate the space for the expanded file name ourselves, instead
of writing into a fixed-size buffer passed to us; this means that
our callers do not impose an arbitrary limit on file name length.
(get_system_app): Changed to work with search_magic_path.
(get_user_app): Rewritten to work with search_magic_path, and not
to assume that the values of XAPPLRESDIR is a single directory.
(get_user_db): Properly use the new version of gethomedir.
(get_environ_db): Remove arbitrary limit on length of host name.
(x_load_resources): Take a new argument, myname. Call get_user_db
early to obtain the customization string.
Changes to stand-alone testing code.
* xfns.c (Fx_open_connection): Set Vxrdb_name early, and pass it
to x_load_resources.
author | Jim Blandy <jimb@redhat.com> |
---|---|
date | Sun, 18 Jul 1993 06:29:19 +0000 |
parents | b6c62e4abf59 |
children | 8e36034f65e2 |
line wrap: on
line source
/* Output like sprintf to a buffer of specified size. Also takes args differently: pass one pointer to an array of strings in addition to the format string which is separate. Copyright (C) 1985 Free Software Foundation, Inc. This file is part of GNU Emacs. GNU Emacs is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. GNU Emacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #include <stdio.h> #include <ctype.h> /* Generate output from a format-spec FORMAT, terminated at position FORMAT_END. Output goes in BUFFER, which has room for BUFSIZE chars. If the output does not fit, truncate it to fit. Returns the number of characters stored into BUFFER. ARGS points to the vector of arguments, and NARGS says how many. A double counts as two arguments. */ doprnt (buffer, bufsize, format, format_end, nargs, args) char *buffer; register int bufsize; char *format; char *format_end; int nargs; char **args; { int cnt = 0; /* Number of arg to gobble next */ register char *fmt = format; /* Pointer into format string */ register char *bufptr = buffer; /* Pointer into output buffer.. */ /* Use this for sprintf unless we need something really big. */ char tembuf[100]; /* Size of sprintf_buffer. */ int size_allocated = 100; /* Buffer to use for sprintf. Either tembuf or same as BIG_BUFFER. */ char *sprintf_buffer = tembuf; /* Buffer we have got with malloc. */ char *big_buffer = 0; register int tem; char *string; char fmtcpy[20]; int minlen; int size; /* Field width factor; e.g., %90d */ if (format_end == 0) format_end = format + strlen (format); bufsize--; while (fmt != format_end && bufsize > 0) /* Loop until end of format string or buffer full */ { if (*fmt == '%') /* Check for a '%' character */ { int size_bound; fmt++; /* Copy this one %-spec into fmtcpy. */ string = fmtcpy; *string++ = '%'; while (string < fmtcpy + sizeof fmtcpy - 1) { *string++ = *fmt; if (! (*fmt >= '0' && *fmt <= '9') && *fmt != '-' && *fmt != ' ') break; fmt++; } *string = 0; /* Get an idea of how much space we might need. */ size_bound = atoi (&fmtcpy[1]) + 50; /* Make sure we have that much. */ if (size_bound > size_allocated) { if (big_buffer) big_buffer = (char *) xrealloc (big_buffer, size_bound); else big_buffer = (char *) xmalloc (size_bound); sprintf_buffer = big_buffer; size_allocated = size_bound; } minlen = 0; switch (*fmt++) { default: error ("Invalid format operation %%%c", fmt[-1]); /* case 'b': */ case 'd': case 'o': case 'x': if (cnt == nargs) error ("Format string wants too many arguments"); sprintf (sprintf_buffer, fmtcpy, args[cnt++]); /* Now copy into final output, truncating as nec. */ string = sprintf_buffer; goto doit; case 'f': case 'e': case 'g': { union { double d; char *half[2]; } u; if (cnt + 1 == nargs) error ("Format string wants too many arguments"); u.half[0] = args[cnt++]; u.half[1] = args[cnt++]; sprintf (sprintf_buffer, fmtcpy, u.d); /* Now copy into final output, truncating as nec. */ string = sprintf_buffer; goto doit; } case 'S': string[-1] = 's'; case 's': if (cnt == nargs) error ("Format string wants too many arguments"); string = args[cnt++]; if (fmtcpy[1] != 's') minlen = atoi (&fmtcpy[1]); /* Copy string into final output, truncating if no room. */ doit: tem = strlen (string); if (minlen > 0) { while (minlen > tem && bufsize > 0) { *bufptr++ = ' '; bufsize--; minlen--; } minlen = 0; } if (tem > bufsize) tem = bufsize; strncpy (bufptr, string, tem); bufptr += tem; bufsize -= tem; if (minlen < 0) { while (minlen < - tem && bufsize > 0) { *bufptr++ = ' '; bufsize--; minlen++; } minlen = 0; } continue; case 'c': if (cnt == nargs) error ("Format string wants too many arguments"); *bufptr++ = (int) args[cnt++]; bufsize--; continue; case '%': fmt--; /* Drop thru and this % will be treated as normal */ } } *bufptr++ = *fmt++; /* Just some characters; Copy 'em */ bufsize--; }; /* If we had to malloc something, free it. */ if (big_buffer) xfree (big_buffer); *bufptr = 0; /* Make sure our string end with a '\0' */ return bufptr - buffer; }