int so_write(int sid, const char *buf, size_t len) { uint32_t fz = 0; struct so_t * so = _grabWAndLock(sid); if (!so) return -1; if (so->mState != so_e_rw) { _unlockW(so); return -2; } fz = buf_fz(so->mWBuf); if (fz < len) { buf_expand(so->mWBuf, len - fz); } memcpy(so->mWBuf->mBuf + so->mWBuf->mCur, buf, len); so->mWBuf->mCur += len; if (!so->mInq) { _pushWQ(so); so->mInq = 1; } _unlockW(so); return len; }
int buf_append(buf_t *buf, char *src, size_t n) { if(buf->size < buf->len + n) { if(buf_expand(buf, buf->len + n) < 0) { fprintf(stderr, "buf_append: error expanding buffer\n"); return -1; } } memcpy(buf->data+buf->len, src, n); buf->len += n; return 0; }
/*----------------------------------------------------------------------------- * * ID: var_add 07.11.06 0.0.A. * * Summary: Добавление локальной переменной в таблицу * -----------------------------------------------------------------------------*/ uint STDCALL var_add( phashiuint hidn, ps_descid descvar ) { pfvar cvar; buf_expand( &fd.bvars, sizeof( fvar )); cvar = (pfvar)(fd.bvars.data + fd.bvars.use); fd.bvars.use += sizeof( fvar ); cvar->hidn = hidn; cvar->type = descvar->idtype; cvar->oftype = descvar->oftype; cvar->msr = descvar->msr; cvar->num = fd.varcount; cvar->flg = 0; cvar->oldoffbvar = 0; if ( ( descvar->flgdesc & DESCID_VAR || ( descvar->flgdesc == DESCID_PARSUBFUNC )) && !fd.curcount ) { //Формируем загрузку нового блока if ( descvar->flgdesc == DESCID_VAR ) { buf_appenduint( &fd.bblinit, CVarsInit ); buf_appenduint( &fd.bblinit, fd.blcount ); } fd.blcount++; if ( fd.lastcurcount ) { //Закрытие блока данных buf_appenduint( &fd.bhead, fd.lastcurcount ); fd.lastcurcount = 0; } } if ( descvar->flgdesc != DESCID_SUBFUNC ) { //Добавляем в заголовок функции create_varmode( descvar->flgdesc == DESCID_PARFUNC ? &fd.bhead : &fd.bvardef, 0, descvar ); fd.curcount++; return fd.varcount++; } return 0; }
int buf_sprintf(buf_t *buf, char *format, ...) { va_list args; int len; // compute needed len // va_start(args, format); len = vsnprintf(NULL, 0, format, args); if(buf->size < buf->len + len + 1) { if(buf_expand(buf, buf->len + len + 1) < 0) { fprintf(stderr, "buf_sprintf: error expanding buffer\n"); return -1; } } va_end(args); va_start(args, format); if(vsnprintf((buf->data + buf->len), len+1, format, args) != len) { fprintf(stderr, "buf_sprintf: error in snprintf\n"); return -1; } va_end(args); buf->len += len; buf->data[buf->len] = 0; // expect string // return len; }