Full Code Listing Up to the "Use ncurses to Draw the Images" Page

Return back to the "Use ncurses to Draw the Images" Page

src/main.rs
/* main.rs */

mod images;
mod housekeeping;

use images::*;
use housekeeping::*;

fn main() {

    let opts: Options = get_options();

    let image_vecvec = string_to_vecvecstrings(opts.image_string);

    display_image(image_vecvec);
    
} // end of main()

fn get_options() -> Options {
    use clap::Parser; // Use c[ommand] l[ine] a[rgument] p[arser] to get command-line arguments.


    // Set up program-arguments possibilities.
    #[derive(Parser)]
    struct Arguments {

        /// Which image to animate? D[51] | C[51] | L[ittle] | B[oat] | T[win[engine]] | P[lane] | M[otor[cycle]] | J[ack] | F[erris]
        #[arg(long, short, default_value_t = String::from("D51"))]
        kind: String,
 
        /// Fly?
        #[arg(short, long, default_value_t = false)]
        fly: bool,

        /// Ctrl-c?
        #[arg(short, long, default_value_t = false)]
        breakable: bool,
        
        /// Accident (only for some images)?
        #[arg(short, long, default_value_t = false)]
        accident: bool,
        
        /// No trailer (only for D51 & C51 trains)?
        #[arg(short, long, default_value_t = false)]
        no_trailer: bool,
    } // end of Arguments struct
  
    // The struct variable must be initialized; we're mostly using dummy values.
    let mut cli_opts = Options {
        kind: String::from("D51"),
        image_string: String::from(""),
        image_vecvec: vec![vec![String::from("")]],
        speed: 100,
        accident: false,
        fly: false,
        screen_height: 100,
        screen_width: 100,
        craft_height: 100,
        craft_length: 100,
    };

    // Get command-line arguments, if any.
    let args: Arguments = Arguments::parse();
  
    let image_string = match args.kind.to_uppercase().as_str() {
        "P" | "PLANE"                   =>  PLANE,
        "D" | "D51"                     =>  D51,
        "C" | "C51"                     =>  C51,
        "L" | "LITTLE"                  =>  LITTLE,
        "B" | "BOAT"                    =>  BOAT,
        "T" | "TWIN" | "TWINENGINE"     =>  TWINENGINE,
        "M" | "MOTOR" | "MOTORCYCLE"    =>  MOTORCYCLE,        
        "J" | "JACK"                    =>  JACK,
        "F" | "FERRIS" | "MASCOT"       =>  FERRIS,
        _                               =>  D51,
    };
    cli_opts.image_string = image_string.to_string();

    return cli_opts;
 } // end of get_options()

 
fn string_to_vecvecstrings(image_string: String) -> Vec<Vec<String>> {

    //The first character in the original const, after the 'r"', is a newline; lose it.
    let image_string = &image_string[1..image_string.len()];

    // Create new blank vector of vector of Strings.
    let mut outer_vec: Vec<Vec<String>> = Vec::new();

    // This keeps track of which frame/inner vector we're processing.
    let mut inner_vec_num: usize = 0;

    // Create first inner vector in the outer vector.
    outer_vec.push(Vec::new());

    for mut each_line in image_string.lines() {
        if each_line != "" {
            // If a blank line is not found ...
            // ... remove single-quote mark at end of each line,
            if &each_line[each_line.len() - 1..] == "'" {
                each_line = &each_line[0..each_line.len() - 1];
            }
            // ... and then add the string to the current inner vector.
            outer_vec[inner_vec_num].push(each_line.to_string());
        } else {
            // If a blank line is found...
            // ... we're done with the current vector, so create a new inner vector...
            outer_vec.push(Vec::new());
            // ... and increase the count of vectors by one.            
            inner_vec_num += 1;
        }
    }
    // Return the finished vector of String vectors.
    outer_vec
} // end of string_to_vecvecstrings()


fn display_image(image_vecvec: Vec<Vec<String>>) {
    let mut frame_num = 0;
    for each_frame in image_vecvec {
      println!("Frame {}:", frame_num);
      for each_line in each_frame {
        println!("{}", each_line);
      }
    frame_num += 1;
    }
} // end of display_image()
src/housekeeping.rs
/* housekeeping.rs */

