It seems for me your test program do same thing as PostgreSQL backend
does. So I would say if the program worked well, why not PostgreSQL
works?
What do you think Oleg?
From: Maneerat Sappaso <sc404885@bucc3.buu.ac.th>
Subject: Program test strcoll().
Date: Thu, 18 Jan 2001 19:52:39 -0700 (GMT)
Message-ID: <Pine.SOL.4.10.10101181925420.19935-200000@bucc3.buu.ac.th>
> Deer sir,
>
> Program collsort.c is a test program in THAI locale version
> th_TH-2.1.1-5.src.tar.gz for testing strcoll(). It sort by
> thai dictionary not by ascii. I use to test this program with
> thai or english (or thai+english) words and it sorted correctly.
>
> I found that before run this program we must
> setlocale(LC_COLLATE,"th_TH");
>
> When I install PostgreSQL with locale I try to test data by
> use sql command like this " select * from table order by name"
> The result are sorted by ascii.
>
> regards,
> maneerat sappaso
[the test program from Maneerat]
/** collsort.c - a word list sorting tool using strcoll()* Created: 26 Nov 1998* Author: Theppitak Karoonboonyanan*/
/* Copyright (C) 1999 Theppiak Karoonboonyanan collsort.c is free software; you can redistribute it and/or modify
itunder the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of
theLicense, or (at your option) any later version.
*/
#include <locale.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef unsigned char tchar;
/* for qsort() */
typedef int (*CMPFUNC)(const void *, const void *);
static size_t readData(FILE *dataFile, tchar *data[], int maxData)
{ size_t nData = 0; static char wordBuf[128];
while (nData < maxData && fgets(wordBuf, sizeof wordBuf, dataFile) != NULL) { int len = strlen(wordBuf);
if (len == 0) { return nData; } /* eliminate terminating '\n' */ wordBuf[--len] = 0;
/* allocate & copy the line */ data[nData] = (tchar*)malloc(len+1); if (data[nData] == NULL) {
printf("Warning: Only %d items were read\n", nData); return nData; }
strcpy((char*)data[nData],wordBuf); nData++; }
return nData;
}
static void freeData(tchar *data[], size_t nItems)
{ size_t i;
for (i=0; i<nItems; i++) { free(data[i]); }
}
static int dataCmp(const char **pStr1, const char **pStr2)
{ return strcoll(*pStr1, *pStr2);
}
static void sortData(tchar *data[], size_t nItems)
{ qsort(data, nItems, sizeof data[0], (CMPFUNC)dataCmp);
}
static void writeData(FILE *outFile, tchar *data[], size_t nItems)
{ size_t i;
for (i = nItems; i > 0; i--) { fprintf(outFile, "%s\n", *data); data++; }
}
#define MAX_DATA 40000
static tchar *data[MAX_DATA];
int main(int argc, char *argv[])
{ FILE *dataFile; FILE *outFile; size_t dataRead; char DataFileName[64]; char OutFileName[64];
constchar* pPrevLocale;
pPrevLocale = setlocale(LC_COLLATE, ""); if (pPrevLocale == 0) { fprintf(stderr, "Cannot set locale\n");
exit(1); }
if (argc == 3) { strcpy(DataFileName, argv[1]); strcpy(OutFileName, argv[2]); } else {
fprintf(stderr,"Usage: collsort <input file> <output file>\n"); return 1; }
dataFile = fopen(DataFileName, "rt"); if (dataFile == NULL) { fprintf(stderr, "Can't open file %s\n",
DataFileName); perror("fopen"); return 1; }
outFile = fopen(OutFileName, "wt"); if (outFile == NULL) { fprintf(stderr, "Can't open file %s for write\n",
OutFileName); perror("fopen"); return 1; }
dataRead = readData(dataFile, data, MAX_DATA); sortData(data, dataRead); writeData(outFile, data, dataRead);
freeData(data,dataRead);
fclose(outFile); fclose(dataFile);
setlocale(LC_COLLATE, pPrevLocale);
return 0;
}