Advertisement
Guest User

Untitled

a guest
Feb 26th, 2019
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.66 KB | None | 0 0
  1. #define _GNU_SOURCE
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <search.h>
  6. #include "mybdd.h"
  7.  
  8. typedef struct {
  9.   char v;
  10.   int f, t;
  11. } bdd_t;
  12.  
  13. typedef struct {
  14.   bdd_t *tbl;
  15.   int   rootidx;
  16. } bddtbl_t;
  17.  
  18. void *bdd_mk (char *trutbl, int numvars)
  19. {
  20.   int bdd_mk_ (char *trutbl, int numvars, int varidx,
  21.                bdd_t **pbddtbl, int *pendidx, void **pbddtree)
  22.   {
  23.     if (varidx == numvars)
  24.       return *trutbl;
  25.  
  26.     int numstat = 1 << (numvars - varidx);
  27.     bdd_t ret;
  28.     ret.f = bdd_mk_ (trutbl, numvars, varidx+1,
  29.                      pbddtbl, pendidx, pbddtree);
  30.     if (!memcmp (trutbl, trutbl + numstat/2, numstat/2))
  31.       return ret.f;
  32.     ret.t = bdd_mk_ (trutbl + numstat/2, numvars, varidx+1,
  33.                      pbddtbl, pendidx, pbddtree);
  34.     ret.v = varidx;
  35.     (*pbddtbl)[*pendidx] = ret;
  36.  
  37.     int bdd_cmp (const void *bdd1, const void *bdd2)
  38.     {
  39.       static bdd_t *base;
  40.       if (bdd1 == NULL) {
  41.         base = bdd2;
  42.         return 0;
  43.       }
  44.       return memcmp (base + (int )bdd1,
  45.                      base + (int )bdd2,
  46.                      sizeof (bdd_t));
  47.     }
  48.     bdd_cmp (NULL, *pbddtbl);
  49.     int oldidx = (int )*(void **)tsearch ((void *)*pendidx, pbddtree, bdd_cmp);
  50.  
  51.     if (oldidx == *pendidx) {
  52.       if (*pendidx % 0x80 == 0)
  53.         *pbddtbl = realloc (*pbddtbl, (*pendidx + 0x81) * sizeof (bdd_t));
  54.       return (*pendidx)++;
  55.     } else
  56.       return oldidx;
  57.   }
  58.   static const bdd_t termf = {0, 0, 0},
  59.                      termt = {1, 0, 0};
  60.   bddtbl_t *bddtbl = malloc (sizeof (bddtbl_t));
  61.   bddtbl->tbl = malloc (0x81 * sizeof (bdd_t));
  62.   bddtbl->tbl[0] = termf;
  63.   bddtbl->tbl[1] = termt;
  64.  
  65.   void* bddtree = NULL;
  66.   int endidx = 2;
  67.   bddtbl->rootidx = bdd_mk_ (trutbl, numvars, 0,
  68.                              &bddtbl->tbl, &endidx, &bddtree);
  69.   bddtbl->tbl[endidx].v = -1;
  70.   void empfunc (void* v) { return; }
  71.   tdestroy (bddtree, empfunc); // вот в этом месте я рассчитываю получить свои мегабайты обратно
  72.  
  73.   return bddtbl;
  74. }
  75.  
  76. void bdd_rm (void *this)
  77. {
  78.   free (((bddtbl_t *)this)->tbl);
  79.   free (this);
  80. }
  81.  
  82. int bdd_val (void *this, char *varval)
  83. {
  84.   bddtbl_t *this_ = this;
  85.   int idx = this_->rootidx;
  86.   while (this_->tbl[idx].f || this_->tbl[idx].t)
  87.     idx = varval[this_->tbl[idx].v]
  88.         ? this_->tbl[idx].t
  89.         : this_->tbl[idx].f;
  90.  
  91.   return this_->tbl[idx].v;
  92. }
  93.  
  94. void bdd_print (void *this, FILE *file)
  95. {
  96.   bddtbl_t *this_ = this;
  97.   for (int i = 0; this_->tbl[i].v != -1; ++i)
  98.     fprintf (file, "%d: %d, %d, %d\n",
  99.              i, this_->tbl[i].v, this_->tbl[i].f, this_->tbl[i].t);
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement