示例#1
0
NodeOfTree *add_tree(NodeOfTree *root, TypeOfKey key)
{
	if (root == nullptr)
	{
		root = createNode(key);
	}
	if (key < root->key)
	{
		if (root->left == nullptr)
		{
			root->left = createNode(key);
		}
		else
		{
			add_tree(root->left, key);
		}
	}
	if (key > root->key)
	{
		if (root->right == nullptr)
		{
			root->right = createNode(key);
		}
		else
		{
			add_tree(root->right, key);
		}
	}
	return root;
}
示例#2
0
void add_tree(binarytree *t, int x) {
	if ((*t) == NULL) {
		(*t) = (binarytree)malloc(sizeof(struct treenode));
		(*t) -> data = x;
		(*t) -> left = NULL;
		(*t) -> right = NULL;
	} else if (x <= (*t) -> data) {
		add_tree(&(*t) -> left, x);
	} else {
		add_tree(&(*t) -> right, x);
	}
}
示例#3
0
void add_tree(TREE ** T, int num)
{
	if (*T == NULL) {
		*T = (TREE *) malloc(sizeof(TREE));
		(*T)->num = num;
		(*T)->lchild = NULL;
		(*T)->rchild = NULL;
	} else if ((*T)->num > num)
		add_tree(&((*T)->lchild), num);
	else
		add_tree(&((*T)->rchild), num);
}
示例#4
0
t_op			*ft_create_tree(t_op **lst)
{
    t_op		*tree;
    t_op		*save;
    t_op		*tmp;

    tree = NULL;
    tmp = *lst;
    save = *lst;
    while (save)
    {
        save = NULL;
        while (tmp)
        {
            if (!save && tmp->stat == 0)
                save = tmp;
            else if (save && tmp->prior <= save->prior && tmp->stat == 0)
                save = tmp;
            tmp = tmp->next;
        }
        if (save)
            save->stat = 1;
        add_tree(&tree, save);
        tmp = *lst;
    }
    return (tree);
}
示例#5
0
struct tnode *add_tree(struct tnode *p, char *w)
{
	int cond;

