| Index: icu46/source/tools/toolutil/pkg_icu.cpp
|
| ===================================================================
|
| --- icu46/source/tools/toolutil/pkg_icu.cpp (revision 0)
|
| +++ icu46/source/tools/toolutil/pkg_icu.cpp (revision 0)
|
| @@ -0,0 +1,180 @@
|
| +/******************************************************************************
|
| + * Copyright (C) 2008-2009, International Business Machines
|
| + * Corporation and others. All Rights Reserved.
|
| + *******************************************************************************
|
| + */
|
| +#include "unicode/utypes.h"
|
| +#include "unicode/putil.h"
|
| +#include "cstring.h"
|
| +#include "toolutil.h"
|
| +#include "uoptions.h"
|
| +#include "uparse.h"
|
| +#include "package.h"
|
| +#include "pkg_icu.h"
|
| +
|
| +#include <stdio.h>
|
| +#include <stdlib.h>
|
| +#include <string.h>
|
| +
|
| +
|
| +#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
|
| +
|
| +// read a file list -------------------------------------------------------- ***
|
| +
|
| +U_NAMESPACE_USE
|
| +
|
| +static const struct {
|
| + const char *suffix;
|
| + int32_t length;
|
| +} listFileSuffixes[]={
|
| + { ".txt", 4 },
|
| + { ".lst", 4 },
|
| + { ".tmp", 4 }
|
| +};
|
| +
|
| +/* check for multiple text file suffixes to see if this list name is a text file name */
|
| +static UBool
|
| +isListTextFile(const char *listname) {
|
| + const char *listNameEnd=strchr(listname, 0);
|
| + const char *suffix;
|
| + int32_t i, length;
|
| + for(i=0; i<LENGTHOF(listFileSuffixes); ++i) {
|
| + suffix=listFileSuffixes[i].suffix;
|
| + length=listFileSuffixes[i].length;
|
| + if((listNameEnd-listname)>length && 0==memcmp(listNameEnd-length, suffix, length)) {
|
| + return TRUE;
|
| + }
|
| + }
|
| + return FALSE;
|
| +}
|
| +
|
| +/*
|
| + * Read a file list.
|
| + * If the listname ends with ".txt", then read the list file
|
| + * (in the system/ invariant charset).
|
| + * If the listname ends with ".dat", then read the ICU .dat package file.
|
| + * Otherwise, read the file itself as a single-item list.
|
| + */
|
| +U_CAPI Package * U_EXPORT2
|
| +readList(const char *filesPath, const char *listname, UBool readContents) {
|
| + Package *listPkg;
|
| + FILE *file;
|
| + const char *listNameEnd;
|
| +
|
| + if(listname==NULL || listname[0]==0) {
|
| + fprintf(stderr, "missing list file\n");
|
| + return NULL;
|
| + }
|
| +
|
| + listPkg=new Package();
|
| + if(listPkg==NULL) {
|
| + fprintf(stderr, "icupkg: not enough memory\n");
|
| + exit(U_MEMORY_ALLOCATION_ERROR);
|
| + }
|
| +
|
| + listNameEnd=strchr(listname, 0);
|
| + if(isListTextFile(listname)) {
|
| + // read the list file
|
| + char line[1024];
|
| + char *end;
|
| + const char *start;
|
| +
|
| + file=fopen(listname, "r");
|
| + if(file==NULL) {
|
| + fprintf(stderr, "icupkg: unable to open list file \"%s\"\n", listname);
|
| + delete listPkg;
|
| + exit(U_FILE_ACCESS_ERROR);
|
| + }
|
| +
|
| + while(fgets(line, sizeof(line), file)) {
|
| + // remove comments
|
| + end=strchr(line, '#');
|
| + if(end!=NULL) {
|
| + *end=0;
|
| + } else {
|
| + // remove trailing CR LF
|
| + end=strchr(line, 0);
|
| + while(line<end && (*(end-1)=='\r' || *(end-1)=='\n')) {
|
| + *--end=0;
|
| + }
|
| + }
|
| +
|
| + // check first non-whitespace character and
|
| + // skip empty lines and
|
| + // skip lines starting with reserved characters
|
| + start=u_skipWhitespace(line);
|
| + if(*start==0 || NULL!=strchr(U_PKG_RESERVED_CHARS, *start)) {
|
| + continue;
|
| + }
|
| +
|
| + // take whitespace-separated items from the line
|
| + for(;;) {
|
| + // find whitespace after the item or the end of the line
|
| + for(end=(char *)start; *end!=0 && *end!=' ' && *end!='\t'; ++end) {}
|
| + if(*end==0) {
|
| + // this item is the last one on the line
|
| + end=NULL;
|
| + } else {
|
| + // the item is terminated by whitespace, terminate it with NUL
|
| + *end=0;
|
| + }
|
| + if(readContents) {
|
| + listPkg->addFile(filesPath, start);
|
| + } else {
|
| + listPkg->addItem(start);
|
| + }
|
| +
|
| + // find the start of the next item or exit the loop
|
| + if(end==NULL || *(start=u_skipWhitespace(end+1))==0) {
|
| + break;
|
| + }
|
| + }
|
| + }
|
| + fclose(file);
|
| + } else if((listNameEnd-listname)>4 && 0==memcmp(listNameEnd-4, ".dat", 4)) {
|
| + // read the ICU .dat package
|
| + listPkg->readPackage(listname);
|
| + } else {
|
| + // list the single file itself
|
| + if(readContents) {
|
| + listPkg->addFile(filesPath, listname);
|
| + } else {
|
| + listPkg->addItem(listname);
|
| + }
|
| + }
|
| +
|
| + return listPkg;
|
| +}
|
| +
|
| +U_CAPI int U_EXPORT2
|
| +writePackageDatFile(const char *outFilename, const char *outComment, const char *sourcePath, const char *addList, Package *pkg, char outType) {
|
| + Package *addListPkg = NULL;
|
| + UBool pkgDelete = FALSE;
|
| +
|
| + if (pkg == NULL) {
|
| + pkg = new Package;
|
| + if(pkg == NULL) {
|
| + fprintf(stderr, "icupkg: not enough memory\n");
|
| + return U_MEMORY_ALLOCATION_ERROR;
|
| + }
|
| +
|
| + addListPkg = readList(sourcePath, addList, TRUE);
|
| + if(addListPkg != NULL) {
|
| + pkg->addItems(*addListPkg);
|
| + } else {
|
| + return U_ILLEGAL_ARGUMENT_ERROR;
|
| + }
|
| +
|
| + pkgDelete = TRUE;
|
| + }
|
| +
|
| + pkg->writePackage(outFilename, outType, outComment);
|
| +
|
| + if (pkgDelete) {
|
| + delete pkg;
|
| + delete addListPkg;
|
| + }
|
| +
|
| + return 0;
|
| +}
|
| +
|
|
|
| Property changes on: icu46/source/tools/toolutil/pkg_icu.cpp
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|