static _IO_size_t _IO_obstack_xsputn (_IO_FILE *fp, const void *data, _IO_size_t n) { struct obstack *obstack = ((struct _IO_obstack_file *) fp)->obstack; if (fp->_IO_write_ptr + n > fp->_IO_write_end) { int size; /* We need some more memory. First shrink the buffer to the space we really currently need. */ obstack_blank_fast (obstack, fp->_IO_write_ptr - fp->_IO_write_end); /* Now grow for N bytes, and put the data there. */ obstack_grow (obstack, data, n); /* Setup the buffer pointers again. */ fp->_IO_write_base = obstack_base (obstack); fp->_IO_write_ptr = obstack_next_free (obstack); size = obstack_room (obstack); fp->_IO_write_end = fp->_IO_write_ptr + size; /* Now allocate the rest of the current chunk. */ obstack_blank_fast (obstack, size); } else fp->_IO_write_ptr = __mempcpy (fp->_IO_write_ptr, data, n); return n; }
int _IO_obstack_vprintf (struct obstack *obstack, const char *format, va_list args) { struct obstack_FILE { struct _IO_obstack_file ofile; } new_f; int result; int size; int room; #ifdef _IO_MTSAFE_IO new_f.ofile.file.file._lock = NULL; #endif _IO_no_init (&new_f.ofile.file.file, _IO_USER_LOCK, -1, NULL, NULL); _IO_JUMPS (&new_f.ofile.file) = &_IO_obstack_jumps; room = obstack_room (obstack); size = obstack_object_size (obstack) + room; if (size == 0) { /* We have to handle the allocation a bit different since the `_IO_str_init_static' function would handle a size of zero different from what we expect. */ /* Get more memory. */ obstack_make_room (obstack, 64); /* Recompute how much room we have. */ room = obstack_room (obstack); size = room; assert (size != 0); } _IO_str_init_static_internal ((struct _IO_strfile_ *) &new_f.ofile, obstack_base (obstack), size, obstack_next_free (obstack)); /* Now allocate the rest of the current chunk. */ assert (size == (new_f.ofile.file.file._IO_write_end - new_f.ofile.file.file._IO_write_base)); assert (new_f.ofile.file.file._IO_write_ptr == (new_f.ofile.file.file._IO_write_base + obstack_object_size (obstack))); obstack_blank_fast (obstack, room); new_f.ofile.obstack = obstack; result = _IO_vfprintf (&new_f.ofile.file.file, format, args); /* Shrink the buffer to the space we really currently need. */ obstack_blank_fast (obstack, (new_f.ofile.file.file._IO_write_ptr - new_f.ofile.file.file._IO_write_end)); return result; }
char * frag_var (relax_stateT type, int max_chars, int var, relax_substateT subtype, symbolS *symbol, offsetT offset, char *opcode) { register char *retval; frag_grow (max_chars); retval = obstack_next_free (&frchain_now->frch_obstack); obstack_blank_fast (&frchain_now->frch_obstack, max_chars); frag_now->fr_var = var; frag_now->fr_type = type; frag_now->fr_subtype = subtype; frag_now->fr_symbol = symbol; frag_now->fr_offset = offset; frag_now->fr_opcode = opcode; #ifdef USING_CGEN frag_now->fr_cgen.insn = 0; frag_now->fr_cgen.opindex = 0; frag_now->fr_cgen.opinfo = 0; #endif #ifdef TC_FRAG_INIT TC_FRAG_INIT (frag_now); #endif as_where (&frag_now->fr_file, &frag_now->fr_line); frag_new (max_chars); return (retval); }
char * frag_more (int nchars) { register char *retval; frag_alloc_check (&frchain_now->frch_obstack); frag_grow (nchars); retval = obstack_next_free (&frchain_now->frch_obstack); obstack_blank_fast (&frchain_now->frch_obstack, nchars); return (retval); }
/* * frag_more() * * Start a new frag unless we have n more chars of room in the current frag. * Close off the old frag with a .fill 0. * * Return the address of the 1st char to write into. Advance * frag_now_growth past the new chars. */ char * frag_more( int nchars) { register char *retval; frag_grow (nchars); retval = obstack_next_free (&frags); obstack_blank_fast (&frags, nchars); return (retval); } /* frag_more() */
char * frag_var (relax_stateT type, int max_chars, int var, relax_substateT subtype, symbolS *symbol, offsetT offset, char *opcode) { register char *retval; frag_grow (max_chars); retval = obstack_next_free (&frchain_now->frch_obstack); obstack_blank_fast (&frchain_now->frch_obstack, max_chars); frag_var_init (type, max_chars, var, subtype, symbol, offset, opcode); return retval; }
static int _IO_obstack_overflow (_IO_FILE *fp, int c) { struct obstack *obstack = ((struct _IO_obstack_file *) fp)->obstack; int size; /* Make room for another character. This might as well allocate a new chunk a memory and moves the old contents over. */ assert (c != EOF); obstack_1grow (obstack, c); /* Setup the buffer pointers again. */ fp->_IO_write_base = obstack_base (obstack); fp->_IO_write_ptr = obstack_next_free (obstack); size = obstack_room (obstack); fp->_IO_write_end = fp->_IO_write_ptr + size; /* Now allocate the rest of the current chunk. */ obstack_blank_fast (obstack, size); return c; }
/* Grow an obstack with formatted output. Return the number of bytes added to OBS. No trailing nul byte is added, and the object should be closed with obstack_finish before use. Upon memory allocation error, call obstack_alloc_failed_handler. Upon other error, return -1. */ int obstack_vprintf (struct obstack *obs, const char *format, va_list args) { /* If we are close to the end of the current obstack chunk, use a stack-allocated buffer and copy, to reduce the likelihood of a small-size malloc. Otherwise, print directly into the obstack. */ enum { CUTOFF = 1024 }; char buf[CUTOFF]; char *base = obstack_next_free (obs); size_t len = obstack_room (obs); char *str; if (len < CUTOFF) { base = buf; len = CUTOFF; } str = vasnprintf (base, &len, format, args); if (!str) { if (errno == ENOMEM) obstack_alloc_failed_handler (); return -1; } if (str == base && str != buf) /* The output was already computed in place, but we need to account for its size. */ obstack_blank_fast (obs, len); else { /* The output exceeded available obstack space or we used buf; copy the resulting string. */ obstack_grow (obs, str, len); if (str != buf) free (str); } return len; }
/* * frag_var() * * Start a new frag unless we have max_chars more chars of room in the current frag. * Close off the old frag with a .fill 0. * * Set up a machine_dependent relaxable frag, then start a new frag. * Return the address of the 1st char of the var part of the old frag * to write into. */ char * frag_var( relax_stateT type, int max_chars, int var, relax_substateT subtype, symbolS *symbol, long offset, char *opcode) { register char *retval; frag_grow (max_chars); retval = obstack_next_free (&frags); obstack_blank_fast (&frags, max_chars); frag_now->fr_var = var; frag_now->fr_type = type; frag_now->fr_subtype = subtype; frag_now->fr_symbol = symbol; frag_now->fr_offset = offset; frag_now->fr_opcode = opcode; frag_new (max_chars); return (retval); } /* frag_var() */