コード例 #1
0
ファイル: sort1.c プロジェクト: chenzhongtao/source
int main(int argc, char* argv[])
{
    deque_t* pdeq_coll = NULL;
    person_t t_person;

    type_register(person_t, NULL, NULL, NULL, NULL);
    pdeq_coll = create_deque(person_t);
    if(pdeq_coll == NULL)
    {
        return -1;
    }

    deque_init(pdeq_coll);

    memset(t_person.s_firstname, '\0', 21);
    memset(t_person.s_lastname, '\0', 21);
    strcpy(t_person.s_firstname, "Jonh");
    strcpy(t_person.s_lastname, "right");
    deque_push_back(pdeq_coll, &t_person);
    memset(t_person.s_firstname, '\0', 21);
    memset(t_person.s_lastname, '\0', 21);
    strcpy(t_person.s_firstname, "Bill");
    strcpy(t_person.s_lastname, "killer");
    deque_push_back(pdeq_coll, &t_person);
    memset(t_person.s_firstname, '\0', 21);
    memset(t_person.s_lastname, '\0', 21);
    strcpy(t_person.s_firstname, "Jonh");
    strcpy(t_person.s_lastname, "sound");
    deque_push_back(pdeq_coll, &t_person);
    memset(t_person.s_firstname, '\0', 21);
    memset(t_person.s_lastname, '\0', 21);
    strcpy(t_person.s_firstname, "Bin");
    strcpy(t_person.s_lastname, "lee");
    deque_push_back(pdeq_coll, &t_person);
    memset(t_person.s_firstname, '\0', 21);
    memset(t_person.s_lastname, '\0', 21);
    strcpy(t_person.s_firstname, "Lee");
    strcpy(t_person.s_lastname, "bird");
    deque_push_back(pdeq_coll, &t_person);

    algo_for_each(deque_begin(pdeq_coll), deque_end(pdeq_coll), _print);
    printf("\n");

    algo_sort_if(deque_begin(pdeq_coll), deque_end(pdeq_coll), _person_sort_criterion);

    algo_for_each(deque_begin(pdeq_coll), deque_end(pdeq_coll), _print);
    printf("\n");

    deque_destroy(pdeq_coll);

    return 0;
}
コード例 #2
0
ファイル: deque_test.test.c プロジェクト: AbheekG/chapel
void push_back_counting(size_t item_size, deque_t* d, int num)
{
  int i;
  assert(item_size == 4);
  for( i = 0; i < num; i++ ) {
    deque_push_back(4, d, &i);
  }
}
コード例 #3
0
ファイル: 2.c プロジェクト: pi8027/libdatastruct
int main(void)
{
    deque_t *deque;
    int errcode,integer,integer_;
    size_t counter = 0;
    deque = deque_initialize(sizeof(int),DEFAULT_RELEASE_FUNCTION);
    if(!deque){
        fputs("Error!\n",stderr);
        return -1;
    }
    while(counter != 64){
        integer = counter;
        errcode = deque_push_front(deque,&integer);
        if(errcode){
            deque_release(deque);
            fputs("Error!\n",stderr);
            return -1;
        }
        integer = counter+10;
        errcode = deque_push_back(deque,&integer);
        if(errcode){
            deque_release(deque);
            fputs("Error!\n",stderr);
            return -1;
        }
        counter++;
    }
    counter = 0;
    while(counter != deque_size(deque)){
        errcode = deque_refer_from_front(deque,counter,&integer);
        if(errcode){
            deque_release(deque);
            fputs("Error!\n",stderr);
            return -1;
        }
        errcode = deque_refer_from_back(deque,counter,&integer_);
        if(errcode){
            deque_release(deque);
            fputs("Error!\n",stderr);
            return -1;
        }
        fprintf(stdout,"%03d : %03d,%03d\n",counter,integer,integer_);
        counter++;
    }
    deque_release(deque);
    return 0;
}
コード例 #4
0
ファイル: deque.c プロジェクト: Epictetus/algorithms
static VALUE deque_init(int argc, VALUE *argv, VALUE self)
{
	int len, i;
	VALUE ary;
	
	if(argc == 0) {
		return self;
	}
	else if(argc > 1) {
		rb_raise(rb_eArgError, "wrong number of arguments");
	}
	else {
		ary = rb_check_array_type(argv[0]);
		if(!NIL_P(ary)) {
			len = RARRAY_LEN(ary);
			for (i = 0; i < len; i++) {
				deque_push_back(self, RARRAY_PTR(ary)[i]);
			}
		}
	}
	return self;
}
コード例 #5
0
ファイル: main.c プロジェクト: algking/algorithms-in-c
int main()
{
    const char *output[] = {"EsaY", "YasE", "aYsE", "asYE"};
    const char *input = "EasY";
    const char *pinput; /* point to input */
    const char *poutput; /* point to output */
    size_t i;

    for (i = 0; i < SIZE(output); i++) {
        pinput = input;
        poutput = output[i];
        printf("for pattern %s:\n", poutput);

        for (; *poutput != '\0';) {
            if (!deque_empty() && deque_front() == *poutput) {
                printf("+\t%c\n", deque_pop_front());
                poutput++;
            } else if (!deque_empty() && deque_back() == *poutput) {
                printf("*\t%c\n", deque_pop_back());
                poutput++;
            } else { /* the deque is empty or not the first or last */
                if (islower(*pinput)) {
                    deque_push_back(*pinput++);
                } else if (isupper(*pinput)) {
                    deque_push_front(*pinput++);
                } else if (*pinput == '\0') {
                    printf("unable to generate such pattern\n");
                    break;
                }
            }
        }

        putchar('\n');
    }

    return 0;
}
コード例 #6
0
ファイル: qbuffer.c プロジェクト: hildeth/chapel
qioerr qbuffer_append(qbuffer_t* buf, qbytes_t* bytes, int64_t skip_bytes, int64_t len_bytes)
{
  qbuffer_part_t part;
  int64_t new_end;
  qioerr err;

  new_end = buf->offset_end + len_bytes;
  // init part retains the bytes.
  err = qbuffer_init_part(&part, bytes, skip_bytes, len_bytes, new_end);
  if( err ) return err;

  err = deque_push_back(sizeof(qbuffer_part_t), &buf->deque, &part);
  if( err ) {
    qbytes_release(bytes); // release the bytes.
    return err;
  }

  buf->offset_end = new_end;

  // invalidate cached entries.
  qbuffer_clear_cached(buf);

  return 0;
}
コード例 #7
0
ファイル: deque_test.c プロジェクト: jefwagner/c_containers
void simple_test( void){
  deque dq;
  double a;
  int i, status;

  fprintf( stdout, "Testing deque_allocate: " );
  dq = deque_alloc();
  if( dq != NULL ){
    fprintf( stdout, "success!\n");
  }else{
    fprintf( stdout, "failed!\n");
  }
  fprintf( stdout, "Testing deque_empty: ");
  if( deque_empty( dq) ){
    fprintf( stdout, "success!\n");
  }else{
    fprintf( stdout, "failed!\n");
  }

  a = 2.5;
  fprintf( stdout, "Testing deque_push_back, value=%1.2g: ", a);
  if( deque_push_back( dq, a ) == DEQUE_SUCCESS ){
    fprintf( stdout, "success!\n");
  }else{
    fprintf( stdout, "failed!\n");
  }
  a = 3.14159;
  fprintf( stdout, "Testing deque_peek_back: ");
  if( deque_peek_back( dq, &a) == DEQUE_SUCCESS ){
    fprintf( stdout, "success!, value=%1.2g\n", a);
  }else{
    fprintf( stdout, "failed, value=%1.2g\n", a);
  }
  fprintf( stdout, "Testing deque_size: ");
  fprintf( stdout, "size=%d\n", deque_size( dq));
  fprintf( stdout, "Testing deque_pop_back: ");
  a = 3.14159;
  if( deque_pop_back( dq, &a) == DEQUE_SUCCESS ){
    fprintf( stdout, "success!, value=%1.2g\n", a);
  }else{
    fprintf( stdout, "failed!, value=%1.2g\n", a);
  }
  a = 3.14159;
  fprintf( stdout, "Testing deque_pop_back on empty deque: ");
  if( deque_pop_back( dq, &a) != DEQUE_EMPTY ){
    fprintf( stdout, "failed!, value=%1.2g\n", a);
  }else{
    fprintf( stdout, "success!,\n");
    fprintf( stdout, "  caught empty deque, value=%1.2g\n", a);
  }

  a = 2.5;
  fprintf( stdout, "Testing deque_push_front, value=%1.2g: ", a);
  if( deque_push_front( dq, a ) == DEQUE_SUCCESS ){
    fprintf( stdout, "success!\n");
  }else{
    fprintf( stdout, "failed!\n");
  }
  a = 3.14159;
  fprintf( stdout, "Testing deque_peek_front: ");
  if( deque_peek_front( dq, &a) == DEQUE_SUCCESS ){
    fprintf( stdout, "success!, value=%1.2g\n", a);
  }else{
    fprintf( stdout, "failed, value=%1.2g\n", a);
  }
  fprintf( stdout, "Testing deque_size: ");
  fprintf( stdout, "size=%d\n", deque_size( dq));
  fprintf( stdout, "Testing deque_pop_front: ");
  a = 3.14159;
  if( deque_pop_front( dq, &a) == DEQUE_SUCCESS ){
    fprintf( stdout, "success!, value=%1.2g\n", a);
  }else{
    fprintf( stdout, "failed!, value=%1.2g\n", a);
  }
  a = 3.14159;
  fprintf( stdout, "Testing deque_pop_front on empty deque: ");
  if( deque_pop_front( dq, &a) != DEQUE_EMPTY ){
    fprintf( stdout, "failed!, value=%1.2g\n", a);
  }else{
    fprintf( stdout, "success!,\n");
    fprintf( stdout, "  caught empty deque, value=%1.2g\n", a);
  }

  fprintf( stdout, "Testing deque_get_item: ");
  for( i=0; i<5; i++ ){
    a = (double) i + 0.545;
    if( deque_push_back( dq, a) != DEQUE_SUCCESS ){
      fprintf( stderr, "deque push back failed!\n" );
      deque_free( dq);
      return;
    }
    a = (-1. - (double) i) + 0.545;
    if( deque_push_front( dq, a) != DEQUE_SUCCESS ){
      fprintf( stderr, "deque push front failed!\n" );
      deque_free( dq);
      return;
    }
  }
  for( i=0; i<10; i++){
    status = deque_get_item( dq, i, &a);
    if( status != DEQUE_SUCCESS || a != (-5. + (double) i) + 0.545 ){
      fprintf( stderr, "deque get_item failed!\n" );
      deque_free( dq);
      return;
    }
  }
  a = 3.14159;
  status = deque_get_item( dq, 11, &a);
  if( status != DEQUE_OUT_OF_BOUNDS || a != 3.14159 ){
    fprintf( stderr, "deque get_item out of bounds failed!\n");
    deque_free( dq);
  }
  fprintf( stdout, "success!\n");

  deque_free( dq);
}
コード例 #8
0
ファイル: deque_test.c プロジェクト: jefwagner/c_containers
void big_test( int num){
  int center, front, back, i, sw, status, fsize;
  double *vals, *pvals, tmp;
  clock_t start, stop, diff;
  int msecs;
  deque dq;

  dq = deque_alloc();
  vals = (double *) malloc( 2*num*sizeof(double));
  pvals = (double *) malloc( 2*num*sizeof(double));

  for( i=0; i<2*num; i++){
    vals[i] = (double) rand() / (double) RAND_MAX;
  }
 
  front = 0;
  back = 0;
  center = num;
  fprintf( stdout, "Testing deque_push_back and front %d times\n", num/2);
  start = clock();
  for( i=0; i<num/2; i++){
    if( rand() % 2 == 0 ){
      deque_push_back( dq, vals[center+back] );
      back++;
    }else{
      front--;
      deque_push_front( dq, vals[center+front] );
    }
  }
  stop = clock();
  diff = stop-start;
  msecs = (int) diff * 1000 / CLOCKS_PER_SEC;
  fprintf( stdout, " succeeded in %u ms\n", msecs);
  
  fprintf( stdout, 
	   "Testing deque_push(pop)_back(front) %d times\n", num);
  start = clock();
  for( i=0; i<num; i++){
    sw = rand() % 4;
    switch( sw ){
    case 0:
      status = deque_push_back( dq, vals[center+back]);
      back++;
      break;
    case 1:
      front--;
      status = deque_push_front( dq, vals[center+front]);
      break;
    case 2:
      back--;
      status = deque_pop_back( dq, &tmp);
      break;
    case 3:
      status = deque_pop_front( dq, &tmp);
      front++;
      break;
    default:
      status = 1;
      tmp = 1;
    }
    if( status != DEQUE_SUCCESS ){
      fprintf( stderr, " error at op i=%d\n", i);
      free( pvals);
      free( vals);
      deque_free( dq);
      return;
    }
  }
  stop = clock();
  diff = stop-start;
  msecs = (int) diff * 1000 / CLOCKS_PER_SEC;
  fprintf( stdout, " succeeded in %u ms\n", msecs);

  fsize = deque_size( dq);
  fprintf( stdout, 
	   "Testing deque_get_item %d times\n", fsize);
  start = clock();
  for( i=0; i<fsize; i++){
    deque_get_item( dq, i, &(pvals[i]));
  }
  stop = clock();
  for( i=0; i<fsize; i++){
    if( pvals[i] != vals[center+front+i] ){
      fprintf( stderr, " obtained value error! at item %d\n", i);
      free( pvals);
      free( vals);
      deque_free( dq);
      return;
    }
  }
  diff = stop-start;
  msecs = (int) diff * 1000 / CLOCKS_PER_SEC;
  fprintf( stdout, " succeeded in %u ms\n", msecs);

  fprintf( stdout, 
	   "Testing deque_pop_front %d times\n", fsize);
  start = clock();
  for( i=0; i<fsize; i++){
    deque_pop_front( dq, &(pvals[i]));
  }
  stop = clock();
  for( i=0; i<fsize; i++){
    if( pvals[i] != vals[center+front+i] ){
      fprintf( stderr, " obtained value error! at item %d\n", i);
      free( pvals);
      free( vals);
      deque_free( dq);
      return;
    }
  }
  diff = stop-start;
  msecs = (int) diff * 1000 / CLOCKS_PER_SEC;
  fprintf( stdout, " succeeded in %u ms\n", msecs);
  
  free( pvals);
  free( vals);
  deque_free( dq);
}
コード例 #9
0
int main()
{
    {
        deque_t d = new_deque();

        SPAN(tuple_ix_t) span = deque_as_span(&d);
        assert(span.ptr == NULL);
        assert(span.sz == 0);

        deque_free(&d);
    }

    {
        deque_t d = new_deque();

        deque_push_back(&d, 1234);

        SPAN(tuple_ix_t) span = deque_as_span(&d);
        assert(span.ptr != NULL);
        assert(span.sz == 1);
        assert(span.ptr[0] == 1234);

        deque_free(&d);
        free(span.ptr);
    }

    {
        deque_t d = new_deque();
        enum {NREP = 40000};

        size_t ix = 0;
        for (ix = 0; ix < NREP; ++ix)
        {
            deque_push_back(&d, ix + 1234);
        }

        SPAN(tuple_ix_t) span = deque_as_span(&d);
        assert(span.ptr != NULL);
        assert(span.sz == NREP);
        for (ix = 0; ix < NREP; ++ix)
        {
            assert(span.ptr[ix] == (ix + 1234));
        }

        deque_free(&d);
        free(span.ptr);
    }

    {
        deque_t d = new_deque();
        enum {NREP = 40000000};

        size_t ix = 0;
        for (ix = 0; ix < NREP; ++ix)
        {
            deque_push_back(&d, ix + 1234);
        }

        SPAN(tuple_ix_t) span = deque_as_span(&d);
        assert(span.ptr != NULL);
        assert(span.sz == NREP);
        for (ix = 0; ix < NREP; ++ix)
        {
            assert(span.ptr[ix] == (ix + 1234));
        }

        deque_free(&d);
        free(span.ptr);
    }


    return 0;
}
コード例 #10
0
ファイル: action-find.c プロジェクト: Nazg-Gul/fm
/**
 * Recursive iteration for file finding
 *
 * @param __dir - directory to search file in
 * @param __rel_dir - relative director name to search file in
 * @param __options - finding options
 * @param __res_wnd - window with results
 * @return zero on success, non-zero otherwise
 */
