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