pub struct Options {
    pub kind: String,
    pub speed: usize,
    pub image_string: String,
    pub image_vecvec: Vec<Vec<String>>,
    pub accident: bool,
    pub fly: bool,
    pub screen_height: usize,
    pub screen_width: usize,
    pub craft_height: usize,
    pub craft_length: usize,
} // end of struct Options
src/images.rs
/* images.rs */

/*  Feel free to add your own images, and modify the rest of the program code accordingly.
    - Ideally all the lines of all the frames of a particular image should be of
        the same length. But if not, the first line of the first frame should be
        the longest, as that's the line the program uses to determine an image's
        length.
    - If there are multiple frames/cels of the image, a blank line must separate the frames.
    - The single quotes at the end of the lines are optional; they merely serve as a visual
        indicator of the end of the line. Some of the image lines have the single quote;
        some do not. The program will strip them out if they are included here.
    - The "r" before the string tells the compiler to read the string in "raw"
        mode, so that backslashes are not interpreted as escape characters.
    - If a hash/splat ("#") is used in an image, the "r" must be modified to be "r#", and
        the end of the string must be closed with a "#". You can see this in both the
        TWINENGINE and MOTORCYCLE declarations.

Original Copyright Notice from "sl.h" in the "sl" package of Debian Bookworm:

/*========================================
 *    sl.h: SL version 5.02
 *      Copyright 1993,2002,2014
 *                Toyoda Masashi
 *                (mtoyoda@acm.org)
 *      Last Modified: 2014/06/03
 *========================================
 */

 This Rust re-write by:
  Kent West - kent.west@gmail.com
  June 2023
*/

pub const D51: &str = r"
      ====        ________                ___________'
  _D _|  |_______/        \__I_I_____===__|_________|'
   |(_)---  |   H\________/ |   |        =|___ ___|  '
   /     |  |   H  |  |     |   |         ||_| |_||  '
  |      |  |   H  |__--------------------| [___] |  '
  | ________|___H__/__|_____/[][]~\_______|       |  '
  |/ |   |-----------I_____I [][] []  D   |=======|__'
__/ =| o |=-~~\  /~~\  /~~\  /~~\ ____Y___________|__'
 |/-=|___|=    ||    ||    ||    |_____/~\___/       '
  \_/      \O=====O=====O=====O_/      \_/           '

      ====        ________                ___________
  _D _|  |_______/        \__I_I_____===__|_________|
   |(_)---  |   H\________/ |   |        =|___ ___|  
   /     |  |   H  |  |     |   |         ||_| |_||  
  |      |  |   H  |__--------------------| [___] |  
  | ________|___H__/__|_____/[][]~\_______|       |  
  |/ |   |-----------I_____I [][] []  D   |=======|__
__/ =| o |=-~~\  /~~\  /~~\  /~~\ ____Y___________|__
 |/-=|___|=O=====O=====O=====O   |_____/~\___/       
  \_/      \__/  \__/  \__/  \__/      \_/           

      ====        ________                ___________'
  _D _|  |_______/        \__I_I_____===__|_________|'
   |(_)---  |   H\________/ |   |        =|___ ___|  '
   /     |  |   H  |  |     |   |         ||_| |_||  '
  |      |  |   H  |__--------------------| [___] |  '
  | ________|___H__/__|_____/[][]~\_______|       |  '
  |/ |   |-----------I_____I [][] []  D   |=======|__'
__/ =| o |=-O=====O=====O=====O \ ____Y___________|__'
 |/-=|___|=    ||    ||    ||    |_____/~\___/       '
  \_/      \__/  \__/  \__/  \__/      \_/           '

      ====        ________                ___________
  _D _|  |_______/        \__I_I_____===__|_________|
   |(_)---  |   H\________/ |   |        =|___ ___|  
   /     |  |   H  |  |     |   |         ||_| |_||  
  |      |  |   H  |__--------------------| [___] |  
  | ________|___H__/__|_____/[][]~\_______|       |  
  |/ |   |-----------I_____I [][] []  D   |=======|__
__/ =| o |=-~O=====O=====O=====O\ ____Y___________|__
 |/-=|___|=    ||    ||    ||    |_____/~\___/       
  \_/      \__/  \__/  \__/  \__/      \_/           

      ====        ________                ___________'
  _D _|  |_______/        \__I_I_____===__|_________|'
   |(_)---  |   H\________/ |   |        =|___ ___|  '
   /     |  |   H  |  |     |   |         ||_| |_||  '
  |      |  |   H  |__--------------------| [___] |  '
  | ________|___H__/__|_____/[][]~\_______|       |  '
  |/ |   |-----------I_____I [][] []  D   |=======|__'
