164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert/************************************************************************* 264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert* 364339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert* Copyright (C) 2016 and later: Unicode, Inc. and others. 464339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert* License & terms of use: http://www.unicode.org/copyright.html#License 564339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert* 664339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert************************************************************************** 764339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert************************************************************************** 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Copyright (C) 2001-2006, International Business Machines 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Corporation and others. All Rights Reserved. 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 1264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert************************************************************************** 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* ufortune - An ICU resources sample program 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Demonstrates 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Defining resources for use by an application 18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Compiling and packaging them into a dll 19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Referencing the resource-containing dll from application code 20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Loading resource data using ICU's API 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Created Nov. 7, 2001 by Andy Heninger 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* ufortune is a variant of the Unix "fortune" command, with 25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* ICU resources that contain the fortune-cookie sayings. 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Using resources allows fortunes in different languages to 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* be selected based on locale. 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/ 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdio.h> 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdlib.h> 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <string.h> 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <time.h> 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/udata.h" /* ICU API for data handling. */ 36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ures.h" /* ICU API for resource loading */ 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ustdio.h" /* ICU API for reading & writing Unicode data */ 38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* to files, possibly including character */ 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* set conversions. */ 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ustring.h" 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef UFORTUNE_NOSETAPPDATA 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Resource Data Reference. The data is packaged as a dll (or .so or 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * whatever, depending on the platform) that exports a data 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * symbol. The application (that's us) references that symbol, 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * here, and will pass the data address to ICU, which will then 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * be able to fetch resources from the data. 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruextern const void U_IMPORT *fortune_resources_dat; 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid u_write(const UChar *what, int len); 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * main() This one function is all of the application code. 58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint main(int argc, char **argv) 60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool displayUsage = FALSE; /* Set true if command line err or help */ 62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* option was requested. */ 63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool verbose = FALSE; /* Set true if -v command line option. */ 64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru char *optionError = NULL; /* If command line contains an unrecognized */ 65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* option, this will point to it. */ 66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru char *locale=NULL; /* Locale name. Null for system default, */ 67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* otherwise set from command line. */ 68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const char * programName = argv[0]; /* Program invocation name. */ 69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UFILE *u_stdout; /* Unicode stdout file. */ 72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode err = U_ZERO_ERROR; /* Error return, used for most ICU */ 73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* functions. */ 74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UResourceBundle *myResources; /* ICU Resource "handles" */ 76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UResourceBundle *fortunes_r; 77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t numFortunes; /* Number of fortune strings available. */ 79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int i; 80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const UChar *resString; /* Points to strings fetched from Resources. */ 82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t len; 83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* Process command line options. 86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * -l locale specify a locale 87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * -v verbose mode. Display extra messages. 88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * -? or --help display a usage line 89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru for (i=1; i<argc; i++) { 91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (strcmp(argv[i], "-l") ==0) { 92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (++i < argc) { 93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru locale = argv[i]; 94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru continue; 96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (strcmp(argv[i], "-v") == 0) { 98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru verbose = TRUE; 99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru continue;} 100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (strcmp(argv[i], "-?") == 0 || 101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru strcmp(argv[i], "--help") == 0) { 102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru displayUsage = TRUE; 103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru continue;} 104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru optionError = argv[i]; 105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru displayUsage = TRUE; 106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* ICU's icuio package provides a convenient way to write Unicode 110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * data to stdout. The string data that we get from resources 111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * will be UChar * strings, which icuio can handle nicely. 112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_stdout = u_finit(stdout, NULL /*locale*/, NULL /*codepage */); 114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (verbose) { 115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(u_stdout, "%s: checking output via icuio.\n", programName); 116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef UFORTUNE_NOSETAPPDATA 119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* Tell ICU where our resource data is located in memory. 120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * The data lives in the Fortune_Resources dll, and we just 121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * pass the address of an exported symbol from that library 122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * to ICU. 123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru udata_setAppData("fortune_resources", &fortune_resources_dat, &err); 125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(err)) { 126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stderr, "%s: udata_setAppData failed with error \"%s\"\n", programName, u_errorName(err)); 127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru exit(-1); 128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* Open our resources. 132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myResources = ures_open("fortune_resources", locale, &err); 134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(err)) { 135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stderr, "%s: ures_open failed with error \"%s\"\n", programName, u_errorName(err)); 136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru exit(-1); 137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (verbose) { 139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(u_stdout, "status from ures_open(\"fortune_resources\", %s) is %s\n", 140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru locale? locale: " ", u_errorName(err)); 141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* 144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Display any command line option usage errors and/or the 145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * usage help message. These messages come from our resource bundle. 146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (optionError != NULL) { 148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const UChar *msg = ures_getStringByKey(myResources, "optionMessage", &len, &err); 149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(err)) { 150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stderr, "%s: ures_getStringByKey(\"optionMessage\") failed, %s\n", 151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru programName, u_errorName(err)); 152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru exit(-1); 153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_file_write(msg, len, u_stdout); /* msg is UChar *, from resource */ 155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(u_stdout, " %s\n", optionError); /* optionError is char *, from argv */ 156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (displayUsage) { 159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const UChar *usage; 160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int returnValue=0; 161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru usage = ures_getStringByKey(myResources, "usage", &len, &err); 163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(err)) { 164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stderr, "%s: ures_getStringByKey(\"usage\") failed, %s\n", programName, u_errorName(err)); 165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru exit(-1); 166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_file_write(usage, len, u_stdout); 168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (optionError != NULL) {returnValue = -1;} 169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return returnValue; 170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* 173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Open the "fortunes" resources from within the already open resources 174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fortunes_r = ures_getByKey(myResources, "fortunes", NULL, &err); 176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(err)) { 177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stderr, "%s: ures_getByKey(\"fortunes\") failed, %s\n", programName, u_errorName(err)); 178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru exit(-1); 179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* 183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Pick up and display a random fortune 184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru numFortunes = ures_countArrayItems(myResources, "fortunes", &err); 187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(err)) { 188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stderr, "%s: ures_countArrayItems(\"fortunes\") failed, %s\n", programName, u_errorName(err)); 189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru exit(-1); 190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (numFortunes <= 0) { 192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stderr, "%s: no fortunes found.\n", programName); 193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru exit(-1); 194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru i = (int)time(NULL) % numFortunes; /* Use time to pick a somewhat-random fortune. */ 197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru resString = ures_getStringByIndex(fortunes_r, i, &len, &err); 198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(err)) { 199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stderr, "%s: ures_getStringByIndex(%d) failed, %s\n", programName, i, u_errorName(err)); 200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru exit(-1); 201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_file_write(resString, len, u_stdout); /* Write out the message */ 204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fputc(0x0a, u_stdout); /* and a trailing newline */ 205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return 0; 207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 209