void freearglist(bpc_arg_t *al, int n) { while (n > 0) { bsFree(al[n].name); bsFree(al[n].defvalue); n--; } }
//============================================================== 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; } }
//============================================================== void MemFree(void *ptr) //-------------------------------------------------------------- // メモリを開放 //-------------------------------------------------------------- // in: ptr = 開放する領域 //-------------------------------------------------------------- // out: なし //============================================================== { Header *p; ASSERT(ptr); p = (Header *)ptr; bsFree(&gMem.mem_hdr[(p - 1)->s.area], ptr); }
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; }