__/ =| o |=-~~\  /~~\  /~~\  /~~\ ____Y___________|__'
 |/-=|___|=   O=====O=====O=====O|_____/~\___/       '
  \_/      \__/  \__/  \__/  \__/      \_/           '

      ====        ________                ___________
  _D _|  |_______/        \__I_I_____===__|_________|
   |(_)---  |   H\________/ |   |        =|___ ___|  
   /     |  |   H  |  |     |   |         ||_| |_||  
  |      |  |   H  |__--------------------| [___] |  
  | ________|___H__/__|_____/[][]~\_______|       |  
  |/ |   |-----------I_____I [][] []  D   |=======|__
__/ =| o |=-~~\  /~~\  /~~\  /~~\ ____Y___________|__
 |/-=|___|=    ||    ||    ||    |_____/~\___/       
  \_/      \_O=====O=====O=====O/      \_/           
";

pub const LITTLE: &str = r"
     ++      +------ ____                 ____________________ '
     ||      |+-+ |  |   \@@@@@@@@@@@     |  ___ ___ ___ ___ | '
   /---------|| | |  |    \@@@@@@@@@@@@@_ |  |_| |_| |_| |_| | '
  + ========  +-+ |  |                  | |__________________| '
 _|--O========O~\-+  |__________________| |__________________| '
//// \_/      \_/       (O)       (O)        (O)        (O)    '

     ++      +------ ____                 ____________________ ' 
     ||      |+-+ |  |   \@@@@@@@@@@@     |  ___ ___ ___ ___ | '
   /---------|| | |  |    \@@@@@@@@@@@@@_ |  |_| |_| |_| |_| | '
  + ========  +-+ |  |                  | |__________________| '
 _|--/O========O\-+  |__________________| |__________________| '
//// \_/      \_/       (O)       (O)        (O)        (O)    '

     ++      +------ ____                 ____________________ '
     ||      |+-+ |  |   \@@@@@@@@@@@     |  ___ ___ ___ ___ | '
   /---------|| | |  |    \@@@@@@@@@@@@@_ |  |_| |_| |_| |_| | '
  + ========  +-+ |  |                  | |__________________| '
 _|--/~O========O-+  |__________________| |__________________| '
//// \_/      \_/       (O)       (O)        (O)        (O)    '

     ++      +------ ____                 ____________________ '
     ||      |+-+ |  |   \@@@@@@@@@@@     |  ___ ___ ___ ___ | '
   /---------|| | |  |    \@@@@@@@@@@@@@_ |  |_| |_| |_| |_| | '
  + ========  +-+ |  |                  | |__________________| '
 _|--/~\------/~\-+  |__________________| |__________________| '
//// \_O========O       (O)       (O)        (O)        (O)    '

     ++      +------ ____                 ____________________ '
     ||      |+-+ |  |   \@@@@@@@@@@@     |  ___ ___ ___ ___ | '
   /---------|| | |  |    \@@@@@@@@@@@@@_ |  |_| |_| |_| |_| | '
  + ========  +-+ |  |                  | |__________________| '
 _|--/~\------/~\-+  |__________________| |__________________| '
//// \O========O/       (O)       (O)        (O)        (O)    '

     ++      +------ ____                 ____________________ '
     ||      |+-+ |  |   \@@@@@@@@@@@     |  ___ ___ ___ ___ | '
   /---------|| | |  |    \@@@@@@@@@@@@@_ |  |_| |_| |_| |_| | '
  + ========  +-+ |  |                  | |__________________| '
 _|--/~\------/~\-+  |__________________| |__________________| '
//// O========O_/       (O)       (O)        (O)        (O)    '

"; // end of LITTLE

pub const C51: &str = r"
        ___                                            '
       _|_|_  _     __       __             ___________'
    D__/   \_(_)___|  |__H__|  |_____I_Ii_()|_________|'
     | `---'   |:: `--'  H  `--'         |  |___ ___|  '
    +|~~~~~~~~++::~~~~~~~H~~+=====+~~~~~~|~~||_| |_||  '
    ||        | ::       H  +=====+      |  |::  ...|  '
