1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/intl/icu/source/tools/toolutil/writesrc.c Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,262 @@ 1.4 +/* 1.5 +******************************************************************************* 1.6 +* 1.7 +* Copyright (C) 2005-2012, International Business Machines 1.8 +* Corporation and others. All Rights Reserved. 1.9 +* 1.10 +******************************************************************************* 1.11 +* file name: writesrc.c 1.12 +* encoding: US-ASCII 1.13 +* tab size: 8 (not used) 1.14 +* indentation:4 1.15 +* 1.16 +* created on: 2005apr23 1.17 +* created by: Markus W. Scherer 1.18 +* 1.19 +* Helper functions for writing source code for data. 1.20 +*/ 1.21 + 1.22 +#include <stdio.h> 1.23 +#include <time.h> 1.24 +#include "unicode/utypes.h" 1.25 +#include "unicode/putil.h" 1.26 +#include "utrie2.h" 1.27 +#include "cstring.h" 1.28 +#include "writesrc.h" 1.29 + 1.30 +static FILE * 1.31 +usrc_createWithHeader(const char *path, const char *filename, 1.32 + const char *generator, const char *header) { 1.33 + char buffer[1024]; 1.34 + const char *p; 1.35 + char *q; 1.36 + FILE *f; 1.37 + char c; 1.38 + 1.39 + if(path==NULL) { 1.40 + p=filename; 1.41 + } else { 1.42 + /* concatenate path and filename, with U_FILE_SEP_CHAR in between if necessary */ 1.43 + uprv_strcpy(buffer, path); 1.44 + q=buffer+uprv_strlen(buffer); 1.45 + if(q>buffer && (c=*(q-1))!=U_FILE_SEP_CHAR && c!=U_FILE_ALT_SEP_CHAR) { 1.46 + *q++=U_FILE_SEP_CHAR; 1.47 + } 1.48 + uprv_strcpy(q, filename); 1.49 + p=buffer; 1.50 + } 1.51 + 1.52 + f=fopen(p, "w"); 1.53 + if(f!=NULL) { 1.54 + char year[8]; 1.55 + const struct tm *lt; 1.56 + time_t t; 1.57 + 1.58 + time(&t); 1.59 + lt=localtime(&t); 1.60 + strftime(year, sizeof(year), "%Y", lt); 1.61 + if(generator==NULL) { 1.62 + strftime(buffer, sizeof(buffer), "%Y-%m-%d", lt); 1.63 + fprintf(f, header, year, filename, buffer); 1.64 + } else { 1.65 + fprintf(f, header, year, filename, generator); 1.66 + } 1.67 + } else { 1.68 + fprintf( 1.69 + stderr, 1.70 + "usrc_create(%s, %s): unable to create file\n", 1.71 + path!=NULL ? path : "", filename); 1.72 + } 1.73 + return f; 1.74 +} 1.75 + 1.76 +U_CAPI FILE * U_EXPORT2 1.77 +usrc_create(const char *path, const char *filename, const char *generator) { 1.78 + static const char *header= 1.79 + "/*\n" 1.80 + " * Copyright (C) 1999-%s, International Business Machines\n" 1.81 + " * Corporation and others. All Rights Reserved.\n" 1.82 + " *\n" 1.83 + " * file name: %s\n" 1.84 + " *\n" 1.85 + " * machine-generated by: %s\n" 1.86 + " */\n\n"; 1.87 + return usrc_createWithHeader(path, filename, generator, header); 1.88 +} 1.89 + 1.90 +U_CAPI FILE * U_EXPORT2 1.91 +usrc_createTextData(const char *path, const char *filename, const char *generator) { 1.92 + static const char *header= 1.93 + "# Copyright (C) 1999-%s, International Business Machines\n" 1.94 + "# Corporation and others. All Rights Reserved.\n" 1.95 + "#\n" 1.96 + "# file name: %s\n" 1.97 + "#\n" 1.98 + "# machine-generated by: %s\n" 1.99 + "#\n\n"; 1.100 + return usrc_createWithHeader(path, filename, generator, header); 1.101 +} 1.102 + 1.103 +U_CAPI void U_EXPORT2 1.104 +usrc_writeArray(FILE *f, 1.105 + const char *prefix, 1.106 + const void *p, int32_t width, int32_t length, 1.107 + const char *postfix) { 1.108 + const uint8_t *p8; 1.109 + const uint16_t *p16; 1.110 + const uint32_t *p32; 1.111 + uint32_t value; 1.112 + int32_t i, col; 1.113 + 1.114 + p8=NULL; 1.115 + p16=NULL; 1.116 + p32=NULL; 1.117 + switch(width) { 1.118 + case 8: 1.119 + p8=(const uint8_t *)p; 1.120 + break; 1.121 + case 16: 1.122 + p16=(const uint16_t *)p; 1.123 + break; 1.124 + case 32: 1.125 + p32=(const uint32_t *)p; 1.126 + break; 1.127 + default: 1.128 + fprintf(stderr, "usrc_writeArray(width=%ld) unrecognized width\n", (long)width); 1.129 + return; 1.130 + } 1.131 + if(prefix!=NULL) { 1.132 + fprintf(f, prefix, (long)length); 1.133 + } 1.134 + for(i=col=0; i<length; ++i, ++col) { 1.135 + if(i>0) { 1.136 + if(col<16) { 1.137 + fputc(',', f); 1.138 + } else { 1.139 + fputs(",\n", f); 1.140 + col=0; 1.141 + } 1.142 + } 1.143 + switch(width) { 1.144 + case 8: 1.145 + value=p8[i]; 1.146 + break; 1.147 + case 16: 1.148 + value=p16[i]; 1.149 + break; 1.150 + case 32: 1.151 + value=p32[i]; 1.152 + break; 1.153 + default: 1.154 + value=0; /* unreachable */ 1.155 + break; 1.156 + } 1.157 + fprintf(f, value<=9 ? "%lu" : "0x%lx", (unsigned long)value); 1.158 + } 1.159 + if(postfix!=NULL) { 1.160 + fputs(postfix, f); 1.161 + } 1.162 +} 1.163 + 1.164 +U_CAPI void U_EXPORT2 1.165 +usrc_writeUTrie2Arrays(FILE *f, 1.166 + const char *indexPrefix, const char *data32Prefix, 1.167 + const UTrie2 *pTrie, 1.168 + const char *postfix) { 1.169 + if(pTrie->data32==NULL) { 1.170 + /* 16-bit trie */ 1.171 + usrc_writeArray(f, indexPrefix, pTrie->index, 16, pTrie->indexLength+pTrie->dataLength, postfix); 1.172 + } else { 1.173 + /* 32-bit trie */ 1.174 + usrc_writeArray(f, indexPrefix, pTrie->index, 16, pTrie->indexLength, postfix); 1.175 + usrc_writeArray(f, data32Prefix, pTrie->data32, 32, pTrie->dataLength, postfix); 1.176 + } 1.177 +} 1.178 + 1.179 +U_CAPI void U_EXPORT2 1.180 +usrc_writeUTrie2Struct(FILE *f, 1.181 + const char *prefix, 1.182 + const UTrie2 *pTrie, 1.183 + const char *indexName, const char *data32Name, 1.184 + const char *postfix) { 1.185 + if(prefix!=NULL) { 1.186 + fputs(prefix, f); 1.187 + } 1.188 + if(pTrie->data32==NULL) { 1.189 + /* 16-bit trie */ 1.190 + fprintf( 1.191 + f, 1.192 + " %s,\n" /* index */ 1.193 + " %s+%ld,\n" /* data16 */ 1.194 + " NULL,\n", /* data32 */ 1.195 + indexName, 1.196 + indexName, 1.197 + (long)pTrie->indexLength); 1.198 + } else { 1.199 + /* 32-bit trie */ 1.200 + fprintf( 1.201 + f, 1.202 + " %s,\n" /* index */ 1.203 + " NULL,\n" /* data16 */ 1.204 + " %s,\n", /* data32 */ 1.205 + indexName, 1.206 + data32Name); 1.207 + } 1.208 + fprintf( 1.209 + f, 1.210 + " %ld,\n" /* indexLength */ 1.211 + " %ld,\n" /* dataLength */ 1.212 + " 0x%hx,\n" /* index2NullOffset */ 1.213 + " 0x%hx,\n" /* dataNullOffset */ 1.214 + " 0x%lx,\n" /* initialValue */ 1.215 + " 0x%lx,\n" /* errorValue */ 1.216 + " 0x%lx,\n" /* highStart */ 1.217 + " 0x%lx,\n" /* highValueIndex */ 1.218 + " NULL, 0, FALSE, FALSE, 0, NULL\n", 1.219 + (long)pTrie->indexLength, (long)pTrie->dataLength, 1.220 + (short)pTrie->index2NullOffset, (short)pTrie->dataNullOffset, 1.221 + (long)pTrie->initialValue, (long)pTrie->errorValue, 1.222 + (long)pTrie->highStart, (long)pTrie->highValueIndex); 1.223 + if(postfix!=NULL) { 1.224 + fputs(postfix, f); 1.225 + } 1.226 +} 1.227 + 1.228 +U_CAPI void U_EXPORT2 1.229 +usrc_writeArrayOfMostlyInvChars(FILE *f, 1.230 + const char *prefix, 1.231 + const char *p, int32_t length, 1.232 + const char *postfix) { 1.233 + int32_t i, col; 1.234 + int prev2, prev, c; 1.235 + 1.236 + if(prefix!=NULL) { 1.237 + fprintf(f, prefix, (long)length); 1.238 + } 1.239 + prev2=prev=-1; 1.240 + for(i=col=0; i<length; ++i, ++col) { 1.241 + c=(uint8_t)p[i]; 1.242 + if(i>0) { 1.243 + /* Break long lines. Try to break at interesting places, to minimize revision diffs. */ 1.244 + if( 1.245 + /* Very long line. */ 1.246 + col>=32 || 1.247 + /* Long line, break after terminating NUL. */ 1.248 + (col>=24 && prev2>=0x20 && prev==0) || 1.249 + /* Medium-long line, break before non-NUL, non-character byte. */ 1.250 + (col>=16 && (prev==0 || prev>=0x20) && 0<c && c<0x20) 1.251 + ) { 1.252 + fputs(",\n", f); 1.253 + col=0; 1.254 + } else { 1.255 + fputc(',', f); 1.256 + } 1.257 + } 1.258 + fprintf(f, c<0x20 ? "%u" : "'%c'", c); 1.259 + prev2=prev; 1.260 + prev=c; 1.261 + } 1.262 + if(postfix!=NULL) { 1.263 + fputs(postfix, f); 1.264 + } 1.265 +}