summaryrefslogtreecommitdiff
path: root/src/main-xxx.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/main-xxx.c')
-rw-r--r--src/main-xxx.c785
1 files changed, 785 insertions, 0 deletions
diff --git a/src/main-xxx.c b/src/main-xxx.c
new file mode 100644
index 00000000..c80f01f0
--- /dev/null
+++ b/src/main-xxx.c
@@ -0,0 +1,785 @@
+/* File: main-xxx.c */
+
+/* Purpose: Sample visual module for Angband 2.8.1 */
+
+/*
+ * This file written by "Ben Harrison (benh@phial.com)".
+ *
+ * This file is intended to show one way to build a "visual module"
+ * for Angband to allow it to work with a new system. It does not
+ * actually work, but if the code near "XXX XXX XXX" comments were
+ * replaced with functional code, then it probably would.
+ *
+ * See "z-term.c" for info on the concept of the "generic terminal",
+ * and for more comments about what this file must supply.
+ *
+ * There are two basic ways to port Angband to a new system. The
+ * first involves modifying the "main-gcu.c" and/or "main-x11.c"
+ * files to support some version of "curses" and/or "X11" on your
+ * machine, and to compile with the "USE_GCU" and/or "USE_X11"
+ * compilation flags defined. The second involves creating a
+ * new "main-xxx.c" file, based on this sample file (or on any
+ * existing "main-xxx.c" file), and comes in two flavors, based
+ * on whether it contains a "main()" function (as in "main-mac.c"
+ * and "main-win.c") or not (as in "main-gcu.c" or "main-x11.c").
+ *
+ * If the "main-xxx.c" file includes its own "main()" function,
+ * then you should NOT link in the "main.c" file, and your "main()"
+ * function must process any command line arguments, initialize the
+ * "visual system", and call "play_game()" with appropriate arguments.
+ *
+ * If the "main-xxx.c" file does not include its own "main()"
+ * function, then you must add some code to "main.c" which, if
+ * the appropriate "USE_XXX" compilation flag is defined, will
+ * attempt to call the "init_xxx()" function in the "main-xxx.c"
+ * file, which should initialize the "visual system" and return
+ * zero if it was successful. The "main()" function in "main.c"
+ * will take care of processing command line arguments and then
+ * calling "play_game()" with appropriate arguments.
+ *
+ * Note that the "util.c" file often contains functions which must
+ * be modified in small ways for various platforms, even if you are
+ * able to use the existing "main-gcu.c" and/or "main-x11.c" files,
+ * in particular, the "file handling" functions may not work on all
+ * systems.
+ *
+ * When you complete a port to a new system, you should email any
+ * newly created files, and any changes made to existing files,
+ * including "h-config.h", "config.h", and any of the "Makefile"
+ * files, to "benh@phial.com" for inclusion in the next version.
+ *
+ * Try to stick to a "three letter" naming scheme for "main-xxx.c"
+ * and "Makefile.xxx" and such for consistency and simplicity.
+ */
+
+
+#include "angband.h"
+
+
+#ifdef USE_XXX
+
+
+/*
+ * Extra data to associate with each "window"
+ *
+ * Each "window" is represented by a "term_data" structure, which
+ * contains a "term" structure, which contains a pointer (t->data)
+ * back to the term_data structure.
+ */
+
+typedef struct term_data term_data;
+
+struct term_data
+{
+ term t;
+
+ /* Other fields if needed XXX XXX XXX */
+};
+
+
+
+/*
+ * Number of "term_data" structures to support XXX XXX XXX
+ *
+ * You MUST support at least one "term_data" structure, and the
+ * game will currently use up to eight "term_data" structures if
+ * they are available.
+ *
+ * If only one "term_data" structure is supported, then a lot of
+ * the things that would normally go into a "term_data" structure
+ * could be made into global variables instead.
+ */
+#define MAX_TERM_DATA 1
+
+
+/*
+ * An array of "term_data" structures, one for each "sub-window"
+ */
+static term_data data[MAX_TERM_DATA];
+
+
+#if 0 /* Fix the syntax below XXX XXX XXX */
+
+/*
+ * The "color" array for the visual module XXX XXX XXX
+ *
+ * This table should be used in whetever way is necessary to
+ * convert the Angband Color Indexes into the proper "color data"
+ * for the visual system. On the Macintosh, these are arrays of
+ * three shorts, on the IBM, these are combinations of the eight
+ * basic color codes with optional "bright" bits, on X11, these
+ * are actual "pixel" codes extracted from another table which
+ * contains textual color names.
+ *
+ * The Angband Color Set (0 to 15):
+ * Black, White, Slate, Orange, Red, Blue, Green, Umber
+ * D-Gray, L-Gray, Violet, Yellow, L-Red, L-Blue, L-Green, L-Umber
+ *
+ * Colors 8 to 15 are basically "enhanced" versions of Colors 0 to 7.
+ *
+ * As decribed in one of the header files, in a perfect world, the
+ * colors below should fit a nice clean "quartered" specification
+ * in RGB codes, but this must often be Gamma Corrected. The 1/4
+ * parts of each Red,Green,Blue are shown in the comments below,
+ * again, these values are *before* gamma correction.
+ */
+static local_color_data_type color_data[16] =
+{
+ /* XXX XXX XXX 0,0,0 */, /* TERM_DARK */
+ /* XXX XXX XXX 4,4,4 */, /* TERM_WHITE */
+ /* XXX XXX XXX 2,2,2 */, /* TERM_SLATE */
+ /* XXX XXX XXX 4,2,0 */, /* TERM_ORANGE */
+ /* XXX XXX XXX 3,0,0 */, /* TERM_RED */
+ /* XXX XXX XXX 0,2,1 */, /* TERM_GREEN */
+ /* XXX XXX XXX 0,0,4 */, /* TERM_BLUE */
+ /* XXX XXX XXX 2,1,0 */, /* TERM_UMBER */
+ /* XXX XXX XXX 1,1,1 */, /* TERM_L_DARK */
+ /* XXX XXX XXX 3,3,3 */, /* TERM_L_WHITE */
+ /* XXX XXX XXX 4,0,4 */, /* TERM_VIOLET */
+ /* XXX XXX XXX 4,4,0 */, /* TERM_YELLOW */
+ /* XXX XXX XXX 4,0,0 */, /* TERM_L_RED */
+ /* XXX XXX XXX 0,4,0 */, /* TERM_L_GREEN */
+ /* XXX XXX XXX 0,4,4 */, /* TERM_L_BLUE */
+ /* XXX XXX XXX 3,2,1 */ /* TERM_L_UMBER */
+};
+
+#endif
+
+
+
+/*** Function hooks needed by "Term" ***/
+
+
+/*
+ * Init a new "term"
+ *
+ * This function should do whatever is necessary to prepare a new "term"
+ * for use by the "term.c" package. This may include clearing the window,
+ * preparing the cursor, setting the font/colors, etc. Usually, this
+ * function does nothing, and the "init_xxx()" function does it all.
+ */
+static void Term_init_xxx(term *t)
+{
+ term_data *td = (term_data*)(t->data);
+
+ /* XXX XXX XXX */
+}
+
+
+
+/*
+ * Nuke an old "term"
+ *
+ * This function is called when an old "term" is no longer needed. It should
+ * do whatever is needed to clean up before the program exits, such as wiping
+ * the screen, restoring the cursor, fixing the font, etc. Often this function
+ * does nothing and lets the operating system clean up when the program quits.
+ */
+static void Term_nuke_xxx(term *t)
+{
+ term_data *td = (term_data*)(t->data);
+
+ /* XXX XXX XXX */
+}
+
+
+
+/*
+ * Do a "user action" on the current "term"
+ *
+ * This function allows the visual module to do implementation defined
+ * things when the user activates the "system defined command" command.
+ *
+ * This function is normally not used.
+ *
+ * In general, this function should return zero if the action is successfully
+ * handled, and non-zero if the action is unknown or incorrectly handled.
+ */
+static errr Term_user_xxx(int n)
+{
+ term_data *td = (term_data*)(Term->data);
+
+ /* XXX XXX XXX */
+
+ /* Unknown */
+ return (1);
+}
+
+
+/*
+ * Do a "special thing" to the current "term"
+ *
+ * This function must react to a large number of possible arguments, each
+ * corresponding to a different "action request" by the "z-term.c" package,
+ * or by the application itself.
+ *
+ * The "action type" is specified by the first argument, which must be a
+ * constant of the form "TERM_XTRA_*" as given in "term.h", and the second
+ * argument specifies the "information" for that argument, if any, and will
+ * vary according to the first argument.
+ *
+ * In general, this function should return zero if the action is successfully
+ * handled, and non-zero if the action is unknown or incorrectly handled.
+ */
+static errr Term_xtra_xxx(int n, int v)
+{
+ term_data *td = (term_data*)(Term->data);
+
+ /* Analyze */
+ switch (n)
+ {
+ case TERM_XTRA_EVENT:
+ {
+ /*
+ * Process some pending events XXX XXX XXX
+ *
+ * Wait for at least one event if "v" is non-zero
+ * otherwise, if no events are ready, return at once.
+ * When "keypress" events are encountered, the "ascii"
+ * value corresponding to the key should be sent to the
+ * "Term_keypress()" function. Certain "bizarre" keys,
+ * such as function keys or arrow keys, may send special
+ * sequences of characters, such as control-underscore,
+ * plus letters corresponding to modifier keys, plus an
+ * underscore, plus carriage return, which can be used by
+ * the main program for "macro" triggers. This action
+ * should handle as many events as is efficiently possible
+ * but is only required to handle a single event, and then
+ * only if one is ready or "v" is true.
+ *
+ * This action is required.
+ */
+
+ return (0);
+ }
+
+ case TERM_XTRA_FLUSH:
+ {
+ /*
+ * Flush all pending events XXX XXX XXX
+ *
+ * This action should handle all events waiting on the
+ * queue, optionally discarding all "keypress" events,
+ * since they will be discarded anyway in "z-term.c".
+ *
+ * This action is required, but may not be "essential".
+ */
+
+ return (0);
+ }
+
+ case TERM_XTRA_CLEAR:
+ {
+ /*
+ * Clear the entire window XXX XXX XXX
+ *
+ * This action should clear the entire window, and redraw
+ * any "borders" or other "graphic" aspects of the window.
+ *
+ * This action is required.
+ */
+
+ return (0);
+ }
+
+ case TERM_XTRA_SHAPE:
+ {
+ /*
+ * Set the cursor visibility XXX XXX XXX
+ *
+ * This action should change the visibility of the cursor,
+ * if possible, to the requested value (0=off, 1=on)
+ *
+ * This action is optional, but can improve both the
+ * efficiency (and attractiveness) of the program.
+ */
+
+ return (0);
+ }
+
+ case TERM_XTRA_FROSH:
+ {
+ /*
+ * Flush a row of output XXX XXX XXX
+ *
+ * This action should make sure that row "v" of the "output"
+ * to the window will actually appear on the window.
+ *
+ * This action is optional, assuming that "Term_text_xxx()"
+ * (and similar functions) draw directly to the screen, or
+ * that the "TERM_XTRA_FRESH" entry below takes care of any
+ * necessary flushing issues.
+ */
+
+ return (0);
+ }
+
+ case TERM_XTRA_FRESH:
+ {
+ /*
+ * Flush output XXX XXX XXX
+ *
+ * This action should make sure that all "output" to the
+ * window will actually appear on the window.
+ *
+ * This action is optional, assuming that "Term_text_xxx()"
+ * (and similar functions) draw directly to the screen, or
+ * that the "TERM_XTRA_FROSH" entry above takes care of any
+ * necessary flushing issues.
+ */
+
+ return (0);
+ }
+
+ case TERM_XTRA_NOISE:
+ {
+ /*
+ * Make a noise XXX XXX XXX
+ *
+ * This action should produce a "beep" noise.
+ *
+ * This action is optional, but convenient.
+ */
+
+ return (0);
+ }
+
+ case TERM_XTRA_SOUND:
+ {
+ /*
+ * Make a sound XXX XXX XXX
+ *
+ * This action should produce sound number "v", where the
+ * "name" of that sound is "sound_names[v]". This method
+ * is still under construction.
+ *
+ * This action is optional, and not very important.
+ */
+
+ return (0);
+ }
+
+ case TERM_XTRA_BORED:
+ {
+ /*
+ * Handle random events when bored XXX XXX XXX
+ *
+ * This action is optional, and normally not important
+ */
+
+ return (0);
+ }
+
+ case TERM_XTRA_REACT:
+ {
+ /*
+ * React to global changes XXX XXX XXX
+ *
+ * For example, this action can be used to react to
+ * changes in the global "color_table[256][4]" array.
+ *
+ * This action is optional, but can be very useful for
+ * handling "color changes" and the "arg_sound" and/or
+ * "arg_graphics" options.
+ */
+
+ return (0);
+ }
+
+ case TERM_XTRA_ALIVE:
+ {
+ /*
+ * Change the "hard" level XXX XXX XXX
+ *
+ * This action is used if the program changes "aliveness"
+ * by being either "suspended" (v=0) or "resumed" (v=1)
+ * This action is optional, unless the computer uses the
+ * same "physical screen" for multiple programs, in which
+ * case this action should clean up to let other programs
+ * use the screen, or resume from such a cleaned up state.
+ *
+ * This action is currently only used by "main-gcu.c",
+ * on UNIX machines, to allow proper "suspending".
+ */
+
+ return (0);
+ }
+
+ case TERM_XTRA_LEVEL:
+ {
+ /*
+ * Change the "soft" level XXX XXX XXX
+ *
+ * This action is used when the term window changes "activation"
+ * either by becoming "inactive" (v=0) or "active" (v=1)
+ *
+ * This action can be used to do things like activate the proper
+ * font / drawing mode for the newly active term window. This
+ * action should NOT change which window has the "focus", which
+ * window is "raised", or anything like that.
+ *
+ * This action is optional if all the other things which depend
+ * on what term is active handle activation themself, or if only
+ * one "term_data" structure is supported by this file.
+ */
+
+ return (0);
+ }
+
+ case TERM_XTRA_DELAY:
+ {
+ /*
+ * Delay for some milliseconds XXX XXX XXX
+ *
+ * This action is useful for proper "timing" of certain
+ * visual effects, such as breath attacks.
+ *
+ * This action is optional, but may be required by this file,
+ * especially if special "macro sequences" must be supported.
+ */
+
+ return (0);
+ }
+
+ case TERM_XTRA_GET_DELAY:
+ {
+ /*
+ * Get Delay of some milliseconds XXX XXX XXX
+ * place the result in Term_xtra_long
+ *
+ * This action is useful for proper "timing" of certain
+ * visual effects, such as recording cmovies.
+ *
+ * This action is optional, but cmovies wont perform
+ * good without it
+ */
+
+ return (0);
+ }
+ }
+
+ /* Unknown or Unhandled action */
+ return (1);
+}
+
+
+/*
+ * Display the cursor
+ *
+ * This routine should display the cursor at the given location
+ * (x,y) in some manner. On some machines this involves actually
+ * moving the physical cursor, on others it involves drawing a fake
+ * cursor in some form of graphics mode. Note the "soft_cursor"
+ * flag which tells "z-term.c" to treat the "cursor" as a "visual"
+ * thing and not as a "hardware" cursor.
+ *
+ * You may assume "valid" input if the window is properly sized.
+ *
+ * You may use the "Term_grab(x, y, &a, &c)" function, if needed,
+ * to determine what attr/char should be "under" the new cursor,
+ * for "inverting" purposes or whatever.
+ */
+static errr Term_curs_xxx(int x, int y)
+{
+ term_data *td = (term_data*)(Term->data);
+
+ /* XXX XXX XXX */
+
+ /* Success */
+ return (0);
+}
+
+
+/*
+ * Erase some characters
+ *
+ * This function should erase "n" characters starting at (x,y).
+ *
+ * You may assume "valid" input if the window is properly sized.
+ */
+static errr Term_wipe_xxx(int x, int y, int n)
+{
+ term_data *td = (term_data*)(Term->data);
+
+ /* XXX XXX XXX */
+
+ /* Success */
+ return (0);
+}
+
+
+/*
+ * Draw some text on the screen
+ *
+ * This function should actually display an array of characters
+ * starting at the given location, using the given "attribute",
+ * and using the given string of characters, which contains
+ * exactly "n" characters and which is NOT null-terminated.
+ *
+ * You may assume "valid" input if the window is properly sized.
+ *
+ * You must be sure that the string, when written, erases anything
+ * (including any visual cursor) that used to be where the text is
+ * drawn. On many machines this happens automatically, on others,
+ * you must first call "Term_wipe_xxx()" to clear the area.
+ *
+ * In color environments, you should activate the color contained
+ * in "color_data[a & 0x0F]", if needed, before drawing anything.
+ *
+ * You may ignore the "attribute" if you are only supporting a
+ * monochrome environment, since this routine is normally never
+ * called to display "black" (invisible) text, including the
+ * default "spaces", and all other colors should be drawn in
+ * the "normal" color in a monochrome environment.
+ *
+ * Note that if you have changed the "attr_blank" to something
+ * which is not black, then this function must be able to draw
+ * the resulting "blank" correctly.
+ *
+ * Note that this function must correctly handle "black" text if
+ * the "always_text" flag is set, if this flag is not set, all the
+ * "black" text will be handled by the "Term_wipe_xxx()" hook.
+ */
+static errr Term_text_xxx(int x, int y, int n, byte a, const char *cp)
+{
+ term_data *td = (term_data*)(Term->data);
+
+ /* XXX XXX XXX */
+
+ /* Success */
+ return (0);
+}
+
+
+/*
+ * Draw some attr/char pairs on the screen
+ *
+ * This routine should display the given "n" attr/char pairs at
+ * the given location (x,y). This function is only used if one
+ * of the flags "always_pict" or "higher_pict" is defined.
+ *
+ * You must be sure that the attr/char pairs, when displayed, will
+ * erase anything (including any visual cursor) that used to be at
+ * the given location. On many machines this is automatic, but on
+ * others, you must first call "Term_wipe_xxx(x, y, 1)".
+ *
+ * With the "higher_pict" flag, this function can be used to allow
+ * the display of "pseudo-graphic" pictures, for example, by using
+ * the attr/char pair as an encoded index into a pixmap of special
+ * "pictures".
+ *
+ * With the "always_pict" flag, this function can be used to force
+ * every attr/char pair to be drawn by this function, which can be
+ * very useful if this file can optimize its own display calls.
+ *
+ * This function is often associated with the "arg_graphics" flag.
+ *
+ * This function is only used if one of the "higher_pict" and/or
+ * "always_pict" flags are set.
+ */
+static errr Term_pict_xxx(int x, int y, int n, const byte *ap, const char *cp)
+{
+ term_data *td = (term_data*)(Term->data);
+
+ /* XXX XXX XXX */
+
+ /* Success */
+ return (0);
+}
+
+
+
+/*** Internal Functions ***/
+
+
+/*
+ * Instantiate a "term_data" structure
+ *
+ * This is one way to prepare the "term_data" structures and to
+ * "link" the various informational pieces together.
+ *
+ * This function assumes that every window should be 80x24 in size
+ * (the standard size) and should be able to queue 256 characters.
+ * Technically, only the "main screen window" needs to queue any
+ * characters, but this method is simple. One way to allow some
+ * variation is to add fields to the "term_data" structure listing
+ * parameters for that window, initialize them in the "init_xxx()"
+ * function, and then use them in the code below.
+ *
+ * Note that "activation" calls the "Term_init_xxx()" hook for
+ * the "term" structure, if needed.
+ */
+static void term_data_link(int i)
+{
+ term_data *td = &data[i];
+
+ /* Initialize the term */
+ term_init(td->t, 80, 24, 256);
+
+ /* Choose "soft" or "hard" cursor XXX XXX XXX */
+ /* A "soft" cursor must be explicitly "drawn" by the program */
+ /* while a "hard" cursor has some "physical" existance and is */
+ /* moved whenever text is drawn on the screen. See "term.c". */
+ /* td->t->soft_cursor = TRUE; */
+
+ /* Avoid the "corner" of the window XXX XXX XXX */
+ /* td->t->icky_corner = TRUE; */
+
+ /* Use "Term_pict()" for all attr/char pairs XXX XXX XXX */
+ /* See the "Term_pict_xxx()" function above. */
+ /* td->t->always_pict = TRUE; */
+
+ /* Use "Term_pict()" for some attr/char pairs XXX XXX XXX */
+ /* See the "Term_pict_xxx()" function above. */
+ /* td->t->higher_pict = TRUE; */
+
+ /* Use "Term_text()" even for "black" text XXX XXX XXX */
+ /* See the "Term_text_xxx()" function above. */
+ /* td->t->always_text = TRUE; */
+
+ /* Ignore the "TERM_XTRA_BORED" action XXX XXX XXX */
+ /* This may make things slightly more efficient. */
+ /* td->t->never_bored = TRUE; */
+
+ /* Ignore the "TERM_XTRA_FROSH" action XXX XXX XXX */
+ /* This may make things slightly more efficient. */
+ /* td->t->never_frosh = TRUE; */
+
+ /* Erase with "white space" XXX XXX XXX */
+ /* td->t->attr_blank = TERM_WHITE; */
+ /* td->t->char_blank = ' '; */
+
+ /* Prepare the init/nuke hooks */
+ td->t->init_hook = Term_init_xxx;
+ td->t->nuke_hook = Term_nuke_xxx;
+
+ /* Prepare the template hooks */
+ td->t->user_hook = Term_user_xxx;
+ td->t->xtra_hook = Term_xtra_xxx;
+ td->t->curs_hook = Term_curs_xxx;
+ td->t->wipe_hook = Term_wipe_xxx;
+ td->t->text_hook = Term_text_xxx;
+ td->t->pict_hook = Term_pict_xxx;
+
+ /* Remember where we came from */
+ td->t->data = (vptr)(td);
+
+ /* Activate it */
+ Term_activate(td->t);
+
+ /* Global pointer */
+ ang_term[i] = td->t;
+}
+
+
+
+/*
+ * Initialization function
+ */
+errr init_xxx(void)
+{
+ /* Initialize globals XXX XXX XXX */
+
+ /* Initialize "term_data" structures XXX XXX XXX */
+
+ /* Create windows (backwards!) */
+ for (i = TERM_DATA_MAX - 1; i >= 0; i--)
+ {
+ /* Link */
+ term_data_link(i);
+ }
+
+ /* Success */
+ return (0);
+}
+
+
+#ifdef INTERNAL_MAIN
+
+
+/*
+ * Some special machines need their own "main()" function, which they
+ * can provide here, making sure NOT to compile the "main.c" file.
+ *
+ * These systems usually have some form of "event loop", run forever
+ * as the last step of "main()", which handles things like menus and
+ * window movement, and calls "play_game(FALSE)" to load a game after
+ * initializing "savefile" to a filename, or "play_game(TRUE)" to make
+ * a new game. The event loop would also be triggered by "Term_xtra()"
+ * (the TERM_XTRA_EVENT action), in which case the event loop would not
+ * actually "loop", but would run once and return.
+ */
+
+
+/*
+ * An event handler XXX XXX XXX
+ *
+ * You may need an event handler, which can be used by both
+ * by the "TERM_XTRA_BORED" and "TERM_XTRA_EVENT" entries in
+ * the "Term_xtra_xxx()" function, and also to wait for the
+ * user to perform whatever user-interface operation is needed
+ * to request the start of a new game or the loading of an old
+ * game, both of which should launch the "play_game()" function.
+ */
+static bool_ CheckEvents(bool_ wait)
+{
+ /* XXX XXX XXX */
+
+ return (0);
+}
+
+
+/*
+ * Init some stuff
+ *
+ * This function is used to keep the "path" variable off the stack.
+ */
+static void init_stuff(void)
+{
+ char path[1024];
+
+ /* Prepare the path XXX XXX XXX */
+ /* This must in some way prepare the "path" variable */
+ /* so that it points at the "lib" directory. Every */
+ /* machine handles this in a different way... */
+ strcpy(path, "XXX XXX XXX");
+
+ /* Prepare the filepaths */
+ init_file_paths(path);
+}
+
+
+/*
+ * Main function
+ *
+ * This function must do a lot of stuff.
+ */
+int main(int argc, char *argv[])
+{
+ /* Initialize the machine itself XXX XXX XXX */
+
+ /* Process command line arguments XXX XXX XXX */
+
+ /* Initialize the windows */
+ if (init_xxx()) quit("Oops!");
+
+ /* XXX XXX XXX */
+ ANGBAND_SYS = "xxx";
+
+ /* Initialize some stuff */
+ init_stuff();
+
+ /* Initialize */
+ init_angband * /
+
+ /* Allow auto-startup XXX XXX XXX */
+
+ /* Event loop forever XXX XXX XXX */
+ while (TRUE) CheckEvents(TRUE);
+}
+
+
+#endif /* INTERNAL_MAIN */
+
+
+#endif /* USE_XXX */