|    | _______|_::-----------------[][]-----|       |  '
| /~~ ||   |-----/~~~~\  /[I_____I][][] --|||_______|__'
------'|oOo|==[]=-     ||      ||      |  ||=======_|__'
/~\____|___|/~\_|   O=======O=======O  |__|+-/~\_|     '
\_/         \_/  \____/  \____/  \____/      \_/       '

        ___                                            '
       _|_|_  _     __       __             ___________'
    D__/   \_(_)___|  |__H__|  |_____I_Ii_()|_________|'
     | `---'   |:: `--'  H  `--'         |  |___ ___|  '
    +|~~~~~~~~++::~~~~~~~H~~+=====+~~~~~~|~~||_| |_||  '
    ||        | ::       H  +=====+      |  |::  ...|  '
|    | _______|_::-----------------[][]-----|       |  '
| /~~ ||   |-----/~~~~\  /[I_____I][][] --|||_______|__'
------'|oOo|===[]=-    ||      ||      |  ||=======_|__'
/~\____|___|/~\_|    O=======O=======O |__|+-/~\_|     '
\_/         \_/  \____/  \____/  \____/      \_/       '

        ___                                            '
       _|_|_  _     __       __             ___________'
    D__/   \_(_)___|  |__H__|  |_____I_Ii_()|_________|'
     | `---'   |:: `--'  H  `--'         |  |___ ___|  '
    +|~~~~~~~~++::~~~~~~~H~~+=====+~~~~~~|~~||_| |_||  '
    ||        | ::       H  +=====+      |  |::  ...|  '
|    | _______|_::-----------------[][]-----|       |  '
| /~~ ||   |-----/~~~~\  /[I_____I][][] --|||_______|__'
------'|oOo|===[]=- O=======O=======O  |  ||=======_|__'
/~\____|___|/~\_|      ||      ||      |__|+-/~\_|     '
\_/         \_/  \____/  \____/  \____/      \_/       '

        ___                                            '
       _|_|_  _     __       __             ___________'
    D__/   \_(_)___|  |__H__|  |_____I_Ii_()|_________|'
     | `---'   |:: `--'  H  `--'         |  |___ ___|  '
    +|~~~~~~~~++::~~~~~~~H~~+=====+~~~~~~|~~||_| |_||  '
    ||        | ::       H  +=====+      |  |::  ...|  '
|    | _______|_::-----------------[][]-----|       |  '
| /~~ ||   |-----/~~~~\  /[I_____I][][] --|||_______|__'
------'|oOo|==[]=- O=======O=======O   |  ||=======_|__'
/~\____|___|/~\_|      ||      ||      |__|+-/~\_|     '
\_/         \_/  \____/  \____/  \____/      \_/       '

        ___                                            '
       _|_|_  _     __       __             ___________'
    D__/   \_(_)___|  |__H__|  |_____I_Ii_()|_________|'
     | `---'   |:: `--'  H  `--'         |  |___ ___|  '
    +|~~~~~~~~++::~~~~~~~H~~+=====+~~~~~~|~~||_| |_||  '
    ||        | ::       H  +=====+      |  |::  ...|  '
|    | _______|_::-----------------[][]-----|       |  '
| /~~ ||   |-----/~~~~\  /[I_____I][][] --|||_______|__'
------'|oOo|=[]=- O=======O=======O    |  ||=======_|__'
/~\____|___|/~\_|      ||      ||      |__|+-/~\_|     '
\_/         \_/  \____/  \____/  \____/      \_/       '

        ___                                            '
       _|_|_  _     __       __             ___________'
    D__/   \_(_)___|  |__H__|  |_____I_Ii_()|_________|'
     | `---'   |:: `--'  H  `--'         |  |___ ___|  '
    +|~~~~~~~~++::~~~~~~~H~~+=====+~~~~~~|~~||_| |_||  '
    ||        | ::       H  +=====+      |  |::  ...|  '
|    | _______|_::-----------------[][]-----|       |  '
| /~~ ||   |-----/~~~~\  /[I_____I][][] --|||_______|__'
------'|oOo|=[]=-      ||      ||      |  ||=======_|__'
/~\____|___|/~\_|  O=======O=======O   |__|+-/~\_|     '
\_/         \_/  \____/  \____/  \____/      \_/       '
"; // end of C51