	if (p == NULL) {
		p = talloc();
		p->word = str_dump(w);
		p->count = 1;
		p->left = p->right = NULL;
	} else if ((cond = strcmp(w, p->word)) == 0)
		p->count++;
	else if (cond < 0)
		p->left = add_tree(p->left, w);
	else
		p->right = add_tree(p->right, w);
	return p;
}
示例#6
0
void treesort(int A[], int N)
{
	int i;
	TREE *T = NULL;
	for (i = 0; i < N; i++)
		add_tree(&T, A[i]);
	midwalk(T, A);
}
示例#7
0
void add_tree(deque<string> tag, const stu & u, const vector<int> & no, Tree & t){
	for (int i = 0; i != no.size(); ++i)
		if (!count(t.pid[no[i]].begin(), t.pid[no[i]].end(), u.ID))
			t.pid[no[i]].push_back(u.ID);
	if (!tag.empty()){
		string v = tag.front(); tag.pop_front();
		add_tree(tag, u, no, t.next[find_tree(v, t)]);
	}
}
示例#8
0
int main() {
	struct tnode *root;
	char word[MAXWORD];

	root = NULL;
	//'\t' is just for indicate the end 
	while (get_word(word, MAXWORD) != -1)
		if (isalpha(word[0]))
			root = add_tree(root, word);
	tree_print(root);
	return 0;
}
示例#9
0
Word *
add_tree(Word * p, char * word_buffer){
  // printf("insdfsdf\n");
  int cond;

  if(p == NULL){
    p = (Word * )malloc(sizeof(Word));
    p->count = 1;
    p->word = (char *)malloc(sizeof(word_buffer) + 1);
    strcpy(p->word, word_buffer);
    p->left = p->right = NULL;
  }
  else if ( (cond = strcmp(word_buffer, p->word)) == 0 )
    p->count++;
  else if ( cond < 0 )
    p->left = add_tree(p->left, word_buffer);
  else
    p->right = add_tree(p->right, word_buffer);

  return p;
}
示例#10
0
int
main(int argc, char *argv[]){
  FILE *f = NULL;
  f = fopen(argv[1], "r");

  if(!f){
    printf("Open file failed!\n");
    return 1;
  }

  char word_buffer[20];
  Word *root = NULL;

  while(get_word(f, word_buffer)){
    // printf("%s\n", word_buffer);
    if(strlen(word_buffer))
      root = add_tree(root, word_buffer);
  }

  tree_print(root);

  fclose(f);
  return 0;
}
示例#11
0
void read_uhunt()
{
	init_tree();
	for (size_t i = 0; i != user.size(); ++i){
		ifstream in("uhunt\\ana_" + user[i].ID + ".txt");
		if (!in) { cerr << user[i].name << ":打开文件失败!" << endl; continue; }
		string line; vector<int> road; road.resize(4);
		while (getline(in, line)){
			if (line.find("AOAPC") != string::npos)
				++road[1], road[2] = -1, road[3] = 0;
			else if (line.find("Chapter") != string::npos)
				road[2] = get_cpt(line), road[3] = 0;
			else if (count(line.begin(), line.end(), '-') == 6 && line.find("Examples") == string::npos && line.find("Exercises") == string::npos && line.find("Extra") == string::npos)
				++road[3];
			else if (line.find("accept") != string::npos) {
				vector<int> pid = get_pid(line);
				add_tree(get_tag(road), user[i], pid, root);
			}
		}
		in.close();
		printf("   %s:uhunt数据读取完毕\n", user[i].name.c_str());
	}
	cout << "所有同学数据读取完毕!" << endl;
}
示例#12
0
int main()
{
  TreeNode *tree = NULL;
  TreeNode *node;
  guint i;
  g_assert (!add_tree (&tree, 1));
  g_assert (!add_tree (&tree, 2));
  g_assert (!add_tree (&tree, 3));
  g_assert ( add_tree (&tree, 1));
  g_assert ( add_tree (&tree, 2));
  g_assert ( add_tree (&tree, 3));
  g_assert (!test_tree (&tree, 0));
  g_assert ( test_tree (&tree, 1));
  g_assert ( test_tree (&tree, 2));
  g_assert ( test_tree (&tree, 3));
  g_assert (!test_tree (&tree, 4));
  g_assert (!del_tree  (&tree, 0));
  g_assert ( del_tree  (&tree, 2));
  g_assert (!del_tree  (&tree, 4));
  g_assert (!test_tree (&tree, 0));
  g_assert ( test_tree (&tree, 1));
  g_assert (!test_tree (&tree, 2));
  g_assert ( test_tree (&tree, 3));
  g_assert (!test_tree (&tree, 4));
  g_assert ( add_tree (&tree, 1));
  g_assert (!add_tree (&tree, 2));
  g_assert ( add_tree (&tree, 3));
  g_assert ( del_tree  (&tree, 1));
  g_assert ( del_tree  (&tree, 2));
  g_assert ( del_tree  (&tree, 3));
  g_assert (tree == NULL);

  GSK_RBTREE_FIRST (TREE(&tree), node);
  g_assert (node == NULL);
  GSK_RBTREE_LAST (TREE(&tree), node);
  g_assert (node == NULL);

  /* Construct tree with odd numbers 1..999 inclusive */
  for (i = 1; i <= 999; i += 2)
    g_assert (!add_tree (&tree, i));

  GSK_RBTREE_FIRST (TREE(&tree), node);
  g_assert (node != NULL);
  g_assert (node->value == 1);
  GSK_RBTREE_LAST (TREE(&tree), node);
  g_assert (node != NULL);
  g_assert (node->value == 999);

  for (i = 1; i <= 999; i += 2)
    {
      g_assert (test_tree (&tree, i));
      g_assert (!test_tree (&tree, i+1));
    }
  for (i = 0; i <= 999; i++)
    {
      GSK_RBTREE_SUPREMUM_COMPARATOR (TREE(&tree), i, COMPARE_INT_WITH_TREE_NODE, node);
      g_assert (node);
      g_assert (node->value == (i%2)?i:(i+1));
    }
  GSK_RBTREE_SUPREMUM_COMPARATOR (TREE(&tree), 1000, COMPARE_INT_WITH_TREE_NODE, node);
  g_assert (node==NULL);
  for (i = 1; i <= 1000; i++)
    {
      TreeNode *node;
      GSK_RBTREE_INFIMUM_COMPARATOR (TREE(&tree), i, COMPARE_INT_WITH_TREE_NODE, node);
      g_assert (node);
      g_assert (node->value == (i%2)?i:(i-1));
    }
  GSK_RBTREE_INFIMUM_COMPARATOR (TREE(&tree), 0, COMPARE_INT_WITH_TREE_NODE, node);
  g_assert (node==NULL);
  for (i = 1; i <= 999; i += 2)
    g_assert (del_tree (&tree, i));

  /* random rbctree test */
  g_printerr ("Testing RBC-tree macros... ");
  for (i = 0; i < 1000; i++)
    test_random_rbcint_tree (10, TRUE);
  g_printerr (".");
  for (i = 0; i < 100; i++)
    test_random_rbcint_tree (100, TRUE);
  g_printerr (".");
  for (i = 0; i < 50; i++)
    {
      test_random_rbcint_tree (1000, FALSE);
      g_printerr (".");
    }
  for (i = 0; i < 5; i++)
    {
      test_random_rbcint_tree (10000, FALSE);
      g_printerr (".");
    }
  g_printerr (" done.\n");

  return 0;
}
示例#13
0
文件: dget.c 项目: gitgun/dLabPro
/* ---------------------------------------------------------------------------
.CSD:  dset

.NAM:  
.SHD:  
.DSC:  Realisierungsvorblock schreiben und Vorbereiten zum Daten-
  schreiben
.RES:  
.REM:  
.SAL:  
.EXF:  
.END.  
   ---------------------------------------------------------------------------
*/
short dset( DNORM_DCB * stream, short  knr, short rnr, DPARA * parms )
{
   RVB     rvb;
   long    rvb_bytes;    /* Anz. geschriebener RVB-Bytes     */
   int    i;
   KR_NODE *  tree_pt;
   long    write_bytes;
   char *  pt;


   /* ---------- Pruefung des Argumentstreams ----------
   */
   if ( stream == NULL || stream->fp == NULL )    /* garnicht offen!  */
   {
      derrno = DNERR_CLSTREAM;
      return( EOF );
   }
   if ( stream->fopen_mode == 'r' )      /* nicht fuer mich! */
   {
      derrno = stream->err = DNERR_NOWRITESTREAM;
      return( EOF );
   }

   /* ---------- Nachsehen, ob Realisierung mit knr/rnr im
                 Realisierungsbaum bereits vorhanden, wenn ja: Fehler

                 Achtung knr/rnr muessen! eindeutige shorts > 0 sein. 
     die Angabe von
                 FIRST, NEXT usw. (wie bei dget erlaubt) sind fuer
                 dset verboten ----------
   */
   if ( knr <= 0 || rnr <= 0 )       /* knr oder rnr == 0 usw.ist*/
   {
      derrno = stream->err = DNERR_BADKRN;
      return( EOF );                            /* nicht zu laessig!        */
   }
   if ( search_tree( stream->tree, knr, rnr,    /* wenn knr/rnr-Kombination */
                       SEARCH_KRN ) != NULL )   /* bereits vorhanden: Fehler*/
   {
      derrno = stream->err = DNERR_DUPLKRN;
      return( EOF );
   }

   /* ---------- einige Limitkontrollen ----------
   */
   if ( (ULONG)parms->lrb > SHRT_MAX )     /* rb zu lang,schwerer Fehl.*/
   {
      derrno = stream->err = DNERR_RBLEN;
      return( EOF );
   }
   if ( (ULONG)parms->lxt > SHRT_MAX )     /* rt zu lang! abschneiden! */
      parms->lxt = SHRT_MAX;
   if ( (ULONG)parms->lht > SHRT_MAX )     /* ht zu lang! abschneiden! */
      parms->lht = SHRT_MAX;
   if ( (ULONG)parms->lvrt > SHRT_MAX )     /* vrt zu lang! abschneiden!*/
      parms->lvrt = SHRT_MAX;

   /* ---------- Pruefung des Datumstring auf dnorm-Systemformat, bei
     Nichtkonsistenz Fehler!
     gueltiges Format mit 26 Zeichen:
            
                 'TAG - XX.MON.XX - HH:MM:SS'

     Falls kein Datumstring spezifiziert ist wird er an dieser 
                 Stelle mit dem aktuellen Datum generiert ----------
   */
   if ( parms->dt && parms->ldt )    /* Datum spezifiziert...    */
   {            /* Konsistenz testen        */
      if ( parms->ldt != 26 )      /* schon falsche Laenge     */
      {
         derrno = stream->err = DNERR_BADDATEFORM;
         return( EOF );
      }
      pt = parms->dt;
      if ( pt[4]  != '-' || pt[16] != '-' ||  /* Stichprobenartiger Test  */
     pt[8]  != '.' || pt[12] != '.' ||
     pt[20] != ':' || pt[23] != ':' )
      {
         derrno = stream->err = DNERR_BADDATEFORM;
         return( EOF );
      }
   }
   else            /* kein Datum spezifiziert  */
   {
      pt = dn_getfmtdate();
      parms->ldt = strlen( pt );
      parms->dt = dn_malloc( parms->ldt +1 );
      memmove( parms->dt, pt, (size_t)parms->ldt );
      ((char *)parms->dt)[parms->ldt] = '\0';
   }

   /* ---------- Berechnung/Ermittlung automatisch zu generierender
                 Realisierungsparameter ----------
   */
   parms->vsize = 0;
   for ( i = 0; i < parms->vdim; i++ )
      parms->vsize += parms->rb[i].size;  /* Vektorgroesse in byte    */
   parms->lrb = parms->vdim * sizeof( RB );     /* Laenge Recordbeschreibg. */


   /* ---------- Parameter aus parms bzw. knr/rnr uebernehmen ----------
   */
   rvb.vblocks = 0;
   rvb.rdblocks = 0;
   rvb.knr_sign[0] = 'K';   rvb.knr_sign[1] = 'N';
   rvb.knr = knr;
   rvb.rnr_sign[0] = 'R';   rvb.rnr_sign[1] = 'N';
   rvb.rnr = rnr;
   rvb.vanz_sign[0] = 'V';   rvb.vanz_sign[1] = 'A';
   rvb.vanz = 0;
   rvb.vdim_sign[0] = 'V';   rvb.vdim_sign[1] = 'D';
   rvb.vdim = parms->vdim;      /* Vektordimension          */
   rvb.vsize_sign[0] = 'V';   rvb.vsize_sign[1] = 'S';
   rvb.vsize = parms->vsize;      /* Vektorgroesse in byte    */
   rvb.zf_sign[0] = 'Z';   rvb.zf_sign[1] = 'F';
   rvb.zf = parms->zf;        /* Zeitfensterfaktor        */
   rvb.fsr_sign[0] = 'F';   rvb.fsr_sign[1] = 'S';
   rvb.fsr = parms->fsr;      /* Fortsetzrate             */
   rvb.ofs_sign[0] = 'O';   rvb.ofs_sign[1] = 'F';
   rvb.ofs = parms->ofs;      /* Offset                   */

   rvb.rres1_sign[0] = 'R';   rvb.rres1_sign[1] = '1';
   rvb.rres1 = parms->rres1;
   rvb.rres2_sign[0] = 'R';   rvb.rres2_sign[1] = '2';
   rvb.rres2 = parms->rres2;
   rvb.rres3_sign[0] = 'R';   rvb.rres3_sign[1] = '3';
   rvb.rres3 = parms->rres3;
   rvb.rres4_sign[0] = 'R';   rvb.rres4_sign[1] = '4';
   rvb.rres4 = parms->rres4;
   rvb.rres5_sign[0] = 'R';   rvb.rres5_sign[1] = '5';
   rvb.rres5 = parms->rres5;

   /* ---------- Pos. des Vorblockanfangs der Realiserung
                 fuer stream merken   ----------
   */
   fseek( stream->fp, 0L, SEEK_END );    /* Pos. ans Dateiende       */

   stream->rvb_rba = ftell( stream->fp );  /* Start-rba d. Realis.merk.*/

   /* ---------- Schreiben der Vorblockinformationen konstanter
                 Teil ----------
   */
   rvb_bytes = 0;                               /* Zelle:Bytelaenge Vorblock*/
#if defined _RISCC_ || defined _OSFC_ || defined _GNUC_ || defined _SUNGC_ || defined _MSCWIN_
   write_bytes = write_rvb( &rvb, stream->fp );
#else
   if(fwrite( &rvb, (size_t)sizeof( RVB ),   /* Vorblock schreiben       */
     (size_t)1, stream->fp ) !=1 ) {
         derrno = stream->err = DNERR_NOWRITESTREAM;
         return( EOF );
      }             /* RVB-blocks & Daten-block */
   write_bytes = sizeof( RVB ); 
#endif
   rvb_bytes += write_bytes;                    /* -anz. noch nicht bekannt!*/

   /* ---------- Schreiben der Recordbeschreibung ----------
   */
   fputc( 'R', stream->fp );  fputc( 'B', stream->fp );
   rvb_bytes += 2;
   if(fwrite_myswab( &parms->lrb, (size_t)sizeof( parms->lrb ),
     (size_t)1, stream->fp ) !=1 ) {
         derrno = stream->err = DNERR_NOWRITESTREAM;
         return( EOF );
      }
   rvb_bytes += sizeof( parms->lrb );
   if(parms->rb && (fwrite( parms->rb, (size_t)parms->lrb,
     (size_t)1, stream->fp ) !=1 )) {
         derrno = stream->err = DNERR_NOWRITESTREAM;
         return( EOF );
      }
   rvb_bytes += parms->lrb;

   /* ---------- Schreiben des Realis.kenntextes ----------
   */
   fputc( 'R', stream->fp );  fputc( 'T', stream->fp );
   rvb_bytes += 2;
   if(fwrite_myswab( &parms->lrt, (size_t)sizeof( parms->lrt ),
     (size_t)1, stream->fp ) !=1 ) {
         derrno = stream->err = DNERR_NOWRITESTREAM;
         return( EOF );
      }
   rvb_bytes += sizeof( parms->lrt );
   if(parms->rt && (fwrite( parms->rt, (size_t)parms->lrt,
     (size_t)1, stream->fp ) !=1 )) {
         derrno = stream->err = DNERR_NOWRITESTREAM;
         return( EOF );
      }
   rvb_bytes += parms->lrt;

   /* ---------- Schreiben des Datumstrings ----------
   */
   fputc( 'D', stream->fp );  fputc( 'T', stream->fp );
   rvb_bytes += 2;
   if(fwrite_myswab( &parms->ldt, (size_t)sizeof( parms->ldt ),
     (size_t)1, stream->fp ) !=1 ) {
         derrno = stream->err = DNERR_NOWRITESTREAM;
         return( EOF );
      }
   rvb_bytes += sizeof( parms->ldt );
   if(parms->dt && (fwrite( parms->dt, (size_t)parms->ldt,
     (size_t)1, stream->fp ) !=1 )) {
         derrno = stream->err = DNERR_NOWRITESTREAM;
         return( EOF );
      }
   rvb_bytes += parms->ldt;

   /* ---------- Schreiben der Modification history ----------
   */
   fputc( 'H', stream->fp );  fputc( 'T', stream->fp );
   rvb_bytes += 2;
   if(fwrite_myswab( &parms->lht, (size_t)sizeof( parms->lht ),
     (size_t)1, stream->fp ) !=1 ) {
         derrno = stream->err = DNERR_NOWRITESTREAM;
         return( EOF );
      }
   rvb_bytes += sizeof( parms->lht );
   if(parms->ht && (fwrite( parms->ht, (size_t)parms->lht,
     (size_t)1, stream->fp ) !=1 )) {
         derrno = stream->err = DNERR_NOWRITESTREAM;
         return( EOF );
      }
   rvb_bytes += parms->lht;

   /* ---------- Schreiben des Realisierungsattributrecords ----------
   */
   fputc( 'V', stream->fp );  fputc( 'R', stream->fp );
   rvb_bytes += 2;
   if(fwrite_myswab( &parms->lvrt, (size_t)sizeof( parms->lvrt ),
     (size_t)1, stream->fp ) !=1 ) {
         derrno = stream->err = DNERR_NOWRITESTREAM;
         return( EOF );
      }
   rvb_bytes += sizeof( parms->lvrt );
   if(parms->vrt && (fwrite( parms->vrt, (size_t)parms->lvrt,
     (size_t)1, stream->fp ) !=1 )) {
         derrno = stream->err = DNERR_NOWRITESTREAM;
         return( EOF );
      }
   rvb_bytes += parms->lvrt;

   /* ---------- Auffuellen des Vorblocks mit 0en und Vorblock -
                 groesse ermitteln (Anzahl der blocks) ----------
   */
   rvb.vblocks = (short)(rvb_bytes / BL_SIZE);  /* ganze blocks */
   rvb_bytes %= BL_SIZE;                        /* Rest-bytes vorhanden ? */
   if ( rvb_bytes )        /* nicht 0 */
   {
      for ( i = BL_SIZE; i > rvb_bytes; i-- )   /* angerissenen Block */
         fputc( '\0', stream->fp );    /* mit 0-en auffuellen */
      rvb.vblocks++;        /* ein block mehr */
   }

   /* ---------- Vorblock mit korrekter blocks-Zahl neuschreiben
                 und Pos. des Beginns der Realis.daten merken ----------
   */
   stream->dat_rba = ftell( stream->fp );  /* Beginn der Daten-blocks  */
   fseek( stream->fp, stream->rvb_rba,
    SEEK_SET );        /* Anfang des Vorblocks     */
#if defined _RISCC_ || defined _OSFC_ || defined _GNUC_ || defined _SUNGC_ || defined _MSCWIN_
   write_bytes = write_rvb( &rvb, stream->fp );
#else
   if(fwrite( &rvb, (size_t)sizeof( RVB ),   /* Vorblock neu schreiben...*/
     (size_t)1, stream->fp ) !=1 ) {
         derrno = stream->err = DNERR_NOWRITESTREAM;
         return( EOF );
      }
   write_bytes = sizeof( RVB ); 
#endif
   fseek( stream->fp, stream->dat_rba,    /* und zurueck auf den...   */
          SEEK_SET );        /* Anfang des 1.Datenblock  */
   stream->w_rest = 0L;        /* keine freien bytes mehr  */
            /* wichtige Info fuer dwrite*/

   /* ---------- Einfuegen der Realisierung in Realisierungsbaum ----------
   */
   tree_pt = add_tree( stream->tree, knr,  /* neue Realisierung mit Nr.*/
         rnr,stream->rvb_rba );     /* und Start-rba in R.-Baum */
   stream->objects++;
   stream->tree = tree_pt;
   
   /* ---------- in knr/rnr spez. Nummer wird die aktuelle
                 in parms und stream ----------
   */
   parms->knr = knr;        /* tatsaechliche Klassennnr.*/
   parms->rnr = rnr;        /* tatsaechliche Realis.nr. */
   stream->knr = knr;        /* aktuelle Klassen- und    */
   stream->rnr = rnr;                         /* Realis.nr. uebernehmen   */

   /* ----- Systemfehler bei File-E/A pruefen -----
   */
   if ( ferror( stream->fp ) )
   {
      perror( "dnorm sys error" );
      exit( 1 );
   }

   derrno = stream->err = DNERR_OK;
   return( 0 );
} /* end of dset() */
示例#14
0
pAssemblerTree Analysis::disasm(pCodeBufferInfo pinfo)
{
  std::vector<CodePiece> piece_test;
  disasm(pinfo,piece_test) ;
  for (std::vector<CodePiece>::iterator iter = piece_test.begin();
      iter != piece_test.end();iter++)
  {
    printf("\033[31m标签:%08x,\033[34m跳转到:%08x\033[0m,条件跳转:%d\n",iter->get_label(),iter->get_jmplabel(),iter->get_is_jcc());   
    for (std::list<ud_t>::iterator xiter = iter->get_piece().begin();
        xiter != iter->get_piece().end();xiter++)
    {
        printf("%s\n",xiter->insn_buffer);
    }
  }

  //__asm("int3");
  ud_t ud_obj;
  ud_init(&ud_obj);

#ifndef PROTECT_X64
  ud_set_mode(&ud_obj,32);
#else
  ud_set_mode(&ud_obj,64);
#endif
  ud_set_pc(&ud_obj,pinfo->addr);
  ud_set_input_buffer(&ud_obj, (uint8_t*)pinfo->buf, pinfo->size);
  ud_set_syntax(&ud_obj,UD_SYN_INTEL);

  base = pinfo->addr;
  size = pinfo->size;
  
  std::vector <long> address_array;
  //pAssemblerTree root =  new AssemblerTree;
  //  pAssemblerTree nowtree = root;
  std::vector <ud_t> ud_obj_array;
  address_array.push_back(pinfo->addr);
  address_array.push_back(pinfo->addr + pinfo->size);
  while (ud_disassemble(&ud_obj) != 0)
  {
    ud_obj_array.push_back(ud_obj);
    //    nowtree.asmpiect.push_back(ud_obj);
    if (ud_obj.operand[0].type == UD_OP_JIMM || ud_obj.mnemonic == UD_Icall )//&& ud_obj.mnemonic != UD_Icall)
    {
          long addr = ud_obj.operand[0].size == 8
            ? ((signed char)ud_obj.operand[0].lval.sbyte + ud_obj.pc) :
            (ud_obj.operand[0].lval.sdword + ud_obj.pc);
      if (addr >= pinfo->addr && addr <= pinfo->addr + pinfo->size)
      {
         address_array.push_back(addr);
         address_array.push_back(ud_obj.pc);        
      }
    }
  }

  long count = 0;
  long *a_array;
  size_t address_size = address_array.size();
  a_array = new long[address_size];
  for (std::vector <long>::iterator iter = address_array.begin() ;
       iter != address_array.end() ; ++iter)
  {
    bool fk = true;
    for (int i = 0; i < count; ++i)
    {
      if (*iter == a_array[i])
      {
        fk = false;
      }
    }
    if (fk)
      a_array[count++] = *iter;
  }
  for (int i = 0; i < count; ++i)
  {
    for (int j = i; j < count ; ++j)
    {
      if (a_array[i] > a_array[j])
      {
        long t = a_array[i];
        a_array[i] = a_array[j];
        a_array[j] = t;
      }
    }
  }

  for (int i = 0; i < count; ++i)
  {
    printf("%08x\r\n",a_array[i]);
  }
  int point = 0;
  pAssemblerTree nowtree = NULL;
  pAssemblerTree parent = NULL;
      const bool begin = true;
    const bool end = false;
    bool status = end;
  for (std::vector <ud_t>::iterator iter = ud_obj_array.begin();
       iter != ud_obj_array.end(); ++iter)
  {
    //typedef  true begin;
    //typedef false end;
    // ud_t *p = iter;
    ud_t ud = *iter;
    if (ud.insn_offset == a_array[point] && status == end)
    {
      point++;
      status = begin;
      nowtree = new AssemblerTree;
      root ? NULL : root = nowtree;
      nowtree->LeftChild = NULL;
      nowtree->RightChild = NULL;

      nowtree->id = point - 1;


      //      nowtree.asmpiect.push_back(ud);
    }
    if (nowtree)
    {
      nowtree->asmpiece.push_back(ud);
    }
    if (ud.pc == a_array[point] && status == begin)
    {
      nowtree->base = a_array[point-1];
      
      //point++;
      nowtree->size = ud.pc - a_array[point-1]; //代码块大小
      status = end;
      parent = add_tree(parent,nowtree,L);
      
      //nowtree = new AssemblerTree;
      //nowtree->LeftChild = NULL;
      //nowtree->RightChild = NULL;
    }
    nowtree->reloc_address = -1;    
    nowtree->next_instruction = ud.pc;   
  }
  block_count = point;
  link_tree();
#ifdef DEBUG
  show_tree(root,"false:");
#endif
  delete [] a_array;
  // show_tree(root);
  
  /*for (std::vector <long>::iterator iter = address_array.begin() ;
       iter != address_array.end() ; ++iter)
  {
    int addr = *iter;
    printf("%08x\r\n",addr);
    }*/
  return NULL;
}