X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=include%2Flibiberty.h;h=e3eca9d75cc03f41b4ffddd8a1707e15696f419f;hb=6a1a89a6b0403252f6c5d99481069528dbf709bf;hp=27291c988681629ac25aeeff0199af1ecc25166f;hpb=6fa7e596c6d7740d1bf527a7113d8d7958bd865f;p=pf3gnuchains%2Fgcc-fork.git diff --git a/include/libiberty.h b/include/libiberty.h index 27291c98868..e3eca9d75cc 100644 --- a/include/libiberty.h +++ b/include/libiberty.h @@ -1,6 +1,6 @@ /* Function declarations for libiberty. - Copyright 2001, 2002, 2005 Free Software Foundation, Inc. + Copyright 2001, 2002, 2005, 2007 Free Software Foundation, Inc. Note - certain prototypes declared in this header file are for functions whoes implementation copyright does not belong to the @@ -86,6 +86,10 @@ extern char **dupargv (char **) ATTRIBUTE_MALLOC; extern void expandargv PARAMS ((int *, char ***)); +/* Write argv to an @-file, inserting necessary quoting. */ + +extern int writeargv PARAMS ((char **, FILE *)); + /* Return the last component of a path name. Note that we can't use a prototype here because the parameter is declared inconsistently across different systems, sometimes as "char *" and sometimes as @@ -316,26 +320,34 @@ extern double physmem_available (void); /* Scalar allocators. */ +#define XALLOCA(T) ((T *) alloca (sizeof (T))) #define XNEW(T) ((T *) xmalloc (sizeof (T))) #define XCNEW(T) ((T *) xcalloc (1, sizeof (T))) +#define XDUP(T, P) ((T *) xmemdup ((P), sizeof (T), sizeof (T))) #define XDELETE(P) free ((void*) (P)) /* Array allocators. */ +#define XALLOCAVEC(T, N) ((T *) alloca (sizeof (T) * (N))) #define XNEWVEC(T, N) ((T *) xmalloc (sizeof (T) * (N))) #define XCNEWVEC(T, N) ((T *) xcalloc ((N), sizeof (T))) +#define XDUPVEC(T, P, N) ((T *) xmemdup ((P), sizeof (T) * (N), sizeof (T) * (N))) #define XRESIZEVEC(T, P, N) ((T *) xrealloc ((void *) (P), sizeof (T) * (N))) #define XDELETEVEC(P) free ((void*) (P)) /* Allocators for variable-sized structures and raw buffers. */ +#define XALLOCAVAR(T, S) ((T *) alloca ((S))) #define XNEWVAR(T, S) ((T *) xmalloc ((S))) #define XCNEWVAR(T, S) ((T *) xcalloc (1, (S))) +#define XDUPVAR(T, P, S1, S2) ((T *) xmemdup ((P), (S1), (S2))) #define XRESIZEVAR(T, P, S) ((T *) xrealloc ((P), (S))) /* Type-safe obstack allocator. */ #define XOBNEW(O, T) ((T *) obstack_alloc ((O), sizeof (T))) +#define XOBNEWVEC(O, T, N) ((T *) obstack_alloc ((O), sizeof (T) * (N))) +#define XOBNEWVAR(O, T, S) ((T *) obstack_alloc ((O), (S))) #define XOBFINISH(O, T) ((T) obstack_finish ((O))) /* hex character manipulation routines */ @@ -400,6 +412,19 @@ extern struct pex_obj *pex_init (int flags, const char *pname, PEX_BINARY_INPUT. */ #define PEX_BINARY_OUTPUT 0x20 +/* Capture stderr to a pipe. The output can be read by + calling pex_read_err and reading from the returned + FILE object. This flag may be specified only for + the last program in a pipeline. + + This flag is supported only on Unix and Windows. */ +#define PEX_STDERR_TO_PIPE 0x40 + +/* Capture stderr in binary mode. This flag is ignored + on Unix. */ +#define PEX_BINARY_ERROR 0x80 + + /* Execute one program. Returns NULL on success. On error returns an error string (typically just the name of a system call); the error string is statically allocated. @@ -472,33 +497,6 @@ extern const char *pex_run_in_environment (struct pex_obj *obj, int flags, const char *outname, const char *errname, int *err); -/* Return a `FILE' pointer FP for the standard input of the first - program in the pipeline; FP is opened for writing. You must have - passed `PEX_USE_PIPES' to the `pex_init' call that returned OBJ. - You must close FP yourself with `fclose' to indicate that the - pipeline's input is complete. - - The file descriptor underlying FP is marked not to be inherited by - child processes. - - This call is not supported on systems which do not support pipes; - it returns with an error. (We could implement it by writing a - temporary file, but then you would need to write all your data and - close FP before your first call to `pex_run' -- and that wouldn't - work on systems that do support pipes: the pipe would fill up, and - you would block. So there isn't any easy way to conceal the - differences between the two types of systems.) - - If you call both `pex_write_input' and `pex_read_output', be - careful to avoid deadlock. If the output pipe fills up, so that - each program in the pipeline is waiting for the next to read more - data, and you fill the input pipe by writing more data to FP, then - there is no way to make progress: the only process that could read - data from the output pipe is you, but you are blocked on the input - pipe. */ - -extern FILE *pex_write_input (struct pex_obj *obj, int binary); - /* Return a stream for a temporary file to pass to the first program in the pipeline as input. The file name is chosen as for pex_run. pex_run closes the file automatically; don't close it yourself. */ @@ -521,6 +519,14 @@ extern FILE *pex_input_pipe (struct pex_obj *obj, int binary); extern FILE *pex_read_output (struct pex_obj *, int binary); +/* Read the standard error of the last program to be executed. + pex_run can not be called after this. BINARY should be non-zero if + the file should be opened in binary mode; this is ignored on Unix. + Returns NULL on error. Don't call fclose on the returned FILE; it + will be closed by pex_free. */ + +extern FILE *pex_read_err (struct pex_obj *, int binary); + /* Return exit status of all programs in VECTOR. COUNT indicates the size of VECTOR. The status codes in the vector are in the order of the calls to pex_run. Returns 0 on error, 1 on success. */ @@ -543,7 +549,8 @@ struct pex_time extern int pex_get_times (struct pex_obj *, int count, struct pex_time *vector); -/* Clean up a pex_obj. */ +/* Clean up a pex_obj. If you have not called pex_get_times or + pex_get_status, this will try to kill the subprocesses. */ extern void pex_free (struct pex_obj *);