pub const BOAT: &str = r"
   |\     '
   | \    '
   |  \   '
   |___\  '
\--|----/ '
 \_____/  '
"; // end of BOAT

pub const TWINENGINE: &str = r#"
                                                                .____   __ _      
   __o__   _______ _ _  _                                     /     /             
   \    ~\                                                  /      /              
     \     '\                                         ..../      .'               
      . ' ' . ~\                                      ' /       /                 
     .  |    .  ~ \  .+~\~ ~ ' ' " " ' ' ~ - - - - - -''_      /                  
    .  <#  .  - - -/' . ' \  __                          '~ - \                   
     .. -           ~-.._ / |__|  ( )  ( )  ( )  0  o    _ _    ~ .               
   .-'                                               .- ~    '-.    -.            
  <                      . ~ ' ' .             . - ~             ~ -.__~_. _ _    
    ~- .       N121PP  .       /  . . . . ,- ~                                    
          ' ~ - - - - =.   <#>    .         \.._                                  
                      .     ~      ____ _ .. ..  .- .                             
                       .  /      '        ~ -.        ~ -.                        
                         ' . . '               ~ - .       ~-.                    
                                                     ~ - .      ~ .               
                                                            ~ -...0..~. ____      

                                                                .____   __ _      
   __o__   _______ _ _  _                                     /     /             
   \    ~\                                                  /      /              
     \     '\                                         ..../      .'               
      . ' ' . ~\                                      ' /       /                 
     .  _    .  ~ \  .+~\~ ~ ' ' " " ' ' ~ - - - - - -''_      /                  
    .  <# -.  - - -/' . ' \  __                          '~ - \                   
     .. -           ~-.._ / |__|  ( )  ( )  ( )  0  o    _ _    ~ .               
   .-'                                               .- ~    '-.    -.            
  <                      . ~ ' ' .             . - ~             ~ -.__~_. _ _    
    ~- .       N121PP  .          . . . . ,- ~                                    
          ' ~ - - - - =. - <#> -  .         \.._                                  
                      .     ~      ____ _ .. ..  .- .                             
                       .         '        ~ -.        ~ -.                        
                         ' . . '               ~ - .       ~-.                    
                                                     ~ - .      ~ .               
                                                            ~ -...0..~. ____      

                                                                .____   __ _      
   __o__   _______ _ _  _                                     /     /             
   \    ~\                                                  /      /              
     \     '\                                         ..../      .'               
      . ' ' . ~\                                      ' /       /                 
     .    /  .  ~ \  .+~\~ ~ ' ' " " ' ' ~ - - - - - -''_      /                  
    . -<#  .  - - -/' . ' \  __                          '~ - \                   
     .. -           ~-.._ / |__|  ( )  ( )  ( )  0  o    _ _    ~ .               
   .-'                                               .- ~    '-.    -.            
  <                      . ~ ' ' .             . - ~             ~ -.__~_. _ _    
    ~- .       N121PP  . \        . . . . ,- ~                                    
          ' ~ - - - - =.   <#>    .         \.._                                  
                      .     ~      ____ _ .. ..  .- .                             
                       .      \  '        ~ -.        ~ -.                        
                         ' . . '               ~ - .       ~-.                    
                                                     ~ - .      ~ .               
                                                            ~ -...0..~. ____      

                                                                .____   __ _      
   __o__   _______ _ _  _                                     /     /             
   \    ~\                                                  /      /              
     \     '\                                         ..../      .'               
      . ' ' . ~\                                      ' /       /                 
     .  _    .  ~ \  .+~\~ ~ ' ' " " ' ' ~ - - - - - -''_      /                  
    .  <# -.  - - -/' . ' \  __                          '~ - \                   
     .. -           ~-.._ / |__|  ( )  ( )  ( )  0  o    _ _    ~ .               
   .-'                                               .- ~    '-.    -.            
  <                      . ~ ' ' .             . - ~             ~ -.__~_. _ _    
    ~- .       N121PP  .          . . . . ,- ~                                    
          ' ~ - - - - =. - <#> -  .         \.._                                  
                      .     ~      ____ _ .. ..  .- .                             
                       .         '        ~ -.        ~ -.                        
                         ' . . '               ~ - .       ~-.                    
                                                     ~ - .      ~ .               
                                                            ~ -...0..~. ____      
