Namazu-devel-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: charset for encode filename (Re: Re: html-split について )



Osamu Okano <osamu1999@xxxxxxxxxxxx> wrote:

>>僕の方で対処しておきました。確認をお願いします。
>
>ファイル名に半角カナが含まれている場合
>化けやすいようです。

うげー、僕の方ではそこまでは面倒みきれん。…と思ったけど、大
した手間ではないので対処しておきました。確認をお願いします。


>mknmz.inの175行目の
>  if ($fragment){
>    codeconv::toeuc(\$fragment);
>  }
>を消し忘れてます。
>不要なので消した方がよいと思います。

ん? もとから入っていませんよ。

<http://www.namazu.org/tmp/namazu-2.0.2.tar.gz> を置き直しま
した。問題がなければ明日にでも 2.0.2 として公開します。

-- Satoru Takabayashi

おまけ: quick sort の進捗状況を表示しよう

  % gcc -O2 -o vqsort vqsort.c -lm
  % echo 1234567 | ./vqsort
  seed: 953212145
  100% |oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo| 1234567
  len: 1234567, progress: 1234567, cost: 31604351, n lg n: 24982171, time: 4.32

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <assert.h>
#include <math.h>

static int total_count  = 0;
static int cost_counter = 0;
static int progress_counter = 0;
static int prev_percent     = 0;

static void swap ( int *a, int i, int j );
static void print_progress_meter ( void );
static void simple_qsort ( int *a, int l, int u );
static int * generate_sample ( int len );

extern void vqsort ( int *data, int len );

int 
main (int argc, char **argv)
{
    int seed;
    time_t tmp;
    char buf[BUFSIZ];

    if (argc == 2) {
	/* 
	 * seed can be specified with a command line option
	 * for reproducing sample integers. It makes debug easy.
	 */
	seed = atoi(argv[1]);
    } else {
	seed = time(&tmp);
    }

    printf("seed: %d\n", seed);
    srand(seed);

    while(fgets(buf, BUFSIZ, stdin))
    {
	int len;
	int *data;

	buf[strlen(buf) - 1] = '\0';
	len = atoi(buf);

	data = generate_sample(len);
	vqsort(data, len);
	free(data);
    }
    return 0;
}

void 
vqsort(int *data, int len) 
{
    double elapsed;
    int expected_cost;
    clock_t before;

    expected_cost    = (int)(len * log(len) / log(2));
    progress_counter = 0;
    cost_counter     = 0;
    prev_percent     = 0;
    total_count      = len;

    before  = clock();
    simple_qsort(data, 0, len - 1);
    elapsed = clock() - before;

    printf("\n");
    printf("len: %d, progress: %d, cost: %d, n lg n: %d, time: %.2f\n", 
	   len, progress_counter, cost_counter, expected_cost, 
	   elapsed / CLOCKS_PER_SEC);
}

static void 
print_progress_meter(void)
{
    static char bar[]
	= "oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo";
    static int scale = sizeof(bar) - 1;
    int progress, percent;

    progress_counter++;
    progress = (double)progress_counter / total_count * scale;
    percent  = (double)progress_counter / total_count * 100;

    if (percent > prev_percent) {
	printf("\r");
	printf("%3d%% |%.*s%*s| %d", percent, 
	       progress, bar, scale - progress, "", progress_counter);
	prev_percent = percent;
    }
    fflush(stdout);
}

static void 
simple_qsort(int *a, int l, int u)
{
    int i, m;

    if (l >= u) {
	if (l == u) {
	    print_progress_meter();
	}
	return;
    }

    m = l;
    for (i = l + 1; i <= u; i++) {
	if (a[i] < a[l]) {
	    swap(a, ++m, i);
	}
	cost_counter++;
    }
    swap(a, l, m);

    print_progress_meter();

    simple_qsort(a, l, m - 1);
    simple_qsort(a, m + 1, u);
}

static void 
swap(int *a, int i, int j)
{
    int t = a[i];
    a[i] = a[j];
    a[j] = t;
}

static int *
generate_sample(int len)
{
    int i;
    int *a = malloc(len * sizeof(int));
    assert(a != NULL);

    for (i = 0; i < len; i++) {
	a[i] = rand();
    }

    return a;
}