3 /* mallocを実行し、メモリを確保できない場合は */
5 void *malloc_chk(size_t size, char *tag)
9 if((p = malloc(size)) == NULL) {
10 fprintf(stderr, "%s: cannot allocate memory\n", tag);
16 /* malloc_chkを実行してメモリを確保してから、 */
18 char *strdup_chk(const char *s, char *tag)
23 t = malloc_chk(strlen(s) + 1, tag);
35 bool addcerrlist(int newerrc, CERR newerrv[])
40 assert(newerrc > 0 && newerrv != NULL);
41 if(cerrlist == NULL) {
42 p = cerrlist = malloc_chk(sizeof(CERRLIST), "cerrlist");
44 for(p = cerrlist; p != NULL; p = p->next) {
47 p = q->next = malloc_chk(sizeof(CERRLIST), "cerrlist.next");
49 for(i = 0; i < newerrc; i++) {
50 p->cerr = &(newerrv[i]);
51 p->next = malloc_chk(sizeof(CERRLIST), "cerrlist.next");
60 void setcerr(int num, const char *str)
63 cerr->msg = malloc_chk(CERRMSGSIZE + 1, "cerr.msg");
64 if(str != NULL && strlen(str) <= CERRSTRSIZE) {
65 sprintf(cerr->msg, "%s: %s", str, getcerrmsg(cerr->num));
67 strcpy(cerr->msg, getcerrmsg(cerr->num));
71 /* エラーリストから、エラー番号に対応するメッセージを返す */
72 char *getcerrmsg(int num)
76 for(p = cerrlist; p != NULL; p = p->next) {
77 if(num == p->cerr->num) {
81 return "unknown error";
84 /* エラーリストと現在のエラーを解放する */
87 CERRLIST *p = cerrlist, *q;