static void fsclunk(Fid* fid) { Query* q; File* f; f = fid->file; if(f == nil) return; q = f->aux; if(q == nil) return; if(q->expr != nil){ /* the query was already made, destroy the file. * * We must incref the file because * removefile assumes that we hold the * reference given to it, and we do not. * We just want the file removed from the tree. */ free(q->text); freeexpr(q->expr); free(q); f->aux = nil; incref(&f->ref); removefile(f); } }
void freeexpr(Expr *e) { if(e->type >= 2) freeexpr(e->r); if(e->type == 3) freeexpr(e->l); free(e); }
void freesubexpr(struct expr *e) /* free e->subexpr only */ { if (e->subexpr) { freeexpr(e->subexpr->a); freeexpr(e->subexpr->b); free(e->subexpr); e->subexpr = NULL; } }
void freeexpr(struct expr *e) { if (e->subexpr) { freeexpr(e->subexpr->a); freeexpr(e->subexpr->b); free(e->subexpr); } free(e); }
int main() { char buf[500]; while (fgets(buf, sizeof buf, stdin)) { struct expr *e = parse(buf); if (e) { printf("value is %d\n", evalexpr(e)); freeexpr(e); } else { printf("%s\n", errorstatus); } } return(0); }
static void fswrite(Req* r) { Query* q; File* f; long count; char* ntext; int l; if(r->fid->qid.type&QTDIR){ respond(r, "bug: write on dir"); return; } f = r->fid->file; if(f == ctlf){ ctlwrite(r); return; } count = r->ifcall.count; r->ofcall.count = count; q = f->aux; if(q->expr != nil){ // a previous query was made. start another. freeexpr(q->expr); free(q->text); q->expr = nil; q->text = nil; } /* append text to query text, ignore offset. */ l = strlen(q->text); ntext = emalloc9p(l + count + 1); strcpy(ntext, q->text); memmove(ntext+l, r->ifcall.data, count); ntext[l+count]=0; free(q->text); q->text = ntext; respond(r, nil); }