"#; // end of TWINENGINE

pub const PLANE: &str = r"
   ____       _  '
| __\_\_o____/_| '
<[___\_\_-----<  '
|  o'            '
                 '
                 '

   ____       _  '
/ __\_\_o____/_| '
<[___\_\_-----<  '
\  o'            '
                 '
                 '

   ____       _  '
| __\_\_o____/_| '
<[___\_\_-----<  '
|  o'            '
                 '
                 '

   ____       _  '
\ __\_\_o____/_| '
<[___\_\_-----<  '
/  o'            '
                 '
                 '
"; // end of PLANE

pub const MOTORCYCLE: &str = r#"
                        _
                       ,S/  .e.##ee
                     ,SS/_ /#####""
                   ,SSSSSS`|##|
                 ,'|SSSSSS/%##|
                 | ;SSSSS/%%%/ .-""-._                           __..ooo._.sSSSSSSSSS"7.
                 |/SSSSS/%%%/.'       `._ __               _.od888888888888"'  '"SSSSS"
             ___  `"SSS/%%%/"-.,sSSs._   8888o._    __.o888888888""SS""    `-._    `7Sb
      _.sssSSSSSSSSSSS/`%%/ ,sSSSSSSSSS-.888888888888888888888"'.S"         ,SSS""   `7b
   ,+""       ```""SS/%%./,sSSSSSSSS".   `"888888888888888"'.sSS"         ,SS"'        `S.
                    /%%%/sSSSSSSSS"   `s.   `"88888888"'.sSSSS"         ,S"'             7
                   /%%%/ `SSSSSSS$$,..sSS`-.   `"88'.sSSSSSSSS._     ,-'
                  /%%%/    `SSSS$$$$SSS",\\\`-.   `"SSSSSS"  8"""7.-'
                  /`%/      `SS$$$SSS,dP,s.\\//`-.   `SS" ,'`8       ,ee888888ee.
        ,oo8888oo/ /         `"""",d88Pd8888./,-'/`.  `,-._`d'    ,d88888888888888b.
     ,d888888888/ /8b.          d8888Pd8888888bd88b`.  :_._`8   ,888888"'    '""88888.
   ,888P'      / /"888b.       d88888`8888888Pd8888 :  :_`-.( ,d8888.__           7888b.
  d88P        / /   `788b     (88888:. `8888Pd88888 ;  ; `-._ 8888P_Z_.>-""--.._   `8888
 d88'     ,--/ /      `88b     `88888b`. `8P 78888";  ;      `"*88_,"   s88s.       `888b
d88'    ,',$/ /$$$$.   `88b      `8888b `. `"'88"_/_,'`-._         `-.d8"88"8P.      `888.
888    ; ,$$$$$$$$$'    888        `"8'   `---------------`-.._      8888888888       888'
888    : `$$$$$$$':     888                                 '888b`-._8s888888"P      .888'
788.   `  `$$$$'  ;     88P                                  8888.   "8878888P'      d888
 88b    `.  `"' ,'     d88'                                  '888b     '88s8"'     .d888'
 `88b.    `-..-'      d88'                                    '888b.             .dd888'
   788b.            ,888'                                       7888b._       _.d8888P
    `7888oo..__..oo888'                                          `"8888888888888888"'
      `"7888888888P"'                                               `"788 mGk 8P"'
"#; // end of MOTORCYCLE

pub const JACK: &str = r"
 \ 0 /   '
  \|/    '
   |     '
  / \    '
_/   \_  '

         '
 __0__   '
/  |  \  '
  / \    '
 _\ /_   '

         '
   o     '
 /\ /\   '
 |/ \|   '
 _\ /_   '

         '
 __0__   '
/  |  \  '
  / \    '
 _\ /_   '

"; // end of JACK

pub const COALCAR: &str = r"
    _________________         
   _|                \_____A  
 =|                        |  
 -|                        |  
__|________________________|_ 
|__________________________|_ 
   |_D__D__D_|  |_D__D__D_|   
    \_/   \_/    \_/   \_/ 
"; // end of COALCAR

pub const FERRIS: &str = r"
       _~^~^~_     '
  \)  /  o o  \  (/'
    \'_   -   _'/  '
     | '-----' |   '
"; // end of FERRIS

Return back to the "Use ncurses to Draw the Images" Page