static int
find_iteration (const wchar_t *__dir, const wchar_t *__rel_dir,
                const action_find_options_t *__options,
                action_find_res_wnd_t *__res_wnd)
{
  int i, j, count;
  vfs_dirent_t **eps = NULL;
  size_t fn_len;
  wchar_t *format, *full_name;
  vfs_stat_t stat;
  vfs_stat_proc stat_proc;
  deque_t *dirs;
  wchar_t **dir_data;

  __res_wnd->dir_opened = FALSE;

  /* Get listing of directory */

  /*
   * TODO: Add separately displaying of directories and files
   */

  count = vfs_scandir (__dir, &eps, 0, vfs_alphasort);

  if (count < 0)
    {
      /* Error getting listing */
      return ACTION_ERR;
    }

  if (TEST_FLAG(__options->flags, AFF_FIND_RECURSIVELY))
    {
      dirs = deque_create ();
    }

  /* Get function for stat'ing */
  if (TEST_FLAG(__options->flags, AFF_FOLLOW_SYMLINKS))
    {
      stat_proc = vfs_stat;
    }
  else
    {
      stat_proc = vfs_lstat;
    }

  /* Allocate memory for full file name */
  fn_len = wcslen (__dir) + MAX_FILENAME_LEN + 1;
  full_name = malloc ((fn_len + 1) * sizeof (wchar_t));

  /* Get format mask for correct directory drilling */
  if (__dir[wcslen (__dir) - 1] == '/')
    {
      format = L"%ls%ls";
    }
  else
    {
      format = L"%ls/%ls";
    }

  for (i = 0; i < count; ++i)
    {
      if (IS_PSEUDODIR (eps[i]->name))
        {
          vfs_free_dirent (eps[i]);
          continue;
        }

      set_searching_status (__res_wnd, L"Searching in", __rel_dir);

      /* Get full file name */
      swprintf (full_name, fn_len, format, __dir, eps[i]->name);

      /* Stat current node of FS */
      if (!stat_proc (full_name, &stat) == VFS_OK)
        {
          /* Error getting status of file */
          vfs_free_dirent (eps[i]);
          continue;
        }

      if (S_ISREG (stat.st_mode))
        {
          if (check_regular_file (eps[i]->name, full_name,
                                  __options, __res_wnd))
            {
              append_result (__rel_dir, eps[i]->name, stat, __res_wnd);
              ++__res_wnd->found_files;
            }
        }
      else if (S_ISDIR (stat.st_mode))
        {
          /* Of user wants directories to be found... */
          if (TEST_FLAG(__options->flags, AFF_FIND_DIRECTORIES))
            {
              if (check_directory (eps[i]->name, full_name,
                                   __options, __res_wnd))
                {
                  append_result (__rel_dir, eps[i]->name, stat, __res_wnd);
                  ++__res_wnd->found_dirs;
                }
            }

          if (TEST_FLAG(__options->flags, AFF_FIND_RECURSIVELY))
            {
              dir_data = malloc (2 * sizeof (wchar_t));
              dir_data[0] = wcsdup (eps[i]->name);
              dir_data[1] = wcsdup (full_name);
              deque_push_back (dirs, (void*)dir_data);
            }
        }
      else
        {
          if (check_special_file (eps[i]->name, full_name,
                                  __options, __res_wnd))
            {
              append_result (__rel_dir, eps[i]->name, stat, __res_wnd);
              ++__res_wnd->found_files;
            }
        }

      vfs_free_dirent (eps[i]);

      hook_call (L"switch-task-hook", NULL);

      if (ACTION_PERFORMED (__res_wnd))
        {
          /* Free remain dirents */
          for (j = i + 1; j < count; ++j)
            {
              vfs_free_dirent (eps[j]);
            }
          break;
        }
    }

  SAFE_FREE (eps);
  free (full_name);

  if (TEST_FLAG(__options->flags, AFF_FIND_RECURSIVELY) &&
      !ACTION_PERFORMED (__res_wnd))
    {
      void *data;
      wchar_t *rel_name;

      if (__rel_dir[wcslen (__rel_dir) - 1] == '/')
        {
          format = L"%ls%ls";
        }
      else
        {
          format = L"%ls/%ls";
        }

      fn_len = wcslen (__dir) + MAX_FILENAME_LEN + 1;
      rel_name = malloc ((fn_len + 1) * sizeof (wchar_t));

      deque_foreach (dirs, data);
        /* Drill relative file name */

        dir_data = data;
        if (!ACTION_PERFORMED (__res_wnd))
          {
            swprintf (rel_name, fn_len, format, __rel_dir, dir_data[0]);
            find_iteration (dir_data[1], rel_name, __options, __res_wnd);
          }
        free (dir_data);
      deque_foreach_done
    }