Ejemplo n.º 1
0
void freearglist(bpc_arg_t *al, int n) {
  while (n > 0) {
    bsFree(al[n].name);
    bsFree(al[n].defvalue);
    n--;
  }
}
Ejemplo n.º 2
0
//==============================================================
static void *bsRealloc(sMemHeader *header, void *ptr, size_t size, const char *name)
//--------------------------------------------------------------
// メモリ再割り当て
//--------------------------------------------------------------
// in:	header = メモリハンドル
//		ptr    = データポインタ(NULL は渡されない)
//		size   = 新しく要求するサイズ
//		name   = 領域名
//--------------------------------------------------------------
// out:	見つかったメモリ領域の先頭アドレス
//==============================================================
{
    size_t newunits, units, d;
    Header *p;
    void *newptr;

    if(!size)
    {
        bsFree(header, ptr);					// size == 0 : 領域を開放する
        return NULL;
    }

    p = (Header *)ptr - 1;
    units = p->s.size;
    newunits = (size + sizeof(Header) - 1) / sizeof(Header) + 1;
    d = units - newunits;
    if((d == 0) || (d == 1))
    {
        return ptr;								// ブロック数に変化が無ければ、処理を行わない
    }
    else
    {
        if(p->s.top)	newptr = bsMalloc2(header, size, name);
        else			newptr = bsMalloc(header, size, name);

        if(newptr)
        {
            memcpy(newptr, ptr, size);			// 別の領域が確保された場合、データをコピーする
            bsFree(header, ptr);				// 別の領域が確保された場合のみ、オリジナルを開放
        }
        else
        {
            PRINTF("realloc error.\n");
        }

        return newptr;
    }
}
Ejemplo n.º 3
0
//==============================================================
void MemFree(void *ptr)
//--------------------------------------------------------------
// メモリを開放
//--------------------------------------------------------------
// in:	ptr  = 開放する領域
//--------------------------------------------------------------
// out:	なし
//==============================================================
{
    Header *p;

    ASSERT(ptr);

    p = (Header *)ptr;
    bsFree(&gMem.mem_hdr[(p - 1)->s.area], ptr);
}
Ejemplo n.º 4
0
static int stdio_close(BSInterp *i, BSStream *s) {
  struct stdio_priv *p;
  int res = 0;
  assert(s != NULL);
  p = (struct stdio_priv *)(s->priv);
  assert(p != NULL);
  if (p->f_read && p->f_read != stdin) {
    if (p->is_popen)
      res += pclose(p->f_read);
    else
      res += fclose(p->f_read);
  }
  if (p->f_write && p->f_write != p->f_read) {
    if (p->f_write == stdout || p->f_write == stderr)
      res += fflush(p->f_write); /* don't try to close */
    else if (p->is_popen)
      res += pclose(p->f_write);
    else
      res += fclose(p->f_write);
  }
  bsFree(p);
  return res;
}