wyrd-1.4.6/0000755000175000017500000000000012103356102011164 5ustar paulpaulwyrd-1.4.6/locale_wrap.c0000644000175000017500000000243112103356067013632 0ustar paulpaul/* Wyrd -- a curses-based front-end for Remind * Copyright (C) 2005, 2006, 2007 Paul Pelzl * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, Version 2, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Please send bug reports, patches, etc. to Paul Pelzl at * . */ /* OCaml binding for setlocale(), which is required to kick ncurses * into rendering non-ASCII chars. */ #include #include #include #include #include value ml_setlocale(value category, value setting) { CAMLparam2(category, setting); CAMLlocal1(result); result = caml_copy_string(setlocale(Int_val(category), String_val(setting))); CAMLreturn(result); } wyrd-1.4.6/rcfile.ml0000644000175000017500000007462112103356067013006 0ustar paulpaul(* Wyrd -- a curses-based front-end for Remind * Copyright (C) 2005, 2006, 2007, 2008, 2010, 2011-2013 Paul Pelzl * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, Version 2, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Bug reports can be entered at http://bugs.launchpad.net/wyrd . * For anything else, feel free to contact Paul Pelzl at . *) (* rcfile.ml * This file includes everything associated with processing the wyrdrc file. * In particular, this includes a number of hashtables used to store the * bindings of curses keypresses to calendar operations. * Adapted from rcfile code in Orpie, a curses RPN calculator. *) open Genlex open Curses module PairSet = Set.Make ( struct type t = int * int let compare = Pervasives.compare end ) exception Config_failure of string let config_failwith s = raise (Config_failure s) type command_t = | ScrollUp | ScrollDown | NextDay | PrevDay | NextWeek | PrevWeek | NextMonth | PrevMonth | Home | Zoom | Edit | EditAny | NewTimed | NewUntimed | NewTimedDialog | NewUntimedDialog | SwitchWindow | SearchNext | BeginSearch | Quit | ViewReminders | ScrollDescUp | ScrollDescDown | Refresh | ViewAllReminders | ViewWeek | ViewMonth | NextReminder | ViewKeybindings | CopyReminder | PasteReminder | PasteReminderDialog | CutReminder | Goto | QuickEvent | NewGenReminder of int | NewGenReminderDialog of int type entry_operation_t = | EntryComplete | EntryBackspace | EntryExit type operation_t = CommandOp of command_t | EntryOp of entry_operation_t type colorable_object_t = | Help | Timed_default | Timed_current | Untimed_reminder | Timed_date | Selection_info | Description | Status | Calendar_labels | Calendar_level1 | Calendar_level2 | Calendar_level3 | Calendar_today | Left_divider | Right_divider | Timed_reminder1 | Timed_reminder2 | Timed_reminder3 | Timed_reminder4 (* These hashtables store conversions between curses keys and the operations * they are associated with. *) let table_key_command = Hashtbl.create 20 let table_command_key = Hashtbl.create 20 let table_key_entry = Hashtbl.create 20 let table_entry_key = Hashtbl.create 20 let table_commandstr_command = Hashtbl.create 30 let table_command_commandstr = Hashtbl.create 30 (* Default Remind command *) let remind_command = ref "remind" (* Default reminders file *) let reminders_file = ref "$HOME/.reminders" (* Default editing command strings *) let edit_old_command = ref "vim +%n %f" let edit_new_command = ref "vim -c '$' %f" let edit_any_command = ref "vim %f" (* Default new reminder templates *) let timed_template = ref "REM %M %d %y AT %h:%m DURATION 1:00 MSG " let untimed_template = ref "REM %M %d %y MSG " let template0 = ref None let template1 = ref None let template2 = ref None let template3 = ref None let template4 = ref None let template5 = ref None let template6 = ref None let template7 = ref None let template8 = ref None let template9 = ref None (* algorithm to use for counting busy-ness *) let busy_algorithm = ref 1 (* number of minutes to assume an untimed reminder requires *) let untimed_duration = ref 60. (* Default thresholds for calendar colorization *) let busy_level1 = ref 2 let busy_level2 = ref 4 let busy_level3 = ref 6 let busy_level4 = ref 8 (* First day of the week? *) let week_starts_monday = ref false (* 12/24 hour time selection *) let schedule_12_hour = ref false let selection_12_hour = ref true let status_12_hour = ref true let description_12_hour = ref true (* Center the schedule on the cursor? *) let center_cursor = ref false (* "jump to" date syntax is big-endian? *) let goto_big_endian = ref true (* "quick add" date syntax uses US conventions? *) let quick_date_US = ref true (* print week numbers? *) let number_weeks = ref false (* home is "sticky"? *) let home_sticky = ref true (* width of calendar/untimed reminder windows *) let untimed_window_width = ref 40 (* trigger advance warning of reminders? *) let advance_warning = ref false (* render untimed reminders in bold? *) let untimed_bold = ref true (* List of included rc files *) let included_rcfiles : (string list) ref = ref [] (* Temporary hash tables for sorting out the color palette *) let color_table = Hashtbl.create 20 let inverse_color_table = Hashtbl.create 20 (* Final hash table that maps from object to color_pair index *) let object_palette = Hashtbl.create 20 (* Turn colors on and off *) let color_on win obj = try let color_index = Hashtbl.find object_palette obj in wattron win (A.color_pair color_index) with Not_found -> () let color_off win obj = try let color_index = Hashtbl.find object_palette obj in wattroff win (A.color_pair color_index) with Not_found -> () let command_of_key key = Hashtbl.find table_key_command key let key_of_command command = Hashtbl.find table_command_key command let entry_of_key key = Hashtbl.find table_key_entry key let key_of_entry entry = Hashtbl.find table_entry_key entry let decode_single_key_string key_string = let decode_alias str = match str with |"" -> 27 |"" -> 9 |"" -> Key.enter |"" -> 10 |"" -> Key.ic |"" -> Key.dc |"" -> Key.home |"" -> Key.end_ |"" -> Key.ppage |"" -> Key.npage |"" -> 32 |"" -> Key.backspace |"" -> Key.left |"" -> Key.right |"" -> Key.up |"" -> Key.down |"" -> (Key.f 1) |"" -> (Key.f 2) |"" -> (Key.f 3) |"" -> (Key.f 4) |"" -> (Key.f 5) |"" -> (Key.f 6) |"" -> (Key.f 7) |"" -> (Key.f 8) |"" -> (Key.f 9) |"" -> (Key.f 10) |"" -> (Key.f 11) |"" -> (Key.f 12) |_ -> if String.length key_string = 1 then int_of_char str.[0] else config_failwith ("Unrecognized key \"" ^ str ^ "\"") in (* This regexp is used to extract the ctrl and meta characters from a string * representing a keypress. * It matches \\M\\C or \\C\\M or \\C or \\M (or no such characters) followed * by an arbitrary string. *) (* Note: is there a way to use raw strings here? Getting tired of those * backslashes...*) let cm_re = Str.regexp "^\\(\\(\\\\M\\\\C\\|\\\\C\\\\M\\)\\|\\(\\\\M\\)\\|\\(\\\\C\\)\\)?\\(<.+>\\|.\\)" in if Str.string_match cm_re key_string 0 then let has_meta_ctrl = try let _ = Str.matched_group 2 key_string in true with Not_found -> false and has_meta = try let _ = Str.matched_group 3 key_string in true with Not_found -> false and has_ctrl = try let _ = Str.matched_group 4 key_string in true with Not_found -> false and main_key = Str.matched_group 5 key_string in if has_meta_ctrl then if String.length main_key = 1 then let uc_main_key = String.uppercase main_key in let mc_chtype = ((int_of_char uc_main_key.[0]) + 64) in let mc_str = "M-C-" ^ uc_main_key in (mc_chtype, mc_str) else config_failwith ("Cannot apply \\\\M\\\\C to key \"" ^ main_key ^ "\";\n" ^ "octal notation might let you accomplish this.") else if has_meta then if String.length main_key = 1 then let m_chtype = ((int_of_char main_key.[0]) + 128) in let m_str = "M-" ^ main_key in (m_chtype, m_str) else config_failwith ("Cannot apply \\\\M to key \"" ^ main_key ^ "\";\n" ^ "octal notation might let you accomplish this.") else if has_ctrl then if String.length main_key = 1 then let uc_main_key = String.uppercase main_key in let c_chtype = ((int_of_char uc_main_key.[0]) - 64) in let c_str = "C-" ^ uc_main_key in (c_chtype, c_str) else config_failwith ("Cannot apply \\\\C to key \"" ^ main_key ^ "\";\n" ^ "octal notation might let you accomplish this.") else let octal_regex = Str.regexp "^0o" in try let _ = Str.search_forward octal_regex key_string 0 in ((int_of_string key_string), ("\\" ^ Str.string_after key_string 2)) with _ -> ((decode_alias main_key), main_key) else config_failwith ("Unable to match binding string with standard regular expression.") (* Register a key binding. This adds hash table entries for translation * between curses chtypes and commands (in both directions). *) let register_binding_internal k k_string op = match op with |CommandOp x -> Hashtbl.add table_key_command k x; Hashtbl.add table_command_key x k_string |EntryOp x -> Hashtbl.add table_key_entry k x; Hashtbl.add table_entry_key x k_string (* convenience routine for previous *) let register_binding key_string op = (* given a string that represents a character, find the associated * curses chtype *) let k, string_rep = decode_single_key_string key_string in register_binding_internal k string_rep op (* unregister a binding *) let unregister_binding key_string = let k, _ = decode_single_key_string key_string in begin try let op = Hashtbl.find table_key_command k in Hashtbl.remove table_key_command k; Hashtbl.remove table_command_key op with Not_found -> () end; begin try let op = Hashtbl.find table_key_entry k in Hashtbl.remove table_key_entry k; Hashtbl.remove table_entry_key op with Not_found -> () end let commands_list = [ ("scroll_up" , CommandOp ScrollUp); ("scroll_down" , CommandOp ScrollDown); ("next_day" , CommandOp NextDay); ("previous_day" , CommandOp PrevDay); ("next_week" , CommandOp NextWeek); ("previous_week" , CommandOp PrevWeek); ("next_month" , CommandOp NextMonth); ("previous_month" , CommandOp PrevMonth); ("home" , CommandOp Home); ("goto" , CommandOp Goto); ("zoom" , CommandOp Zoom); ("edit" , CommandOp Edit); ("edit_any" , CommandOp EditAny); ("copy" , CommandOp CopyReminder); ("cut" , CommandOp CutReminder); ("paste" , CommandOp PasteReminder); ("paste_dialog" , CommandOp PasteReminderDialog); ("scroll_description_up" , CommandOp ScrollDescUp); ("scroll_description_down" , CommandOp ScrollDescDown); ("quick_add" , CommandOp QuickEvent); ("new_timed" , CommandOp NewTimed); ("new_timed_dialog" , CommandOp NewTimedDialog); ("new_untimed" , CommandOp NewUntimed); ("new_untimed_dialog" , CommandOp NewUntimedDialog); ("new_template0" , CommandOp (NewGenReminder 0)); ("new_template0_dialog" , CommandOp (NewGenReminderDialog 0)); ("new_template1" , CommandOp (NewGenReminder 1)); ("new_template1_dialog" , CommandOp (NewGenReminderDialog 1)); ("new_template2" , CommandOp (NewGenReminder 2)); ("new_template2_dialog" , CommandOp (NewGenReminderDialog 2)); ("new_template3" , CommandOp (NewGenReminder 3)); ("new_template3_dialog" , CommandOp (NewGenReminderDialog 3)); ("new_template4" , CommandOp (NewGenReminder 4)); ("new_template4_dialog" , CommandOp (NewGenReminderDialog 4)); ("new_template5" , CommandOp (NewGenReminder 5)); ("new_template5_dialog" , CommandOp (NewGenReminderDialog 5)); ("new_template6" , CommandOp (NewGenReminder 6)); ("new_template6_dialog" , CommandOp (NewGenReminderDialog 6)); ("new_template7" , CommandOp (NewGenReminder 7)); ("new_template7_dialog" , CommandOp (NewGenReminderDialog 7)); ("new_template8" , CommandOp (NewGenReminder 8)); ("new_template8_dialog" , CommandOp (NewGenReminderDialog 8)); ("new_template9" , CommandOp (NewGenReminder 9)); ("new_template9_dialog" , CommandOp (NewGenReminderDialog 9)); ("switch_window" , CommandOp SwitchWindow); ("search_next" , CommandOp SearchNext); ("begin_search" , CommandOp BeginSearch); ("next_reminder" , CommandOp NextReminder); ("view_remind" , CommandOp ViewReminders); ("view_remind_all" , CommandOp ViewAllReminders); ("view_week" , CommandOp ViewWeek); ("view_month" , CommandOp ViewMonth); ("refresh" , CommandOp Refresh ); ("help" , CommandOp ViewKeybindings); ("entry_complete" , EntryOp EntryComplete); ("entry_backspace" , EntryOp EntryBackspace); ("entry_cancel" , EntryOp EntryExit); ("quit" , CommandOp Quit) ] in let create_translation ((commandstr, operation) : string * operation_t) = Hashtbl.add table_commandstr_command commandstr operation; Hashtbl.add table_command_commandstr operation commandstr in List.iter create_translation commands_list (* translate a command string to the command type it represents *) let operation_of_string command_str = Hashtbl.find table_commandstr_command command_str (* translate a command to a string representation *) let string_of_operation op = Hashtbl.find table_command_commandstr op (* Parse a line from a configuration file. This operates on a stream * corresponding to a non-empty line from the file. It will match commands * of the form * bind key command * where 'key' is either a quoted string containing a key specifier or an octal * key representation of the form \xxx (unquoted), and multiple_keys is a quoted * string containing a number of keypresses to simulate. *) let parse_line line_stream = (* Convenience function for 'set' keyword *) let parse_set variable_str variable coersion error = begin match line_stream with parser | [< 'Ident "=" >] -> begin match line_stream with parser | [< 'String ss >] -> begin try variable := coersion ss with _ -> config_failwith (error ^ "\"set " ^ variable_str ^ " = \"") end | [< >] -> config_failwith (error ^ "\"set " ^ variable_str ^ " = \"") end | [< >] -> config_failwith ("Expected \"=\" after \"set " ^ variable_str ^ "\"") end in (* Convenience function for 'color' keyword *) let parse_color obj_str obj = let foreground = begin match line_stream with parser | [< 'Ident "black" >] -> Color.black | [< 'Ident "red" >] -> Color.red | [< 'Ident "green" >] -> Color.green | [< 'Ident "yellow" >] -> Color.yellow | [< 'Ident "blue" >] -> Color.blue | [< 'Ident "magenta" >] -> Color.magenta | [< 'Ident "cyan" >] -> Color.cyan | [< 'Ident "white" >] -> Color.white | [< 'Ident "default" >] -> ~- 1 | [< >] -> config_failwith ("Expected a foreground color after \"set " ^ obj_str) end in let background = begin match line_stream with parser | [< 'Ident "black" >] -> Color.black | [< 'Ident "red" >] -> Color.red | [< 'Ident "green" >] -> Color.green | [< 'Ident "yellow" >] -> Color.yellow | [< 'Ident "blue" >] -> Color.blue | [< 'Ident "magenta" >] -> Color.magenta | [< 'Ident "cyan" >] -> Color.cyan | [< 'Ident "white" >] -> Color.white | [< 'Ident "default" >] -> ~- 1 | [< >] -> config_failwith ("Expected a background color after \"set " ^ obj_str) end in Hashtbl.replace color_table obj (foreground, background) in (* Parsing begins here *) match line_stream with parser | [< 'Kwd "include" >] -> begin match line_stream with parser | [< 'String include_file >] -> included_rcfiles := include_file :: !included_rcfiles | [< >] -> config_failwith ("Expected a filename string after \"include\"") end | [< 'Kwd "bind" >] -> let bind_key key = begin match line_stream with parser | [< 'Ident command_str >] -> begin try let command = operation_of_string command_str in register_binding key command with Not_found -> config_failwith ("Unrecognized command name \"" ^ command_str ^ "\"") end | [< >] -> config_failwith ("Expected a command name after \"bind \"" ^ key ^ "\"") end in begin match line_stream with parser | [< 'String k >] -> bind_key k | [< 'Ident "\\" >] -> begin match line_stream with parser | [< 'Int octal_int >] -> begin try let octal_digits = "0o" ^ (string_of_int octal_int) in bind_key octal_digits with (Failure "int_of_string") -> config_failwith "Expected octal digits after \"\\\"" end | [< >] -> config_failwith "Expected octal digits after \"\\\"" end | [< >] -> config_failwith "Expected a key string after keyword \"bind\"" end | [< 'Kwd "unbind" >] -> begin match line_stream with parser | [< 'String k >] -> unregister_binding k | [< >] -> config_failwith ("Expected a key string after keyword \"unbind\"") end | [< 'Kwd "set" >] -> begin match line_stream with parser | [< 'Ident "remind_command" >] -> parse_set "remind_command" remind_command (fun x -> x) "Expected a command string after " | [< 'Ident "reminders_file" >] -> parse_set "reminders_file" reminders_file (fun x -> x) "Expected a filename string after " | [< 'Ident "edit_old_command" >] -> parse_set "edit_old_command" edit_old_command (fun x -> x) "Expected a command string after " | [< 'Ident "edit_new_command" >] -> parse_set "edit_new_command" edit_new_command (fun x -> x) "Expected a command string after " | [< 'Ident "edit_any_command" >] -> parse_set "edit_any_command" edit_any_command (fun x -> x) "Expected a command string after " | [< 'Ident "timed_template" >] -> parse_set "timed_template" timed_template (fun x -> x) "Expected a template string after " | [< 'Ident "untimed_template" >] -> parse_set "untimed_template" untimed_template (fun x -> x) "Expected a template string after " | [< 'Ident "template0" >] -> parse_set "template0" template0 (fun x -> Some x) "Expected a template string after " | [< 'Ident "template1" >] -> parse_set "template1" template1 (fun x -> Some x) "Expected a template string after " | [< 'Ident "template2" >] -> parse_set "template2" template2 (fun x -> Some x) "Expected a template string after " | [< 'Ident "template3" >] -> parse_set "template3" template3 (fun x -> Some x) "Expected a template string after " | [< 'Ident "template4" >] -> parse_set "template4" template4 (fun x -> Some x) "Expected a template string after " | [< 'Ident "template5" >] -> parse_set "template5" template5 (fun x -> Some x) "Expected a template string after " | [< 'Ident "template6" >] -> parse_set "template6" template6 (fun x -> Some x) "Expected a template string after " | [< 'Ident "template7" >] -> parse_set "template7" template7 (fun x -> Some x) "Expected a template string after " | [< 'Ident "template8" >] -> parse_set "template8" template8 (fun x -> Some x) "Expected a template string after " | [< 'Ident "template9" >] -> parse_set "template9" template9 (fun x -> Some x) "Expected a template string after " | [< 'Ident "busy_algorithm" >] -> parse_set "busy_algorithm" busy_algorithm int_of_string "Expected an integral string after " | [< 'Ident "untimed_duration" >] -> parse_set "untimed_duration" untimed_duration float_of_string "Expected a float string after " | [< 'Ident "busy_level1" >] -> parse_set "busy_level1" busy_level1 int_of_string "Expected an integral string after " | [< 'Ident "busy_level2" >] -> parse_set "busy_level2" busy_level2 int_of_string "Expected an integral string after " | [< 'Ident "busy_level3" >] -> parse_set "busy_level3" busy_level3 int_of_string "Expected an integral string after " | [< 'Ident "busy_level4" >] -> parse_set "busy_level4" busy_level4 int_of_string "Expected an integral string after " | [< 'Ident "week_starts_monday" >] -> parse_set "week_starts_monday" week_starts_monday bool_of_string "Expected a boolean string after " | [< 'Ident "schedule_12_hour" >] -> parse_set "schedule_12_hour" schedule_12_hour bool_of_string "Expected a boolean string after " | [< 'Ident "selection_12_hour" >] -> parse_set "selection_12_hour" selection_12_hour bool_of_string "Expected a boolean string after " | [< 'Ident "status_12_hour" >] -> parse_set "status_12_hour" status_12_hour bool_of_string "Expected a boolean string after " | [< 'Ident "description_12_hour" >] -> parse_set "description_12_hour" description_12_hour bool_of_string "Expected a boolean string after " | [< 'Ident "center_cursor" >] -> parse_set "center_cursor" center_cursor bool_of_string "Expected a boolean string after " | [< 'Ident "goto_big_endian" >] -> parse_set "goto_big_endian" goto_big_endian bool_of_string "Expected a boolean string after " | [< 'Ident "quick_date_US" >] -> parse_set "quick_date_US" quick_date_US bool_of_string "Expected a boolean string after " | [< 'Ident "number_weeks" >] -> parse_set "number_weeks" number_weeks bool_of_string "Expected a boolean string after " | [< 'Ident "home_sticky" >] -> parse_set "home_sticky" home_sticky bool_of_string "Expected a boolean string after " | [< 'Ident "untimed_window_width" >] -> parse_set "untimed_window_width" untimed_window_width int_of_string "Expected an integral string after " | [< 'Ident "advance_warning" >] -> parse_set "advance_warning" advance_warning bool_of_string "Expected a boolean string after " | [< 'Ident "untimed_bold" >] -> parse_set "untimed_bold" untimed_bold bool_of_string "Expected a boolean string after " | [< >] -> config_failwith ("Unmatched variable name after \"set\"") end | [< 'Kwd "color" >] -> begin match line_stream with parser | [< 'Ident "help" >] -> parse_color "help" Help | [< 'Ident "timed_default" >] -> parse_color "timed_default" Timed_default | [< 'Ident "timed_current" >] -> parse_color "timed_current" Timed_current | [< 'Ident "timed_reminder" >] -> config_failwith ("\"timed_reminder\" has been deprecated. Please use \"timed_reminder1\".") | [< 'Ident "untimed_reminder" >] -> parse_color "untimed_reminder" Untimed_reminder | [< 'Ident "timed_date" >] -> parse_color "timed_date" Timed_date | [< 'Ident "selection_info" >] -> parse_color "selection_info" Selection_info | [< 'Ident "description" >] -> parse_color "description" Description | [< 'Ident "status" >] -> parse_color "status" Status | [< 'Ident "calendar_labels" >] -> parse_color "calendar_labels" Calendar_labels | [< 'Ident "calendar_level1" >] -> parse_color "calendar_level1" Calendar_level1 | [< 'Ident "calendar_level2" >] -> parse_color "calendar_level2" Calendar_level2 | [< 'Ident "calendar_level3" >] -> parse_color "calendar_level3" Calendar_level3 | [< 'Ident "calendar_selection" >] -> begin Printf.fprintf stderr "Warning: colorable object \"calendar_selection\" has been "; Printf.fprintf stderr "deprecated.\nPlease remove this reference from the wyrdrc file.\n" end | [< 'Ident "calendar_today" >] -> parse_color "calendar_today" Calendar_today | [< 'Ident "left_divider" >] -> parse_color "left_divider" Left_divider | [< 'Ident "right_divider" >] -> parse_color "right_divider" Right_divider | [< 'Ident "timed_reminder1" >] -> parse_color "timed_reminder1" Timed_reminder1 | [< 'Ident "timed_reminder2" >] -> parse_color "timed_reminder2" Timed_reminder2 | [< 'Ident "timed_reminder3" >] -> parse_color "timed_reminder3" Timed_reminder3 | [< 'Ident "timed_reminder4" >] -> parse_color "timed_reminder4" Timed_reminder4 end | [< 'Kwd "#" >] -> () | [< >] -> config_failwith "Expected a keyword at start of line";; (* try opening the rc file, first looking at $HOME/.wyrdrc, * then looking at $PREFIX/etc/wyrdrc *) let open_rcfile rcfile_op = match rcfile_op with |None -> let home_rcfile = let homedir = Sys.getenv "HOME" in homedir ^ "/.wyrdrc" in let rcfile_fullpath = (* expand out any occurrences of ${prefix} that autoconf * decides to insert *) let prefix_regex = Str.regexp "\\${prefix}" in let expanded_sysconfdir = Str.global_replace prefix_regex Install.prefix Install.sysconfdir in Utility.join_path expanded_sysconfdir "wyrdrc" in begin try (open_in home_rcfile, home_rcfile) with Sys_error error_str -> begin try (open_in rcfile_fullpath, rcfile_fullpath) with Sys_error error_str -> failwith ("Could not open configuration file \"" ^ home_rcfile ^ "\" or \"" ^ rcfile_fullpath ^ "\" .") end end |Some file -> try (Utility.expand_open_in_ascii file, file) with Sys_error error_str -> config_failwith ("Could not open configuration file \"" ^ file ^ "\".") (* validate the color table to make sure that the number of defined colors is legal *) let validate_colors () = (* form a Set of all color pairs, and an inverse mapping from color pair to objects *) let initial_palette = let process_entry key pair colors = Hashtbl.add inverse_color_table pair key; PairSet.add pair colors in Hashtbl.fold process_entry color_table PairSet.empty in (* start killing off color pairs as necessary to fit within color_pairs limit *) let rec reduce_colors palette = if PairSet.cardinal palette > pred (color_pairs ()) then begin (* find and remove the color pair with fewest objects assigned *) let min_objects = ref 100000 and best_pair = ref (-1, -1) in let find_best pair = let obj_list = Hashtbl.find_all inverse_color_table pair in if List.length obj_list < !min_objects then begin min_objects := List.length obj_list; best_pair := pair end else () in PairSet.iter find_best palette; (* the color pair needs to be removed from two hashtables and the palette set *) let obj_list = Hashtbl.find_all inverse_color_table !best_pair in List.iter (Hashtbl.remove color_table) obj_list; Hashtbl.remove inverse_color_table !best_pair; reduce_colors (PairSet.remove !best_pair palette) end else palette in let register_color_pair pair n = assert (init_pair n (fst pair) (snd pair)); let f obj = Hashtbl.add object_palette obj n in List.iter f (Hashtbl.find_all inverse_color_table pair); succ n in let _ = PairSet.fold register_color_pair (reduce_colors initial_palette) 1 in () let rec process_rcfile rcfile_op = let line_lexer line = make_lexer ["include"; "bind"; "unbind"; "set"; "color"; "#"] (Stream.of_string line) in let empty_regexp = Str.regexp "^[\t ]*$" in let config_stream, rcfile_filename = open_rcfile rcfile_op in let line_num = ref 0 in try while true do line_num := succ !line_num; let line_string = input_line config_stream in (* Printf.fprintf stderr "read line %2d: %s\n" !line_num line_string; flush stderr; *) if Str.string_match empty_regexp line_string 0 then (* do nothing on an empty line *) () else try let line_stream = line_lexer line_string in parse_line line_stream; (* process any included rcfiles as they are encountered *) begin match !included_rcfiles with |[] -> () |head :: tail -> included_rcfiles := tail; process_rcfile (Some head) end with |Config_failure s -> (let error_str = Printf.sprintf "Syntax error on line %d of \"%s\": %s" !line_num rcfile_filename s in failwith error_str) |Stream.Failure -> failwith (Printf.sprintf "Syntax error on line %d of \"%s\"" !line_num rcfile_filename) done with End_of_file -> begin close_in config_stream end (* arch-tag: DO_NOT_CHANGE_614115ed-7d1d-4834-bda4-e6cf93ac3fcd *) wyrd-1.4.6/depend0000644000175000017500000000231112103356067012355 0ustar paulpaulcal.cmo: utility.cmo cal.cmx: utility.cmx install.cmo: install.cmx: interface.cmo: rcfile.cmo ./curses/curses.cmi interface.cmx: rcfile.cmx ./curses/curses.cmx interface_draw.cmo: utility.cmo remind.cmo rcfile.cmo interface.cmo \ ./curses/curses.cmi cal.cmo interface_draw.cmx: utility.cmx remind.cmx rcfile.cmx interface.cmx \ ./curses/curses.cmx cal.cmx interface_main.cmo: utility.cmo time_lang.cmo remind.cmo rcfile.cmo \ interface_draw.cmo interface.cmo ./curses/curses.cmi interface_main.cmx: utility.cmx time_lang.cmx remind.cmx rcfile.cmx \ interface_draw.cmx interface.cmx ./curses/curses.cmx locale.cmo: locale.cmi locale.cmx: locale.cmi main.cmo: time_lang.cmo rcfile.cmo locale.cmi interface_main.cmo \ interface.cmo ./curses/curses.cmi main.cmx: time_lang.cmx rcfile.cmx locale.cmx interface_main.cmx \ interface.cmx ./curses/curses.cmx rcfile.cmo: utility.cmo install.cmo ./curses/curses.cmi rcfile.cmx: utility.cmx install.cmx ./curses/curses.cmx remind.cmo: utility.cmo rcfile.cmo cal.cmo remind.cmx: utility.cmx rcfile.cmx cal.cmx time_lang.cmo: rcfile.cmo time_lang.cmx: rcfile.cmx utility.cmo: ./curses/curses.cmi utility.cmx: ./curses/curses.cmx locale.cmi: wyrd-1.4.6/cal.ml0000644000175000017500000001117412103356067012273 0ustar paulpaul(* Wyrd -- a curses-based front-end for Remind * Copyright (C) 2005, 2006, 2007, 2008, 2010, 2011-2013 Paul Pelzl * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, Version 2, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Bug reports can be entered at http://bugs.launchpad.net/wyrd . * For anything else, feel free to contact Paul Pelzl at . *) (* cal.ml * Because cal(1) cannot be relied upon to be uniform across various operating * systems (sigh), it seemed best to provide a generic calendar layout * algorithm. *) open Utility type t = { title : string; weekdays : string; days : string list; weeknums : string list } (* compute the ISO-8601 week number for the given day *) let weeknum_of_tm day = let (_, normalized_day) = Unix.mktime day in (* iso weeks start on Monday *) let iso_wday = (normalized_day.Unix.tm_wday + 6) mod 7 in (* find Thursday of the same week *) let thurs = {normalized_day with Unix.tm_mday = normalized_day.Unix.tm_mday + 3 - iso_wday } in let (_, normalized_thurs) = Unix.mktime thurs in (* which Thursday of the year is it? *) (normalized_thurs.Unix.tm_yday / 7) + 1 (* Create a Cal.t data structure for the desired timestamp. If * start_monday = true then the first day of the week will be * Monday. *) let make timestamp start_monday = let tm = Unix.localtime timestamp in (* compute the weekday of the first day of the month *) let first_weekday = let temp = {tm with Unix.tm_mday = 1} in let (_, first) = Unix.mktime temp in first.Unix.tm_wday in (* compute the last day of the month *) let last_day = let temp = {tm with Unix.tm_mday = 32} in let (_, nextmonth) = Unix.mktime temp in 32 - nextmonth.Unix.tm_mday in (* generate the title *) let year_s = string_of_int (tm.Unix.tm_year + 1900) in let mon_year = (full_string_of_tm_mon tm.Unix.tm_mon) ^ " " ^ year_s in let pad_len = (20 - (String.length mon_year)) / 2 in let cal_title = (String.make pad_len ' ') ^ mon_year in (* generate the weekday strings *) let rec build_weekdays wkd_str wd_num count = if count > 7 then wkd_str else build_weekdays (wkd_str ^ " " ^ (short_string_of_tm_wday wd_num)) ((succ wd_num) mod 7) (succ count) in let week_start_day = if start_monday then 1 else 0 in let cal_weekdays = build_weekdays (short_string_of_tm_wday week_start_day) ((succ week_start_day) mod 7) 2 in (* generate the days of the month *) let rec build_monthdays weeks_list week_str weeknum_list mday wday = if mday > last_day then let weeknum_str = let last_weekday = {tm with Unix.tm_mday = pred mday} in let weeknum = weeknum_of_tm last_weekday in Printf.sprintf "%2d" weeknum in (List.rev (week_str :: weeks_list), List.rev (weeknum_str :: weeknum_list)) else if wday = week_start_day then let weeknum_str = let last_weekday = {tm with Unix.tm_mday = pred mday} in let weeknum = weeknum_of_tm last_weekday in Printf.sprintf "%2d" weeknum in build_monthdays (week_str :: weeks_list) (Printf.sprintf "%2d" mday) (weeknum_str :: weeknum_list) (succ mday) ((succ wday) mod 7) else build_monthdays weeks_list (week_str ^ (Printf.sprintf " %2d" mday)) weeknum_list (succ mday) ((succ wday) mod 7) in (* create the padding for the first few empty days of the calendar *) let padding = if first_weekday >= week_start_day then String.make ((first_weekday - week_start_day) * 3) ' ' else String.make ((first_weekday + 7 - week_start_day) * 3) ' ' in let (cal_monthdays, cal_weeknums) = build_monthdays [] (padding ^ " 1") [] 2 ((succ first_weekday) mod 7) in { title = cal_title; weekdays = cal_weekdays; days = cal_monthdays; weeknums = cal_weeknums } (* arch-tag: DO_NOT_CHANGE_4909df7f-9801-448d-9030-fb4b0232408d *) wyrd-1.4.6/curses/0000755000175000017500000000000012103356101012467 5ustar paulpaulwyrd-1.4.6/curses/OCamlMakefile0000644000175000017500000007726512103356100015063 0ustar paulpaul########################################################################### # OCamlMakefile # Copyright (C) 1999-2007 Markus Mottl # # For updates see: # http://www.ocaml.info/home/ocaml_sources.html # ########################################################################### # Modified by damien for .glade.ml compilation # Set these variables to the names of the sources to be processed and # the result variable. Order matters during linkage! ifndef SOURCES SOURCES := foo.ml endif export SOURCES ifndef RES_CLIB_SUF RES_CLIB_SUF := _stubs endif export RES_CLIB_SUF ifndef RESULT RESULT := foo endif export RESULT := $(strip $(RESULT)) export LIB_PACK_NAME ifndef DOC_FILES DOC_FILES := $(filter %.mli, $(SOURCES)) endif export DOC_FILES FIRST_DOC_FILE := $(firstword $(DOC_FILES)) export BCSUFFIX export NCSUFFIX ifndef TOPSUFFIX TOPSUFFIX := .top endif export TOPSUFFIX # Eventually set include- and library-paths, libraries to link, # additional compilation-, link- and ocamlyacc-flags # Path- and library information needs not be written with "-I" and such... # Define THREADS if you need it, otherwise leave it unset (same for # USE_CAMLP4)! export THREADS export VMTHREADS export ANNOTATE export USE_CAMLP4 export INCDIRS export LIBDIRS export EXTLIBDIRS export RESULTDEPS export OCAML_DEFAULT_DIRS export LIBS export CLIBS export CFRAMEWORKS export OCAMLFLAGS export OCAMLNCFLAGS export OCAMLBCFLAGS export OCAMLLDFLAGS export OCAMLNLDFLAGS export OCAMLBLDFLAGS export OCAMLMKLIB_FLAGS ifndef OCAMLCPFLAGS OCAMLCPFLAGS := a endif export OCAMLCPFLAGS ifndef DOC_DIR DOC_DIR := doc endif export DOC_DIR export PPFLAGS export LFLAGS export YFLAGS export IDLFLAGS export OCAMLDOCFLAGS export OCAMLFIND_INSTFLAGS export DVIPSFLAGS export STATIC # Add a list of optional trash files that should be deleted by "make clean" export TRASH ECHO := echo ifdef REALLY_QUIET export REALLY_QUIET ECHO := true LFLAGS := $(LFLAGS) -q YFLAGS := $(YFLAGS) -q endif #################### variables depending on your OCaml-installation ifdef MINGW export MINGW WIN32 := 1 CFLAGS_WIN32 := -mno-cygwin endif ifdef MSVC export MSVC WIN32 := 1 ifndef STATIC CPPFLAGS_WIN32 := -DCAML_DLL endif CFLAGS_WIN32 += -nologo EXT_OBJ := obj EXT_LIB := lib ifeq ($(CC),gcc) # work around GNU Make default value ifdef THREADS CC := cl -MT else CC := cl endif endif ifeq ($(CXX),g++) # work around GNU Make default value CXX := $(CC) endif CFLAG_O := -Fo endif ifdef WIN32 EXT_CXX := cpp EXE := .exe endif ifndef EXT_OBJ EXT_OBJ := o endif ifndef EXT_LIB EXT_LIB := a endif ifndef EXT_CXX EXT_CXX := cc endif ifndef EXE EXE := # empty endif ifndef CFLAG_O CFLAG_O := -o # do not delete this comment (preserves trailing whitespace)! endif export CC export CXX export CFLAGS export CXXFLAGS export LDFLAGS export CPPFLAGS ifndef RPATH_FLAG ifdef ELF_RPATH_FLAG RPATH_FLAG := $(ELF_RPATH_FLAG) else RPATH_FLAG := -R endif endif export RPATH_FLAG ifndef MSVC ifndef PIC_CFLAGS PIC_CFLAGS := -fPIC endif ifndef PIC_CPPFLAGS PIC_CPPFLAGS := -DPIC endif endif export PIC_CFLAGS export PIC_CPPFLAGS BCRESULT := $(addsuffix $(BCSUFFIX), $(RESULT)) NCRESULT := $(addsuffix $(NCSUFFIX), $(RESULT)) TOPRESULT := $(addsuffix $(TOPSUFFIX), $(RESULT)) ifndef OCAMLFIND OCAMLFIND := ocamlfind endif export OCAMLFIND ifndef OCAMLC OCAMLC := ocamlc endif export OCAMLC ifndef OCAMLOPT OCAMLOPT := ocamlopt endif export OCAMLOPT ifndef OCAMLMKTOP OCAMLMKTOP := ocamlmktop endif export OCAMLMKTOP ifndef OCAMLCP OCAMLCP := ocamlcp endif export OCAMLCP ifndef OCAMLDEP OCAMLDEP := ocamldep endif export OCAMLDEP ifndef OCAMLLEX OCAMLLEX := ocamllex endif export OCAMLLEX ifndef OCAMLYACC OCAMLYACC := ocamlyacc endif export OCAMLYACC ifndef OCAMLMKLIB OCAMLMKLIB := ocamlmklib endif export OCAMLMKLIB ifndef OCAML_GLADECC OCAML_GLADECC := lablgladecc2 endif export OCAML_GLADECC ifndef OCAML_GLADECC_FLAGS OCAML_GLADECC_FLAGS := endif export OCAML_GLADECC_FLAGS ifndef CAMELEON_REPORT CAMELEON_REPORT := report endif export CAMELEON_REPORT ifndef CAMELEON_REPORT_FLAGS CAMELEON_REPORT_FLAGS := endif export CAMELEON_REPORT_FLAGS ifndef CAMELEON_ZOGGY CAMELEON_ZOGGY := camlp4o pa_zog.cma pr_o.cmo endif export CAMELEON_ZOGGY ifndef CAMELEON_ZOGGY_FLAGS CAMELEON_ZOGGY_FLAGS := endif export CAMELEON_ZOGGY_FLAGS ifndef OXRIDL OXRIDL := oxridl endif export OXRIDL ifndef CAMLIDL CAMLIDL := camlidl endif export CAMLIDL ifndef CAMLIDLDLL CAMLIDLDLL := camlidldll endif export CAMLIDLDLL ifndef NOIDLHEADER MAYBE_IDL_HEADER := -header endif export NOIDLHEADER export NO_CUSTOM ifndef CAMLP4 CAMLP4 := camlp4 endif export CAMLP4 ifndef REAL_OCAMLFIND ifdef PACKS ifndef CREATE_LIB ifdef THREADS PACKS += threads endif endif empty := space := $(empty) $(empty) comma := , ifdef PREDS PRE_OCAML_FIND_PREDICATES := $(subst $(space),$(comma),$(PREDS)) PRE_OCAML_FIND_PACKAGES := $(subst $(space),$(comma),$(PACKS)) OCAML_FIND_PREDICATES := -predicates $(PRE_OCAML_FIND_PREDICATES) # OCAML_DEP_PREDICATES := -syntax $(PRE_OCAML_FIND_PREDICATES) OCAML_FIND_PACKAGES := $(OCAML_FIND_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES) OCAML_DEP_PACKAGES := $(OCAML_DEP_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES) else OCAML_FIND_PACKAGES := -package $(subst $(space),$(comma),$(PACKS)) OCAML_DEP_PACKAGES := endif OCAML_FIND_LINKPKG := -linkpkg REAL_OCAMLFIND := $(OCAMLFIND) endif endif export OCAML_FIND_PACKAGES export OCAML_DEP_PACKAGES export OCAML_FIND_LINKPKG export REAL_OCAMLFIND ifndef OCAMLDOC OCAMLDOC := ocamldoc endif export OCAMLDOC ifndef LATEX LATEX := latex endif export LATEX ifndef DVIPS DVIPS := dvips endif export DVIPS ifndef PS2PDF PS2PDF := ps2pdf endif export PS2PDF ifndef OCAMLMAKEFILE OCAMLMAKEFILE := OCamlMakefile endif export OCAMLMAKEFILE ifndef OCAMLLIBPATH OCAMLLIBPATH := \ $(shell $(OCAMLC) 2>/dev/null -where || echo /usr/lib/ocaml) endif export OCAMLLIBPATH ifndef OCAML_LIB_INSTALL OCAML_LIB_INSTALL := $(OCAMLLIBPATH)/contrib endif export OCAML_LIB_INSTALL ########################################################################### #################### change following sections only if #################### you know what you are doing! # delete target files when a build command fails .PHONY: .DELETE_ON_ERROR .DELETE_ON_ERROR: # for pedants using "--warn-undefined-variables" export MAYBE_IDL export REAL_RESULT export CAMLIDLFLAGS export THREAD_FLAG export RES_CLIB export MAKEDLL export ANNOT_FLAG export C_OXRIDL export SUBPROJS export CFLAGS_WIN32 export CPPFLAGS_WIN32 INCFLAGS := SHELL := /bin/sh MLDEPDIR := ._d BCDIDIR := ._bcdi NCDIDIR := ._ncdi FILTER_EXTNS := %.mli %.ml %.mll %.mly %.idl %.oxridl %.c %.m %.$(EXT_CXX) %.rep %.zog %.glade FILTERED := $(filter $(FILTER_EXTNS), $(SOURCES)) SOURCE_DIRS := $(filter-out ./, $(sort $(dir $(FILTERED)))) FILTERED_REP := $(filter %.rep, $(FILTERED)) DEP_REP := $(FILTERED_REP:%.rep=$(MLDEPDIR)/%.d) AUTO_REP := $(FILTERED_REP:.rep=.ml) FILTERED_ZOG := $(filter %.zog, $(FILTERED)) DEP_ZOG := $(FILTERED_ZOG:%.zog=$(MLDEPDIR)/%.d) AUTO_ZOG := $(FILTERED_ZOG:.zog=.ml) FILTERED_GLADE := $(filter %.glade, $(FILTERED)) DEP_GLADE := $(FILTERED_GLADE:%.glade=$(MLDEPDIR)/%.d) AUTO_GLADE := $(FILTERED_GLADE:.glade=.ml) FILTERED_ML := $(filter %.ml, $(FILTERED)) DEP_ML := $(FILTERED_ML:%.ml=$(MLDEPDIR)/%.d) FILTERED_MLI := $(filter %.mli, $(FILTERED)) DEP_MLI := $(FILTERED_MLI:.mli=.di) FILTERED_MLL := $(filter %.mll, $(FILTERED)) DEP_MLL := $(FILTERED_MLL:%.mll=$(MLDEPDIR)/%.d) AUTO_MLL := $(FILTERED_MLL:.mll=.ml) FILTERED_MLY := $(filter %.mly, $(FILTERED)) DEP_MLY := $(FILTERED_MLY:%.mly=$(MLDEPDIR)/%.d) $(FILTERED_MLY:.mly=.di) AUTO_MLY := $(FILTERED_MLY:.mly=.mli) $(FILTERED_MLY:.mly=.ml) FILTERED_IDL := $(filter %.idl, $(FILTERED)) DEP_IDL := $(FILTERED_IDL:%.idl=$(MLDEPDIR)/%.d) $(FILTERED_IDL:.idl=.di) C_IDL := $(FILTERED_IDL:%.idl=%_stubs.c) ifndef NOIDLHEADER C_IDL += $(FILTERED_IDL:.idl=.h) endif OBJ_C_IDL := $(FILTERED_IDL:%.idl=%_stubs.$(EXT_OBJ)) AUTO_IDL := $(FILTERED_IDL:.idl=.mli) $(FILTERED_IDL:.idl=.ml) $(C_IDL) FILTERED_OXRIDL := $(filter %.oxridl, $(FILTERED)) DEP_OXRIDL := $(FILTERED_OXRIDL:%.oxridl=$(MLDEPDIR)/%.d) $(FILTERED_OXRIDL:.oxridl=.di) AUTO_OXRIDL := $(FILTERED_OXRIDL:.oxridl=.mli) $(FILTERED_OXRIDL:.oxridl=.ml) $(C_OXRIDL) FILTERED_C_CXX := $(filter %.c %.m %.$(EXT_CXX), $(FILTERED)) OBJ_C_CXX := $(FILTERED_C_CXX:.c=.$(EXT_OBJ)) OBJ_C_CXX := $(OBJ_C_CXX:.m=.$(EXT_OBJ)) OBJ_C_CXX := $(OBJ_C_CXX:.$(EXT_CXX)=.$(EXT_OBJ)) PRE_TARGETS += $(AUTO_MLL) $(AUTO_MLY) $(AUTO_IDL) $(AUTO_OXRIDL) $(AUTO_ZOG) $(AUTO_REP) $(AUTO_GLADE) ALL_DEPS := $(DEP_ML) $(DEP_MLI) $(DEP_MLL) $(DEP_MLY) $(DEP_IDL) $(DEP_OXRIDL) $(DEP_ZOG) $(DEP_REP) $(DEP_GLADE) MLDEPS := $(filter %.d, $(ALL_DEPS)) MLIDEPS := $(filter %.di, $(ALL_DEPS)) BCDEPIS := $(MLIDEPS:%.di=$(BCDIDIR)/%.di) NCDEPIS := $(MLIDEPS:%.di=$(NCDIDIR)/%.di) ALLML := $(filter %.mli %.ml %.mll %.mly %.idl %.oxridl %.rep %.zog %.glade, $(FILTERED)) IMPLO_INTF := $(ALLML:%.mli=%.mli.__) IMPLO_INTF := $(foreach file, $(IMPLO_INTF), \ $(basename $(file)).cmi $(basename $(file)).cmo) IMPLO_INTF := $(filter-out %.mli.cmo, $(IMPLO_INTF)) IMPLO_INTF := $(IMPLO_INTF:%.mli.cmi=%.cmi) IMPLX_INTF := $(IMPLO_INTF:.cmo=.cmx) INTF := $(filter %.cmi, $(IMPLO_INTF)) IMPL_CMO := $(filter %.cmo, $(IMPLO_INTF)) IMPL_CMX := $(IMPL_CMO:.cmo=.cmx) IMPL_ASM := $(IMPL_CMO:.cmo=.asm) IMPL_S := $(IMPL_CMO:.cmo=.s) OBJ_LINK := $(OBJ_C_IDL) $(OBJ_C_CXX) OBJ_FILES := $(IMPL_CMO:.cmo=.$(EXT_OBJ)) $(OBJ_LINK) EXECS := $(addsuffix $(EXE), \ $(sort $(TOPRESULT) $(BCRESULT) $(NCRESULT))) ifdef WIN32 EXECS += $(BCRESULT).dll $(NCRESULT).dll endif CLIB_BASE := $(RESULT)$(RES_CLIB_SUF) ifneq ($(strip $(OBJ_LINK)),) RES_CLIB := lib$(CLIB_BASE).$(EXT_LIB) endif ifdef WIN32 DLLSONAME := $(CLIB_BASE).dll else DLLSONAME := dll$(CLIB_BASE).so endif NONEXECS := $(INTF) $(IMPL_CMO) $(IMPL_CMX) $(IMPL_ASM) $(IMPL_S) \ $(OBJ_FILES) $(PRE_TARGETS) $(BCRESULT).cma $(NCRESULT).cmxa \ $(NCRESULT).$(EXT_LIB) $(BCRESULT).cmi $(BCRESULT).cmo \ $(NCRESULT).cmi $(NCRESULT).cmx $(NCRESULT).o \ $(RES_CLIB) $(IMPL_CMO:.cmo=.annot) \ $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(LIB_PACK_NAME).cmx $(LIB_PACK_NAME).o ifndef STATIC NONEXECS += $(DLLSONAME) endif ifndef LIBINSTALL_FILES LIBINSTALL_FILES := $(RESULT).mli $(RESULT).cmi $(RESULT).cma \ $(RESULT).cmxa $(RESULT).$(EXT_LIB) $(RES_CLIB) ifndef STATIC ifneq ($(strip $(OBJ_LINK)),) LIBINSTALL_FILES += $(DLLSONAME) endif endif endif export LIBINSTALL_FILES ifdef WIN32 # some extra stuff is created while linking DLLs NONEXECS += $(BCRESULT).$(EXT_LIB) $(BCRESULT).exp $(NCRESULT).exp $(CLIB_BASE).exp $(CLIB_BASE).lib endif TARGETS := $(EXECS) $(NONEXECS) # If there are IDL-files ifneq ($(strip $(FILTERED_IDL)),) MAYBE_IDL := -cclib -lcamlidl endif ifdef USE_CAMLP4 CAMLP4PATH := \ $(shell $(CAMLP4) -where 2>/dev/null || echo /usr/lib/camlp4) INCFLAGS := -I $(CAMLP4PATH) CINCFLAGS := -I$(CAMLP4PATH) endif DINCFLAGS := $(INCFLAGS) $(SOURCE_DIRS:%=-I %) $(OCAML_DEFAULT_DIRS:%=-I %) INCFLAGS := $(DINCFLAGS) $(INCDIRS:%=-I %) CINCFLAGS += $(SOURCE_DIRS:%=-I%) $(INCDIRS:%=-I%) $(OCAML_DEFAULT_DIRS:%=-I%) ifndef MSVC CLIBFLAGS += $(SOURCE_DIRS:%=-L%) $(LIBDIRS:%=-L%) \ $(EXTLIBDIRS:%=-L%) $(OCAML_DEFAULT_DIRS:%=-L%) ifeq ($(ELF_RPATH), yes) CLIBFLAGS += $(EXTLIBDIRS:%=-Wl,$(RPATH_FLAG)%) endif endif ifndef PROFILING INTF_OCAMLC := $(OCAMLC) else ifndef THREADS INTF_OCAMLC := $(OCAMLCP) -p $(OCAMLCPFLAGS) else # OCaml does not support profiling byte code # with threads (yet), therefore we force an error. ifndef REAL_OCAMLC $(error Profiling of multithreaded byte code not yet supported by OCaml) endif INTF_OCAMLC := $(OCAMLC) endif endif ifndef MSVC COMMON_LDFLAGS := $(LDFLAGS:%=-ccopt %) $(SOURCE_DIRS:%=-ccopt -L%) \ $(LIBDIRS:%=-ccopt -L%) $(EXTLIBDIRS:%=-ccopt -L%) \ $(EXTLIBDIRS:%=-ccopt -Wl $(OCAML_DEFAULT_DIRS:%=-ccopt -L%)) ifeq ($(ELF_RPATH),yes) COMMON_LDFLAGS += $(EXTLIBDIRS:%=-ccopt -Wl,$(RPATH_FLAG)%) endif else COMMON_LDFLAGS := -ccopt "/link -NODEFAULTLIB:LIBC $(LDFLAGS:%=%) $(SOURCE_DIRS:%=-LIBPATH:%) \ $(LIBDIRS:%=-LIBPATH:%) $(EXTLIBDIRS:%=-LIBPATH:%) \ $(OCAML_DEFAULT_DIRS:%=-LIBPATH:%) " endif CLIBS_OPTS := $(CLIBS:%=-cclib -l%) $(CFRAMEWORKS:%=-cclib '-framework %') ifdef MSVC ifndef STATIC # MSVC libraries do not have 'lib' prefix CLIBS_OPTS := $(CLIBS:%=-cclib %.lib) endif endif ifneq ($(strip $(OBJ_LINK)),) ifdef CREATE_LIB OBJS_LIBS := -cclib -l$(CLIB_BASE) $(CLIBS_OPTS) $(MAYBE_IDL) else OBJS_LIBS := $(OBJ_LINK) $(CLIBS_OPTS) $(MAYBE_IDL) endif else OBJS_LIBS := $(CLIBS_OPTS) $(MAYBE_IDL) endif # If we have to make byte-code ifndef REAL_OCAMLC BYTE_OCAML := y # EXTRADEPS is added dependencies we have to insert for all # executable files we generate. Ideally it should be all of the # libraries we use, but it's hard to find the ones that get searched on # the path since I don't know the paths built into the compiler, so # just include the ones with slashes in their names. EXTRADEPS := $(addsuffix .cma,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i)))) SPECIAL_OCAMLFLAGS := $(OCAMLBCFLAGS) REAL_OCAMLC := $(INTF_OCAMLC) REAL_IMPL := $(IMPL_CMO) REAL_IMPL_INTF := $(IMPLO_INTF) IMPL_SUF := .cmo DEPFLAGS := MAKE_DEPS := $(MLDEPS) $(BCDEPIS) ifdef CREATE_LIB override CFLAGS := $(PIC_CFLAGS) $(CFLAGS) override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS) ifndef STATIC ifneq ($(strip $(OBJ_LINK)),) MAKEDLL := $(DLLSONAME) ALL_LDFLAGS := -dllib $(DLLSONAME) endif endif endif ifndef NO_CUSTOM ifneq "$(strip $(OBJ_LINK) $(THREADS) $(MAYBE_IDL) $(CLIBS) $(CFRAMEWORKS))" "" ALL_LDFLAGS += -custom endif endif ALL_LDFLAGS += $(INCFLAGS) $(OCAMLLDFLAGS) $(OCAMLBLDFLAGS) \ $(COMMON_LDFLAGS) $(LIBS:%=%.cma) CAMLIDLDLLFLAGS := ifdef THREADS ifdef VMTHREADS THREAD_FLAG := -vmthread else THREAD_FLAG := -thread endif ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS) ifndef CREATE_LIB ifndef REAL_OCAMLFIND ALL_LDFLAGS := unix.cma threads.cma $(ALL_LDFLAGS) endif endif endif # we have to make native-code else EXTRADEPS := $(addsuffix .cmxa,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i)))) ifndef PROFILING SPECIAL_OCAMLFLAGS := $(OCAMLNCFLAGS) PLDFLAGS := else SPECIAL_OCAMLFLAGS := -p $(OCAMLNCFLAGS) PLDFLAGS := -p endif REAL_IMPL := $(IMPL_CMX) REAL_IMPL_INTF := $(IMPLX_INTF) IMPL_SUF := .cmx override CPPFLAGS := -DNATIVE_CODE $(CPPFLAGS) DEPFLAGS := -native MAKE_DEPS := $(MLDEPS) $(NCDEPIS) ALL_LDFLAGS := $(PLDFLAGS) $(INCFLAGS) $(OCAMLLDFLAGS) \ $(OCAMLNLDFLAGS) $(COMMON_LDFLAGS) CAMLIDLDLLFLAGS := -opt ifndef CREATE_LIB ALL_LDFLAGS += $(LIBS:%=%.cmxa) else override CFLAGS := $(PIC_CFLAGS) $(CFLAGS) override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS) endif ifdef THREADS THREAD_FLAG := -thread ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS) ifndef CREATE_LIB ifndef REAL_OCAMLFIND ALL_LDFLAGS := unix.cmxa threads.cmxa $(ALL_LDFLAGS) endif endif endif endif export MAKE_DEPS ifdef ANNOTATE ANNOT_FLAG := -dtypes else endif ALL_OCAMLCFLAGS := $(THREAD_FLAG) $(ANNOT_FLAG) $(OCAMLFLAGS) \ $(INCFLAGS) $(SPECIAL_OCAMLFLAGS) ifdef make_deps -include $(MAKE_DEPS) PRE_TARGETS := endif ########################################################################### # USER RULES # Call "OCamlMakefile QUIET=" to get rid of all of the @'s. QUIET=@ # generates byte-code (default) byte-code: $(PRE_TARGETS) $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \ REAL_RESULT="$(BCRESULT)" make_deps=yes bc: byte-code byte-code-nolink: $(PRE_TARGETS) $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \ REAL_RESULT="$(BCRESULT)" make_deps=yes bcnl: byte-code-nolink top: $(PRE_TARGETS) $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(TOPRESULT) \ REAL_RESULT="$(BCRESULT)" make_deps=yes # generates native-code native-code: $(PRE_TARGETS) $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \ REAL_RESULT="$(NCRESULT)" \ REAL_OCAMLC="$(OCAMLOPT)" \ make_deps=yes nc: native-code native-code-nolink: $(PRE_TARGETS) $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \ REAL_RESULT="$(NCRESULT)" \ REAL_OCAMLC="$(OCAMLOPT)" \ make_deps=yes ncnl: native-code-nolink # generates byte-code libraries byte-code-library: $(PRE_TARGETS) $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ $(RES_CLIB) $(BCRESULT).cma \ REAL_RESULT="$(BCRESULT)" \ CREATE_LIB=yes \ make_deps=yes bcl: byte-code-library # generates native-code libraries native-code-library: $(PRE_TARGETS) $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ $(RES_CLIB) $(NCRESULT).cmxa \ REAL_RESULT="$(NCRESULT)" \ REAL_OCAMLC="$(OCAMLOPT)" \ CREATE_LIB=yes \ make_deps=yes ncl: native-code-library ifdef WIN32 # generates byte-code dll byte-code-dll: $(PRE_TARGETS) $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ $(RES_CLIB) $(BCRESULT).dll \ REAL_RESULT="$(BCRESULT)" \ make_deps=yes bcd: byte-code-dll # generates native-code dll native-code-dll: $(PRE_TARGETS) $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ $(RES_CLIB) $(NCRESULT).dll \ REAL_RESULT="$(NCRESULT)" \ REAL_OCAMLC="$(OCAMLOPT)" \ make_deps=yes ncd: native-code-dll endif # generates byte-code with debugging information debug-code: $(PRE_TARGETS) $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \ REAL_RESULT="$(BCRESULT)" make_deps=yes \ OCAMLFLAGS="-g $(OCAMLFLAGS)" \ OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" dc: debug-code debug-code-nolink: $(PRE_TARGETS) $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \ REAL_RESULT="$(BCRESULT)" make_deps=yes \ OCAMLFLAGS="-g $(OCAMLFLAGS)" \ OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" dcnl: debug-code-nolink # generates byte-code libraries with debugging information debug-code-library: $(PRE_TARGETS) $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ $(RES_CLIB) $(BCRESULT).cma \ REAL_RESULT="$(BCRESULT)" make_deps=yes \ CREATE_LIB=yes \ OCAMLFLAGS="-g $(OCAMLFLAGS)" \ OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" dcl: debug-code-library # generates byte-code for profiling profiling-byte-code: $(PRE_TARGETS) $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \ REAL_RESULT="$(BCRESULT)" PROFILING="y" \ make_deps=yes pbc: profiling-byte-code # generates native-code profiling-native-code: $(PRE_TARGETS) $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \ REAL_RESULT="$(NCRESULT)" \ REAL_OCAMLC="$(OCAMLOPT)" \ PROFILING="y" \ make_deps=yes pnc: profiling-native-code # generates byte-code libraries profiling-byte-code-library: $(PRE_TARGETS) $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ $(RES_CLIB) $(BCRESULT).cma \ REAL_RESULT="$(BCRESULT)" PROFILING="y" \ CREATE_LIB=yes \ make_deps=yes pbcl: profiling-byte-code-library # generates native-code libraries profiling-native-code-library: $(PRE_TARGETS) $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ $(RES_CLIB) $(NCRESULT).cmxa \ REAL_RESULT="$(NCRESULT)" PROFILING="y" \ REAL_OCAMLC="$(OCAMLOPT)" \ CREATE_LIB=yes \ make_deps=yes pncl: profiling-native-code-library # packs byte-code objects pack-byte-code: $(PRE_TARGETS) $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT).cmo \ REAL_RESULT="$(BCRESULT)" \ PACK_LIB=yes make_deps=yes pabc: pack-byte-code # packs native-code objects pack-native-code: $(PRE_TARGETS) $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ $(NCRESULT).cmx $(NCRESULT).o \ REAL_RESULT="$(NCRESULT)" \ REAL_OCAMLC="$(OCAMLOPT)" \ PACK_LIB=yes make_deps=yes panc: pack-native-code # generates HTML-documentation htdoc: $(DOC_DIR)/$(RESULT)/html/index.html # generates Latex-documentation ladoc: $(DOC_DIR)/$(RESULT)/latex/doc.tex # generates PostScript-documentation psdoc: $(DOC_DIR)/$(RESULT)/latex/doc.ps # generates PDF-documentation pdfdoc: $(DOC_DIR)/$(RESULT)/latex/doc.pdf # generates all supported forms of documentation doc: htdoc ladoc psdoc pdfdoc ########################################################################### # LOW LEVEL RULES $(REAL_RESULT): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) $(RESULTDEPS) $(REAL_OCAMLFIND) $(REAL_OCAMLC) \ $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \ $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \ $(REAL_IMPL) nolink: $(REAL_IMPL_INTF) $(OBJ_LINK) ifdef WIN32 $(REAL_RESULT).dll: $(REAL_IMPL_INTF) $(OBJ_LINK) $(CAMLIDLDLL) $(CAMLIDLDLLFLAGS) $(OBJ_LINK) $(CLIBS) \ -o $@ $(REAL_IMPL) endif %$(TOPSUFFIX): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) $(REAL_OCAMLFIND) $(OCAMLMKTOP) \ $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \ $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \ $(REAL_IMPL) .SUFFIXES: .mli .ml .cmi .cmo .cmx .cma .cmxa .$(EXT_OBJ) \ .mly .di .d .$(EXT_LIB) .idl %.oxridl .c .m .$(EXT_CXX) .h .so \ .rep .zog .glade ifndef STATIC ifdef MINGW $(DLLSONAME): $(OBJ_LINK) $(CC) $(CFLAGS) $(CFLAGS_WIN32) $(OBJ_LINK) -shared -o $@ \ -Wl,--whole-archive $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/lib%.a))) \ $(OCAMLLIBPATH)/ocamlrun.a \ -Wl,--export-all-symbols \ -Wl,--no-whole-archive else ifdef MSVC $(DLLSONAME): $(OBJ_LINK) link /NOLOGO /DLL /OUT:$@ $(OBJ_LINK) \ $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/%.lib))) \ $(OCAMLLIBPATH)/ocamlrun.lib else $(DLLSONAME): $(OBJ_LINK) $(OCAMLMKLIB) $(INCFLAGS) $(CLIBFLAGS) \ -o $(CLIB_BASE) $(OBJ_LINK) $(CLIBS:%=-l%) $(CFRAMEWORKS:%=-framework %) \ $(OCAMLMKLIB_FLAGS) endif endif endif ifndef LIB_PACK_NAME $(RESULT).cma: $(REAL_IMPL_INTF) $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS) $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@ $(REAL_IMPL) $(RESULT).cmxa $(RESULT).$(EXT_LIB): $(REAL_IMPL_INTF) $(EXTRADEPS) $(RESULTDEPS) $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@ $(REAL_IMPL) else ifdef BYTE_OCAML $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo: $(REAL_IMPL_INTF) $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmo $(OCAMLLDFLAGS) $(REAL_IMPL) else $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx: $(REAL_IMPL_INTF) $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmx $(OCAMLLDFLAGS) $(REAL_IMPL) endif $(RESULT).cma: $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS) $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@ $(LIB_PACK_NAME).cmo $(RESULT).cmxa $(RESULT).$(EXT_LIB): $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx $(EXTRADEPS) $(RESULTDEPS) $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@ $(LIB_PACK_NAME).cmx endif $(RES_CLIB): $(OBJ_LINK) ifndef MSVC ifneq ($(strip $(OBJ_LINK)),) $(AR) rcs $@ $(OBJ_LINK) endif else ifneq ($(strip $(OBJ_LINK)),) lib -nologo -debugtype:cv -out:$(RES_CLIB) $(OBJ_LINK) endif endif .mli.cmi: $(EXTRADEPS) $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ if [ -z "$$pp" ]; then \ $(ECHO) $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ -c $(THREAD_FLAG) $(ANNOT_FLAG) \ $(OCAMLFLAGS) $(INCFLAGS) $<; \ $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ -c $(THREAD_FLAG) $(ANNOT_FLAG) \ $(OCAMLFLAGS) $(INCFLAGS) $<; \ else \ $(ECHO) $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ -c -pp \"$$pp $(PPFLAGS)\" $(THREAD_FLAG) $(ANNOT_FLAG) \ $(OCAMLFLAGS) $(INCFLAGS) $<; \ $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ -c -pp "$$pp $(PPFLAGS)" $(THREAD_FLAG) $(ANNOT_FLAG) \ $(OCAMLFLAGS) $(INCFLAGS) $<; \ fi .ml.cmi .ml.$(EXT_OBJ) .ml.cmx .ml.cmo: $(EXTRADEPS) $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ if [ -z "$$pp" ]; then \ $(ECHO) $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ -c $(ALL_OCAMLCFLAGS) $<; \ $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ -c $(ALL_OCAMLCFLAGS) $<; \ else \ $(ECHO) $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ -c -pp \"$$pp $(PPFLAGS)\" $(ALL_OCAMLCFLAGS) $<; \ $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ -c -pp "$$pp $(PPFLAGS)" $(ALL_OCAMLCFLAGS) $<; \ fi ifdef PACK_LIB $(REAL_RESULT).cmo $(REAL_RESULT).cmx $(REAL_RESULT).o: $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack $(ALL_LDFLAGS) \ $(OBJS_LIBS) -o $@ $(REAL_IMPL) endif .PRECIOUS: %.ml %.ml: %.mll $(OCAMLLEX) $(LFLAGS) $< .PRECIOUS: %.ml %.mli %.ml %.mli: %.mly $(OCAMLYACC) $(YFLAGS) $< $(QUIET)pp=`sed -n -e 's/.*(\*pp \([^*]*\) \*).*/\1/p;q' $<`; \ if [ ! -z "$$pp" ]; then \ mv $*.ml $*.ml.temporary; \ echo "(*pp $$pp $(PPFLAGS)*)" > $*.ml; \ cat $*.ml.temporary >> $*.ml; \ rm $*.ml.temporary; \ mv $*.mli $*.mli.temporary; \ echo "(*pp $$pp $(PPFLAGS)*)" > $*.mli; \ cat $*.mli.temporary >> $*.mli; \ rm $*.mli.temporary; \ fi .PRECIOUS: %.ml %.ml: %.rep $(CAMELEON_REPORT) $(CAMELEON_REPORT_FLAGS) -gen $< .PRECIOUS: %.ml %.ml: %.zog $(CAMELEON_ZOGGY) $(CAMELEON_ZOGGY_FLAGS) -impl $< > $@ .PRECIOUS: %.ml %.ml: %.glade $(OCAML_GLADECC) $(OCAML_GLADECC_FLAGS) $< > $@ .PRECIOUS: %.ml %.mli %.ml %.mli: %.oxridl $(OXRIDL) $< .PRECIOUS: %.ml %.mli %_stubs.c %.h %.ml %.mli %_stubs.c %.h: %.idl $(CAMLIDL) $(MAYBE_IDL_HEADER) $(IDLFLAGS) \ $(CAMLIDLFLAGS) $< $(QUIET)if [ $(NOIDLHEADER) ]; then touch $*.h; fi .c.$(EXT_OBJ): $(OCAMLC) -c -cc "$(CC)" -ccopt "$(CFLAGS) \ $(CPPFLAGS) $(CPPFLAGS_WIN32) \ $(CFLAGS_WIN32) $(CINCFLAGS) $(CFLAG_O)$@ " $< .m.$(EXT_OBJ): $(CC) -c $(CFLAGS) $(CINCFLAGS) $(CPPFLAGS) \ -I'$(OCAMLLIBPATH)' \ $< $(CFLAG_O)$@ .$(EXT_CXX).$(EXT_OBJ): $(CXX) -c $(CXXFLAGS) $(CINCFLAGS) $(CPPFLAGS) \ -I'$(OCAMLLIBPATH)' \ $< $(CFLAG_O)$@ $(MLDEPDIR)/%.d: %.ml $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ if [ -z "$$pp" ]; then \ $(ECHO) $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ $(DINCFLAGS) $< \> $@; \ $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ $(DINCFLAGS) $< > $@; \ else \ $(ECHO) $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ -pp \"$$pp $(PPFLAGS)\" $(DINCFLAGS) $< \> $@; \ $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \ fi $(BCDIDIR)/%.di $(NCDIDIR)/%.di: %.mli $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ if [ -z "$$pp" ]; then \ $(ECHO) $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(DINCFLAGS) $< \> $@; \ $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(DINCFLAGS) $< > $@; \ else \ $(ECHO) $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \ -pp \"$$pp $(PPFLAGS)\" $(DINCFLAGS) $< \> $@; \ $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \ -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \ fi $(DOC_DIR)/$(RESULT)/html: mkdir -p $@ $(DOC_DIR)/$(RESULT)/html/index.html: $(DOC_DIR)/$(RESULT)/html $(DOC_FILES) rm -rf $ tr = quote(mlcurses_##f) #define ML1(f,tr,ta) \ external f : ta -> tr = quote(mlcurses_##f) #define ML2(f,tr,ta,tb) \ external f : ta -> tb -> tr = quote(mlcurses_##f) #define ML3(f,tr,ta,tb,tc) \ external f : ta -> tb -> tc -> tr = quote(mlcurses_##f) #define ML4(f,tr,ta,tb,tc,td) \ external f : ta -> tb -> tc -> td -> tr = quote(mlcurses_##f) #define ML5(f,tr,ta,tb,tc,td,te) \ external f : ta -> tb -> tc -> td -> te -> tr = quote(mlcurses_##f) #define ML6(f,tr,ta,tb,tc,td,te,tf) \ external f : ta -> tb -> tc -> td -> te -> tf -> tr \ = quote(mlcurses_##f##_bytecode) quote(mlcurses_##f##_native) #define ML7(f,tr,ta,tb,tc,td,te,tf,tg) \ external f : ta -> tb -> tc -> td -> te -> tf -> tg -> tr \ = quote(mlcurses_##f##_bytecode) quote(mlcurses_##f##_native) #define ML8(f,tr,ta,tb,tc,td,te,tf,tg,th) \ external f : ta -> tb -> tc -> td -> te -> tf -> tg -> th -> tr \ = quote(mlcurses_##f##_bytecode) quote(mlcurses_##f##_native) #define ML9(f,tr,ta,tb,tc,td,te,tf,tg,th,ti) \ external f : ta -> tb -> tc -> td -> te -> tf -> tg -> th -> ti -> tr \ = quote(mlcurses_##f##_bytecode) quote(mlcurses_##f##_native) #define ML0d(f,tr) ML0(f,tr) #define ML1d(f,tr,ta) ML1(f,tr,ta) #define ML2d(f,tr,ta,tb) ML2(f,tr,ta,tb) #define ML3d(f,tr,ta,tb,tc) ML3(f,tr,ta,tb,tc) #define ML4d(f,tr,ta,tb,tc,td) ML4(f,tr,ta,tb,tc,td) #define ML5d(f,tr,ta,tb,tc,td,te) ML5(f,tr,ta,tb,tc,td,te) #define ML6d(f,tr,ta,tb,tc,td,te,tf) ML6(f,tr,ta,tb,tc,td,te,tf) #define ML0_notimpl(f,tr) ML0(f,tr) #define ML1_notimpl(f,tr,ta) ML1(f,tr,ta) #define ML2_notimpl(f,tr,ta,tb) ML2(f,tr,ta,tb) #define BEG (* #define BEG0 BEG #define BEG1 BEG #define BEG2 BEG #define BEG3 BEG #define BEG4 BEG #define BEG5 BEG #define BEG6 BEG #define BEG7 BEG #define BEG8 BEG #define BEG9 BEG #define END *) module Acs = struct type acs = { ulcorner: chtype; llcorner: chtype; urcorner: chtype; lrcorner: chtype; ltee: chtype; rtee: chtype; btee: chtype; ttee: chtype; hline: chtype; vline: chtype; plus: chtype; s1: chtype; s9: chtype; diamond: chtype; ckboard: chtype; degree: chtype; plminus: chtype; bullet: chtype; larrow: chtype; rarrow: chtype; darrow: chtype; uarrow: chtype; board: chtype; lantern: chtype; block: chtype; s3: chtype; s7: chtype; lequal: chtype; gequal: chtype; pi: chtype; nequal: chtype; sterling: chtype } let bssb a = a.ulcorner let ssbb a = a.llcorner let bbss a = a.urcorner let sbbs a = a.lrcorner let sbss a = a.rtee let sssb a = a.ltee let ssbs a = a.btee let bsss a = a.ttee let bsbs a = a.hline let sbsb a = a.vline let ssss a = a.plus end #include "functions.c" (* these two were written separately in ml_curses.c, * to permit proper threading behavior *) ML0(getch,int) ML1(wgetch,int,window) let null_window = null_window () let bool_terminfo_variables = Hashtbl.create 67 let num_terminfo_variables = Hashtbl.create 67 let str_terminfo_variables = Hashtbl.create 601 let () = let rec ins f h n = let (a, b, c) = f n in if a = "" then () else ( Hashtbl.add h c (a, b); ins f h (n + 1) ) in (* These functions do not exist on all curses implementations, * so if they throw Invalid_argument, just ignore it. *) try ins bool_terminfo_variable bool_terminfo_variables 0; ins num_terminfo_variable num_terminfo_variables 0; ins str_terminfo_variable str_terminfo_variables 0 with Invalid_argument _ -> () /* (* Bon, je vais recopier les constantes directement, parceque je n'ai * aucune idée de comment générer ēa automatiquement proprement. Si ēa ne * marche pas chez vous, il vous suffit de regarder l'include, et de * corriger ą la main. Faites-le moi savoir, ą tout hasard... *) */ module A = struct let normal = 0 let attributes = 0x7FFFFF00 let chartext = 0x000000FF let color = 0x0000FF00 let standout = 0x00010000 let underline = 0x00020000 let reverse = 0x00040000 let blink = 0x00080000 let dim = 0x00100000 let bold = 0x00200000 let altcharset = 0x00400000 let invis = 0x00800000 let protect = 0x01000000 let horizontal = 0x02000000 let left = 0x04000000 let low = 0x08000000 let right = 0x10000000 let top = 0x20000000 let vertical = 0x40000000 let combine = List.fold_left (lor) 0 let color_pair n = (n lsl 8) land color let pair_number a = (a land color) lsr 8 end (*/* Je sais, c'est moche, mais ēa marche */*) module WA = A module Color = struct let black = 0 let red = 1 let green = 2 let yellow = 3 let blue = 4 let magenta = 5 let cyan = 6 let white = 7 end module Key = struct #include "keys.ml" let f n = f0 + n end module Curses_config = struct #include "config.ml" end wyrd-1.4.6/curses/ncurses.txt0000644000175000017500000000146412103356100014716 0ustar paulpaul/* TODO: (souris) */ curs_addch(3X) * curs_addchstr(3X) * curs_addstr(3X) * curs_attr(3X) * curs_beep(3X) * curs_bkgd(3X) * curs_border(3X) * curs_clear(3X) * curs_color(3X) * curs_delch(3X) * curs_deleteln(3X) * curs_getch(3X) * curs_getstr(3X) * curs_getyx(3X) * curs_inch(3X) * curs_inchstr(3X) * curs_initscr(3X) * curs_inopts(3X) * curs_insch(3X) * curs_insstr(3X) * curs_instr(3X) * curs_kernel(3X) * curs_mouse(3X) /* I am lazy */ curs_move(3X) * curs_outopts(3X) * curs_overlay(3X) * curs_pad(3X) * curs_printw(3X) /* I will not do it */ curs_refresh(3X) * curs_resize(3x) * curs_scanw(3X) /* I will not do it */ curs_scr_dump(3X) * curs_scroll(3X) * curs_slk(3X) * curs_termattrs(3X) * curs_termcap(3X) * curs_terminfo(3X) * curs_touch(3X) * curs_util(3X) * curs_window(3X) * wyrd-1.4.6/curses/configure0000755000175000017500000043553612103356101014416 0ustar paulpaul#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= PACKAGE_URL= ac_unique_file="config.ml.in" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS BOOL_WIDE_CURSES CURSES_LIB_BASE CURSES_LIB CURSES_TERM_H CURSES_HEADER EGREP GREP CPP RANLIB OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_widec ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-widec link against a wide-character-enabled ncurses) Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # optional arguments # Check whether --enable-widec was given. if test "${enable_widec+set}" = set; then : enableval=$enable_widec; try_widec=$enable_widec else try_widec=no fi # Find a C compiler ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test "x$CC" != xcc; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 $as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 $as_echo_n "checking whether cc understands -c and -o together... " >&6; } fi set dummy $CC; ac_cc=`$as_echo "$2" | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # We do the test twice because some compilers refuse to overwrite an # existing .o file with -o, though they will create one. ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' rm -f conftest2.* if { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -f conftest2.$ac_objext && { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then eval ac_cv_prog_cc_${ac_cc}_c_o=yes if test "x$CC" != xcc; then # Test first that cc exists at all. if { ac_try='cc -c conftest.$ac_ext >&5' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' rm -f conftest2.* if { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -f conftest2.$ac_objext && { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # cc works too. : else # cc exists but doesn't like -o. eval ac_cv_prog_cc_${ac_cc}_c_o=no fi fi fi else eval ac_cv_prog_cc_${ac_cc}_c_o=no fi rm -f core conftest* fi if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi ORIG_LIBS="$LIBS" ORIG_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CURSES_INCLUDE $ORIG_CPPFLAGS" # Non-required headers. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in termios.h sys/ioctl.h windows.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Check for ncurses, and test a number of different locations for the header { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working ncurses library" >&5 $as_echo_n "checking for working ncurses library... " >&6; } if test "$try_widec" != "no" then LIBS="-lncursesw $ORIG_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { initscr(); use_default_colors() ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : CURSES_LIB=-lncursesw $as_echo "#define CURSES_HEADER " >>confdefs.h fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi if test -z "$CURSES_LIB" then LIBS="-lncurses $ORIG_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { initscr(); use_default_colors() ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : CURSES_LIB=-lncurses $as_echo "#define CURSES_HEADER " >>confdefs.h else LIBS="-lncurses $ORIG_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { initscr(); use_default_colors() ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : CURSES_LIB=-lncurses $as_echo "#define CURSES_HEADER " >>confdefs.h else LIBS="-lcurses $ORIG_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { initscr(); use_default_colors() ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : CURSES_LIB=-lcurses $as_echo "#define CURSES_HEADER " >>confdefs.h else LIBS="-lncurses $ORIG_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { initscr(); use_default_colors() ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : CURSES_LIB=-lcurses $as_echo "#define CURSES_HEADER " >>confdefs.h else LIBS="-lpdcurses $ORIG_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { initscr(); use_default_colors() ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : CURSES_LIB=-lpdcurses $as_echo "#define PDCURSES 1" >>confdefs.h $as_echo "#define CURSES_HEADER " >>confdefs.h fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi if test -n "$CURSES_LIB" then { $as_echo "$as_me:${as_lineno-$LINENO}: result: found in $CURSES_LIB" >&5 $as_echo "found in $CURSES_LIB" >&6; } else as_fn_error $? "not found" "$LINENO" 5 fi # Try to locate term.h, which has a sadly nonstandardized location { $as_echo "$as_me:${as_lineno-$LINENO}: checking for term.h" >&5 $as_echo_n "checking for term.h... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { TERMINAL __dummy ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : TERM_H_STRING="" $as_echo "#define CURSES_TERM_H " >>confdefs.h else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { TERMINAL __dummy ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : TERM_H_STRING="" $as_echo "#define CURSES_TERM_H " >>confdefs.h else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { TERMINAL __dummy ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : TERM_H_STRING="" $as_echo "#define CURSES_TERM_H " >>confdefs.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test -n "$TERM_H_STRING" then { $as_echo "$as_me:${as_lineno-$LINENO}: result: found in $TERM_H_STRING" >&5 $as_echo "found in $TERM_H_STRING" >&6; } else as_fn_error $? "not found" "$LINENO" 5 fi # Determine whether the detected curses has wide character support BOOL_WIDE_CURSES="false" if test -n "$CURSES_LIB" then LIBS="$CURSES_LIB $ORIG_LIBS" if test "$try_widec" != "no" then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wide character support in ncurses library" >&5 $as_echo_n "checking for wide character support in ncurses library... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include CURSES_HEADER int main () { wchar_t wch = 0; addnwstr(&wch, 1); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_WIDE_CURSES 1" >>confdefs.h BOOL_WIDE_CURSES="true" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi fi # Look for some functions which aren't found in all # curses implementations, eg. PDCurses. These are # optional: we will substitute them where we can. for ac_func in resizeterm resize_term do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done CURSES_LIB_BASE=`expr "$CURSES_LIB" : '-l\(.*\)'` CPPFLAGS="$ORIG_CPPFLAGS" LIBS="$ORIG_LIBS" # Perform substitutions # Generate the Makefile and config module ac_config_headers="$ac_config_headers config.h" ac_config_files="$ac_config_files Makefile config.ml" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "config.ml") CONFIG_FILES="$CONFIG_FILES config.ml" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi chmod a-w Makefile wyrd-1.4.6/curses/Makefile.in0000644000175000017500000000344112103356100014535 0ustar paulpaul# $Id: Makefile.in,v 1.2 2008/11/17 16:53:36 rwmj Exp $ PACKAGE = ocaml-curses VERSION = 1.0.3 CURSES = ncurses CLIBS = @CURSES_LIB_BASE@ DEFS = @DEFS@ RESULT = curses SOURCES = ml_curses.c keys.ml curses.mli curses.ml CC = @CC@ CFLAGS = -g -Wall $(DEFS) LDFLAGS = @LDFLAGS@ RANLIB = @RANLIB@ LIBINSTALL_FILES = $(wildcard *.mli *.cmi *.cma *.cmxa *.a *.so) OCAMLDOCFLAGS = -stars all: byte opt: ncl META $(RANLIB) *.a byte: bcl META $(RANLIB) *.a install: byte libinstall uninstall: libuninstall test: test.ml byte $(OCAMLC) -I . -o $@ curses.cma $< test.opt: test.ml opt $(OCAMLOPT) -I . -o $@ curses.cmxa $< META: META.in sed \ -e 's/@PACKAGE@/curses/' \ -e 's/@VERSION@/$(VERSION)/' \ -e 's/@CURSES@/$(CURSES)/' \ < $< > $@ doc: htdoc distclean: clean rm -rf doc/curses rm -rf autom4te.cache rm -f config.log config.status Makefile config.ml # Distribution. dist: $(MAKE) check-manifest rm -rf $(PACKAGE)-$(VERSION) mkdir $(PACKAGE)-$(VERSION) tar -cf - -T MANIFEST | tar -C $(PACKAGE)-$(VERSION) -xf - tar zcf $(PACKAGE)-$(VERSION).tar.gz $(PACKAGE)-$(VERSION) rm -rf $(PACKAGE)-$(VERSION) ls -l $(PACKAGE)-$(VERSION).tar.gz check-manifest: @for d in `find -type d -name CVS | grep -v '^\./debian/'`; \ do \ b=`dirname $$d`/; \ awk -F/ '$$1 != "D" {print $$2}' $$d/Entries | \ sed -e "s|^|$$b|" -e "s|^\./||"; \ done | grep -v \.cvsignore | sort > .check-manifest; \ sort MANIFEST > .orig-manifest; \ diff -u .orig-manifest .check-manifest; rv=$$?; \ rm -f .orig-manifest .check-manifest; \ exit $$r # Upload to Savannah. USER = $(shell whoami) upload: rm -f $(PACKAGE)-$(VERSION).tar.gz.sig gpg -b $(PACKAGE)-$(VERSION).tar.gz scp $(PACKAGE)-$(VERSION).tar.gz{,.sig} \ $(USER)@dl.sv.nongnu.org:/releases/ocaml-tmk include OCamlMakefile .PHONY: doc wyrd-1.4.6/curses/tmk/0000755000175000017500000000000012103356101013262 5ustar paulpaulwyrd-1.4.6/curses/tmk/tmkMisc.ml0000644000175000017500000000274512103356100015232 0ustar paulpaulopen TmkStruct let real_class_misc = Class.create "Misc" [TmkWidget.real_class_widget] class virtual misc w h = object (self) inherit TmkWidget.widget as super val mutable xalign = 50 val mutable yalign = 50 val mutable width = w val mutable height = h method set_align x y = if x >= 0 && x <= 100 then xalign <- x; if y >= 0 && y <= 100 then yalign <- y method class_get_size (w, h) = (width, height) method class_set_geometry (x, y, w, h) = let wa = w - width and ha = h - height in let g = (x + xalign * wa / 100, y + yalign * ha / 100, width, height) in super#class_set_geometry g end (**************************************************************************************** * La classe Label ****************************************************************************************) let real_class_label = Class.create "Label" [real_class_misc] class label parent t = object (self) inherit misc (String.length t) 1 as super val mutable txt = t val terminal = parent#terminal method real_class = real_class_label method parent = parent method terminal = terminal method class_get_size t = (String.length txt, 1) method class_draw () = super#class_draw (); let l = String.length txt in if l <= geometry.Geom.w then ( Curses.wattrset window attribute; ignore (Curses.mvwaddstr window geometry.Geom.y geometry.Geom.x txt) ) else ( ) initializer parent#add self#coerce; end wyrd-1.4.6/curses/tmk/tmkFrame.ml0000644000175000017500000000526512103356100015371 0ustar paulpaulopen TmkStruct open Curses (**************************************************************************************** * La classe Frame ****************************************************************************************) let real_class_frame = Class.create "Frame" [TmkContainer.real_class_bin] class frame parent text = object (self) inherit TmkContainer.bin as super val acs = parent#terminal#acs method real_class = real_class_frame method parent = parent method terminal = parent#terminal method class_get_size t = match child with | None -> t | Some c -> let (w, h) = c#signal_get_size#emit t in let w = max w (String.length text) in (w + 2, h + 2) method class_set_geometry g = super#class_set_geometry g; match child with | None -> () | Some c -> c#signal_set_geometry#emit (succ geometry.Geom.x, succ geometry.Geom.y, geometry.Geom.w - 2, geometry.Geom.h) method class_draw () = super#class_draw (); let x1 = geometry.Geom.x and y1 = geometry.Geom.y and w = geometry.Geom.w - 2 and h = geometry.Geom.h - 2 in let x2 = succ x1 + w and y2 = succ y1 + h in ignore (wmove window y1 x1); wattrset window attribute; ignore (waddch window acs.Acs.ulcorner); ignore (waddstr window text); ignore (whline window 0 (w - (String.length text))); ignore (mvwaddch window y1 x2 acs.Acs.urcorner); ignore (mvwaddch window y2 x1 acs.Acs.llcorner); ignore (whline window 0 w); ignore (mvwaddch window y2 x2 acs.Acs.lrcorner); ignore (wmove window (succ y1) x1); ignore (wvline window 0 h); ignore (wmove window (succ y1) x2); ignore (wvline window 0 h) initializer parent#add self#coerce; end (**************************************************************************************** * La classe Rule ****************************************************************************************) let real_class_rule = Class.create "Rule" [TmkWidget.real_class_widget] class rule parent direction = object (self) inherit TmkWidget.widget as super val terminal = parent#terminal method real_class = real_class_rule method parent = parent method terminal = terminal method class_get_size t = (1, 1) method class_draw () = super#class_draw (); wattrset window attribute; match direction with | `Vertical -> ignore (wmove window geometry.Geom.y (geometry.Geom.x + geometry.Geom.w / 2)); ignore (wvline window 0 geometry.Geom.h) | `Horizontal -> ignore (wmove window (geometry.Geom.y + geometry.Geom.h / 2) geometry.Geom.x); ignore (whline window 0 geometry.Geom.w) initializer parent#add self#coerce; end wyrd-1.4.6/curses/tmk/tmkStyle_l.mll0000644000175000017500000000272412103356100016123 0ustar paulpaul{ let strbuf = Buffer.create 128 } let word = ['a'-'z' 'A'-'Z' '0'-'9' '_'] let word_start = ['a'-'z' 'A'-'Z' '_'] rule lexeme = parse [' ' '\n' '\r' '\t'] { lexeme lexbuf } | '=' { TmkStyle_p.Equal } | "!=" { TmkStyle_p.Nequal } | '~' { TmkStyle_p.Tilde } | '[' { TmkStyle_p.LBracket } | ']' { TmkStyle_p.RBracket } | '{' { TmkStyle_p.LBrace } | '}' { TmkStyle_p.RBrace } | '(' { TmkStyle_p.LParen } | ')' { TmkStyle_p.RParen } | ',' { TmkStyle_p.Comma } | '&' '&'? { TmkStyle_p.And } | '|' '|'? { TmkStyle_p.Or } | '!' { TmkStyle_p.Not } | '$' word+ { TmkStyle_p.Env (Lexing.lexeme lexbuf) } | word_start word* { TmkStyle_p.Ident (Lexing.lexeme lexbuf) } | ['0'-'9']+ { TmkStyle_p.Int (int_of_string (Lexing.lexeme lexbuf)) } | ('0' ['x' 'X']) ['0'-'9' 'a'-'f' 'A'-'F']+ { TmkStyle_p.Int (int_of_string ((Lexing.lexeme lexbuf))) } | ('0' ['o' 'O']) ['0'-'7']+ { TmkStyle_p.Int (int_of_string ((Lexing.lexeme lexbuf))) } | '"' { TmkStyle_p.Str (string lexbuf) } | eof { TmkStyle_p.Eof } and string = parse "\\\\" { Buffer.add_char strbuf '\\'; string lexbuf } | "\\\n" { string lexbuf } | "\\\"" { Buffer.add_char strbuf '"'; string lexbuf } | '\\' _ { Buffer.add_char strbuf '\\'; Buffer.add_char strbuf (Lexing.lexeme lexbuf).[1]; string lexbuf } | [^ '\\' '"']* { Buffer.add_string strbuf (Lexing.lexeme lexbuf); string lexbuf } | '"' { let r = Buffer.contents strbuf in Buffer.clear strbuf; r } { } wyrd-1.4.6/curses/tmk/tmkEntry.ml0000644000175000017500000000622212103356100015432 0ustar paulpaulopen TmkStruct (**************************************************************************************** * La classe Entry ****************************************************************************************) let real_class_entry = Class.create "Entry" [TmkWidget.real_class_widget] class entry parent = object (self) inherit TmkWidget.widget as super val terminal = parent#terminal val mutable text = String.create 128 val mutable text_length = 0 val mutable text_offset = 0 val mutable cursor = 0 val mutable accept_key = function _ -> true method real_class = real_class_entry method parent = parent method terminal = terminal method can_focus = true method class_get_size _ = (2, 1) method class_draw () = super#class_draw (); Curses.wattrset window attribute; ignore (Curses.wmove window geometry.Geom.y geometry.Geom.x); Curses.whline window 32 geometry.Geom.w; ignore (Curses.waddnstr window text text_offset (min (text_length - text_offset) geometry.Geom.w)); if self#has_focus then self#set_cursor (geometry.Geom.x + cursor - text_offset, geometry.Geom.y) method cursor = cursor method move_cursor pos = let pos = min (max pos 0) text_length in cursor <- pos; if cursor < text_offset || cursor >= text_offset + geometry.Geom.w then ( text_offset <- max 0 (cursor - geometry.Geom.w / 2); self#queue_redraw () ); if self#has_focus then terminal#set_cursor (geometry.Geom.x + cursor - text_offset, geometry.Geom.y) method insert_string string = let len = String.length string in let lt = String.length text in if text_length + len > lt then ( let rec aux t = if t >= text_length + len then t - lt else aux (t * 2) in let t = aux (lt * 2) in text <- text ^ (String.create t) ); String.blit text cursor text (cursor + len) (text_length - cursor); String.blit string 0 text cursor len; text_length <- text_length + len; self#move_cursor (cursor + len); self#queue_redraw () method delete pos len = if pos < 0 || pos + len > text_length then invalid_arg "Entry#delete"; String.blit text (pos + len) text pos (text_length - pos - len); text_length <- text_length - len; if cursor > pos then self#move_cursor (max pos (cursor - len)); self#queue_redraw () method class_key_event key = if key >= 32 && key <= 126 || key >= 160 && key <= 255 then ( let char = char_of_int key in if accept_key char then let string = String.make 1 char in self#insert_string string else ignore (Curses.beep ()); true ) else if key = Curses.Key.right then ( self#move_cursor (succ cursor); true ) else if key = Curses.Key.left then ( self#move_cursor (pred cursor); true ) else if key = Curses.Key.backspace then ( if cursor > 0 then self#delete (pred cursor) 1; true ) else if key = Curses.Key.dc then ( if cursor < text_length then self#delete cursor 1; true ) else super#class_key_event key initializer parent#add self#coerce; String.blit "foobar" 0 text 0 6; text_length <- 6 end wyrd-1.4.6/curses/tmk/tmkTerminal.ml0000644000175000017500000001734412103356100016113 0ustar paulpaulopen Curses open TmkStruct (*smkx, rmkx *) let key_list = [ Key.backspace, "kbs"; Key.home, "khome";Key.up, "kcuu1"; Key.seol, "kEOL"; Key.sexit, "kEXT"; Key.scopy, "kCPY"; Key.ctab, "kctab";Key.find, "kfnd"; Key.ssuspend, "kSPD"; Key.restart, "krst"; Key.close, "kclo"; Key.redo, "krdo"; Key.smove, "kMOV"; Key.ssave, "kSAV"; Key.npage, "knp"; Key.sundo, "kUND"; Key.a1, "ka1"; Key.a3, "ka3"; Key.sleft, "kLFT"; Key.b2, "kb2"; Key.c1, "kc1"; Key.c3, "kc3"; Key.smessage, "kMSG"; Key.help, "khlp"; Key.replace, "krpl"; Key.eic, "krmir";Key.stab, "khts"; Key.dc, "kdch1";Key.dl, "kdl1"; Key.beg, "kbeg"; Key.create, "kcrt"; Key.sfind, "kFND"; Key.command, "kcmd"; Key.resume, "kres"; Key.mouse, "kmous";Key.end_, "kend"; Key.open_, "kopn"; Key.btab, "kcbt"; Key.eol, "kel"; Key.eos, "ked"; Key.ic, "kich1";Key.il, "kil1"; Key.sredo, "kRDO"; Key.cancel, "kcan"; Key.sdc, "kDC"; Key.sdl, "kDL"; Key.right, "kcuf1";Key.ll, "kll"; Key.options, "kopt"; Key.sic, "kIC"; Key.sreplace, "kRPL"; Key.enter, "kent"; Key.shelp, "kHLP"; Key.shome, "kHOM"; Key.scommand, "kCMD"; Key.sf, "kind"; Key.sr, "kri"; Key.message, "kmsg"; Key.sright, "kRIT"; Key.down, "kcud1"; Key.catab, "ktbc"; Key.refresh, "krfr"; Key.sprevious, "kPRV"; Key.soptions, "kOPT"; Key.mark, "kmrk"; Key.next, "knxt"; Key.previous, "kprv"; Key.reference, "kref"; Key.select, "kslt"; Key.print, "kprt"; Key.exit, "kext"; Key.copy, "kcpy"; Key.ppage, "kpp"; Key.clear, "kclr"; Key.screate, "kCRT"; Key.srsume, "kRES"; Key.suspend, "kspd"; Key.snext, "kNXT"; Key.move, "kmov"; Key.save, "ksav"; Key.scancel, "kCAN"; Key.sprint, "kPRT"; Key.undo, "kund"; Key.sbeg, "kBEG"; Key.left, "kcub1";Key.send, "kEND"; ] @ (let rec f k l = if k < 0 then l else f (k - 1) ((Key.f k, "kf" ^ (string_of_int k)) :: l) in f 63 []) module KeyTree = struct type t = { mutable key: int; mutable subtree: (int, t) Hashtbl.t option; } let create () = { key = -1; subtree = None } let rec add_key tree key = function | [] -> tree.key <- key | h::t -> let s = match tree.subtree with | None -> let h = Hashtbl.create 17 in tree.subtree <- Some h; h | Some h -> h in let n = try Hashtbl.find s h with Not_found -> let n = create () in Hashtbl.add s h n; n in add_key n key t (* TODO: un mode avec temporisation *) let try_key tree key = let rec try_key_aux best tree seq = let sb = if tree.key = -1 then best else (tree.key, seq) in match tree.subtree with | None -> sb | Some ht -> match seq with | [] -> (-1, key) | h::t -> let sto = try Some (Hashtbl.find ht h) with Not_found -> None in match sto with | None -> sb | Some st -> try_key_aux sb st t in match key with | [] -> (-1, []) | h::t -> try_key_aux (h,t) tree key end let get_terminfo_string s = try Some (tigetstr s) with Failure _ -> None let int_list_of_string s = let rec aux a = function | -1 -> a | n -> aux ((int_of_char s.[n]) :: a) (n - 1) in aux [] (String.length s - 1) let construire_arbre_terminfo r = List.iter (fun (x,y) -> match get_terminfo_string y with | Some t -> KeyTree.add_key r x (int_list_of_string t); if t.[0] = '\027' && t.[1] = 'O' then ( t.[1] <- '['; KeyTree.add_key r x (int_list_of_string t) ) | None -> ()) key_list let variables v = if v = "" then "" else if v.[0] = '$' then try Sys.getenv (String.sub v 1 (pred (String.length v))) with Not_found -> "" else "" (**************************************************************************** * The terminal class ****************************************************************************) class virtual ['a] terminal = object (self) val keytree = KeyTree.create () val mutable key_spool = [] val mutable toplevels = [] val event_queue = Queue.create () val mutable cursor = (0, 0) val simplified_configuration = Cache.create (fun () -> TmkStyle.S.simplify_configuration (fun v -> Some (variables v)) None !TmkStyle.S.config_tree) method virtual activate : unit -> unit method virtual exit : unit -> unit method virtual main_window : TmkArea.window method virtual resource : TmkStyle.R.t method virtual get_size : unit -> int * int method virtual acs : Curses.Acs.acs method event_queue = event_queue val mutable resize_queued = false method queue_resize () = if not resize_queued then ( resize_queued <- true; Queue.add self#resize_toplevels event_queue ) method resize_toplevels () = let (h, w) = self#get_size () in ignore (Curses.wclear self#main_window#window); let send t = t#signal_set_geometry#emit (0, 0, w, h) in Queue.add (fun () -> List.iter send (List.rev toplevels)) event_queue; resize_queued <- false method read_key () = let rec all_keys a = match getch () with | -1 -> List.rev a | k -> all_keys (k::a) in let k = all_keys [] in key_spool <- key_spool @ k; let (t,r) = KeyTree.try_key keytree key_spool in key_spool <- r; if t = Curses.Key.resize then ( self#resize_toplevels (); self#read_key () ) else t method private activate_last_toplevel () = match toplevels with | [] -> () | t::_ -> Queue.add (fun () -> t#signal_toplevel_event#emit Toplevel.Activate) event_queue method add_toplevel (t : 'a) = toplevels <- t :: toplevels; Queue.add (fun () -> t#signal_map#emit self#main_window) event_queue; self#queue_resize (); self#activate_last_toplevel () method remove_toplevel () = match toplevels with | [] -> failwith "no toplevel to remove" | h::t -> toplevels <- t; self#queue_resize (); self#activate_last_toplevel () method current_toplevel () = List.hd toplevels method get_cursor () = cursor method set_cursor c = cursor <- c method configuration () = Cache.get simplified_configuration end class ['a] terminal_unique = object inherit ['a] terminal val main_window = let t = Curses.initscr () in if t = Curses.null_window then failwith "screen initialisation"; ignore (cbreak ()); ignore (noecho ()); new TmkArea.toplevel t val acs = Curses.get_acs_codes () method acs = acs method main_window = main_window method activate () = () method exit () = Curses.endwin () val resource = TmkStyle.R.create () method resource = resource method get_size () = let (h,w) as s = Curses.get_size () in ignore (Curses.resizeterm h w); s initializer let w = main_window#window in if not (Curses.raw ()) then failwith "raw mode"; if not (Curses.noecho ()) then failwith "echo mode"; if not (Curses.nodelay w true) then failwith "no delay mode"; Curses.winch_handler_on (); construire_arbre_terminfo keytree end class ['a] terminal_from_fd fdout fdin = let screen = Curses.newterm "xterm" fdin fdout in object inherit ['a] terminal val main_window = let t = Curses.stdscr () in if t = Curses.null_window then failwith "screen initialisation"; new TmkArea.toplevel t val acs = Curses.get_acs_codes () method acs = acs method main_window = main_window method activate () = ignore (Curses.set_term screen) method exit () = Curses.endwin () val resource = TmkStyle.R.create () method resource = resource method get_size () = let (h,w) as s = Curses.get_size_fd fdin in prerr_endline (Printf.sprintf "%dx%d" w h); ignore (Curses.resizeterm h w); s initializer let w = main_window#window in if not (Curses.raw ()) then failwith "raw mode"; if not (Curses.noecho ()) then failwith "echo mode"; if not (Curses.nodelay w true) then failwith "no delay mode"; Curses.winch_handler_on (); construire_arbre_terminfo keytree end wyrd-1.4.6/curses/tmk/tmkStyle_p.mly0000644000175000017500000000246112103356100016142 0ustar paulpaul%{ open TmkStyle %} %token Equal Nequal Tilde %token LBracket RBracket %token LBrace RBrace %token LParen RParen %token Comma %token Ident %token Env %token Str %token Int %token And Or Not %token Eof %left Or %left And %nonassoc Not %start parse %type parse %% parse: specification_list Eof { List.rev $1 } ; specification_list: /* empty */ { [] } | specification_list specification { $2::$1 } ; specification: Ident subscript Equal rvalue { S.Def ($1, $2, $4) } | LParen condition RParen LBrace specification_list RBrace { S.Sub ($2, $5) } ; subscript: /* empty */ { None } | LBracket subscript_list RBracket { Some (List.rev $2) } ; subscript_list: Ident { [$1] } | subscript_list Comma Ident { $3::$1 } ; rvalue: Int { S.Int $1 } | Str { S.Str $1 } ; condition: condition And condition { S.And ($1, $3) } | condition Or condition { S.Or ($1, $3) } | Not condition { S.Not $2 } | LParen condition RParen { $2 } | term { S.Term $1 } ; term: Ident { S.Var $1 } | Str { S.Pat (P.compile $1) } | Ident Equal Str { S.Eq ($1, $3) } | Env Equal Str { S.Eq ($1, $3) } | Ident Nequal Str { S.Neq ($1, $3) } | Env Nequal Str { S.Neq ($1, $3) } | Ident Tilde Str { S.Match ($1, P.compile $3) } | Env Tilde Str { S.Match ($1, P.compile $3) } ; %% wyrd-1.4.6/curses/tmk/tmkMain.ml0000644000175000017500000000303012103356100015207 0ustar paulpaulopen TmkStruct exception Exit_run let all_terms = ref [] let try_parse_config_file f () = try let f = open_in f in try let l = Lexing.from_channel f in let r = TmkStyle_p.parse TmkStyle_l.lexeme l in close_in f; r with e -> close_in f; raise e with e -> List.iter prerr_string ["Tmk config: "; f; ": "; Printexc.to_string e]; prerr_newline (); [] let init_raw () = TmkStyle.S.add_config_source (try_parse_config_file "tmkrc"); TmkStyle.S.process_config_sources () let add_terminal t = all_terms := t :: !all_terms let init () = let () = init_raw () in let r = new TmkTerminal.terminal_unique in all_terms := [r]; r let iterate_term (term : TmkWidget.terminal) = term#activate (); let q = term#event_queue in let () = try let k = term#read_key () in if k = 113 then raise Exit_run; if k = -1 then raise Exit; let w = term#current_toplevel () in Queue.add (fun () -> w#signal_toplevel_event#emit (Toplevel.Key k)) q with Exit -> () in let something = ref false in let () = try while true do let t = Queue.take q in t (); something := true done with Queue.Empty -> () in if !something then ( let (x,y) = term#get_cursor () in ignore (Curses.move y x); (*ignore (Curses.refresh ())*) ) let iterate () = List.iter iterate_term !all_terms let run () = try while true do iterate (); Curses.napms 1 done with Exit_run -> () let exit () = List.iter (fun t -> t#exit ()) !all_terms wyrd-1.4.6/curses/tmk/README.tmk0000644000175000017500000000010112103356100014723 0ustar paulpaulNote that the contents of this directory (tmk/) are unmaintained.wyrd-1.4.6/curses/tmk/tmkContainer.ml0000644000175000017500000001637612103356100016266 0ustar paulpaulopen TmkStruct (**************************************************************************************** * La classe Container ****************************************************************************************) let real_class_container = Class.create "Container" [TmkWidget.real_class_widget] class virtual container = object (self) inherit TmkWidget.widget as super val mutable redrawing_children = ([] : TmkWidget.widget list) method is_container = true method queue_redraw () = if not need_redraw then ( super#queue_redraw (); redrawing_children <- []; List.iter (fun c -> c#queue_redraw ()) (self#children ()) ) method redraw_register (w : TmkWidget.widget) = if not need_redraw then ( redrawing_children <- w :: redrawing_children; try self#parent#redraw_register self#coerce with Not_found -> Queue.add self#redraw_deliver self#terminal#event_queue ) method redraw_deliver () = if geometry.Geom.w > 0 && geometry.Geom.h > 0 then ( if need_redraw then super#redraw_deliver () else ( List.iter (fun c -> c#redraw_deliver ()) redrawing_children; redrawing_children <- [] ) ) method add w = self#signal_add_descendant#emit w method remove w = TmkWidget.full_tree_do_post (fun d -> self#signal_remove_descendant#emit d) (w :> TmkWidget.widget) method class_map w = super#class_map w; List.iter (fun c -> c#signal_map#emit w) (self#children ()) method class_set_state s = super#class_set_state s; List.iter (fun c -> c#signal_set_state#emit s) (self#children ()) method class_draw () = super#class_draw (); List.iter (fun c -> c#signal_draw#emit ()) (self#children ()) method class_add_descendant (w : TmkWidget.widget) = try self#parent#signal_add_descendant#emit w with Not_found -> assert false method class_remove_descendant (w : TmkWidget.widget) = try self#parent#signal_remove_descendant#emit w with Not_found -> assert false end (**************************************************************************************** * La classe Bin ****************************************************************************************) let real_class_bin = Class.create "Bin" [real_class_container] class virtual bin = object (self) inherit container as super val mutable child : TmkWidget.widget option = None method children () = match child with | Some w -> [w] | None -> [] method add (w : TmkWidget.widget) = match child with | Some _ -> failwith "bin has already a child" | None -> child <- Some w; self#signal_add_descendant#emit w method remove w = match child with | Some c when c == w -> super#remove w; child <- None | _ -> raise Not_found end (**************************************************************************************** * La classe utilitaire Toplevel ****************************************************************************************) let real_class_toplevel = Class.create "Toplevel" [] class virtual toplevel (term : TmkWidget.terminal) = object (self) val mutable focus = (None : TmkWidget.widget option) method toplevel_pass = function | Toplevel.Give_focus (w : TmkWidget.widget) -> assert w#can_focus; let f = match focus with | None -> assert false | Some f -> f in f#signal_lost_focus#emit (); w#signal_got_focus#emit (); focus <- Some w method set_cursor c = term#set_cursor c method class_add_descendant (w : TmkWidget.widget) = if w#can_focus then ( match focus with | Some _ -> () | None -> focus <- Some w ); term#queue_resize () method class_remove_descendant (w : TmkWidget.widget) = let () = match focus with | Some f when f == w -> focus <- TmkWidget.find_first_focusable w self#coerce; (match focus with | Some f -> w#signal_got_focus#emit () | None -> ()) | _ -> () in term#queue_resize () method class_toplevel_event = function | Toplevel.Activate -> let () = match focus with | None -> () | Some w -> w#signal_got_focus#emit () in () | Toplevel.Desactivate -> () | Toplevel.Key k -> let () = match focus with | None -> () | Some w -> ignore (w#signal_key_event#emit k) in () end (**************************************************************************************** * La classe Window ****************************************************************************************) let real_class_window = Class.create "Window" [real_class_bin; real_class_toplevel] class window (term : TmkWidget.terminal) = object (self) inherit bin as super inherit toplevel term as super_toplevel val mutable child_size = (0,0) val mutable child_scroll = false val mutable child_window = TmkArea.null_window val child_geometry = Geom.null () val mutable left_glue = 0 val mutable right_glue = 0 val mutable top_glue = 0 val mutable bottom_glue = 0 method real_class = real_class_window method parent = raise Not_found method terminal = term method set_glue l r t b = if l < 0 || r < 0 || t < 0 || b < 0 || l + r > 100 || t + b > 100 then invalid_arg "Window#set_glue"; left_glue <- l; right_glue <- r; top_glue <- t; bottom_glue <- b method set_cursor ((x,y) as c) = child_window#set_center x y; super_toplevel#set_cursor (child_window#real_position c) method class_map w = super#class_map w; child_window <- w; let s = self#signal_get_size#emit (0,0) in child_size <- s method class_get_size t = match child with | None -> t | Some c -> c#signal_get_size#emit t method class_set_geometry g = super#class_set_geometry g; match child with | None -> () | Some c -> let (w, h) = child_size in let center g1 g2 ew iw = if iw > ew then (0, ew, iw) else let gt = g1 + g2 in let gc = 100 - gt in let rw = iw + gc * (ew - iw) / 100 in let rx = if gt = 0 then 0 else g1 * (ew - rw) / gt in (rx, rw, rw) in let (vx, vw, cw) = center left_glue right_glue geometry.Geom.w w and (vy, vh, ch) = center top_glue bottom_glue geometry.Geom.h h in let cs = w > geometry.Geom.w || h > geometry.Geom.h in let cg = if cs then ( if child_scroll then ( child_window#set_view vx vy vw vh; child_window#resize cw ch ) else ( let pad = Curses.newpad ch cw in child_window <- new TmkArea.pad pad cw ch; child_window#set_view vx vy vw vh; c#signal_map#emit child_window ); (0, 0, cw, ch) ) else ( if child_scroll then ( child_window#destroy (); child_window <- window_info; c#signal_map#emit child_window ); (vx, vy, cw, ch) ) in Geom.record cg child_geometry; c#signal_set_geometry#emit cg; child_scroll <- cs method class_draw () = Curses.wattrset child_window#window attribute; let y = child_geometry.Geom.y in for i = y to y + child_geometry.Geom.h - 1 do ignore (Curses.wmove child_window#window i child_geometry.Geom.x); Curses.whline child_window#window (32 lor attribute) child_geometry.Geom.w done; super#class_draw () initializer term#add_toplevel self#coerce; attributes.(0) <- Curses.A.standout; attribute <- Curses.A.standout end wyrd-1.4.6/curses/tmk/tmkSignal.ml0000644000175000017500000000157312103356100015552 0ustar paulpaulclass ['a,'b] signal name filter = object (self) val mutable callbacks : (int * ('a -> 'b)) list = [] method emit : 'a -> 'b = function x -> filter x callbacks method connect p f = let rec connect_aux = function | [] -> [p, f] | (ph,_)::_ as q when ph < p -> (p,f)::q | h::t -> h::(connect_aux t) in callbacks <- connect_aux callbacks method disconnect f = let rec disconnect_aux = function | [] -> [] | (_,fh)::t as q when fh == f -> t | h::t -> h::(disconnect_aux t) in callbacks <- disconnect_aux callbacks end module Marshall = struct let rec all_unit a = function | (_,h)::t -> let () = h a in all_unit a t | [] -> () let rec filter a = function | (_,h)::t -> let a = h a in filter a t | [] -> a let rec until_true a = function | (_,h)::t -> (h a) && (until_true a t) | [] -> false end wyrd-1.4.6/curses/tmk/hierarchy.txt0000644000175000017500000000107512103356100016003 0ustar paulpaul/* I know, this hierarchy looks a lot like the one of Gtk+, it is * normal, it is an imitation, because I know it well, and I find it * good, with some exceptions. */ Container * Bin * Window * TODO: border, shadow Menu Dialog Frame * Button * TODO: themable border CheckButton * RadioButton * OptionMenu MenuItem CheckMenuItem RadioMenuItem Notebook Box * HBox * VBox * Table List * Tree Notebook Label * Editable Entry ± Text Range HRange VRange MenuBar Rule * wyrd-1.4.6/curses/tmk/tmkPacking.ml0000644000175000017500000000607212103356100015710 0ustar paulpaulopen TmkStruct type 'a box_element = { mutable base: int; mutable expand: int; element: 'a } let compute_position t l = let (bt, et) = List.fold_left (fun (x,y) e -> (x + e.base, y + e.expand)) (0,0) l in if bt > t then failwith "too small allocation"; let et = if et = 0 then 1 else et in let ep = t - bt in let rec aux xb xe a = function | [] -> [] | h::t -> let a = a + h.expand in let nxe = a * ep / et in ((xb + xe, h.base + nxe - xe) :: (aux (xb + h.base) nxe a t)) in aux 0 0 0 l let real_class_box = Class.create "Box" [TmkContainer.real_class_container] class virtual box parent = object (self) inherit TmkContainer.container as super val mutable children = [] val terminal = parent#terminal method parent = parent method terminal = terminal method children () = let rec aux = function | [] -> [] | { element = None } :: t -> aux t | { element = Some e } :: t -> e :: (aux t) in aux children method add w = children <- children @ [{ base = 0; expand = 0; element = Some w }]; self#signal_add_descendant#emit w method remove w = super#remove w; let rec aux a = function | ({ element = Some c} as h)::t when c == w -> (List.rev a) @ t | h::t -> aux (h::a) t | [] -> raise Not_found in children <- aux [] children method add_glue b e = children <- children @ [{ base = b; expand = e; element = None }] method set_child_expand w e = let aux = function | { element = Some x } -> x == w | _ -> false in let c = List.find aux children in c.expand <- e initializer parent#add self#coerce end let real_class_vbox = Class.create "VBox" [real_class_box] class vbox parent = object (self) inherit box parent as super method real_class = real_class_vbox method class_get_size t = let aux (cw,ch) e = match e.element with | Some w -> let (ew,eh) = w#signal_get_size#emit (0,0) in e.base <- eh; (max cw ew, ch + eh) | None -> (cw, ch + e.base) in List.fold_left aux t children method class_set_geometry ((gx,gy,gw,gh) as g) = super#class_set_geometry g; let ta = compute_position gh children in let aux (y,h) = function | { element = None } -> () | { element = Some w } -> w#signal_set_geometry#emit (gx, gy + y, gw, h) in List.iter2 aux ta children end let real_class_hbox = Class.create "Box" [real_class_box] class hbox parent = object (self) inherit box parent as super method real_class = real_class_hbox method class_get_size t = let aux (cw,ch) e = match e.element with | Some w -> let (ew,eh) = w#signal_get_size#emit (0,0) in e.base <- ew; (cw + ew, max ch eh) | None -> (cw + e.base, ch) in List.fold_left aux t children method class_set_geometry ((gx,gy,gw,gh) as g) = super#class_set_geometry g; let ta = compute_position gw children in let aux (x,l) = function | { element = None } -> () | { element = Some w } -> w#signal_set_geometry#emit (gx + x, gy, l, gh) in List.iter2 aux ta children end wyrd-1.4.6/curses/tmk/tmkrc0000644000175000017500000000030112103356100014316 0ustar paulpaulstyle[all]="FwBl" style[focus]=" window) (* Toplevel window *) class toplevel w = object (self) inherit window as super method window = w method refresh () = ignore (Curses.refresh ()); super#refresh () end (* Pad *) (* TODO: allow to be inside another pad *) class pad p w h = object (self) inherit window as super val mutable w = w val mutable h = h val mutable vx = 0 val mutable vy = 0 val mutable vw = 0 val mutable vh = 0 val mutable px = 0 val mutable py = 0 method window = p method refresh () = ignore (Curses.prefresh p py px vy vx (vy + vh - 1) (vx + vw - 1)); ignore (Curses.refresh ()); super#refresh () method set_view nvx nvy nvw nvh = vx <- nvx; vy <- nvy; vw <- nvw; vh <- nvh method set_center x y = px <- max 0 (min (w - vw) (x - vw / 2)); py <- max 0 (min (h - vh) (y - vh / 2)) method resize nw nh = w <- nw; h <- nh; ignore (Curses.wresize p h w) method real_position (x,y) = (x - px + vx, y - py + vy) method destroy () = ignore (Curses.delwin p) end wyrd-1.4.6/curses/tmk/tmkWidget.ml0000644000175000017500000002054712103356100015562 0ustar paulpaulopen TmkStruct exception Not_container exception Not_toplevel let rec find_next_widget prop prev cur d = let filtrer_direction = match d with | Direction.Previous | Direction.Left | Direction.Up -> List.rev | Direction.Next | Direction.Right | Direction.Down -> (fun x -> x) in let rec find_next_widget_list = function | [] -> None | h::t -> if prop h then Some h else let c = try h#children () with Not_container -> [] in let c = filtrer_direction c in match find_next_widget_list c with | (Some _) as r -> r | None -> find_next_widget_list t in if prop cur then Some cur else let c = filtrer_direction (cur#children ()) in let rec split_list l = function | h::t when h == prev -> (List.rev (h::l), t) | h::t -> split_list (h::l) t | [] -> assert false in let (l,r) = split_list [] c in match find_next_widget_list r with | (Some _) as r -> r | None -> let r = try find_next_widget prop cur cur#parent d with Not_found -> None in match r with | Some _ -> r | None -> find_next_widget_list l (**************************************************************************************** * La classe Widget ****************************************************************************************) let real_class_widget = Class.create "Widget" [] class virtual widget = object (self) val mutable window = Curses.null_window val mutable window_info = TmkArea.null_window val geometry = Geom.null () val mutable state = State.normal val attributes = Array.create (succ State.to_int_max) Curses.A.normal val mutable attribute = Curses.A.normal val mutable name = "" val mutable need_redraw = false val mutable configured = false method virtual real_class : Class.t method virtual parent : widget method virtual terminal : widget TmkTerminal.terminal method can_focus = false method has_focus = State.has_focus state (* Gasp, I don't know how to write that type safely _and_ without writing all the type. *) method coerce = (Obj.magic self : widget) method set_name n = let p = if n = "" then "" else "." ^ n in let q = try (self#parent#name) ^ p with Not_found -> n in name <- q; if n <> "" then self#do_configuration () method name = name method queue_redraw () = if not need_redraw then ( need_redraw <- true; try self#parent#redraw_register self#coerce with Not_found -> Queue.add self#redraw_deliver self#terminal#event_queue ) method redraw_deliver () = if geometry.Geom.w > 0 && geometry.Geom.h > 0 then ( if need_redraw then self#signal_draw#emit (); need_redraw <- false ) method is_container = false method add (w : widget) = (raise Not_container : unit) method remove (w : widget) = (raise Not_container : unit) method children () = (raise Not_container : widget list) method redraw_register (w : widget) = (raise Not_container : unit) method set_variable name subscripts value = match (name, subscripts, value) with | ("style", Some s, TmkStyle.S.Str v) -> let res = self#terminal#resource in let fixer_style n = let v = TmkStyle.C.parse_style_string res attributes.(n) v in attributes.(n) <- v; if n = State.to_int state then attribute <- v in List.iter fixer_style (TmkStyle.C.state_names s) | _ -> prerr_endline ("Unknown variable or illegal use: " ^ name) method do_configuration () = configured <- true; let v = self#terminal#configuration () in let v = TmkStyle.S.relevant_variables (fun _ -> "") name v in let accept_var (n, s, v) = self#set_variable n s v in List.iter accept_var v method toplevel_pass (m : widget Toplevel.m) = self#parent#toplevel_pass m method set_cursor (c : int * int) = (self#parent#set_cursor c : unit) (* Signals *) val signal_map = new TmkSignal.signal "map" TmkSignal.Marshall.all_unit val signal_get_size = new TmkSignal.signal "get_size" TmkSignal.Marshall.filter val signal_set_geometry = new TmkSignal.signal "set_geometry" TmkSignal.Marshall.all_unit val signal_set_state = new TmkSignal.signal "set_state" TmkSignal.Marshall.all_unit val signal_draw = new TmkSignal.signal "draw" TmkSignal.Marshall.all_unit val signal_got_focus = new TmkSignal.signal "got_focus" TmkSignal.Marshall.all_unit val signal_lost_focus = new TmkSignal.signal "lost_focus" TmkSignal.Marshall.all_unit val signal_key_event = new TmkSignal.signal "key_event" TmkSignal.Marshall.until_true val signal_add_descendant = new TmkSignal.signal "add_descendant" TmkSignal.Marshall.all_unit val signal_remove_descendant = new TmkSignal.signal "remove_descendant" TmkSignal.Marshall.all_unit val signal_toplevel_event = new TmkSignal.signal "toplevel_event" TmkSignal.Marshall.all_unit method signal_map = signal_map method signal_get_size = signal_get_size method signal_set_geometry = signal_set_geometry method signal_set_state = signal_set_state method signal_draw = signal_draw method signal_got_focus = signal_got_focus method signal_lost_focus = signal_lost_focus method signal_key_event = signal_key_event method signal_add_descendant = signal_add_descendant method signal_remove_descendant = signal_remove_descendant method signal_toplevel_event = signal_toplevel_event method class_map w = window_info <- w; window <- w#window; if not configured then self#do_configuration () method virtual class_get_size : int * int -> int * int method class_set_geometry g = Geom.record g geometry; self#queue_redraw () method class_set_state s = state <- s; let n = attributes.(State.to_int s) in if n <> attribute then ( attribute <- n; self#queue_redraw () ) method class_draw () = need_redraw <- false method class_got_focus () = assert self#can_focus; self#signal_set_state#emit (State.set_focus state true) method class_lost_focus () = assert self#can_focus; self#signal_set_state#emit (State.set_focus state false) method class_key_event k = let aux d = let w = match find_next_widget (fun w -> w#can_focus) self#coerce (self#parent) d with | None -> assert false | Some w -> w in let () = self#toplevel_pass (Toplevel.Give_focus w) in true in if k = Curses.Key.up then aux Direction.Up else if k = Curses.Key.down then aux Direction.Down else if k = Curses.Key.left then aux Direction.Left else if k = Curses.Key.right then aux Direction.Right else if k = 9 then aux Direction.Next else try self#parent#signal_key_event#emit k with Not_found -> false method class_add_descendant (w : widget) = () method class_remove_descendant (w : widget) = () method class_toplevel_event (e : Toplevel.t) = raise Not_toplevel initializer let p = TmkStyle.R.color_pair_alloc self#terminal#resource 1 4 in attributes.(1) <- (Curses.A.color_pair p) lor Curses.A.bold; self#set_name ""; self#signal_map#connect 101 (fun w -> self#class_map w); self#signal_get_size#connect 101 (fun t -> self#class_get_size t); self#signal_set_geometry#connect 101 (fun g -> self#class_set_geometry g); self#signal_set_state#connect 101 (fun s -> self#class_set_state s); self#signal_draw#connect 101 (fun () -> self#class_draw ()); self#signal_got_focus#connect 101 (fun () -> self#class_got_focus ()); self#signal_lost_focus#connect 101 (fun () -> self#class_lost_focus ()); self#signal_key_event#connect (-1) (fun k -> self#class_key_event k); self#signal_add_descendant#connect 101 (fun w -> self#class_add_descendant w); self#signal_remove_descendant#connect 101 (fun w -> self#class_remove_descendant w); self#signal_toplevel_event#connect 101 (fun e -> self#class_toplevel_event e) end let warning w t = prerr_string w#name; prerr_string ": "; prerr_endline t let rec full_tree_do_post f (w : widget) = if w#is_container then List.iter (full_tree_do_post f) (w#children ()); f w let rec find_first_focusable ex (w : widget) = if w#can_focus then ( if w == ex then None else Some w ) else if w#is_container then let rec aux = function | [] -> None | h::t -> match find_first_focusable ex h with | None -> aux t | s -> s in aux (w#children ()) else None type terminal = widget TmkTerminal.terminal wyrd-1.4.6/curses/tmk/tmkButton.ml0000644000175000017500000001214012103356100015600 0ustar paulpaulopen TmkStruct (**************************************************************************************** * La classe Button ****************************************************************************************) let real_class_button = Class.create "Button" [TmkContainer.real_class_bin] class button parent = object (self) inherit TmkContainer.bin as super val terminal = parent#terminal val mutable left_margin = 1 val mutable right_margin = 1 val mutable draw_sides = true val mutable left_side = 60 val mutable right_side = 62 method real_class = real_class_button method parent = parent method terminal = terminal method can_focus = true method activate () = self#signal_activate#emit () val signal_activate = new TmkSignal.signal "activate" TmkSignal.Marshall.all_unit method signal_activate = signal_activate method class_get_size t = let (w,h) = match child with | None -> (0,0) | Some w -> w#signal_get_size#emit (0,0) in (w + left_margin + right_margin, min h 1) method class_set_geometry g = super#class_set_geometry g; match child with | None -> () | Some w -> w#signal_set_geometry#emit (geometry.Geom.x + left_margin, geometry.Geom.y, geometry.Geom.w - left_margin - right_margin, geometry.Geom.h) method class_draw () = Curses.wattrset window attribute; for i = geometry.Geom.y to geometry.Geom.y + geometry.Geom.h - 1 do ignore (Curses.wmove window i geometry.Geom.x); Curses.whline window 32 geometry.Geom.w done; super#class_draw (); Curses.wattrset window attribute; if draw_sides then ( ignore (Curses.mvwaddch window geometry.Geom.y geometry.Geom.x left_side); ignore (Curses.mvwaddch window geometry.Geom.y (geometry.Geom.x + geometry.Geom.w - 1) right_side) ) method class_got_focus () = super#class_got_focus (); self#set_cursor (succ geometry.Geom.x, geometry.Geom.y) method class_key_event k = if k = 32 || k = 10 then let () = self#activate () in true else super#class_key_event k method class_activate () = () initializer self#signal_activate#connect 101 (fun () -> self#class_activate ()); parent#add self#coerce end (**************************************************************************************** * La classe ToggleButton ****************************************************************************************) let real_class_toggle_button = Class.create "ToggleButton" [real_class_button] class toggle_button parent = object (self) inherit button parent as super val mutable selected = false val mutable mark = 215 method real_class = real_class_toggle_button method selected = selected method set_selected value = let change = value <> selected in selected <- value; self#queue_redraw (); if change then self#signal_toggle#emit value method class_draw () = super#class_draw (); ignore (Curses.wmove window geometry.Geom.y geometry.Geom.x); ignore (Curses.waddch window left_side); ignore (Curses.waddch window (if selected then mark else 32)); ignore (Curses.waddch window right_side) method class_activate () = self#set_selected (not selected) val signal_toggle = new TmkSignal.signal "toggle" TmkSignal.Marshall.all_unit method signal_toggle = signal_toggle method class_toggle (value : bool) = () initializer left_margin <- 4; right_margin <- 0; left_side <- 91; right_side <- 93; draw_sides <- false; self#signal_toggle#connect 101 (fun v -> self#class_toggle v); end (**************************************************************************************** * La classe RadioButton ****************************************************************************************) let real_class_radio_button = Class.create "RadioButton" [real_class_toggle_button] module Radiogroup = struct type 'a t = { mutable current: 'a option; unset: 'a -> unit } let create unset = { current = None; unset = unset } let set group element = match group.current with | None -> group.current <- Some element | Some e when e == element -> () | Some e -> group.unset e; group.current <- Some element let is_empty group = group.current == None type has_set_selected = < set_selected : bool -> unit > let trivial_unset (element : has_set_selected) = element#set_selected false end class radio_button parent group = object (self) inherit toggle_button parent as super val group = match group with | None -> Radiogroup.create Radiogroup.trivial_unset | Some g -> g method real_class = real_class_radio_button method group = group method class_activate () = self#set_selected true method set_selected value = super#set_selected value; if value then Radiogroup.set group (self :> Radiogroup.has_set_selected) initializer left_side <- 40; right_side <- 41; mark <- 42; draw_sides <- false; self#signal_toggle#connect 101 (fun v -> self#class_toggle v); if Radiogroup.is_empty group then self#set_selected true end wyrd-1.4.6/curses/tmk/test.ml0000644000175000017500000000657412103356100014606 0ustar paulpaul(*let t = TmkMain.init ()*) (*let fdi = Unix.openfile "/dev/ttyr0" [Unix.O_RDONLY] 0 and fdo = Unix.openfile "/dev/ttyr0" [Unix.O_WRONLY] 0 let () = TmkMain.init_raw () let t = new TmkTerminal.terminal_from_fd fdi fdo let () = TmkMain.add_terminal t*) (*let t = TmkMain.init ()*) let init term = if term = "" then let t = TmkMain.init () in t else let fdi = Unix.openfile term [Unix.O_RDONLY] 0 and fdo = Unix.openfile term [Unix.O_WRONLY] 0 in TmkMain.init_raw (); let t = new TmkTerminal.terminal_from_fd fdi fdo in TmkMain.add_terminal t; t let create_dialog term text buttons = let w = new TmkContainer.window term in w#set_glue 50 50 40 60; w#set_name "window"; let f = new TmkFrame.frame (w :> TmkContainer.container) "" in f#set_name "frame"; let v = new TmkPacking.vbox f in let aux t = let l = new TmkMisc.label (v :> TmkContainer.container) t in l#set_align 0 0 in List.iter aux text; let r = new TmkFrame.rule (v :> TmkContainer.container) `Horizontal in let h = new TmkPacking.hbox (v :> TmkContainer.container) in let aux t = h#add_glue 1 1; let b = new TmkButton.button (h :> TmkContainer.container) in let l = new TmkMisc.label (b :> TmkContainer.container) t in b#set_name "bouton"; l#set_name "label"; b in let b = List.map aux buttons in let callback () = term#remove_toplevel () in List.iter (fun b -> b#signal_activate#connect 0 callback) b; h#add_glue 1 1; w let create_sample_screen t = let w = new TmkContainer.window t in w#set_name "top"; let v = new TmkPacking.vbox (w :> TmkContainer.container) in v#set_name "box"; let entry = new TmkEntry.entry (v :> TmkContainer.container) in entry#set_name "entry"; for i = 1 to 3 do let t = Printf.sprintf "Label n°%d" i in let b = new TmkButton.button (v :> TmkContainer.container) in b#set_name (Printf.sprintf "l%d" i); let l = new TmkMisc.label (b :> TmkContainer.container) t in l#set_name "label"; v#add_glue 0 2; b#signal_activate#connect 0 (fun () -> prerr_endline t) done; let list = new TmkList.list (v :> TmkContainer.container) 2 in v#set_child_expand (list : #TmkWidget.widget :> TmkWidget.widget) 10; list#set_name "liste"; list#set_multi_selection true; let f l = [| Printf.sprintf "Ligne %d" l; Printf.sprintf "Inverse %d" (1000000 / (succ l))|] in list#insert_lines 0 (Array.init 100 f); list#set_column ~col:0 ~min:1 ~expand:2 ~left:1 ~right:1 ~align:100; list#signal_select_line#connect 0 (fun l -> prerr_endline (string_of_int l); list#delete_lines l 3); let h = new TmkPacking.hbox (v :> TmkContainer.container) in h#set_name "hbox"; v#add_glue 0 4; h#add_glue 0 1; let rec aux i g = let t = Printf.sprintf "Bouton %d" i in let b = new TmkButton.radio_button (h :> TmkContainer.container) g in b#set_name (Printf.sprintf "b%d" i); let l = new TmkMisc.label (b :> TmkContainer.container) t in l#set_name "label"; h#add_glue 0 1; if i < 3 then aux (succ i) (Some b#group) in aux 1 None let main () = let tty = if Array.length Sys.argv < 2 then "" else Sys.argv.(1) in let term = init tty in create_sample_screen term; let dialog = create_dialog term ["This is a simple question to test the dialog."; "With two lines of text."] ["Ok"; "Cancel"; "Help"] in TmkMain.run (); TmkMain.exit () let () = main () wyrd-1.4.6/curses/tmk/tmkList.ml0000644000175000017500000002255212103356100015250 0ustar paulpaulopen TmkStruct (**************************************************************************************** * La classe List ****************************************************************************************) let real_class_list = Class.create "List" [TmkWidget.real_class_widget] type column_width = { mutable min: int; mutable elasticity: int; mutable left_margin: int; mutable right_margin: int; mutable alignment: int; mutable width: int; mutable x: int } let array_insert source target pos length init = let tl = Array.length target and sl = Array.length source in let target = if length + sl <= tl then target else let rec enough t = if t >= length + sl then t else enough (t * 2) in let t = enough (tl * 2) in Array.append target (Array.create (t - tl) init) in Array.blit target pos target (pos + sl) (length - pos); Array.blit source 0 target pos sl; target class list parent columns = object (self) inherit TmkWidget.widget as super val terminal = parent#terminal val widths = Array.init columns (fun _ -> { min = 1; elasticity = 1; left_margin = 0; right_margin = 0; alignment = 0; width = 0; x = 0 }) val mutable total_fixed_width = columns val mutable total_elasticity = columns val mutable lines = Array.create 32 [||] val mutable selection = Array.create 32 false val mutable num_lines = 0 val mutable current_line = -1 val mutable top_line = 0 val mutable scroll_step = 1 val mutable multi_selection = false method real_class = real_class_list method parent = parent method terminal = terminal method can_focus = true method set_multi_selection = function | true -> multi_selection <- true | false -> multi_selection <- true; Array.fill selection 0 (Array.length selection) false; if current_line >= 0 then selection.(current_line) <- true; self#queue_redraw () method set_column ~col ~min ~expand ~left ~right ~align = let width = widths.(col) in total_fixed_width <- total_fixed_width + min + left + right - width.min - width.left_margin - width.right_margin; total_elasticity <- total_elasticity + expand - width.elasticity; width.min <- min; width.elasticity <- expand; width.left_margin <- left; width.right_margin <- right; width.alignment <- align; self#recompute_widths (); self#queue_redraw () method recompute_widths () = let expanding = geometry.Geom.w - total_fixed_width in let rec column i elasticity rigid beam = let width = widths.(i) in let e = elasticity + width.elasticity in let b = expanding * e / total_elasticity in let r = width.min + width.left_margin + width.right_margin in width.width <- width.min + b - beam; width.x <- rigid + beam + width.left_margin; if i < pred columns then column (succ i) e (rigid + r) b in column 0 0 geometry.Geom.x 0 method insert_lines pos more_lines = let pos = if pos < 0 || pos > num_lines then num_lines else pos in let n = Array.length more_lines in for i = 0 to pred n do if Array.length more_lines.(i) < columns then invalid_arg "List#insert_lines: too few columns" done; lines <- array_insert more_lines lines pos num_lines [||]; let more_selection = Array.create n false in selection <- array_insert more_selection selection pos num_lines false; let new_current = if current_line < 0 then 0 else if current_line >= pos then current_line + n else current_line in num_lines <- num_lines + n; self#go_to_line new_current; self#queue_redraw () method append_lines more_lines = self#insert_lines num_lines more_lines method insert_line pos line = self#insert_lines pos [|line|] method append_line line = self#insert_lines num_lines [|line|] method set_variable name subscripts value = match (name, subscripts, value) with | ("scroll_step", None, TmkStyle.S.Int v) -> scroll_step <- v | _ -> super#set_variable name subscripts value method class_get_size _ = (total_fixed_width, 1) method class_set_geometry g = super#class_set_geometry g; self#recompute_widths (); self#realign () method draw_line line = let y = geometry.Geom.y + line - top_line in let line_state = State.set_focus state (State.has_focus state && line = current_line) in let line_state = State.set_selected line_state selection.(line) in let attribute = attributes.(State.to_int line_state) in Curses.wattrset window attribute; ignore (Curses.wmove window y geometry.Geom.x); Curses.whline window 32 geometry.Geom.w; if State.has_focus line_state then self#set_cursor (geometry.Geom.x, y); if line < num_lines then let line = lines.(line) in for i = 0 to pred columns do let string = line.(i) in let length = String.length string in let x_more = widths.(i).width - length in if x_more >= 0 then let x = widths.(i).x + widths.(i).alignment * x_more / 100 in ignore (Curses.mvwaddstr window y x string) else let o = widths.(i).alignment * (-x_more) / 100 in ignore (Curses.mvwaddnstr window y widths.(i).x string o widths.(i).width) done method class_draw () = super#class_draw (); for i = 0 to pred geometry.Geom.h do self#draw_line (top_line + i) done method realign () = if current_line < top_line || current_line >= top_line + geometry.Geom.h then ( top_line <- current_line - geometry.Geom.y / 2; top_line <- max 0 (min (num_lines - geometry.Geom.h) top_line); self#queue_redraw () ) method go_to_line l = let l = max (min l (pred num_lines)) 0 in let emit = l != current_line in let old = if current_line < 0 then l else current_line in current_line <- l; if not multi_selection then ( selection.(old) <- false; selection.(l) <- true ); if geometry.Geom.h > 0 then ( if l >= top_line && l < top_line + geometry.Geom.h then ( self#draw_line old; self#draw_line l ) else ( let t = l - old + top_line in let t = if t < top_line then min t (top_line - scroll_step) else max t (top_line + scroll_step) in let t = max 0 (min (num_lines - geometry.Geom.h) t) in top_line <- t; self#realign (); self#queue_redraw () ) ); self#signal_move_to_line#emit l method set_select_line line value = if not multi_selection then failwith "List#select_line: illegal"; if selection.(line) != value then ( selection.(line) <- value; if value then self#signal_select_line#emit line else self#signal_deselect_line#emit line; self#draw_line line ) method select_line line = self#set_select_line line true method deselect_line line = self#set_select_line line false method current_line = current_line method selected line = selection.(line) method get_line line = lines.(line) method get_lines () = Array.sub lines 0 num_lines method set_line line value = if Array.length value < columns then invalid_arg "List#set_line: too few columns"; lines.(line) <- value; self#draw_line line method delete_lines start num = let stop = start + num in if start < 0 || num <= 0 || stop > num_lines then invalid_arg "List#delete_lines"; Array.blit lines stop lines start (num_lines - stop); Array.blit selection stop selection start (num_lines - stop); num_lines <- num_lines - num; Array.fill lines num_lines num [||]; Array.fill selection num_lines num false; (* TODO: réduire les tableaux *) if current_line >= start then ( let new_line = if current_line >= stop then current_line - num else start in self#realign () ); self#queue_redraw () method class_got_focus () = super#class_got_focus (); self#set_cursor (geometry.Geom.x, geometry.Geom.y + (max current_line 0)) method class_key_event key = if key = 32 || key = 10 && multi_selection && current_line >= 0 then ( self#set_select_line current_line (not selection.(current_line)); true ) else let keys = [ Curses.Key.up, current_line - 1; Curses.Key.down, current_line + 1; Curses.Key.ppage, current_line - geometry.Geom.h; Curses.Key.npage, current_line + geometry.Geom.h; Curses.Key.home, 0; Curses.Key.end_, pred num_lines ] in try let l = List.assoc key keys in if current_line >= 0 then self#go_to_line l; true with Not_found -> super#class_key_event key val signal_select_line = new TmkSignal.signal "select_line" TmkSignal.Marshall.all_unit val signal_deselect_line = new TmkSignal.signal "deselect_line" TmkSignal.Marshall.all_unit val signal_move_to_line = new TmkSignal.signal "move_to_line" TmkSignal.Marshall.all_unit method signal_select_line = signal_select_line method signal_deselect_line = signal_deselect_line method signal_move_to_line = signal_move_to_line method class_select_line line = () method class_deselect_line line = () method class_move_to_line line = () initializer if columns < 1 then invalid_arg "List: too few columns"; self#signal_select_line#connect 101 (fun l -> self#class_select_line l); self#signal_deselect_line#connect 101 (fun l -> self#class_deselect_line l); self#signal_move_to_line#connect 101 (fun l -> self#class_move_to_line l); parent#add self#coerce end wyrd-1.4.6/curses/tmk/Makefile0000644000175000017500000000323312103356100014722 0ustar paulpaulOCAMLC=ocamlc.opt OCFLAGS=-I .. -g OBJECTS=tmkStruct.cmo tmkArea.cmo tmkStyle.cmo tmkStyle_p.cmo tmkStyle_l.cmo \ tmkSignal.cmo tmkTerminal.cmo tmkMain.cmo \ tmkWidget.cmo tmkContainer.cmo tmkPacking.cmo \ tmkMisc.cmo tmkButton.cmo tmkList.cmo tmkEntry.cmo tmkFrame.cmo %.cmi: %.mli $(OCAMLC) $(OCFLAGS) -c $< %.cmo %.cmi: %.ml $(OCAMLC) $(OCFLAGS) -w m -c $< tmk.cma: $(OBJECTS) $(OCAMLC) -a -o $@ $^ tmkSignal.cmo tmkSignal.cmi: tmkStruct.cmo tmkStruct.cmi: tmkArea.cmo tmkArea.cmi: tmkStyle.cmo tmkStyle.cmi: tmkMain.cmo tmkMain.cmi: tmkTerminal.cmi tmkWidget.cmi tmkStyle.cmi tmkStyle_l.cmi tmkStyle_p.cmi tmkTerminal.cmo tmkTerminal.cmi: tmkStruct.cmi tmkArea.cmi tmkStyle.cmi tmkWidget.cmo tmkWidget.cmi: tmkSignal.cmi tmkStruct.cmi tmkArea.cmi tmkStyle.cmi tmkTerminal.cmi tmkContainer.cmo tmkContainer.cmi: tmkStruct.cmi tmkArea.cmi tmkWidget.cmi tmkButton.cmo tmkButton.cmi: tmkContainer.cmi tmkStruct.cmi tmkPacking.cmo tmkPacking.cmi: tmkContainer.cmi tmkStruct.cmi tmkMisc.cmo tmkMisc.cmi: tmkStruct.cmi tmkWidget.cmi tmkList.cmo tmkList.cmi: tmkWidget.cmi tmkStruct.cmi tmkEntry.cmo tmkEntry.cmi: tmkWidget.cmi tmkStruct.cmi tmkFrame.cmo tmkFrame.cmi: tmkContainer.cmi tmkStruct.cmi tmkStyle_p.ml tmkStyle_p.mli: tmkStyle_p.mly ocamlyacc tmkStyle_p.mly tmkStyle_l.ml: tmkStyle_l.mll ocamllex tmkStyle_l.mll tmkStyle_p.cmo: tmkStyle_p.ml tmkStyle_p.cmi tmkStyle_p.cmi: tmkStyle_p.mli tmkStyle.cmi tmkStyle_l.cmo tmkStyle_l.cmi: tmkStyle_l.ml tmkStyle_p.cmi tmkStyle.cmi test: test.ml $(INTERFACES) tmk.cma $(OCAMLC) -g -o test -I .. ../mlcurses.cma -custom \ tmk.cma unix.cma test.ml clean: rm -f *.cmo *.cmi *.cma tmkStyle_p.ml tmkStyle_p.mli tmkStyle_l.ml wyrd-1.4.6/curses/tmk/tmkStruct.ml0000644000175000017500000000362712103356100015623 0ustar paulpaulmodule Geom = struct type t = { mutable x: int; mutable y: int; mutable w: int; mutable h: int; } let null () = { x = 0; y = 0; w = 0; h = 0 } let record (x,y,w,h) g = g.x <- x; g.y <- y; g.w <- w; g.h <- h end module State = struct type t = bool * bool * bool (* focus, selected, sensitive *) let normal : t = (false, false, true) let to_int (f,s,a) = if a then (if f then 1 else if s then 2 else 0) else 3 let to_int_max = 3 let set_focus (_,s,a) f = (f,s,a) let set_selected (f,_,a) s = (f,s,a) let set_sensitive (f,s,_) a = (f,s,a) let has_focus (f,_,_) = f let is_selected (_,s,_) = s let is_sensitive (_,_,a) = a end module Direction = struct type t = | Previous | Next | Left | Right | Up | Down end module Class = struct type t = { name : string; parents : t list } let all_classes = Hashtbl.create 127 let create n p = let c = { name = n; parents = p } in Hashtbl.add all_classes n c; c let get = Hashtbl.find all_classes let rec is_a p c = (c == p) || (List.exists (is_a p) c.parents) end module Toplevel = struct type t = | Activate | Desactivate | Key of int type 'w m = | Give_focus of 'w end module Cache = struct type 'a t = 'a Weak.t * (unit -> 'a) let create f = let t = Weak.create 1 in ((t,f) : _ t) let get ((t,f) : _ t) = match Weak.get t 0 with | Some v -> v | None -> let v = f () in Weak.set t 0 (Some v); v let clear ((t,_) : _ t) = Weak.set t 0 None end module Once = struct type t = { mutable already: bool; queue: (unit -> unit) Queue.t; func: (unit -> unit) } let create q = { already = true; queue = q; func = ignore } let deliver o () = () let add o f = if not o.already then ( o.already <- true; Queue.add (deliver o) o.queue ) end wyrd-1.4.6/curses/tmk/tmkStyle.ml0000644000175000017500000002017512103356100015434 0ustar paulpaulmodule R = struct type t = { can_color: bool; mutable color_init: bool; mutable max_pairs: int; mutable num_pairs: int; mutable pairs: string } let create () = { can_color = Curses.has_colors (); color_init = false; max_pairs = 0; num_pairs = 1; pairs = "" } let can_color r = r.can_color let color_init r = assert r.can_color; if not r.color_init then ( ignore (Curses.start_color ()); r.color_init <- true; r.max_pairs <- min (max (Curses.color_pairs ()) 0) 256; r.pairs <- String.make r.max_pairs '\255' ) let color_pair_alloc r f b = if r.can_color then let () = color_init r in let i = f + b * 8 in let t = int_of_char r.pairs.[i] in if t < r.num_pairs then t else let t = r.num_pairs in let () = r.num_pairs <- succ t in let _ = Curses.init_pair t f b in let () = r.pairs.[i] <- char_of_int t in t else 0 let color_pair_query r p = try let c = String.index r.pairs (char_of_int p) in (c land 7, c lsl 3) with Not_found -> (0,0) end module P = struct type t = (bool * int list) array let star = '*' module CSet = Set.Make (struct type t = char let compare = compare end) let compile m = let l = String.length m in let rec transition at oe ne le fb = if ne + oe = l then (true, if fb = ne then [fb lsl 8] else []) :: at else let c = m.[ne + oe] in if m.[ne + oe] = star then transition at (succ oe) ne [ne] ne else let rec etat cc = function | [] -> if fb < 0 then [] else [fb lsl 8] | he::te -> let c = m.[he + oe] in if CSet.mem c cc then etat cc te else (((succ he) lsl 8) + (int_of_char c)) :: (etat (CSet.add c cc) te) in let rec etats = function | [] -> if fb < 0 then [] else [fb] | h::t -> let r = etats t in if m.[h + oe] = c then (succ h) :: r else r in let tr = etat CSet.empty le in transition ((false, tr) :: at) oe (succ ne) (etats le) fb in let tt = transition [] 0 0 [0] (-1) in let l = List.length tt in let r = Array.create l (false, []) in let rec fill i = function | [] -> () | h::t -> r.(i) <- h; fill (pred i) t in fill (pred l) tt; (r : t) let match_string (cp : t) t = let rec find c = function | [] -> raise Not_found | h::_ when h land 255 = c || h land 255 = 0 -> h lsr 8 | _::t -> find c t in let lt = String.length t in let rec aux e i = let (ete,etr) = cp.(e) in if i = lt then ete else let ne = find (int_of_char t.[i]) etr in aux ne (succ i) in try aux 0 0 with Not_found -> false end module S = struct type configuration = specification list and specification = | Def of string * string list option * value | Sub of condition * configuration and value = | Int of int | Str of string and condition = | And of condition * condition | Or of condition * condition | Not of condition | Term of term and term = | Var of string | Pat of P.t | Eq of string * string | Neq of string * string | Match of string * P.t let config_sources = ref [] let add_config_source s = config_sources := s :: !config_sources let config_tree = ref ([] : configuration) let process_config_sources () = let rec aux a = function | [] -> a | h::t -> let a = (h ()) @ a in aux a t in let t = aux [] (List.rev !config_sources) in config_tree := t let eval_bool_string s = (s <> "" ) && (try int_of_string s <> 0 with Failure "int_of_string" -> true) let check_condition var wid cond = let rec aux = function | And (c1, c2) -> (aux c1) && (aux c2) | Or (c1, c2) -> (aux c1) || (aux c2) | Not c -> not (aux c) | Term (Var v) -> eval_bool_string (var v) | Term (Pat p) -> P.match_string p wid | Term (Eq (v,s)) -> var v = s | Term (Neq (v,s)) -> var v <> s | Term (Match (v,p)) -> P.match_string p (var v) in aux cond let relevant_variables var wid cfg = let rec aux a = function | (Def (v,i,d)) :: t -> aux ((v,i,d) :: a) t | (Sub (c,s)) :: t -> let a = if check_condition var wid c then (aux [] s) @ a else a in aux a t | [] -> List.rev a in aux [] cfg type simplified_condition = | True | False | Cond of condition let simplify_condition var wid cond = let rec aux = function | And (c1, c2) -> (match aux c1 with | True -> aux c2 | False -> False | Cond c1 -> match aux c2 with | True -> Cond c1 | False -> False | Cond c2 -> Cond (And (c1, c2))) | Or (c1, c2) -> (match aux c1 with | False -> aux c2 | True -> True | Cond c1 -> match aux c2 with | False -> Cond c1 | True -> True | Cond c2 -> Cond (Or (c1, c2))) | Not c -> (match aux c with | False -> True | True -> False | c -> c) | Term (Var v) as t -> (match var v with | Some v -> if eval_bool_string v then True else False | None -> Cond t) | Term (Pat p) as t -> (match wid with | Some wid -> if P.match_string p wid then True else False | None -> Cond t) | Term (Eq (v,s)) as t -> (match var v with | Some v -> if v = s then True else False | None -> Cond t) | Term (Neq (v,s)) as t -> (match var v with | Some v -> if v <> s then True else False | None -> Cond t) | Term (Match (v,p)) as t -> (match var v with | Some v -> if P.match_string p v then True else False | None -> Cond t) in aux cond let simplify_configuration var wid cfg = let rec aux a = function | (Sub (c,s)) :: t -> (match simplify_condition var wid c with | True -> aux ((aux [] s) @ a) t | False -> aux a t | Cond c -> aux ((Sub (c, aux [] s)) :: a) t) | h::t -> aux (h::a) t | [] -> List.rev a in aux [] cfg end module C = struct let style_comm m c v = if c then v lor m else v land (lnot m) let style_u = style_comm Curses.A.underline let style_r = style_comm Curses.A.reverse let style_l = style_comm Curses.A.blink let style_g = style_comm Curses.A.bold let style_s = style_comm Curses.A.standout let style_color = function | 'r' -> Curses.Color.red | 'g' -> Curses.Color.green | 'y' -> Curses.Color.yellow | 'l' -> Curses.Color.blue | 'm' -> Curses.Color.magenta | 'c' -> Curses.Color.cyan | 'w' -> Curses.Color.white | _ -> Curses.Color.black let style_f c v = (v land (lnot 0x0F)) lor (style_color c) let style_b c v = (v land (lnot 0xF0)) lor ((style_color c) lsl 4) let encode r a = let f = a land Curses.A.attributes land (lnot Curses.A.color) and p = Curses.A.pair_number a in let (fg,bg) = R.color_pair_query r p in f lor (fg land 7) lor ((bg land 7) lsr 4) let decode r a = let f = a land 0x7FFFFF00 and fg = a land 0x07 and bg = (a land 0x70) lsr 4 in let p = R.color_pair_alloc r fg bg in f lor (Curses.A.color_pair p) let parse_style_string r a f = let a = encode r a in let l = String.length f in let rec aux v i = if i = l then v else let i = succ i in match f.[pred i] with | '<' -> aux a i | 'U' -> aux (style_u true v) i | 'u' -> aux (style_u false v) i | 'R' -> aux (style_r true v) i | 'r' -> aux (style_r false v) i | 'L' -> aux (style_l true v) i | 'l' -> aux (style_l false v) i | 'G' -> aux (style_g true v) i | 'g' -> aux (style_g false v) i | 'S' -> aux (style_s true v) i | 's' -> aux (style_s false v) i | 'F' when i < l -> aux (style_f f.[i] v) (succ i) | 'B' when i < l -> aux (style_b f.[i] v) (succ i) | _ -> aux v i in decode r (aux 0 0) let state_names s = let rec aux a = function | "normal"::t -> aux (0::a) t | "focus"::t -> aux (1::a) t | "selected"::t -> aux (2::a) t | "insensitive"::t -> aux (3::a) t | "all"::t -> [0;1;2;3] | _::t -> aux a t | [] -> a in aux [] s end wyrd-1.4.6/curses/curses.mli0000644000175000017500000005252612103356100014507 0ustar paulpaul(** * Bindings to the ncurses library. * * Beware, all coordinates are passed [y] first, then [x]. * * Functions whose name start with a "w" take as first argument the window the * function applies to. * Functions whose name start with "mv" take as first two arguments the * coordinates [y] and [x] of the point to move the cursor to. For example * [mvaddch y x ch] is the same as [move y x; addch ch]. *) (** Windows. *) type window (** Screens. *) type screen (** Terminals. *) type terminal (** Characters. Usual characters can be converted from/to [chtype] using * [char_of_int] and [int_of_char]. See also [get_acs_codes] for characters * useful for drawing and the [Key] module for special input characters. *) type chtype = int (** Attributes are [lor]ings of flags which are defined in the [A] module. *) type attr_t = int (** A return value. [false] means that an error occured. *) type err = bool (** {2 Initialization functions} *) (** Initialize the curses library. *) val initscr : unit -> window (** Restore the terminal (should be called before exiting). *) val endwin : unit -> unit (** Has [endwin] been called without any subsequent call to [werefresh]? *) val isendwin : unit -> bool (** Create a new terminal. *) val newterm : string -> Unix.file_descr -> Unix.file_descr -> screen (** Switch terminal. *) val set_term : screen -> unit (** Delete a screen. *) val delscreen : screen -> unit val stdscr : unit -> window (** {2 Cursor} *) (** Get the current cursor position. *) val getyx : window -> int * int val getparyx : window -> int * int val getbegyx : window -> int * int val getmaxyx : window -> int * int (** Move the cursor. *) val move : int -> int -> err val wmove : window -> int -> int -> err (** {2 Operations on characters} *) (** Predefined characters. *) module Acs : sig type acs = { ulcorner : chtype; (** Upper left-hand corner (+). *) llcorner : chtype; (** Lower left-hand corner (+). *) urcorner : chtype; (** Upper right-hand corner (+). *) lrcorner : chtype; (** Lower right-hand corner (+). *) ltee : chtype; (** Left tee (+). *) rtee : chtype; (** Tight tee (+). *) btee : chtype; ttee : chtype; hline : chtype; (** Horizontal line (-). *) vline : chtype; (** Vertical line (|). *) plus : chtype; (** Plus (+). *) s1 : chtype; (** Scan line 1 (-). *) s9 : chtype; (** Scan line 9 (_). *) diamond : chtype; (** Diamond (+). *) ckboard : chtype; degree : chtype; (** Degree symbol ('). *) plminus : chtype; (** Plus/minus (#). *) bullet : chtype; larrow : chtype; (** Arrow pointing left (<). *) rarrow : chtype; (** Arrow pointing right (>). *) darrow : chtype; uarrow : chtype; (** Arrow pointing up (^). *) board : chtype; lantern : chtype; block : chtype; (** Solid square block (#). *) s3 : chtype; (** Scan line 3 (-). *) s7 : chtype; (** Scan line 7 (-). *) lequal : chtype; (** Less-than-or-equal-to (<). *) gequal : chtype; (** Greater-or-equal-to (>). *) pi : chtype; (** Greek pi ( * ). *) nequal : chtype; (** Not-equal (!). *) sterling : chtype; (** Pound-Sterling symbol (f). *) } val bssb : acs -> chtype val ssbb : acs -> chtype val bbss : acs -> chtype val sbbs : acs -> chtype val sbss : acs -> chtype val sssb : acs -> chtype val ssbs : acs -> chtype val bsss : acs -> chtype val bsbs : acs -> chtype val sbsb : acs -> chtype val ssss : acs -> chtype end (** Get the predefined characters. *) val get_acs_codes : unit -> Acs.acs (** {3 Displaying characters} *) (** Add a character at the current position, then advance the cursor. *) val addch : chtype -> err val waddch : window -> chtype -> err val mvaddch : int -> int -> chtype -> err val mvwaddch : window -> int -> int -> chtype -> err (** [echochar ch] is equivalent to [addch ch] followed by [refresh ()]. *) val echochar : chtype -> err val wechochar : window -> chtype -> err (** Add a sequence of characters at the current position. See also [addstr]. *) val addchstr : chtype array -> err val waddchstr : window -> chtype array -> err val mvaddchstr : int -> int -> chtype array -> err val mvwaddchstr : window -> int -> int -> chtype array -> err val addchnstr : chtype array -> int -> int -> err val waddchnstr : window -> chtype array -> int -> int -> err val mvaddchnstr : int -> int -> chtype array -> int -> int -> err val mvwaddchnstr : window -> int -> int -> chtype array -> int -> int -> err (** Add a string at the current position. *) val addstr : string -> err val waddstr : window -> string -> err val mvaddstr : int -> int -> string -> err val mvwaddstr : window -> int -> int -> string -> err val addnstr : string -> int -> int -> err val waddnstr : window -> string -> int -> int -> err val mvaddnstr : int -> int -> string -> int -> int -> err val mvwaddnstr : window -> int -> int -> string -> int -> int -> err (** Insert a character before cursor. *) val insch : chtype -> err val winsch : window -> chtype -> err val mvinsch : int -> int -> chtype -> err val mvwinsch : window -> int -> int -> chtype -> err (** Insert a string before cursor. *) val insstr : string -> err val winsstr : window -> string -> err val mvinsstr : int -> int -> string -> err val mvwinsstr : window -> int -> int -> string -> err val insnstr : string -> int -> int -> err val winsnstr : window -> string -> int -> int -> err val mvinsnstr : int -> int -> string -> int -> int -> err val mvwinsnstr : window -> int -> int -> string -> int -> int -> err (** Delete a character. *) val delch : unit -> err val wdelch : window -> err val mvdelch : int -> int -> err val mvwdelch : window -> int -> int -> err (** {3 Attributes} *) (** Attributes. *) module A : sig (** Normal display (no highlight). *) val normal : int val attributes : int (** Bit-mask to extract a character. *) val chartext : int val color : int (** Best highlighting mode of the terminal. *) val standout : int (** Underlining. *) val underline : int (** Reverse video. *) val reverse : int (** Blinking. *) val blink : int (** Half bright. *) val dim : int (** Extra bright or bold. *) val bold : int (** Alternate character set. *) val altcharset : int (** Invisible or blank mode. *) val invis : int (** Protected mode. *) val protect : int val horizontal : int val left : int val low : int val right : int val top : int val vertical : int val combine : int list -> int (** Color-pair number [n]. *) val color_pair : int -> int (** Get the pair number associated with the [color_pair n] attribute. *) val pair_number : int -> int end (** New series of highlight attributes. *) module WA : sig (** Normal display (no highlight). *) val normal : int val attributes : int val chartext : int val color : int (** Best highlighting mode of the terminal. Same as [attron A.standout]. *) val standout : int (** Underlining. *) val underline : int (** Reverse video. *) val reverse : int (** Blinking. *) val blink : int (** Half bright. *) val dim : int (** Extra bright or bold. *) val bold : int (** Alternate character set. *) val altcharset : int val invis : int val protect : int val horizontal : int val left : int val low : int val right : int val top : int val vertical : int val combine : int list -> int val color_pair : int -> int val pair_number : int -> int end (** Turn off the attributes given in argument (see the [A] module). *) val attroff : int -> unit val wattroff : window -> int -> unit (** Turn on the attributes given in argument. *) val attron : int -> unit val wattron : window -> int -> unit (** Set the attributes. *) val attrset : int -> unit val wattrset : window -> int -> unit val standend : unit -> unit val wstandend : window -> unit val standout : unit -> unit val wstandout : window -> unit (** Turn off the attributes given in argument (see the [WA] module). *) val attr_off : attr_t -> unit val wattr_off : window -> attr_t -> unit val attr_on : attr_t -> unit val wattr_on : window -> attr_t -> unit val attr_set : attr_t -> int -> unit val wattr_set : window -> attr_t -> int -> unit (** [chgat n attr color] changes the attributes of [n] characters. *) val chgat : int -> attr_t -> int -> unit val wchgat : window -> int -> attr_t -> int -> unit val mvchgat : int -> int -> int -> attr_t -> int -> unit val mvwchgat : window -> int -> int -> int -> attr_t -> int -> unit (** Get the attributes of the caracter at current position. *) val inch : unit -> chtype val winch : window -> chtype val mvinch : int -> int -> chtype val mvwinch : window -> int -> int -> chtype (** Get the attributes of a sequence of characters. *) val inchstr : chtype array -> err val winchstr : window -> chtype array -> err val mvinchstr : int -> int -> chtype array -> err val mvwinchstr : window -> int -> int -> chtype array -> err val inchnstr : chtype array -> int -> int -> err val winchnstr : window -> chtype array -> int -> int -> err val mvinchnstr : int -> int -> chtype array -> int -> int -> err val mvwinchnstr : window -> int -> int -> chtype array -> int -> int -> err (** Get the attributes of a string. *) val instr : string -> err val winstr : window -> string -> err val mvinstr : int -> int -> string -> err val mvwinstr : window -> int -> int -> string -> err val innstr : string -> int -> int -> err val winnstr : window -> string -> int -> int -> err val mvinnstr : int -> int -> string -> int -> int -> err val mvwinnstr : window -> int -> int -> string -> int -> int -> err (** {3 Background} *) (** Set the background of the current character. *) val bkgdset : chtype -> unit val wbkgdset : window -> chtype -> unit (** Set the background of every character. *) val bkgd : chtype -> unit val wbkgd : window -> chtype -> unit (** Get the current background. *) val getbkgd : window -> chtype (** {3 Operations on lines} *) (** Delete a line. *) val deleteln : unit -> err val wdeleteln : window -> err (** [insdelln n] inserts [n] lines above the current line if [n] is positive or * deletes [-n] lines if [n] is negative. *) val insdelln : int -> err val winsdelln : window -> int -> err (** Insert a blank line above the current line. *) val insertln : unit -> err val winsertln : window -> err (** {3 Characters input} *) (** Special keys. *) module Key : sig val code_yes : int val min : int val break : int val down : int val up : int val left : int val right : int val home : int val backspace : int val f0 : int val dl : int val il : int val dc : int val ic : int val eic : int val clear : int val eos : int val eol : int val sf : int val sr : int val npage : int val ppage : int val stab : int val ctab : int val catab : int val enter : int val sreset : int val reset : int val print : int val ll : int val a1 : int val a3 : int val b2 : int val c1 : int val c3 : int val btab : int val beg : int val cancel : int val close : int val command : int val copy : int val create : int val end_ : int val exit : int val find : int val help : int val mark : int val message : int val move : int val next : int val open_ : int val options : int val previous : int val redo : int val reference : int val refresh : int val replace : int val restart : int val resume : int val save : int val sbeg : int val scancel : int val scommand : int val scopy : int val screate : int val sdc : int val sdl : int val select : int val send : int val seol : int val sexit : int val sfind : int val shelp : int val shome : int val sic : int val sleft : int val smessage : int val smove : int val snext : int val soptions : int val sprevious : int val sprint : int val sredo : int val sreplace : int val sright : int val srsume : int val ssave : int val ssuspend : int val sundo : int val suspend : int val undo : int val mouse : int val resize : int val max : int val f : int -> int end (** Read a character in a window. *) val getch : unit -> int val wgetch : window -> int val mvgetch : int -> int -> int val mvwgetch : window -> int -> int -> int val ungetch : int -> err (** Read a string in a window. *) val getstr : string -> err val wgetstr : window -> string -> err val mvgetstr : int -> int -> string -> err val mvwgetstr : window -> int -> int -> string -> err val getnstr : string -> int -> int -> err val wgetnstr : window -> string -> int -> int -> err val mvgetnstr : int -> int -> string -> int -> int -> err val mvwgetnstr : window -> int -> int -> string -> int -> int -> err (** {2 Windows} *) (** {3 Window manipulations} *) (** [newwin l c y x] create a new window with [l] lines, [c] columns. The upper * left-hand corner is at ([x],[y]). *) val newwin : int -> int -> int -> int -> window (** Delete a window. *) val delwin : window -> err (** Move a window. *) val mvwin : window -> int -> int -> err (** [subwin l c y x] create a subwindow with [l] lines and [c] columns at * screen-relative position ([x],[y]). *) val subwin : window -> int -> int -> int -> int -> window (** Same as [subwin] excepting that the position ([x],[y]) is relative to the * parent window. *) val derwin : window -> int -> int -> int -> int -> window (** Move a derived windw. *) val mvderwin : window -> int -> int -> err (** Duplicate a window. *) val dupwin : window -> window val wsyncup : window -> unit (** If [syncok] is called with [true] as second argument, [wsyncup] is called * automatically whenever there is a change in the window. *) val syncok : window -> bool -> err val wcursyncup : window -> unit val wsyncdown : window -> unit val winch_handler_on : unit -> unit val winch_handler_off : unit -> unit val get_size : unit -> int * int val get_size_fd : Unix.file_descr -> int * int val null_window : window (** {3 Refresh control} *) (** Refresh windows. *) val refresh : unit -> err val wrefresh : window -> err val wnoutrefresh : window -> err val doupdate : unit -> err val redrawwin : window -> err val wredrawln : window -> int -> int -> err val wresize : window -> int -> int -> err val resizeterm : int -> int -> err val scroll : window -> err val scrl : int -> err val wscrl : window -> int -> err val touchwin : window -> err val touchline : window -> int -> int -> err val untouchwin : window -> err val wtouchln : window -> int -> int -> bool -> err val is_linetouched : window -> int -> int val is_wintouched : window -> bool (** Clear a window. *) val erase : unit -> unit val werase : window -> unit val clear : unit -> unit val wclear : window -> unit val clrtobot : unit -> unit val wclrtobot : window -> unit val clrtoeol : unit -> unit val wclrtoeol : window -> unit (** {3 Overlapped windows} *) (** [overlay srcwin dstwin] overlays [srcwin] on top of [dstwin]. *) val overlay : window -> window -> err val overwrite : window -> window -> err val copywin : window -> window -> int -> int -> int -> int -> int -> int -> bool -> err (** {3 Decorations} *) (** Draw a box around the edges of a window. *) val border : chtype -> chtype -> chtype -> chtype -> chtype -> chtype -> chtype -> chtype -> unit val wborder : window -> chtype -> chtype -> chtype -> chtype -> chtype -> chtype -> chtype -> chtype -> unit (** Draw a box. *) val box : window -> chtype -> chtype -> unit (** Draw an horizontal line. *) val hline : chtype -> int -> unit val whline : window -> chtype -> int -> unit val mvhline : int -> int -> chtype -> int -> unit val mvwhline : window -> int -> int -> chtype -> int -> unit (** Draw a vertical line. *) val vline : chtype -> int -> unit val wvline : window -> chtype -> int -> unit val mvvline : int -> int -> chtype -> int -> unit val mvwvline : window -> int -> int -> chtype -> int -> unit (** {3 Pads} *) (** A pad is like a window except that it is not restricted by the screen size, * and is not necessarily associated with a particular part of the screen.*) (** Create a new pad. *) val newpad : int -> int -> window val subpad : window -> int -> int -> int -> int -> window val prefresh : window -> int -> int -> int -> int -> int -> int -> err val pnoutrefresh : window -> int -> int -> int -> int -> int -> int -> err val pechochar : window -> chtype -> err (** {2 Colors} *) (** Colors. *) module Color : sig val black : int val red : int val green : int val yellow : int val blue : int val magenta : int val cyan : int val white : int end val start_color : unit -> err val use_default_colors : unit -> err val init_pair : int -> int -> int -> err val init_color : int -> int -> int -> int -> err val has_colors : unit -> bool val can_change_color : unit -> bool val color_content : int -> int * int * int val pair_content : int -> int * int val colors : unit -> int val color_pairs : unit -> int (** {2 Input/output options} *) (** {3 Input options} *) (** Disable line buffering. *) val cbreak : unit -> err (** Similar to [cbreak] but with delay. *) val halfdelay : int -> err (** Enable line buffering (waits for characters until newline is typed). *) val nocbreak : unit -> err (** Don't echo typed characters. *) val echo : unit -> err (** Echo typed characters. *) val noecho : unit -> err val intrflush : window -> bool -> err val keypad : window -> bool -> err val meta : window -> bool -> err val nodelay : window -> bool -> err val raw : unit -> err val noraw : unit -> err val noqiflush : unit -> unit val qiflush : unit -> unit val notimeout : window -> bool -> err val timeout : int -> unit val wtimeout : window -> int -> unit val typeahead : Unix.file_descr -> err val notypeahead : unit -> err (** {3 Output options} *) (** If called with [true] as second argument, the next call to [wrefresh] with * this window will clear the streen completely and redraw the entire screen * from scratch. *) val clearok : window -> bool -> unit val idlok : window -> bool -> unit val idcok : window -> bool -> unit val immedok : window -> bool -> unit val leaveok : window -> bool -> unit val setscrreg : int -> int -> err val wsetscrreg : window -> int -> int -> err val scrollok : window -> bool -> unit val nl : unit -> unit val nonl : unit -> unit (** {2 Soft-label keys} *) (** Initialize soft labels. *) val slk_init : int -> err val slk_set : int -> string -> int -> err val slk_refresh : unit -> err val slk_noutrefresh : unit -> err val slk_label : int -> string val slk_clear : unit -> err val slk_restore : unit -> err val slk_touch : unit -> err val slk_attron : attr_t -> err val slk_attroff : attr_t -> err val slk_attrset : attr_t -> err (** {2 Mouse} *) (** Sets the mouse mask. *) val mousemask : int -> int * int (** {2 Misc} *) (** Ring a bell. *) val beep : unit -> err (** Flash the screen. *) val flash : unit -> err val unctrl : chtype -> string val keyname : int -> string val filter : unit -> unit val use_env : bool -> unit val putwin : window -> Unix.file_descr -> err val getwin : Unix.file_descr -> window val delay_output : int -> err val flushinp : unit -> unit (** {2 Screen manipulation} *) (** Dump the current screen to a file. *) val scr_dump : string -> err val scr_restore : string -> err val scr_init : string -> err val scr_set : string -> err (** {2 Terminal} *) (** Get the speed of a terminal (in bits per second). *) val baudrate : unit -> int (** Get user's current erase character. *) val erasechar : unit -> char (** Has the terminal insert- and delete-character capabilites? *) val has_ic : unit -> bool (** Has the terminal insert- and delete-line capabilites? *) val has_il : unit -> bool (** Get user's current line kill character. *) val killchar : unit -> char (** Get a description of the terminal. *) val longname : unit -> string val termattrs : unit -> attr_t val termname : unit -> string val tgetent : string -> bool val tgetflag : string -> bool val tgetnum : string -> int val tgetstr : string -> bool val tgoto : string -> int -> int -> string val setupterm : string -> Unix.file_descr -> err val setterm : string -> err val cur_term : unit -> terminal val set_curterm : terminal -> terminal val del_curterm : terminal -> err val restartterm : string -> Unix.file_descr -> err val putp : string -> err val vidattr : chtype -> err val mvcur : int -> int -> int -> int -> err val tigetflag : string -> bool val tigetnum : string -> int val tigetstr : string -> string val tputs : string -> int -> (char -> unit) -> err val vidputs : chtype -> (char -> unit) -> err val tparm : string -> int array -> string val bool_terminfo_variable : int -> string * string * string val num_terminfo_variable : int -> string * string * string val str_terminfo_variable : int -> string * string * string val bool_terminfo_variables : (string, string * string) Hashtbl.t val num_terminfo_variables : (string, string * string) Hashtbl.t val str_terminfo_variables : (string, string * string) Hashtbl.t (** {2 Low-level curses routines} *) (** Save the current terminal modes as the "program" state for use by the * [reser_prog_mod] and [reset_shell_mode] functions. *) val def_prog_mode : unit -> unit val def_shell_mode : unit -> unit val reset_prog_mode : unit -> unit val reset_shell_mode : unit -> unit val resetty : unit -> unit val savetty : unit -> unit val getsyx : unit -> int * int val setsyx : int -> int -> unit val curs_set : int -> err val napms : int -> unit val ripoffline : bool -> unit val get_ripoff : unit -> window * int (** {2 Configuration} *) module Curses_config : sig (** If [Curses] has been linked against a curses library with wide * character support, then [wide_ncurses] is [true]. *) val wide_ncurses : bool end wyrd-1.4.6/curses/config.h.in0000644000175000017500000000411312103356101014511 0ustar paulpaul/* config.h.in. Generated from configure.ac by autoheader. */ /* Defined to pdcurses header file */ #undef CURSES_HEADER /* Defined to ncurses term.h file */ #undef CURSES_TERM_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `resizeterm' function. */ #undef HAVE_RESIZETERM /* Define to 1 if you have the `resize_term' function. */ #undef HAVE_RESIZE_TERM /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IOCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_TERMIOS_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Defined if ncurses library includes wide character support */ #undef HAVE_WIDE_CURSES /* Define to 1 if you have the header file. */ #undef HAVE_WINDOWS_H /* Define to 1 if your C compiler doesn't accept -c and -o together. */ #undef NO_MINUS_C_MINUS_O /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define if this is PDCurses */ #undef PDCURSES /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS wyrd-1.4.6/curses/test.ml0000644000175000017500000000433612103356100014005 0ustar paulpaulopen Curses let () = ripoffline true let w = initscr () let (wd, ncol) = get_ripoff () (*let () = assert (start_color ()) let () = assert (init_pair 1 Color.red Color.white)*) let () = assert (cbreak ()) let () = assert (noecho ()) let () = assert (intrflush w false) let () = assert (keypad w true) let () = for i = 0 to 10 do assert (mvaddch i (i * 2) (A.color_pair 1 + 111)) done let () = border 0 0 0 0 0 0 0 0 let () = wborder w 0 0 0 0 0 0 0 0 let () = assert (refresh ()) let (c1, c2) = mousemask (-1) let () = assert (mvaddstr 3 1 "Bonjour") let () = assert (mvaddstr 4 2 (string_of_int c1)) let () = assert (mvaddstr 5 2 (string_of_int c2)) let t = Array.init 50 (fun x -> 64 + x) let () = assert (addchnstr t 10 3) let () = assert (mvaddnstr 8 40 "Bonjour" 1 3) let () = assert (mvinsstr 8 40 "toto ") let t = [|0; 0; 0; 0 |] let () = assert (inchnstr t 0 3) let () = try winch_handler_on () with Invalid_argument "winch_handler_on" -> () let () = try let kup = tigetstr "kcuu1" in assert (addstr kup) with Failure "tigetstr" -> () let acs = get_acs_codes () let () = assert (addch acs.Acs.ulcorner) let i = getch () let (nc, np, can) = (colors (), color_pairs (), can_change_color ()) let (c1, c2) = pair_content 1 let l = ref [] let () = assert (tputs "totoping" 1 (fun c -> l := (int_of_char c) :: !l)) let (tr, tc) = get_size () let () = endwin () let () = Array.iter (fun x -> print_int x; print_newline ()) t let () = print_string "key="; print_int i; print_newline () let () = print_int tr; print_string " "; print_int tc; print_newline () let () = print_int nc; print_string " " let () = print_int np; print_string " " let () = print_string (if can then "oui" else "non"); print_newline () let () = print_int c1; print_string " " let () = print_int c2; print_newline () let () = print_int ncol; print_newline () let () = List.iter (fun x -> print_int x; print_string " ") !l; print_newline () (*let i = ref 0 let () = while let (a, b, c) = str_terminfo_variable !i in (a <> "") && (print_string (a ^ "\t" ^ b ^ "\t" ^ c); print_newline (); true) do i := !i + 1 done*) (*let () = Hashtbl.iter (fun a (b,c) -> print_string (a ^ "\t" ^ b ^ "\t" ^ c); print_newline ()) str_terminfo_variables*) wyrd-1.4.6/curses/COPYING0000644000175000017500000006347612103356100013541 0ustar paulpaul GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! wyrd-1.4.6/curses/configure.ac0000644000175000017500000001050512103356100014755 0ustar paulpaul############################################################################ # configure.ac # # Build configuration script for OCaml curses bindings. # # History: # # 2008-04-08 pjp Derived from Wyrd 1.4.4 build system. ############################################################################ # Check for a particular file from the source tree AC_INIT(config.ml.in) # optional arguments AC_ARG_ENABLE(widec, [ --enable-widec link against a wide-character-enabled ncurses)], [try_widec=$enable_widec], [try_widec=no]) # Find a C compiler AC_PROG_CC AC_PROG_CC_C_O AC_PROG_RANLIB ORIG_LIBS="$LIBS" ORIG_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CURSES_INCLUDE $ORIG_CPPFLAGS" # Non-required headers. AC_CHECK_HEADERS([termios.h sys/ioctl.h windows.h]) # Check for ncurses, and test a number of different locations for the header AC_MSG_CHECKING(for working ncurses library) if test "$try_widec" != "no" then LIBS="-lncursesw $ORIG_LIBS" AC_TRY_LINK( [#include ], [initscr(); use_default_colors()], [CURSES_LIB=-lncursesw AC_DEFINE(CURSES_HEADER, , [Defined to ncurses header file])]) fi if test -z "$CURSES_LIB" then LIBS="-lncurses $ORIG_LIBS" AC_TRY_LINK( [#include ], [initscr(); use_default_colors()], [CURSES_LIB=-lncurses AC_DEFINE(CURSES_HEADER, , [Defined to ncurses header file])], [ LIBS="-lncurses $ORIG_LIBS" AC_TRY_LINK( [#include ], [initscr(); use_default_colors()], [CURSES_LIB=-lncurses AC_DEFINE(CURSES_HEADER, , [Defined to ncurses header file])], [ LIBS="-lcurses $ORIG_LIBS" AC_TRY_LINK( [#include ], [initscr(); use_default_colors()], [CURSES_LIB=-lcurses AC_DEFINE(CURSES_HEADER, , [Defined to ncurses header file])], [ LIBS="-lncurses $ORIG_LIBS" AC_TRY_LINK( [#include ], [initscr(); use_default_colors()], [CURSES_LIB=-lcurses AC_DEFINE(CURSES_HEADER, , [Defined to ncurses header file])], [ LIBS="-lpdcurses $ORIG_LIBS" AC_TRY_LINK( [#include ], [initscr(); use_default_colors()], [CURSES_LIB=-lpdcurses AC_DEFINE(PDCURSES, 1, [Define if this is PDCurses]) AC_DEFINE(CURSES_HEADER, , [Defined to pdcurses header file])], ) ]) ]) ]) ]) fi if test -n "$CURSES_LIB" then AC_MSG_RESULT([found in $CURSES_LIB]) else AC_MSG_ERROR([not found]) fi # Try to locate term.h, which has a sadly nonstandardized location AC_MSG_CHECKING(for term.h) AC_TRY_COMPILE( [#include ], [TERMINAL __dummy], [TERM_H_STRING="" AC_DEFINE(CURSES_TERM_H, , [Defined to ncurses term.h file])], [ AC_TRY_COMPILE( [#include ], [TERMINAL __dummy], [TERM_H_STRING="" AC_DEFINE(CURSES_TERM_H, , [Defined to ncurses term.h file])], [ AC_TRY_COMPILE( [#include ], [TERMINAL __dummy], [TERM_H_STRING="" AC_DEFINE(CURSES_TERM_H, , [Defined to ncurses term.h file])], ) ]) ]) if test -n "$TERM_H_STRING" then AC_MSG_RESULT([found in $TERM_H_STRING]) else AC_MSG_ERROR([not found]) fi # Determine whether the detected curses has wide character support BOOL_WIDE_CURSES="false" if test -n "$CURSES_LIB" then LIBS="$CURSES_LIB $ORIG_LIBS" if test "$try_widec" != "no" then AC_MSG_CHECKING(for wide character support in ncurses library) AC_TRY_LINK( [#include #include CURSES_HEADER ], [wchar_t wch = 0; addnwstr(&wch, 1);], [AC_MSG_RESULT(yes) AC_DEFINE(HAVE_WIDE_CURSES, 1, [Defined if ncurses library includes wide character support]) BOOL_WIDE_CURSES="true"], [AC_MSG_RESULT(no)]) fi fi # Look for some functions which aren't found in all # curses implementations, eg. PDCurses. These are # optional: we will substitute them where we can. AC_CHECK_FUNCS([resizeterm resize_term]) CURSES_LIB_BASE=`expr "$CURSES_LIB" : '-l\(.*\)'` CPPFLAGS="$ORIG_CPPFLAGS" LIBS="$ORIG_LIBS" # Perform substitutions AC_SUBST(CURSES_HEADER) AC_SUBST(CURSES_TERM_H) AC_SUBST(CURSES_LIB) AC_SUBST(CURSES_LIB_BASE) AC_SUBST(BOOL_WIDE_CURSES) AC_SUBST(DEFS) AC_SUBST(CC) AC_SUBST(CFLAGS) AC_SUBST(CPPFLAGS) AC_SUBST(LDFLAGS) # Generate the Makefile and config module AC_CONFIG_HEADERS([config.h]) AC_CONFIG_FILES(Makefile config.ml) AC_OUTPUT chmod a-w Makefile wyrd-1.4.6/curses/keys.ml0000644000175000017500000000323712103356100014000 0ustar paulpaullet code_yes = 0o400 let min = 0o401 let break = 0o401 let down = 0o402 let up = 0o403 let left = 0o404 let right = 0o405 let home = 0o406 let backspace = 0o407 let f0 = 0o410 let dl = 0o510 let il = 0o511 let dc = 0o512 let ic = 0o513 let eic = 0o514 let clear = 0o515 let eos = 0o516 let eol = 0o517 let sf = 0o520 let sr = 0o521 let npage = 0o522 let ppage = 0o523 let stab = 0o524 let ctab = 0o525 let catab = 0o526 let enter = 0o527 let sreset = 0o530 let reset = 0o531 let print = 0o532 let ll = 0o533 let a1 = 0o534 let a3 = 0o535 let b2 = 0o536 let c1 = 0o537 let c3 = 0o540 let btab = 0o541 let beg = 0o542 let cancel = 0o543 let close = 0o544 let command = 0o545 let copy = 0o546 let create = 0o547 let end_ = 0o550 let exit = 0o551 let find = 0o552 let help = 0o553 let mark = 0o554 let message = 0o555 let move = 0o556 let next = 0o557 let open_ = 0o560 let options = 0o561 let previous = 0o562 let redo = 0o563 let reference = 0o564 let refresh = 0o565 let replace = 0o566 let restart = 0o567 let resume = 0o570 let save = 0o571 let sbeg = 0o572 let scancel = 0o573 let scommand = 0o574 let scopy = 0o575 let screate = 0o576 let sdc = 0o577 let sdl = 0o600 let select = 0o601 let send = 0o602 let seol = 0o603 let sexit = 0o604 let sfind = 0o605 let shelp = 0o606 let shome = 0o607 let sic = 0o610 let sleft = 0o611 let smessage = 0o612 let smove = 0o613 let snext = 0o614 let soptions = 0o615 let sprevious = 0o616 let sprint = 0o617 let sredo = 0o620 let sreplace = 0o621 let sright = 0o622 let srsume = 0o623 let ssave = 0o624 let ssuspend = 0o625 let sundo = 0o626 let suspend = 0o627 let undo = 0o630 let mouse = 0o631 let resize = 0o632 let max = 0o777 wyrd-1.4.6/curses/config.ml.in0000644000175000017500000000205312103356100014672 0ustar paulpaul(*************************************************************************** * OCaml Curses -- configuration information * Copyright (C) 2008 Paul Pelzl * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ***************************************************************************) (* Did we compile with ncurses wide char support? *) let wide_ncurses = @BOOL_WIDE_CURSES@ wyrd-1.4.6/curses/MANIFEST0000644000175000017500000000076112103356100013623 0ustar paulpaulCHANGES config.ml.in configure.ac COPYING Makefile.in MANIFEST META.in curses.ml curses.mli functions.c keys.ml ml_curses.c ncurses.txt OCamlMakefile test.ml tmk/Makefile tmk/README.tmk tmk/hierarchy.txt tmk/test.ml tmk/tmkArea.ml tmk/tmkButton.ml tmk/tmkContainer.ml tmk/tmkEntry.ml tmk/tmkFrame.ml tmk/tmkList.ml tmk/tmkMain.ml tmk/tmkMisc.ml tmk/tmkPacking.ml tmk/tmkrc tmk/tmkSignal.ml tmk/tmkStruct.ml tmk/tmkStyle_l.mll tmk/tmkStyle.ml tmk/tmkStyle_p.mly tmk/tmkTerminal.ml tmk/tmkWidget.ml wyrd-1.4.6/curses/debian/0000755000175000017500000000000012103356101013711 5ustar paulpaulwyrd-1.4.6/curses/debian/libcurses-ocaml-dev.install.in0000644000175000017500000000016512103356100021547 0ustar paulpaul@OCamlStdlibDir@/curses/META @OCamlStdlibDir@/curses/*.a @OCamlStdlibDir@/curses/*.cm* @OCamlStdlibDir@/curses/*.ml* wyrd-1.4.6/curses/debian/patches/0000755000175000017500000000000012103356101015340 5ustar paulpaulwyrd-1.4.6/curses/debian/patches/00list0000644000175000017500000000001512103356100016371 0ustar paulpaulrun_autoconf wyrd-1.4.6/curses/debian/patches/run_autoconf.dpatch0000644000175000017500000045245612103356100021246 0ustar paulpaul#! /bin/sh /usr/share/dpatch/dpatch-run ## run_autoconf.dpatch by Sylvain Le Gall ## ## All lines beginning with `## DP:' are a description of the patch. ## DP: No description. @DPATCH@ diff -urNad ocaml-curses~/config.h.in ocaml-curses/config.h.in --- ocaml-curses~/config.h.in 1970-01-01 00:00:00.000000000 +0000 +++ ocaml-curses/config.h.in 2009-12-16 23:40:18.253476530 +0000 @@ -0,0 +1,79 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Defined to pdcurses header file */ +#undef CURSES_HEADER + +/* Defined to ncurses term.h file */ +#undef CURSES_TERM_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `resizeterm' function. */ +#undef HAVE_RESIZETERM + +/* Define to 1 if you have the `resize_term' function. */ +#undef HAVE_RESIZE_TERM + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_IOCTL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_TERMIOS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Defined if ncurses library includes wide character support */ +#undef HAVE_WIDE_CURSES + +/* Define to 1 if you have the header file. */ +#undef HAVE_WINDOWS_H + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +#undef NO_MINUS_C_MINUS_O + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define if this is PDCurses */ +#undef PDCURSES + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS diff -urNad ocaml-curses~/configure ocaml-curses/configure --- ocaml-curses~/configure 1970-01-01 00:00:00.000000000 +0000 +++ ocaml-curses/configure 2009-12-16 23:40:11.773540312 +0000 @@ -0,0 +1,5056 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.65. +# +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + # We cannot yet assume a decent shell, so we have to provide a + # neutralization value for shells without unset; and this also + # works around shells that cannot unset nonexistent variables. + BASH_ENV=/dev/null + ENV=/dev/null + (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error ERROR [LINENO LOG_FD] +# --------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with status $?, using 1 if that was 0. +as_fn_error () +{ + as_status=$?; test $as_status -eq 0 && as_status=1 + if test "$3"; then + as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + fi + $as_echo "$as_me: error: $1" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= +PACKAGE_URL= + +ac_unique_file="config.ml.in" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='LTLIBOBJS +LIBOBJS +BOOL_WIDE_CURSES +CURSES_LIB_BASE +CURSES_LIB +CURSES_TERM_H +CURSES_HEADER +EGREP +GREP +CPP +RANLIB +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_widec +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information." + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures this package to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-widec link against a wide-character-enabled ncurses) + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to the package provider. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +configure +generated by GNU Autoconf 2.65 + +Copyright (C) 2009 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_func +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by $as_me, which was +generated by GNU Autoconf 2.65. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------------- ## +## File substitutions. ## +## ------------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + ac_site_file1=$CONFIG_SITE +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +# optional arguments + +# Check whether --enable-widec was given. +if test "${enable_widec+set}" = set; then : + enableval=$enable_widec; try_widec=$enable_widec +else + try_widec=no +fi + + + +# Find a C compiler + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "no acceptable C compiler found in \$PATH +See \`config.log' for more details." "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "C compiler cannot create executables +See \`config.log' for more details." "$LINENO" 5; }; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if test "${ac_cv_objext+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "cannot compute suffix of object files: cannot compile +See \`config.log' for more details." "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +if test "x$CC" != xcc; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 +$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 +$as_echo_n "checking whether cc understands -c and -o together... " >&6; } +fi +set dummy $CC; ac_cc=`$as_echo "$2" | + sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +if { as_var=ac_cv_prog_cc_${ac_cc}_c_o; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +# Make sure it works both with $CC and with simple cc. +# We do the test twice because some compilers refuse to overwrite an +# existing .o file with -o, though they will create one. +ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' +rm -f conftest2.* +if { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && + test -f conftest2.$ac_objext && { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; +then + eval ac_cv_prog_cc_${ac_cc}_c_o=yes + if test "x$CC" != xcc; then + # Test first that cc exists at all. + if { ac_try='cc -c conftest.$ac_ext >&5' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' + rm -f conftest2.* + if { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && + test -f conftest2.$ac_objext && { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; + then + # cc works too. + : + else + # cc exists but doesn't like -o. + eval ac_cv_prog_cc_${ac_cc}_c_o=no + fi + fi + fi +else + eval ac_cv_prog_cc_${ac_cc}_c_o=no +fi +rm -f core conftest* + +fi +if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +$as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h + +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_RANLIB+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + + +ORIG_LIBS="$LIBS" +ORIG_CPPFLAGS="$CPPFLAGS" +CPPFLAGS="$CURSES_INCLUDE $ORIG_CPPFLAGS" + +# Non-required headers. + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if test "${ac_cv_path_GREP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if test "${ac_cv_path_EGREP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in termios.h sys/ioctl.h windows.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +# Check for ncurses, and test a number of different locations for the header + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working ncurses library" >&5 +$as_echo_n "checking for working ncurses library... " >&6; } + +if test "$try_widec" != "no" +then +LIBS="-lncursesw $ORIG_LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +initscr(); use_default_colors() + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + CURSES_LIB=-lncursesw + +$as_echo "#define CURSES_HEADER " >>confdefs.h + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi + +if test -z "$CURSES_LIB" +then +LIBS="-lncurses $ORIG_LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +initscr(); use_default_colors() + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + CURSES_LIB=-lncurses + +$as_echo "#define CURSES_HEADER " >>confdefs.h + +else + +LIBS="-lncurses $ORIG_LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +initscr(); use_default_colors() + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + CURSES_LIB=-lncurses + +$as_echo "#define CURSES_HEADER " >>confdefs.h + +else + +LIBS="-lcurses $ORIG_LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +initscr(); use_default_colors() + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + CURSES_LIB=-lcurses + +$as_echo "#define CURSES_HEADER " >>confdefs.h + +else + +LIBS="-lncurses $ORIG_LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +initscr(); use_default_colors() + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + CURSES_LIB=-lcurses + +$as_echo "#define CURSES_HEADER " >>confdefs.h + +else + +LIBS="-lpdcurses $ORIG_LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +initscr(); use_default_colors() + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + CURSES_LIB=-lpdcurses + +$as_echo "#define PDCURSES 1" >>confdefs.h + + +$as_echo "#define CURSES_HEADER " >>confdefs.h + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi + +if test -n "$CURSES_LIB" +then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: found in $CURSES_LIB" >&5 +$as_echo "found in $CURSES_LIB" >&6; } +else +as_fn_error "not found" "$LINENO" 5 +fi + +# Try to locate term.h, which has a sadly nonstandardized location + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for term.h" >&5 +$as_echo_n "checking for term.h... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +TERMINAL __dummy + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + TERM_H_STRING="" + +$as_echo "#define CURSES_TERM_H " >>confdefs.h + +else + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +TERMINAL __dummy + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + TERM_H_STRING="" + +$as_echo "#define CURSES_TERM_H " >>confdefs.h + +else + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +TERMINAL __dummy + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + TERM_H_STRING="" + +$as_echo "#define CURSES_TERM_H " >>confdefs.h + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test -n "$TERM_H_STRING" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: found in $TERM_H_STRING" >&5 +$as_echo "found in $TERM_H_STRING" >&6; } +else + as_fn_error "not found" "$LINENO" 5 +fi + + +# Determine whether the detected curses has wide character support + +BOOL_WIDE_CURSES="false" +if test -n "$CURSES_LIB" +then + LIBS="$CURSES_LIB $ORIG_LIBS" + + if test "$try_widec" != "no" + then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wide character support in ncurses library" >&5 +$as_echo_n "checking for wide character support in ncurses library... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include CURSES_HEADER + +int +main () +{ +wchar_t wch = 0; + addnwstr(&wch, 1); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +$as_echo "#define HAVE_WIDE_CURSES 1" >>confdefs.h + + BOOL_WIDE_CURSES="true" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + fi +fi + +# Look for some functions which aren't found in all +# curses implementations, eg. PDCurses. These are +# optional: we will substitute them where we can. + +for ac_func in resizeterm resize_term +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +CURSES_LIB_BASE=`expr "$CURSES_LIB" : '-l\(.*\)'` +CPPFLAGS="$ORIG_CPPFLAGS" +LIBS="$ORIG_LIBS" + + +# Perform substitutions + + + + + + + + + + + + +# Generate the Makefile and config module + +ac_config_headers="$ac_config_headers config.h" + +ac_config_files="$ac_config_files Makefile config.ml" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: ${CONFIG_STATUS=./config.status} +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error ERROR [LINENO LOG_FD] +# --------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with status $?, using 1 if that was 0. +as_fn_error () +{ + as_status=$?; test $as_status -eq 0 && as_status=1 + if test "$3"; then + as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + fi + $as_echo "$as_me: error: $1" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by $as_me, which was +generated by GNU Autoconf 2.65. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Report bugs to the package provider." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.65, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2009 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "config.ml") CONFIG_FILES="$CONFIG_FILES config.ml" ;; + + *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || as_fn_error "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_t=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_t"; then + break + elif $ac_last_try; then + as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&2;} + + rm -f "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error "could not create -" "$LINENO" 5 + fi + ;; + + + esac + +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit $? +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + +chmod a-w Makefile + + + wyrd-1.4.6/curses/debian/watch0000644000175000017500000000014312103356100014737 0ustar paulpaulversion=3 http://download.savannah.nongnu.org/releases/ocaml-tmk/ocaml-curses-([0-9\.]*)\.tar\.gz wyrd-1.4.6/curses/debian/compat0000644000175000017500000000000212103356100015106 0ustar paulpaul7 wyrd-1.4.6/curses/debian/libcurses-ocaml-dev.doc-base0000644000175000017500000000044412103356100021151 0ustar paulpaulDocument: libcurses-ocaml-dev-ocamldoc-api-reference Title: OCaml-curses API Reference Abstract: API reference manual for libcurses-ocaml-dev Section: Programming/OCaml Format: HTML Index: /usr/share/doc/libcurses-ocaml-dev/html/index.html Files: /usr/share/doc/libcurses-ocaml-dev/html/* wyrd-1.4.6/curses/debian/rules0000755000175000017500000000243512103356100014774 0ustar paulpaul#!/usr/bin/make -f # Sample debian/rules that uses debhelper. # GNU copyright 1997 to 1999 by Joey Hess. # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 include /usr/share/ocaml/ocamlvars.mk include /usr/share/ocaml/ocamlinit.mk include /usr/share/dpatch/dpatch.make DESTDIR = $(CURDIR)/debian/tmp/$(OCAML_STDLIB_DIR) MYCFLAGS = "-O2 -g -fPIC -DHAVE_CONFIG_H" build: patch ocamlinit build-stamp build-stamp: dh_testdir chmod +x configure ./configure $(MAKE) CFLAGS=$(MYCFLAGS) byte ifneq ($(OCAML_OPT_ARCH),) $(MAKE) CFLAGS=$(MYCFLAGS) opt endif $(MAKE) htdoc touch build-stamp clean: unpatch ocamlinit-clean dh_testdir dh_testroot rm -f build-stamp if test -f Makefile; then $(MAKE) distclean; fi dh_clean install: build dh_testdir dh_testroot dh_prep dh_installdirs mkdir -p $(DESTDIR) $(MAKE) install OCAMLFIND_DESTDIR=$(DESTDIR) OCAMLFIND_LDCONF=ignore binary-arch: build install dh_testdir dh_testroot dh_installchangelogs CHANGES dh_installdocs dh_installexamples dh_install --list-missing dh_link dh_strip dh_compress dh_fixperms dh_makeshlibs dh_installdeb dh_shlibdeps dh_ocaml dh_gencontrol dh_md5sums dh_builddeb binary-indep: binary: binary-arch .PHONY: build clean binary-indep binary-arch binary install ocamlinit patch unpatch wyrd-1.4.6/curses/debian/libcurses-ocaml-dev.docs0000644000175000017500000000002012103356100020412 0ustar paulpauldoc/curses/html wyrd-1.4.6/curses/debian/clean0000644000175000017500000000001612103356100014712 0ustar paulpaulMETA config.h wyrd-1.4.6/curses/debian/README.source0000644000175000017500000000274312103356100016075 0ustar paulpaulThis package uses dpatch to manage all modifications to the upstream source. Changes are stored in the source package as diffs in debian/patches and applied during the build. To get the fully patched source after unpacking the source package, cd to the root level of the source package and run: debian/rules patch Removing a patch is as simple as removing its entry from the debian/patches/00list file, and please also remove the patch file itself. Creating a new patch is done with "dpatch-edit-patch patch XX_patchname" where you should replace XX with a new number and patchname with a descriptive shortname of the patch. You can then simply edit all the files your patch wants to edit, and then simply "exit 0" from the shell to actually create the patch file. To tweak an already existing patch, call "dpatch-edit-patch XX_patchname" and replace XX_patchname with the actual filename from debian/patches you want to use. To clean up afterwards again, "debian/rules unpatch" will do the work for you - or you can of course choose to call "fakeroot debian/rules clean" all together. --- this documentation is part of dpatch package, and may be used by packages using dpatch to comply with policy on README.source. This documentation is meant to be useful to users who are not proficient in dpatch in doing work with dpatch-based packages. Please send any improvements to the BTS of dpatch package. original text by Gerfried Fuchs, edited by Junichi Uekawa 10 Aug 2008. wyrd-1.4.6/curses/debian/control0000644000175000017500000000264612103356100015323 0ustar paulpaulSource: ocaml-curses Section: ocaml Priority: optional Maintainer: Debian OCaml Maintainers Uploaders: Samuel Mimram , Sylvain Le Gall Build-Depends: debhelper (>= 7), dpkg-dev (>= 1.13.19), libncurses5-dev, ocaml-nox (>= 3.11), dh-ocaml (>= 0.9.1), ocaml-findlib (>= 1.2.4), dpatch Standards-Version: 3.8.3 Homepage: http://www.nongnu.org/ocaml-tmk/ Vcs-Git: git://git.debian.org/git/pkg-ocaml-maint/packages/ocaml-curses.git Vcs-Browser: http://git.debian.org/?p=pkg-ocaml-maint/packages/ocaml-curses.git Package: libcurses-ocaml Architecture: any Depends: ${ocaml:Depends}, ${shlibs:Depends} Provides: ${ocaml:Provides} Description: OCaml bindings for the ncurses library The ncurses library provides functions to create rich text-mode interfaces. This package contains the necessary files to use the ncurses library in OCaml. . This package contains only the shared runtime stub libraries. Package: libcurses-ocaml-dev Architecture: any Depends: ${ocaml:Depends}, libncurses5-dev, libcurses-ocaml (= ${binary:Version}) Provides: ${ocaml:Provides} Description: OCaml bindings for the ncurses library The ncurses library provides functions to create rich text-mode interfaces. This package contains the necessary files to use the ncurses library in OCaml. . This package contains all the development stuff you need to use ocaml-curses in your programs. wyrd-1.4.6/curses/debian/copyright0000644000175000017500000000241512103356100015645 0ustar paulpaulThis package was debianized by Samuel Mimram on Sun, 26 Aug 2007 21:27:14 +0200. It was downloaded from http://www.nongnu.org/ocaml-tmk/ Upstream Authors: Nicolas George, Richard Jones Copyright (c) 2003-2007 Nicolas George, Richard Jones. License: This package is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This package is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this package; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA On Debian systems, the complete text of the GNU Lesser General Public License can be found in `/usr/share/common-licenses/LGPL'. The Debian packaging is (C) 2007, Samuel Mimram and is licensed under the GPL, see `/usr/share/common-licenses/GPL'. wyrd-1.4.6/curses/debian/libcurses-ocaml.install.in0000644000175000017500000000007112103356100020767 0ustar paulpaul@OCamlStdlibDir@/curses/dllcurses_stubs.so @OCamlDllDir@ wyrd-1.4.6/curses/debian/gbp.conf0000644000175000017500000000003612103356100015326 0ustar paulpaul[DEFAULT] pristine-tar = True wyrd-1.4.6/curses/debian/changelog0000644000175000017500000000335612103356100015571 0ustar paulpaulocaml-curses (1.0.3-1build1) lucid; urgency=low * No-change rebuild for OCaml 3.11.2 transition (LP: #526073). -- Ilya Barygin Wed, 24 Feb 2010 23:02:12 +0300 ocaml-curses (1.0.3-1) unstable; urgency=low * New upstream release (Closes: #528838, #550377) * Use dh-ocaml 0.9.1 features * Upgrade Standards-Version to 3.8.3 (README.source, section ocaml) * Add myself to Uploaders and set Maintainer to 'Debian OCaml Maintainers' * Clean up file left after build * Add .doc-base file for API documentation * Remove byte.dpatch, add run_autoconf.dpatch to create configure and config.h.in -- Sylvain Le Gall Wed, 16 Dec 2009 23:49:58 +0000 ocaml-curses (1.0.2-3) unstable; urgency=low [ Stephane Glondu ] * Switch packaging to git. [ Samuel Mimram ] * Rebuild with OCaml 3.11. * Use dh-ocaml. * Update compat to 7. * Update standards version to 3.8.0. * Add Homepage field. -- Samuel Mimram Sun, 01 Mar 2009 21:10:25 +0100 ocaml-curses (1.0.2-2) unstable; urgency=low * Using dpatch to handle patches. * Added byte.dpatch to really fix the FTBFS on non-native archs. -- Samuel Mimram Wed, 10 Oct 2007 10:53:14 +0000 ocaml-curses (1.0.2-1) unstable; urgency=low * New upstream release. * Should build cleanly on non-native archs, closes: #442229. -- Samuel Mimram Tue, 09 Oct 2007 12:04:37 +0000 ocaml-curses (1.0.1-2) unstable; urgency=low * Rebuild with OCaml 3.10. -- Samuel Mimram Mon, 10 Sep 2007 02:06:50 +0200 ocaml-curses (1.0.1-1) unstable; urgency=low * Initial release, closes: #439711. -- Samuel Mimram Mon, 27 Aug 2007 16:28:28 +0200 wyrd-1.4.6/curses/META.in0000644000175000017500000000024012103356100013540 0ustar paulpaulname = "@PACKAGE@" version = "@VERSION@" description = "OCaml bindings for @CURSES@" requires = "" archive(byte) = "curses.cma" archive(native) = "curses.cmxa" wyrd-1.4.6/curses/ml_curses.c0000644000175000017500000001664312103356100014640 0ustar paulpaul#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include /* For PDCurses we need to define the following so that global * variables are declared (in the header) with __dllspec(dllimport). */ #ifdef PDCURSES #define PDC_DLL_BUILD #undef CURSES_LIBRARY #endif #ifdef CURSES_HEADER #include CURSES_HEADER #else #include #endif #ifdef CURSES_TERM_H #include CURSES_TERM_H #else #include #endif #ifdef HAVE_WINDOWS_H #include #endif /* Du travail pour les esclaves de M$ */ #include #ifdef HAVE_TERMIOS_H #include #endif #ifdef HAVE_SYS_IOCTL_H #include #endif #define AWB(x) caml__dummy_##x=caml__dummy_##x; /* anti-warning bugware */ #define r_unit(f) f; CAMLreturn(Val_unit); #define r_window(f) CAMLreturn((value)f) #define r_terminal(f) CAMLreturn((value)f) #define r_err(f) CAMLreturn(Val_bool((f)!=ERR)) #define r_int(f) CAMLreturn(Val_int(f)) #define r_char(f) CAMLreturn(Val_int((f)&255)) #define r_chtype(f) CAMLreturn(Val_int(f)) #define r_attr_t(f) CAMLreturn(Val_int(f)) #define r_bool(f) CAMLreturn(Val_bool(f)) #define r_int_int(x,y) \ { CAMLlocal1(ret); AWB(ret); \ ret=alloc_tuple(2); \ Store_field(ret,0,Val_int(x)); \ Store_field(ret,1,Val_int(y)); \ CAMLreturn(ret); } #define r_window_int(x,y) \ { CAMLlocal1(ret); AWB(ret); \ ret=alloc_tuple(2); \ Store_field(ret,0,(value)(x)); \ Store_field(ret,1,Val_int(y)); \ CAMLreturn(ret); } #define r_int_int_int(x,y,z) \ { CAMLlocal1(ret); AWB(ret); \ ret=alloc_tuple(3); \ Store_field(ret,0,Val_int(x)); \ Store_field(ret,1,Val_int(y)); \ Store_field(ret,2,Val_int(z)); \ CAMLreturn(ret); } #define r_string(f) \ { char *ret=f; \ if(ret==NULL) failwith("Null pointer"); \ CAMLreturn(copy_string(ret)); } #define a_window(a) ((WINDOW * )a) #define a_terminal(a) ((TERMINAL * )a) #define a_screen(a) ((SCREEN * )Field(a,2)) #define a_int(a) Int_val(a) #define a_bool(a) Bool_val(a) #define a_chtype(a) Int_val(a) #define a_attr_t(a) Int_val(a) #define a_string(a) String_val(a) #define RA0 CAMLparam0(); #define RA1 CAMLparam1(aa); AWB(aa); #define RA2 CAMLparam2(aa,ab); AWB(aa); #define RA3 CAMLparam3(aa,ab,ac); AWB(aa); #define RA4 CAMLparam4(aa,ab,ac,ad); AWB(aa); #define RA5 CAMLparam5(aa,ab,ac,ad,ae); AWB(aa); #define RA6 CAMLparam5(aa,ab,ac,ad,ae); CAMLxparam1(af); AWB(aa); AWB(af); #define RA7 CAMLparam5(aa,ab,ac,ad,ae); CAMLxparam2(af,ag); AWB(aa); AWB(af); #define RA8 CAMLparam5(aa,ab,ac,ad,ae); CAMLxparam3(af,ag,ah); AWB(aa); AWB(af); #define RA9 CAMLparam5(aa,ab,ac,ad,ae); CAMLxparam4(af,ag,ah,ai); AWB(aa); AWB(af); #define ML0(f,tr) \ value mlcurses_##f(void) \ { RA0 r_##tr(f()); } #define ML1(f,tr,ta) \ value mlcurses_##f(value aa) \ { RA1 r_##tr(f(a_##ta(aa))); } #define ML2(f,tr,ta,tb) \ value mlcurses_##f(value aa,value ab) \ { RA2 r_##tr(f(a_##ta(aa),a_##tb(ab))); } #define ML3(f,tr,ta,tb,tc) \ value mlcurses_##f(value aa,value ab,value ac) \ { RA3 r_##tr(f(a_##ta(aa),a_##tb(ab),a_##tc(ac))); } #define ML4(f,tr,ta,tb,tc,td) \ value mlcurses_##f(value aa,value ab,value ac,value ad) \ { RA4 r_##tr(f(a_##ta(aa),a_##tb(ab),a_##tc(ac),a_##td(ad))); } #define ML5(f,tr,ta,tb,tc,td,te) \ value mlcurses_##f(value aa,value ab,value ac,value ad,value ae) \ { RA5 r_##tr(f(a_##ta(aa),a_##tb(ab),a_##tc(ac),a_##td(ad),a_##te(ae))); } #define ML7(f,tr,ta,tb,tc,td,te,tf,tg) \ value mlcurses_##f##_bytecode(value *a,int n) \ { RA0 r_##tr(f(a_##ta(a[0]),a_##tb(a[1]),a_##tc(a[2]),a_##td(a[3]), \ a_##te(a[4]),a_##tf(a[5]),a_##tg(a[6]))); } \ value mlcurses_##f##_native(value aa,value ab,value ac,value ad, \ value ae,value af,value ag) \ { RA7 r_##tr(f(a_##ta(aa),a_##tb(ab),a_##tc(ac),a_##td(ad), \ a_##te(ae),a_##tf(af),a_##tg(ag))); } #define ML8(f,tr,ta,tb,tc,td,te,tf,tg,th) \ value mlcurses_##f##_bytecode(value *a,int n) \ { RA0 r_##tr(f(a_##ta(a[0]),a_##tb(a[1]),a_##tc(a[2]),a_##td(a[3]), \ a_##te(a[4]),a_##tf(a[5]),a_##tg(a[6]),a_##th(a[7]))); } \ value mlcurses_##f##_native(value aa,value ab,value ac,value ad, \ value ae,value af,value ag,value ah) \ { RA8 r_##tr(f(a_##ta(aa),a_##tb(ab),a_##tc(ac),a_##td(ad), \ a_##te(ae),a_##tf(af),a_##tg(ag),a_##th(ah))); } #define ML9(f,tr,ta,tb,tc,td,te,tf,tg,th,ti) \ value mlcurses_##f##_bytecode(value *a,int n) \ { RA0 r_##tr(f(a_##ta(a[0]),a_##tb(a[1]),a_##tc(a[2]),a_##td(a[3]),a_##te(a[4]), \ a_##tf(a[5]),a_##tg(a[6]),a_##th(a[7]),a_##ti(a[8]))); } \ value mlcurses_##f##_native(value aa,value ab,value ac,value ad,value ae, \ value af,value ag,value ah,value ai) \ { RA9 r_##tr(f(a_##ta(aa),a_##tb(ab),a_##tc(ac),a_##td(ad),a_##te(ae), \ a_##tf(af),a_##tg(ag),a_##th(ah),a_##ti(ai))); } #define ML0d(f,tr) value mlcurses_##f(void) #define ML1d(f,tr,ta) value mlcurses_##f(value aa) #define ML2d(f,tr,ta,tb) value mlcurses_##f(value aa,value ab) #define ML3d(f,tr,ta,tb,tc) value mlcurses_##f(value aa,value ab,value ac) #define ML4d(f,tr,ta,tb,tc,td) value mlcurses_##f(value aa,value ab,\ value ac,value ad) #define ML5d(f,tr,ta,tb,tc,td,te) value mlcurses_##f(value aa,value ab,\ value ac,value ad,value ae) #define ML6d(f,tr,ta,tb,tc,td,te,tf) value mlcurses_##f##_native(value,value,\ value,value,value,value); \ value mlcurses_##f##_bytecode(value *a,int n) \ { return(mlcurses_##f##_native(a[0],a[1],a[2],a[3],a[4],a[5])); } \ value mlcurses_##f##_native(value aa,value ab,value ac,value ad,value ae,value af) #define BEG0 { RA0 { #define BEG1 { RA1 { #define BEG2 { RA2 { #define BEG3 { RA3 { #define BEG4 { RA4 { #define BEG5 { RA5 { #define BEG6 { RA6 { #define BEG7 { RA7 { #define BEG8 { RA8 { #define BEG9 { RA9 { #define END }} /* RWMJ: Not implemented functions raise Invalid_argument * ("function_name"). This can happen for example when we are not * linked to real ncurses, particularly on Windows. */ #define ML0_notimpl(f,tr) \ value mlcurses_##f(void) BEG0 caml_invalid_argument (#f); CAMLnoreturn; END #define ML1_notimpl(f,tr,ta) \ value mlcurses_##f(value aa) BEG1 caml_invalid_argument (#f); CAMLnoreturn; END #define ML2_notimpl(f,tr,ta,tb) \ value mlcurses_##f(value aa, value ab) BEG2 caml_invalid_argument (#f); CAMLnoreturn; END static WINDOW *ripoff_w[5]; static int ripoff_l[5]; static int ripoff_niv=0; static int ripoff_callback(WINDOW *w,int l) { if(ripoff_niv==5) return(0); ripoff_w[ripoff_niv]=w; ripoff_l[ripoff_niv]=l; ripoff_niv++; return(0); } value putc_function; static int putc_callback(int c) { CAMLparam0(); CAMLlocal1(ret); AWB(ret); ret=callback_exn(putc_function,Val_int(c&255)); CAMLreturn(Is_exception_result(ret)?-1:0); } #ifndef WIN32 /* Du travail pour les esclaves de M$ */ static void winch_handler(int n) { signal(n,winch_handler); ungetch(KEY_RESIZE); } #endif #include "functions.c" #include "caml/signals.h" /* The following routines are special-cased to allow other threads to run * while getch() is blocking */ value mlcurses_getch(void) { CAMLparam0(); int ch; enter_blocking_section(); ch = getch(); leave_blocking_section(); CAMLreturn(Val_int(ch)); } value mlcurses_wgetch(value win) { CAMLparam1(win); int ch; WINDOW* w; caml__dummy_win = caml__dummy_win; w = (WINDOW *) win; enter_blocking_section(); ch = wgetch(w); leave_blocking_section(); CAMLreturn(Val_int(ch)); } wyrd-1.4.6/curses/functions.c0000644000175000017500000004725312103356100014655 0ustar paulpaul/* addch */ ML1(addch,err,chtype) ML2(waddch,err,window,chtype) ML3(mvaddch,err,int,int,chtype) ML4(mvwaddch,err,window,int,int,chtype) ML1(echochar,err,chtype) ML2(wechochar,err,window,chtype) /* addchstr */ #define copie(l,id,ar) int i,c=l,r; \ chtype *t=malloc((c+1)*sizeof(chtype)); \ if(t==NULL) failwith("Out of memory"); \ for(i=0;i0); END ML1(tigetnum,int,string) ML1d(tigetstr,string,string) BEG1 char *s=tigetstr(a_string(aa)); if((s==NULL)||(s==(char * )-1)) failwith("tigetstr"); CAMLreturn(copy_string(s)); END ML3d(tputs,err,string,int,(char->unit)) BEG3 putc_function=ac; r_err(tputs(a_string(aa),a_int(ab),putc_callback)); END ML2d(vidputs,err,chtype,(char->unit)) BEG2 putc_function=ab; r_err(vidputs(a_chtype(aa),putc_callback)); END #ifdef PDCURSES /* RWMJ: PDCurses has a moronic definition of tparm where they * seem to be trying to implement varargs on their own. Prototype * a sensible definition instead, at the cost of a warning: */ static char *(*mlcurses_rpl_tparm) (const char *, ...) = (void *) tparm; #else #define mlcurses_rpl_tparm tparm #endif ML2d(tparm,string,string,int array) BEG2 int t[10],i,n=Wosize_val(ab); if(n>10) n=10; for(i=0;i License: GPL-2.0 LicenseFile: COPYING PostConfCommand: touch setup.data ConfType: custom (0.2) BuildType: custom (0.2) InstallType: custom (0.2) XCustomConf: ./configure XCustomBuild: make XCustomBuildClean: make clean XCustomBuildDistclean: make distclean XCustomInstall: make install XCustomUninstall: make uninstall Executable wyrd Path: . MainIs: main.ml wyrd-1.4.6/doc/0000755000175000017500000000000012103356103011732 5ustar paulpaulwyrd-1.4.6/doc/wyrd.10000644000175000017500000003326412103356103013011 0ustar paulpaul'\" t .\" Manual page created with latex2man on Sat Feb 2 21:40:51 CST 2013 .\" NOTE: This file is generated, DO NOT EDIT. .de Vb .ft CW .nf .. .de Ve .ft R .fi .. .TH "WYRD" "1" "02 February 2013" "a console calendar application " "a console calendar application " .SH NAME wyrd is a text\-based front\-end to \fIremind\fP(1), a sophisticated calendar and alarm program. .PP .SH SYNOPSIS wyrd [\fIOPTIONS\fP] [\fIFILE\fP] .SH DESCRIPTION Open the calendar and display reminders defined in FILE (and any included reminder files). The default reminder file is ~/.reminders. (The FILE may also be a directory containing files with a \&.rem extension.) .SH OPTIONS .TP \fB\-\-version\fP Display version information and exit. .TP \fB\-\-help\fP Display usage information. .TP \fB\-\-add EVENT\fP Add given event to reminders file and exit. .TP \fB\-\-a EVENT\fP Add given event to reminders file and exit. .PP .SH QUICK START CAUTION: while this manpage should be suitable as a quick reference, it may be subject to miscellaneous shortcomings in typesetting. The definitive documentation is the user manual provided with Wyrd in PDF or HTML format. .PP This section describes how to use Wyrd in its default configuration. After familiarizing yourself with the basic operations as outlined in this section, you may wish to consult the \fIwyrdrc\fP(5) manpage to see how Wyrd can be configured to better fit your needs. .PP .SS OVERVIEW Before attempting to use Wyrd, learn how to use Remind. Wyrd makes no attempt to hide the details of Remind programming from the user. .PP At the top of the window is a short (incomplete) list of keybindings. .PP The left window displays a scrollable timetable view, with reminders highlighted in various colors. If the DURATION specifier is used for a reminder, the highlighted area is rendered with an appropriate size. Overlapping reminders are rendered using one of four different indentation levels so that all reminders are at least partially visible. If the current time is visible in this window, it is highlighted in red. .PP The upper right window displays a month calendar, with the color of each day representing the number of reminders it contains. The colors range across shades of white to blue to magenta as the number of reminders increases. The selected date is highlighted in cyan; if the current date is visible, it is highlighted in red. .PP The lower right window displays a list of the untimed reminders falling on the selected date. .PP The bottom window displays the full text of the MSG for the reminder or reminders that are currently selected. .PP .SS NAVIGATION .PP .TS H l l . _ Action Keypress _ scroll up and down the schedule , or k, j jump back or forward by a day , or 4, 6 or <, > or H, L jump back or forward by a week 8, 2 or [, ] or K, J jump back or forward by a month {, } jump to current date and time jump to the next reminder switch between schedule and untimed reminders window , or h, l zoom in on the schedule z scroll the description window up and down d, D _ .TE .PP Notice that if you have a numeric keypad, the {4, 6, 8, 2} keys will let you move directionally in the month calendar view at the upper\-right of the screen. Similarly, {H, J, K, L} will cause directional calendar movement using the standard mapping from \fIvi\fP(1)\&. .PP In addition to the hotkeys provided above, Wyrd lets you jump immediately to a desired date by pressing \&'g\&', entering in a date specifier, and then pressing . Any of the following date specifiers may be used: .TP .B * 8 digits representing year, month, and day: YYYYMMDD .TP .B * 4 digits representing month and day (of current year): MMDD .TP .B * 2 digits representing day (of current month and year): DD .PP (The date specifier format may be changed to DDMMYYYY; consult the section on CONFIGURATION VARIABLES. ) .PP .SS EDITING REMINDERS Note: By default, Wyrd is configured to modify your reminder files using the text editor specified by the $EDITOR environment variable. (This configuration has been tested successfully with a number of common settings for $EDITOR, including \&'vim\&', \&'emacs\&', and \&'nano\&'\&.) If you wish to use a different editor, see the \fIwyrdrc\fP(5) manpage. .PP If you select a timeslot in the schedule view, then hit \&'t\&', you will begin creating a new timed reminder. Wyrd will open up your reminder file in your favorite editor and move the cursor to the end of the file, where a new reminder template has been created. The template has the selected date and time filled in, so in many cases you will only need to fill in a MSG value. .PP Similarly, hitting \&'u\&' will begin creating an untimed reminder. \&'w\&' will create a weekly timed reminder, and \&'W\&' will create a weekly untimed reminder; \&'m\&' will create a monthly timed reminder, and \&'M\&' will create a monthly untimed reminder. .PP \&'T\&' and \&'U\&' also create timed and untimed reminders (respectively), but first will provide a selection dialog for you to choose which reminder file you want to add this reminder to. The set of reminder files is determined by scanning the INCLUDE lines in your default reminder file. (If you use a reminder directory, then all *.rem files in that directory will be available along with all INCLUDEd files.) .PP If you select a reminder (either timed or untimed) and hit , you will begin editing that reminder. Wyrd will open up the appropriate reminders file in your editor and move the cursor to the corresponding REM line. .PP If you select a timeslot that contains multiple overlapping reminders, Wyrd will provide a dialog that allows you to select the desired reminder. .PP If you hit on a blank timeslot, Wyrd will begin creating a new timed or untimed reminder (depending on whether the timed or the untimed window is selected). .PP Finally, pressing \&'e\&' will open the reminder file in your editor without attempting to select any particular reminder. .PP .SS QUICK REMINDERS Wyrd offers an additional mode for entering simple reminders quickly. Press \&'q\&', and you will be prompted for an event description. Simply enter a description for the event using natural language, then press . Examples: .TP .B * meeting with Bob tomorrow at 11 .TP .B * drop off package at 3pm .TP .B * wednesday 10am\-11:30 go grocery shopping .TP .B * Board game night 20:15 next Fri .TP .B * 7/4 independence day .TP .B * 7/4/2007 independence day (next year) .TP .B * independence day (next year) on 2007\-07\-04 .PP If your event description can be understood, Wyrd will immediately create the reminder and scroll the display to its location. .PP Currently the quick reminder mode tends to favor USA English conventions, as generalizing the natural language parser would require some work. .PP Wyrd also allows you to use the "quick reminder" syntax to create new reminders from the command line, using the \-a or \-\-add options. For example, .Vb wyrd \-\-add "dinner with neighbors tomorrow at 7pm" .Ve would create a new reminder for tomorrow evening. When used in this mode, Wyrd exits silently with error code 0 if the reminder was successfully created. If the reminder could not be created (e.g. if the reminder syntax could not be parsed), Wyrd prints an error message and exits with a nonzero error code. .PP .SS CUTTING AND PASTING REMINDERS Reminders can be easily duplicated or rescheduled through the use of Wyrd\&'s cutting and pasting features. .PP Selecting a reminder and pressing \&'X\&' will cut that reminder: the corresponding REM line is deleted from your reminders file, and the reminder is copied to Wyrd\&'s clipboard. To copy a reminder without deleting it, use \&'y\&' instead. .PP To paste a reminder from the clipboard back into your schedule, just move the cursor to the desired date/time and press \&'p\&'\&. Wyrd will append a new REM line to the end of your reminders file, and open the file with your editor. The REM line will be configured to trigger on the selected date. If the copied reminder was timed, then the pasted reminder will be set to trigger at the selected time using the original DURATION setting. (Additional Remind settings such as delta and tdelta are not preserved by copy\-and\-paste.) .PP If you wish to paste a reminder into a non\-default reminders file, use \&'P\&'\&. This will spawn a selection dialog where you can choose the file that will hold the new reminder. .PP WARNING: Cutting a reminder will delete only the single REM command responsible for triggering it. If you are using more complicated Remind scripting techniques to generate a particular reminder, then the cut operation may not do what you want. .PP .SS VIEWING REMINDERS .PP Aside from viewing reminders as they fall in the schedule, you can press \&'r\&' to view all reminders triggered on the selected date in a \fIless\fP(1) window. Similarly, \&'R\&' will view all reminders triggered on or after the selected date (all non\-expired reminders are triggered). .PP If you want to get a more global view of your schedule, Wyrd will also let you view Remind\&'s formatted calendar output in a \fIless\fP(1) window. Pressing \&'c\&' will view a one\-week calendar that contains the selected date, while pressing \&'C\&' will view a one\-month calendar containing the selected date. .PP .SS SEARCHING FOR REMINDERS .PP Wyrd allows you to search for reminders with MSG values that match a search string. Press \&'/\&' to start entering a (case insensitive) regular expression. After the expression has been entered, press and Wyrd will locate the next reminder that matches the regexp. Press \&'n\&' to repeat the same search. Entry of a search string may be cancelled with . .PP The regular expression syntax is Emacs\-compatible. .PP Note: Sorry, there is no "search backward" function. The search function requires the use of "remind \-n", which operates only forward in time. For the same reason, there is a command to jump forward to the next reminder, but no command to jump backward to the previous reminder. .PP .SS OTHER COMMANDS .PP A list of all keybindings may be viewed by pressing \&'?\&'\&. You can exit Wyrd by pressing \&'Q\&'\&. If the screen is corrupted for some reason, hit \&'Ctrl\-L\&' to refresh the display. .PP .SS ALARM STRATEGIES You may wish to generate some sort of alarm when a reminder is triggered. Wyrd does not offer any special alarm functionality, because Remind can handle the job already. Check the Remind manpage and consider how the \-k option could be used to generate alarms with the aid of external programs. For example, the following command will generate a popup window using gxmessage(1) whenever a timed reminder is triggered: .Vb remind \-z \-k'gxmessage \-title "reminder" &' ~/.reminders & .Ve (A sensible way to start this alarm command is to place it in {.xinitrc} so that it launches when the X server is started.) If you want some advance warning (say, 15 minutes), you can cause Remind to trigger early by setting a tdelta in the AT clause: .Vb REM Nov 27 2005 AT 14:30 +15 MSG Do something .Ve .PP Alternatively, if you want to generate alarms only for specific reminders, consider using Remind\&'s RUN command. This process could be easily automated by using the template\fIN\fP configuration variables described in the \fIwyrdrc\fP(5) manpage. .PP .SS MISCELLANEOUS .PP Remind\&'s TAG specifier may be used to cause Wyrd to give special treatment to certain reminders. If a reminder line includes the clause "TAG noweight", then Wyrd will not give that reminder any weight when determining the ``busy level\&'' colorations applied to the month calendar. If a reminder line includes the clause "TAG nodisplay", then Wyrd will neither display that reminder nor give it any weight when determining the month calendar colorations. The tag parameters are case insensitive. .PP WARNING: These tag parameters are not guaranteed to interact well with other Remind front\-ends such as tkremind. .PP .SH USAGE TIPS .TP .B * Wyrd fills in sensible defaults for the fields of a REM statement, but you will inevitably need to make some small edits to achieve the behavior you want. If you use Vim, you can make your life easier by installing the Vim\-Latex Suite and then modifying your ~/.wyrdrc to use REM templates like this: .PP set timed_template="REM %monname% %mday% %year% <++>AT %hour%:%min%<++> DURATION 1:00<++> MSG %\\"<++>%\\" %b" .br set untimed_template="REM %monname% %mday% %year% <++>MSG %\\"<++>%\\" %b" .PP With this change, hitting Ctrl\-J inside Vim (in insert mode) will cause your cursor to jump directly to the <++> markers, enabling you to quickly add any desired Remind delta and message parameters. .PP .SH LICENSING Wyrd is Free Software; you can redistribute it and/or modify it under the terms of the GNU General Public License (GPL), Version 2, as published by the Free Software Foundation. You should have received a copy of the GPL along with this program, in the file \&'COPYING\&'\&. .PP .SH ACKNOWLEDGMENTS Thanks, of course, to David Skoll for writing such a powerful reminder system. Thanks also to Nicolas George, who wrote the OCaml curses bindings used within Wyrd. .PP .SH CONTACT INFO Wyrd author: Paul Pelzl .br Wyrd website: \fBhttp://pessimization.com/software/wyrd\fP .br Wyrd project page (bug reports, code repository, etc.): \fBhttp://launchpad.net/wyrd\fP .br .PP .SH MISCELLANEOUS ``Wyrd is a concept in ancient Anglo\-saxon and Nordic cultures roughly corresponding to fate or personal destiny.\&'' \fI\-\- Wikipedia\fP .PP .SH SEE ALSO \fIwyrdrc\fP(5), \fIremind\fP(1) .PP .\" NOTE: This file is generated, DO NOT EDIT. wyrd-1.4.6/doc/manual.html0000644000175000017500000013345612103356103014111 0ustar paulpaul Wyrd v1.4 User Manual

Wyrd v1.4 User Manual

Paul J. Pelzl

October 23, 2010

“Because you’re tired of waiting for your bloated calendar program to start up.”

Contents

1  Introduction

Wyrd is a text-based front-end to Remind, a sophisticated calendar and alarm program available from Roaring Penguin Software, Inc. Wyrd serves two purposes:

  1. It displays reminders in a scrollable timetable view suitable for visualizing your calendar at a glance.
  2. It makes creating and editing reminders fast and easy. However, Wyrd does not hide Remind’s textfile programmability, for this is what makes Remind a truly powerful calendaring system.

Wyrd also requires only a fraction of the resources of most calendar programs available today.

2  Installation

This section describes how to install Wyrd by compiling from source. Wyrd has been packaged for a number of popular Linux/Unix variants, so you may be able to save yourself some time by installing from a package provided by your OS distribution.

Wyrd is designed to be portable to most Unix-like operating systems, including GNU/Linux, *BSD, and Mac OS X. Before installing Wyrd, your system must have the following software installed:

Wyrd may be compiled by executing the following at the root of the source tree:

./configure
make

After compiling, become root and execute

make install

to complete the installation process. The make command here should correspond to GNU make; on some systems (particularly *BSD), you may need to use gmake.

If your ncurses library was built with wide character support, Wyrd can be configured to render UTF-8 encoded reminders. To enable this option, use the command

./configure --enable-utf8

when configuring the sources.

3  Quick Start

This section describes how to use Wyrd in its default configuration. After familiarizing yourself with the basic operations as outlined in this section, you may wish to consult Section 4 to see how Wyrd can be configured to better fit your needs.

3.1  Overview

Before attempting to use Wyrd, learn how to use Remind. Wyrd makes no attempt to hide the details of Remind programming from the user. Aside from reading the Remind manpage, you may get some useful pointers by reading Mike Harris's article on 43 folders or David Skoll's writeup on Linux Journal. The 43 Folders Wiki also has a nice section on Remind.

You can launch Wyrd using the default reminder file by executing wyrd. If desired, a different reminder file (or reminder directory) may be selected by executing wyrd <filename>.

At the top of the window is a short (incomplete) list of keybindings.

The left window displays a scrollable timetable view, with reminders highlighted in various colors. If the DURATION specifier is used for a reminder, the highlighted area is rendered with an appropriate size. Overlapping reminders are rendered using one of four different indentation levels so that all reminders are at least partially visible. If the current time is visible in this window, it is highlighted in red.

The upper right window displays a month calendar, with the color of each day representing the number of reminders it contains. The colors range across shades of white to blue to magenta as the number of reminders increases. The selected date is highlighted in cyan; if the current date is visible, it is highlighted in red.

The lower right window displays a list of the untimed reminders falling on the selected date.

The bottom window displays the full text of the MSG for the reminder or reminders that are currently selected.

3.2  Navigation

ActionKeypress
scroll up and down the schedule<up>, <down> or k, j
jump back or forward by a day<pageup>, <pagedown> or 4, 6 or <, > or H, L
jump back or forward by a week8, 2 or [, ] or K, J
jump back or forward by a month{, }
jump to current date and time<home>
jump to the next reminder<tab>
switch between schedule and untimed reminders window<left>, <right> or h, l
zoom in on the schedulez
scroll the description window up and downd, D

Notice that if you have a numeric keypad, the {4, 6, 8, 2} keys will let you move directionally in the month calendar view at the upper-right of the screen. Similarly, {H, J, K, L} will cause directional calendar movement using the standard mapping from vi(1).

In addition to the hotkeys provided above, Wyrd lets you jump immediately to a desired date by pressing ’g’, entering in a date specifier, and then pressing <return>. Any of the following date specifiers may be used:

  • 8 digits representing year, month, and day: YYYYMMDD
  • 4 digits representing month and day (of current year): MMDD
  • 2 digits representing day (of current month and year): DD

(The date specifier format may be changed to DDMMYYYY; consult Section 4.2. )

3.3  Editing Reminders

Note: By default, Wyrd is configured to modify your reminder files using the text editor specified by the $EDITOR environment variable. (This configuration has been tested successfully with a number of common settings for $EDITOR, including ’vim’, ’emacs’, and ’nano’.) If you wish to use a different editor, see Section 4.

If you select a timeslot in the schedule view, then hit ’t’, you will begin creating a new timed reminder. Wyrd will open up your reminder file in your favorite editor and move the cursor to the end of the file, where a new reminder template has been created. The template has the selected date and time filled in, so in many cases you will only need to fill in a MSG value.

Similarly, hitting ’u’ will begin creating an untimed reminder. ’w’ will create a weekly timed reminder, and ’W’ will create a weekly untimed reminder; ’m’ will create a monthly timed reminder, and ’M’ will create a monthly untimed reminder.

’T’ and ’U’ also create timed and untimed reminders (respectively), but first will provide a selection dialog for you to choose which reminder file you want to add this reminder to. The set of reminder files is determined by scanning the INCLUDE lines in your default reminder file. (If you use a reminder directory, then all *.rem files in that directory will be available along with all INCLUDEd files.)

If you select a reminder (either timed or untimed) and hit <return>, you will begin editing that reminder. Wyrd will open up the appropriate reminders file in your editor and move the cursor to the corresponding REM line.

If you select a timeslot that contains multiple overlapping reminders, Wyrd will provide a dialog that allows you to select the desired reminder.

If you hit <enter> on a blank timeslot, Wyrd will begin creating a new timed or untimed reminder (depending on whether the timed or the untimed window is selected).

Finally, pressing ’e’ will open the reminder file in your editor without attempting to select any particular reminder.

3.4  Quick Reminders

Wyrd offers an additional mode for entering simple reminders quickly. Press ’q’, and you will be prompted for an event description. Simply enter a description for the event using natural language, then press <return>. Examples:

  • meeting with Bob tomorrow at 11
  • drop off package at 3pm
  • wednesday 10am-11:30 go grocery shopping
  • Board game night 20:15 next Fri
  • 7/4 independence day
  • 7/4/2007 independence day (next year)
  • independence day (next year) on 2007-07-04

If your event description can be understood, Wyrd will immediately create the reminder and scroll the display to its location.

Currently the quick reminder mode tends to favor USA English conventions, as generalizing the natural language parser would require some work.

Wyrd also allows you to use the "quick reminder" syntax to create new reminders from the command line, using the -a or --add options. For example,

wyrd --add "dinner with neighbors tomorrow at 7pm"

would create a new reminder for tomorrow evening. When used in this mode, Wyrd exits silently with error code 0 if the reminder was successfully created. If the reminder could not be created (e.g. if the reminder syntax could not be parsed), Wyrd prints an error message and exits with a nonzero error code.

3.5  Cutting and Pasting Reminders

Reminders can be easily duplicated or rescheduled through the use of Wyrd’s cutting and pasting features.

Selecting a reminder and pressing ’X’ will cut that reminder: the corresponding REM line is deleted from your reminders file, and the reminder is copied to Wyrd’s clipboard. To copy a reminder without deleting it, use ’y’ instead.

To paste a reminder from the clipboard back into your schedule, just move the cursor to the desired date/time and press ’p’. Wyrd will append a new REM line to the end of your reminders file, and open the file with your editor. The REM line will be configured to trigger on the selected date. If the copied reminder was timed, then the pasted reminder will be set to trigger at the selected time using the original DURATION setting. (Additional Remind settings such as delta and tdelta are not preserved by copy-and-paste.)

If you wish to paste a reminder into a non-default reminders file, use ’P’. This will spawn a selection dialog where you can choose the file that will hold the new reminder.

WARNING: Cutting a reminder will delete only the single REM command responsible for triggering it. If you are using more complicated Remind scripting techniques to generate a particular reminder, then the cut operation may not do what you want.

3.6  Viewing Reminders

Aside from viewing reminders as they fall in the schedule, you can press ’r’ to view all reminders triggered on the selected date in a less(1) window. Similarly, ’R’ will view all reminders triggered on or after the selected date (all non-expired reminders are triggered).

If you want to get a more global view of your schedule, Wyrd will also let you view Remind’s formatted calendar output in a less(1) window. Pressing ’c’ will view a one-week calendar that contains the selected date, while pressing ’C’ will view a one-month calendar containing the selected date.

3.7  Searching for Reminders

Wyrd allows you to search for reminders with MSG values that match a search string. Press ’/’ to start entering a (case insensitive) regular expression. After the expression has been entered, press <return> and Wyrd will locate the next reminder that matches the regexp. Press ’n’ to repeat the same search. Entry of a search string may be cancelled with <esc>.

The regular expression syntax is Emacs-compatible.

Note: Sorry, there is no "search backward" function. The search function requires the use of "remind -n", which operates only forward in time. For the same reason, there is a command to jump forward to the next reminder, but no command to jump backward to the previous reminder.

3.8  Other Commands

A list of all keybindings may be viewed by pressing ’?’. You can exit Wyrd by pressing ’Q’. If the screen is corrupted for some reason, hit ’Ctrl-L’ to refresh the display.

3.9  Alarm Strategies

You may wish to generate some sort of alarm when a reminder is triggered. Wyrd does not offer any special alarm functionality, because Remind can handle the job already. Check the Remind manpage and consider how the -k option could be used to generate alarms with the aid of external programs. For example, the following command will generate a popup window using gxmessage(1) whenever a timed reminder is triggered:

remind -z -k'gxmessage -title "reminder" %s &' ~/.reminders &

(A sensible way to start this alarm command is to place it in ~.xinitrc so that it launches when the X server is started.) If you want some advance warning (say, 15 minutes), you can cause Remind to trigger early by setting a tdelta in the AT clause:

   REM Nov 27 2005 AT 14:30 +15 MSG Do something

Alternatively, if you want to generate alarms only for specific reminders, consider using Remind’s RUN command. This process could be easily automated by using the templateN configuration variables described in Section 4.

3.10  Miscellaneous

Remind’s TAG specifier may be used to cause Wyrd to give special treatment to certain reminders. If a reminder line includes the clause "TAG noweight", then Wyrd will not give that reminder any weight when determining the “busy level” colorations applied to the month calendar. If a reminder line includes the clause "TAG nodisplay", then Wyrd will neither display that reminder nor give it any weight when determining the month calendar colorations. The tag parameters are case insensitive.

WARNING: These tag parameters are not guaranteed to interact well with other Remind front-ends such as tkremind.

4  Advanced Configuration

Wyrd reads a run-configuration textfile (generally /etc/wyrdrc or /usr/local/etc/wyrdrc) to determine key bindings, color schemes, and many other settings. You can create a personalized configuration file in $HOME/.wyrdrc, and select settings that match your usage patterns. The recommended procedure is to “include” the wyrdrc file provided with Wyrd (see Section 4.1.1), and add or remove settings as desired.

4.1  wyrdrc Syntax

You may notice that the wyrdrc syntax is similar to the syntax used in the configuration file for the Mutt email client (muttrc).

Within the wyrdrc file, strings should be enclosed in double quotes ("). A double quote character inside a string may be represented by \" . The backslash character must be represented by doubling it (\\).

4.1.1  Including Other Rcfiles

Syntax: include filename_string

This syntax can be used to include one run-configuration file within another. This command could be used to load the default wyrdrc file (probably found in /etc/wyrdrc or /usr/local/etc/wyrdrc) within your personalized rcfile, ~/.wyrdrc. The filename string should be enclosed in quotes.

4.1.2  Setting Configuration Variables

Syntax: set variable=value_string

A number of configuration variables can be set using this syntax; check Section 4.2 to see a list. The variables are unquoted, but the values should be quoted strings.

4.1.3  Creating Key Bindings

Syntax: bind key_identifier operation

This command will bind a keypress to execute a calendar operation. The various operations, which should not be enclosed in quotes, may be found in Section 4.3. Key identifiers may be specified by strings that represent a single keypress, for example "m" (quotes included). The key may be prefixed with "\\C" or "\\M" to represent Control or Meta (Alt) modifiers, respectively; note that the backslash must be doubled. A number of special keys lack single-character representations, so the following strings may be used to represent them:

  • "<esc>"
  • "<tab>"
  • "<enter>"
  • "<return>"
  • "<insert>"
  • "<home>"
  • "<end>"
  • "<pageup>"
  • "<pagedown>"
  • "<space>"
  • "<left>"
  • "<right>"
  • "<up>"
  • "<down>"
  • "<f1>" to "<f12>"

Due to differences between various terminal emulators, this key identifier syntax may not be adequate to describe every keypress. As a workaround, Wyrd will also accept key identifiers in octal notation. As an example, you could use \024 (do not enclose it in quotes) to represent Ctrl-T.

Multiple keys may be bound to the same operation, if desired.

4.1.4  Removing Key Bindings

Syntax: unbind key_identifier

This command will remove all bindings associated with the key identifier. The key identifiers should be defined using the syntax described in the previous section.

4.1.5  Setting the Color Scheme

Syntax: color object foreground background

This command will apply the specified foreground and background colors to the appropriate object. A list of colorable objects is provided in Section 4.4. Wyrd will recognize the following color keywords: black, red, green, yellow, blue, magenta, cyan, white, default. The default keyword allows you to choose the default foreground or background colors. If you use default for your background color, this will access the transparent background on terminal emulators which support it.

4.2  Configuration Variables

The following configuration variables may be set as described in Section 4.1.2:

  • remind_command
    Determines the command used to execute Remind.
  • reminders_file
    Controls which Remind file (or Remind directory) Wyrd will operate on. The default is ~/.reminders .
  • edit_old_command
    Controls the command used to edit a pre-existing reminder. The special strings ’%file%’ and ’%line%’ will be replaced with a filename to edit and a line number to navigate to within that file.
  • edit_new_command
    Controls the command used to edit a new reminder. The special character ’%file%’ will be replaced with a filename to edit. Ideally, this command should move the cursor to the last line of the file, where the new reminder template is created.
  • edit_any_command
    Controls the command used for editing a reminder file without selecting any particular reminder. The special character ’%file%’ will be replaced with a filename to edit.
  • timed_template
    Controls the format of the REM line created when editing a new timed reminder. The following string substitutions will be made: ’%monname%’ - month name, ’%mon%’ - month number, ’%mday%’ - day of the month, ’%year%’ - year, ’%hour%’ - hour, ’%min%’ - minute, ’%wdayname%’ - weekday name, ’%wday%’ - weekday number.
  • untimed_template
    Controls the format of the REM line created when editing a new untimed reminder. The substitution syntax is the same as for timed_template.
  • templateN
    Controls the format of a generic user-defined REM line template; N may range from 0 to 9. The substitution syntax is the same as for timed_template.
  • busy_algorithm
    An integer value specifying which algorithm to use for measuring how busy the user is on a particular day. If busy_algorithm="1", then Wyrd will simply count the total number of reminders triggered on that day. If busy_algorithm="2", then Wyrd will count the number of hours of reminders that fall on that day. (Untimed reminders are assumed to occupy untimed_duration minutes.)
  • untimed_duration
    An integer value that specifies the assumed duration of an untimed reminder, in minutes. This is used only when computing the busy level with busy_algorithm="2".
  • busy_level1
    An integer value specifying the maximum number of reminders in a day (with busy_algorithm="1") or maximum hours of reminders in a day (with busy_algorithm="2") which will be colored using the color scheme for calendar_level1.
  • busy_level2
    Same as above, using the calendar_level2 color scheme.
  • busy_level3
    Same as above, using the calendar_level2 color scheme rendered in bold.
  • busy_level4
    Same as above, using the calendar_level3 color scheme. Any day with more reminders than this will be rendered using the calendar_level3 color scheme rendered in bold.
  • week_starts_monday
    A boolean value ("true" or "false") that determines the first day of the week.
  • schedule_12_hour
    A boolean value that determines whether the timed reminders window is drawn using 12- or 24-hour time.
  • selection_12_hour
    A boolean value that determines whether the selection information is drawn with 12- or 24-hour time.
  • status_12_hour
    A boolean value that determines whether the current time is drawn using a 12- or 24-hour clock.
  • description_12_hour
    A boolean value that determines whether reminder start and end times are drawn using 12- or 24-hour time in the description window. This value also controls the format of timestamps in the formatted calendars produced by view_week and view_month.
  • center_cursor
    A boolean value that determines how the screen and cursor move during scrolling operations. When set to "true", the cursor is fixed in the center of the timed reminders window, and the schedule scrolls around it. When set to "false" (the default), the cursor will move up and down the schedule during scrolling operations.
  • goto_big_endian
    A boolean value that determines how the the goto operation will parse dates. When set to "true", date specifiers should be in ISO 8601 (YYYYMMDD) format. When set to "false", date specifiers should be in European style DDMMYYYY format.
  • quick_date_US
    A boolean value that determines how the quick_add operation will parse numeric dates with slashes, e.g. 6/1 (or 6/1/2006). When set to "true", the first number is a month and the second is the day of the month (June 1). When set to "false", these meanings of these two fields are switched (January 6).
  • number_weeks
    A boolean value that determines whether or not weeks should be numbered within the month calendar window. Weeks are numbered according to the ISO 8601 standard. The ISO standard week begins on Monday, so to avoid confusion it is recommended that week_starts_monday be set to "true" when week numbering is enabled.
  • home_sticky
    A boolean value that determines whether or not the cursor should "stick" to the "home" position. When this option is set to "true", then after pressing the <home> key the cursor will automatically follow the current date and time. The effect is cancelled by pressing any of the navigation keys.
  • untimed_window_width
    An integer value that determines the target width of the month-calendar window and the untimed reminders window. The allowable range is 34 to ($COLUMNS - 40) characters, and Wyrd will silently disregard any setting outside this range.
  • advance_warning
    A boolean value that determines whether or not Wyrd should display advance warning of reminders. When set to "true", Wyrd will invoke Remind in a mode that generates advance warning of reminders as specified in the reminder file.
  • untimed_bold
    A boolean value that determines whether or not Wyrd should render untimed reminders using a bold font.

For maximum usefulness, busy_level1 < busy_level2 < busy_level3 < busy_level4.

4.3  Calendar Operations

Every Wyrd operation can be made available to the interface using the syntax described in Section 4.1.3. The following is a list of every available operation.

  • scroll_up
    move the cursor up one element
  • scroll_down
    move the cursor down one element
  • next_day
    jump ahead one day
  • previous_day
    jump backward one day
  • next_week
    jump ahead one week
  • previous_week
    jump backward one week
  • next_month
    jump ahead one month
  • previous_month
    jump backward one month
  • home
    jump to the current date and time
  • goto
    begin entering a date specifier to jump to
  • zoom
    zoom in on the day schedule view (this operation is cyclic)
  • edit
    edit the selected reminder
  • edit_any
    edit a reminder file, without selecting any particular reminder
  • scroll_description_up
    scroll the description window contents up (when possible)
  • scroll_description_down
    scroll the description window contents down (when possible)
  • quick_add
    add a “quick reminder”
  • new_timed
    create a new timed reminder
  • new_timed_dialog
    same as previous, with a reminder file selection dialog
  • new_untimed
    create a new untimed reminder
  • new_untimed_dialog
    same as previous, with a reminder file selection dialog
  • new_templateN
    create a new user-defined reminder using templateN, where N may range from 0 to 9
  • new_templateN_dialog
    same as previous, with a reminder file selection dialog
  • copy
    copy a reminder to Wyrd’s clipboard
  • cut
    delete a reminder and copy it to Wyrd’s clipboard
  • paste
    paste a reminder from Wyrd’s clipboard into the schedule
  • paste_dialog
    same as previous, with a reminder file selection dialog
  • switch_window
    switch between the day schedule window on the left, and the untimed reminder window on the right
  • begin_search
    begin entering a search string
  • search_next
    search for the next occurrence of the search string
  • next_reminder
    jump to the next reminder1
  • view_remind
    view the output of remind for the selected date
  • view_remind_all
    view the output of remind for the selected date, triggering all non-expired reminders
  • view_week
    view Remind’s formatted calendar for the week that contains the selected date (the in-calendar timestamp formats are determined by the value of description_12_hour)
  • view_month
    view Remind’s formatted calendar for the month that contains the selected date (the in-calendar timestamp formats are determined by the value of description_12_hour)
  • refresh
    refresh the display
  • quit
    exit Wyrd
  • entry_complete
    signal completion of search string entry or date specifier
  • entry_backspace
    delete the last character of the search string or date specifier
  • entry_cancel
    cancel entry of a search string or date specifier

4.4  Colorable Objects

Each of Wyrd’s on-screen elements may be colored by the color scheme of your choice, using the syntax defined in Section 4.1.5. The following is a list of all colorable objects.

  • help
    the help bar at the top of the screen
  • timed_default
    an empty timeslot in the day-schedule window
  • timed_current
    the current time in the day-schedule window (if it is visible)
  • timed_reminder1
    a nonempty timeslot in the day-schedule window, indented to level 1
  • timed_reminder2
    a nonempty timeslot in the day-schedule window, indented to level 2
  • timed_reminder3
    a nonempty timeslot in the day-schedule window, indented to level 3
  • timed_reminder4
    a nonempty timeslot in the day-schedule window, indented to level 4
  • untimed_reminder
    an entry in the untimed reminders window
  • timed_date
    the vertical date strip at the left side of the screen
  • selection_info
    the line providing date/time for the current selection
  • description
    the reminder description window
  • status
    the bottom bar providing current date and time
  • calendar_labels
    the month and weekday labels in the calendar window
  • calendar_level1
    calendar days with low activity
  • calendar_level2
    calendar days with medium activity
  • calendar_level3
    calendar days with high activity
  • calendar_today
    the current day in the calendar window (if it is visible)
  • left_divider
    the vertical line to the left of the timed reminders window
  • right_divider
    the vertical and horizontal lines to the right of the timed reminders window

5  Usage Tips

  • Wyrd fills in sensible defaults for the fields of a REM statement, but you will inevitably need to make some small edits to achieve the behavior you want. If you use Vim, you can make your life easier by installing the Vim-Latex Suite and then modifying your ~/.wyrdrc to use REM templates like this:

    set timed_template="REM %monname% %mday% %year% <++>AT %hour%:%min%<++> DURATION 1:00<++> MSG %\"<++>%\" %b"
    set untimed_template="REM %monname% %mday% %year% <++>MSG %\"<++>%\" %b"

    With this change, hitting Ctrl-J inside Vim (in insert mode) will cause your cursor to jump directly to the <++> markers, enabling you to quickly add any desired Remind delta and message parameters.

  • The 43 Folders Wiki has a page on Wyrd. This is a good place to look for other usage tips.

6  Licensing

Wyrd is Free Software; you can redistribute it and/or modify it under the terms of the GNU General Public License (GPL), Version 2, as published by the Free Software Foundation. You should have received a copy of the GPL along with this program, in the file ’COPYING’.

7  Acknowledgments

Thanks, of course, to David Skoll for writing such a powerful reminder system. Thanks also to Nicolas George, who wrote the OCaml curses bindings used within Wyrd.

8  Contact info

Wyrd author: Paul Pelzl <pelzlpj@gmail.com>
Wyrd website: http://pessimization.com/software/wyrd
Wyrd project page (bug reports, code repository, etc.): http://launchpad.net/wyrd

9  Miscellaneous

“Wyrd is a concept in ancient Anglo-saxon and Nordic cultures roughly corresponding to fate or personal destiny.” – Wikipedia


1
The next_reminder operation locates reminders at the point they occur; if advance_warning is enabled, next_reminder will skip over any displayed warnings of an event.

This document was translated from LATEX by HEVEA.
wyrd-1.4.6/doc/manual.pdf0000644000175000017500000041111712103356102013706 0ustar paulpaul%PDF-1.4 %ŠŌÅŲ 3 0 obj << /Length 1014 /Filter /FlateDecode >> stream xŚķ™KsŪ6Ēļž¼•œ)Q¼IcM2Óōį$R’CÓLĀ2Šōš!Wżō@¢lzFnr’y"D ņ‡Åī‰ĖÕÅ/o P0b4XŻc 88g€@¬ņąÆšs”p×äQŒ ·PŪśŲŖĘ¶žU/ĖčļÕ[kĮ6 įAL Y{ļ"ÄBŁ—vģ[`ÆļTłß`"ˆ„§AŒ) ,µƒ®²®¾öóaņ³k@Ż“I€ P 3mŒ<”ALH¹³ńcr©2Ł·ŹßÕżOfa‘$t÷ŗĀžrÆ[ßŲė½,ŗ¢ZŪ7u³7ąZ×e-;?(“„Ŗréžŗk"ŹĀ:B0\7Ć»oÜTµ½¶l:Ūģļ@„(4JŻ‹„¢€P>šŒY83@@Č-Š¢®:UuķaĄ0¦ŌöDQŒ „įÆU§Ÿ$ ė¼Ļŗ¢®īz Ą(ÓC†¾Ä.†æ{“xoG?{YŹgŁž?kć}_d_ķŪ/včĮ·F‹L)(Efµugo /©­]m lÕl eł>Š‘„ŚŻ˜žõÅ]Ø’kœöFdł_:&é?e„ud(֑vīĮbœ¢õDMź×ł(}P›¢ŹUÓF±Ąx¦ų&›†IĢQč”ä:ŻĶīy Qę2tŃwK‡6į·“~K~1ŽČ§½‘;xŸ"C—«¦P1˜Īy*ŌÄA]*Łd·•ŪˆkńĖŽ’É4ĀŌėØīÖ ļE½Łčmm‚$Ję łL Ā}UŹfćo£Ėׅ2iœóėIX÷¹GW€13EhŃfJ×"•Ŗ{“X0™%ē3ø>,cÄuNė>źj¶WłÖ”³²Ź|É«kŠ/āußø€@¢K€tŖpó–Ē»ƒź²mčJŃø+fĄ“\xækņ&›2©Ė|!„ļ·ÜUüW?ĆŁ‰āź-Ćā§®D·®ÉPLć”ŅĻŹ>ßēŃQNų™…/Mō"Ÿu¶ošt*ĘbŲ[Ŗ‘~“=š ųB”l y=ąKSq†lŲ qh’6æÅ;䡝½q©•™ž×H^žĪE5-YkCi{ 9Ž^2ń26µuČņ›±ōeĄ2»Uå²Ś¹ƒŠ]6}€ĖÅ;)F‘¬ś.Ķō„ėłĻt‹£€«;e™…Ļęuö"4F„'SŻ»¤Ž©ĘóĒėTÖ/dh–óO!e'ĖyęßĒV®ā•9*īZ{ ƒ±üFÜiEwūČw¶~/2Uµ&č>×Bā‹‹ģk5œ–Ż—*_o†“--åY’øńÅ?&Zu%$ŠĆĀuéžÆWßó“Ņ^ endstream endobj 2 0 obj << /Type /Page /Contents 3 0 R /Resources 1 0 R /MediaBox [0 0 612 792] /Parent 8 0 R >> endobj 1 0 obj << /Font << /F35 4 0 R /F37 5 0 R /F38 6 0 R /F41 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 11 0 obj << /Length 147 /Filter /FlateDecode >> stream xŚm޽‚0…÷>ÅŪ”õöŅKŪ£ƒ‰[7ć@Ršż„¢‰ƒćłĪON“Äį\°h"F iOą1t›zĄM„-"Źćœ×¶[•&F9ęAĖYŻÓ{SŹølż¦ś‹59ć8ģfü¬]Ē„ė§©Ķżü\ž®ųB·sü{N± 6€®-Õ¦’§$^č§0Ć endstream endobj 10 0 obj << /Type /Page /Contents 11 0 R /Resources 9 0 R /MediaBox [0 0 612 792] /Parent 8 0 R >> endobj 9 0 obj << /Font << /F38 6 0 R /F35 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 14 0 obj << /Length 1902 /Filter /FlateDecode >> stream xڽXK“Ū6 ¾ļÆš­rgE“z+=5}¦Ó6mćL;Óä@Ė“­‰$ŖĒżõ R+y•ķ&Ķō$Q|ų|õt{³ł6ĢV,"a”«ķa•«”ę„FlµŻÆžōŲŚg”RļY£ŗ5Ė<¹ UŹfżzūģWŒ’œęLļ„+?ˆHįĪß×ič]ŗż>†^Łć“ćC‰5‹½wŹßń^Ų%‡N6Ź*‰ĻßD]6ū[=ˆÜö^¶§²WeĮ•Ū]š ¶ņΊq§šŠw5¾¶ƒsÓ\ÄHX1²öcķ]…[öeßVübOė ņ¢³Cg&·²‹NV:-»¬…ŗ¾-…F÷lådī ;·ØxUž=āy‘ƒšųSĖT3ŁĒŠ7… Ī5A@(‹Ń¤`jR{5£11…pl'øBq0‰a/b_ŚÆįÜn˜;—öjŗV Ž_ÖI쁼†Ž÷ҘkŒFŸtėˆz:Āpź6Ųŗ—ĀžŻH{ģ©Ü œÄx’lĒž]ä’å„@؍†`LĀt”6¾k¾+«RŻnÆšV§Ņ9Ó>Ļ'ķØŲ©1C]uCu±±e­ķC5÷×菞Ņ+Q£ü %A΃oŹ¼ź„ »æ†²szČĘÉ“Z:Ž „Óg™p»{ˆ”bÜnēkŁ«„Ą² õNÄ}VЇĖ=·¾Ę$Q&`“—¤6GĘģ‡y[nŃ3,‚œvęĮ‚‚éL+wĀNŸ¤K+Ž„g‰²p0Į•…Žī‚_ Y·Ę;0“D§åø Šƒ<ķYÜ Ż ajyń†…]€ÅÖaÜ õā~˜6+BqÓ•Į?–Ķšnó²)ßįļJŽØŽäV§€š„ę|Ł |Z/Į›²k{ėEƒćՔ—µŪQŗ7ƒRH– ˜ƒI˱ żKEBIĖ| ™lczw¹fµē/F¢UąT­č ½iU!“ł©)¦m@\ōå±ö«±ž˜meēŲv2kSę5ä~Ub¾ć¤lE7cj“½Ą•¢öćäw?æÜߣéϟ¾ųś§4;bµY0å'^ĢQųƒąó©€@®ŹL<cg’ķ5”Ø¢ĶīĮe÷iīü)3 \aņÜqŌ¤bĻċż›³į4gĮŖčkFcÆ(K—ņ_!HĢŖē_ńŗZčBFb–L`I0Š'›õÆh/JĶXआ„fKĒł ęIē•óq†Œp6…N*KœU¹ėxwY00£$’›Ø.w:»¶0¦ÜU ż¤®V²­Ećü-ø®Ō°˜-šg$„‘5ōƒ ķ:YR6pO#‡nI‚Ż99?üo›HóÓńø™6źK%īINjŅZ/ėϵ’)Ŗ€4‚ä“DœD“ĒFÕė¢j*öĆ£*ž¤^wut³X¶YLXØū|hc³lu£ōKåš endstream endobj 13 0 obj << /Type /Page /Contents 14 0 R /Resources 12 0 R /MediaBox [0 0 612 792] /Parent 8 0 R >> endobj 12 0 obj << /Font << /F38 6 0 R /F35 4 0 R /F33 15 0 R /F41 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 18 0 obj << /Length 2792 /Filter /FlateDecode >> stream xŚ­Zݓ۶÷_”·J3'  ŁŽxʞ4Ä™Ä×Ét\?@"tBŽ"’²ržė»‹%B¢äÓU XģĒo?ņķż«ŪļE: #&"ÉG÷‹QĀGI± G÷łčÓXL¦ać_7fž8™ņ8lUŻN>ßæ‡¹ń( Xd!Ī FS±4¢™÷KÓL¦"”ćFĻ[S•ŲHƹnęµ™i÷lYMx<ŽŅ³¶¢ĪM£©ć÷I"ĘOuNŻĘ‘0­›œėÅ$ ĘjS“ōd^•’ ž°©®Č&Ó8ČĘo­®i_™ĀØŚ|5åzŖ6u£‹ ښvIżķR£ (Y(Xe$ŚL5f#āp\­5­ÕP[¹kµi SźœZ–sø¶¤“˜£N&І‰7Š‘$ȍY©'ŗŁšfé¦Utń’wZ…FDT»Öt³W/4zŚDbŹĶ ŹøW% vGāxéÖźļqHK·ØCŗ+µĪęč YǼCHx\,tšśå ØĀ’£·§ą­Óä·zQÕ(¦­G«uKöNa"p@{ŃoHäB«ŗ¤'{ ķę…ūyæé•)sÄh·§?vz“<7Ō,+ŸŽŅäš8BDŁ®\·Źnrµč› &imDću]=Ōjµ" ”cQW+¼Ž"tÓõ$ŽĒĄm”šń›†…!Żąh\k•ļhģföWZ©r­ō ¹”Ņv?­ŻROS­ö /6ň֕)+ %ĻäxöD×Ųųِ©õƒŖkÓü Åp“ ֘yį#Üń ŗ~? ćqUäøD‡˜„eI`Ć#Į’  ĄŸcH+a €jŚVÕD’;5įȜš-«UQōÜ֦՛µĻąO¦ÜüE·ļĮ/JU 𦠋¹Ē_2Ä_Ä¢Txü”‰£B,¹.4‹øš•o•īŲW’ķų}cóhØ„ŠĘ9öR¹Źł±™kŗŪEpltW‡š½ƒ›¦™ģĖ•>W.+REÜē?“•xä\PōĀ›BmŹł’ī÷Š­Mc ÄZœqē&xć% 쨭6¢A #Zį†ZĄĀU£’Ā?=ßŲ(c„Ł“†§’‰°ģn‘”¹daŹ»Q =(æ[t¼5āķ ¶Rkģ4 Q ]ėņe«.15Ģb_];9l”ŽƒŹēž“ŠŹa¹y[ÕO0$¤.ėéē;ć0¦Ė3÷ōy:‰ aęéd*!Žß-L”KµŅƇt”„¾ŽHJĮY #/D¾q¹‡ŒksŌŚtqšd Rw”ŪĘĒz³¬źvÆ-SΫպЭŽ+¦0Mėw‘ tš4ņ J{‡aš¾ “…^øčŁgŪ¹iօzjØ„\ˆ×lŌ¬pÓ[³‚¬±kB¢œp@o¼ŅÅFz²³£ø4Ė~֎ŲaK$‚L@1TmÜČyUTuć’Č;JLÓP²L$¾T®8:“9 •‘čŒ÷Żæ{s’ī—CfŽc&“ø٬õÜ jm­†6”q ½8žUM]Ź—ć™SĄ.§ s ķō ćtœ öēQ:ķŁŚ'­!ó®k£ZG¶1_µdĀ™S_'XĒ€GŌL¤—Ę}Sš4BFŗ~»~NŻ®ŗ U©©Ļ :T[„ŃQ0€‡H»l• Š)¢ ‡'ECƒlŒO1ē+7MÅIö0¬ö”tźÜ`¹ČøˆšÅ4°‰! ÜāŻ”Ī7µć{ĶJū~čf»Ī²›Ü=īł‹ŒŃŲvXėÓšlާJ&£õq÷œ“K(×ke8®‘õzqķŸ*ź\U%"{ę [®:LrŁĮ ’2dHNF}ÖĘŠ„Õ܍ŹmF6ōŗÖ (Ń'PnV³.ž9'RRzašØ1¼Buåg‰n.ćŌ(ŪĪ寧ņĮu+Dėn–*×ī¾[e»4­jK^øĪŠĶAĻ ŹJXÕQtŚne'PGv}œ&hŪ9xt£Q!³ĪŽY?_%ØLäĢNhč¹’Ä”Ģm$Wå?Š {AŪŽšĮƒt‚ŃčILŲ„^ćŲķÆ: ÜY¤zyÄ:!!²Ėā\Ņ\®ūdwœÉv^ŗ)Ń5sæVp³©n* BcÆÜĶöKTŲŲŚ`{=«ŚÖīLąŽKˆø·ß'݃ ÜĄF£p]T“Ō²HÜļŲ ›•Ā.×üüń_ƒµ™`AŗK]”mś‹ļk'»dķ÷īXUŽ'čńĘ%•·10#Cß¶źĪī›y·oęnßüAŁPo(üĆŌW’¼õē+”4…xœ#€N’ŹŃ|õźÓē`”C?„‰,mķØÕ(Źb–r¼}|õ«?ŸC5;gęĆH’„¦æµĒJž wéHœ…Żī’Ķ|˜g!"ŗĪĀBd„¹æņØ4ŖŪ0Ą6Ē<Ä2±¹œ‡Ż‘½\÷iĂģ*Ŗē)՝Raé<ŽUĢŖģܖܚȷēKo }Ę`/āÖwŌĪ^»w›õėoļ„n†?fQu#īņj[RŠvTŖz°Ø a³+U‡HH,ž&/»œŻ„zō1“š(¼h’ˆÉ@:Ž7+•™źĪ‚»]%ÄŹ­ĶõĮ6Qu©ąé n^Ęń ąōY¾Ć£¬ą‰”|—āł³“NHz[Ö3 ځ1:"ł|@geŒ'āNī®ĄÉė«pņĆ8łéŒc] 4ß³ ogæŽgɐqņ’{ÖVėĒ3®õ2–OøVŸēō 1ŸĶEŃųÓ8ł|ųžxų¾?ߋéƉ#qųF ‹ƒ+Ą—vΧńūBžÅ ~ūL/sBßĪV>-5glu1ć¾­ ÜO³+ŁJą {zh«īužw.ćvµżrŠ՜6ŠĖ=`śœŽ-+w<|BĆÆģkv„"Š®£a°(ČNixWB—»-«wZ¹/ćń„rūL޵jvN·/ģė6[I_G·d©+皭iķ!½…†ŌWģM|čž;Ģč7œÖ’Ėä8”’ž wų"`°d^ś{FUjĻ~†÷4i?>'“.ƐI‹3ØŗXŖĀtÉ« *ĢĄĀ”ūĘåk…‡PżóāźņĶļ ¹ĘŠĻŽi^¾ØÆŃ$f2K®£Ń$c‰ Ļv:¤/Öūɇg•§O"NkżeœŠz_„ü ¾šŻĖ]Ģų‘å¢óÓ–L—¦,rĘ „;kłPµōŚ_&ŻĖ"ø³gįRŅ÷ Ų±¤/#ģ;&źQt)7+]ć×Q8¼÷‚t­ģkķ$ÜŃś•F‡4ܟ¾~³RŽnč]²t×Ō]łuy\øiƒ Ł;āŁqސ`[c w…n“±Ŗpd_ōb īŽ”‡ĻgĆ(b\žŠų”HÖ>4e ž—HĖ{Äd ‹ÄN<83KYسrŠT°“«–m»žūķķvk_¬±H,čS6ÆV·<āŪ€ß>ltÓsĻ…“§£!xc’ž=±ā€ö#ž÷|q‘²„„8u¬­ŗOƒŽŽA! ĮŽĮē³Ģ_x©jś’jŁ®öīģµ=E÷ !īNĘÓĆ/w.ŠvŸ żAY…»ÆnE̳”…ÅÄBõ`žœuĶ£901ÖD¶*eėåśöą›ļ ˆ wŠĮ’ĖŽšęy ?B endstream endobj 17 0 obj << /Type /Page /Contents 18 0 R /Resources 16 0 R /MediaBox [0 0 612 792] /Parent 8 0 R >> endobj 16 0 obj << /Font << /F38 6 0 R /F35 4 0 R /F41 7 0 R /F33 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 21 0 obj << /Length 2803 /Filter /FlateDecode >> stream xŚ­YŪrä¶}߯ŠCŖ†“Ņ0$Į«ķJU6+;ėXN²+—+ē3„4Čņ2&9’õ÷éF7@r–ÜÕV¢ Šø5ĄéÓĶ×wÆžš­H®ĀĄ/‚"¼ŗ»æŹ¢«,(ü †Zyõ/o8Ŗķ.JBÆn›įˆÅĄ;ČJ5„ģØįQ«m”xOT“żņøĄ;ŸNŖŪF·ėōƑ[ŪūYÆŠėRæŻ‰0ņŽėZW²«ž·iā]o’}÷=h)¦ZFEā'iq’÷ŌtžōIü8Ilæ\owixßóļ_ł÷‡„ŁSŪ”Üef¦ÜŻźOŗŖhyīyC„ކ^§ƒnYįW;‘Å~šęW»PųI\Šč©1°ņ6L¼Gü§jÕ lĆ^7Ttvķ‰ĆJ'O'×ē¾kė%‹D"ńƒÜéżØ ’ „įŅEägQf;ū“˜ŽĻ/vš¶eį€eYjÜ.Ն–ĀP8¶Ć‡mx 7÷ܓšŌцu©Jže?1Į5ŹRļēm&¼g³×°š*5ščēöL…’œė•t]«RĖAĮķ™é!é§T½īģZ%ō£ŅžŁź£zcģóķĀŌ/D:ßüęa³d¼°šSčŹĘĆm©ē©::„<÷4*όbšĆŗ@©?©MĮ»‰;N›ĘAy䧔‚ÜO"w’æéŌpīš?.éšD¾Hćń wqzjĢ1ђę¹Ā‚t–Pøo«Ŗ5ƞ·³¢O’Z>óõÉ£•1aB ī-PōŖüjé9‚ŁQ?8? yŠ/A˜-ŚŻķ^rš¹ŌŚ\(w ­'į^˳’ĪĪęĪq™lŽ3ČēÆ›ļŸšw{ūęĶ’¢;^4MæDÓų%šN xŖš-¬@Ÿ»Īīß8oąeŹ‘™£—(’yE—¶w”<©:f~”‰KC'ĮEG¾ˆ““×DčŲvµ“KZ„ģ%<eó xq ®z{‹ē¾-"ļkī×6ż¹āYŽĢS%ö#Ÿ”k~†~‘$/½ °_Dz _lĮųąŒn?­½Ž©Z7%>”ūćP Mńc;(°P Ć^Ɔ„Į¹{[ JĀe"›€(¶ėž~a#hœ‡³EĮ€)fė¶Ō÷<mG„ŽÕ¢­OÅ^JXŠ7ƒöæ 4% óŠņŠń\xŻżó8vŠ‚9īžīęĶŪ»æ½[2Nœ}qx` ūQwmĆ5ˆĮ»vÉNĖ}„|ÄׄÆš;Œf‘|“ šĘ@(¹Ł&t˜ Æ „öd¶ „óÉȎ$#®apŹšĒŒ} Y1¦yÄm§īkĖäĆ¢9§§&ęÄ!śæŽö'¢:iT ļĄ ÅŲba×9óžŽp5. ­O­ÓmBÓ źSEžŚŽāÜĀˆĢńØZPxä]A<—ŪqėŪkjŽ Äą‹!ā”d•˜Ī•Df7•b¹n®IÜ·ōkģ µdJŗ°Õƒģ3ŗsP°aPS±›oŌ„o§Å©¬łEŹ„g&±ŸĒAnß·ō "äŅćČĶTgÅ·5L?‚°u Į.‰)¾Äa3ˆĶĒ6ēÅĒ ?NÓy|* (<>¬Žk’„ē†ŸV>zr™%/ü¤ųé‹¢ūÅėÓĻ“Ršø°g!Š>s³v‰G©†ĶݚBięHĶŹĆÜĻ §õę§õ™ÜÉČŹ€PVŒ[ƒ²ŻD–3šlÜZ6‚lOUd– Šé# '؞‘ƒ Öå©·G?rl’ źz®°ua­IŖ„š$żŲjK!óŠņ‹ēQjYµčc³ĢH3% BĖįŲ¶†é€ģéØGO\4¼d8ŸNņd|¢”C0†¦Ģ1%ÄbÖY>›;¢oNE¾$@w©£ńzĖ묇&Ż/9ƒR Ŗƒ1ę8TMn'M ɦ!®Ņ•0#„g—ęīŁ½żńĻ?üōęf%ĢČBwŸ*XƧ™õ˜0€dŒQÓdOiĀ{BC$™¹-†÷AY Ä@a ¤śt| Ē‹‰Ę¶ó„` i1w5LõšuVÕŅęEā‡1Ž1ѽó{3] Ö…Ķb4X|?ł410ÖÄ»G}z_8ģ½āXtą#÷•W­’9ĀZßR$ |)²—œē,ź('ō@õ¾åĮ’@ģžēŃĒD¬MC(o‰: %‰&‘sA  @y[gųĄŽ-‹S8T 8+‚-kL=>īõå9æk …Œö8?.9e šDPeE†2!:SDhę¹aé¾XꦧZ `¤OĘtbŒ&é*ū-ALā¢Žš‡|–E²±–fŽi¢u=N&Āc°›X_ĖåKo™ŗ‹}§_AĘtž„X ŖE$¬ćµ×x —÷ųĘ$ļßR\ų"vĆzœ^ŅäūJ6Hb#u“dĶ,锦O&8˜ļH–§G1M,ʰĪN]R3åץŽBÅY†¬F~^@R©ą!–.i3aPĶL?įrķeیé=ĮŅ­ūDH©Ēń@ ąÖė[ŻČŹEGčī>õŁ#K€4GcŽiä%AvĮ_Saó)¦Ž6ÓŠ¢¹«õņb žSaüRkTä€3§9RĪ+ĮtīFc÷½*'Ł ś°³§›„üĢ*ēŹ~1\ąŃĖéfaÓĶ1§›’qև_lŽ>Ź®„²4J…ᔆfFn?ʊäukhk1…Āästču}ŖøĖ”@CÓÆØ(]“¬Ķ¼æćXd0˜†LĒļ×~‹ģ7X³VĀe­""$ ”ƒƒT%»=Ģŗį ĘĢīĀ"0†Ą_5R~dĒ(Š:tś„ę1ū 0 pĀ(É @³šõ'[ÄÜӕU8ÅFĄ“Ą ŅĆY>˜ōQ1)ĆӚQcL²ŽĄ/ł–HYķ,óÅ%ŽÜü&ńĄū’ó'æZ©ńŹČ_·{ėMjpÜS8²l4$‚1?˜ŒfLPüźęīÕŅ–¾ endstream endobj 20 0 obj << /Type /Page /Contents 21 0 R /Resources 19 0 R /MediaBox [0 0 612 792] /Parent 8 0 R >> endobj 19 0 obj << /Font << /F35 4 0 R /F33 15 0 R /F41 7 0 R /F38 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 24 0 obj << /Length 2613 /Filter /FlateDecode >> stream xŚ­YYÜø~÷ÆģĖØ·¬ūš›×±ˆcŲ³Łq8§[±ZŌźŲŽŁ_Ÿ*V‘¢zŌvvaĄp«Šu|ÅłńīŁ‹·q|~”įĶŻĆMQųq–ÜäAé ĢŌ7’ö>a¾ūĻŻß`oźī%ņ& ]õ śŻ>JO=ģ¢Ō{ A/Ŗ/ā i &śū3\¾gŽū(ōÓ(’#§ŸeŻÉ±t@ˆÓ> _ʍŠUɁ7GÕ÷MwųĪ¢üØÄPóq»Ō'V¾kGÖ? ^†)ĻŹ]˜zæńĀŪ”łĪŅä/bŻtµģ%ü×U,Zė»ö" ‚ük'jāskĶ„`6üĪż9ȍ;sYA¾Ē Bä~”Ēš@ˆ$tĢ;šöøL¼G5HŞÄų¹Ėn¢©ZŽÕŠōSƒœqw%:Z¹—41ƒ Ć8)U?ß퓨ō~Žå±÷ˆī„Ėē¦méƒęt’u#&Ł>2«Aˆ§#³ä õg‰DĒl@ eį^Ō*#Ē~š”ĢĶŲ·ĘPO3D“Ŗ؅Æ? 3æŒsś>„Ļ_ĻĆj£pQ’’@Hü27Õ"ŁptR5o™ą²F&ż>ģBH»({ĀŠæłéÓ+"Žt‡¶4ØĄøI`-RŽĻq%ó³=ČN¢m~ĒŠ_Ė׉i†%ŗgW/c—Vt‡Ł¦³^ £Öč3 ©ę–# ėĄūFerķ¾<µœ9Į¹ń ńD;*Cµ ]ź<ā8EO£…‰7Ģ£ä }ż°ås%lqœ7Ēiš»Iü¶fc tډĻėĻG> źtq^„N't²ėÖk:łœ 1d}t/rĮo”Ž8qœ%~”Ä&Ž÷b3ÖSæ ³cƒOĀžŌņŁ‹ŗŽb§~’&–•ŽŅŃÅąĀŽ¢3)¾hŹāŌ· ĖĘyūD|‘ĪśF³ `4łCŻtśĪĶt$Ŗ“P(:©aPgaÅß¼?ż°„Fpq®ć•Ér¹`X(=eļpǻгq ·¬˜`)ģŽu‚ƒ»DS…÷óQvōųcM;ž™ŽĶH†ūs ¹Å߉)— ģ›Ö¦‘˜M„óDܼÅy§¢4RÖż"÷šR„į¤ióč¼{ǹŖä8>Ģ­>–É\µ¹8Ö9ž*ÆĪ&3ĆB§&"īåŠmÄŗ#żƒęš°„ł׍“lż°Z’ Ľ›˜j,enŽ•qyh:“ĖW92©&O`…²uµė÷¶šeą#D÷»Ōnx'>»jŃX¦id\µō“ļŌÜA”ß~=O“ĶöütWĖŹG›®ĘAĘÄ|ŁK2­Į¤WćrWĻ}ŪT|_i`€ņ}”õܚ…é8Øłp\²g6iašŹö·»4õŒ›*ö®z‹‘ƗŠO²•}GŽCånŃĒI]ōčÕhĮīEŠL?-fŗż×ķ–I£ŲK›H‹gŠ…NžŽb¢)#ĆKšń,ā aŒ.{ÕÕ×$)r?ĖĶßüżŪ‚`Q”S1»ą)5ŲoO×”$HA·lm9.^YiPn}Ėfx@I%[6‘&Īn5üQ„śFš­Š~/ÆēŖ¶éļ±M€$e…w·+Ą_x Ś(šōGā(¶ŽĆŲS`õ-ą†ŗ[j¦ē‹SnÕŲĢĻ2kÉŪĒķ{ %Œ@=NRŌä•ū<ņq×J«Lj–D śq4_PdY ¬mhx/4~I±,MĢ•/ (‘xOyężw'Z8)LWTž.˜‡Qń÷Ä1Z£lŪĄ0œ„jČ /¦F㹌15:¼¶L ”5qæiā°ō3šQŽ„„4q±?@ń¦Ļģ±”aš~L߄?™&å·B*ņÓą"¤±†ą·HŲ“uvƒ_ŗ ¤œĀ”  (Ė;©^ćƒlé<@Ģ_8}Ī:„†ƒ9č~&øD)Ń"ļnE†aäGaņmõć<¼P_Ÿ¬n EˆķŠv˜[­LCs8HĻōŽ\ĄQu®6ß ±ÜU÷¤(‡PÉq°Ų'ńÓ"]j0Šā€cīŠ6[iLŃ­:œŒ²~Ś‚eFW˜æē½£œÜF,sTÄvjŗ`ķØˆÓ#0o ¾»W§¦£NėņŹ@4Ų"š—Ÿ>¾ŗ{÷÷[÷¶7{×(IźāŹąį֫ܽh]čĄĶķęĀ ŠĄšĶpK'ė)m'qµ›°ńÄMŃÓbē'¹Ģé*³$²ŒLGię9Pžc…ī š¢B²‡ć÷śŽ}󡂏©†Ó¾˜—Ō[F9ącj«sŖfųĖ Ķ8^“”¤qž—īkI-üÜN“ĖM°gIEv­TÅXĒK›#o?\O¤¹“H‘żõZķć07ömvīa va|ŸŃFŠĢ ėü߈Vqu=„¹²˜‹,«£R Zlødµ€ŃAi“eŽŖ­/>Yś37č¼wż !ŒļÕĒ÷ļŽ’õ%&ہŌ]c Č|wVP‰)A­: Œ3ÓųŻnŽR”– GśT›Ģ:µy6Ь ŽĶ}ĖgQŠxj@i1’°"»&†!QYźž÷©71ß =@˜Œ$tµ< b8ø&l’šīĢW“¬Ž]óĖ,G£Ļ ?-MĢQŠ4cSSĶ­hl/1 <ōł24‰ŗˆÆ=†\ ¼ŠĄß&RsŽ0P–Ę”¢“yγ¹£Vʏ'Z7¦ŖŅM›ŪžĻ¹hß2nßž¹‹”ń–ē?ÕØ½ŻĀ%cC¤~m(ˆc°Ī°.ųAżČßk“K=BšM8Š1 sVę)‚€Ō ·źbøĢ阆mä 6[°‡vG–Żx”×ZEcØ(iÆŻ@_mlŹj¼*Į0]“'„•±EÜ*CAęGÅžČbĶ ×ųu9*Ń:}`Wó³PF`,H½OĶ©‡Äs›ÆdÅź¹ķöćµĪ# ’uljź8D„Ģ“kA“е *¶Ī'0“ūQÉĄ³£āN\B·åļĀdn,sōBŅ7Ć%|3O-¦ZXÉŠÄWŃužŠCöĢ8²AI#ķN°|żš•×’"ń‹åā¶ŗöX’łÅcIꉓ!E;¹?Kł…F®bó؂óŖ›“ß4Z|6ü°ų¦Ļ>7¹¾1ä«/BQĢ%_ß~»Ž,0Ęń„å}•< G”Œ–„Uµn«æ 0:Ś7”ŚEGGŗ ¼ ƕgoīžżuū endstream endobj 23 0 obj << /Type /Page /Contents 24 0 R /Resources 22 0 R /MediaBox [0 0 612 792] /Parent 8 0 R >> endobj 22 0 obj << /Font << /F33 15 0 R /F35 4 0 R /F41 7 0 R /F38 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 27 0 obj << /Length 2540 /Filter /FlateDecode >> stream xŚY[Ūŗ~ĻÆ0hWFcE¤īĮA‹mšspŠfŪf·8-š>peŚÖYYr%:÷×w†3¤%GFņ$rH“ù|sń_½ł1.B„ešŹÅćf‘ĖE•a”ˆÅćzńļ óåJDQ#7Ŗ9j>Ūģ””Ń^b¤ Ō×¼ ¦Ł„ĖUš¤Įßz= s‰B„qę9ŗ}s{•£Ümņ’0Ŗ7ø}±Jā<I¾X‰8L“’öéÖ莟'Ä"|>EiT©AÓ¬nݵ©ń‘Ÿ—" 4l“Ųk$lź‰`ē_ų–ŗkńi"ī6p ­›žŪH“hš¤5“,ƒzżfq®É(i˜Å^!?ōŚūö÷s‚Z¹½AØŒKĀgS“qVŅ4DoŗJMTū$¶ō Cdga“FF€tkhDęß²čX ©8Ź®,†‰(¼“óF Ēf‰F@7“ćÅ_?Ø=æ†,Ņ2ļ[ӟČ`Ą~@NÉTN݆¼WŃĒY³›Ž{ś^hš¤é[©¶ŅM£×4½ę}"/B{[’AÕ¬cęŅK#$†E‡„d†SZzÜ1KEĀ„Ś'œZ£¾Šøčū~ÆŖaUuūƒ2õS£é²h*–ūĪč·h±qšŠõ Į, ^ćļ%J¼×4¤#eŠ¢bR|’29KPOŖz~Y næĘ5ڵ9¶•!gЁe~‘ Ęæ¤=KŠK$<÷æĒŗ×ƒēĪ:ücŠćœEi(o@7dь`\¢ÓwÆŚ›9õˆrģ(ˆ¤ ^vµe7)‚ī {𦁺¶ĪO4¼v" ½uK ¦Žkk¤eš#ŖĪʑ„7²E'õjčŚ×~½gzĶ*š‚N÷ä÷ Å$žzÜhtĮÉy ŽČ÷5Œ ĮZCB‘=€G,ey,!±ĆDf32Œéćģ Łt݇‹»Ó”<ä2vc-AgŅ…ī‚C÷_QftČ;bģ{‚ōĀI4õ`hd±".1^įŸ`åszÖ-Z ø€… ų~®ķk^,^ĄO¼Nī (3¹eÉ"’pūmÓdŲż×Rg˜Fą%€Ut+©²ęēŒ#Cń]‰D„Eyęčļ×9ŹGį±?očĖx]CÕcP$WČK”SĆsxUžĘ!ķĘå[C·÷PčÜ&»ŚĢ³X*„gżé›Õ_fłOÓGć c/Ł€dvVŗ®‡C£,<Κ$ø< ,ņĀ2K¶Ģ;€ļ=õ`B¶µžŪ+øtęT[QĪQ¶ŗµŠÄB'™ŁQoht¶jb~ü²Ól1Š>ćL $ĶĄāćv‹Ł [ŻŲ Ź`ŻiŽ×vg'ŲøsĄ,Ńu˜”ƒ®jՌƒ‡<ĒīB‡jjćcRŽnV) ¹äDœ~@¦ƒ8}ĆH{@üµ{"ŠjĄ†Ö¬ĘU '¾Ū鼙vńöéĮ"µåsé`GÕAf‰rš ©;Źń1čeræŹŠ HJgz«ēY÷ŹĀ²ŽÓ §›Ü~lÖTŸ4‘@(L±4P΁3 Å;ŠŌ¦1žAū;UƉ‚v‚Žŗ-ŠŹ”ļ¶½Ś˜Gł9šw«ż”Ń6ē•ēh~&³x*¤Mēj!J½J9 %0įüF#Ɔ™¢Ļ”;ng»vĒ9D\CZdEų,mūeŚÅĀAŲā`FPÅä±ū zŒ>ż„+ŒōĢ’Č‘J›?Qfga™\¤"Ž»ŽĪ±Œx Ć’c»™›U˜²śŸożK˜bjÓšųʱrCóß ōżķ-}?É8zŽŠL»x švW†ĪkCp‡'ėv0£€¢‰Å§Ņt0ÄTŽKYx/Ē9MÉłĪčǽnƒZi³«9ē"”‘Ių¶šKŻÖ¦Æę^”Af˜z7ų6.€F—5 šˆ*”Ņ£fé‚<éŸNæ1T¼‰Õ {o,±öq±$ĄT*J“2±±wP_$ÉÖš,Ø#]­©ro+=ŽŲ·\K«œA9čŒeˆ”V@ĻGČ`ńV^įė$(Ē ‹C‡…øNŠ"œÅĪ@8dö+ N®Ņ2ʗWjNiy¦™÷0³ÖQsŚJ¼ćÖķEx¾ƒ0)‚GN$d֛V„K™O łćūdõ÷ŻgȜæQ”Ņč"yG4üą5lµŲĮŸ:ś¢¢ĢĪcŠEąŌ§ļ ²ćFEćƒ^-]¹]$Ó|dH¦Ä„eŹ®5Š~ØSND太 (ü –ŠęŽ’mvUžœ]=¬Į‚ķįsół†F,Āä\į~üĒż|/#)ĄS.jtĘ/I!”^“žāN…ķ;qĮ†6ųEX@žPć#qŖŽ¦Ū+›HŚ]'śņ#px%*ĖBī9ķ5¢ ŌnM“Iī(-ū¼söŠsćŠāŽAEȁņā¾V€ü¼µ^1–¤QPRõõ“K<čŹųF@ņ}“ˆ8/żPŲŽP­ĘņėŪłč7՟†Yéń÷ńīZ2¼d¼)Z€„ƒm–‹«_ųrr“rr_P0µXG¶#g"ŠĖ;i¤fÆ-²ś_%A„{£P®Hō.ö˜Įa®H?Y ‘&źēõ.›ŗÕ4ŖŪŖ9®5?§\’j¾Š)Ć\xūŗAAZhi»]owf¶{QŠ‹ī…ķé‚oģØ+)ĒĀ.ÉĀ‘ĶÜqp!7Ė­āµéė|RoO²L‘`$q: /Ģ@ę XĒp Ź02ģ)ÅŌbN“Ԍ­†ŚJ”ż69'³źphjJsŸžņ¹y°ļZ—ėVŖŃķZqcrŲ’CnNälņÄÜ+0;+p&ß7®Æu]I•ę¬6¹®œWgaūV£fTj‹ī”Ŗ°Ō'ĢŲ¤ÓµkƒH_·ņomb“NŅSŪÖćĮTū¶óĒ?8—ppk›īݹā^$I(ó‹äg¢ļIČf½P•õĀ}Æ_Ū9ŒĪ½P£ų”ƒ‚:ęށź}»vŠæj’SźŖņ²łõĖR€åŻ}¼’łž§·š{P>\jB[²×mr-Zž½Øņ…Įö[Z£-HćO;¢×ųw€Ŗx׋¶Źņ…Ņ:V}ż äMrZiģdŁłp¬v,ļ™w(–‡y& Ӌ%Äd(_«<…’’·ęøōźżć«’ä…ś endstream endobj 26 0 obj << /Type /Page /Contents 27 0 R /Resources 25 0 R /MediaBox [0 0 612 792] /Parent 29 0 R >> endobj 25 0 obj << /Font << /F38 6 0 R /F35 4 0 R /F41 7 0 R /F54 28 0 R >> /ProcSet [ /PDF /Text ] >> endobj 32 0 obj << /Length 2212 /Filter /FlateDecode >> stream xڵYmÜ¶ž~æbaōƒšŹ"Eź%iŲFЦ…“>4(ā|ŠJ<Æ`½\ōāĖö×÷„Õīi}ē¦żrK ‡Ć!gę™ޛۛW“P~Ø"¹¹½ŪÄr©(±¹-6?{j»AxƋĻ[xY“›b»“:šŽ¶Ķ‡ Ē.Ź¶ŁžrūWÓųi lvRł‰bQ?mćŠ;vXjåu&+z†^ę(c³Ė/„ŚłĮl…ö~h¦2Ģü!ŠĮGӘ.«Ŗ#ļ •{K©ż8Š”ƒŻü•ņWŲ½Ė×4µŸč™¹ķÖ$ é§JĻǾ{UµyV=!Z„±Æ“šÖAqĮGZbßģ”–~ ĆĶN„¾V)³f0]]68®H#ļ]¾½†#öeS”ĶĒž%ŒÄ^ŽVP3±×ēS›~+<7—5ĻŌY³ŠÓń°7Ć@Ā|,H„÷Æ­Ąnķȓ9VŁå9L68}2ž¹7]ß6YUžŪŽū±W,6™Qjį•ĶŖķb?bŗ±?üåĒwßæņÆßp¢}9v:µ–|jŚ¢7•ɇiĢåÆį Ģ\gC~`ā±;}öŃ©yŸ 0GC åŻ½3y[צ)8(¤wßµ±3lZsć“|~Ķś•äõ‘&óćž,eX6y5Cå&fķb’ČOD8ōśØŠ‡6'—sqĮP|ąsiU¦żŹįĄs‹ÅEXoܲ÷øBŽG¬P¾šł1®:L_5qe…“I¾H„ĪŌ¼żq¢N6 άw7~éĖ čĖξ;"€Jų©ÖrĀ––§|Į\:ZrI\Xš®^Ų™4!“‰ļż±²ßÖ.vdŒ½Aƒ%,ū)^dB¾täAÓenxģ\ĶŽV-+‚āz†i%°zÖ“gM­dr,śķĖŗ¬²Īmמ¶Å@œ­{ė·“¶9c“āŲēČÅų®ķ.–¼‡ĮS€_žÓV\•4 Uzķ±s"Õ³"$Hōy„;ĒŹė‡Īł'ŌėķX¼åŽ0Ķ Z[{uDµ Z“ćŽFhæŽķ`œ:ąz‚BÖMgU_¬iįüŃ2s€¢ ń^_Ł’Éł!ė²€ÅÖ•šć$:æĪ²é0JĢ%$š¹™ÄNŒĮŽšdgī;ÓĆjÖchĀeŻ0āŠŹŅeMēœk,”¶ü;” 6²ü· ‡Ąåš0¶µ ¬sĄ«‚bæÓeŲ¶qƒÕŚ”&fH„°OŅŹ\_iķŁŖ*^hD5—'öĆā ­ß»ĶĪ”ZPī*Ŗ6³Ó±ƒ^‘ QŽŁź|¬†5kG©Æ„|(’WŖĖ²v¢Ø@é°ĻöՑ)wķČGH®qiźĒ±~nż ,ŒÅõ·pÄ’eż­Ļėo:3׹!üWØsŒœJĮą¢Ī%J—O9ćJ2_ØśA†Į—źW,QĆ֘ĮTcNfĆĪ~Ļ0½ČN4Ž»łSv¢/ėų匓ŽF"BĄE‘ƒ£šGŅĮŃ{.ŁÖū>Küē}C֕š’)4”X\ƒ%”u"™Żå³Ūx5Ł€Ķ.ż§5a”dõIV5®į°E ƅIčĒhM~¾”ŌU(uI–ņi|ƒ?ć›óMŖå5c½§Ō&Śkļų÷q ĘĻ[©Ob¾ĢĶŁŗ&±•9ĘŽZ›ę‹Zv֚ģŪ-õ«Čŗ&’ħÖLŠ|Ę®k'™NxĘōŖģxxģŗØ•öšBSņ®¬s¾=6֏‹—Īå·4WHSĄ°˜±æ$,fPė±<ĪŃ” Š·ŻŲ‡–xŽŒæŃĘęČo\ƒž„`_ ŌóÆ9p(Į4£Ķ's|ģæGŒ£”½ÄĒæĖE„~[XQJ¹t‹Z²Ź»’|1Āå“@Ģ«ĻB»4$gžģ²c-²cL]UL¶‡·“Œ ‹'*šÜj›ĘĮÄOF¶ķĢG*ŒiŅ­DĪ@Ėn;$pĪŖš&S” ¶ÉŪ±æą“Æ.Ič=Jūlfēd+žŒB‚ƐĆ,TĖöTŪ>€Źż’Ÿ†lł½\ć²ķrĮ)ī@Dś„ś:šœŠ½ó›†IŒ¹‰ļļMĪ,n“½[|ź…@“MģŹ ē ›*ue#=@äc”mN0¾“Įc{HZĀÖŹźūuÖ£ŗœ3ä‹zµkhĶõ²ųę6 *”[įqiWøFJÅī%ēBCV‰ļ3öŽ@€ātCģSĻŁ·“ÕŽć8¾lrĀ«½]Ó¬×ĖĀąķź©Ń+«Ó“ŠzåČNlī=3ŪU­ōÓZ͹÷ŻŗRǟgc2RK?‘‘¦Bb覊ēģkˆļ̐1… ųŗ\½†©ŗ-&7¦ų‹Øµ#ĒJry~bŖŽßR<ŚĒĆrÜӋ{T³¤e I‚¹gŒ8…k~xBś*g58„_ۜ~1¶éæ6–²Š>ÄŅ­zž®2›8‰ŃČnŃĄu¾¤iĀ$ńś–gķhp×VUKē~ąT‹XÅĘu?ņxļÖp_aÅ“OıKØõ7ėM¾­©v8-ōn"~Ś…_üŃōłw«Ž·sœ,5ś:©C¶ŽŌÆÕµUžŚvf»ę»uC©£øĄ$S2’Ņ%‘s endstream endobj 31 0 obj << /Type /Page /Contents 32 0 R /Resources 30 0 R /MediaBox [0 0 612 792] /Parent 29 0 R >> endobj 30 0 obj << /Font << /F38 6 0 R /F35 4 0 R /F41 7 0 R /F56 33 0 R /F33 15 0 R /F54 28 0 R >> /ProcSet [ /PDF /Text ] >> endobj 36 0 obj << /Length 1492 /Filter /FlateDecode >> stream xڵWKŪ6¾ūW9ŁĄšįKÆ (M -zhÖhI²DŪźŹ¢CIqÜ_ß!‡’-GXģšICr8/~óŠżjöśƒ£$„) V› IˆˆdӔP ;Ešiž™²xńeõŪė°sĮ‹d@‘ėÕOeŻ(Óžü yĒr—žyÉ9 Yų2Į;½WϽL¬Ŗ‹H=d[Õn+øŠĒś67‡,W70¹R›öęšr»»Īž÷l/4öFO¶aƒŠš’Oņž§Õ“rįL^Źįӂ– %2‰Ē‘|ß©ÅRšŠ ‡o4/ŹĶ–eT«×Ŗ=*Ućā›=ĻL©»Æ“ŹģĖ:«šXķ»*kµiī`-å¼Ż•žļqĮč\-X8?!kYØŗ-?SŹ•ĮęT·Łwdßgž­Ömožd…śŚeķŁrš°d‚„2EĒ Õä¦t7˜­ĪpP­Œ•Źų„5£š†,–2Męo<ĪšāŃrió˜ŻÕ…u‰'óæ±˜ŸLįYŹŖņwŖFć^–ēźŠ"=vŲ.Żn§¬ńHē­‹#l×Y[źśŚ®śŅ[’ŠNś÷lؘČC:?é‰\wUdר)Ō2’0Ž{ÕS ‰]žƒr9…/€•ķ4“‡}H XōńGšķćNcI¢A#@±Ņ`½s£lż·Ęļ×N·Ŗ} ×Éök”}W5.ßµ¦Z®±œĮ% ) S1†Ķ]ՖF¼sńt ī8PZbķYÖcÅķΟ5ŁŽSś Œ{M’<dī (-*ˆA2®&I…Ķה„T }’0"Ph(T{m üVÖ[÷»…¹ņŽ—u'ĶTx>VĢK}pi÷fźåEDā”uõ„"[(GU*$ Kz¾G°˜fæ¬f_g viBcIž"†øÓ0Č÷³O_hPĄ!ą™ˆ4 ŽŽuĀcT<ĢžœŻŪ©f¬ŽÅ a”9Y‚śJ‹yµ)”˜L•?F#wgÉcBS’Ž+¬N"†DŁļ3ū”vįs(ć‚ÜÜĖśĆubÜn—P—!ķ)‡!®K œŒJ`6—aĢĄ,ÆźÉ ^o³Ćw©ébh/Ōj(bĪXõ•×£ŅÕĪbœh/䕫§ŲÜm•c­šĄ1õ–g‡ĮŖm4坮“Aņ!ß©½z ĮüeĪģ ‹07°éõ?ąŃb‘mŌÖ`šG2>Ėżz fqHŅ”O”Œ'ņŒ2ž„ev;;Ŗ’ šƒŹń”=»5Ä"”7Ę]ģ‰ «³sŌ+u…é,:“źŒ>˜ŅõP{‚žŚVē-īUeÓNIŪŚÅ%jČÖ®Vņ^Dƒ‹ŅAK@mįO,˜ø€§wˆĮMI$č”_“V»ļ”õ4nėņ_Ɲb£«J[<J½iH^$ļåE3 ÉĄÉŠ×ō;E4 ”ķ;ČÖĄläé“cŽ~±®:åÉ=Ģś€PæŹOYįø+Ūž©P› śĻ¬DD{Ė R<„®DLøĮ%IĻ^:qtęŠĖ—ą)bŌ”ö‘ų t±~ endstream endobj 35 0 obj << /Type /Page /Contents 36 0 R /Resources 34 0 R /MediaBox [0 0 612 792] /Parent 29 0 R >> endobj 34 0 obj << /Font << /F33 15 0 R /F41 7 0 R /F35 4 0 R /F37 5 0 R /F38 6 0 R /F54 28 0 R >> /ProcSet [ /PDF /Text ] >> endobj 39 0 obj << /Length 2537 /Filter /FlateDecode >> stream xڽZ[oć6~ĻÆ0 ĘĘŽ)ībŚE “@Ų6‹}čōA±•XXYŹŹņdüļ÷;$eKŽ”dbϾX$ECžóén®>ž$匳Ä1Ēg7w³4M¤Q3Ė\ĀFV³?ęŸ·×Žüņń'Œōę†ęŒ…YM¾)ŖUŽliźÕ7W’½āxĒfųF§I*§*Ōl¹¹śćO6[įŻ/3–H—ĪżĢĶL&ĀJ“ŹŁļW’¼śÖwĀӈ„ƒé`wE™‡Jݟ¼Ądā»ą2ŃŹ…ÉÆ«¶©ĖķõB(=\Ėuhžę7ڟ ۚÕĶÓ9«¢É—mŻģ1‡”_[9ß7qĀcQ–”U?äMÖFzu•\/$Kē7ė8²Źļ®9›g»² E\Ż'!ŁĒä(Y?˜Ä­ō¶ˆŹX‘hn¾FqłŖhGt&Œ“±2į֜§4ᙠЉ³qqu¹įŖ\Ž—įŖĮMé!×e½ŁdÕj-Z‚·˜B‹t|Ž’ĘØŃ‘ńŻ6­¶O/RߏĀć”Éł5×ó/Ŷ-Ŗ{e“¹Ö¤Õ…•2`‚¾Ų>äĖ"+c§mšŃvL—ŅĄb•锳žĆ»÷cŌ&1"ķf¤0¤·PBA\j(†÷ļŹ¢š"«jE²ōšĶoóšlņ‡2[’ˆØ÷X“ėŠŹĀ#˜Z•māt’!=ƒ żÄj5ų‚–ZÕns›7ĆļŖģZ°łēāžZσĶõ^÷¢Šcė¬ķ/aÜ®Œł6% Z#.cS %A˳­ņĒglź\;›źs}»M mŠ›ŒE›ņļėšŒx`ަč8ŁŠ91%į¢)Ń»ƒ)y.ė¬É–-fŽ·‘{•1©Dk}‚zпͻEŌćŪŁBĀqqbTѰ‰,<¦€¾ß:ž“u3ųüēUž•åžŚčł¼”c-0ķ(@t¶ėzWĘö¦&×ó™~:ŹėŲXn=vń„š—Ł¶ CŃäŠŖļN(„EĒÅ<®óʇbf°×0Ģó 5Żs€Į ó d֙¬ßžĖ&ĒŲź’õ“ †q %ZܹĪėī§-ō"\£…øža”JDŻ©¾…b4Z(†ļBv$¼L}p£N^öTŒĮc^Å=üė]^lóÉŌń抡ŗ²¦-–»2‹DNl]2ėm}uGĖ' =głV'–æĪš)Ü}“h7qű“ō-o‹M>–dI‘ų.Ł6=3—:qĀzZ:ՑogČcx“ČB“šĘ›ķšf X£Ńö~G„žåŲƹNR§ŗ’öćÆcĢ!B)e7):5>&tąĆŖŠźį9 x¶=’E+õöĶ' t]~Oū(ĖŚ©Ł˜Ń…ąĄešČpŻŻ-2Åv×uEr±¼›`ĆČ&[å‡h\/+ÜԁnŅŸ>ČniC'ėĄŽ¾ü0ĘĘp0g ŅÄZ>ŀwyœbóQ6Ö$L‹ŸU¶g“¾€•CYC'ęų*dK®slhų„Œ²9eķ‘õ>ϚI标Baš>¹-Éį”å‘6¼įs“å mš>M[$ŠėžČŠ)Õ Žfö„4fļŚq•+f=\=BØÓĄJB©Ä=ܕ“š ŃDń˜ē’ źŃĻĄĶ’įC毩IŃ˜ČéÉz~Š˜·«æĘķīŖ)Ē«e›•T ³gfā¤8„%e’bźĖŽó)ĒėXgģčxŃʦ/œ×ѧN;^ė܉ću¬ēxėÆc=ĒėBätżÄNľsāzņŠ›n'}7½-ā)“bæķ¾j³/üó±nĮ:‹Æ(įE„qé ŃŒBŠ_gŸ@f<- Z/‚É!yĒøĀqä ŚÓoAž5¼į$ėŒē¢ā©óīĄXO`Šč ŠŹŹC”ƲšøĻ«¼)–”ƒ4µ”Å*§Ü«ŹGO=ŠYśŠebŁIśą·ż×ų‘ÄHŻ}£ūęUź"U$Ń2*ZcVŽ× J‹ĶxÄ<÷¾Æ('•ó¢jż9ä=Ud’©łgņŖY¹ĖĆ{_1ŻķĆ%^Ēóqzud껁˜ ¾ ¤‘MžmwM$!‘§DĒMļnÉIhĘ:~ė­ŌO 0ŅH]…~ŗ”\Œy”0”BśĻų ~¾ӟ†JÄKśK1_¦3T–™gžB§*œ{ZZŁżżķ;žŻhāŌ/2?`w” ÆĀ>× Ō eµ¶ aŚĖ124ƒ”…‚ŹŚ,NķNN©ķŻ'žƒČéƒq÷%Ŗ–{@ǟwė4(I§ń(•ZG©&TĄ9D"Õó: ‚VƐ%Ū3ƤL ¹æw“§:Ó:ą}%¤ŗSvŚSzQ hu‚×i<i“ĢīĀ“ŅwĀŗv4ä%.`ėČ ‡šīŻžH.;Qs1wFž-öĀÅį}ß”Kż-Öæŗ¬‰&žŠĶš<ŒgŪķ.NŠFŽĮz¹Ü=æżh±ÖšōÅüWĮčvQĄ¾Œ:O§*µ‰A4!ZJ„ój×d]¦÷ŗŅ0T:ŪÄßį]ö„ńÅ2@(…C^¤ Z2•ÆĆXš}ļūсzсŗńŹ-'(”Ź·Ż«8瀳٭$Ü|ŽÅ)±ĢāŃ9dń¾¤Å™q^§¤īŚ“»ķžž(r$2ŌU«½XZŠ)`½yŲÅ⢟ó“æbņÅF81/{GycJO.ž¼7ĆŗT‚ŪDyāsL˜–ž–Hõ›œŁxyń4ˆĆ…;ć.’-k¢~Ėüs^ņÆŹ8jĀŹi ‡rźös Ž•ÅŌŲd_ŠĶn:Oē±Fę½JtŪ1 Ļ,<üŁ5ČOĮ‰ņ<Ź=ž•¬2Øaį@yŹÅĻ“¬2šĀ“ākŅ“š:ß ß¢!v™žX”æŽqGé‰cō!śłg’oč†kŚpīŠn<øqĻ O ÉJŁK¶(‘ą3ƒ¹ēÅ )Q…Ąé)ro1Åųēl¬ū+Ź!› Įp­ąą¶Źŗ · n*„!kKö;÷Sßę?Ž„ŻrwÅŻä1܀9·.³2ÆVY3’¢ ቸ&ńóR4Bćiń‡Óö-]$ų\YĒ5ŅĢoPÖqɁ²Ėü%†hŃ ĪqæāÕžģ÷'ezvŪ»éżĘvŪ FóqÉ©zĀQƒZĪüō™•> endobj 37 0 obj << /Font << /F33 15 0 R /F41 7 0 R /F35 4 0 R /F54 28 0 R /F37 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 42 0 obj << /Length 2433 /Filter /FlateDecode >> stream xڵZŪnä6}÷W4ņŌbļ’LģĘb1^‹$rKv7¢n9’zzż÷{Ф®–|™ī‡iŠ,±Čā©ĆŖ’¾»śō«R+ĮY±ŗ{XÅ1SVÆ"ž0®Ń“­~_’ĮEtżēŻ—Oæ¢g ė›+ī„īõ3I]żrwõ÷•@7_A\Z& DJ½ŚģÆ~’“Æ2Œ}Yq¦’xur’ū•b2Rh«ÆW’ŗś™–6Q'¦b9^[‘Ė åW§ĢPüFq§łF(ftāÅæ¦ūüśF¾Nėš{_^ ³žF’å?ś¾c½;<śf³Ķg·.$Ö¢Ū½oŅ"?diõr’Ņjf#³²‰aļžci#–čŲĶ„90€œ3€–ŻņŹ¢¬ü~źĶ6oMPaĶy•gžiwšæ÷e‘±0ß7R f°i4˜örą°‘b"²A‡$K";0Žž(:DģŃ!¢—萺CÄŃĮ™£÷ ƒ‹5 ³Ņž‰ˤn.-£·ÜC fµ"{ņaxH’õOŚł³7F–>{‘Ó®Łś®}Y‹Uł~GpŖ[ˤ/Ņlw5-°į1v©Ē6?ķŠ"o–ļńEĖøŠßcm›ZaیGŃyʎ`>“iĆbą[ƾ¼+&±ēļpÅSž’õŠ+Jœ•—qEĢ„l੺I«¦žQl!|)Åš}3U¼/Ü9ķØ)üԚ¾,ņ4œĆ·kiÖiq ‡õ7|ĪĪQķ¦µóMuĢXp½$éĪ£¬ęAĶbŃĻõõĀd čĄ„‰ÖYŅĘ·²¼É+8g^÷nöĮeU·RιŃ(&b˜y D N@”ł üٱČga$“xÅÄn¹óÜTPi7—L‚› ¹ŒĀ‹( ()Ż–ĒźM š‚V ˆ‡!ńN­Ńéāł“ĶqrU+ÖŹļöŽ\¬Õ\‹uĻÕč9ᔤłO^x¦ŹŖ”Ų’–Š21šBŽųFI}Óī¦9©^€GÄ÷ '/ņM³+sš‰Y¬ģŹØˆÅ±:ļ$q=)Ņ\Ļ2|"x”їQ%pŖh¬t>‰S<…’ųØ1|0ą£&šĮH'–{©ŽŽ®wx(«}ŚvÄ``ˆšĢĒ Ŗ ŗ`TÆē’‘&mŽs÷B"²2\8Ś<ė “d"4—É+č0ˆĢ ģ"J)ŗ#v*]D‡åNńG/øå»£‡Ēš†Ų+0į:Ģʄ—†ØGt©’ńč »'ĢÜ£ƒf/ŹĶ_ļ€Ē‡¢ ,Æ7ÕīiCŻ%pAm ‹Ģ¹īŒHĶĶdĢk ‚«4Ńę2*éŽ}¤t#&Å/0"“!…Œ1‚±–B&ĮȀBx—ų!śfzȼDī4#€Sū¾“ ZF„ŅC#QfŠńĘt}£„r‘5ż:čRcˆ×1ø ­Y# ŅI¼¾£Ę ¬@ĖJߌ”‡¦*‹z2æ'JߦČJ Ow°Äž©^X”©Į=³™6æ ĪõT•ŁqÓf÷ĻóŠēČRŗhņŪ.?ĶdGČ„Æ©…ągę¢Č®„I>;N<¦”ńŠ1 s[ˆ™Ž_߀ā2ź"P<‚šńIą>›Ł’,’Żź26„µB|×U¶·ęÕŅU¦9&L.r“ŃT* •5z]ĪS†ĘŒ/ #2ˆ̈0š­aąyŪŸN,ČĆ/óå• Xjø“ŠĶś·m~˜sÆ:'oÕńŗ)ēN`•\¼ćŃŃ8£;¹1eŌ:8ęn·AmĒ,ų„lģæn3Y8„…toyø¶ć’į`ˆš©9(ÅŠć˜ŃĀRœEG 32Dȃ¢q\é-Ś1tyō ŽčÆ!›råmź†ilފĀUßō{Ņ[*وAzĖCPJ÷ĪƵĄJŽECi/UēT‹Å{Ø ŠLXĻ4t§<…µŪ Ę ;éc`Ų™So"“Ōäęģ č <=)ø@š²±īcéĶ<_ŅQŅר.QŅ”¹lözæ{œŃŖHØĖh5>6iÅå·K³¼dÄä‹dh튄hW¼ˆv{bź£]±X†L"ĘÕōHę.;ŃIuŃu؅Šõī÷¼-Ģ4¹#-!Z3"8-kŽĮ"\Iż÷‰÷ó”C¶V“œÖ@Õ\ŠźS¾ŁU…JÆ^׈ŗŠĢŗ.ś\Ļ’ųśO߈-~ˆ\ų?ųw{ūłsØVaÜG<®č·»$mn—xk~— ÖäZæ·J– čXJŁķJwåLŽd±U“»”Żź ZŻÖj9V8Ķ6”Ŗ›ē"|ž|{KöOķF/›Ķü}Üm抺L,<>3D ”³|Q—Ń\=9 ĪÓ ĪźĖØµTÜ·cµ’ž:ŸķZØU/Huž/ś?y’§ÖŠ’é¹ózkÉķ#ė8źõ“P¬ø’ąFaĻ3šŖĀ\`P’fŁ,Ł%z†lhsžlhglØópÜēÕnĢAĢÓ S%‡„ė"­·y˜7.–?ł¤“³Gę3ūIxŗ"Æ÷ɽ ĪO’sKŽäZ^k³8 H}GųÕwXĶ š-ßēai¾b!Śŗ„ų}‹śIh„Hł²ń{†a5Ż ‰Bv5§×¶S¤³Ō—ć! ˆÖH¼£Eōz#”±`$Mž'>üń€Ģ¤ŠŻŻƒÅģį3ˆ_jÆĶ}ЦĄN‚•žĮh‘Õ^Źēš“Z€‡bĖVūKĒ“z–‰cf¢ÉW˜ŽĖ²d8é…bV.óæŪ ķć µńŗź&„…dAĻŻD“šO®įZŲ8"ŒĒŻ!,©„ƒį¦¹õCŽ$ęҧ:ū•` éJcp‚]ę‡@ ĒŚ”šøk¼¤Ėóš\7ö{śŽä݁΄š\gŽųn«"Ž8%ņ@ÄęĢ«%ŅLPę]Ö·šŻV Ķų…k15U¼üŻNfśj˜Ģčwzž5ģ$ŽqsÜh.˜6ÓæRč.Ø īāčŅ»¶ŚŅū"÷ßķW“IJIč<Ś:’­9’ßĀ endstream endobj 41 0 obj << /Type /Page /Contents 42 0 R /Resources 40 0 R /MediaBox [0 0 612 792] /Parent 29 0 R >> endobj 40 0 obj << /Font << /F33 15 0 R /F41 7 0 R /F35 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 45 0 obj << /Length 1700 /Filter /FlateDecode >> stream xڽXIoŪF¾ūWAPMfåš 9mƒ6.rˆs‰#‹ Eŗ$eÅ’¾ļĶ"“2mÅ6ÓÓ,|ó–oŽ2ÆĻĻ^¾"b”d4cŃł:JS"b%4#TĀN}ž]P–Ģæœæłvz“nQGµ©·©ĪŽžŸż{Ę`›F@ĪcĀ€r­¶gŸæŠ(‡oļ#JD–F{K¹ቀY}<ūóģ5Ŗv$ŽgD¤|Ø[Ū«Æ7N;”śä A­äDÉĢ‘’:_ˆ˜Ī–u]]¹Åõœ«™.w—lÖmtē>ä¦3ͶØLėÖūé6¦q‹ŚUŻ…sĘķ¬vM¾¶›zWęn~Į¹“źāÄmuõŃYü„@Ž’\ÕmŃuEŠF€g`׍#øPĄ”hq&gõ’»Ż°×šĪ“Õ£É8É=“/ŗfg^Œa*ąč~Fž)*_91zŻ!<(čŖ1m[T—īŚ7ź@’€o~ÆŠņ_ĘäJFRqūuĪčĢĢ™šŻ捓 ĒĶ}Q–^­]Wo5 ÆĖŅŗJ“ąYJ؊‡h®ė²¬ŃöpNQĻVŁmLÕ¹E®;æ­«Ü[Cąŗ@­ópʬ‘Óڬü1{ČKW+S–Ę]Žø±‡—嬃E½>R§Ņsn[\ĪĮożeĆv––x±½š»ąœ(?&øwژÄ·T$‘*ŠeLh’_õ!^Ąóō²ōŪ®.ķ”9Ƈ-!݈ Ē Ŗč˜×q72ĀOo>üö÷ļ|»„„,P._I3sóÕF7z ·˜Ø¤šń _>Ķ1»iņ`£M m[ŽŻ!G$tI>ʉɋ¶q÷‹±×ä#į ¹¶;r½ėŚ"7!€C°}GŒŖĒÄØĪÆ1·Ü£*Ēer’E^IŠoƛ M  Oī  °Ū*Œ‹^œš>NšC?Np}ØĀøØżh«0žė]-l‡ņkłķU©oܰ²ņ/{ι°3Ćq^»ńƒ¬śõW€oŁ ‹“ń «’¦ÉwXŃ+°"Ž{6 )Į]ēl†‹‹¢šKū‚Wółßjń—ÕŚĶ Æ¢vƶĪ=‘ĻE0»4•i ®µž²n ŠA¹6Į‡Ę,\°d aGåō6‘`ˆų±½2«ā‚R `QU·ø[!i9y؜,gЁŪ*6MØ/„ø“¼¬ĖüdœØūĀ„ƄŻ&ōÉa>P˜†ą–;’Z2ō,GKŹj )Ղ6ø±w˜;kŻ[ż­Ųī¶n±kĶzW‚EĄG_­ŠØģP–»öęī…r&‰äi$!™3ń¼gg I"gšXö„Ņ\›’ł åƒ'ėį¹śj\yxqšŗCP%€āŗ Źå|D{>Ŗ=#Y–¶@“h·żŽį½hŚ eŃvĆ&Ģ ż->ŽöŽöDj“x±ŲžgJ¢Ø|LķĖAļ‘Ņ…NaB ‡Gėó 'H}ß]—-ąvTökDĒAt·nC¦~¦*4Ģ„Łb“=mćz-) §r“€ W -k5-^¾ «žŠŚ£ŽG•łÖŻ’/OŠb6ÉĻ<č'”™ö éÓ?ņ¼’ģ¶ŽōĘčü”[FSrÕ˜ė¢Žµ# (N8| „ī™®=­‚¬Æ)’&źaTTlå|é–„^}õÆö'”Oē.\ÄÓø Фž×ļŽ˜Æßżć÷a‡é±š “ÓĆ2(ÜrA^Ų>< Ģ“]ęąó°Ļ°X@Ć<‰Ė «8 ¹¶ŗēŸŽć}¦Ļė’K3 ZؘNā4Ą+·v?4}ÆQpšLjCóļŁ”J{Œ+’8Śl endstream endobj 44 0 obj << /Type /Page /Contents 45 0 R /Resources 43 0 R /MediaBox [0 0 612 792] /Parent 29 0 R >> endobj 43 0 obj << /Font << /F33 15 0 R /F41 7 0 R /F35 4 0 R /F32 46 0 R /F38 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 49 0 obj << /Length 1051 /Filter /FlateDecode >> stream xŚÕXMŪ6½ūWčVØ~Šä5@sČ”@ŃzČꠕ˜µZYRd)Ęö×w$R^QÖzć˜IŪ“%j<óę½įšćķŻźĶ;Ę"‚‘ĘšDwŸ"„‹y$±F˜ĆH}Xßc"7ļŽæy#[ūakµ«öĘZ11µĀі0$ø¶fvūz³„ÆŪŹżīŒ}H»¦1ek_²¤uĆI™9ĆüĮüu@¶”"Aāk@?V€āuŠfCÄś1/-iš¼|tųꀵIó{Œ©iüL½Ü_MD\“ČßUµæˆ˜X ĘTŖr&B–<¹,ŅÉŗĀ É͆ŠõѾŻcŪ]~p>jÓ$m>ŗ‡Óž³§“ČS0'ó5YŽ~…pƒ™ŸąĮ&m«©Ęģó2”ĀÖÕoõĖŻźóŠĄ0ŽĄœĘˆ€‘ˆ9ҊDé~õį#Ž2ųų>ˆiÓ}Ä• žŠč÷Õo«·żDÅ£1E_~‡°Ił“DŹ–į!ī Ō$3*œÄ˜ęgūrĢŪ]ÕµSŸĖæt¶/uŅ“yŚIó]é=¤MU 3€Ŗ&ņ6z9ELz_| a3óz(õ³Ų”DØ …ø»«•%DQ=i=³‰=ļD-³j2©Ó ŚZŁŗŁŪÕĻSżø3ī?uu8ä…łŗPS®)R‚Ń“÷ z…¦!¢[MżŲÕ±ü±ŖŗOåķŚ^Õ­?wyś×’“="ā"†vć„eé^*š%”rż0Ė–ūa q¹Ooo;m‡÷”2‹Ūėd0ĢW~iŽ Ü@ @o8ÅHŅ 0)¾e6jæ›Zf‡+1óŁIó¼!³?åtG`½}Ļž‘%¦8(*ƒ°ŌūāBĶXšÅ…*ƒ &®ŠˆĆ£7Ė“¢z\”'ĘChæ7$ūQ7ÓėfēK^u‡É*žźŠļ­ńcSńŠüA¹BB³0‚‚/¦]ŁweŲĀż]Yś"SüQ†)šÅØ>cj9†­'  Y‚Ų¾z‘/ædCčé”ę?Rūį„2F<Sū½/ >m33ūŗč«yĄ ąä‚‡ļ×eņķ{Żü8ĒÆ·™éI.ϦгźĻK“)‚”<įŗ1‰d,G‹±2v¦ÆäԘq`^ō1tlg²ĪMR>:J>5ć‰ūwz±¢Ø†M"ęĮŪ)å¶~‚”ų"Z“ 3tŠ”ö6AŠ©)Ķ}t‰’šü?Vѳ¢›ČžVõ†ąõpīŸß~œ¾½ w,Ē?6’­Ÿšģ§ėń§Čė‡*i²oh~!wķ­b…™5źéŠOėtĮó/dR'[śsę퇗syn —įŗ»ŗ³«ŅÓå\›b2ĢŽ-‡uCøź!lœo’vä8¾ endstream endobj 48 0 obj << /Type /Page /Contents 49 0 R /Resources 47 0 R /MediaBox [0 0 612 792] /Parent 50 0 R >> endobj 47 0 obj << /Font << /F33 15 0 R /F41 7 0 R /F35 4 0 R /F54 28 0 R /F37 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 53 0 obj << /Length 1478 /Filter /FlateDecode >> stream xŚÕYKsć6 ¾ūWčV{fĶå[Ōō¶3ķaoŻf¦‡Ż=0m«‘%Æ$ĒĶæ/ųmɊć$š>.±EĮń}0Ÿīfe,"%8!ŃŻ*R 1É£'sXÉ¢Æóo˜Ä‹ļwŸAVœĖśÆöR;ݓƊĶ~¹›ż˜Xlj„ˆqį4R„ŪŁ×ļ8ŹąŻē#–Øčą$·C4fš­ˆ~Ÿż6ūäöÖ·G’Dõ7—åŗØÖÖn“¤Ņ™Z†OüūFoĶbIžėĘīj³ bž˜Wūęƒ_:äķ&łŚló23µś†1-‚–Ę&móŖō'óC$—ž% ˆB ūŹö“nF°d€a$c†H,_ åĄ§ˆƒˆŒ)Jā°¹ø\ʘ^rŠ8ĄÕļсpoڃ1‘vŹōS€,ݘlßč¬Xž¹ž®0«6š¢Ėlšr_¶łÖdc,½ØøĪכöeŖÄkØŗ7ė¼cŠ")D$YŒ!ļ㊠”ŠtI”ą7ŗö!rĮˆIĮ=[¢Ū傈¹Ż©Ā”­©órŻ ł ŃoŻėi”:my4Ŗ1¤ž(Ŗ1FŠĒŽližjoé3VU=ŸŅŹ|t„é¾®M™†·Õj ž<_uJtŽ Ļ[‰ ÉQ¢Žy4ALQ§+V!ņŽI7{Ųļ”śē~» ŲTW!½ŠĆŁ„żN@! l9Am2'åKåj_Ÿ¹9\Į“*Ⱦx?K§Ä|]źŠć„ƃŗ)pdųė&ļ:$n×a…“Ć īLšŪ»¦ćōO!Ėį,–bhA‘ݽƒNšNo73Ž‹ĮnBä„]k8uėŪ‡ī)ĄS‚ īNÅv(Ęį4ÕejŠ›qāA¹zéNč68ū®C! č×Ēg¢ «Hā‹`p6¶W”0ĒpphRö2€ōÆDó¹”ܝüŠBIš)ܽۘ#q'9 {Įė÷)ŠyPØ ŖˆąWļS€ß䂷“5¶žZMŒ?w›r’·‰¤H·»jgjķ©Ä¼ØRĄ¾ń§”Ź=ŚĘÅ~ŗ¬°_vU^ž­ĮQžäŸÜ%ÖĻ‹e‚Ł<_!Äz”­³G7—(qõ]$ ÄC Oś(t]ž.Šz Y’ åSźūĀdFAÓsƈ)ö2ńPœTēŅ!ļęéę!be)|“ŗƒP—Õ³N”ė būH `3Čņī>Ųż?Äé+[4śÆ-Į•£ „w˜ż ½ńL× endstream endobj 52 0 obj << /Type /Page /Contents 53 0 R /Resources 51 0 R /MediaBox [0 0 612 792] /Parent 50 0 R >> endobj 51 0 obj << /Font << /F33 15 0 R /F35 4 0 R /F41 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 56 0 obj << /Length 1049 /Filter /FlateDecode >> stream xŚÕ—M“£6†ļž܂«‚VߥuS›C.©Ōŗ*‡=`×l9 ĻÄ’>-$Xp˜š™ qvNhZź§_5­÷»Ķ»ŸY‚R!h°;1 bœ"ĢI°+‚O!G|Œqų“®t›ķ+µØĄįÆūÆ*7Żöóīš!‚QŠSb}ą ¢pG˜sń!ĖŪˆꃻž¾Yxi‹¶B„}FBŻD]Ž*Õ8U©Z5¦swuvqƒ½r×Ü.FžįŹ0Ēé[7ģņ#8šOŃēÖ}‘u™«- „{*ĆsW6_œŃ謻4&ūĖĘi# žŗĄ u‡1mģ2,‘²q׏Ą„Ōž†#‚ržvGĻī «Jo©śéś;wĶÜ„*;ćFvŃż‹Ŗrƒ|žķņ€|"Ų4D"&9dƒ $nŃw˜ÄĪR<µķ‡bouTÕé‘ŌN ˜!¢Ž¾ķ³Ö/Ų0Ś}š‡4¾ń‰_ˆ ņˊ(ETĘ/ Į”5dĢ6v›?7žćģERˆ@’aš˜×›OŸqPĄKH0bi<ō¦uĄŒŖąćę·Ķ{»Y®&d„4_%2TqČĪ•Y¢1 só9ĆĢ+EÕ'sń``é]„Ķ\W#®"»DV×ÅyčØp‚zb²"D‘DY¢õ……/;ł¹maū?āČfųpäųoö÷wXąŅ+µ4ó]z_v%ģ@0!·U­ąqĘ×¾(óe”U5ÄÆZņ|Ż:nVR®¶ »ļ ČįPWö5QY»ū-šwpČåFI’učƒ/N’9}ś¦čÓŪjŸĒ %xbc}ILēōŁ›¢Ļn«}Īb”&bśą+N®*SōłŹŚ?7ń‡*są)"ņ•µ‡Cg5‡chųe:翈>°“/7,i/ąĀéo†ŗ’·YaŚa8嬔`ė‹_?ŠĢؗw*NN­)ó¬4j††Ų“åé‘6ŗR’Ø+ uĖŽŗƒC™;Śü“±HPĀdĄF‚½²JHP:Ģj}1šŁĻ]6½ČŒķÄˌ«²ń£S«-ļū²\÷»o-āA·Wg½ä,ų” rUž&ž—\ā*°qÓŗH&>^¼Å^&“™s÷’“į^£ė«³įB6f°æķ„¬)&½üŗĮĄĘSM‘µKrgš „ įD¾NĪB §p LæĄ*Ū«j‘c$d?õbŚkݘć˜„ž(2_ˆ½ßå¢<Ęūßjäi¬$‰Įiŗ Vė TÕ½ŖČ“TĪyĆń5@®¦Ā ¶ß”ŠsÜ™ ˆ ¶2aOķ|Œ>W‰O#ƒ_py®æbD ÉÖŁ»Ö4­blE•Ė/Ēe`…NĘ„P<|7DÄõß,ĪJŽ endstream endobj 55 0 obj << /Type /Page /Contents 56 0 R /Resources 54 0 R /MediaBox [0 0 612 792] /Parent 50 0 R >> endobj 54 0 obj << /Font << /F38 6 0 R /F35 4 0 R /F33 15 0 R /F41 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 59 0 obj << /Length 1974 /Filter /FlateDecode >> stream xŚÅX[oŪ6~ĻÆ0 ³±š&E]³ ÖµkŠ¢k³ĘŻ0¬{`$ŚfCIž(ÅsżoŠå(ķŠ Ų“(’:<×ļ|ŌĖ“ÅsJ'£ gd²\MŅŃ8œ$8C8„™bņĒō=&ÉģĻåĖÅs˜9Ųk‡lwåLņŖ`ŽyņÓņäÆKxŸD ą-4'yyņǟxRĄŚĖ F4K';³³œP$FrryņĖɏZ½£#£EĒśµuĮöVAīžG±9xN(ŠĀĢķŽšŁ<ˆš4ļš†W­}ŃĢ@Töy»ĶŪeŽv¢*źYMwöż=ްX¹O,”ģóF(q%9l!N»«ēĪó @‰æÄ×’ÆŚ?1"°)N("Iü0G¢i²”%N¹B܈‚7£®¦Ųœ=īź›‰¦¼i8ÓĪHQ¹µ¶>rø1ΌźÕŃR+J^ŲaĆKoŌø|ÖÕїøŗė͘Æi€ā(šÄ4A„‡łšF( £Œ’Ā×1œZ_GŸu5«œĖ6u#>ÖU{uO¬ŁŽB:!!¢a½ƒÄøböZÅ£ćé;ÅÖNžrFҩت±H’ŲąÓ<QĒqč¦a›%tŗo“Žqßą@J­uLlÉƤā•)XūVšÕŒ€÷:Łŗ}«ŗ±KÖN —…[7Ž‚Y6–UŒćˆxuŽžōó˜ĪŸaÖoR-ky õX ަW³O»Öž¶Æ;{ÜNHiGŗ¦Ął7¢eWro·Uœ;›MŒįY²km×ēƒ#)€E WÕ%·Ÿ«’YédŹ į=įE±|#ģ‘&ėÜāĘ ®ų†io„u\Æ3üŠ®­Z4›Ó0œ¾X­wŹÉųu –ĘįķzĪ*;č1śĄŗ;IŠ•“Ą™ÜĶ^™6ī=,QŸ%Ćś(ĻŻŁóWmßßvś²-?*-ųĘõ².Äjß 3„C!p½ōū€āŚA~6łX^ÄŅųݾZµ—Ęd§(Léē3M’—ČĖ­3•G†Ž«Ę8”ĪĘ‚BNPBpgŠ0uČ„8dhŒ=NŒŠ„4žDšQųŠ6¦ķhYA’ łī‘¶ŻØrZÖUÅJ~ź_”ßūńž³ĘæżśėļŸ,ŻüBwzv wŖēm¹ĄyZ÷Aµ<{÷öÉņś×ö;r†±ŁoŽ~¾¤Šc\,F8J½Ū|ŽĮ²ō°Ó—¬±čÕ(ē^A?<„䔦u"æöź±¢šŲ®1ßĶ\nå­!=~A¶ģØ”\Ż’™-k Y[P2SøŠ¤‚÷\>Åh–¾O…Ō>Ÿk…kyKĒlŹ\ —ĢM3ƙױ®ü~Ē‘üŁ pģj3…‹WEœE.dé˜Ūęūt‡p,ūŒC=Öuķ„žŻ d]_ŪŃŹ'X ¹ŅųŲŪŠaDć¬SæEŠĪŲŃĪW"׬rcÄ<ą™‡ ’Z#€rd™šłŲ) ƒé3Gó ūzią·ÖCæšĀ՟ļa›“žU]¾±#f[{qäĶŖ“vææ\ŗö Ų¤E”ĘN=»Iåōšś¼y-™ĖšsŚĄõ²ļ˜»Cš]S·ü(‚ož²Rö‹”§ĒW ¢z^Üęˆ8ĀŅрa)—€©‹ŌS}9Ļż_¤j„R0éœķZøčŸYнЕĄ:gĆ—åų/н'0ßnõĘķ‡Ö%åu9Śvēž³‡‡Śģų•‚ėŅčõ!Ž”åõ‡nŚv{¶Xl”yŠR|“ G/”F @‰Åī°5źį}B ØŌÜ{ö¶ńiˆ³H¼ö’3¶uÓzŽ×ž2éy°£nö3ØO+Śit5.NHāģČ:Éŗ*ßlY*Žö )5I§@³O±i’&ˆdɐOƒ_"hŁśtbø3Ā ĄŻ1M非 °¢—uĢ5 Zvг¶;ą(¤+Ė)L0tAš»0Śn¶‹;„ašĆ#@!›‡K\Ŗ’ŲŪū\0  endstream endobj 58 0 obj << /Type /Page /Contents 59 0 R /Resources 57 0 R /MediaBox [0 0 612 792] /Parent 50 0 R >> endobj 57 0 obj << /Font << /F33 15 0 R /F41 7 0 R /F35 4 0 R /F38 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 62 0 obj << /Length 271 /Filter /FlateDecode >> stream xŚm?OÅ Å÷~ FŠü-eŌDš¼AšĀ«D “‰żöŅŠg9ēŽ÷œ‡”¹{ā= sŃ10\b@‰ `0ą jŌRB|qy²ŽĮĘ-£į¹,J@ ÖDÓc‘€– ܋ŗöĪæ Åįž j™ÖŠeŌņėsŠa²ĖZ5Ŗ8†ÉŁpŠ÷aö±ĶćwüuMu^c2n:9›_·dOxŠŪüé÷Ū©K ʅ¹śk¬ÖŃrÉj«SU›r £?āy(ĒRčČŲ¼–3©„;ź$ÄH‘#¤8«P«÷œĀ­Š®š%$%t_n±Ę’uH{…堕ŗĒd@Õ1Ū<ĶmÆpž endstream endobj 61 0 obj << /Type /Page /Contents 62 0 R /Resources 60 0 R /MediaBox [0 0 612 792] /Parent 50 0 R >> endobj 60 0 obj << /Font << /F38 6 0 R /F35 4 0 R /F37 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 63 0 obj [777.8] endobj 65 0 obj [600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] endobj 66 0 obj [600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] endobj 67 0 obj [500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 1000 777.8 777.8 1000 1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8 275 1000 666.7 666.7 888.9 888.9 0 0 555.6 555.6 666.7 500 722.2 722.2 777.8 777.8 611.1 798.5 656.8 526.5 771.4 527.8 718.7 594.9 844.5 544.5 677.8 762 689.7 1200.9 820.5 796.1 695.6 816.7 847.5 605.6 544.6 625.8 612.8 987.8 713.3 668.3 724.7 666.7 666.7 666.7 666.7 666.7 611.1 611.1 444.4 444.4 444.4 444.4 500 500 388.9 388.9 277.8 500 500 611.1 500] endobj 68 0 obj [600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 0 0 600 600 600 600 600 600 600 600 600 600 600 0 0 0 0 0 0 600 600 600 600 600 600] endobj 69 0 obj [556 556 167 333 667 278 333 333 0 333 570 0 667 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 278 250 333 555 500 500 1000 833 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 581 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500] endobj 70 0 obj [333 333 333 500 675 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 675 675 675 500 920 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 389 278 389 422 500 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389 400 275 400 541 0 0 0 333 500 556 889 500 500 333 1000 500 333 944 0 0 0 0 0 0 556 556 350 500] endobj 71 0 obj [556 556 167 333 611 278 333 333 0 333 564 0 611 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 180 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 541 0 0 0 333 500 444 1000 500 500 333 1000 556 333 889 0 0 0 0 0 0 444 444 350 500 1000 333] endobj 72 0 obj << /Length1 1418 /Length2 5940 /Length3 0 /Length 6901 /Filter /FlateDecode >> stream xŚwT“ŪŅ6Ņ„ RD¤8tšōŽ«@‘š„”$!‰t¤7„÷&]„w¦TQŠ(H•"EAéEą‹åÜ{Ļż’µ¾oe­dļ™gfö³ē™w½įę¼m"¤l†!4Š(¼X$TÕ×׃€ ˜0$ ąę† ń®ˆæķn3‡D£dž”ŠE@ń›Oź£Q@{®@°,)¾%EA 鿁h¬ P ꁓź uŠ(Ą­ŠĘxc‘ŽNxBæ—@^8,-}KšW8PŁ EĀ”( >ļ„p#T„C]&h8÷žG ^9'<##"āéé) uĆ £±Ž |‚@O$Ž hŒĄ!°{ąOŹ@Øā5a7ā„Äżv˜ šžP,H0ø"įŽreĄ Ձ&Śz@C õ¬÷ üs9@°0ų_éžD’L„Dż †Āįh7 åD9® ”†ž0Ž /„¢ģ”®84!źEŗBaĄÆ£CŹF@(į~88‰Įć„qHןE~¦!\³:Ź^ķę†@įq€ŸēSCbp½{‹üi® ķ‰ņż{ē€DŁ;ü¤a#bŠBŗßCh«żĮL€Ūx Hź–˜”įDxĮD~€xcæœąŸf_ t Š@ų#„€/źā±÷ž¾’éųēķ‘p<†pD¢’ĪN0#~ļ żĒ"½€– ‚üĄ@ŠĻĻæVÖ…Ł£Q®Ž’†’j±ˆ±žÄŲ\ąå9UTŠ^@_!1Q Ø‰Kož’ĢóÆų›ż/ėm(ņĻéž#£6Ź üYā' ĀõżĶÄć4x’Ģ šŸ% ŠA#€¼’ÖæH'|’ĻSš+ä’'žŸYžWż’÷‰4ī¹ŗžņóžü?~ØŅÕū‚ č{xĀpč£ #‚śoØ9ā÷Dė#ģ‘÷ÜžŪ«‡†DåHŗX\$žŪŽÄi ½ö·‘xøÓo1żŻ B W$ qCž|š¢@ ’ņfīBxøą=ūķ‚āƒˆ’ÕŽŸ{aŌžyum’s&E%$P,ź H‚°“ś‚ Ćkšś„y ˆ0 '„ œżh,ąg£%A@ן VĄ?2Ćļa±„Ņæ$A(ū÷ž×č#^8`r — q® i=¬RfńZ–#ŪJ;¼#*4\hCļQµ]H0ÉΚŅ}Ŗ1Ł Ö°qī0Pq?Ģ™}æć»TĖQē-¾/Ä”±źČ‹›8ßæ0žč{Ązc‚ŗ‰č±yŠ »L ¶‡č6[4M'„¢½c 7µß_5]=yčK5n鄶“wV•fé1°J›}łdŒo†õC–%v’Źżäö(x1Ę*2Õ ć†®\ū Į³’f¾o š¶›ķEtŽĒƒåo\axZuŁ~V5ń‹•fÓłW~ä–xldŠłĀ4Æ*mŲ÷<›ćK9¬1ŲvZŚŽ°ęäMź¼åd—äžāsÄF‹™¦WIĆę¬DŁĢ ē iģSH<Ą™u„#µ^Ī–bsŃ Õõžļ™’qO7UŪņMoÆ ~‚üYŁŅ’zī¶X‡0ā–æŖRh—Ō²ųÖż‚ó{¹\³§÷yCĒĶE-„ҜZ! ÅÓŅ!-whÅÄ.{ Ó*LƈŌī»Xd±ļė#~–æÓŽ®Ā3å^Š„‹ń™ÆöĖ(||¼yUOƎQõńt[Ų÷«ōZ°ÖėsCł—ū“ŗI|Oū0-äČy²ŽĖ(Üy£üćbwÄ{qœ=Q©AŽ³ćŻ †×½čV"1€GiPĢń†ĻéqŠ€©ó!{zūš¬Łh‡£d_~±Ā¤ąłw…–TĆ@q7eŠŠ©±XĆD3?}æo»@>CĖ4ķB(ņŽņż¤%C%j'”«y^~@oŌ¼–š(¦Uy~·97šo¬šeüė„ÖRł aé'Ÿ³6vÅY˜w²äÆpX¶ŪrœĆĪѶ׾©°šĪ÷>¼Ų°m~ƒć+ńRCvęĖyčöś®Ī0ž/$©{Ė^t»Ł3Ęąył˜–Āžš’Ž7ŠŁń=ÉWZæÖUƒļV;–^!ļĆŚ›³tžBżģŚbK`÷ł^xZoĮ-y@ĪIßjīŻņ>t\Msb2i Ķē!»ļO‡9]w˜°BO&l=,®ā>fk;«(杳6ŪX„Re-?±_J|²9RøQzˆļa_z¦J˜ÉĆ9œŲ›G\ņmb` ß|›) Tƒ”ā¶*ä‹ėWÉč¦Oz‡Į[#S“cØæ˜×׈`ŠYj'YĻ"IڽŽkÕ[rXCŌ÷_8g÷GˆœP--1¬3Ņhf\„–|īL'`jvs3³µ8ͦƒģ8eķÅó EŌ“2‚‹Ēō7įŗų§'d|Ž\»x'¦’Īē² šz”Ń؜gŌ½&¹ ŽÕ>nÖ„į UD¼}w/±īŠÜ ÷ĶY÷ĒĆ1.—&׿YnŪ]7.kštéE”īą¼åė.P½ĮūĢÓGi7·Į¾oƒ®2Ó£ņ"¾Ėјņ…AچZČĆ>}Ķ+÷ŌŻą‰čģ Üɖ^(ž?>Ų¬ŸSP ŗ:µTÉūŠŽ4öĢ[„³g"š·"Ū”‘-«l¬/¼O¾6]ńÉ ĒÆLŻÉn¹q+pŪ2ļpģßI·2’ÄW&EjbI\Å큦Dt‰I\ß;Hz¹Ļē±Qzj<ż«hi‰Ōņs„%»$Vž°ØöF{½mp®ŲLõ*Ø1iK#±ņ®ēC]WlÉ1[} ÓĄÄ~D.ĄŃĻā ͳdš™rH«¤K}ļ Ķ?céĄ$O¬OĒ 6ĘĒŻśżIM¢ūӊC^²+”»œ1Lģ9:]->V¬Ń~\=›‘Ä~Į}#LĻ_DaXĀ…ī ぼ‘g¾įŁ-‰7Yd’ß ꛦ2čŻVŒÆļøn Z±b¢æ’¹õīņ”BņŚŽ7Ė—–æ‹ńæw¾iŽ•­¶.µ͵=ę·ĆŁØ570ÕtƼ6„—(k{`o”¢£ĶÕŠ’ŅeŃĻū‘ĮĶŲ}õźAŽ%cB€Ć ‰“`Ź3ÉŚO×mĮĒcž@ŖēOXMÉĮƒ)Øv&”Ē{ę¼]y,ź]h~ƒžĒA²eG·łe•²“é™›Ņ(?ĆI„^:ī£z3q‘¹”£ŠTŹÄ‹ź*­5Ģ ćØ9ū +ŸĀӗ4"£cģ!źĪfd¾ŁąČšP0¤:ŁLļtTĀŪ\×Ļ'ptg1õ›ßTžb”³ŠżZؙ|…ϤŲT'dB' uŲ¦½žģ˜Ż©GŽ… 6½¤ofž4s_ųóU !üjzŚZUyØOö»ļń!EDį9I<øŽµ{Ęī9,c%Š(·…H{ƒa„Ķ–/ūnśĪø-‚FżŠ žr‘)\āĖkÕ„čč š>/=µ×ŹiQ ÷O{ ŠŁŽSõ¢æf9ōz­ˆŖń¦<BåÕLMd}DNĒ>}3ņ$w¹k²56ųÓ±0v–¢Š„}GŻņ‰IŁić—½+«Į„A>m)Ė°dŌėó£\E*O©ōˆE¢ā>Ė4©0ģ'fßój²äŒƒļI‚¬qvA€„Żd挖DŽjńܹ޵o*5§B“.­Ļ›szS\ŠvOžė²WøEĻ(ĶŚ*’µņ¾ónĖX'… —1‚Ņm\Ķ’¤<¶30ų­ā[$łéDåS)7eŸÉ½ĻY¤öķ²7–ŅÉGJŪ1s­ū©×š˜T5‹Æ&¼Ķ­zŲ=ē' Ō½ø)IÓ©Ąź%^KużāÖĄ{ŗ@maų|€Ņ‰č^¼”NR&÷ø’„}żĶ©ßKaßTxUøė!čaAo ĆŌ}UŠ4Ķ׬M¬“w›Ī0\@žļ4Šź:.õ§ Z±nD|s×g ÅČŹšsĘĖČLW.·— ē©jŗL ōŚgŪa”ēž.z#JŸæ–½¼<Ø)ßmóĢéĆ:ŸKef3’R 6؄³¹~č„y.FA½Įhx–q7zÓ¹rQƒ2Żśö² t+˜ŁųcÕ1Ī!©® šƒ•[ ÜŒ®X¹O>“2GųB}=¶-ØZį¾ÓÅvzēź†vAfļx)¶ĶźcĆĖÆĪ?#Šv -XūėÅ/oĘ+*³Ž©_#Æ~2ŃlN¶ ßq!ĻīWĪć į“Ö_bzOKMICæ?gT>ņĪ0¹ŚuęĶ[oyÖŻR õ˜ &®³ƒšÆ³ A“(Ģ£6åoÄN%XUh[„™ĪėÄ3—čÖę!Mu§qžUÅkĮ”Ą‚«ó,vÉŁ‹JŅќih+%½D($ÕŚOõ…ڧ£ņ/fž¦²aBź#ĢĖ”‰čēŲ§™‰„ŹĘŽm¢Iķ Ͼčz¹‹uĶæ²Å—°•g®Å½õ1Ļ*’_QWŖlI޵™ĒÖÉäņ²i)”!V§nĶŌŽĖV|č{’8ÄßĶKu݌žu²Ņ“ƒ]Ų‡²Kf4rńĪn÷ۘŠ]­tĻØßŪZÜQ%»ńģÜ£#ŗiĻłŒ–(V1-÷xzP™m¬qEBø'ÓnŻĒ"«%ZŚV£čŚQW§§[:#ŗ]t°Ė‰ (ųø.„?ü Ā,Ņ“ KNœ>u9Yö#_IBgē] yōŗ—dńK‘”&7m$føõÕFo£žw™±äcŌéK.øIą‹ēӄœPrŌ§)„PĪ”†€%5ʱ›R²—ī?Ž®;ßĮ‘²åڬWÉ;Ŗ~ĖÆ šQö/*ł]”,Ņšočż«,š7}ąé滕o„ųÄ߯Ģ&ęxĖō2RĶ£Ÿ\8ĆĖ‹TSwš€5 žźÖß[ÅĻ•˜p³ņč7yĒXØ&QĀŽ›Šc(•=ÆéŚ€¬åńY”ź’Kl®ęŲp9rń³Cż[fkHDzĄ_i•l'ŠFŽēłŠ·9… I÷_P„ł UĮõhHCvė ¤“¹›>ż““ÄYē,zĒĢa·Ę‹Ź5īvęŖÄTĻEu¬Ė7Qšó An=“ øw3mt¾·Ć5ł„ǵŽšž¶&'“Ęāy¬ł¼Ī±ē°e~y?| ‹ |4D×rmÜŖŖ{“3kń$*ė&<ęąēx¤Į¼*TŚõ±öˆö¾Z"øæhśY­} śżÄ“ž.śČ{K ļė5 +‚źf„Ž-N™Ų©^"zpĖÉ(d(‘ƒQa0ųšĘŁŃ*<ÄÜŠ.Œuō›ø°”—W‚×gŚļļ41å• :JéjŅŪn‚j9ƒ&Š»>ÅęĮ߆‘2}äę­Ū¤©ŗµ­?& ¤žŸŸąÜĆ!eķN$±SėŪz‰<2ęQŻ­éńĄEǧ…õzö 1‘įÄŗ3/+ˆ½³Ś41‘z\Ąš—#éZń…©ā,ßŅø1Œ{äd Ó˜¶Ŗ%yy±»/€/Ņ0šģIßO‰×"7ü\ŅKyL\"Œ³:ĻŚ5©šęŁūö^䰂ō÷Š70#5īīķå BĘy¼ EüĆĒ”£„_śE%"œZW·Zü“…%ī½°3ŗ]p0ń€Ļīū“T#£¾†5ŽÄ%“kmJ‚gCŠėĻU¢#Ų($4łķ_kč—^žļ <{7äøųpÓé05GŒ"9#j—čSŪ—6ĒÕķŽ ³Ōx7¹SÖ©t6pu)żÅ1 ¹Ęi¾1Ž;VæÖЫݼ%y(x¢ yĮ{6ģ9¾™xA+ƒl^97ƒ;åX3ŗņ|œ{¬Ń5#Óü’ʰpėf§šL)Q4-Q(7ńEz(ćb¦¾Wāiß [½ŌcE֗ötüĒ2į -Qė[^¼_ZÄ1T·„ZłY…I=$Ųrpƒ0¹½‡µÖzFa -žĆŻÆÉļ•ĀBSč§cVĻT™*˜ØIS÷ŗŠlõŽX0 \ćņčB§Ø„O9†ĶQœy­ē­B9".}V3@aWł·†ö+|ņ*œƒ'-ƒxŠ{xĀ;ĻWĘø WD²u̼- æŽ=\“Ńēšdę%¶É~ziŸ[ęĆL3ń«“CĖĽ3iC„\GzśŻÖw}M•ZžÉóY’~“&Ü㢁Æļ÷”eĢbŽPš@n30Z‰u*Cļaåp€Zėę+žO97eū⽆śÜ¬Q%bń1ōKYwé:żąB>°üŠ™Ļm€’«d— g)Jg}>j±ģ“^æi{’÷“õŚĮMfUIĪ—JØĄ@> endobj 74 0 obj << /Length1 1498 /Length2 6680 /Length3 0 /Length 7689 /Filter /FlateDecode >> stream xŚxT“Ū¶5""U¤¤÷€té½÷^C ’ŠAzé]AzŽ•*½IG"½ƒ€JyŃć¹÷žū’c¼72Fņķ¹Śž{͵“fm=n[„ DGqyųÄrz&@>Ÿ?3³>ƒüć1B\‘P\ģ?<ä\! “”ŠŽ8@Õ  €Bb@a1>>?ŸčߎW1€<Čj ŠąØ"ą$³ĀÅĖjļ€B׳ūĄfEE…¹~‡dœ!®P0Š” ĪčŠ`  ‡C!(Ƥ`{ā€B¹ˆńņzxxš€œ‘<W{Iv.€劅 !®ī[Ą/ŹM3ä5fø­ĀŁG!ń~ķOź £ĻŻ‹÷OsąøĻß+;(ÜÖī [7^8ō©DEžĀū7fAłD…„ČSÄģĄū«€¾— ä·ń7Œęąēć‚pŲ”i@ü vōžä \Ż ~>’iųē ŲBĮ(€ Ä Ēūwv4 ±ūkīæ+Ō`ʇ–Ą÷ėõÆ' “Ālp˜×æŻ·˜×@ĻDQŽ”óåeežn~Q·Ø „…~’ĢóÆų›żoTż³»’ČØ·CD’">½æ‰ø’Q۟±aü³‚&­g€ķßņ7ēä£ß€’ē!ųņ’ÓžÆ,’«ü’{GŠn0Ųo;Ū_’ä …yżń@ėŁ …ž zBą’ķjłk 5 ¶P7ē’¶Ŗ @葁ۣuĪ |ĢĆ÷ų/ŠT„zBlµ”(°Ć_Zś»č0(¢@BŻ;č(>¾’²”G섾[č–ż6AŠ“õĻŗ p0Āö×ņ @®® /<“Š+A€=«¶ĻßšņĄ(tĶŃ`‡pÅūÕX ZG¼6 °B:ü²żóń£aWƒŲ”žų’ÕŻį‚h}ҐCü@ÆżÆ›ā yź†nļ/Ć?¶vsuEO÷o”yż½ž}•@ ž0Žģ,āų.¤å¢R†ŚƒūėöŅr[dœIw„ Šeśµƒ:N†ŅųSYkŪņ‡©Ś3ÅacS¾Ōūƞę2S”³Q Ż«²‡Ü9}ßO>ŲCčlTö#Ā©‘«$ń:“DÖfXf¬‰FS—”Āo×󮌐¦¢;g@Į1C 5ź…LVŪęs¦eTæ‰9qĢ}W³47}ƒ‘+ĢēŠ˜sŁ–hŹļ^«f1鿟?ĢģéN8ĪUė¬*#„|ą­Ź5ŠKIŸ©ZÄ`‘<“+NŽc¤ĢwcY¼m-¼ųs"·§9¾WĄ­Ö^S.šžÖ³Į:·j„ą”DVĒā1ÕŚKżļ¼"ø*S™d™+l1ĪśÓ*`ŁXätģź¶ł Daѹ‰:ę\]4γ`ĖõчÖ/2āüÉ0‘Ž/od…“at.vFs—O’¤T̤Ś*·5—Żqń|{Ó -5¦O„Ÿn6|léļ?D0ķӒĘ·fģtmĒ׫ž}"1äPBU©M#Ś­Ųc³b'üu³³°“›Ū”ÄM„EgFc ˆrōI¦õÕ70Ņ4…ŹL’:ķÓ¾+|-Ō ‘,Ą÷l~ōš–¼Īn,qÕź=Žļw,ćl\yłq-Õ²ŪL¬ 5YUQć u;q—›²&恇ĀS‹Ł²×žV¤EĻ̳ķ^üŒł¶qZ{m,Sa ‹Lj÷_µz3HŪjŚC“ö~t·³•5yĆS¹öĒÖ!©Mæ’X/cH>¬“.V°IīsY¤YH½å“×µcŠ®īō;>Šģ\üńZ ‹åf­ęĖĻ’§²ņ€ūD¬3”¢«å,¢>Xų†žņßDī€Fkƒų§ą<vuxk0)µ9ņÜ3¦ē Q$Õ?”\Ļ:i>“6UŃšŖözƒĻoē)Šüt×XųĀk¬%ōŃKŃ^µ’lgĆĀč)µ|F#v„Éć„Ā“°’\“ŲÉĮ\cm…Cõ+žU+žĘ{åÅåd< …ē8僾mÖö7JßfĮÅŁ#MzZŻ …¤ć‚½ōĘŲ Ģӟ,I«i0zÅrsuL]ą[:Å,›£‚ņ?ĪpÜ…  ¾ƒ 7„ĘŻnĢi7ņ0Scg¾Śļ&EęXŒ`Ü/·ō×-[·(q[#ž- Q+ŃźaP¹żnāŻĻ‡ßtI®­PFāéķƒGi½nŅlJPƒ…¤÷ ^gśų®~ū¦ćųŖX»Üv"ā‰UF“7ŽJP6’)ź(_Æf˜3\½&kźlˆØNwoŹŚMźØN¢Oʬ’Xä éY-,m3g,ż^—œA1¦»wĒ]W.y&+SGŽ’pBڊ+«—| “ØÕé>ł ;Ų†ŒŹ…¶%fIuŗĒli­JŸ²·ų\ Ųóg]T_ą®^恶JµŚpń’*Ȥ¢%gw׿CģˆYNćĻŗuf­étåą°ÄūOµYcTß Ģū»ĒOrõ0Õ0:jHVļH-'ŗpL…»NSHĢk‘~«JD‰Ņyš ‚–‡ɑś_«EģšĀT^:įĮZģ!5e|ĀėćĢ„”wC”šó~$čzæ!=9±Ūņ µ$‘wX8}²–ė“ž¾"›<°=å÷ć}Ļl’ߎUīÄkq„ŅŖ÷ķÄ[i 0HbœJų)k0åś-µˆĖĒNZ{ׄŅS€„¢×gm„ĀóEŠu'ĢOé„ĀøOo›Ķ1`ļž’ØžŁœ0G4YN3Õ³D=9¶ %Ē®Õ#YBB>šĘ­¬X²g0čķ œ`.—ķĻŽV/“¶ź1ęˆĒn&_ŗYbčEāɧ ÉJĢēŗĆēÓõWqĖÓc«FZCĒĪ‹I-x±‡øżż|"Ęzś¤³'R8ŸÓd@ o]ƒAĆ.š¾łÕš‰/“>%šÅAĢČļ%[‡YŒĘéeĶ<ņ µÆe†skýĮķ ā ‹ÓM©I.|̽cT,1́X(žF+½ê[wk°Z4N`y[{AĒåüī‡8źóFW”ó–āłÕ¦)›ķ=kī3t¢Nų^$1䵏 ^.āTņ}Ó«€DGŹ=`ęØŲ”nˆEŁē—6ŽJrRŒĢA¾Ļł ›U)CB/ņuµ7™ÖėÅnZ?±÷µĘ(<šŁĢ·e-ėüŚNĶŻX‡’‘ƒ—ŗĄ|ć>ŪN=³@ļ<ZazIՕ«N(2ņžtöxą¤vń`³,ꄺrž§&µ…Ó“ŗ,ö“o8O³8§ēĮ&^ÉŻCĶłŁ/oį‘Zi F_YsKW暯7ľ¢f=Ķ©=+FéõåŁJ}®2&Ć"e 6 ķ:wŅ4Ŗ5yæ§8ódSÖÆ:eĖ©z¾gIwmnrdž™˜Sęņj×9¤#z˜h ęėŒ˜ųø[ü˜RēkYyHŽ×+RßÄŲ9wśūœĻāņ²éŗ’jĮ1ŸŽĶŽNŠčŁ™ę-?£%ßÄ́޾T†d„ĶjĖÕl¹kīo0* łįģģćdgYŌsd(āŽG'qśnT²­5N-E)•Į„ƒŌģØx/ŗf[ķIüTbōa-y<f¬(`kŲ™\v@éĶ»P]7ė=®ŽiāŪ)‹®ē17Ń÷e>…=—ŗ(*S½ '2½ĖįeøÕ—)gd֒?“¢`mUĆŹW9fśžČa\ŚPķHŽš×Hql]A†‡Ó\ųCŗ e »0nQ,”ńÅhēAķĢu`Mi§”“żžżHļ“ ‘žnßö|IŪG/żŒµ†Ī½ė©Ė”O ķåś)ćOāfŽ7eÜõ¾ÓüU?Bnџ· õ¬)¾;-ģN!‚–c/U4ŗĒudRåy±Ā`OķŒŌÓ1§‰ē.öЧ °rźŻ~§ŹK˜¼śŽémĄó:mn8ā“åø•õÉØIė6„{Č{A-Ķ” ų(Õ6ü(“āc!W"Ét}[ń®·=ĆhĒDĘÄĒØOܚ?÷†ņ‡ŹĒ"±Żj:öŸ_ødr-I ƒx¦¢"^ wģTį«F>;żxsyįLš&°`~°ĖĆX`×\lõV§JćOµęņž¬;†®™€)čÅc{›f|č-ūŃ:M®~ĪFĮ™-P-;ש“t0Źń³i..5œĻ›¢Dé-ķ2żÓČśŲP±‘γwČÄCÕw3ĘyT¹(/¾®¶7w*¬ˆĪó÷ķ'Ś«æ’Mß\{¹+STz¹õ黑Ć"ś„÷‹ckq¢čĀóāF÷oµķ~ŗ[vĀ5„ם-tŗŚr‡ęµk^”YüēīÖ_š[j«~¾ 8m÷÷oėr*ņø@¬D]`,N"•W;bå=V/,ņš[©ćČvl_ū($õēw>÷œ„\N'įa"3\Žp Bežy;1991Y<Ž© Ć:Ū5äüØ n–Ć2J‘>8ł)šź,Յ¦Sń:Qg==Ėf¹ˆŒ×åäVķÉkżÄ§mŠc"XVד2$ ķšRO87¹Īj1>,ŽāO&Ū³°W͠ƒ#ä5;™oŽX9ČÆžč߂£žPOF;óāJó;S²g ŒŲ6Vģ%/Æä^x=b[­°fžó)”&.dhŃ”ĖäåcA.y6žŚmȖr–Mŗ>?PX:0CĶŁk©Ń¼ŠyĆōƒéÄŖ/AәRŪ¶Ņ`vb ŖĀķIšI f ?ešNŖō­ü,q9Ū7Ėiwś\]Z)+ƲI؈Ū#Ą”HZTņžėłŠœyJ“ ;V9ūöu¦}I.{Õ$[揗łµ÷44ššj«Cžöø³ŌUōŸĖ-}ŠÄØS7EV{čk»łÄ“#[šF*/“³žsræ*/Ī1xžZ„ųĶąB›±Ym8,Œ³“eܤ "L*ÅWŹ–|† µ„¦ĪPÆ·wĀżpŸĶD…;.fżöŪ¾øõ$ŁĘŗĢ(®²XĶŪ×Ė&Ź“6ĄÄŚ•få^Ÿą^]K“± JB.¼×LŠEŸR”åg ©¤\Žq¼ĘRh/2+J4uōöȆcŸĶžå(©Ķh;T?Ó¬1kĄRé·ŚŽĆ=Ō'÷^·»»q÷ÉDJRōeą-ėĒčoeą”*kĖÕņg&k?Ż»ŲDA8sžęE$+šüNv¹ „›Ŗ°Ą+āķšc÷åķöSµy#ŸL‰E©éŲÅĒßŌ(ŐøÓĒ…§Ż1^æ"KŸp7²Š˜4–G{YE\*›A?/ĄsÆI¾{ūĢĄbķmp‚ĘqŌõ½«Įš÷Q®(I/‰Š0ŽÕ@¹ŪmĻ, ZQŻŌ2®U90Öŗ‹ī‚äĖ“[ę§ē3Ł}4ꁘ;Į9ډ,Ā(ꙛ’·øšżć¹“±tāõnģŒ[Õā?ō’S:Ü[/æÉ=«–jW nęMPd2ą©ä“ÜĄĘ<å\Pәį£dģŸ(“Ų óų=Ļ @ķ ų ’ę® Ws–‘äח•ææ¤ŽŖ6@e¼*īńŚųŚß•ˆ£Ÿ-'x©äjæb€ŻE,8ČžĶā[[Ū…ū,ł³RÉŚŒHVź6AN¶†ū×%6G Tašź€ąh$~“÷ŅbŲ¢[sŠčaØÖLŻĒŃĪÆxĆ)ļõg5OǐåŪR¹S>7Į Ć6I9»¦÷@øžn„3¤+tiæV”B<érŌ&]9.g|łĮ>Q6źUōp÷¬ö~Ģ©ø¬„N¬Vq¢Ą÷vŁ{ÕĮnšęŪLõK*=„Ū7ŁVZؐkėOxōiLļ—¬ƒüøEÉtx»ņæjTC²¤f>ōömWÖŽ¢#ŽuX»mU`sŲ~÷j«y»Ōj›’ÉŲÅPJ'ń.Ц£¤Ņl$³*‚R5ēŗXK:Y#^%hq‹UP;ćŽ6iNÕČk³:Öy¬aØHÖĻ'x3Ģé¤ņ•ßHTŅ.ÅÆø@ƒv"[ŗN|Äģ£œ`ŽĮUę9ģ{Ь@zīå+g=QT#Y] Ÿ¹3“ēPxÆŃThōa(†3×☃·‘éżXĀŪĆŖYė+Ļū%ŠÖ<4æ¾ŖĮJÄ"™.“—“×B<:­F#ų¢Ō"G-æŽ}·z-ŹWe§ŠĆ&īĀ(qŻožęy餄ܛ”Ų \ŗ«õżhĒś~?n”KBšOĆR‘Š…\ŠŚ•Üm^ŹWĪpJśõ>1½ÕłI7&§~š{ß@ī™ęq÷K[mØbĆāĖ;,ĻCÖ%‡Ā|ėÄ­±ˆŗńŻ2_ŠĻUč›ķ§°-‚ ˜QŒJ©TŽ/–J±C¼¢Qīž“bn¶:ńän¦^VŽéŪ2&–¼±įÜų f1«šüĀ*äq¼*düNŽø]^N ‡ņCøŻK6{i »Ćō³m’g;Ń@Åļ[t–D2īew{W“^ŗWŠŌńßrĒĒóžńUæańĒßģē6Ī^Ž2{éķ5’0Ʉ–Ķ;M ¦ŚźŹģZ³u‡JūÄIÜń2’l?ŒX“ü_±į%½Ž}Óh°ü÷÷_ Źā½`Ÿ”Ć'^²6ĀÅ0ĻŲ¦Ć;ŅÅįŸ’q¹ms°ę[ŻÖ¶Ķ1:†0×ÓüĻYŻöū}É$ē~ņÕ¼ člyc9ł6é!ūd:·O½Vlc„ÖŌ~bŻ¢Ž"Ļ›;øō:Żø§²ö£ń+-WzWĶY/§K`/mϼÅ«ŅT¼&ͦļ|ŲŽtq-rŅĄÆ—Ę–ī€°¼-œėģDéÆw1Óī±oņŗčö^,ξ/a|Č_놗¦I¼ąģš­Dš³Rį>Øj,ü–öeĆ&BēÕéa„ģ~¶c÷ Ž’ŹĒƒx1`å3©š·¹ęƒœØĖÕsr…m®Uˆ!’8‰„‚”żw *ø×šKžŲ8•Į,’Xƒd0bśc"#Q»ŽQÓė`­«ocń9“¼6ń€NĮI„&,—K 33#¤±»Ū;Ā÷“L¦×œ]|<Üę’„÷«,)F%ófJ]F„/X€<5š¼×r“Ķ˜„(Š…+åP%A>O?­(nŖ%Ė÷Ģ2Ü­@¾Æ®m_JU é”āļžbj–›·KY>fŻĻÜ“)īk”Ļ*¦6nķįŃ'M‰eX˜·ŗĮ?SN£®¼ˆj|ń9*,žäšÖ'„›|ĪļZ¹ŻŁ…Hś·ø-Ü_ڶŸ­“Õ[ß6k•\Č4ÕŹ+¤{•hŪd«8Łć11–¦Żó=$u SÕqĒ•e„2u»zčó PĒŚ;Ķ Uv™ {ŠwœśĒ‘%ļ÷ /0ZĀś_øĀ—pY,§:ZP\jHĪ£V®õ&’—Ÿc)DPb q䊬„¢YƵt³TĻŠi³Ź9ŖucüCiV6ĘÉšyöøŻ¾øš‹ I ¬:²ģ­ÜÖ-Ņ_d“‚Ŗ$Ū‘U™Tī)öŹe­¦ē;÷ó¦{ćr9mŌŁłkß?Ź–Üųždś¶ĖžŽ2½hØ(&‚ˆõŠ“ž"ZPUżj­“¶ué^r§r’:„;r?üķØEo¢MŽ€NÆ •·łžūygdFŠLGūuF’®Śq­U_Zq=‡)‘č~eÄP³å“…‰H>ß挫ėnaÅW.øĪŠ>=ƒŽgŲr0üŁŪnśöĒeY#"PTĆ Ļß“Œ,Gם4ü¼!©‚‹Ö1•h Af©ļßvJk± x^hŽ??#ń°®ą“ ¦Æg įˆoÄdćįŗŸŚ†'ćŹūōĻ})÷Ā[“‹\ŻrœÄ.y£ļ ŒĒ G&ł$?ˆt¦Šč6éŅtQø†Od·ķ€†Æ¾$ūœjW&OlØźŠ=®m’)*’Ž%·ŅC$ąæJyM.ź •M&_ˆ}] °ä¤\JhÆ)ėĪ_©¾ÓóA±ÜJĪ™ą,±š5ÆŻfŸ6į³q©eĢø‚Ōz¶cŪ ›¹R_ŃG$–dń7)]uSm”_ƒ°ÖB›äūŲĒOŗ€> ”Gł”õ#×Ī2…­_œ„īōܘVŁ„Ņ.eļmŸ :OĖ~J‰µÅÕ¦Øf /¦ėÉGźĻHbO§3ƒŽāžy-P§[tļŹõAÄzҽ)kq¦»rƒ~ŖųŒ /FéķōWĪ“¼ĘåB(ę\۟˷Č{‘§īP£X*Tōƒć3‚-zc{vŻ–ę^VļĪńźp >ŪĄ(ÕHćE,=ao‚¶€t8 ?8¼V•ć9?Uį…opŽ®Ūą=;‚zę”·€ÅWfń&j¹ąø¤_—@ycNĮ˜[mõzņéJĻwsŖ0d>Ż5¢3āķYńN½·ć:r¶…) ŃōL•zzÄźčł&Ė«…@{ņ]ā¹&A= 'åqö†u—Øž ½ Žß:W²|Bv=ŅP¹ų$bŗąRņh\‚é'6Mv޼‚KgĀ1„0“³i!(4\½iĒkӓ§9+æ#DĄyI‘]Øf^¤;fćytéī endstream endobj 75 0 obj << /Type /FontDescriptor /FontName /USYFDZ+CMSY10 /Flags 4 /FontBBox [-29 -960 1116 775] /Ascent 750 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 40 /XHeight 431 /CharSet (/backslash/braceleft/braceright/bullet/greaterequal) /FontFile 74 0 R >> endobj 76 0 obj << /Length1 1606 /Length2 4445 /Length3 0 /Length 5249 /Filter /FlateDecode >> stream xŚ­Ty8Ōżś¶,Ł¢śŚwcße_³SB–13Ę0fĘ,v’%E–DˆČZd Y Y†HH…“Y²ÆY²ö½ēœ÷\ļļüuĪūĒ÷ŗ¾Ļņ¹Ÿūyīēóę·¶“Ö…a<ąF4AZNFV°Dśzń“¹“ČN%Faa}B@bŠ\p€Ć8—äŌŌŌ…} 6‡Dx±K¶ā’’RzŽS FČ'ńH!’ųĆQ¬/M Cü×ķąp€ą<‘(8 oeķhji ˆ[^Œįh8‚¬‰($0GBįh<\šÄąŌÅ aČćÖš2d,]<šX8I>„±Ē!) Ēł"ńxņ?€ÄM Ļ€€h(Š;&@ö{b~Āā0ä _rŒ fĮšPKČU­ ŒžąIš‚Žkć‘ä0€ń$gĀ0PāqKæcdr”A¢ńH8®å`H< "×&ƒaqČß4ˆx$ń')G@p0'Ɛ±§ógŸĄæuĮbQAæOc~gż‹’€‡£^S“'“żĆ#b’ó‡ć~HģxgÄÉ$ 0 ĄąžŒ`K \ūļT–łūDž$ž[ž[äżßÄż«F’v‰’×ūüWh#" e ń%/Ą @~a0€9püĘüæ\ˆ/ō²’šč’ƒį1%@ČcŠE#ČRČŹČžįDāp˜5’õK&ö>,0°Ēzz˜@ DZQ–WQ”UåU¹°’Pķ7ŒÜŸ¶„€CĪä–eå~7žļOĖå/0†h(v¼%vF^¬9ŽĆP"GÖó÷]'7üOū÷ŠĆįp(ćŲ{ T#Ś;#+“PÅ•ŪŻoąü²MŽŗ;ūØĘ¾0?¢Óz-ćęWµ'ī•12µźGAļ°‡Óf3=mœ(ŃÖ{š•<¾0Ańö|ÖO"Ķ*’3‘`×G ĢE‡Ū!«#ę_hœ”e/Ļ|ė·±u-> ;;Ь€cXŻōĻ8-“e‡¦?Māha©„`«*XX¹;·³-ŚŁKźīj]§mŸę•ĢI:!¬į O[ąO%¹ć6k G“{ž*Dę)‰71”ģ^cØÄ“¦ ƒłßš0ļwv<ó…ĆŹ“s»ɞ„ś:”sDó¼fj§ ­śŌÉ·Ź·­ņĢūū>WRJUj~p3K•„ä„“·ŅšŁ&Öä—~Õ”7˜ęƒżé- OIŌm½ŗÕ.Iņ`­h¶»WpFāŗa­ņ:چBÓß·pž@½'®›!h3„;qß¹ś6ż”Ó²YJńœ÷½˜‚ƒé>Y?h²Ɋē¢Ąn–ńšNķ[®Ÿ²mйą„`šéNŠɎµ‰•ōU^’—”ÆvĘ:rĄ…Š\S‘Eéó µf@‹Š{ʲ³žD¬»¶Óa[/0ĻRņƒ¾īnoĻŽ~.ėxĄĖÜHfx“†_ō`LĘīRļå·I{Z~Ģ›1ÉöŠĘVĶ”›µ<źvįGō(‘᳆ƒ˜-bQc1°ä¹z°‡(łz+ļQ\½ĀYUŻ[ Œ}±ł%”I(1ķ –’Å:š&xlR>‹ ŗA𒹉q^%Ķ@ūŅ»%És“,o]9ĮŅŻCB)N šŗ†Øā՝H”Ė“ĶIżēhģf›8[Ś1·=ł¬ē#jąž¾„2oęųIŚ;Äpp‡«¹~ĀĻ'–ńkš€ÖĆ cˆ aIįĮ—UŹhön¾¶‚»/Āé-=¾ÄO]ņc»Tī>"²v u–łZ¦čj× ¶Ļć]8ųž; %tL@Ét3KĆAź—0~g¬=ĻhˆžžDŖ_V·©śĘ–huS£“7ćR&äéh¾×ĮšKWf§J ˜FÆpٳŚ]Żō‚Ģķń”8¹óäx:O¬Ÿ‡}żŹHŸ±›\;ČĮ”Ł/Ćmg¬ŃXµ_’~Äį×lw­ķ¬e§śPƎ¶zŽ=ƌtš0õ‡PfŪĻR…aŅ UT„ĪJēC ƒ;l’ņ;«.]ńś/ ¦qUĆs‰cŁŃi=z¼ū˜¹ƒ¼ Ņc)ū³ cīēt*“ß!V䯔ņßĘFm/w2ä Ź\¬šmī/¼-äĶ@’.Ļ;w„ėīcY Ÿ–&nģm•$]Hś;AŸmĘt+oE~‚k0¤_Æ.n€Ū0Ü«b×|1ĒžµZ*/ų+$8÷#÷YX«“BņŖų‚7ŖŚs™KŻØĘļ.¢„łušÜĀ­Y+x2‹iČr(ü}_ėB&d!-bĘņoyX_ī†tlEģ®PųĶ]™/łµŽ_~F*ń2^õläń¤¼ÓÅś0a•ātĮ2!Z•küż JMo-Ų’¼įQzp˜€M€’W:h&|%cź!S§dŠĆY¾§i“_u÷]8f“¬ØŠžW¼¤Ö ˆf«“æøµ–Ī[dr£ŻŠmW—ČP ^ļŸöE–Ģ˜Oɹtė¾§=g¼8Ė¶Ś  {9åä÷ņjeńrģōŁ·+ZĖÉ5? r• ‚ųMīR| a<•pį5/­·RG ^gŹhń”ń×=aoÉ|”·“-AżÖ6OĆō4¦2p”QįVĪ[—”YJ’Č”&µ!Rš$QŁīŽ­åĒŹ¢'Æ~>).õšššI½ČüŪ Œz^Nt;éĘB„kš_ŚĒFß ć˜łėq÷*ÅŖ×>°”łńS;f`øBf؅ägkļµn‹°®šh¦³~«µ2ąā3yƒ_й),>ąŖĖŚW­Łń$x½ŽK»YüĮĢļĶŽ |^›6æ2sČpØgąīL/ĢNJņõYqß!>h±S5/Æŗ”J½söźŠĖ 8ń²lv¬éĆ4Ä£ĀŃN¬3Ė©ujÆ¬Ā„”7 <ĪĻŃ§o„i¶ŖR—5ɀ\§®¾äjQš¼Æū‹ %,>݇ćEGŲuv‡3Bw$ ¹<»łč¼µ‘š022ķOłuõŪ¹‰¹÷?°Ŗ‚Ž„rņ EŽéĘĆÄņį^ÖAm¦¢Ktŗ7Žéńļ&ŪĪ“āDåWßC»6ųŲląÅÖAQµ?fŁ«Ķ5§“^]"YŌæ ĻŁ;2h K1a)µĶŪŠTœ~[zƒJÄ]Ėū]ōb\=Żų䷍JØØ}]ģęy6±I–}CĕŚģ‹Äy¬Č#Ę0ŗÓ¾ÕÅĖ—“å<ŚzU«ēŖ3.A6Gē3Ÿ\’qʈʐT¦:Żu>DŌ"a'Ɓ©B/Żńī÷„‚oK«IŚuĮW{,Īķoōi“X‰¬ÜšžĮ×Ļ€ė¢Źė©zżöā®[¼Ų NQ®>Ž/Ąe żŻżī·¦e9W7ŸNų”m‹PnLę>åwßÅŗŽLÄRcĘŃҰ|.¬ēC¹ųøŽķöÕ±åęuŠ÷°>‰°0Ŗ;€qęä7䕽āŗ<ü 2»N~½GdĖ»/ēųVÕnęńŠĆž/KØÕsUØ³ŪŹ?=ļ­¦ė!ĖÅĀčhK¶TĘĆø™µ \?ā  Ś×w}ؘ&HĪģ¼)%Šdi–.£øįęĻ“¹.ŚtYQÖlz£Õ“ŹŽĶ÷a$V¶ŪAVĻ4× Ś[9ü[ųĄŚ+§ßkōMG1։›Šo–mÜþZ}÷śn+7DĶVt·•~j›7Bó«öėė\‰u²O}ó$¼^Ž[ŲąŃ’LĮäfįĆks2ߖ¹ Žu Ó±¤ ؐvD®é»R¬|./źLõ䊊hƘodsb7ćšFg»ĀJšˆøŠį•%CV•Ņ0ćÅĄV­*M~žŖŸŸ½`ĶI++l³-@Ō=qU1j<’i]Ģy ńÅķT“³,T£%„0`źūH ¤Ö¬$}ĀūTuĘŽĀ3?ćī~¬Ö‹5¬ ‘õ½Ž÷ē(,i9³,BåV_Cнx¢Oómpy%4€ŲŹ;+ī6&³Õ×īé^lB ā»:•„žHĀ_åś¢Z>“§ĆóŪß9LųU‘PO ”tĄ{”§O7ņqģźEĮōÉļŖiz„K2Ŗ9Ł*ÉĖ©}R…aJ9vLŌ”׌üŲĄüżŁC6—B'¹G—µaŻÆŗ]"¹g]_?—8nÖūHĒdż ¤žG %•0ØŃ«½ģŽKÅS"c»Ń8wĻ>;ĀzĖU©¶"ė`Lķ¶pcŻń>Õ½/” āg@šē¢übežÜęņĀ'¹Ś$¢ĶĒ6%ä¶ż@ žźŚc‹ZĖĪ,IŁŠČŌĄ+-Øėgu½ļ>Oz¼‹?Gp“|¼Ońf“DC²Ź…Ō)ĶĶāx™¶Ė—ŲŠFōė’"~~B¼”zŌįXø yYŪTFGaå4²—ÜÉ­—øpmĪZ:RwŹØ®‘MŹūćäē;§ÆĶŸ·é×Õb ,7*š­o2_” āŗ»‘õѾ"RŅVaRŠš³VŽįøņōcv'#ÆŲ0„Q/—Ž®·Ač¾Ŗ!Ƥ3ܖłŹÖh[„Źļ¢>t4ßĆŽ)łé®Ż,ɽf½µÜ”L…äŪI^ĢÜŚÆRJ °…3€ē#Š]Ęhm±p‹¾łOƒĀ5Mī§3·“ʃŖ.^“č^/…$s9«>]‘ŪdŽaōŒv» ēYĪ 9\戭óÖ,ļ«cGŚģš“Ž°³¼±R¦0=,ĘŌ$ķĀ:_¹ŽtqeŹęwLŪ§ęŒ—ßvdŽ\_md³ŁfuŽ9™tļäār”HZnœx=ßŌå„“%¬ŽJÕÓ«¾ …Č1r¤…‡+’æ±šÖĄ“¦°'G,‹+ö(’‰u·ŌOĢ„l`ßiCXŽx9» õĶ)v0R‹ÄŚ?S8˜¤IŪ?XĮ¦ęŅ{ßē.~ޱŁßs¤[‘ŽģwmÆø.ŁSūbfvC(ńĮTÅ3ŒŁŻŒésģ+ti=x5’rXD uænŠ—;0č‡:?yaūdb4å÷øŠ¾DĖ/Żķöģ<’ŹŸ®ŠSØE键‡|žöŁ£aiRēćŠDüŌõģŖS}ńŁ]EgÉąČ<¾ŪļYoŽÆKķÄeiēæ}D2ń“Qo<ō«Õ„r¤*“ć¹ąąæōŖxf‰2ö½ēZ2¼źM¤ö„.21ąŲW:Č ¹9ś“[Źiˆ‡³‚˜-Ō'Ó®LH³E³õWk+!¤>T.ł ĪōÉęµ-7ÓÖ[Åų¬{g]¶/„ˆÕ8ńoš#O0Ü¢U»r8@ž„НĆR™ ž×Ė=ڃčV¬N>ĖĶ'9:{·'"!/óĢ e3 æ ł ع]KR»6Č~ŁņĖ?)#V|I|ÅLsļŌµ$ä8_d9xŃ9~Olhņ’ģ­÷“Y8aė–øĘ÷(Q“źóv}Ļßķ…¶?±’˜T®U’I1`²ųQP!ÅRŻQm>ݱµ#ó9Ŗµ ;W ņÆWAÅäŹgŒĻĢć«H2kā3±’R~cZŽ^anń‡ŗ×hm»l֑“͆$׎s_¬lu÷x±fyµglN°·Ł s÷£å[zL·{8€Js”¢NW¬3ß«Į:h󧯬ɶ=Œ3¦ń…„“ŽĘ_jŻždŸ«— /v>—«Q³iLv«0DØ“)ŽK¾:ž—n¢ČdäLĆxÄjˆ¤id¾ćrqIm ×HŻīžŸŪ†Ī—½¬=-ā(g[;rvøüA›/Z]Ökß™[īM·ä}ž¢å³ąv¶žb‰ė:ä×Jü؃šĒuˆ„„÷ćŁĮīŖfå¢{ķāHŽō¶J4ē¶ʛa.ƒ3•™=ŽÓØ7m†‰é‰o8OŸæĻŖ{«“59QS±x–ä}Ck`ݱéüŖwyŠjž#Õ_I(ÓŅs?5dRÅ+ė5čĻ«Dd–³9oą¤ĻŠr}ҵÕĶ}v&¾%µXÜń¾#uŹüĀ„Å\Ĥ«ąĪžģž·óiÅ÷æ¶>åp*Š=pØĄ„ū\H+½Bm½ųĘ­Ü1ń\Ē!Ó°ĄVäyÓBo‡,-ŪĒk‰&z5'ājŲŖnæ‚śt_ų¹:åū į’„(«¤ endstream endobj 77 0 obj << /Type /FontDescriptor /FontName /HDWLZZ+NimbusMonL-Bold /Flags 4 /FontBBox [-43 -278 681 871] /Ascent 623 /CapHeight 552 /Descent -126 /ItalicAngle 0 /StemV 101 /XHeight 439 /CharSet (/c/d/r/w/y) /FontFile 76 0 R >> endobj 78 0 obj << /Length1 1612 /Length2 17842 /Length3 0 /Length 18684 /Filter /FlateDecode >> stream xڬŗePd]³%Œ7Öø6Vø»5īīīNįī»»;4®»»»[ć;ÓĻūĪ;qæłžĢÜ'āģĢÜ+WęŹ½£*ā+ŖŠ ™ŚÅķ@ĪōĢ LÜyK[c'9;,½2ŠÜš×ČON.ā4r¶“‰9¹@S€(ŠĄĀ`ęāā‚'ˆŲŁ{8Zš[8ØŌ”5ØiiéžÓņOĄŲć?<w:Yšƒ_\6vö¶@ó_ˆ’ė*@ ĄŁ0³“Dµ¤ä%Tņj čhdPt1¶±4ČZšAN@j€™#Ąęß €‰ČŌņŸŅœžb 9ŒNö@ĖæŪ€ī&@ū\t{ £­„“Óßw€„ĄÜŃäü·ĪvK‰‹é?žŚĶģžEČŽŃīo„ķ_ß_0E;'g'GK{gĄß¬Š¢ā’ęélaäüOn'Ėæn€ŁßHS;—Jś—ļ/Ģ_Ƴ‘%Č ą twž'—1`jédocäń7÷_0{GĖŃpq²™’':€#ŠÜČŃŌčäōę/ö?ŻłĻ:’[õFöö6’Śm÷ÆØ’ÅĮŅŁ hcĘĻĢņ7§‰óßÜę– xĘE df`fś·ŻŌÅž?|®@Ē5ˆźŸ™”žKĀČŌdć0šĮ3ŹŪ9’M  śæS™įæOä’‰’[žo‘÷’MÜ’ŖŃ’vˆ’_Ļó…w±±‘7²ż;’¾`o;€,ąŸ;ĘĘČń’ndkićńŲš_5€’&ł’ƒ#ålō·B óæ‚010żŪhé$né4U“t6±˜ŁüķŌæģj S £%ųWŃ5@ĻĢÄō_|Ŗ–&Ö ZĻžodś_É’é_Ōµ„54Ä5i’ėśÆ(ÅæŚ;«zŲ’%ö?K‘³3ż_‹0„…ķÜ^ōO = +'€ćoĀļĢĢ>’‡l’‚ažĻµœ‘³£„;@ēoÉLĢ’*ü>’¹Ņū/0b ;ÓfEÅŁdśw¼ž—į·‰‹£ć_U’uā’üė :č4_]²3įła•–™ī\‹;4!ŖÓ×Ć 9l_Ś ZTą_m×ķ—¶ĆUiųVĢŠ8ÅżńĖcńŌžż@šęp¤ˆ²;x™ļCJŻ[€ŗIŃĪI{ČØ_ś5żL#ŹėjAvJ›ƒIżpwBIYæä †`ŖÕöź‘ŚŸŌµĄƒģĮÉ×$µ>³„ ­¶šōŒ"ńäńr`txh°ūtļmN,9¶oņ)q’³‡”ć]ƒÉō‹+§Ū.RŹOH†³¤Ö(Ÿg¢+­A”&/(””°@Ī‚f+ņōY%æœēr•\,–Ńā|¢%ń&ꩾF¦?“ƒ«{øF8rvź–G ½mchŗ,Ųs>ŽĆ~÷²÷H¶}P“HĻRĒ^!é€`’įŸ6Iīs—¶h›æž5šX7cń ø¢Ūr”›[YĒuV£cšą÷懲 ‰ŗ¦mļīœ8źĘ*™ø'ü ZŁ{:ø ·7»ƒ?§.‚)ˆyą8“üNrƒlfS$=-Ł:-å³£½ÅÆ·ŁÜ€P8(C†šĆwŽģ4Ē@iœŸ-{G˜v-Ņj{;Šå˜&°ōBJ—~H­F ėl#ėŗ­p=\ļבŸ4¤hž ÕóVƒhŹ›¤Mnr!1üżbAØū2qCČPõźhœeå[ Įī€ų™~_Ɉځh*ó_~’Yļ+P„ē1ö$ņ“ŽQTŁäxzoē›kE ¦dŹöµ7MĄ„µņŲ ‡RāQ‡yē¹, eqĀÜ·ŌŹā[ÓQĆOTŽHB)-łlH?…¢ß„q‰ow½)VUüJBzö‡¾µ+ņż%jsµūe8mgoŽĮĘŖ{_M~™óĄń_ ŠD„ŚöXƒŌk.f+ÕĄÆ«ųō‘r9Šˆč·GOĪS^ŻXĀęśĘL#瀂æĮ›ØxčŖŃą:=<ķūŻć ū9‰§¼æBģ·Zƒu€ÓĻv}ƒ™k ¤ÅÖMą,ŪL£ ³V_7rsrJųęńÉįĪGVD*wčO¤`ī{UśĆÖÆ$Ń*єšę”.¤šŃMOaõŗž¶gƒ²P³x²*Ž“&QżĄ¢Įé6yÅ wyeqFN²cJ¾£¤ł+sb4X`G?Ź!ę7łģ{`‰•ģÓrŻž?ļtļčMg%>+š‚Ż„fUÖ‹ńś^—M[iąĮ˜ĢēŠŖ÷1ĖĆB2ŽEŽŚĮ¬Ž²ĪłWĢČō-fV’üŚŸŹ’ m’ F­§ł#„D+haįßY›§Ńō‡‡V”ŗR¾ō’ÕF†*¤:2¦Õ*ÅN ø“<Żb»ahÉ@°Ÿ͌×.Ž\Ō‚&Aą¼BĢ­¦Ę}Ā5E&ū×üĘ$"į,FĒWĪņ į\öL%†"8kZōžĘȓ½_‹ńb™G°žQ°ęcŽ€Ķ &n©€³“mČ.z¤AŖ«č×7 É˜’Ļé󖔐kbĘą5E2“\šĪ€ŚöøÅ˜«Yæ•1 n atRŅ(u•Āī\Ŗ±Ī)»ēUńOÖ·ÜųµN&µņ ^~”X7z;—‡ģÆ»‹eOC_pæÕ<žĀūZŗd6nżF)GŽÜć`g”JΉDū¾ąłU‚ė¼Żvā’‡XDÄČWf¼˜wh;‰!/ČF½Q„å Öy3Sbń¬µč‡k8mżĖoźĘŠŚ:hKā²S—¹ĶEˆŅĶ–īv Čn%Gē(ņ|[+ślŲ‡’v'µx,Ģß±ŁB¤a „Ö ^Kå65Į“ŖĻć¶š„vzwį3¦{/EP#Õ›¶˜0݇ †[ī Ē\ö›EåķO™*­m1Mī2_ė ņśaĆ#„ųGšH¬Q„e0Œ.]…§8ŖtÆ-sŹLæÜóLFś^“T¹j @•ś³aŌIī–”źbX\ÉÆ0FX”²„]–˜å=§aÄ{«’„€yŖoH&+ųŲ ™*@ iöŁb!äē_ń‰õÉ$ēĘ’ÜĀϊZ‘U …RBŚ3åĀN–ńĪ1¾M]»‹1<‚ŽŲ¬Ą8Õų†Ekī6Št‚ČŲ=ņØß čłFX<šV.5«“!Ģ±Óœz„7µ‹(vĘ“!é«XYS”|n@•^›ŻŚ¢ ~”6rÕ) śPSkł-s·{æł­ŁU˜²¢½\VTG=»t—žį»{mĶõŒ·Ņ!qAĘÆØĄßµ"Óö Ų½/DmĆäKÆą›łöHŸz–˜Nć%nåu%ōAÆķ¾ µ—ˆ”“&Db-(³Į‹ŻĮŪųŸĀ«›E"š±v2v6ąs`j+«Ó’7;āE™C2ćĖĪōp0°ł=ä·Ł¢m«yś}ĆM§2’ɹų•pĪ*^뭁A°"ē ĶmżšY­…›OÅ¢śūB9ćŁ½¼Lb÷/ʦ! fXÕésg ¾•ďUŌ×:kĒÉįO¾6’ńRH ¼žŃą5±Cf£śl„æ“Uģ.ęĢf‡ųͧ”ĀČ·_=‡5Ņ^MEŖv9O˰NŒķx³ß’ČģwŹmuƒę EBmĆßmŖ‰ŽĄŲĘS‰­E#—ŅąNĮ#5šh[ž©u§'*˜£Rް“TéH¤ō®yV[Š./ľO å żų°Œ%É _æŒeĒ`jęx HMoaCė‡$'°¹µąÉ„هź“kŲ¾qWķ6p“I]+ÜŗĀŪ©īM€6āćWš×_£é%öĻ„(¢ŲŹIKā&5öÜéķ—Ń·®S”=3OeŚ”(l~ŸŠbļ/€W|ŹeŠ’‚®gd|·±Ī`[fӌÆ>šSfa«?»gqiŌņµ\”öX„lˆćl˜bėaĮl(Zõœ©TŽ&J  H²¢½č( 'AJCć‰=\č īqß6¤[7ėŽ¤ ģź§ĶQ•āīŽZ/Ī”jgöO>5 äsL–¤ė%ŻÆļ©Ę/éj²}‡+±ą©ńŪXä<ą­3įvģ t,~ž‘Jbļøb²õ;Ī ŻŽōé‘Ļ}u°,eć„\ž7ūó+m+¢pŗfr}Ć`—÷:Žm3łø§”āąĀZŸt€T –Ķ“sā£ŁŖ=½ØæQđŽgkŪĶ[aÓ)(„„`¼µĒ¦†DücbČĘ®­ā‰ ¦(((~¹ ¾p^‡2żó¹ōĖÉZhūJLL}ÓŽÓd,1Ū‚& )Į*¬&õ…15#[kj\Æs`§üĢW \“†Ż“e’e_ņĮp”‘u†å ā3"Ü[FF—=Į¦"r`ŌĢJ‰! Gž­)‡^E”PV8² 7ķ(&~#1p/4ķ‡^~u6H(ЁšS`Ļ(OųĶ]J+@"ėZ—‹ftG2iUĖa;惞#vƒł†&m#–“ƒŌ,n%u®n*”ģ®Š3LĆ\°P=>ŽæAņŻę²i-FF » ų†©ŅÄMID:¤’ź€qµ!¶ńžĶŗčœĪ±Ė6Ķ'ø~$rüT.+IĶż~œāb’Cö7T?Š<՟VŻ}"}¹ž4åūF/…iZ¢†¤»²Ń‰HߊŒ…•ͬ‚hÆ­ĀB GŗŚ|".óī E"Üū–gr1½26`“:äIR=ĀØ5 ·AK°F(ś åÜ 6 =Ė!²³ąŻx Ūǧ¦ēt?X&˜A̟_ųT!ೂ2‚LŠc‰M ynQoßŗ}%ˆG¢(wŌ•ēū+ĘöĘ'3µE²9B÷i׊„™=ķģƒxĆjB m'-NT-XŽĶ(ѧi‡ŁÓ—’Ŗ*ńd yĮˆõ³bæžĀ6yœƒŠŹ„+>Xż‹Ģ§}x·ejłOƾ+lI:UµMĆ×$Ęą §ó\uę© ć} yl0ł.»UČ»ąĆÓ°j遘™Œ”y’Sģ½IV\(·<)„6@s”łÅׯmµŠSkĒĄ¬ūŸ$ÕÆö$Ų» ā?L¾*Õ@K[ūN£QƶĮ›;ģW|ĖN²ė:ĶY’³VgķļæĄ'•)¤½RńžžĮ HøīÉRŸÖ™‡bžA”hYÜ~<¾#CĒe€ŖÕWšŃX¦œą +EH= ™H3©)` UƊ…vļß#µFARąåyE3@Y£įuy+vhE³B‹\hFĆYégmUyżUgćf1łJĆÖ§ąŌD:Pģ‡(†&䂈:“Jé¬z³÷ń ÉjLN@茮¼G'~P5Ķq(1|HÉūxņLĶhL iʍxbź{ÄKZNk"¦mn\ƚn×}yOz&Ź”ˆŲŃo©—rĀ~ɋ¼Śœ*ņjIˆq‰ÕsÜFQA[Gx±4ėķąF<ÓPFąq9Ļę§’Ł”ŚfÄv_¤US0yI)m—āä‘8įfŠĻD­(Jø#÷biÅā’c€fcZĖ@R}é‘?F7>»ĢĄf1½ƒÓ‘ ¤ą›O3ešĻū²{C a)dš^­[üĪÖ2›Ÿ~:äļõoBoA "ˆŌFā>Š„„ŹÓŹē™ÆwƳ“\ŌDRÕĪT’śēžŪŚDy80 ąV愜ņ(¹.čF®1OØŃcöÆ> ¾%·ņ.²Ń+§ä£MÆJū³ÜN`üNŖ“~BJ2ŗCž€‰ģeW˜UksõŹ ˜ˆķYĻ"§Ćō¦ƒYęz|ÜOn"Žkż˜ŽäsĪc6¾Ia‰‘» 7\{Ś·¢“¶@®ś]Ė¢Ø{1§Hzü„īA „)ōŖżŁŽPkóh릲})eq“ōŒ‹»·*Ü®aPsƒ ŲG‚ 9dJĮåóN=bĘŖYV¤YõŹDśšīĀŹ}_ƒqŒ .?ĮJ¼>'})^ƒ[’ČŒšmy īž›ĒK„OƼ”yõ6ßø\%w½Ń†ōDč)„Ķģāåśˆõ3æE,zß“<}źŪēņŒģ)ņ†{5ė /ū 3ēl’Huŗ ™AD–^hĮµQøtyVÆł5ž”dĀ[ÜUś¬9Źė«²ĶŅp~€zõĮĮøŅ!\śš'ʬąvśˆÉ÷9…'[^¬AsŅ—h,FYDƒŖüłDkh½Ā Į\SMGŅńbĀĮōū¼“Ūßub4Ś ˆI˜·IŸä<Ŗ²…ęh^© (ę ńĄōŲŁįÉwŸI(4R½ Ųa¢Žv|F۟޿,莐°“|}Ķõpćš}§ŌĘ7™īŪź—nėšŅŠXP6€§;1ivv¶a~jé¶ ؍N=†6!™ĻŸ@ źæū?ļÆū(ŅõÓč׆LŖ>HŠ]§ ŽĒåh›¬ bŗ6‹0}˜2éPc•T2Ģł‰Wx;ż1óėņZ®&Fųr˜3]W0‹JO$ū‚Ütt䨟×-4å™7ÆÉ2ŹQkžʄ G»pö.~®…¹²L]ŁéF^PqœZļ%=õČj|ÜKZLN!J†Õ\/0'|[„fŽ;Ü1ŚC»Rź5¼#'dŸ"L­ĒD†°,š¬Õk)=kQ<=Šx„IT!8įO§^łøĘūćĪR”ō„Īȑńœ9ūLeĮļxć…ćq(sž^V“]0Ø_Ä>9SŁ%ņ’Ž+ĄSĻ8$›c«T#ˆĄįæRi>*’:EsßC™‡6÷ʐąņœ¬ŻW†{XīD×ć°6Ćšą7Ō+d;oF4Ž'f4S©0^ifQQljgxguĘĮŽ‚ĄM|\ŃKŒŽ/­¤i’ZAfrīR"JŚ»0ppäģĖl=~ęĒhxDźę'v^@Ü$,JÉāU1ö6*“4k¢H3Z^öVi;°øŽhyŽpCC&R‡ö=*Õ£wĆEņŁūZŗ°7śéLūŽ‘ųĒåw¦Ą‡«‡uĻõ é#Y(Š_€VĻøø²NEEūņ­“m&Deh×ŖžõOą%.øµbœnI'<ß/H£Ź±Ć”k2P°QśĖ§ĢŲUÓńCj¾{:²Ū•Ԯ˩ĖĒ7[7‘Ʊ™ńˆ-=ĖūO”³Z¦ŽķMķ0×JĶdęŠ‡Ž‘LmļĒņŌ„'æwsęS2#I õźÄ÷”·`Ž”°¼~ņDÖń«“YÄ«–{ō®æŠŹćøęxˆk.0‡ż³^ĪO•”§XŪč4ęÕäb÷śĖ.?ß³ņTÜ:ŲHīŠ5D³•‹Š‡–¾ęaW]`lŸ,f–‹Š‰ŸĀćć[W¢<į{ų'Ao*jXp%”Ķę‹ķ\]Xx(ĖŃJ(0’„yCķ |ÉpŹÉž8> •ŽZT&‹[Ų$ĆÜÓnV^ģĪ Ó–O Ż}-,<Åæ’Ķu9f}Øõ\"ŁŃÕ¤ŒŽŻYµ-%ėףe™ß™\§AK½@|įx/¦ŅMKā­ –÷Æ ³†-„%pun`Į ?¶ößo͟®…\vd-śR]ßQÄiÆ£a7:óżū¹­+…ŪéĪČķ‹›·»©ę õ½©&ąL¦”‘āÆÓÓbŽģĶÓŽ4ØJ‘Ūāc>c˜ÄcƒŌ]f/ą[™‘]3»qeŠ~9iĶ–žk.ćEåĒO ż4īē1<–ŻņŠ`Zu7SŽĀJOżŗ”:³[ÆNƒzĶø.¬°£T"±‘ŗŅĆõ-RE ‰}½¢)jŽ—ŚÕŪ2#_ą§lX³ÆBž·OZ“X‡w jü‰SgE)›ėE!#ē1nO"Q«cI\zˆ®ę­˜A>ųҹ4²f£ƒ` aRØ=wĮ>KTG«_ bą/1#…¦.žŚŖÉ–žD””å¼µÄĻRåt‡ńq,ĆžP\ąķLfTUéœkŌujS},æW§TĮY OJł~(ąd‘‘žÕL+lžį¶µļQ>r z% š³ĢŗFœE©¹’ ³‘oΧ’fܒ7É|¦ÆŚB]Ą÷ µłt*•N©ŖĘU6zżvC8—k=[ī·ēM­¶ŗhøĒŌ{Kœf(9 ˆ‚ČćÄYiRqŽjĻīOw”N‹6{Z›beœ ¢$ęßń½æŌ„ļ‡žõŠTg΂ɋ~Ļ%ÅØL0¶Jd žżŚ®ŁĖJZؤö™³i©()ś T6s.Qś5ŠßĖć@§™Ā~ĶÄØt)H*rZ8‡(šƒ6'U€Ģ˜n~`r§IēWVŠ•hÉ]MmĪm^JŖŸŽ;ł†wnqń’TbČm”čžŒ¾²©v}į?ŒjĆŪąuÜqÕņŽE†D=‚„ļzķ½%ÓļŽeöˆnqwć”eHĢ=_.’ųį #ŲÉ\ŽYķÄł ²Ąž8\•?{^ōrĢč¢nsš^“³Ä{²į p'ā`6:ZīŖ­Z­ |ŹćĶż> 8ēÜ·ÉäB ‡oŽ$[ī„+XŁĻ°ņˆ: m%g‘°”ølż„¹ēbuŠćcÖķ¦œ° móņ³¬'“±§£Æb÷ę»ļJ-Z_7åĆ1±OźżštĆ×ķ&łāĝ]ÅĪe’Ķ…^悸Ÿ}ˆŃ[ø¤Zœ÷Ī@:¶7<ŽØ¼ Įg;@šm#;³ Ž—¢ź;ĖaBXĻ'’÷š¼YJ›}¤˜†(IKķzäČÓśž'8Ÿ_…ĄgƒŌ“Āķ,Ęю’oüøś±'…ń/ļ(ĒßßO­|³nžßæ0Š\ §#¦ š9aõĒ`-ņ tok„E.'ŃųÜLA =„”tvø³".ŒEWčH2¼ÆŲ½ųģ[Ļ ēé5ZƒŻ¹¼Ōµ³åM²¶Ćos¢nėZ׿’†ļŠœ ä‚Lƒ†)æW”Θ ²_•.1XA×ó3I3‘±‡8’ķ7Z? >¢æ#’]mׁŲ?a„³K4Įż:čr ģ1ę6 ŗS¬œõČ †KÄÖ-”¼pąŚ©ņ*ė„Ų÷Ė“Ų V„$ÉUCgoķŻÖ£œ»€(˜|/’¶ƒ>įvXj”»}„r§²E\¹¤hŻ|ufž± F¬; ‹ēžņ4?c…ŽŲƒČ²"D6·"Ó\OĆÓ<÷b8©wėr8gKŲįĶŌų0pŸ‚]“U”Z)›uõłę|sGƒĄ|er/÷ͦD‚ė.Õ.FRV‰a7£ÕŸs’Oƹ¢L9'}[¬+~­owūŃŹ£ČStIaŚņ°Ł°b,ćÅ%3ü‡ÓćR8^f¾o,Ę%„ēŗ‹ø×Åqo;8G”•¼‰;ś*µłD‡ģ'…±”įźyˆĒ.õ‰łłāH_ŠŠ—’kźČžøźTIvŁ#^H=ńKšŸN²FᓈĆU”ö¤Ū<ÕɐÄO•KóšYÕYMŠņNBÅē!¹ׅBS²£”šU ¾ŁUźķØĄbÓ ¦ei:k®Ø·Repģ|ęļRUū „q¢EØĆCódµ²¢1ń‰® …U’ry—Ż*EŃ Ą1Üåīdõ»ņłyŸ9½ŌW泊$BNpցkā CU6ūV’na0¹yŽ3މŠuČĀōDyвēÆTˆ>ü L|^Īa\2”U œ vųʁ;ł O·6„[>8čŻøHŅ9} żø'Ņ«"¾ė^·źąq(Ģ{‹Ł „PŌųĢWS/ņPlœy­©+ŗČč,Ó 1 čÄXƒī»Ł’n Ćä5£žeł«„R’|<ūѹdt7 į‚ó‰€+\™]XŅ \]5+Z¤KU..™Ē.‰eł?_lś;aJO{LīP^Kשb¶2ef“-äóšfh®XČøAŽ č ¼'zõ÷N“<Š8VöūćLüž>ß”²üséĻØViŽł…øVwUc–‹X|ųTH<¶Äī/WņžöÜ»[6Óńķ_źõ|Ė-Ÿ÷ÉīfT™Ŗk<Ģƒ°] h†qѐԧ|C÷ }*v‚“ŖJY=’¢)®v*tß:×6]$ī3„>–ś8zZ©L,{‡0’L“™dœšCB;×­·†vˆ-•šćCBꠐ0gp˜ ™^d“PFŽl„Ģ*³Xų1:Ż®“Ö|¤“ fšŠ„]ó”äkāļmT~"#4”m™Y9żēiŁ į;d*ʍ¬]Ä×]§ūŗ@¤3œI¹–C„m{¤ļ…õę™ųžč‘M©›1WšŅLļ¢/„Ņ‹n„$ž·šÅĶawö"XŚozo4ÕTB_m¼īƛ_żŽj\ĶŖ½&ö%a©NoŚc6tõŹ@R'™ōÓ+Æ^oUŻD–G؃h˜ŹfbÓ,«aŲ’H†½N)¶öq õļü†|ł“#^ŖˆT›H%Ÿ÷ńw7w7_ćOļ™Ę䀶NÖ’cgšŽ*4Ž lŠ’ŠŁ/…ĻāļŠ"†L,ś`«Ń†¢”€ł ³7“’/•éBĤ'‰“гš×¢«R¾pVA(1“–ŻzčĮöŒG”^”¼āš“¦#€c5c šœ…UĖ’#—)=•-I(ēyRĆ(2ŽMõŹķb5Ć$¢g_Źd”/™€C=kń :R,Uåc†™"c]ĶzÓéś”®‡pʳäWĖ÷˜_ŸžČų¼~ÉÜŪ­żˆ·:œĻńýƒ«|pģüūūĒß_¦—·ŹGŅäßōбüwōiŽj0YJ;>E6ʘ Ī<’ī$ČŠŃe_²„ŽńYæ‡ū2]¢Ųc‡÷ÜīƒŁl»_Ÿ&/R_cł%˜Ń¢­ļŻI·Ä #Ū3;Q’CQœņRŁ­Ņ<„źĆ&ŗką%嘿V{%·Ń+o(³XĻ9ž~T„ Öi-įł{ĢјĪ>׀/ĆŅM‡Jš·V.’4µäŸ0Ū{ĀÜ,č>Mé “u±Wak0…•Ō68¶øµn>r 1[Pæl‰ Tw^N(ĢÉØx({WbĻþ€]“÷]żšŖ¾É/CݟŽčiŖõƒÖU"#ń|µ±³‹µ0źf} #öœ8O Õa‹¬>ö«Gx7ßpFÆyå}µ­ļ ĒW𦂬C"i=§e±čY|ųś¤Éų/ē ‡”)‹õø_/„¹ōĻq~9J°@ńÖ*÷³¤źŹ*cζ¾Gœ,ŠF»²Ū’*r­>®°4ŪBĒŠ×›¦×֖Ūėaʓ4oAūėŸ¾iĆųĪ…Ą¤dæ2ļ­g[ńōūŹ‹£zPru^Rpm'į™;D{ņ~P‡V½ŻŸ5C’ųŲÓkø]ŗ±bR \‚Åāī%ćÕēh Ŗ>ć_ØÓČł#‘¤CKĻGö‹­¾‹f“¬g ų';8ėž$½9>ź ‡č2†ź‡Š ¤¤w©ø³®y&ŸśÉŗDp%}×_¼;~óŅĒūŒÕøęõi5^Ŗ`öcqėc†”5(āęß³vqėž”tī08:?vŸ¢żŗ¤’2Ć,Tw‘wō9[öŗ:›- ŠĮ{ūFNø†ČēRė1Äżū~ĻšÉŅs#(Ž1’~Mš”ĢN‡©zŽm¶%Żm‹/‹Pµ©ĄŚ¾ŅaĢ”Ŗ'Ų^M伩>Ū«ę÷[ ±°rālm”~ō­!zI×A¦˜éšR’õ·q(PżEé'­×9Ü `ŖT`ĻR Łō«¤¼Fz3÷)žĻ }DĢ\1J©kˆ]ŒČ÷õmŽö°K]7ą—ńĻh­`&¹źU_Ś· =’Ā]ߦÆ+{Y†Ÿl@żōŠŅ(B'īÉćį2 ²žč¼²#!ŁĀY¾œųsƒ “ŒĮdLl¶£*kźQQc08Äūe/oĖtČgīĘŌēßt“§"U^[ ĆĻ(%+æ®­Fw ńõŽoŁĮ„—éŸ1!P÷rĆÕNƓ3m!dŅsЬČĘŠųākĘ Œ¢į¬‰»÷ś|ģjmø{%JæĄ#-™!ęĖ@‘kĖā\"Ē•īŲg™‡@ö­†Ép©P¹Įõ?Łņ©įĀ»B…Z“‘jäXĒQ‹|Ā+’ŽR0׿ÓĘeÖ·•—Üp«˼k}÷¤*¢ŚĄ„iRdh(xuĪo%müīņ“kŪiƒaņ‘¶ŌĶDžkSdŽ'ßųœļ¶mą˜uHųŃq³Ń„VI=ĖĪ •!ĶI׹¹°ŠŪwöĶ*o/v”Qü¼:©HM[>9ē“ČoŁ•;l8~WŻ{ꘇƒłˆA_ˆĖ»“ŠŽ (‘ią¹=µĖ "ž¢†*˜K&»;S® xze×éGĮP*Žc¦xw (ņzÕEf+|®epé“lw†]­hT)ąõģ½,Y0ē‹®?Zńt»§·ūūKYm/³į#Öb}‡ZÅ:µu€r“ĪĮ`B Žä˜÷³K¼ŹŁŲJ°€Ł÷{±ŒPæģI õ‘é „Ł'jŻ$9]ūƒeØńtlI=ÕW”ŗKš]³–ć&×óäž¼2fĢ“źwI…*6É»ö·%ķ?3HŃH0¾4|'õóī‡ū§UņycUM,‰ŽQėsXӒ`¢ĻVų¹X L»(ņÖ;Ÿ]KĮȼŸHƒõāžA"Ś&Œ–ŽäK+QÕGźĪaå8˜É–1ĶÜ1Łč —¬b„A+`$FjŁß8n*6-#” $æę¹T$ą×+Ö4’lžJĆ(kbŅś¶M·»JHÜ“čŹdx'h.ķmæ2y» į­ÓFmÜč6‘ƒˆf² ńU>ünR|ST®æĻƒR°½Ā¼NM¢™OĪĮ! õ+ö:µó.r!.=D£–l¼to÷Ķd“ )]bÉ›bMF——)f³<½B€Ew«¤żėä}dnW[ūÆ£„!tA£ø¾żńˆS]l|‡ū6ҜÓŲ®°| 2ßu—…Ö¬Kłé?ĖäE¾ųÄXŸ ­„lŗ«ąØµų*qŻ;m왲Ц.Ѭ½kģmųżü-£/Ö#Ęϯ阢c }X ūĀ$0véū`ޘ»QF (\‰_ŻIßršŲ»č0ēU rÖsėaqnĻÓē™­e(æViVéöųD„™ŸoŠõr²šżxčtAdKóŒąfņŪV¶l”«š.”ÜćXX›n%” ÜåRƒ?mqÖå ōG.>’EęØÅ‡nlū üĀģµō„8D&ūƒŅ}ćL¦.µŠ7²ķõŅ©f<ß”£„3k“Æ4ą5ø×€l.RÅżŠĄ>!†üŻ„ž…M®Ć;ij³—gSŁ0B«”73°–;"%~ SŚ•CĪ:É.åćŗ f՚cõø‰Œš‰Ÿˆ¹mN Ö[Ā·’‚.ĄT×\ó 9u4_$Ƀ–…n9³Ń’C!Ķ'­M7)†L5ųŽūH…GĢ) ę4!Ė ˜~~ŽžĆ@šz?žćŠ#ِü“sČ&£ˆ5ė$”¾cUÖl퇀[Ätӛ.„’’Ł…¢’I`%nAļ’ }–vŃŗ%2Ä\STŹÓæ‘)-ĖZ"ĪĘś“{SŃĘ}¾,‡sd‹‚3ā.”pč³ĆH¾i”›ō¼É ‘jDą(žrĘķB©Œ%äS$p”ŖźMJ¢‰9él¼R5šäS<+]fjUāė¶‚ˆņ5NäīS vWĘ"T øƒDuf#¶Ü•8Ę'Õįa„ż'ų|¤?{wqQKŖä¢cć@ŲŁĢĄnp_‰{ÕńMpA4ęG_vÆ­Š‡˜Ošüw^žr›¶6–:Ž“«b@ešĮH1X³@fü&øĶ“C•„9wÉż[%{w‡Õ‰R‚:Ouø÷¶ƒ‹Zl–nV,AĢÓŚž÷"AZU¾/«Ó|»ļc”¦PUņkUŖ-Żˆb5‚óŲZ_ĮV*¼Š¤®ÜŽ2O»}4ÜĮ'€|öD#K™,Ą@•Č7Ķ¼Žźųģo!™Ņ ŗänIÉßJõø‚2ĢH8cžćŪ P€ME]Ŗį ēN9#uĀrE±«Uńx@՟ ²"h€Æ.TÄ%¼,ĮõĒšééW{Š%Tģ×®v± 1¹kXį,M®ŁŽ€%CĀ0sUŒ`Ók£pč}<ʹ5±qķĖę§%…»īXÜe[KisšzLX†›ļ—“ŠU‰HVß̾ ”c`p¹6D$$6īļ¼ü޽²įM„šé¼äčwŲF¶>™JļH¢| Ņ24k@^G „1`Šś„öŸo}#łøzg–©¦¶p£—bļ‹©™4l?J‹§}F„œ4’óómŗF6«‹‚šŲ£Ž™„»ŗü6¶±ædųäĶzBŪāÕ7t)’_4/‘įR,× ģĄ–mńl’<æ„JŻ‚ķńh,C’Oøe–€2V§¹”®Źaœ±š¦g 1<~²i²bųØŠ”ņ•ba ŅS¼YŠ—uq*‡7æiƒ\1ģC†­ŽvlHšƒ)„Ā9o<ŃäØÕĘC½”ŖS˜IF;a‚ ž8š%VŒ§Q`Ä>¢žįÄg{péJ!į.]ž&ßdĄŸõyw܇ĶÆāµ"č”Ńķ|„zö”Ķ`žĒ™¶XGücŃötC£1OyĶŪ$Ük°Ż’°ˆ„¹IėZ5·Ģ•o‰‹Œ²­å1 ļŽ®3“C¹‡}‰×beŚ ļS;(2$½1µŠó`Fζ£Ūß2ŻHŹUĄÅžOēeJžnZb“8‹žQU) ©ņ¦MāĪ)Ū…‡äg™Ķµ‰Ē+°ZL3cSžņ¾ēe[Iüšs¾lžAZf~i¹Y« P³·Ä74Łõyāš²šz™ : 1ćĘ 5ĆÆ-‰é•ėŌ°d“eié¹ ²/Œø{ėz@šĄ%æG$ö”©é'Ųģ«­ēŚĄŖÕģ{DÓ6bWuƒ qEéøóe¦V_Õ6?ŠĶˆ§?4±" SÕ I?éµ£x˜Ūżb–@f›Üų³ų{)°23GśŖZńǐ7盓ą“7½9nÅ'ŒŌ—œ^³Ty˜˜:„J‚³¼š›oŁŚņ‚„Ōx¬Õ£.ÆÕć0ÓŠņĀUjńļTšOR‚…ŗ·k F¼*ež¤ ­h_Ģ`m…Ėݱó–K’A×oæ ŚÖ`Hæ?¼g¢³¢KPĻG%V Ń÷ǜ‚ĻtžjŒšF­pr#äV/ L÷§fĮé4jĒaRŲķ%SØŃą˜RsU§ļį8ØX„gÄYFѐõZ–Ķ;Rܵ·eŻZ­X–ė`ģ%m=`d„„üóvīxDR:=‚=āL]ļŠßtA *µ~é¾ T)ă7Ć6袣hė•w~µc6‡³Ķ)>ې{ŖtģĀ7ÓĻĀąŌ„¹’ę©Œ Éė@1Kd8k°ż`6ĖķSÄfä‘T5³^xz”1Ōb¾śV–Ū’ƒYįn®°Ÿµą¢D%Ģ­>iÖ§Ģé`£Vń–×ÉE\bBĀ MÜ56<ŁO‘ Yb}ü©EuF]–+Š?s N|‹mŲŁŌ—«Œwm *nWÕ@é! ¶Šģž$D‚Kß-ȝ^råņ§$TATAoĖMŗ{xŃeėeF±÷:śBSł®¦>ė·ŲHmDź'6ClüŠ‹”,Mˆ•ZīiĆčČįˆņIŸRpų­™%öM]Ų.:©ˆßæÉ†œį_’°~‚ö“ėŠ>f'k:Ś7vtčŌģL0ƽ~Ó=j½ģD•×OźłĮ\?O– §U8®ŪūŽų<–/ī²1te™‡S“±Īćµ*ø¤5ń4ŽŹBĮ< ŒjDʼ“uÄHÖĪ/y²AL{ō££üŒŁ4—Ł[ÆąlƇČāÓĀćÓõ/xŒ…Ę ņ¹cÓ 9†1d,Ŗ2†*=&Պ):F¶oˆ¹ÄlœwA.‡,žLOŅmI3ó>J†³‚ų»Ś."¤Z3¾¦Œ_ĆDX“FŠś_‚tšŅOŅŻĀ @I{“ŠŒuOŠsÖKöŒ³qĘśĀ±²āwœ4ξEg«Ł(ä>3­i©B}! ū Ö>ePóé īŌėÄķ\·ń|š„.)*ŽĶč©Q«dhNkn"įŹP ŠLH|Ņx›īĻW†{?6ø4JŽ0Š]źYj[ ø9ē$Ę$7·oöꬌyžŅ׏K^ķ¹l9<ūŽsėćó«öĆēŹŸ,i!«dŖÖ¹t£e'ńŖq×Qś÷¦Š—½UVp,óW–˜ŹCī{'£y‘»wĖrŹł±f& ŠŸ©Rx Ä#gØÉ¹27„“MJóøÅč’®õ†Šč/ÆBļS(•|hØ@e‰‡šŒ‹{Į"ź¦ §'!ŹDŻ£¢AžxEÜ×£tkół}…x“„YĶŖh=F!Ē—„kÅ|ėO|¢ÓOOU4ķ8ę’gRS<÷œõĪ]ū…K5r~±'1 ļĀįz%"5Õ¢v&a*gåĒōW*xɟÜ!uĈA'·č6—łžĻĆA^p£ó¬ĶfE—ŽÆxį1‹l0Ō~šĪøVČæo!{µ TŒ÷ø¦ó‘ń«°=ø*61KDŌ¦ł[P@ŪׇµCt{Ē0’Ģc©l®“øe3hFA€šØBķH©šfqš@ģ›4XL¬L¶ÄÜdrojʄ†:\©}āó#*öØö’k”Öø_kh±°·`LĮ 7G%Ė{¦:œŗ2²ÄČwŃTŲ`7•Kś¤”lēxåü1Å*ö=q+†ÅŗŚĮm¦mRŗań‚$“Ņ7¤ÄtāTĶ–Ü%Ąß ·~g?džA™k¾eō­q*bün(kÆCKś¬®Ygœ‚‘Łæ ÓØ†Õ”s%©ńĀŌÄ|ośģö[Ųp3Ź,]Gji¾p¦H]w“ßµ³$Ķ„c2Xüęw ÷†¼ż%õ¼ŽÉnL*ļj©G„Tõį‚‚}6ćįŽ'› j$GDVQg°(•®YaųųLŠ:¬.—8—«.j«a8æę?’ ¾Ø-s&d ¾Ż[LĻņ'LÄŃĆfł ”ö|¹(įi=–¤æbqˆ>®†ģ|÷ćpŚå÷Fܟ=µ„¹¬X,}?žŖ™īv³55’h¼%'Lg€óś‘Į݁Õ×}#̰!t©sĀ‘z˜VT.Ūż£*kĻU’‰=fYʶ0Q2™O§Ä‘ÕOÓ,zyH†×•sHgŖę˜žś9 ÜåaNŠŖ*EJÕŌnL“+¾ƒĻÅ/œźp5*X2{²4[›8h8¹+ß9Q‘Ķó łĻ¦*~=gXŚ¢˜dƒY#ذŽĄŁi*YH W#“4lš2HēŌń†ŁÄ£ß·6öt}å:w@y‚  ·(¤¤ÉfŪMĄūü$į1³ŖéwøqŸ'f&ĖwlÄé Åe!ćŪØ€Ą>‚ćĶSˆ:v—B“šxęŹż‡AhƒIŸŪųʕ5ŁJļ[ø1©×Ņ¢>Ӂ ¤SP0 w»yŽ·ŗÆņF*‡zūā+Jh”NŠzįÉņĄ½ŁÜ_žDƀō.s•.T¹gW±—łXļ‹2Å%lµ|äµńjĒé$GeµŖÉöOäŸ,ƒ^! Īū8¬Ón1 ³ĄļģYBŽF|ö[å;õKJń²ŁĆżąĒœ” łńfs9©„žÄšļ]Ö¾ö¹Śüf Ā'>ĆnÆ·¬Ē\ŻŗfJ0GÖ¶r·üGp–‚÷_ņŠRPżwÜTõ Ņŗ|CÖüT÷­qŽ»5w¹‹gDÖŽ¬V# łeŽdOp­ćÄPälĘoRQ„å×(ћīÜīIāfŁę-½0> ŅN+K&p+ŰłFė¢V¢_]°—Į%&Wį įQȲРCøšEtø12¼WrŒ!˜Ś7ɀdĄQņĄéœ˜4}wG/pq?™•c!¢g’*†Ō‰üyÆ /1ÆĒs³ Š—ņ—eŌķēV–ĄĢ2tŸf~D‹$ö’Ÿņ²RšOå˜3ƒ*؞{ {щ‹ Ž“†Š,Vę6Gųéü–šQs~)K¬]›ÅąØ$µLcč|ģöJŃ @iČ/ÓģŖ ‘”złøÆ¬_ó&ފĿ@ńū:ćĄ_"~)ä¹gė$=Ņ ’QhĢ™õĖUż®ŁŸß@LmĆŽÓ¦ ś5§ŠŽOŖ°ß+PŌWFƒØėkøxa>† üyīQ;į[`jÅÄW…”Χ­āÖߙ|ņūįŁ‹•-CU°‹ŌųrˆņćWšĻ*#Ż<įs:Z.3 Ā—:)›ŗ2i[DXóCYrįsÓó£Ūȕ8ōuų «Ąu€ś²ś»yk£„Ż0J“’CĄqškl ^ “x3F9–źŗ2œ˜«1ānQUwhUAUg˜I=Ś9& ¢ŚčģJHA’6n9ęĢn>įŽąHœA ¹s~i„#SāŠęÄd\„ėģī/ó8CżKķ×Ų8DTÉ,ŽŌ¬WžĪqkˆ¶Ł …ĘÕE€µSĆl®˜ üäћxžŅ;}}Ęwõ\Œ†cä“ēĀ×åėå—4X©™eó¤Ÿl¬b'ße1iażš;Pż.:Ć1śWĀŸqTJ5Ā손63īµ ‚"˜'ćՈ3 3ėæüņ ų×;Ø=5Źžæ¾§Ÿäė3ńøj5e~Ć1ū·(éi8+@r@’šüĄ,łgIjqNż)L~«˜YU¹ūūˆĮē¾ė`ėi×I †ˆvÄqAŗć½HqÓäp“‚-iTĘH „`ęhAƒākŃ™ĮAčB1“E§öy[Öf0Y)ĄZ“»Ÿ'ś°>:t¾²k¦/ĖK˩ĨĻbIŃ0-žģ }X£_ąŽ-ˆ97jx+cŅĒĀZ_2x;Æźį—{l ‘¶4Z*OüņŻ^ń×pQöjł\"ü ē„€L Ā%Å£”ÄŪ]kWčõ?—&H`€°Ų‘‰|Óe]RK²ß^•jžv±5J<³ęä›j’žźęē’åŌØ–z2`ū[pÜ(ģuk ¼|Wé®/&”üT»®؉®ī6»ņ:°OŠ X#O`PČ} `dļ~Φ«nTUœā(BUe˜'śŻ®q¬(>Ļ|P I Ķ×OĖ8}ł3nåŚk)8fķƒ*ÕpĶ­ą@›ęˆĀ¼£Cvģ]L’°b Ā ‚Œg£[ŌCų}ßį&!zö $%('ą“ƒ© Bl,’:³¶ß™qltł.ā…“ŗõõ±Åą”)]śuĢŠĶ#Š Ż—{¢a€!’ó3Ŗŗq¦Ÿi¦uóĶ’uB”k× >Ź#Ÿj/£5³Nb¤EēÉd F±šd­ą2Gc°g$[ŖÕ‘ ż-Ģ0Χenž¹h·)Š*'qƒw„@ mdÆķQ6t[µZ–šΆn¼śŠ:LH‹‘ÕˉSųz›Žgć2nʘ»‰:Į›ōp™u}µ•Ō›é\²XyŲ€ÓļFĀyćų­8‡ÄE;m¤Å!±$…¤X eTÆUśJ ļžy™I˜9yŌõMa¢¤ ż‚fŠ.)8ÉX 2UåŁ [0#@•?Œ…ŁłĻwōĮmn!"ķ#4)×QŌßٳą c'čFŗ[„ eiœÅø½6L{æ1„%䳒Qé¹ļ…ķ‡TŽŗ“ījĶ uEšńķļ ¾łB°V1£QXąt‰° xŽōŒ±¶¢+~«7{q^5®ŁctŁÓ޾¾å>x%d­}†KĶžģI+˜Ę{)¶é鑌yüźņӐzķrݟ«**lw¶–Æņb'Lń/6¶œMi]y ŽˆŻI©¹^~%\%։Ō-Ą®ī/Zz 9ˆL†%ĖPpŚyüōēş‚KĶŹ†ć^ń …Ÿ…)yŗĮIrCÕĢ“¼5ćR>w©Zµæ‹ŽQéaŹRéJįI‘Õmńa¤TŌL(0Ź@¬›!ņ(TQ %µś­n»TT\(”E ÆōÖ ŖÓ6Evē?6%PJ Ɋž…u¤žņĖYæ!gŻö1•…‡0በ£øĆ®yU\ SĀ‘:R';±„‹˜tB-“‹ńģ€b?-un}4cĪeUiØ 6 iŌ¦U£”4JŚnA(ė⓳’\ Š2»t°É°HΦ¼F²ųeFā¹ļ]3 BCdüm‰Ō`ĢĪĒ„2 ć™ŪÓkažĶVvż\}"P#Gf3Ī[ ̇šI၅=!?²•×½C™cf?ź»±}yäl c “œ†Ąc%ėƍ°3a×5&#šżń–.L“¾ø„°ł—²P™[ZIΰuÕx§T¾€Öū’0|•ßōĪ8¼»ÅKøśR°a‰ nV–M“3’«OŹeRHzä ŽŽvŽ8t#[dʙ~hx¶+ ‡żĘOldé“4h—ŖĆłļņŠóDBK„Ą^„…}Ŗu‘3}Õ×_x@_¢™ ‹8…NhQØkPĻČņ×b A0ī†ą™Q“¦Y°l‡ ėÄęĄ!M›_Ÿ”ˆnī ¢¶™IZ˃±`-łgf:±ÜŃh—[»®?G嘬ęqĢYҶq6­wŠ«ÆŽ‹ī8•ŹÄøqį{揔éč*ģGČńšt§,0˜÷]ķ‹ą÷Čæ…5‡Ā¢źę³ŅīßĖsčįŃŅ™üȀqüi3Ż{ōƒwBS®MÉ ŲT…LŻWŖź†z‰äž0•+²•1Ož>Ē~ŸO 1iĖ7»$µÆ¶6q‹•%o’øYEŲeß«zŚįz›±rß’āµź7˜)”‚ģMĒKėŃźJٌ”.°˜ŲVGŸeՂŸŃ™š|ó:įś endstream endobj 79 0 obj << /Type /FontDescriptor /FontName /YBWWFX+NimbusMonL-Regu /Flags 4 /FontBBox [-12 -237 650 811] /Ascent 625 /CapHeight 557 /Descent -147 /ItalicAngle 0 /StemV 41 /XHeight 426 /CharSet (/A/C/D/E/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/W/X/Y/a/ampersand/asterisk/at/b/bracketleft/bracketright/c/colon/comma/d/dollar/e/eight/equal/f/five/four/g/greater/h/hyphen/i/j/k/l/less/m/n/o/one/p/parenleft/parenright/percent/period/plus/q/question/quotedbl/quoteright/r/s/seven/six/slash/t/three/tilde/two/u/v/w/x/y/z/zero) /FontFile 78 0 R >> endobj 80 0 obj << /Length1 1630 /Length2 7396 /Length3 0 /Length 8216 /Filter /FlateDecode >> stream xŚ­XeX”ķ¶éRŗc蒐’’fbf`¤„»¤’’Fŗe(é!i‘ į ßŁ{Ÿė;ū×9ūĒĢõ>ė^ė^qÆ÷łńr²źź (ŚĀlĄŖ0(R@DPX  q±qG<…AµžķŻulœ!€[@œ“󱈄Ą Ź@$X` ¶(ƒAQQ€ˆ””!'ą1 īå±w@x Ÿóņóß’—å· ĄĘėČm$bpŻ>x€ap0yKńŌƒH0Ąā <ÖŃ5Q×~ąy¢mx†‚Ż€Ī]÷ŪV@- E€yv07€ó_µ…ün !xĖ„ˆ8¹ {‚ĄšßŠ}ģęA nŸĄŽ EŽĪ @  gwŪßÜŚķ` ‚»Įn=\n±[2]‰¹AąHĄmV]eÕæźD:‘æs# ·0fwėi ¹’névKs‹"(€{"ē²l!ø3Šė6÷-Ü ņ§ wj’Æ īÜĄö@7[g0qKsĖż{:’źš?ŗĀįĪ^¢a¼žY‰;Ū ŠˆŽę!osŪC „Bæ—Ejˆ’e·u‡’ó»żĻļį½-h ƒ:{lĮv„BŚ0ämJĻ’MeĮ’œČ’‰’#’Gäż’‰ūwžĒKü’}Ÿ’N­źīģ¬ t¹]€æ.Ąķ-h~ß3Ī@7Ąļ»ĘÕüæĀ€.gÆųwGcš_Åž7ßßau$šv(ŠPū[aDD…’2CŖO°­. rŲogöĒnµ»9C ą[m’Œõ6HXųo˜äż-‚ų_jū÷ņoåśS¼ńSS ]5žwĆžńԽݤ ųļ4ĘOa¶’<üęQR‚y|$D¢b’IÉ€‡""~’&ć‘Ÿ‘nO€™° °°ąö’æ,žF£ĮloŽ>µ½]¶~Ć w7·[’¼’·M’ćügķĮ`O0ˆpn’ qLĖLG¾§ÉķV6ėīĮź…×¼Ķ؄u¼L‹X–*³¾Ŗ ¬•¾žą5½ ’µ®Į·1ŠIķĢŻ‘ ŽĻcōcēķŹ'[äj‘äß²,&Iß1Žń9˜Ņś‚m*!l“±2¬÷Ģ²č —i“EĢ ’ąœ7€Ż#?€’ć ~×ōŗ&žŖ•“ƒü}ĮöWņÖłw/źc_ĒN×:N<§ Ę?e›õŅĖŚķ{-čēŅCņŊŒ^0i9–ąĪ«¦æ$ˁIŸb½¶bDd~ƒ#-gśøŽĖœ^d©~.µ(Ŗ0/€eFµžw“»Nųh„­ū¾Q’吻0Ć5–:®¤‘E•A16§€‘£J4 Å”ų)4žµµĒnȘ{cµ<‘īʀo%“TęūttO>ķā»Ļ×:M²żėų±ŠŅ2W5Ļŗ%VŽė˜ėńNš|†«»?ļ<]n£™Ņóq°gceŌ¼y7>›\ņJäšdxóÄ1…ō/(Ų«kN‰ę™¾[­|4qx&ʈaQu¹ŅŁÓæ9Œ®˜ŠÅŠyč4Į8õįåyéó>vcg‚|ķÅé3Ēɚ”źhƒlžSÕzW°JÉJk·  ¼AĆk¶«gŒ@äI`½3”“d—AåQTF…Mk=N³7b—£“%ĖŗĀĢ£1PjüAir„ų~ĮMgH¤·HPK>~¤…ŹĘź-õæšm ŪŒźŠ“Œ ( ¦ź{5Š9k}¹+ĶĄ"fńĶ+‹ˆøœ/ 0•źżęˆŅˆ«›d7@ŅR^~=õ±SĄ„Ls”åµM.æ’‰a7¾ÕŠXT¢Ó?.'ŃöQū¦‡šSĻźž–ŗöyTrӖźqēWxė•YpQžĪGGō<¼ø½[ėŻhg”zq4AXŖ÷9¹­ņB)9%żÜ+a%ł¹’‘wĶp2©:S±S %ź¤žfŠŚųqh$7=.ÕY–Küa=źe3Æ1)ʏŒŅ°øŅ*I@-Æ‚š†’GŪG]±a+̟̼ąĪ²X;W#/'E»-yÆ ō]ƤāN1=ßßżņ˲ż x&µó’» ‚żÄ›­G–Rnø6®ÓĢĢĘ¢Ą¹³B°b#³įH[śĮīųĀŠ §Ł•בvY£Ų,·„ģšµ®r9łzÄĶĮ^ Mv)yZžėmŃ` æĪ?ĘażłƒŚŌP’–!8ńØ0±>›DÖt½¦¾s»ūGt„d{µš`™@їŹSQ}ƒ ³iś;QātSģ°^ÄØk‘¤æč—8ķÓL­¬ńĆĖü篔Hę-ŃĖźó½ąqŻ’ ĄŸ8"Y"0®¼[ $(|vĻÆŚüQ‰ yĮRē}YUŲtS9ŃQ\{C‘^”ģY,ŌT&ķĒā‹sīupKF÷ #t7dČ:'lōh`rV+-錋āäŹMĄˆ‘Ų÷hüņ,éǧ·1…,4u»wÜJЬd#Ęé/f„?5Ōē0Ųū’Ź*ÕOšĒ.ŪųÄ7ۜiE5—ŌhhC–S”?æōxv™0õ_„Ša›”ōĪg½łśė“Ģb­“O³ž¬n&šķŠhy¢’”ģ‡+Fūu(ØqĢDs£«Åś*öŠĖæœIŠŚÕļ²+ßąG™·L!SQP0oõ–G>kƒ}ģQˆ«ČžŃLI7Ń{S/śyƒ­Š@ž° ܞņ0’g˜¢9 4žŽ)źfŹŗ¾ śńƒ¶sCO¬ńi”¼qEB4=”“JO%Q3 ¶7Č=kŗT.iT!-PA:NfĢ}ĘK–"PU€ÉŻÆõt:\éśJę1»że0ŽŚ¤ĀŗÅ ŁłīLr.löį[üJ³§5²;­‚ ²]śÕø»0ž‡’”oVW“xz³ĢŠ,ł (ŃļɛHWW ¼oۯуü‹}.Ś»†R;xoń6ø1¤ž¾æā„ł° Įg zÆ“½”³ŁĀülšZtA §ÕŠtˆi)¢ģ藐’`ŗ•C€]ž z%š¦N`ģńīū‘†ž™oź•„g) „ŹIÄük€ž!–¹ūūL5± ‹ä›½÷;/ISE‚F)3"{©¬ÄzYx,d&+šĶśĻé%ØŁ£ŁwJ3ł¹(Fx[ł„õżZ±e ¬ńŪ½š©¬:4uāŽRg„Aœ$ž°Ų%JDM—DEX~(~E€?cE ’­ČĶuäRĪž{ĪpVČ问_[ R]ÕOõ“’ä.µ~\s³ė/»ŽÅ|ńqAĖC'Yl’ü 8ē[ĶśžI“%ȊTĻVT °©ū“¼ß ŠKU›Žż8óó ü˜©óµgń£õå聝tS‚aœ,bր ĶŖ¶uŸ:˜Įżs³šg|„öüŚŖč^¼ŚŖµĪ ÷Ö®T|&®"ÖžüŠg…Į³īøÄ7yļŃEńķos•J„k擰ł¬0f7? ʱć˜%)ėEK(Ņ)µ”|§zÉ:óˆf’E5ģN­ ōżįīcŌ•ä55k‰9¼¶Ͼ0ļźÆc̲āÓoB‡ĀĢļ‡śR‹p»r­†"ŗķd"©sĆJ“¼)jµ5ž.µ 3˜a= (z{rw"›ēńU@6ŃjÅ^0ą»ßĄ«ē­“ļwffßl.ˆ"©°×¹L7уąW~¶G²Q*Ł_¾ŃÓ÷ģį'ć#‰ISÆŖ}_°_tŹLńAFį­Ņ­¶ōęÓ1‡p‹µvWƚpTµ’ńlčü°Ł#5]µ|żčF=ѹD²Aż4W¶a@ß*żÅŖQ©‹ ¹|ģĖŌ‹«8øyLż÷¾ŸL6ę]NiOuøN(6ŻĻįŚŃßōāż¤Ø4bm¬›„Ūm©n„œĀ”>Ș&ŸŸ_ßė7O?u™8Oų†Įt:Ģiβ)Žm¢C£O-Ė’°śIēk¤<(tSõƅVĶÆÉćt¹ŗ —žĪöb޵ū«kÕ8oŽŹŲ¢&UģŽ‹š¦5?(.ĻS-ÜBŅź¦‘ėʘŖ¢s¬óIĢÕeœUĒh“oZ7/ˆ“R G”#B”mpӟ7P„s}uācŒü¹‡]dRg@iɑ䜌£é/ÓåŽSŠB—(Łó¹ł<%„}PŖƒ5öėé’­$‘ģ»åžqˆ/æ—dqČ' “Öį{ńå3ĄJ‰Š‡óĀ5öŃš;ć¹G9÷U°( Ų”tL ÓSżZ»V?ŠUCB’&śĒ½‹ķÜżra’]ó)ˆ½I?¼šoN³ƹQ†ˆōč©—œādĒ=BŖ½ Œu.z? ļ°b_’{$ˆAvĒDȈ›&·¼ļ~ž×ĆD+r2ƒ~ņ‚øŹ¬”+6³KNŻXšūO Ād^y°­0Ńk &z?¬y^f¹“wĮAąŃꦯ`ū[Ėc ą„ qš\zF“”'ÜR3_®¦Īö’į`O¢­3]ˆ¬ń”€Ä7¬ ½BķėÄTšĻ\„wŗéĢę)AbŹZ.ŚĻ敪)׌G^õ“ÖsÅģėŹé.›šÓå0cūĒ/2Pݜž×œØ5™HēIzī”ö®Å^ŽŹhŠe”µ¦µčKqaŒÆē¢5›ėœ(’ˆ ŹK«P=ŗ9mł”äQģkN¾NÓc~“&żmŒƒ…„+=ū“å ,W\æˆ¤Čŗo:ĄēćĘ-7Łö8ϼq»W/jwŖąZūĶžÉIųt$Õė¤p#P|ܘQņˉӸ5³Z&²ZĒN=ŒwN"čŹUgŁ“#ŸMFzyš?ą2„aT(¼żŠońš=k88Ķ6¬ ܋¶; "WĀyG/Eh608q‘½(óLĮšÉ1Ė#ńHÄ|S¶‹Ō·Ź–å±É37¶ĪŽž®Å—Œp2÷VhtC&P“|¶P¬"§»ßjóHxZ†x·1EĻæ‹öI??XY”°Š^Æk5X’’,Ÿī”p. %ą, |›¤™ō6psóĀUÖs1ž}v”Ī8/—šR«‰šŌėį”ņ]” ś#  h’¼‘1}Ļ`¹…õkÕØBQōtRNļ%«ģ£®Fāģ·i˜xü[*ó6²'VTMĻū[¹ćŚLlėh“ŁXŠžz÷mĆ7ä ń\żęcže± ōщSęc"|HKĖø¶)yē²^’«źĒŃ;n‹ż°°üļģņRjņ m‰‘Øž3f+ł2Ox|¬Œź½Īµ«A‰+ĒŪ4ZŚM=(3ÓÖ±>Zķ‘§Kƒūīw+;Ž"ĀņÉrƒµ.ģ`Nsķ­o…+ĆEØŽ]‹kŪ‘…ƒģ›b›gc¬Oæā(oŒyļŌxI=›8ś¤É敐¼/aR8żÅ(āU°”٦^¬EdÓM›•3€ÆU‹É˜ĻP12ՈTy”/Īė»åXś¹ļ›ŪwpVō­°—x6Śü”žZ„c‹‘=žōu2{ćBųÉŌEŲŲSēe<¬J¤Žł–źp :{­„Ųn­y&B‹Šßé”q$‡U ³%ĆŻė “)żŞI}ģjöޚ$¹µ½#eÆ1ü…¹ˆd:įnb;į˜„mķZˆcę ķ+-v\u›{÷ß0Ąž0‰ĖOīĻŠō\w‘ŻWā«TŃSHŁ•B¢½>²Ėī"fYé‰ßŚ­ėŚ]75‘Ów'P€ć,…ō„‡{eĪją,’ ņø±“žYł2ĢßÄ3Ö/āEó‹šY©“vE¹Īsæi7a=lK—óŻßĪ2ÕÖķyß³K›°Ł¬±¦ķü ®G¶Ó™!:¢£y_³2÷ėN*ŒŽ;JžvßKiłą|ut”L±Ķ¤Ńќ|_ė ?A•«Ž™Uæƒn»ėœāÖvĪ}py§.NW?Ū׉\­x‚·NļƗy|$"ś©mųć®Xč±Ė;^Ռ„łŖŽHj¶)–ƒ6„Y¤łœU„äƞ¶XT"Ķc¢ Įń“nĘh¾#K;ōiĆw źŚF‡ĘŖ‡é%|¢ Ībäµ;ÜŻ³ś÷s6V–¹·ƒżē,tÜ;Ŗ1ųų_ŌßæM¶¬tˌ\30Ÿ+įTžÜd¶„J«Ŗ›ČAā£üÉGWØŗüme_ī}õäf愯ÆŲ· 6’¦8ītż™aš j™æŌ·Ō¦— Ź/īŽ.uNGŻQȐb®ŒJÖĶ<ÖkśXIźś†"³¹>ZÉćqK³Q¶y*$Ętūełt’#“ÜrŅ‚ü ŚVŒ9†bÉ2AnEʆ>ܚ#­@zX=TßķŪ¬½oēģd€¹¶„ėŖ+ ¾\—üņõÉĮ“V‡k—jp«ÕNˆæmƅkļĮ8JÅĮéŲ W­kęJłŹ¹Ū3]G¶df!įHīp‘Ƴ;ėHjmµAńfŸ³>%„Ķ‚‘˜ƒFH_ś‰ūÓŌŽfÉ AĀ~€‚r¹|(Ī&ūs¼Ö’§:»"‘ķ{ÆG˜3œ©„ vÅ«TĘAP'Šžģ‰ś*‡RO0čõįO’\Ŗ»Œć–13ƒśÜ —q,4@Cœ²#Ū@yJōąē¦aۊĻ}œ~ŖjF”tΜ?ŁžE°ķiŽ:›Ųż×fźF$jči^ר»c„r›¹“œt»Żøčm…ÖK4”vróž—]&»?ź”šø§pÉpŠ#7*¤ŹŽÆŖū+5Vńą+z™ »‡R!Æ9³§ĻBÉ…Ģ”ļ²-ЧW³W$—1Ńj]ļ·ųcĮy1ń›0-Zux*F#?˜M½'—d·ó}÷‚0¤e›aÕ)vĪ<§ŽTpY±nw±Łü°÷œ?eא•Bf’•¶S²y/Õłk`÷םIīõōmä.aÜCõ?7žL^żŌšSĬœ|hė‘·/c×1Ų eØ*Ė1I?Ww$ł„šüøµŹżNiī^Ż×SгK³ötpžę‡²6Ł#eƒ·2§ €VRŻÉÕOŻY./¹¦yŻĢģ¹śCžū©YÉ(YŚ9ĢC›ąA.<ÖŌ„Jė]°yÕ§×T`āļjŽ ēŸä:”ĄéQ@å×i|Ņ&ŌsiģØą³€é¼|Žy˜.js¹ź w§;Ó߁Ąé<¬†0m¶Ėē™Žń`ׁxr+U=¼;ų&明Å@6ߨŪ±x ĪI?kéĻ£bPxūKžā³©_#Ö2°ō4¶¦ å¶ųœ²ĶBų®.Ó&ճؽ¼ÉĮ.\R‰ÓVtÓ @­Åˆ©/Ųo #$éA­)ƒE=Ņ dń®X~Ņ®Š`-c7/0T P›Q§°qĻÅš^*0~كqøNKågĻOÓĮ—’ßµęOqŖw¾’¶ŚĘ6ā}Ž%•ųU]ŌkŗV„$”H8¶Ž _ōóńžĆ8MćDÓļw¬t©Č[<šé–ä-_ēQp—(åŃņsŽÄ·ć鄳ÓöE5“ŁĢz{2r=yw9Ay—˜u‚„O'2ąń’ću?žšUܾżV™>pźE‡ +D0}DF~/ż”A@ßĘ!ęI£©7ō×^wŚĮšŲ1 ūąņ5 µģÅX‘;ėŹ Œ†lœ/,ī“7ĀTē1t#šGé“MoV ˆF©s/fV©Ó 2m—½ŪŖ”X]@ō‚¦u¾4÷›9œÕöŚtčPóźRīģÅ·…“Šœ•x1Š‘™ōO¬Ž„[Ņ9*)Y‚r§¦ŻgłŚŪņ^ŒDåWÖs‹Nr94/”_ķ÷„+·ęöPm ,ū£auĻs“c6]Ė]KMp³Ķ:ĘéńLøŌL/¦Ļhƌµ†j£„­^Ī“QńJTžbE”×|ečķpŽ, ›°pĀ0+”ĘWijĘIK§œz§J©Ä«óK­&ƒ5˜Ī: œĀłŁ&|$.ī¾M£5/ąŻ$ȰQ"ČĮ]"=‘õ†–Žg*&`8Ćē‚g|‡\Ŗ)-ÉMė@¬,џÓqĖśļ6ß%ļU,Å`Däsa{Œ—½R,ś£?䡑°L§#8ō”šł@Ŗę=ļA‹LN&^óņlå„&‹ēŽ_éŲJ‰±®‡Ę°Ś‘”sµ%Ó=üļō9Śī‰_źM-[Ü–×m~Ä”ēŃ]Vb„ˆ•Cō]F…?šC`j£”«ƒhūG¦–u¶ŸwF›:}wōh9m×(G†gjä™k#ĆKBć¦xŠŸüŲY!b‰Uł¬ė¶@83± £7«ęFõ½Éüžém(Ā$«-•Ž=ē ¤ŠŪ;ˆ÷3Ča}+2q¼ „ģŚ2»ł5‡“č 俘Ü{”$ķ3ĄX¤•„g·OI™=·ķ¾l›|QĘ4l†ü¬a«»9ßĖō»Fø÷h·RI—:$Tצ•Ć[¶ēīnäŌQ6žŹĢ ü²Ć-õnü”’ĖŖŅ$”„”)äū ĀŹvŸĮ 7’l%©L™0ēÉ_ŹeÉĘī-ņzŽÅŅcÉÆN“~6÷²Uļ3×@·t>ĻCrŚ7¢|Īg&W¾¹–vMžŠ¾Œ™–ģcæĮÓ–&Ŗ~÷$¦&¤ĶĻĘx£bńi…ŲāéL”Yż›@”į»;WW C”twP?ćčµ]u‚éB D'Kõ«Œ< [{żźØŽ½œünv£B“¢q>ˆ)€S¾ēÕ &ļŅxŸOó2+AxfwšłB+ˆ_V%5Ōµ÷ž«–"m‹Š’!™L^ńā—żŹ#?O€³6Sńc•$BķÅXŁsoĀO&@ĻD)Š ©«s}„×Ļf!Dņ*;79ßpJH‚±üćĀ^ÓՐ|?=½h~<|(ƒ›‰^š „n:…aO5>į*ÜäaŠšĘ\.]QŃS³Š”zŠõP²sÄų”nsŽe cš®uåķ‚ČUę8åCe¹}"OŃĪĶEb©ß7Ƨ>­=fnéU#:ikx_\E+YĀ'™Ī˜ C=@×ó)›½œō­Ożˆ©J;¹÷ēNĆTekŲä~ćżö‘wĘF½øŲ)×ökÓđmĻ?ZnilļĘvė,½ošīC&™/ˆfro1„sÅÕź±OżSyƒįŲØ=¶k õ:0«źÕ~f ŪÓI]Óļ™`ĒŌBū$ÅSĀ·į³ÉwŚŃōļ€Ö‰_ū Ó'Ū#-ó-UĒrg»s.`#'ƼŲRŪomį»J}ßQ4ŠUhRÖ¶mĖb™³ū4„'$Ń;Ė Z; †‘ }Z<ż„‚ŻZOF;APĶį ­vi:tŗ£ŪCL¬“SEOŲZł–j*zą”›Zč¶ĖL“¾Ž­²šŃ¬wbwSUö”čć(`+3¤˜¹7]¢*‹#ŗ‘IˆŽv@&”£h9ĻŽN¢Ģ3_¶·¾¦Ę©ń‚ ?Šüé ˜*M¾9”Ål,;kŚN `4Æg1üSØ:„¾3V›2ČxŁō‰©¶eģ£c2—Ÿ}ŅōLUą­8_Öć8bĢ)§-Ēß&Bķ(+£p`½78ū_t÷¦Ž endstream endobj 81 0 obj << /Type /FontDescriptor /FontName /WMZJPH+NimbusMonL-ReguObli /Flags 4 /FontBBox [-61 -237 774 811] /Ascent 625 /CapHeight 557 /Descent -147 /ItalicAngle -12 /StemV 43 /XHeight 426 /CharSet (/N/a/b/c/d/e/f/g/i/j/k/l/m/n/o/p/r/s/t/u/v/y) /FontFile 80 0 R >> endobj 82 0 obj << /Length1 1626 /Length2 13668 /Length3 0 /Length 14515 /Filter /FlateDecode >> stream xŚ­vUT]ķ’-ÜŻŁø»{ąīī— lœąī‚{pwww‡!$øœĖ’Ÿī>=ĪķūŅ÷<¬1ÖW:«f}µ5¹Š:³˜…“PŹÉĢĢĪĀ&P²q0ssUsrPrāW`VZŲŽå܈ŌŌ.@S°“£¤)(ŠZ$ę;???"5@Ā äåbce ŠiŖiÓ322żSņ— ĄĢė?5ļž®6VŽš÷w ½Čč~ńævT`k ĄŅʐPVѕU’ŠI+i¤Ž@S{€Š›™½9@ĮĘčč ¤X:¹ģ’q˜;9ZŲüUš+Ė{,1W€)Ą4·ywzšA©˜  ‹ƒ«ėū;ĄĘ`åbź~ļŲ `ćhnļfń€w¹„Ó߀@.Nļļŗ÷`*N®`WsšžUERź8ĮÖ¦ąær»Ś¼«N–ļ–Nęn•ō·ī=Ģ»ljćč =Įå2,l\Aö¦^ļ¹ßƒ\lž†įęjćhõOL •©‹…=ŠÕõ=Ģ{ģæŗóĻ:’­zSČŽėoo§æ­ž ƒ ŲhoɂČĪńžÓüžŪŹĘ‘õÆY‘u“t°³żCnįśO;ŠåļŃż53ōļ L-œķ½@KDV%'š{JŻ’Že–É’Š’-’[čż’#÷_9śo—ų’÷>’kh)7{{%S‡÷ųĒŽ¼/SGĄūž(žZ4n’—‹©ƒ½×’Ėé_­µ’@+īdońÆ:Y°é{KÄ­Žiacaū‡ŠĘUŹĘh”b6·XšŚæ÷ėo¹¦£ŠÅŽĘųĪėß-0³³±ż‹NĆŚĘÜĪń/ø’”:Zü+üwŖžĻŖ-«£” Ļų?,׿ Uއ¬įzĒö„(:Yü×įÆ0āāNžfv>3'ūūŻ{ÄĻĆöłHłw öžMĮ.6žż÷ŗŁŲ’®ž?žž ’%Ģ'Gs'‹æĘFlźhń>i’%ųKmīęāņNšß—’½ź’<’=ó@ 'ŠqmŁÉ\0Ä6=+\‹—;<)©ßßĖ= *mŠ(*ØvźńOŲį’fņ\ŹŅ8-šŚęµtzŁ—cų9Ś‹kOŪ“ <Ė'žLIßW€±EÓĮĖų3ˆÕØ%ćX;Ęē|Qį;Œ›ÖĻŻIU5£’gX’éNųó?ō”īŲTw T?ó“śxœNōFĢŚĀ£cš/æ’ÜŃŽ õ\~čŪ'b̉G 4ÅóK9"O{™øÜ4˜æ~xtēAh޹ōäÖ$X-šŚ3-«¶ü³X«tXv—jŖļ®S“‚ cÄīJ$UŻj~Ļ×I;Ć“ .‘@4$d’—xŌLčżŪ† ;øCœåećf­ż ĒYYŪJiՋyĮLS&ļɕ0ę-ĢĮ2SXgęĒ­ō,b–ł3ŲuÓw) Ę £›é½z8Šf»^¬S!Iū©±cÅ ŠÖ?<=G@!Ż›īb{Ōl$:öć`bż˜N\Վ™ŽhńEįóv®sõģļu[/D¼i›õe쌟۩:7V•Ģ[oĀDo+Į,Ä‹Ås Œ§dÆRhĄoAĘ·lOŸ„I*œPTA üVÜ}>xĢ/FĪņ-°³üM}x[ø9»64…#iéy§i釤‹,}8Ņõ ą'E.e›eĢ”¼_A^nĀY]ÄCŹQ`¢RēŁłķFex’ģؓ;–NĮ­¾<ž©o+­ܰŗį{²#5NYˆuę¦?į&2~œWūčc#ĆitŠ`“•n?ū6g(ćÕ2X,˜`»p'e!I(ĖņMKÖŲÄ`ŽY3åöń®/xƒ…ÆœšÕõØĆ”ß±gRdmŃń÷Ó÷;ĆW½ø›Ä&ßģ„šļ–¼ŅH;ßX%‹†Dė³/£­B_-{FYAi•ć™%7 ·ŖM—[gĢź„ĘŪiœžøĢ«|‰BČ×M`ĶŠ==ųµóśńfqŚ=ŃsVBMčMHROĖ8=’l‰„Ej]ž¬R}lķW_g=tĶ•św“ßJš{sŽAØĆģ ¤A:9neéŹT„źs¾č?ÖC/yyūяßc„ū½Čās"³Éõ“”Vō[š5Xnŗō§R¹H/ÜjĄ…ē‡īčCĢŪš2³5b•żŗ¦ŽOéiˆ¶EJ+«fF¦>놶ˆ_gØ9®{ż[BŠŹ Só süµ€¹‹Ø7| ;Wyµ†{ݤ} ·×ÕŠØg?”ģčrq‹öŗ˜ZÅqų•AxRżüRģsČŲN‚u\œ»° Æ=a}/Ū .žÆŁ†4ŖĪyĀōŲ :6—½wDł_®t¬§{ĖĮ«ŌõŗYŗ•Ō²øP°/^ķGµkµŻu¢„pש˜—ņØFe4¦©pņŃ.4oWi½Ģų®fOŻ–€SU”5…- ®ßŹ…ķzo£»ÄÜŠWĄŻp“ԜęÖš—P|ĖkŪ „»gį‚eUWi“2L÷¦…ČčjÉõ{"~äZ²ˆ„”żŃœÅµĘµ)ģ±K¹œ" żį(t¼…°&ēõ·%čéŠi"…²…įž@ć‡KąÅlšŲb •Ņ8ņŚė@ūH¾`+ ó™éRZ;éŠóV$æĢĒĆźĘn™KŽs%?Ō5Ģųæržxī˜<,÷0C6Ž‹€‚<qĀ=-šģš9@’pCU–ÕļčR‡ōĖ€÷ŗūU.š­.SnC¬‹ć 7odøńĒčLś\+ėl–Vŗylˆóy€D|-s1}Ś¢ĄVŠåŲ“°±cŻŠŠš¦AX‰Ø÷՗ńķ¹pć`€Ā]‰¶ŁyNÜoŌH?[īQ_X„ +7§^Õ1G¶·ź Ŗ:ć;©¤©øDCŒ<ƒ]Ŗ¢ßœ&č/5©Ż«„8Ž_©Ģ˜åxįˆ>ŗnĆb—®•=3’ny“xjΟ–™WęHÅsl÷8V™šZj©pæž|+‚~į#¬ŹKż„½szJ>ģąŌvwļ#+ŪŠ“»IīE֕gøįƒE¬ø”MŅ%[;Ö•QŒ'ŗ·ŽĄ{éāę[E/’=*]jŹ®„Ū ¶‹"ü;"CI ‚4VĆ#ņ"\@Žž¼Q§ōOé nųīŠ3±9ßjz~“Ü}阞”-Go¹čŻ\’#§ĶņhŠoŌ|ŗ[CżuąčOQœ¾€Kśłc ČU jó…Ų¢˜f.tŒ[?žS¹ ŹD ‡=%u‡ĄN€Ģ@? w@­?’åZŻP: mW¢Įµ*«ī=āĘ>¼‹ō¶v¬?_ {Xę{7{ŚÄ2:ap2TÓÕAu6NäE,$±œ9« ū HżIŠjÅŃń8ÆģšSQ®”lń”·¢ź/ÄiyŽŸĢ‘"%+ō=-Ģś8@O&I÷ĮÜDVqŅiŸ» .ÄŁØåµÓƓ’č¼i—^k˜‚^ļ6 ©„ĪcĄMź Ķļ‚»C<w”R ǽ1ū×å<%Ÿ”b’ŅÉĢo:"^ŠŌԟ\“ń%l—ÓžåĪ7•Ys5ĀŽöKé\eźk.¾\Y‹ŖƒdŸī {¤{„²œrFÆļrVo”jĶē„;@}żz)Q$3Ż™¼sÕ_‡…˜[ōÄ;žģgŹ pęČZ ¾q4ģOį!ßPr§æĄ7ŲÖŪOa‰’uį{Ónj³jœŖCį2%w_“į”É»•Œh+OÆÄ ²’L{|“ļó"¶ńiN}śh ‡‡jŽød”?„wņƟsCt®"Ŋ*Q=7ÓøEpFWʲPÅšdż`E<”Ņgu:ćµ%]^SēÄēyaAIÜ~E]a"¢9éBwq$žj”a.7™/šÜŻŖ|gµµéi3®FpF9°,,Ÿ‡2­įWŠ=e¬ķVīÕWöį£Ļ¾#@6µ—Ę^æÉŅaĻĮ“°ób³go’4ö>±˜ōį÷žČĄķŁż¶bźøšņ,‘5}żį'|¤fųĘg)–~$£Uń§dęŗ1b­—;öoŽŪtŗuWQūJłö/É7gG8ÆkYØøF^Ÿ˜ ÄØ*(næ9%·ó#e¹nŸgzėy%ĘbPg 6j:³ z"%ĆȮډsō›tž”ęŸå £ōšLõģÆ¶äž°ÕĻ{æGH5‰˜ncG6@ĀMSÉ(ģćŽ=i=8e[ˆm]•¾uĖ”s=«j ƈ·į]^0×K˜—Ę”Éu"3ń±ĖūB«7ŗŠ”^Ē;Žo߂>}s:SµÓ@3ZXLV’}"ü'Jż=­y)؜'ō7õrśÜėčOV':LьbQ2ų]CR©-fż`–Õq•jNÉų¹x.3֖łn¼tdPń9ōÕÄ”…¢J\ ČÉt!īŌļęWYÅŁ !dr} /n„o,lŽ€f±_ž»­£(»ćQi‰–čĄįs«Å:yœ“ŠŒ‰Ķ_ŃĆ _'¬č<Ģ}&‡)ŁLŲĄŹB]Ø©Ša*8ƒ9zæ&–åĢņĄņiŽ2A®“‡ė6{ź*Ž|±)>śĻ“ŹJš—õ‹"“čī±ģ@‡lŹ„¶‡gj“„™|²"ś®Ń`$µŻW ¶6Ł(ž¦„¹•,g’”¼EY9Ā×hūh‹(0‰…zžjłŽhvš{lŒ& ”ŚEz›#U!F‰Ķˆ˜µŁźy!Ԍzõqąø]ŚCÅPĒ Y-š»ĄL LJÆH1¶øå}1+ŽT~·]Ńo$~ »ū@ćp®°‘KIq¼~¦×bDżģz“FŽĀ¶ļ»Ź2*ˆzŸ½f¢g&`§TjG^ī®å°TØW‚Yå1Īū}\BzĮ9ŠoĶęh脱°ĶW‘įĮæņ"ł-GĘ"x­©8‡Q’ɓk€‘ž’žEČ-4¢m·¾•°WLbźj;“Xeī-«”ė¹ąPź8Ī\/‘ÄMĘ’^„bœ¶ļK'ŻHöw–’øäMzĢį%KõXQݓؒ–„”ĶLøm/•6€ZĒ$$±°S7š…”§"8gKFĖĢ'3^–<‹Æ¢ZĆłÅÖĻę¾ ŠņŃ4Ŗ„Rį ‚w©08GŅ>Ś Rp7q‰f,#’Ok5ć<ńgR\p’f«>:CyŽ@聗)䮞z<č^危W^˜}’ 7§ŁTu9\qu—m³#Yā<ė‘-†OH(}Śß2Ų)]­yyÅ{ńé™^å`uꇲ(ŽŠĻ_ńZ"ÄhŻŠńSøŠĀGą ĪMGŸ8ŌÕņlŗ?‘\Œ‰XŸ‚«&Åžń="ꞱO‹‹Ō+ķO9æ¢Å[ōÉX[(s6b5dÜzüū¾Iźff5Ł© ›ļY~‚>„»SĘXʰĪrn¦=ÕG!=ī$„ =e™x3€Ż³,Ū¬[‘6é…Ć-ķ'õ>rŪ•Qk§K#åīżXś Ļ“–Ķ”śąÖ„+zjśV6b'́W×|m»ŚÖ3ž±ÄåNƻɅƭ€Ö±ɐA%£÷M&™Æ;r]„§Ņ+£[޶S—ą•Nńś˜½ó~oE札ÆJF±c€S[±ūG¾ūkö"żßP ų£mt¬ģr”¬ČÓ³“DR„œą%ķ÷4 q-Æ FcēDüŅ# Rę !\H.‚° Bšņ ±ŖčÉām ĪÓ•×óa–¬9lü%.ėV+X£ł™Ü·ł#č„ŃwlSĖsVn^¦}§ń%Ž!ønŖ ’ue‘ņ'>xVŽžĒXĒaĄĮFõ Jume'µ>Oé=6ģjQłÜaßO³62Ģ¢ˆŁAŸrĒĒ^¢„ķŗč5bŹłµ¤ß²)CžWęė½#•Bįµ~HčšÕ€°eߜ±«żAļ‹P.ńĻčdE®­<³CÅoˆ©ßėź#8ĆG  ³C1f½ŖC/.ÕąƒĶöŁ—d,Y °śż‘cæœFµĻ‹kūĢšoŅĮ 5UÓ²·|q™Ū‘l—óc½§žk½;ž%³;pØ*čµ^P¦äbørē™Q[Ź {,-ŗ«RµiJuЦr”ø(ćŽÕ2 B>( ˆd•ŪU³/āä°^W©¼!‹°„÷N‚܉ė“ē5 ‹£łśtpˆ ¬k ±Ē Ąålænc€¬T5ŹTŽ( Ų~G?j¾ÉÉg`†8UĪ7k…s6ž¦ŲS»~ŽŽ!F³ĢŖ‡²ŲPmM pÜĶ^< £Hq˜Œ¬8ąjTĄJ+šwęŪ4·q,³ īŽĒ@‰Ņ€Ų|YFāķü ļ†JVŸļ#ˆFöÜąš|ŚÖ/@u¼oY *æxĖļ?Ģ–Żd`ܿ˘~B"CűPN}ŽŻ!&&w4Ź\VoĘ’|†’ÓdŻ„ś«j,½ ‡å£šž0+ 5®aų!źHܛXČ6^¾eݽ‚A`}¦°‘®±ģ³ųķ…ķ÷gXĪ‚–‹īCžCįØ'.öņ1ž¶×ĢŹØÆ?ŚyyÓĆ%” OoŻ ń ”g|k…3ķtöŲŗü3D"œ «®„_ƒ7‰ÜYŲŽĢ„ė Ś“A>PAŽūßd>Ö8Įd“L±ÉŲvŽ›½Ä/•`Wɧ}8B…‹cÆ;§;]:ņ…nCUÆÕ"lē& HLmÜĮJĘød,ż[ĶN™NléüļS=.בŪL‰cūŖ:æĶé7ć·kp¢Ķ:н£éCłZ82Ļ×?,pļĶ“l!ģ|’Ć˜ŗ…£čŽ`ʄJ3pŸ,ŗÄ IŚ&E“‹Õn¢ūɄĢŃk£ž¶:‘ĒKFMĶ ˆ‚:3ē‰ņXś±ĆŻeR8ž”+iȚ֊Gāf$°łłšÄ$sHž"›Ņ„•Š!ÉānĄ‘uł]­n1+żēNoU5Ĭrah;r U{¶#ń×5óĖ.h2#ŕ_M\Õ·$žŸp¾X9¢·ÆāĒsš>H]¦ŠŖŃ<ŠfRÖh»Y65lūÆ9bEŽ0KæńS2J^|āįb‹$™©0BBiÕT«¾7¤×ŠLŲņ䆳-#[S?ö•¼z“«āx‰ęCDzėÉ5ZĘł®.ń|”‰"+@RąĘū=ļś–ŅĖu‚÷ZJżŁÅ'Įųmį‰.}§Dā1¤ lĘA—ö¬¬.«eVrF-z’.ixQ(sųN7˜žčŠģŪ5µD8‹¶BdĻ0įķ@ŽYņT“üYŖ²@¤ī3€ßb™`°bķĪ”M§Dčm²čF:N¤I;#³°’BŹńÆXā7‡Õ³W{u#•phH{&®éČ]HĖKšIv¬pśmł6ž¦Ēė ««LԈuŽ'8ėøs²'Čį 8Ń#³cä+­VźVk^ü™77ļ`-’Év@8ŅĢŹ‰yRA­«œ’5“±šŚfÕĢK¶6"‚ė$.±bkŗŠ¶ŃAĢ£-:¶Ö³[VŌ̰¹EVć20¦LD©ąÕ/T{nŁŪ&R ė`į\ž6&ĻBĒŃ@¬ś‰ 5(½~‚cP¾ł ģrŠœ÷‰t˧Į.§«ė «Jfd…ńāžS]§Œ‹§ŗ‰Ä‘:Y®V°b€†žČpå·*‹”M»×¶Dū½¼ŒŃżµ <īŪ"‚‚‹ņŁŅĒT?ž™9©sōhĄ¹¾rœKŪB›•{CĐ£Ļž‚ا¼½2³Ć(h­„ĒĘĪHGä Ż‡āK× ‘üŃB·eč\?ĪA»Ž!t~N’ĮEƓŃcĢ(4„ŪėN;¹Ÿrs™l-‰öĆbY3ķ<*MÕtĢĒę5ŸNņ|ž½†5xܧœµ&%³1aŽÖYG2鿘6÷2H“"bś™‰ŠLZtv`g[+ÅŁåڐ.XgŠč!ž4Ņqį5£•2ŽĪ)ÕĆČ„Ŗ}!WYżļ#4" ­NMČŸo̼Œmé )UļIN†ƒ؃öa]”Ԑõb–‹Ņt“]ć‡b4sWĢ‹æßŻ›¢„•ˆéā™Č„58>(“'–tņįf”Šü`ņ€6¼É£õŁļÅõiFč_Q ę5ƀóÓYsȧ~Ņ$“Łkā‰Ō™0הž šĪ“掹ŖŃC×8ē÷¤ļ'ÜĘ7xh6aķ38j£ +{G%GÖ\žHŃJŠbčAKś ŹŪ)½Öh;LUuW ±p«‹M@–¦o\#¦j÷øą³'Oh°gKŠłSĒį…’W<ŚZäB“óōG\%įĶpC%7n–Õ’®¢cOƒį“t&øŽå^ššÄ286ŌYg/Č`rē|šGqŠFŗØ†Sœāē¶Üļ#žgį„~¬ūµ‰0F’šI‚]¹}Ä/…_Uš¾pæ }qŸ]ŽČ(Ņ™-hWö䓰AE÷-ł#ä¼IŒ‚ī¦V[•ĒŹÓėTZo¦˜ĆŽNÄģ3zy'tå’gŗcĶ?gSżńfq¤{LpēĻ/µ ÆKĶuü.b·š&Vƒ+!ÉÉ?VUB™=Žü-…£š-ŃSĻ„vs$ķbŲÜ~eó7V’įS‡;@1u«5~†"TĘŚµgÅč,F¤;×ÅŹDßќÉöń NŠóŸķ[{N£õtVø„¦a¶ŽdYHXQÅw_'åżÄ­Žą;ļ*^i¢īaņ$”ę%KąÜž¼ 3ŌŹ¦Ś)ē¹·FTą_“ŁRŲņ¦ĒXAe"=N?n'Éz“M­ą“EGoŻ_œחń $±ČÄ’+õ+ē.›a¹OE‚@“gmŃ„§ņŅ&kžköp šÕ׌GµvAOYķk–ņćż-¹q.żFČŅ:Ś»xzģ_Ū‹‰ŽÜl"}A|Ō=,¬4õē8śGØ|NMpųdŖPßp¦†ŃƟfn›5œÜŁ HÖė¾@äUIlRę¢)[äĘ֟]-UÉ(`Éü¶+4_…y,Ņ:£ 7d8»½Āµ ŃŚ(Ļq™ź4?øMŃ,ȹ $*žśÜ©Ńį9čĒūC<Ģ 9“…oݽKpē”Å©utąi 'žA.–¬?yŚĆäšü"Ͷž3·„»曱šóyyæ„äÖ§‚®&/rŅĖ~ĶXµal…k”ŸĶM#•B" į…”­óGŁGžŁŗ6 =!2ęC¾QPńĖBN¼æ³9ū‰ģŖõś«É‚ł7l‹™v³ńTōćRĻ–Ģ¢“Œqr°zD¤WV…ż^Õ;ŃėWÖ§üŹŗƒN¤ŽŖėæ(×BÖ6N6‘Ķm÷*c|K±æŻb»‡`±Ä6æB'ć±į‚Ų:)ņķ\›3:\÷Œ`É“³—tĶcÓKO#a¤ŲÕ9z‡1’Mņ‚āšŹJŠļ\y¦6² mĪu>ū°Æś‡Ö3Üåī¶Ū@B˜”ĄÉ3“ĒŃ«ŌӅ„˜Š=¾ŠŻG„ł-‹ŪއīQŁšC@Ä®%kŒ»ķ)®\åYä¾wc“™’LA)lšķ!ŲāY¢<ć‹@yĀķÉc‰6^Ö÷F=™“ƹüTؐB;CĮ?³QŚö7¢«D±x…\§¬&¬7æ Õ2^ƊümQo]`©j*Ī?w9īk~są¬LϬ¬b„\Ә~¢qŒ¤Ÿļ _`$BXm¤Š:éĆõŹŽ*“U}k ,eE‡p§īŃ‘7-łb°›“Ź=xB£Męšś8hÖČq»:×ęʦWD*>žh½Z@ļä DżœĘ¦§§<”“Šä \ō~żl~½VŻ€ŠOk”W¬%LŹ™Į PŸcXT"<łégėl'·’z”Ōż3Åī“­§Óz‹ļyUēÅBČ!™„bŁüģHÄc ;|įU?®tŪń_Ó}O@KżŒœķQ#»8JėnĮ½[÷Š:Øe6ŅõwW‰L s\ŖfŽŌLó¾Öb,bkįD]ÆÅ„Ræt&_~Œ»ˆ-v/4ūręüØ»Ó `ur“0qŃUō›łĘ5tŠ3ė×vä/$±4+Ūįyd–’€/!Z(•Ņ•‡«qT„UĪ|„%Ć‹Ę¼Āˆ¬R‰£¾ ŁgՕźr6¤åžā¾ęzé‰OĢy#Ž y±ß›Ā/ •AŲqĻs‚ń±Ü¤“…o„Żß+"œƒWXV‹“^7¹śa'ƒ‘gĖ6čšņEvR’øC}öJ±AģO R»ŠX¹<£ÉĄˆiš%ńkņ«‚׋¤ÅW¤4£"ßTižģĢ‚Bļ ż.¢šB>j‚ƃ£Óy€qnāĒ§Ķ żøŃ4Ł”>ŖDś,Ä_Ļ™#¼pŹżAæEĒHźtłfwח/ŻkŪųŅ:éĶą˜÷3§tmæŖ0r_]ö¹Ę©œ‰ŃH˜H!–9ńJ«EĻ^ģŸL Ėįg¼˜5ĆĪŻvན"S>=tfrś:ɋøųźŽ¢ī ›„.zn‰)I&åÓæpH4½ĪD÷Ē"Ģהgf¼Ę^c”“iD~JµĘ¶Gl:{qt¢ū”¦P8\mń!]]µ Ž=ĀH5šĒ®5,g®õźĒŻį›­‹µāżÄݳü¦pŹŒ]j Šńx«$ģóCX!…ÉU øī6va\’$Æn!33 ØŠ9ŽRå«ŌD5įŃq¾ YēĆ]ONģ¾S7éߣqKķĻ×ļ«(zŻ31ƚįCÜ ·,ƒE+µO-߼ȗܔ)ŠREk*FĶWgČ3‚^ēQfqģĒ/ҼŹ]×jÜ B.šąŪ¶Ž\ŗˆ¦…žr’$Ÿ» ė}“/©‡‘óÕ=ó9”śGO “TD6Žq&}ØŲØķĒŅ«SIōįa˟5Ì ń•č×Ņ_ül‹1?ó­2Œ<Śń-ÆĘ,ŗ‚ņ'Jļ‡ˆKæ‹BMņģŲO~cžNƒĄĄ‚ 7ž R¶Õ Ņź ,”ēŠtµ0œițhæuūæŚe`ģŹ„~üŌÖĢ]óØćÖPū}[jÆčųĶtØš¤ŗ1»!V÷—”4¶P –r6—Sżį»I)MBēś‚€om ņlBƒL=<{‹˜”ΆOŅ*įGŠ‚aSõ=ü!¤Ņ¶Õŗlō89ĒčņĘøĢLŻ7³Oqž=ĄÓj¤6ަ„Õcsņ³ébŚD6ĀŌwR3rzµ³†ĮäéŖ„ƒ¢Īg341vØ9ÓĖT%“qēI‡悵¼«ī’­cŸģ'įF: īČšA‰}Čó6ßF™ŽŒ½ŚMą›Ŗ·čØa½Ēć 5.‡‹?öČ(`øm!ē†ąš| 枢Šls[;šĆtŪg3TŸØlT#ß5āgźŃ“$N¬‡K®W)†¹Œõ^!”T E3õ·ÄÆä6*Ģjx§7RĀX æŖ(jŌ[ßų…zƒ®Č¾®µ„W ‹-c·UtĮܟHßLéāM)Č“Į^> Q„?cø¤ĮXĀb"żl†‚L† ŹŖą£Œ)MōŪ–¢ÓČób±¾qŅ„šńš]ŅQ­8)Yƒć–‚ÄYy®\­ƒ…Ł—|: ”­Č§–¤XÄļCÖB¤÷cµ&–DIłnj‘*Kz՞?ČäȟźįĄĮq”˜VˆÉW²™qŠÕ‚ry·m>Œ¬ ±˜½KŗĀL?Gwcyt>ć5ĒY÷I0Š4īb‡"Šń‚>Āiß$Źsó¾Z…Üā1Ö„į~žžRµ+)3ŏ.De9]¶u4Iķ„ģkßŪ=lŃ.%žs"ņUHŖ¢,&Ķ Ų€č"\‚Xhłīułˆ?¬č—ć­Ép„eėå@±ūvjdė®PĮ£øŖ<ŗD +½„Ć{š1„RCÜu(:ĒWk®†udöä>¶B»#ź¶C>­p‹H¢§­śĒ fˆ¬¼&óIź“-¤  Cח=1 ­ŅÜ5 ~żĒ&ÅO-F?ųĻŅuŪž„ÅĮĢ *źV‰sĪØ©H\÷a߻лƒķ”źÜśÅĻo¹ ūœĒ Xš™Ū$įÉiClłw’I¤Ā’\Āõ+¹¢|B—¦üCß£Ōš}Ż6Š3’'^2WÖ2w»Ņg•³(;ķØĖI$GęoB™ęHqÅ!Hk¹ŲÆqĀ…ŃŅj¶^šZPĮaočø°xā-^xŲgX¾VcīAmYt¶ÕūC‡6ēj²N/J­SBŠĆ|(wĆp»?­»0C\KL‘"OĀ+ņx¾›ä®}Ā-'SøĘTś£¹-cĀ]†„ē }ŻŖ|( h’°œ÷0eå‚~®Ž“ŠYO¦¼ōˆžāctK‚Ÿqö‰č|2ß÷× /Ż/ˆCĒ/Īz!Æ÷>‚øO¢­’ŁŻG¤}āC–z •T}čų)wøš*Ļ^}(‚įˆ "ūŠź(HP•÷£å B²€?†£Ļؾư±†~SÕS­­r³_§ōˆ“'s¤¤1;3«źĄ‹+Ž„ō] t R§…bCõ…,GĀŗ&N&ܕ‡v‚ž&–½|ćāL“:ųąƒ“’WxVcBkąg§Œ”/ĒVgęJKˆ¼ŠóāŻæģ\(6„~©Ę—¹Ņ#¼Gļ{YŠ^‡§¢\tl…¼H"V1½Kš‰ł2ČóČfĄ¾õHze@|j÷Ücp A+ż#7˜ŪŪ¾æ’vt±«Ź”8Ź®œŠ4Ŗ-ń A1ŪLjt~õØ\8L=Ōźsæ ŸJśĘčį¹ĻsRŲ“Śč°*=V÷\ń¢FښķOf¦åĖįx{h[ō”hz-ø1¤ņ©ĀĪ»ž,3E–+mŖ¤|ż[Ņ"VÅX©Ž1k†÷łé÷SŒj˜Ņ_ĢņĀÉēGSÜ åfW`FČ„†SåTUŠqc‡Jh K±”ŇųD=Nß2%=:—ö”ś[¼2 ē8×PČŠŁīŒ“V·‹ŃŚz­I:„ŠG]2bŲ87×U£čšÄT É kGų’č‰Rq+ā"NJÜėP\ÖęˆŗÜ\ÜTŲĶ‘ł/*Bž³ń®ĘŪž_ļ8õ,„I##Ä×±»·Ŗ‡Ła&§ł€WĮe²O^Šäóķüh0ˆzŹå÷ßD ąŲę®9—Ąƒ#Y&ö˜·Ź÷ō»&šūükŪ§påėĀJ1¬¦[« "«„u¹ĻŠāšpøaj²ˆÄSŌÕiŠS©„‹²…“ŻŌźöŸ”›.ܧ½‘'¶2”ś÷ [ v1ÓqtWŗłJ¼™śū•;‚IšuιG(f(R9Oń±”!® Eōµg§h‘ČH’rJ.¹÷Š@ņµÖ3 ōŚ+»CYtO ¼ s+Õ4_8õüØy9ģ“4mكCŹńĒĶź‰%±TŪﺔĉ “.E©tżx}žpkGĶ~įi"CĶ"zģ8ś/žŲ—ßgxäBĖmÆ"ŗ5U/Õs¬œœŸķ`L'©RŒ3WŃĘX4ĒĆq>gϬ."vœš•Zf&ųkZÄę­]Ć3%ōŃĶPåŒ!Ų½IōŒd„ āeR¾{Åk“ÄŚŚtöÆĮH¹Žć¹iĆ峎™L6—źÕ”ER5eąaó©"MĪp‘/ß»r0d £·Żż“ü%g~BDN½õ(#ąŃ͛τ@Ź­ßT°Ä2ƒų<#u¬Y$å#‘ŻŃN®!»x‚ūĖķ“ĆÜDЇż„Q"pR„Óiʈ ōŸ`;Sß÷wė<āIs–ZVSmG_B:¢‹¶;°7=-[œ®Ę>%‘4²¬Å|öIŚø,ģw«HātC©øs×?č"Į/c;Ģ0 S¶ģłPūP~ėĖj¬r' MöYHhQWҰ½@ڲĻļKh4†Ć{’µA­ķ†źź!¤šI–R„Ó»Lkśés.?ł™R× "ō¹¦ŹJąś¦«÷ŒLwU3Ó!ÖSüŽ;ÆqÖēŁ|Oö²‡O]ØsÕŠNv†™r½ń @ ˆŁu{…ég¾bšy؉ŲĻ–sÉĀ’S&sč³rö9®- Šį]¢–ŻMЃāĄ‡Ž‘iˆžüŒ˜€ę-šI°æ<ēŻS@i@&MeßæžšÉæFŽ,Œj<¬üaNQ ž^Τė^Ėy¬T[©r£K­Š›‰ bȅ¦Z¾:ąJY†¦Ė/Üa£Ķ§5%]ǰj‡¢{,ѽųJZn’}ĪUN5n˜Ć˜L±$/öe üsT”Vǁ\~ėå[½¬I“żes×j|’ņQ–†ōD ¬gé#Ā—¶2ŗdĀ‹u‘ūšĆÆ,‹—%d‘uĶėŒ8ŻõŲ³ÓĪ@4?aA“grzØ;É)ć2ö“°7iÖī-SęUĻ‘VP”5_’˜Šį”ź­ØĆ1Ÿa‹3vxÉĢŃĖØók¹Ęō©+-•ćBE +§bü’6Nā'öTyŌļ<Į}Ą©G@Ēi Ógt’쉪źŁKjeŽāøYGzśƒ+mCväźiw1Mä ¬ŗŹ’y'Ś„N뇂Ėü©ÉؤŸÜŌŌŽd ŽŠ©j[*Å}XZ“}YdXÓ¾Äę.ø`Ļ"Ģ~`D÷ę.+ƳEEŌ³e¦AFŽEˆNM®‰µÄØ j„ ±yy„@sŗ€Ŗ‚»Ÿ«¬bė÷e+yŹgŽ3}~āĀāšĮ+×&ęÕį2ļŸ~Ž÷‡PlĢ Ź:mś±eb8œ‹Ņ_qšÅ”QėÕ`Ā—±·ł °ĄÉ’e«ę,hYų8õuó·e±ßg «Īū.ž=ć‹y“Õ”…Hļēy˜ AėŠćł./A{Ō#}ÉH˜`| %ø¹HMjž4]£J„¦īĖ‚ˆū¾(Ē… Ū›ų* –…“ē— ČŲ~.dåŹŻG¹(ŠŖźĆ2µ8ä„Ķ ™jŗp©»J0q DÉ(ĮŁ‹G'‹“5Ń7V10įAęvnēč NĄ¦Ķ?OŠAmė­šqłsuqٚŁ^¶ÆĘl.±bāįGNŻ‹čo\u’ZQ‘! endstream endobj 83 0 obj << /Type /FontDescriptor /FontName /WIXTLK+NimbusRomNo9L-Medi /Flags 4 /FontBBox [-168 -341 1000 960] /Ascent 690 /CapHeight 690 /Descent -209 /ItalicAngle 0 /StemV 140 /XHeight 461 /CharSet (/A/B/C/E/I/K/L/M/N/O/P/Q/R/S/T/U/V/a/b/c/d/e/eight/f/fi/five/four/g/h/i/j/k/l/m/n/nine/o/one/p/period/r/s/seven/six/t/three/two/u/v/w/x/y/zero) /FontFile 82 0 R >> endobj 84 0 obj << /Length1 1630 /Length2 17678 /Length3 0 /Length 18521 /Filter /FlateDecode >> stream xڬøctem·&ŪvvlŪ¶mŪ¶“ŠS±m›WlŪ6¾zŽ·OŸēėžÓ}~ģ1Ö=qM\óžk¬MF¤ØB'dź`l&ī`ļJĒDĻČ ·²3vsQv°“wą’„S6³pü•³Į‘‰8›¹Z9Ų‹¹šq4ĢL¢f&ff @ÄĮŃĖŁŹĀŅ@©¦¬AECCūŸ’LĘ^’”łėébea ’ūąnfėąhgfļśā’ŚQÅĢ ąji0·²5ˆ((jIÉK(%äÕföfĪF¶E7c[+€¬•‰™½‹ĄÜĮ`ūļĄÄĮŽŌźŸŅ\č’b ¹Œ.Žf&VŻĢ¬\ĪFö®{ąź°²7±u3ż'ærs‡%äčģš×ĀīÆī/˜¢ƒ‹«‹‰³•£+ąoTEQńēéjiäśOl«æj€ƒł_KS·Jś—ī/Ģ_­«‘•½ ĄÕĢÓõŸXĘfS+G[#Ææ±’‚9:[ż+ 7+{‹’Ģ€ąlfaäljkęāņę/ö?ŻłĻ:’KõFŽŽ¶^’ņvų—Õ’ĢĮŹÕÅĢ֜†‰łoL׿±-¬ģaž™){sćæå¦nŽ’”s7sžWƒ(’™ŖæI™:ŲŪzLĶĢaä\’†Pžß±L’ßGņÅ’-’·Šū’Fīåč¹Ä’Æ÷łæB‹»ŁŚŹŁż€ļĄß%cdų»g²€­‘ó’ĻĒČĪŹÖė’äõ_­5Ģžī’LŹÕčo[„ģ-žRĆHĻųo”•‹ø•§™©¢•«‰%ĄÜČöoĻž%W³75s¶µ²7ūĖķæŚ  cbdü/:UK+ūH`ū·ŹĢŽōæVš—®åĻ ”(%)-IóæY°’2Tü;®Ŗ^ŽsūÕČ9˜žĻĆ?0ĀĀž:&vN3'Óßū÷7!.fVæ’MČ1żēYĪČÕŁŹ ó·nF¦U’?~’yŅū/0bö&¦’ŒŽŠ«‘½éßiūŸ‚Ō&nĪĪIž×ų[õœ’5÷ffžf&0«K&Ęī 2e\²X| ļ3 .ĒÉx\…‡ĮĘ2'ņÓދ̨Jė7t-IÆ°Æ]4ņs§Ūd­pÅZĮ5G/I¤“³m}!«S J-di‡%˜JŖ3r"e(i©GóĶp°6ą‰ń#D Öž®LŽ,ł©ßéźGÅ×T£š>ؐs®H7ĀgJ÷“éČ#źĮ‰—QPPĖ:Œś<ę ņM¹‚5V`$u³CørŹŗzndR ½%¶¹ĪCęjŸŒå ;YrÓ®™;F*ģŽ÷>EæµW§»']Œ-~^Ąpęx Y¦tŹ«iDK²ēØ\š?V>ߟ5EūüaĮønø¹™V'śDw§ 7»C85«7Š}/™? št͊±Gī. V:ęeƒ0;\"żųрĮ‚ŃöTŗVŗĄÓ©„cŽųR%fg¼² ū1µ)ņ¢’\屑ßīMNęøķėīžµŸŸWƒN²ßM°ųłĆ­ÆÅ'SėO‰®cS†ćƌ;Dözj¼e±±Ķ˜I-¾F*0Ŗź·R‹4n…gž»§ŖĶ֓l¶Ņ„ƒ™,™F Œ/Mo„)I•ęp€dc‰lŽh ›’]PX¹AØgƒ‹:Ņ“»gˆ#Óc”"‹"ą׃&’(ā½Še±ĘK 1*x‹°©2–ĮÜ=%AÓ|ł5°¶ŗĖ§DŗüšWу+V{{O+ ÖŻ!Æ»øu ž~khž „b#$ĘļŻ…ž1{žp\ąßņz¹§²”ŗ÷øm‡¢Gįw{y+aŚ ņķT"ó™}éśŅŗœō•töƒ<\§¦L¤š[Šó+§×[R!›¢Ÿ,õ2ÅgS—AMĒóĻ}9źŚ¦(Ռ±A=D XŠY Ó_Fŗ±¾ÄFež.œōšµ@"%[e„4ń;䈕ŽĪŖõ ŌXŽÓTÕÖŪÅŁ~lSUI5ĢjLģ<…7Ÿ‚oqoēY-ųSĄTø}.,čLėg~²™  æ#­ńhg±qV¢YfėŁhŲl“ŅżW834ū ¦#ÅEģ°xyČ{dŹõNgrKTäCąŸ|}X$Få¶00Nr $Ōó›cžŒ²ˆLg>/pHŻvž{Hóąļ²µIŸė}ŹĀö¼)"ÜH&F(½–£FŚy±N¹$ƒ ’žœ‹ĄĪV©³y‰7@n,Pš¢¦ĢĄ—«*Ø£÷z„ńżŠWÅēV­ŻļDmÕ.µł«ŪōŻ’‹ī0Ɂ&ż•x¼ńöōŠ2yX2yƒļuŪ2OĶFˆø$-½;Ń¢ŲT5ūÜNĀĖ Ś'ŻæKF-öSŹÕ$9Ŗøē–‡>ČTĻĒJµP“ Ó¦mܹ7ŽøuT„éjī“Ö^ś*$Į½ˆŗguXń0}¾bTßę'/Əō³ćƒ„āhæ»ū®ć!.nj ŚFFóĆe·^ŃŁŻ×‚ˆ4åšŚŌ&­IwY’Ėa¬¢XŹžŗ]¬@Šv—ŠUQ׫ČĮ2Ā!,c® ‹¶ƒ"ö@i?Z·ß>!ˆŠÄŌ£ĀÕ.ż¬še«ĶRƒÆļ Ėū½ĒM±,Ø“ŲČŁbØ —-häÆŌŸ ęõŠ 8½³2ńC—a‘¹˜¹<ŅąŲāč…fŁ¢9ak“±øćzGKĢg&cńµ"€øøšcŹ·19WØĪ#’ųbokR’ŗ¤ÅŪłEfŌ}ApK˜Žę—RŪJÖÄz}aŲ†šc/č®šÕ›ŗŌorå„düd† n4T;““Žkŗ`=œ®ClØ{6G\¬!XŖlĮpé„ ĻøYr ÕeÜœ ®’³‘#_d,Į™Cūō.®’jÄzPy÷ƒ:m›žUcN!^;µ™µ|_ü Ļä_‚į+iś«–ŸõŃȋ ϼ‹Įį®|¬o^BÖ)‘"Qūc‰^ĀH5Sģ`’Ō]Fłē$L¶U—Mė?›W¦HĮoųȐkŸ=Ņ÷ =ėßiį|Ž?Q=§Ā7Ē,“p $‹c£Sėž| „–~§ķŃčݜcĮv:lAź7žÆVe4ÅĀpē·%‚ŃõĮÓW")MM½%x¤.hQå„e)Ü’ĢŁŁ“t\āĪg{šŠ’.:xŻō甾Č·ą:Yo“RRnųi&æmėæ@”śrƒ­»Č/©=i»Įś†l+5ĒV6Ajµ,źĪ}ϐg‰½‰ĘR=Ēdyū])½‰ź]œ/ µKģKĶ–‡L²(H Ļv|ŃhķŃ>”óꉠ#į֒6R棆ŗņ&ž-P旣%±ö ʰ}6°]=@i‘Mj&ח’‚–ķ,Š'ŗXv=¢Ś_ną[ ŗ5ć•““u ¦w¦‰ł½² Nn>IEi¤NŽ@ā ŠvŹČ"Øż”ŸĖæ$JõĒ1^Ŗśē^ GVᧉłœ5pįUš°5¼nmȈŠõŹz;VA ÄÆ.x¬ĶŽ·PĘzėŹmšp zŽŸŠ c Õ$䵛O¶…zżq“¢„µ–ūū½‰óŖXE»'­‰ }ģu¤³VC6^\iļbāŖ”<ū”Nē—?™l惹Äk2DU5jUŸå±;eä)\šB#9­Åot.¼§©ÉŹ8,š¾V*rچåu·¦>·¼&\&‚–ęīI¤ŒzI9÷mń›nn-M!ˆ§hpҚR`WRA`ljA<öĮÅpL“– õŠ5 LÓĪÜ õ+›·t.ĖÄ•éó×ŗé_³ąØ”ä…× °°Õ-²Ą£%×&×Hz^˜T•ü Č}ÜĢĒuüõ–śEīE³sū”ŚūaÜĻ/rÕ Xūę“x9b¢U—€§ŒoÄÜ fu]`6:&i»ÄŒD“9Ę&F,nĄéJīšO·3i¼ėt\«fä{A(YĆx¬!E&ŽØ0'ü›Æ5ä›1e­M{ņŁ„ÄJosŹķäw'įJ1Ó®Œ(Å1slÄʏ’ɜ~hx˜ĶŻ0ģ3šōUā-‰­zæsĢER<`Ď!„Ų!ҶŻ+`†™T×6A°T4 ”WŽDµāŁž@ųI‡’Ąw™ųB1K2]üP‹Ē©„%6%zS?ģŽ ‡<ø‰Ķ@nŅÄn‡„żŃ™0²Sōs ŻF©‚[6ćŠĮĆdgķ{œg§‰øYGo¾ĢF‹,Ē„ūT£­40Ļ®a޵ ®nā‚Ā»Œ•,+)ę”^VvŸõh˜ ]uw1ŅRÕĖk݊!0]©t¦‰ųĀYąõāĖæmicuŲĒ'*cĆZ/žĒN×Ī¢Ō@2¹,ztćĖBÉYRh“SO Ā3Ńšdʐ õ˜x÷€9ŻŪč €?”õĘJMsķ†U%]QĆ{F¶`ˆ¤×ż}&QŽS9jż ȹa’[żŻ.Ńž,ŗj&Õ •ųIé×¶,¼ÅäpŽ­oЈ5ŁŽ&š%śž8r攩9Ķ`8śŲŲ<x‹cRjžEŠv5&ÖzŅD®’€Œ4rŅ«~a˜a“‘ ķŁÄ;šƒ¢X ‰ŸüŽ €’¢»AbX”sł“r±o3Œ¢„ĶŌ±ūD61ćč§ŃU£}µŌįÕ+ė`™qÓd~ߑ]Ÿ˜tš”ŲbĆg_“7ÓvsŠb-ę]ņ-ūUŠÕ˜fčyś«¹°?YbõhEŌGįŖ7,÷GÅõŸBUsĆtź]›zz˶2v}4ćTŅH:€l38öoœæ+õ\Vą:«/ĀŌÆXŠLLų爄Ųģ:«šūŒ+‘ļfʀüévæ]§˜.ł“|Ōq’īŠZĻ}_š,ÅŃ©„;²¼$k®(¾\x`*6j÷…ŚAéārŁIśÓŸĢYķ½³ąÄŽį„¢Ė- g^]ū÷ļ߃ŚZ’fĘÖqÖzNz̲l»öžqĻXS4CĪ8V”iŁi¤h‡…¼eC¶b ˆ§¼æKe‰čüĀ:F~ś²ĆeJ=I^ŲČ:xéQ‘åļ “Žy=0‹7š†ō7µÖ„\r©LTgĻeĄ$äwšĄƒ_g Yµ ÷>Dv¤Ąm-hĒŁmxŲ(q½ WääVQōÜu=+4ģ{,Ē÷uƒ-Ž¤†ŽX±·{õ·©vв”²ēW†ÜćFūåq@¹‰|ŻSųā×RŪUÖEJ|Ö¹n,dģĄfgB«ā8Yāq·č˜½Q AOźŌ§zĀõń)aD~Ļ€ óˆö—rP^Ąs>¾™¢~ņnR“[žn²> ń+ĢŲę\hl’)Œi³ģŃéęa»Į±ą†õ]ķ¦ÕüÄɃp@†Sćcčx+īsõ<.|€U,ī"É3^Ŗ…ęq-V½Åy­"Wkhü™Č™ų²[TīOżõŚ“E&²ÕŠy¶Śnš<=+Ś ­rCų™ĆBĒŹLĢäÜ!dnz<ēkĖ-%M&iīHł&?€qžR1Å09ŽÓęq搬=‰õJāÖTH$’į]PQS’)¹ĄVģ ]!¶ómQˆČ±ˆ›<®ŻėÜéµ§Mŗ4hą!›ui&190éÕćōJo:jņ܀aĄ?‰®“²1iNnF°Ä…ē„®%R.×9 E–†wė5ĖÖNÄ. Bä%Ū8g”¶bł ƒ4TŲØ&u+l–dĪ9ČŠEV’&9eć?}Įz>ŽöĄēĄÕ×¶³ A‰ˆ‰@6K‡*HåJ)¦ā&Ū?MÉXņśĆąåFčPS$Ł™_†ææė^,~”pįa–MŻāE“U!ŪƒIräłPhS OŖ½§?8ó$1½»Dc'wł‡Å¬ŠK§*ØłŌ½üy »ük˜wņĻÆ2ŪO/Ā«‡Ž'¦ŽēiĖ„1Óō[åܖ+3ŒšZŠJūmµ!˜ś‚;^lĖėŠf䩆3wŸŁcŹ Äę:/{ ̧ČĪčlc0lU@4ē0Ŗ1Įń0:6±Ņ a fįI­Qī.¬Õo¬ŸZnF|G¹ńĄ› 0&£įqęĪĆųtÖ?†Y39¼ŒÉb“ÆĀĻ“œ©„śõż‹éĒåķjö®Ļ"ÕčŹŗņśE”gjč_Z-š×ԘŒq•§Væ ^“BYJ#›zĻ’ˆćNkÉŚć±{Ø }Fę3ļnJŻäŽ1Pļ1ÉŖ¹#iī“O֜pŅ;śį߯P"§²Yž(›HÖįCJ0Ü«'ŠbŖ4óÓsŪĪć×S8šfp ŽČŻDQm»–ŠÅ4®Q҃Æó€ķĘ¢b²KZÓŲšŅšī€ó›“ĘĤȿø)ą£6¤Ā - ƒT|[1]7ŃǶÆkü!×½W{+÷õ@ŚUś ĮßĮź5«\Vаڒ‹ĪXiXŲĆa¤/M …škŌÉ蓬M[²¾¤ę Ų–œ‡“$Ż– ŻĪ.—³ņ dŚ*¶ž)¤æ Ve;hż Ŗd5é?½ipŠī0./fV2Ü6ęż¾+däÆ(eE+’~fŅ+®ĀžĢ+:d>{6—WĖøĪ«æ %]9Y-ī‚ė ÷Ōśó“ÖÄ+A–] q‚ »ÄĻmżĀŃj£] ė§Šœć÷"ÄØū5胬Īń„RRl9¶Ž¶tĖŲ,—€mµŽ ćÜQy=Ę{P[EļŒ`„3d‹Y¶Óq<5ÄōMØĘĖ`ÓT ŁŲF@ź¦g"…ŚŒaźś–¦O (Ļł¬wó' kŗ…§‚½-rgö‚_³]į°ā9³k6ĪūŠØĖ€5Ęó =’!ó;”_ŌīĒøī­Č 9šĆ7ČÓ:TkĘpŖm5ˆ|-ĮęM,ŽlĘĒiY„¤Ę®u—Ū–¶ƒ3s¬¦éx‹¦»&R¼¦D©”}[Z[rx˶BĆGŸ}~O*q:bæSĖ‘Ų}āĶ:7=$© øˆD7:¤čIƒNŅ+“€«ö%·nDķ,õójR”»ˆ*Ŗa@<¬óŽ}ŹŅŠæŪ ąµO®ēė C(«°G3Ō²‚ŽčF”ųė H2œCPUå°·Ž¢€kyy æ.Ŗv]{̦n<īœŹ «ōx7ø*Ļ_HŠ:'†GĻś†Ų BF#‚xx«=€b:_’ŌĻųDóLśÖįė ļ,3CAŁRÕe(šA!—ĆĶ“§#š“ŗå§5%Żp ²‡Q UF…u+Ä÷0ˆɅ«ńó.®$d—^¹Ź3m šUŅ;h(5CŪ!R±ē=ˆ-–¹ŚęŽ3E/=¼ėwŠė'.e^XE*źŽ“¤dė čr™īa5l¢“†ĪŒĘü:47gsVE›Ė%ǐśŽX$%Ċč6Š{„ŖķXégƒ1I1#£.Fa0{Ī:q4 ay©JMī6¼7œÖ3Ó²ų“rAy±¶ĖŠ}yŲä} āĶi®/<śéŻįĀv4›‹.*Ŗ§…ĖąÜ$¦`ęų‡ś ZĮĒ1ćŸŠę/£88Qo6öq抒ŗÅ×j­ĢYІ4µf¶Åķ°÷Ē ³÷€Šu±ø’b{ w‡ŖHJdbĄ #Dn=ėhČJ+ <“l˦čQ­#ĆF”OWĻhĆO»²Ü?žE£~‰ ]ˆ;ä9‘ū ÷ŽćÄķĄ[;<”N 3*–Ņü±!z--WĶÜ:ƒĀ é¹ĻØķ­NÄx? “hhŅÖ’J÷ex"śŠĮŁĀ<ųaƒH“2Ē™Čć9k›ĮóķoL”ķ|Ź|țŤŪ^°ž;ŖāÜS"  §–“O¹`³R:–,ŖŃŒ‹ S1Ī„wńZ+„·G¢5LJst(Œ¦Ļ,©]ļŸ4/ļŲõhÓF¾Ģüē¢Å‚Īx®F{?¬ōF<ėfĄį«TžĶEL,śØæ¹÷šÕÖuŌJ=C#·VārĮ–„LŹ$ååß-ēŒeŻ‹V@Õa±’?ž@VÓĢT^²]žļń±Ši4åŹ‰'Äæ‰0ńƒĢ©GdńņZė\ķVg„/K>ėė'•ćFĖl…–ŸœÜ1ÅäYQ‘čĢw‚@•óc| ³«Ćü¶LŒ›2Ł8r‰üģĮ6!5§Ķ¶ ‹ˆo¦KæžEŁ)Č ©’t…†åƒ^Ȭ'ä£ĒĘa, ŌīāŁä ąÓ!ҁH_Ł(Ā—w²Čī¬Ūć@GŁy÷5×üż5Ó0±ĢŽ\9jJ˼ĮMTX2ęĮ¬©ÜŪŁņ‚k¦ŹuJwqhī3jØ!S›nō(& @rĪ3°G³Ē]:„:ŒG‰^&ćīąģo¾¦F~ಋl9LŸžŅ8®ųDŒģ¬üg™Ś.Ü[HĄ­{{~£Ł9_^T›ēĪŠÆ÷ó­ūcgā~C×{&>Ģøłūän†ØŠ÷W…c„ŲzóØīĢGpiFŪĆqō ØŖr֙RĄO" Y§$Žų™Ä[ķŽ†0¹ŠŹĖ¬ŖŒž.Ø:ŚOz)ØtB„jyó¢"š̜Ģ+ŹŃļeéVōĶģ·bT†žśŠ „†;’ŹĒė£Ł[Ā”S('Ā”S)ŽŒ7 w p,ĪFLO]ēŻ §‰+1÷5 Ąā¶S3Ʀ_·Õņ•GŖ8|æJ<Ć~ g„,CÆŖ '+žXéuŅŲÄCfFˆńŗŌĮÜbĖ)BR%Gāa~Ų÷ąź8Æm‰÷å ZīŻĶ ŠzŃ+bOvMʰņR¼W¬ņōäé€2tˆÕP€€QؚT ŽZtĶī‘ÖéF©pEJ Ūk˜2ؿɄpĮk’Ø»F±˜p ķR M¤éĪkéeŸ›6T˜—‰1ŻøĆiµRXFPOōÅėøRn7s ¶žĻCBƒm‹w» ļš&Œųw„rE[ī[N§×㢬X­™Ļ’‰8óŪį“A‡š„AžŒG{ |\BĶ<žōāHų¦-ŻZ…÷µźų_ńpćĀ=„Ÿ$ŪÜ_F­Ž“õĀ?Ōø@”"žėƒ’x‘¹ģTĀAĢ?¾Ļ8=Łź×²ˆ‰HnqjÓZĶļg\ē" »e}ėną€m¼Ē€k[°č%8‘Ö§ŸÓ‹Ö“)My+Į¦{÷7¼v«Ÿ'š«—Ō¦0÷`—©ÉwąnFœ»ųźÆw ŗ+ūjŹd ó™ÓÓæĄÉµ'<Ū#=¢PćH gS/8±«sŹć2ĆbęMmÕX•žO c1|ၫTžĪ¬aŌ«*!Žļ$&5d‚¶’āśÕŽÄGÖz½ł;vØ%y!6!A ŲH»ƒ9Yjō㊐žzĒ6Ą„8»--ęģśÕmż‹Z‹ģē›5īSČ»U{ ŪNķ+qBŁĶbUD°ć1Xm£f"l‚ÄŅš‘`¶?†ü§Ž¹(¾ÉsŅ[f mŻCUµ”ņa™ÖŁąR*‰üÕĮ-X×Ļ%c3¹žjSŽČē«STjD+š¶£&z|0v9ßĒĘ_)Ų«üEóÆśSØĄČ¢›ŽėA'Öj;>ÅÓ&0)N½2Zü}‡ W¢ż§2tx éŲĮ&‘łīŃj —é½Ęs„ėՏļRˆ+Ź6āO¶ā]Ć%Å'ž‡ķnŠéšnŠÄÆCW°!]$Ó·7VGß¶S›7rS]$° >Sī č$čFČĄr+8żQG'­õ—LøÆ-kmżĖKJ:[²’yĖ'÷'ŗrŁčJ…I»ä™į-›Ē@DgÕAżĒ#9yŽ U6§DWRžāDö•ń˜Ó°`Ā25“³Ū_\ŹK‹wOź*åbҵŽc1*α«Į\_豆ŠPęčŌęĢ[T „¾’ńķ22geŠ$ ž^6}×ŲLD½Ž„;»Z仳•bÕX[ĘaļNń6FbJNüŖö”՘в²’»ż<›žcŲ·°˜ų©v’Ló¬¼ +0jĒt¶ˆa=c­ cƅ>±ĻhZ°DĄä&t½źēuæ¦lv,®lŹóÉ«’4A“›‹Užhœś1 Ś~+-Qöąƒ#“DZ­¦\ŠóQÕu‰š^vĀ*”Äģ„Ųz¶Ż„ö~ØzEP'š—1įž¦ŹųÜcÖS<ÕµuĖ'ĒLµBÕ¬ļYI$–Õn€œ§ —wĪaƒż¦VŠ“:™Ć:@-tyĶŹ@£"J&¤Ö8S’ydļņ¬žT£j¶Ż­¶h“°”'”'Śū¤‡ņŠĪŅąĶ·­Šg $‰qīi€³łV#Z„¦ŒČĈĄ®|«#B’ v‘ U’ž£Īb§ ųōÅõŻ¶¼¬w3Łó;Ēū"Ńüb¤ĢHń Ū9旟3N~Én“Üōм“@^]oJX×fP§÷&2š¢ĶOœŸ|ēöu%œŠ‹įčŻķ>8Y®f+ļƎiÉyŖÄk\3xć?߆F9Æ1Ļo®I×Õ“§ÓzNł6˜”T«¢«6=5ÅÜ*ż¦Ł—Ž+°ŗ*'ē³Į„bĪ·³†: ļ®FÉī]ļ|ĶŽ™ČņČVņy[hŹ ©r*½©(3Ÿģ11¬©.:Qń”ć"‹O묫G·‘…f§Æh|†#¤FB5ąšāѬ֜½č$eŚ”Ÿd‚@‹ŗŃ&Ēåfīū“ÅöŁÖÖ ­r°Ī8ĮįÜ94n2łĘ1ē/$Ūu닲Œ¾ö¢gå|žŻ½g* S2‡HŽ] ¦9{4ł˜©thn¹Ś” {“MźčŽ•HG€d.śCśZw°ś«½ß7æ$|Õ³5ŒA`Q¢×𛇛†4|Č ?µ ”ˆŲó‚~ZK$é6očƒ Œ×o¬?¢¹t@ą”#Ū²õ>o“8™•_vć4ų¾ŽžŅb18ż×Z0\äV&nå·„š›i|pŒYd÷’dÜį»{6VEŚ­ÉŃG3Ėp„ģQy«Čˆ½Ģ@īT(ü³4ęLž’"RѦM4’M0rj ˜ Cö'X‡N,XFŃXöķ|ۊ»mnśūœƒīŽ%]_»%ÖŻŻ‘,‚ę jLāū>—T¬ł²bīd^“\1CœĮ/Dņ²ķ­ėXD9q UGĀt’Õ€ŌF= _ĻưĻC«£ģ”)`šśä3ń•Ŗkl•tŌmK‡¾)§ön ’źß=)[KŪūŖĢž]ĄXd™ÕĻĖ ¼k`„9$į­×Asš.ŒČJ5ck\ÄńæåWrś›:ÆØ0`¾Ó87~ā$š¤Ģp4FtÕ”)ĄĖ„ūĪÕįüźöĮü HŠøó/D•įK<ŗ/źÜ£Ś”ŚÉ’ėęsóļųł-Ė®"Ó–ŚÆæ§±=”ÖAåßG —šŅ z ó"/ĄĶ3€ß¦"*’`ŁqiTæžG4jī2Ó"’ž§•¶Y€×‡;#*>gÆÜFĘ.8a3s„čąEēuFe”F»Ŗx±öü†F”4“,ü„±_£NåęY-µpSˆUó^į·€šēū«-É:żĪęšźCÆļ&q>-9ÖqNw(ĀOø§mDP0ē:ć|l&[•ž7oš?³źœYL#ļ5ƒų Š0*nÉxĘõöŚØŅŌ:“£ĄČeŚ”‚ͻũ“.Cr’¾=”G(’ø©J˜6 ļu•€ v ¤sŲŅ“ ÉŗÕZūĢ] L‹§Ö>Å÷ę/¤ŚĮjØŠŌÆČ„–Ø=4Ų„q)_o†aH›ļ§žżØŻ©~RÜ­×įŖ_ż®5ųy’]kdvōX!r·ņä‡ß±'ŅU0·džŲ«"“B†9łb/ĪžoXŒŃGÕR•:ż/ŒNB4*ؗ™³"Ę8sÓ4”4lfŌĄƒØF­Šw–Œ§ƒĀŖÉV²ƒZ[;b {Ų];UžóÉŻ«ĄxęŪļ‘ęŁcŽŽ’ž·~cÜ)—Ī\;Ģg«ø G¼ĆcˆęW)ZA£:ąō#¢3OĶÄ6ÅĀńE³5x‡Wi04śĮsčÅ÷0žĘÜåeTo’ĆƒŠjĒzŗ!$5Š­ą÷ō™?Éü™# Ü®¶ńZœ0»‰ĢåŻėÜMł LĘ#3(»s,]–ķ‡5Šb† ęRéÅdŅSEŹŽ©9F(¬Õ~Q×ķw6©ēēó|ŃĒĒJŠ`µe)\ &Qd CĒąÕœG7 Õ¢ę†4Ÿ·½„MuZÆMqMŽ sj”įy4;R&.äœjĮ+Ęœ*¤ Ź™#c8 Ó«dćDŠN'ö„˜ė4§Õ‡ŸČ­ĆS©†—9čļ¤Ž¼n.łĢŖ:|ÆPFŚī©J•²RŽ£čā‹Ÿ¹!Öu„Œ>ęņ8L^H€µ_Ź–¦†Œéփ™jĀ\’™sIk{o÷ųŽIž@āO‚Rģ]u}č厢tU‘Œ\÷7LÜjóŪbŠ ×4})³¼ēQķæĆa­¼£ޤø60Ķk“ŌŹ?{‚8ģ×N«cŹĢ2 ›cĶÓ#IF pk~ÄĪ™OB.vGjĪā)NMūŌĻŚj·­YŹIwĻƒĪŽ{Łż#»2Ü¢rš“DńÅsõ oÆ÷§4itASČś2¢Ņvōœ•£*’źųR®~tłnŽŪ¶"#ĘŅ 0ź{Žojvó֍Ö\Ū¼lĄāŪø+߃Ķr?ˆÜ“¤O™„Ģ,ÓA‰`E{()$WĮJ¹|438Ąj3ØGŃB‰ķYg–7w]Oś„!u°;’Ī%]Vö8dh ¬Ø41ÉE’÷ŁY²ķ…‹L¦ā‡³O&žŃ·aÆÆlS§d^|Ė5¼ŒÉM°Š0UĮ$Pž @ާqwMūŚ*ڊ.6zėv Œ†”]žKš6j5va:q…ppzŽ}¬›$ćEŗ=ˆN–:ūĪ5%ļUM~}Ük'i0 śōš~J™$„ÅeKՔpylolOŠ·“ŹÆ€÷GJąåöŁ€Œ˜Ń‹®_–»ŌĻ®`}£kpĮa9|Q’‚H4V¾ł®ķRG<Ÿ£²Ä—ŪeÆ÷.]¢@ÓюŁ]H0c4¢½ś-ī,å]VC0‰-±×ęŹ²=ʰ ęĘ؊™Ø~ā›WTŹY‡3Ķģ‹C®ģ³[Š#`6¾-}æØ źkvꊄåµÄ`}†¬oĆüó4ŖBżo#oĶŃJA@÷Āj³ėå>@ŸńG=¶2.»I†N½ó¶ß²æič¶$ø7ŽÓčįJå1øzLÓŶg“ģT@ż¬#¢Jƙš\Ü1sœŅÆįœĄa`s"\”IŁ¢ģŠ&$c.Żņ]>łAĶ9`G|Ņ ėJžqż1"“‹½:=%Ŗ‡$$kć–2Zq(¾ *Éy?J˜“C@œ· ¶÷ƏüZ¹ė}7™H°GQ¤ąN±{ċa>ŸČ rŠ/ fhÆQÖÕP»JU~[ ß'y­Š0€źmsŁ›8ŖĘ&ż|õ†£*„¼Žż5ƞņ3'¦ĻŖ_oƒ•’ “/ˆ?ÕBµ«%ö·ę@`ÖLy¤Baø~µU%€ä/ŪܕŻ\‡A=°RU]QŽ@/K“ųE’ČÖŌ/{*[™”+0Æm%hBõĪ™':nęņ…[{{ę]·‹”uŗÅ’- Yl›ķąÜyŌŲZė/¤œ÷¾$-mS ŗĶ]ęčcī‚’3ŚŃŌÓ1‡¦B‘SŠ ŗ!…¾n“će;—Ŗ”[ŇCn09×Wv’)ˆ’óū ²^ĢĆvŒ7hr•ģŠ qio®ƒ’=›Ā»ŅŅ]¦ .Zj[‡B÷OĢ-…×~¤x[5J’ŃēmŚ 3g„”Ē~SįšFGQbHæ<÷Ń×Ķ!9ĘųėgČ–$A§½‰čżIķø§PşC®˜ŽŒ/AśÉ6·|™¢ .7 öķ9ł>Č®:ÖeŻÓÆVAīÜ䄫 œ.ąä?|šnp`‹ŽaRœUųŪūÄ Ž,ą%ŌŻæn4š4m'Ź% 7ÅēƒÉ¢8_v@ńśģ ܆GēMūtom5¹Nx“üS¬ų²Ųhdt:pŹ+ŗž±JBhc„ę"F°É€×õƒ&o×{éy’H-±‰t„džČ`;l78`č<¢ōNy łfŖex„Ū”Øo ė›ŸQłĀVŹįfÉõ£ ŒREé-“™2l5vBī®T7%XRĻŪÖ =qīqłĶCRĒēVL )[?’¶¶żĖnd’jžˆVŹņž3bp`I4”•„ü PĆtC?$S¾Äj }ėäly­·¼āæŚŁEO_Ęōn^8‡JR¼‹|cަ„[˜ę?ł’`n„yœ-ÉEŻæįdÜ+ŃT"%p ż€|¾‰ˆ2aš:­‰¹˜åšwŃĻId̦u`s5ź0Éé„¶E‡SØiLŖ»EO°}ī}’v¬ÜQ•)FóM¤@€I±ś o­Ś4‚Õq«÷½Ń›LÓė=9QčVaŽß¢õˆj”~ ц¾P”S:esß’ł£É¼ę²$換oĒ¤Ųd.;Žxq¹5 2×T-׳^msń±¤r¬–®nƒ%ģŁ ć/čˆgXÕõŻ&©>6 Ėīµā”Q"æjąü¦g`HL]Ķ·hž‡Y¦X…aSoā>łā~Tn9„Ō,Ę /#č0)ÉĮµĒåÅ£ū-üĒÜń;>Y²vBßnQ ©Ū8[E!’† «¶ąĪ[ŻēČ¢±OÕĶķpoŌ†×÷¦ ¾ž†»Į ‡•W 䑌.U”čQ¹lĮÄŃķŠŽ5m,‘Øó’,ƒ˜)ø•hz? ź‹ĀżŖZ3·t’ļųwN’}Š5”Yęž& śźj2jŅ–Ķ=*œyĀ5u‡«š }rn ¶Šżļ«]żyyEįČķ‹x†\’CšxĻŅöŌĘ"CwbR^¬«NÓPżF²Ö+˜¾Üdč%’°ŲĖÜpĖ×Ä×u„:¤Ž?ĄLÉ9ÓēĘ2˜\“XBaW®ƒŒüO”o>M¤X oN dqu©ŽBØ\įš§Štø‘Ø$Ą)æ&dńøÜ„iK§Ģh›dŲµ?Ķķ1›œxćŸ"Ö¦*Ā© ¼JėŖ ØAę>Żxėbį¢[O W„ŖŃ Żņ™¶„LVĻO‰_×g­ćPm9źL#óŖAZ§Xć,\ŗČų A8z®¤ŁmEŸ¬±gįŒ›ßæö“¹8Vc¬Z³Y—8 Dš|hŌj¬'; ˆˆ‘KāęŠCä°’9fĶŪRn„”›Vūż×±~“ ¹`¹V7³8‰œ­8åĄ:Ķ`o°E“ģ:LÆ-1ÉĶf®¼hĪW‹ Tó<¹¤ą{"F Fč œ£įū¤} /ü—wÉ/’mŠ#±ń]L+2Ič<›ąmäźuhcp z}½ŅŠV§?æAŠ;b~čæ„r÷”ƒ>Q‘€ą#V Ŗ,iqŒWģ¦ (?5†mŠķB )ą¤LöæćŅų¢ī(uŽń•=Ґ\łiģ9żÕ¬RŚ}}ˆÖéĒ‘E±&k#xÕs¤ŹŲŗwņÓm3pRką$ń‚e‰-ć( "™sĖŅUĢ~ŗl yH2:@(K[xą-åōT‰żĄ|ĪžZŠĶl]MĮR/āżŽ‘÷ŗĮ įÆūO^ų˜‡~Ō’ļÉ]‰½ōēäiä ŠŃ”B—ļ‡1+Óøź\䣏4érÅ?ę!@2įų'Š U؊㰔ļ’E’„Ł}å¬ģśéóĶāŹī]Ł·åäh‡Ö§$^nQ!Eeķg<]LXiūŅ-²?:°Ü}LI™źŸ/*nc²=Sā¢:DW{č„ī“B]Ū3‰žSCĢԌÕ=<ÅŲLŚ)ķēŁšī/mm…?õ•Ÿ«ür[Œ± ‰“ +×¹ š¤Ż,°8øxß1z*› pżėsü÷Õö%µLæ˜õæĖXÜčc²i5ßį]ė—v)Ó<É'f>]iö o™$W‹L3egį)LÕģŌŽ˜į®žĢ<¹Ė ³–œ«Ēˆ%1•-ąńµ½w_ˆ ¬Pōšø At endstream endobj 85 0 obj << /Type /FontDescriptor /FontName /WPIHJH+NimbusRomNo9L-Regu /Flags 4 /FontBBox [-168 -281 1000 924] /Ascent 678 /CapHeight 651 /Descent -216 /ItalicAngle 0 /StemV 85 /XHeight 450 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/a/asterisk/b/c/colon/comma/d/e/eight/f/fi/five/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/period/q/quotedblleft/quotedblright/quoteright/r/s/semicolon/seven/six/slash/t/three/tilde/two/u/v/w/x/y/z/zero) /FontFile 84 0 R >> endobj 86 0 obj << /Length1 1647 /Length2 9163 /Length3 0 /Length 10011 /Filter /FlateDecode >> stream xŚ­weX”m·6%Ņ*5€tww#ŅH#0 Ģ ĢĄĢŠ ŻŻJI7H ŅŅ" )½ńyö»ß}¼ß·’ģżžøļć¾Vœk­ė\k3LōŚz\r60k2 ŠäāćęhB­]ŗ0GM˜˜—.ČĪE iåxŠ į01)ĄAVH Ŗh…‰ A6EĄĻąĆa(Ąœ<ą;0Ąj kČĘĮĮłOÉ€µĒ?4žˆĄüšį r€99‚ Čˆ’µ£@‚A[ˆ  „m¬¦©`UŃ4؀  ųCŚ.Ö @A 6€- pųūĀ 6?„!ø°ä+Ā „<øÜ §?*N€īA ¾ĄnE>Ü€@.6xŪĀžJČ {°p|Š=€iĆHqB¢j+*’'l…üyP`¶–60 ĖŸ’žŅ=Ą„°žļXęž÷‘üo ųßBšæ…Ž’¹’ŹŃā’ė<’+“²‹ƒƒ¦•ćCü½g‹Ę xŲ5 ĄŸeć`üY8ą’ćjåqšųŸœ’ÕŚōwÖ’‰łÆźæCČAķāāāś[ A(CÜA6Ś$ °µrxø¼æäPÜ=ü׿>8ńņž‹N ¾žaCčojóÆ5<šöW<ŗŗŖ†/U9ž‡mū—±öCW õ=œ@€’Œdųfó_‡?Pņņ0w€Ÿ°€‹_„÷aĘQŒ_Šē’ö/ ¾ž_Z!įw€)/7//ąįżēŸ'óQ‚a6śHiµyh½’üQ]ąšĘ’Ś•’ćü×€@ī ĪĀP"Č>-3YM™Ū7¢hŚż‰½/Ų©øN’}_%¬Ó7-lU¬Ģņ¦*˜»~Lü®ÅcvĻévS}ką…Kg č ŸŚ‡‘­«€x™¹U„c+€Ē¢?ż‡a”×įŒĘ7 aŽW[k#:ŗE7˜4c­p¬Ć 6?F×?²ēēNo©µ±ämDõ($Õļö~0'ī\œ³ō ö÷õvžzŌµIő‹Ķ$aEł6y> éa ?­Ž=ŗrqĮuĆ÷"Mæuaō‡2¤Įj<§.łżX[‹OĒĢäSu ąz^ĻþS°‚# ”:ų&CÄŪ_¹š1r|D“Ł-qFČK¼Ā”nŃījäwV7Ÿ‚ļ­ĢĆ*±Æę~l•ghe$n’PžŹŖ»H“‰«w.ļ¢ÓøćūŒ,!?{9Ņ—?ŃMWUū¢«®ŖÄæs€Y0ųĀmGµČūeæž(–±C‰g|īÕ.Ćł>\^·RĻ–GzÆf±€·ØĢ~!źŲó¦,¢śvL—¬ƒ4ŸtŹĒ¢G­Õ»’ĻE_ce¢õIēw…•ö'„9_…'‚+„Ńs$ŁeƓuN·v1 c¢*‹Ö°‰ffń^JÕ§Ņ„‹nø)÷š„­Ėź()ėĘē§ōC°4>PŪ°æL}×Įk9šWµeaŚõŁū²ČB_ Ó¦'ä‚ßpŒ½Fi.cæ(ŽJ‹cPU?é¾µ&PÓü$ihŗäŒjM¶–/…Ž‘SYĘp:’ń¾G—K¼ūD%…öI&…¤°E«JŲ®‰éŹ6ĒlƎrūi j„~qä˜cæbOWå',ŸS§9nej?_;…$/ŻšÅž”Ķ°Ž }Šź“>'iŠ›æ16ŠL`•tyŌf2½œ“lQūž—AKō^>Ē–cE}µB§;]ł³—Ļć; fİø£.ņĢŚ‚ÄÄKyh°«h!æ Š·ŚÄž¹VƒēŽŠdT.[ŗU\"h>_ӀtGõŸ?f-Źķv'ģ¢*:ŹęccįÉŲäz€ėļ§śō@øµüWOc4D\ŽCņLˆˆĒO7ūOōښ|4Sˆ¢Ÿ›F¶Ė¶ļÓ·Ė–Ķ“(e©WÄ~ؒŌ™ųcH¶VxV H±—˜KQk‚¾™ÖĖ?6žL8•Š«HĖ„YÄŃō·ä• ÕčųĀŹ!«5H¬Å:Ū¤ s-ŽŽMVx‰š¢ćxŅ“=ÓŁw:“ŪyP&Ɲ»]Śö›AĆPå× NŲĀZļ£g€~éQū뜟ĒĪT?z†‘c œ\ŠģZBX-+² Z‹’Č;•)āCœŲĮŒ%W¶ 7sgš¤h®^“mŠkNYœ8Uć¹ŁLeČcåžģÜw»ĶĶC6¼„ķ³r­F÷Æ}.ø[²tõö„ó•įUnG½ó) āæK<ƗĻVN*¤ź„^ī0†Ų9Tr=éšü5¼q^‡9ŁÜY@°Säd€“²‚Ó°¾§[]fļX¬ū3D!„W})Y z8‡ ¤¾ėõWė‚ĖėēuHFå_“~<‰‘ų Āežq^8#ŒFF“N[ qi¦.Ī1ćŒrįób…Ŗæfžkś®Åż)3]}ߣˆnÆ7æ©ż źkhglYg§ Š>½­Ź_Łz©zēęĢ"glõółęA ²'īĪĻ—zjpF¾t³±.•r7Æūp:žFP*( e2Ę‹<#Õ6ós’Ÿģ\iūœOO6’€oi¹œä(Ż„‘ŒP0iéĄ6}7É1¦wtņl_—L”§’6?gź°č„”C–=¦hi‚}cYķZĆ,ė„U¢„¶‰ČUcaC¤Ŗ4æą\Ś?é ū 6ėĪÆÉip§d)óW¾7x¬6*o„byœc~ ĆČ+HĒr$_£TmSŠfå’Į¦ĶĶßP»K öĪtÜä «īD•rP–é–r^ŻrŪŕ)'xæMfœļJķ|”]̲AžŪO ™K¤’z2¢évŽŗ$ĵ —^½giB`Ń-ųV@ņYĄźĄ¹ė”=„łä,ó7ŸY[÷\Ō×s*M\)>uƒ ś3ó{_<8~–¦›¦€k`3ƒŚhMŚP+?ÓirĄßżķßęß_³)G7,-˜Åć‰>”šrCīb&‡ā#-6³YwVµ’ƒŠNōżĀV·ūd.ź$½²āsū2YļŠIŖtź|Ų9GĶ•¬Ųuū“U芒ņ”9™1ņE£fjŻ­ó cF `VĮ›€liō]ׅ“č}NqĪŠ&|1üŌž-‚Ź"Æq%Š*ĪļNīżĪĖR÷ó£SÆńhæƒfģBV,“! u•ë퉋GL¦{»OĻö§¼DČÄØśŽžé·ō»}i&¶åŖ–Ū;āI? Ü ‰Ėw*`n“śååH¬{ćøŲ )³ųp®‹Ž ’«AÆŻó†+ʋhĘŻU­¾Üß-Qx¶äŖNxBcŠ*{õšóDZ¤"&·~\z DmäĢæa§ƒĖ}ōčŃl0äÄ‚šł»€—åiį×ǐ^j“é,KŗfGŁø<žd¼$Ģļ©Ķ‡+k! ļ5ė»ĶąķjOU\QFI²ˆxwQ“§»hf½™7ß44…9Ė4£dosR®¢ŚņŌܜ5|Ьā½£Qnł˜ŌŃnŠńęf/G%ŲŽoŖNŠW§‡j(o°ä›–·­Ļ£^(`·|”B=ĘB—µĒdåKy”®2‰?P(ŗEXĪ5¹“Ó–N(Õ±7€»ģPAäĘēÆ(DPAĮvtœ±‘āš0Żł¶C9ĖōZY G©G±w8bʤ~Ńā6ĮāNĮ1©ģ‘&æĻd—ÜØuŌ VKH¼Sµ mŸÖ‹(ū»xö8KŸvļvēÆJ«ę‘|Į‘~Y±M×°hÜ,‰<]¢QƒŃ‹±|óÉ=öSŠĻüƒų؆­Ó“j@©ßQvŲŽwa) ēÖ&ø#v¦L÷ĆՉڒEäĶĖ…õ¦oŌωxcŪ?»³Ä­Ł¤eč™kĻ“ÆsķDmĘ“ź%*Æ 7øµ»"ü©4(§./›†ÅƟ%ql¬š>Ć”t™*¼<@£b` Z&±ģóń̼ øķöŠ­Ž0łŠ1śŹąż·Æ€YĀ×Ćkęņ–ąh•ó€źņČüŅ„“Gi Ī•CżĄ‘ņözļ>‡t3®’œģX3[Œą"Ä¢Gņ)pPÆ×ü’’:aÆ«üpOZW“Œß¹°Éb,•~3زdåŠ9mU _ÄW‰"ŸŽ¤˜p³/¦c(‰Å ÷šeĪQ—­RlŃ=†:p*жėAL‹ó·Ę”­‘g§į‰_Ł»ZŌ:ģ‹ļŌv‰£’.2Y Ģ>Ēx™P lsyF3vÓėm˜±*‚ŸńMøģCßVaß2 *Uw®–~K’Œx“,ŌĶ¢HyŒ‘6×3 ’|ǵzłč¦{}:*’Ŗ-ÄöĄ¶xóÉ_Kŗ”ė(=ĀK¢į—ūpČ«ä{ZHƤäķYzĒ |ń6m:?E?3«ŒĮ:+‚Å~¶“£y©Žkų#3>·Żä·¾_Vž]ūiłNjó?ŗĘ—;ī™Iģt&•LŽAčdÜȳÓqGÅLl~Eė…õ1J·v«ų:¢‹2™LKFµØ‘¦؊āUµ·1ģ čżx©õÓ²Æt#`¢„QõD?€Ūs(]k‚½kQV°ž±9„Ipģ€)]’ȓH.O%Ut_{żŲhF¾ /³Zʰļ£Tq˜yīO< šd1ᓼ3Ü“!¶7\/.Zč?&ēĮ=ł^3qČQ>č*pg“°żŚķ»·J -ČW„BT©CÅžhō+¹}ōG™³5Ī杰Ņż¹-įģ׋aæŠ%Ųgėß Ūk½JĘŻĪĻå±>Ł+³ō›`ÄīlmæĪlžŅ,“]±;Hž„ކŅöMĶRŲĖ”‚A Į–›‰ÜŲ¤¤‰OPsD»­ņąr+V£;ē“„[“CLx¶vÓ[š¤•YkŪÕ§K%aēy? ŁŽŹ§{ÆšƒżYbz•ŌīäföUA²RūŽqlŹa™Ł~…Öo8fkÖ~ē] Ž6‘3Ę\¼ŚgĄSž™Ą@mōEž'Āv‚ƒb­ŸGų©ŪāfŲ ›aR]˜,źU^u’²y³Ļ§šÜ^ZVĮ­¬¬¼Į‰vOÓņś\WIŠE Uā7t8§T³<ā/:ļ»CScwxēįŒ†c8}0™'Ŗ¬Ve° ʔ-”ŽJwpf<Ü©1?I”Zį’²Ź1f}ś `-‘ęĀż“»ä;o!½›łÖž€X®Ž'Ÿżv×=ESk—*¹¤a=8ū*“^Ą5ń6f3ĖՕ9žGYóJ.žņžMŅż¦š›ŃM3“1Ęåņ|æ·įwT.43ĮSš†IŻ_IūZÉ3-ī Į#öh åVĪA —ˆM4†~÷Šœ8)+šœŪŚĪÆBo#)„Ž©:l\ļ¦&z_č7õ2ÜįŻró¹-ÓŅč8ƒģŽŗ6'SŹm‡“?wL-8›ļ…Ö(«ŽjmŲĘ5㣶Ņrõ™›§é±œIĢ+ŠĘ“.‚\!ŌĢ¢Vķ¼Ÿ6&&½d&p7Ź€6ėWČ·»%ńV—2”ŃžĻĖ8dfČ/fņĄŁē~iKģ)ƍōKĖĖ?X'Ͱ’ĄļĚÆB›£Ī˜ĖŲ%ÖÓ»Oz/CxĆĢöŠŌrģØl#ü®Čč2Ę÷NL =ē„ČÖÖBŽb/H J39{a»LWG 0éJh0Ų{c£ģų3fÕĶ€?^%T6°Dßę焚{6^S  nR?p3™_ÖŁEĆvSūGՐo šŪ*S ŻŠÅ`x]± KÅ;Wșü™X;æō;gķ®ėÅø(›jčkGœ4"ž±Š–Ū–¬Mœ‘ŹĮno•ŁŪxr$lŹ_ßßĀv=ų;jĄūń­Ńx/Ś`o߾ׅµ)—YЉSl ę5…MĶķLäĘ5ś›“öéJ?;!Sź{īÕ‹ĖüjŌhūĘØŸĘćXŠ½±øŪjÉ€ÖøbĶ_„¶“¶ĖĢUČQ`M?ż&$VC¢ (<[ƒJ›œ™PHs4  JGÆÓčcš¬Į£“(ź{Ó@šé‹_sp…œ¬YvV¦ģ”$Į\@õŗĄų£ė•ł½<I”C¹Å7w€Äņ”d­ū6įJLæų¢ŪĄ&+ŗ] r—ФžēKhķvĶzŠæē “ yŌ,ĮLP÷»ģ-‡Ģģ×(!k2Q-"4—"F‹¼+÷üs<€¶­'eżŌCš™Ė‰8C§Jå¤uŅqRżĶ;ü_ŖÕÕŲY=® Õ{ n~–Āƒ­Ńę>VäŁ.—åZ"q/`ę7ˆ FI ĆsĒZÖ=¾Į²š W¬Č„BYKČiżEÄSUX}×4ķ#‰]ó$ „r‡RqćFi¾“ląŌ-ŗ }š«ćsr֐ßß4ņįģ{'‹HĮP˜·+~ø×ÆTś‘3ŪĮ˜ž­DņbŒĘÓļ[ÓRé„–|Jēv‚ģׄF;x„s½A6“ė¼^ƞV˜q*.K„›˜ā -4„œK~  x{‡œ?ŻŲ Šd‚(±šĄp”ټلŠo ²]æĒØrhC œj+Af›öOÉ~»‰²Žq°įĪ'ĻŚ“? 2yеÉa)A=ȾÅ09z2óu8Õež9œ8³ł•+žøŗźp1Ķl¦Ćk.ž—Ō2S. »QzŠqĆ3“Ä&šō—#Vœ¢Ķˆó|›#Ź*φČXŚ¢,īgT‚„كųĮ×nę›\éYžā½fHµā_Gž7 oź*|’=P\µ®5T‰ÉßJK~K®„œ•#{ī]óųūBæ f‡ׯr…j8óę[{ÆźXmtŒ8ę!“Įµļµ’}Å®Ū÷[eąėüDE³®Fh•Ļåų`ƒŽS^$›ßĀ’ĘvKŗA†Ō‰Ÿ7”b,^^p¦¹VŪ6&ĮĖg™ˆją‡ą¾hŁWäŽČŻ{nų,”“ŽóƁpĶS\«!:LC®jO. ĖūÜŅ&kN£|pJ6j»åĻ°Ō §`Wo=`IźśčE£Äøé S{‰•ŽøŅĖ wFål;ö.<{Ö\ūūb‡yV“ž™Ó÷£z ¹FJ|5Ā^iŃ1¶Xį³’wʘ#­DtKģüBä[“_Õņ·‚KÖvµ\pź8”ó¶9Śńō}n2ś–Q­Ą½B1"V|s>Żö(·KŲ!‘ßų…½s÷f:kĻuåąź±ORźn_(Ń>°B p ,i’+OlWµŁž^<°Xqbėƒ‰½Ė,ōJbĒj`ś1XßE]°4Ok;bØ#ó=ĻŚ“\QŠŽŠDŠ„š_9Wššõ \箚¾Į*ĮįJ†QHł1ā;õą¼yŹčĶtÆóuƒY¢ą1 1–NĒ‘ :NČ;Źi$ä¦ŪFGL™ćM冷b«@ų$ż9 sn‰N7GvxņnĆźāU¶ōĪ3ܾš 4äŅś¦Ūw‘¾ĖĆcCŽ0xIø|b„ķįÆū%­>“õ\ żŁ'(*Ā·’j™kŪtßä/>k˲V1ocµié’2 ØŌr”*õĮ:źĻX|x}I¦ Į „ £ŁžƒśE.AĒrĄÉüēųĀŪoÕŽX<ž¾qĮķ‹8āIĆŗp9d“{ō_,\<…ėy’üŅcgéLņA“ ׆=‚hņsś£ś_+\w˲uÆbō?k¾ Üč:ÄT{Lŗ`ßµjfčt Ÿ~egI/\Č ŒmŠē»zBČī”ųŌŠĻĶĻ.°ŹĢ 䏶s.āZ›[2YS¬ė†³»Q%Z³.А=JØŗš>zĮE/I*£’\ŹždGČė'ĶŚ/sŽ„ģfžŠ½KޜÜFPGSņ£„Vœ±Dyv›•"zĮ”blŸ3kjņG½¦†£Ā°µÕd3q sŹēłę9Ņ¹Ū rg=“ŸgŸr ^ķ{~K™’$×…Ķ£uGż:'Ū8m(’ėŹ\³É¦«J‘Tųńēœ2ēÓÄC’a‹”Śc+$F Œ«qŒbG¶ż‘ŪØQĮ©%ĪƜG4Ņża¤ĢĄüQ"†V„K+˦”3īĖĻWSIŸ»Nµ)Ē&.ĪŃ£Ö[„_G!ĢĄTV‚ßĘ<)9ÕMk‰wśż.įė¢AstąPč„ē ]œ”Ē«éy½Š8ęĻ3Ą ēŌH‹Xänü6IRŌRų®Ŗ× ĮöĖj4¹āHóX©“e|“jÖ㽋—_Ł4¦öΟ4 ß|åæż”ZD5Ģt}ÉvŽ97Ž3Å /ɑOŹ'){ŽČbļ ÷ēc)- š¤.?~„9š1YėģjÖ7„ņ94¬ˆiĆ”ęóģ>µohūŗ_?:IĪś÷ž\Ӛą>B€gSVĶW\A!ėū©2”ĮēO 1ubY-_v3ÉjIōąŌUtą&ŽF8€ˆ“Ē$“}Y2ASŪź:¤i ZG®æśP5‰pIłNƉ‚>-žŽL*ø‘;;’2;™’\ī§X»€ĶBØŠQńƒsüŲŻ§÷q¼*¤Œį~5؁ńĖ יĮT€Ń2}®Ė*z÷s µ‘hęO®œ%©Œ*aī–YNS‡åšżīVóq"žœ–õ'P'i~püŒ°ooė ²¹F…°£źj¾y…’¢%Yšŗł­1øŹNUz3u#¾ŌMéŖ&ęęźRg@ūłi²Ķ<ŚH­Ń—„ågJęfé(xŠ,¹¦qųÆōSÕNåYؓ†¹Ā …Ł˜Łsgßіīƒk}ý̓u ų4l÷åĮĒXćīŃżJ».[ī‡˜õ¦CōGa£Ō—kŁÆģŚi8²"•‹GhŸ… „aFy¬…öā~n˜æŽÉ`Dż rHKx•±ņHÅśÅ§7"šų‹l'v „‹5V‘ x©‹50`qÕ֛ĒőĘ}ĒQM(Ē,;TŖ°iĒØč¤cvģ™­ŅƌUĶŪ{Ń%ęļą•õėG5äˆõ5ҙƅĒnŹ Ņœ ÓSS+Š\·zŻ£_N fŠcŪøeM¼°hĄjb_^ ;ö_öp?U`ž€R6Ē—ØõJtA ‹'Pe ŁŒF•ŪĀ•JЦ(CĒ€e3Å+±ÄiΩԑ·‰Oµ«©OŌ/²ōŌõ( …vwHLoE7Ŗ’Ė)ŸJc_>%~¾ģe_tĻFŅ]:ąū^Vqœ–,ļK‘ŹžZ4ȵʅysŸeRČĆĒāŒēfø%ƒWć=Ķ1½Ę Šöģā%łŁø«Õ£HxuUކŃåį…Æ;¢ŸŹŠÖ©‡ X…c4©b6^ߛHę֌ČŪŠĆ„“DśōČ5M¹—uó¦ūtĒœä‚ē …6Ėū#9Q2–…ž~Šw‚Óņ‡õwT7²_¼®Ā£–;ON¦)ƒCÕbĶ\LÅŁ8jčvõ×;ģ•&ą\syķqؓ+}9ķ>ŅH@‹Mõ ¬ė+ØÉ+RĮ×{‘ųŗ^zšFq kŪāfzJpāW!éŗ)3’®.¼K“¢±C„7­p)§ī©?A|/)E“#ŁZOŹ;6DZЧµP¦hsĮ>e¼Ę„ŃÕ“zu‡ą{²–rŠĆqOLøz2N ņvīš!Ś¢‚›zz|Ņķdęxģma”’"+OķEĪ`ERõea”ÓsŒćbrßA>…N’nÖ4Ŗei„p€ m€U܄¢…•żģ“xŖž‘Ł\“Uæ‘ķ½ä7X·ęĻģæŲ»¤¾”łŒVF¶Lč*×½z¬<ž4»Ś2‰śĆw³Œ­ |±%cĒ[Īf‘ļ”›DŠ36[šĒ|+dž¢rr²åģż™ILk— Ķ ŲŖU |7ƒŽéŖļŽ–\9p¼ū§k•£jG®ŗ¤ˆtŸ°Ą‡xĀj{m¾:b†óK[,`‰kS½Č]¬~¹ī¼ŌÄ•%+™`œ˜OzbēŽDh‰×-÷¢LäuĪ3ī,«Ŗ$'.t,†A2£éƒžĢLgŚ^.]Ī7?i)@æ%˜óī)Ī™ ÷-;“­KpūV”²rrē•;ŖØ,S YĘ{Öšü°;“ć ¬†½Ń–‘P'n›ƒČ|Ž»‚>ōļŹļ<Ōp ”uĆdÜį £kīž›šœ0źÆ"×ÜĀ,°!ƽŻÉ’Ę^ĒŪŠ2óĮ­"‚Ø毷O(*%‡<ņõć@bd­3'']ܜū5‡v߯°£jMESš†j÷˜‡q’0rīßmÓw¹3Ÿ …Ü>L=¹yo8rT™<ų=šŹ ?ā8Ķ™ÆĻÅ”[{Ž,’“SyĄNޟŸ^Iöc)Ś„wU2n3ćoæóļ&µtu9wćŠOv9u­’ŚENoLłĶw«×sFZčéČśgP;œ.'ŠhVF)6R6 ĪӘāæćž^bņwš¤Ķ«ßóÉ^eā!_IĶ[üٶoŽwĒYn^“’›|ÆEīś’ō䁹Ü[Ÿ½ņg[G½āØÉČe]RufÄø¤rŒąŠ×8ŗń²¼³Kq€ĻÅ#®É.L„cķįŠ'œ"…ĢēĢģļ %>e=ߋy“¢÷FĆō¤›cŽI8¤ån~aµL°ņ–“é7šö3’‚ąs^3‘:åa£¦ļ5łu/¦f>bb±ŗŹĒŚTÓŁ±Ō8ķ—s°#Fč/¦Š$].<ä@ŖĘ’ąxM`rįĶu~a™F¼>ÓŃs9ZÕŗÆ•(6o·vÄāŪnśõ“ŻåW8~'aĮóæ\0Ž cGņT¾³­5µØ|?,dÓėV·F-j$„ R˜½."2V~ĆM„Æø\īé÷“[ü¹¦ļhź|*’u9ąū…Ćgoė•:pwΘ–Ü'Ż]Ō"„Ös)]KkҊūįzÜāå¾RŖńÜ4ˆųІšŃ™~Ÿ§;Ctv©Ł‰§»üz†¶p¾2*ŪLLŌ¤¹ńv}ø‡cĒU!ĖóW½Å6%Ż—“zį^KdD­­cŒ”WŁ*«¤6öš’E%BDpмµnc놄HŅäs}Ō¦Ųæo-kCøx³•Võų^{›Õ"„~›²Å¬²ÉŚĢS¢oMš‰«ųÜ­»F“6ģÅųaq~«ƒr^:š)#w8Śķ#æ»6VŁ“P=Œ4"ƒśpp„+Ń>«BßĪ …Åȼ!4@ž!»uš|·Hn-£ĻŪ<"t<;Āl ŖųÕf”č³PŲ3^”G¶ čY*ć ]Yv žĮSˆ‹žBplłŗ-AgŗX#U‡14š§!ŚdImĖD 2·_t”.k4G ¤äJtŌ%@\9xžƒ©ü£Ā…‰õŌE*̓ĘD%ŪXäa¦Ļˆ5Iōø°C4/ ˆåß2“6 ŁĶ¦VÖL¤Æ ö0śOp“¾Qøč-9хfķS-rhiL];¬=:8-łYž¢Ņ$g#}/§\§žJ&r®Š÷£©øtåŻĆ/p§Ń|/<ʳ€9¬bŻ“(źķE'ĻšöĶ„zMØĮkFoōŸ“ļ8]„YśŽ ·QŖ!Ś[#Še?ж׆F†ĶiÜeŠĄųŸ”Ąą?’ }Õō\GäųŁż —ŚÅĄ·ā»}ƒ—rJū¾t‘ē#ņ‰BD<;a ŽT3ÖVAŹč'ŚÉ%S¢C§ń%X“«Z“ų(}Åß’Q„@ endstream endobj 87 0 obj << /Type /FontDescriptor /FontName /RRHWMH+NimbusRomNo9L-ReguItal /Flags 4 /FontBBox [-169 -270 1010 924] /Ascent 668 /CapHeight 668 /Descent -193 /ItalicAngle -15 /StemV 78 /XHeight 441 /CharSet (/B/N/W/a/b/c/d/e/endash/f/g/i/k/l/m/n/o/p/period/quotedblleft/quotedblright/quoteright/r/s/t/u/w/y) /FontFile 86 0 R >> endobj 64 0 obj << /Type /Encoding /Differences [2/fi 34/quotedbl 36/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y 91/bracketleft 93/bracketright 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 147/quotedblleft/quotedblright 150/endash 152/tilde] >> endobj 46 0 obj << /Type /Font /Subtype /Type1 /BaseFont /RLYTRW+CMMI10 /FontDescriptor 73 0 R /FirstChar 60 /LastChar 60 /Widths 63 0 R >> endobj 15 0 obj << /Type /Font /Subtype /Type1 /BaseFont /USYFDZ+CMSY10 /FontDescriptor 75 0 R /FirstChar 15 /LastChar 110 /Widths 67 0 R >> endobj 33 0 obj << /Type /Font /Subtype /Type1 /BaseFont /HDWLZZ+NimbusMonL-Bold /FontDescriptor 77 0 R /FirstChar 99 /LastChar 121 /Widths 65 0 R /Encoding 64 0 R >> endobj 7 0 obj << /Type /Font /Subtype /Type1 /BaseFont /YBWWFX+NimbusMonL-Regu /FontDescriptor 79 0 R /FirstChar 34 /LastChar 152 /Widths 68 0 R /Encoding 64 0 R >> endobj 28 0 obj << /Type /Font /Subtype /Type1 /BaseFont /WMZJPH+NimbusMonL-ReguObli /FontDescriptor 81 0 R /FirstChar 78 /LastChar 121 /Widths 66 0 R /Encoding 64 0 R >> endobj 6 0 obj << /Type /Font /Subtype /Type1 /BaseFont /WIXTLK+NimbusRomNo9L-Medi /FontDescriptor 83 0 R /FirstChar 2 /LastChar 121 /Widths 69 0 R /Encoding 64 0 R >> endobj 4 0 obj << /Type /Font /Subtype /Type1 /BaseFont /WPIHJH+NimbusRomNo9L-Regu /FontDescriptor 85 0 R /FirstChar 2 /LastChar 152 /Widths 71 0 R /Encoding 64 0 R >> endobj 5 0 obj << /Type /Font /Subtype /Type1 /BaseFont /RRHWMH+NimbusRomNo9L-ReguItal /FontDescriptor 87 0 R /FirstChar 39 /LastChar 150 /Widths 70 0 R /Encoding 64 0 R >> endobj 8 0 obj << /Type /Pages /Count 6 /Parent 88 0 R /Kids [2 0 R 10 0 R 13 0 R 17 0 R 20 0 R 23 0 R] >> endobj 29 0 obj << /Type /Pages /Count 6 /Parent 88 0 R /Kids [26 0 R 31 0 R 35 0 R 38 0 R 41 0 R 44 0 R] >> endobj 50 0 obj << /Type /Pages /Count 5 /Parent 88 0 R /Kids [48 0 R 52 0 R 55 0 R 58 0 R 61 0 R] >> endobj 88 0 obj << /Type /Pages /Count 17 /Kids [8 0 R 29 0 R 50 0 R] >> endobj 89 0 obj << /Type /Catalog /Pages 88 0 R >> endobj 90 0 obj << /Producer (pdfTeX-1.40.10) /Creator (TeX) /CreationDate (D:20130202214050-06'00') /ModDate (D:20130202214050-06'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-1.40.10-2.2 (TeX Live 2009/Debian) kpathsea version 5.0.0) >> endobj xref 0 91 0000000000 65535 f 0000001212 00000 n 0000001108 00000 n 0000000015 00000 n 0000132732 00000 n 0000132900 00000 n 0000132564 00000 n 0000132227 00000 n 0000133073 00000 n 0000001646 00000 n 0000001540 00000 n 0000001313 00000 n 0000003814 00000 n 0000003707 00000 n 0000001725 00000 n 0000131919 00000 n 0000006896 00000 n 0000006789 00000 n 0000003917 00000 n 0000009989 00000 n 0000009882 00000 n 0000006999 00000 n 0000012892 00000 n 0000012785 00000 n 0000010092 00000 n 0000015723 00000 n 0000015615 00000 n 0000012995 00000 n 0000132393 00000 n 0000133180 00000 n 0000018226 00000 n 0000018118 00000 n 0000015826 00000 n 0000132060 00000 n 0000020033 00000 n 0000019925 00000 n 0000018353 00000 n 0000022884 00000 n 0000022776 00000 n 0000020159 00000 n 0000025620 00000 n 0000025512 00000 n 0000022999 00000 n 0000027600 00000 n 0000027492 00000 n 0000025712 00000 n 0000131779 00000 n 0000028954 00000 n 0000028846 00000 n 0000027715 00000 n 0000133289 00000 n 0000030735 00000 n 0000030627 00000 n 0000029069 00000 n 0000032064 00000 n 0000031956 00000 n 0000030827 00000 n 0000034329 00000 n 0000034221 00000 n 0000032167 00000 n 0000034891 00000 n 0000034783 00000 n 0000034432 00000 n 0000034982 00000 n 0000131324 00000 n 0000035006 00000 n 0000035116 00000 n 0000035310 00000 n 0000035862 00000 n 0000036338 00000 n 0000036810 00000 n 0000037259 00000 n 0000037838 00000 n 0000044858 00000 n 0000045081 00000 n 0000052889 00000 n 0000053158 00000 n 0000058526 00000 n 0000058761 00000 n 0000077565 00000 n 0000078104 00000 n 0000086439 00000 n 0000086713 00000 n 0000101348 00000 n 0000101720 00000 n 0000120361 00000 n 0000120861 00000 n 0000130991 00000 n 0000133391 00000 n 0000133464 00000 n 0000133515 00000 n trailer << /Size 91 /Root 89 0 R /Info 90 0 R /ID [<65B524F23854514DDA9189C1404C6384> <65B524F23854514DDA9189C1404C6384>] >> startxref 133781 %%EOF wyrd-1.4.6/doc/wyrdrc.50000644000175000017500000003765612103356103013353 0ustar paulpaul'\" t .\" Manual page created with latex2man on Sat Feb 2 21:40:51 CST 2013 .\" NOTE: This file is generated, DO NOT EDIT. .de Vb .ft CW .nf .. .de Ve .ft R .fi .. .TH "WYRDRC" "5" "02 February 2013" "configuration file for the Wyrd calendar application " "configuration file for the Wyrd calendar application " .SH NAME wyrdrc is the configuration textfile for the \fIwyrd\fP(1) console calendar application. .PP .SH INTRODUCTION CAUTION: while this manpage should be suitable as a quick reference, it may be subject to miscellaneous shortcomings in typesetting. The definitive documentation is the user manual provided with Wyrd in PDF format. .PP Wyrd reads a run\-configuration textfile (generally /etc/wyrdrc or /usr/local/etc/wyrdrc) to determine key bindings, color schemes, and many other settings. You can create a personalized configuration file in $HOME/.wyrdrc, and select settings that match your usage patterns. The recommended procedure is to ``include\&'' the wyrdrc file provided with Wyrd (see INCLUDING OTHER RCFILES), and add or remove settings as desired. .PP .SH WYRDRC SYNTAX You may notice that the wyrdrc syntax is similar to the syntax used in the configuration file for the Mutt email client (muttrc). .PP Within the wyrdrc file, strings should be enclosed in double quotes ("). A double quote character inside a string may be represented by \\" \&. The backslash character must be represented by doubling it (\\\\). .PP .SS INCLUDING OTHER RCFILES Syntax: include \fIfilename_string\fP .br .br This syntax can be used to include one run\-configuration file within another. This command could be used to load the default wyrdrc file (probably found in /etc/wyrdrc or /usr/local/etc/wyrdrc) within your personalized rcfile, ~/.wyrdrc \&. The filename string should be enclosed in quotes. .PP .SS SETTING CONFIGURATION VARIABLES Syntax: set \fIvariable\fP=\fIvalue_string\fP .br .br A number of configuration variables can be set using this syntax; check the CONFIGURATION VARIABLES description to see a list. The variables are unquoted, but the values should be quoted strings. .PP .SS CREATING KEY BINDINGS Syntax: bind \fIkey_identifier operation\fP .br .br This command will bind a keypress to execute a calendar operation. The various operations, which should not be enclosed in quotes, may be found in the section on CALENDAR OPERATIONS. Key identifiers may be specified by strings that represent a single keypress, for example "m" (quotes included). The key may be prefixed with "\\\\C" or "\\\\M" to represent Control or Meta (Alt) modifiers, respectively; note that the backslash must be doubled. A number of special keys lack single\-character representations, so the following strings may be used to represent them: .TP .B * "" .TP .B * "" .TP .B * "" .TP .B * "" .TP .B * "" .TP .B * "" .TP .B * "" .TP .B * "" .TP .B * "" .TP .B * "" .TP .B * "" .TP .B * "" .TP .B * "" .TP .B * "" .TP .B * "" to "" .PP Due to differences between various terminal emulators, this key identifier syntax may not be adequate to describe every keypress. As a workaround, Wyrd will also accept key identifiers in octal notation. As an example, you could use \\024 (do \fInot\fP enclose it in quotes) to represent Ctrl\-T. .PP Multiple keys may be bound to the same operation, if desired. .PP .SS REMOVING KEY BINDINGS Syntax: unbind \fIkey_identifier\fP .br .br This command will remove all bindings associated with the key identifier. The key identifiers should be defined using the syntax described in the previous section. .PP .SS SETTING THE COLOR SCHEME Syntax: color \fIobject\fP \fIforeground\fP \fIbackground\fP .br .br This command will apply the specified foreground and background colors to the appropriate object. A list of colorable objects is provided in the section on COLORABLE OBJECTS. Wyrd will recognize the following color keywords: black, red, green, yellow, blue, magenta, cyan, white, default. The default keyword allows you to choose the default foreground or background colors. If you use default for your background color, this will access the transparent background on terminal emulators which support it. .PP .SH CONFIGURATION VARIABLES The following configuration variables may be set as described in the SETTING CONFIGURATION VARIABLES section. .TP .B * remind_command .br Determines the command used to execute Remind. .TP .B * reminders_file .br Controls which Remind file (or Remind directory) Wyrd will operate on. The default is ~/.reminders \&. .TP .B * edit_old_command .br Controls the command used to edit a pre\-existing reminder. The special strings \&'%file%\&' and \&'%line%\&' will be replaced with a filename to edit and a line number to navigate to within that file. .TP .B * edit_new_command .br Controls the command used to edit a new reminder. The special character \&'%file%\&' will be replaced with a filename to edit. Ideally, this command should move the cursor to the last line of the file, where the new reminder template is created. .TP .B * edit_any_command .br Controls the command used for editing a reminder file without selecting any particular reminder. The special character \&'%file%\&' will be replaced with a filename to edit. .TP .B * timed_template .br Controls the format of the REM line created when editing a new timed reminder. The following string substitutions will be made: \&'%monname%\&' \- month name, \&'%mon%\&' \- month number, \&'%mday%\&' \- day of the month, \&'%year%\&' \- year, \&'%hour%\&' \- hour, \&'%min%\&' \- minute, \&'%wdayname%\&' \- weekday name, \&'%wday%\&' \- weekday number. .TP .B * untimed_template .br Controls the format of the REM line created when editing a new untimed reminder. The substitution syntax is the same as for timed_template. .TP .B * template\fIN\fP .br Controls the format of a generic user\-defined REM line template; \fIN\fP may range from 0 to 9. The substitution syntax is the same as for timed_template. .TP .B * busy_algorithm .br An integer value specifying which algorithm to use for measuring how busy the user is on a particular day. If busy_algorithm="1", then Wyrd will simply count the total number of reminders triggered on that day. If busy_algorithm="2", then Wyrd will count the number of hours of reminders that fall on that day. (Untimed reminders are assumed to occupy untimed_duration minutes.) .TP .B * untimed_duration .br An integer value that specifies the assumed duration of an untimed reminder, in minutes. This is used only when computing the busy level with busy_algorithm="2". .TP .B * busy_level1 .br An integer value specifying the maximum number of reminders in a day (with busy_algorithm="1") or maximum hours of reminders in a day (with busy_algorithm="2") which will be colored using the color scheme for calendar_level1. .TP .B * busy_level2 .br Same as above, using the calendar_level2 color scheme. .TP .B * busy_level3 .br Same as above, using the calendar_level2 color scheme rendered in bold. .TP .B * busy_level4 .br Same as above, using the calendar_level3 color scheme. Any day with more reminders than this will be rendered using the calendar_level3 color scheme rendered in bold. .TP .B * week_starts_monday .br A boolean value ("true" or "false") that determines the first day of the week. .TP .B * schedule_12_hour .br A boolean value that determines whether the timed reminders window is drawn using 12\- or 24\-hour time. .TP .B * selection_12_hour .br A boolean value that determines whether the selection information is drawn with 12\- or 24\-hour time. .TP .B * status_12_hour .br A boolean value that determines whether the current time is drawn using a 12\- or 24\-hour clock. .TP .B * description_12_hour .br A boolean value that determines whether reminder start and end times are drawn using 12\- or 24\-hour time in the description window. This value also controls the format of timestamps in the formatted calendars produced by view_week and view_month. .TP .B * center_cursor .br A boolean value that determines how the screen and cursor move during scrolling operations. When set to "true", the cursor is fixed in the center of the timed reminders window, and the schedule scrolls around it. When set to "false" (the default), the cursor will move up and down the schedule during scrolling operations. .TP .B * goto_big_endian .br A boolean value that determines how the the goto operation will parse dates. When set to "true", date specifiers should be in ISO 8601 (YYYYMMDD) format. When set to "false", date specifiers should be in European style DDMMYYYY format. .TP .B * quick_date_US .br A boolean value that determines how the quick_add operation will parse numeric dates with slashes, e.g. 6/1 (or 6/1/2006). When set to "true", the first number is a month and the second is the day of the month (June 1). When set to "false", these meanings of these two fields are switched (January 6). .TP .B * number_weeks .br A boolean value that determines whether or not weeks should be numbered within the month calendar window. Weeks are numbered according to the ISO 8601 standard. The ISO standard week begins on Monday, so to avoid confusion it is recommended that week_starts_monday be set to "true" when week numbering is enabled. .TP .B * home_sticky .br A boolean value that determines whether or not the cursor should "stick" to the "home" position. When this option is set to "true", then after pressing the key the cursor will automatically follow the current date and time. The effect is cancelled by pressing any of the navigation keys. .TP .B * untimed_window_width .br An integer value that determines the target width of the month\-calendar window and the untimed reminders window. The allowable range is 34 to ($COLUMNS \- 40) characters, and Wyrd will silently disregard any setting outside this range. .TP .B * advance_warning .br A boolean value that determines whether or not Wyrd should display advance warning of reminders. When set to "true", Wyrd will invoke Remind in a mode that generates advance warning of reminders as specified in the reminder file. .TP .B * untimed_bold .br A boolean value that determines whether or not Wyrd should render untimed reminders using a bold font. .PP For maximum usefulness, busy_level1 < busy_level2 < busy_level3 < busy_level4. .PP .SH CALENDAR OPERATIONS Every Wyrd operation can be made available to the interface using the syntax described in the section on CREATING KEY BINDINGS. The following is a list of every available operation. .PP .TP .B * scroll_up .br move the cursor up one element .TP .B * scroll_down .br move the cursor down one element .TP .B * next_day .br jump ahead one day .TP .B * previous_day .br jump backward one day .TP .B * next_week .br jump ahead one week .TP .B * previous_week .br jump backward one week .TP .B * next_month .br jump ahead one month .TP .B * previous_month .br jump backward one month .TP .B * home .br jump to the current date and time .TP .B * goto .br begin entering a date specifier to jump to .TP .B * zoom .br zoom in on the day schedule view (this operation is cyclic) .TP .B * edit .br edit the selected reminder .TP .B * edit_any .br edit a reminder file, without selecting any particular reminder .TP .B * scroll_description_up .br scroll the description window contents up (when possible) .TP .B * scroll_description_down .br scroll the description window contents down (when possible) .TP .B * quick_add .br add a ``quick reminder\&'' .TP .B * new_timed .br create a new timed reminder .TP .B * new_timed_dialog .br same as previous, with a reminder file selection dialog .TP .B * new_untimed .br create a new untimed reminder .TP .B * new_untimed_dialog .br same as previous, with a reminder file selection dialog .TP .B * new_template\fIN\fP .br create a new user\-defined reminder using template\fIN\fP, where \fIN\fP may range from 0 to 9 .TP .B * new_template\fIN\fP_dialog .br same as previous, with a reminder file selection dialog .TP .B * copy .br copy a reminder to Wyrd\&'s clipboard .TP .B * cut .br delete a reminder and copy it to Wyrd\&'s clipboard .TP .B * paste .br paste a reminder from Wyrd\&'s clipboard into the schedule .TP .B * paste_dialog .br same as previous, with a reminder file selection dialog .TP .B * switch_window .br switch between the day schedule window on the left, and the untimed reminder window on the right .TP .B * begin_search .br begin entering a search string .TP .B * search_next .br search for the next occurrence of the search string .TP .B * next_reminder .br jump to the next reminder .TP .B * view_remind .br view the output of remind for the selected date .TP .B * view_remind_all .br view the output of remind for the selected date, triggering all non\-expired reminders .TP .B * view_week .br view Remind\&'s formatted calendar for the week that contains the selected date (the in\-calendar timestamp formats are determined by the value of description_12_hour) .TP .B * view_month .br view Remind\&'s formatted calendar for the month that contains the selected date (the in\-calendar timestamp formats are determined by the value of description_12_hour) .TP .B * refresh .br refresh the display .TP .B * quit .br exit Wyrd .TP .B * entry_complete .br signal completion of search string entry or date specifier .TP .B * entry_backspace .br delete the last character of the search string or date specifier .TP .B * entry_cancel .br cancel entry of a search string or date specifier .PP .SH COLORABLE OBJECTS Each of Wyrd\&'s on\-screen elements may be colored by the color scheme of your choice, using the syntax defined in the section on SETTING THE COLOR SCHEME. The following is a list of all colorable objects. .TP .B * help .br the help bar at the top of the screen .TP .B * timed_default .br an empty timeslot in the day\-schedule window .TP .B * timed_current .br the current time in the day\-schedule window (if it is visible) .TP .B * timed_reminder1 .br a nonempty timeslot in the day\-schedule window, indented to level 1 .TP .B * timed_reminder2 .br a nonempty timeslot in the day\-schedule window, indented to level 2 .TP .B * timed_reminder3 .br a nonempty timeslot in the day\-schedule window, indented to level 3 .TP .B * timed_reminder4 .br a nonempty timeslot in the day\-schedule window, indented to level 4 .TP .B * untimed_reminder .br an entry in the untimed reminders window .TP .B * timed_date .br the vertical date strip at the left side of the screen .TP .B * selection_info .br the line providing date/time for the current selection .TP .B * description .br the reminder description window .TP .B * status .br the bottom bar providing current date and time .TP .B * calendar_labels .br the month and weekday labels in the calendar window .TP .B * calendar_level1 .br calendar days with low activity .TP .B * calendar_level2 .br calendar days with medium activity .TP .B * calendar_level3 .br calendar days with high activity .TP .B * calendar_today .br the current day in the calendar window (if it is visible) .TP .B * left_divider .br the vertical line to the left of the timed reminders window .TP .B * right_divider .br the vertical and horizontal lines to the right of the timed reminders window .PP .SH CONTACT INFO Wyrd author: Paul Pelzl .br Wyrd website: \fBhttp://pessimization.com/software/wyrd\fP .br Wyrd project page (bug reports, code repository, etc.): \fBhttp://launchpad.net/wyrd\fP .br .PP .SH MISCELLANEOUS ``Wyrd is a concept in ancient Anglo\-saxon and Nordic cultures roughly corresponding to fate or personal destiny.\&'' \fI\-\- Wikipedia\fP .PP .SH SEE ALSO \fIwyrd\fP(1), \fIremind\fP(1) .PP .SH AUTHOR This manpage is written by Paul J. Pelzl . .\" NOTE: This file is generated, DO NOT EDIT. wyrd-1.4.6/doc/src/0000755000175000017500000000000012103356103012521 5ustar paulpaulwyrd-1.4.6/doc/src/remove-tt.py0000644000175000017500000000065012103356067015027 0ustar paulpaul#!/usr/bin/env python # Strip out all the \texttt{} occurrences (not perfect, but good enough) import re, sys in_filename, out_filename = sys.argv[1:] tt_regex = re.compile(r'\\texttt\{([^\}]+)\}') def tt_replace(m): return m.group(1) with open(in_filename, 'r') as in_file: orig = in_file.read() replaced = tt_regex.sub(tt_replace, orig) with open(out_filename, 'w') as out_file: out_file.write(replaced) wyrd-1.4.6/doc/src/manual.tex.in0000644000175000017500000012337012103356067015144 0ustar paulpaul% Wyrd documentation % % Notes: % This document is designed to be processed with the 'latex2man' perl % script. This script has a preprocessor, which is the source of the % IF LATEX ... ELSE ... END IF comments. % "latex2man -CLATEX -L" will output pure tex source, which can be % handled either via latex or hevea. (Also, latex2man sucks. If you know % of a better tool that does the same job, I'd love to hear about it.) % Hevea has its own preprocessor, which is the source of the BEGIN LATEX % and HEVEA comments. (Hevea doesn't suck.) \documentclass[11pt,notitlepage]{article} %@% IF LATEX %@% \usepackage{times} \usepackage{fullpage} %@% ELSE %@% \usepackage{latex2man} \setVersion{1.4} %@% END-IF %@% % End preamble %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} %@% IF LATEX %@% \title{Wyrd v1.4 User Manual} \author{Paul J. Pelzl} \date{October 23, 2010} \maketitle \begin{center} \emph{``Because you're tired of waiting for your bloated calendar program to start up.''} \end{center} \tableofcontents \clearpage \section{Introduction} Wyrd is a text-based front-end to Remind, a sophisticated calendar and alarm program available from %BEGIN LATEX Roaring Penguin Software, Inc.\footnote{http://www.roaringpenguin.com/penguin/open\_source\_remind.php} %END LATEX %HEVEA \begin{rawhtml} Roaring Penguin Software, Inc. \end{rawhtml} Wyrd serves two purposes: \begin{enumerate} \item It displays reminders in a scrollable timetable view suitable for visualizing your calendar at a glance. \item It makes creating and editing reminders fast and easy. However, Wyrd does not hide Remind's textfile programmability, for this is what makes Remind a truly powerful calendaring system. \end{enumerate} Wyrd also requires only a fraction of the resources of most calendar programs available today. \section{Installation} This section describes how to install Wyrd by compiling from source. Wyrd has been packaged for a number of popular Linux/Unix variants, so you may be able to save yourself some time by installing from a package provided by your OS distribution. Wyrd is designed to be portable to most Unix-like operating systems, including GNU/Linux, *BSD, and Mac OS X. Before installing Wyrd, your system must have the following software installed: \begin{itemize} \item %BEGIN LATEX OCaml\footnote{http://caml.inria.fr} $\ge$ 3.08 %END LATEX %HEVEA \begin{rawhtml} OCaml >= 3.08 \end{rawhtml} \item %BEGIN LATEX the ncurses library\footnote{http://www.gnu.org/software/ncurses/ncurses.html} %END LATEX %HEVEA \begin{rawhtml} ncurses library \end{rawhtml} (and development headers) \item %BEGIN LATEX Remind \footnote{http://www.roaringpenguin.com/penguin/open\_source\_remind.php} $\ge$ 3.1.0 %END LATEX %HEVEA \begin{rawhtml} Remind >= 3.1.0 \end{rawhtml} \item %BEGIN LATEX GNU make\footnote{http://www.gnu.org/software/make/} %END LATEX %HEVEA \begin{rawhtml} GNU make \end{rawhtml} \item the Unix pager application, \texttt{less} \end{itemize} Wyrd may be compiled by executing the following at the root of the source tree: \begin{verbatim} ./configure make \end{verbatim} After compiling, become root and execute \begin{verbatim} make install \end{verbatim} to complete the installation process. The \texttt{make} command here should correspond to GNU make; on some systems (particularly *BSD), you may need to use \texttt{gmake}. If your ncurses library was built with wide character support, Wyrd can be configured to render UTF-8 encoded reminders. To enable this option, use the command \begin{verbatim} ./configure --enable-utf8 \end{verbatim} when configuring the sources. %@% ELSE %@% %@% IF WYRDRC %@% \begin{Name}{5}{wyrdrc}{Paul J. Pelzl}{configuration file for the Wyrd calendar application}{wyrdrc manpage} \texttt{wyrdrc} is the configuration textfile for the \Cmd{wyrd}{1} console calendar application. \end{Name} %@% ELSE %@% \begin{Name}{1}{wyrd}{Paul J. Pelzl}{a console calendar application}{Wyrd 1.4 Manpage} \Prog{wyrd} is a text-based front-end to \Cmd{remind}{1}, a sophisticated calendar and alarm program. \end{Name} \section{Synopsis} \Prog{wyrd} \oArg{OPTIONS} \oArg{FILE} \section{Description} Open the calendar and display reminders defined in FILE (and any included reminder files). The default reminder file is \Tilde /.reminders. (The FILE may also be a directory containing files with a .rem extension.) \section{Options} \begin{description} \item[\Opt{--version}] Display version information and exit. \item[\Opt{--help}] Display usage information. \item[\Opt{--add EVENT}] Add given event to reminders file and exit. \item[\Opt{--a EVENT}] Add given event to reminders file and exit. \end{description} %@% END-IF %@% %@% END-IF %@% %@% IF !WYRDRC %@% \section{Quick Start} %@% IF !LATEX %@% CAUTION: while this manpage should be suitable as a quick reference, it may be subject to miscellaneous shortcomings in typesetting. The definitive documentation is the user manual provided with Wyrd in PDF or HTML format. %@% ELSE %@% %@% END-IF %@% This section describes how to use Wyrd in its default configuration. After familiarizing yourself with the basic operations as outlined in this section, you may wish to consult %@% IF LATEX %@% Section \ref{advanced} %@% ELSE %@% the \Cmd{wyrdrc}{5} manpage %@% END-IF %@% to see how Wyrd can be configured to better fit your needs. \subsection{Overview} Before attempting to use Wyrd, learn how to use Remind. Wyrd makes no attempt to hide the details of Remind programming from the user. %@% IF LATEX %@% Aside from reading the Remind manpage, you may get some useful pointers by reading %BEGIN LATEX Mike Harris's article on 43 Folders\footnote{http://www.43folders.com/2005/02/guest\_mike\_harr.html} or David Skoll's writeup on Linux Journal\footnote{http://www.linuxjournal.com/article/3529}. The 43 Folders Wiki also has a nice section on Remind\footnote{http://wiki.43folders.com/index.php/Remind}. %END LATEX %HEVEA \begin{rawhtml} Mike Harris's article on 43 folders \end{rawhtml} %HEVEA \begin{rawhtml} or David Skoll's writeup on Linux Journal.\end{rawhtml} %HEVEA \begin{rawhtml} The 43 Folders Wiki also has a nice section on Remind.\end{rawhtml} You can launch Wyrd using the default reminder file by executing \texttt{wyrd}. If desired, a different reminder file (or reminder directory) may be selected by executing \texttt{wyrd }. %@% ELSE %@% %@% END-IF %@% At the top of the window is a short (incomplete) list of keybindings. The left window displays a scrollable timetable view, with reminders highlighted in various colors. If the \texttt{DURATION} specifier is used for a reminder, the highlighted area is rendered with an appropriate size. Overlapping reminders are rendered using one of four different indentation levels so that all reminders are at least partially visible. If the current time is visible in this window, it is highlighted in red. The upper right window displays a month calendar, with the color of each day representing the number of reminders it contains. The colors range across shades of white to blue to magenta as the number of reminders increases. The selected date is highlighted in cyan; if the current date is visible, it is highlighted in red. The lower right window displays a list of the untimed reminders falling on the selected date. The bottom window displays the full text of the \texttt{MSG} for the reminder or reminders that are currently selected. \subsection{Navigation} %@% IF LATEX %@% \begin{center} \begin{tabular}[t]{|l|l|} %@% ELSE %@% \begin{Table}{2} %@% END-IF %@% \hline Action & Keypress \\ \hline scroll up and down the schedule & \texttt{}, \texttt{} or \texttt{k}, \texttt{j} \\ jump back or forward by a day & \texttt{}, \texttt{} or \texttt{4}, \texttt{6} or \texttt{<}, \texttt{>} or \texttt{H}, \texttt{L} \\ jump back or forward by a week & \texttt{8}, \texttt{2} or \texttt{[}, \texttt{]} or \texttt{K}, \texttt{J} \\ jump back or forward by a month & \texttt{\{}, \texttt{\}} \\ jump to current date and time & \texttt{} \\ jump to the next reminder & \texttt{} \\ switch between schedule and untimed reminders window & \texttt{}, \texttt{} or \texttt{h}, \texttt{l} \\ zoom in on the schedule & \texttt{z} \\ scroll the description window up and down & \texttt{d}, \texttt{D} \\ \hline %@% IF LATEX %@% \end{tabular} \end{center} %@% ELSE %@% \end{Table} %@% END-IF %@% Notice that if you have a numeric keypad, the \{\texttt{4, 6, 8, 2}\} keys will let you move directionally in the month calendar view at the upper-right of the screen. Similarly, \{\texttt{H, J, K, L}\} will cause directional calendar movement using the standard mapping from %@% IF LATEX %@% \texttt{vi(1)}. %@% ELSE %@% \Cmd{vi}{1}. %@% END-IF %@% In addition to the hotkeys provided above, Wyrd lets you jump immediately to a desired date by pressing \texttt{'g'}, entering in a date specifier, and then pressing \texttt{}. Any of the following date specifiers may be used: \begin{itemize} \item 8 digits representing year, month, and day: YYYYMMDD \item 4 digits representing month and day (of current year): MMDD \item 2 digits representing day (of current month and year): DD \end{itemize} (The date specifier format may be changed to DDMMYYYY; consult %@% IF LATEX %@% Section \ref{variables}. %@% ELSE %@% the section on CONFIGURATION VARIABLES. %@% END-IF %@% ) \subsection{Editing Reminders} Note: By default, Wyrd is configured to modify your reminder files using the text editor specified by the \texttt{\$EDITOR} environment variable. (This configuration has been tested successfully with a number of common settings for \texttt{\$EDITOR}, including \texttt{'vim'}, \texttt{'emacs'}, and \texttt{'nano'}.) If you wish to use a different editor, see %@% IF LATEX %@% Section \ref{advanced}. %@% ELSE %@% the \Cmd{wyrdrc}{5} manpage. %@% END-IF %@% If you select a timeslot in the schedule view, then hit \texttt{'t'}, you will begin creating a new timed reminder. Wyrd will open up your reminder file in your favorite editor and move the cursor to the end of the file, where a new reminder template has been created. The template has the selected date and time filled in, so in many cases you will only need to fill in a \texttt{MSG} value. Similarly, hitting \texttt{'u'} will begin creating an untimed reminder. \texttt{'w'} will create a weekly timed reminder, and \texttt{'W'} will create a weekly untimed reminder; \texttt{'m'} will create a monthly timed reminder, and \texttt{'M'} will create a monthly untimed reminder. \texttt{'T'} and \texttt{'U'} also create timed and untimed reminders (respectively), but first will provide a selection dialog for you to choose which reminder file you want to add this reminder to. The set of reminder files is determined by scanning the \texttt{INCLUDE} lines in your default reminder file. (If you use a reminder directory, then all \texttt{*.rem} files in that directory will be available along with all \texttt{INCLUDE}d files.) If you select a reminder (either timed or untimed) and hit \texttt{}, you will begin editing that reminder. Wyrd will open up the appropriate reminders file in your editor and move the cursor to the corresponding \texttt{REM} line. If you select a timeslot that contains multiple overlapping reminders, Wyrd will provide a dialog that allows you to select the desired reminder. If you hit \texttt{} on a blank timeslot, Wyrd will begin creating a new timed or untimed reminder (depending on whether the timed or the untimed window is selected). Finally, pressing \texttt{'e'} will open the reminder file in your editor without attempting to select any particular reminder. \subsection{Quick Reminders} Wyrd offers an additional mode for entering simple reminders quickly. Press \texttt{'q'}, and you will be prompted for an event description. Simply enter a description for the event using natural language, then press \texttt{}. Examples: \begin{itemize} \item meeting with Bob tomorrow at 11 \item drop off package at 3pm \item wednesday 10am-11:30 go grocery shopping \item Board game night 20:15 next Fri \item 7/4 independence day \item 7/4/2007 independence day (next year) \item independence day (next year) on 2007-07-04 \end{itemize} If your event description can be understood, Wyrd will immediately create the reminder and scroll the display to its location. Currently the quick reminder mode tends to favor USA English conventions, as generalizing the natural language parser would require some work. Wyrd also allows you to use the "quick reminder" syntax to create new reminders from the command line, using the \texttt{-a} or \texttt{--add} options. For example, \begin{verbatim} wyrd --add "dinner with neighbors tomorrow at 7pm" \end{verbatim} would create a new reminder for tomorrow evening. When used in this mode, Wyrd exits silently with error code 0 if the reminder was successfully created. If the reminder could not be created (e.g. if the reminder syntax could not be parsed), Wyrd prints an error message and exits with a nonzero error code. \subsection{Cutting and Pasting Reminders} Reminders can be easily duplicated or rescheduled through the use of Wyrd's cutting and pasting features. Selecting a reminder and pressing \texttt{'X'} will cut that reminder: the corresponding \texttt{REM} line is deleted from your reminders file, and the reminder is copied to Wyrd's clipboard. To copy a reminder without deleting it, use \texttt{'y'} instead. To paste a reminder from the clipboard back into your schedule, just move the cursor to the desired date/time and press \texttt{'p'}. Wyrd will append a new \texttt{REM} line to the end of your reminders file, and open the file with your editor. The \texttt{REM} line will be configured to trigger on the selected date. If the copied reminder was timed, then the pasted reminder will be set to trigger at the selected time using the original \texttt{DURATION} setting. (Additional Remind settings such as \texttt{delta} and \texttt{tdelta} are not preserved by copy-and-paste.) If you wish to paste a reminder into a non-default reminders file, use \texttt{'P'}. This will spawn a selection dialog where you can choose the file that will hold the new reminder. WARNING: Cutting a reminder will delete only the single \texttt{REM} command responsible for triggering it. If you are using more complicated Remind scripting techniques to generate a particular reminder, then the \texttt{cut} operation may not do what you want. \subsection{Viewing Reminders} Aside from viewing reminders as they fall in the schedule, you can press \texttt{'r'} to view all reminders triggered on the selected date in a %@% IF LATEX %@% \texttt{less(1)} %@% ELSE %@% \Cmd{less}{1} %@% END-IF %@% window. Similarly, \texttt{'R'} will view all reminders triggered on or after the selected date (all non-expired reminders are triggered). If you want to get a more global view of your schedule, Wyrd will also let you view Remind's formatted calendar output in a %@% IF LATEX %@% \texttt{less(1)} %@% ELSE %@% \Cmd{less}{1} %@% END-IF %@% window. Pressing \texttt{'c'} will view a one-week calendar that contains the selected date, while pressing \texttt{'C'} will view a one-month calendar containing the selected date. \subsection{Searching for Reminders} Wyrd allows you to search for reminders with \texttt{MSG} values that match a search string. Press \texttt{'/'} to start entering a (case insensitive) regular expression. After the expression has been entered, press \texttt{} and Wyrd will locate the next reminder that matches the regexp. Press \texttt{'n'} to repeat the same search. Entry of a search string may be cancelled with \texttt{}. The regular expression syntax is Emacs-compatible. Note: Sorry, there is no "search backward" function. The search function requires the use of \texttt{"remind -n"}, which operates only forward in time. For the same reason, there is a command to jump forward to the next reminder, but no command to jump backward to the previous reminder. \subsection{Other Commands} A list of all keybindings may be viewed by pressing \texttt{'?'}. You can exit Wyrd by pressing \texttt{'Q'}. If the screen is corrupted for some reason, hit \texttt{'Ctrl-L'} to refresh the display. \subsection{Alarm Strategies} You may wish to generate some sort of alarm when a reminder is triggered. Wyrd does not offer any special alarm functionality, because Remind can handle the job already. Check the Remind manpage and consider how the \texttt{-k} option could be used to generate alarms with the aid of external programs. For example, the following command will generate a popup window using \texttt{gxmessage(1)} whenever a timed reminder is triggered: \begin{verbatim} remind -z -k'gxmessage -title "reminder" %s &' ~/.reminders & \end{verbatim} (A sensible way to start this alarm command is to place it in \texttt{\~{}.xinitrc} so that it launches when the X server is started.) If you want some advance warning (say, 15 minutes), you can cause Remind to trigger early by setting a \texttt{tdelta} in the AT clause: \begin{verbatim} REM Nov 27 2005 AT 14:30 +15 MSG Do something \end{verbatim} Alternatively, if you want to generate alarms only for specific reminders, consider using Remind's \texttt{RUN} command. This process could be easily automated by using the \texttt{template\emph{N}} configuration variables described in %@% IF LATEX %@% Section \ref{advanced}. %@% ELSE %@% the \Cmd{wyrdrc}{5} manpage. %@% END-IF %@% \subsection{Miscellaneous} Remind's \texttt{TAG} specifier may be used to cause Wyrd to give special treatment to certain reminders. If a reminder line includes the clause \texttt{"TAG noweight"}, then Wyrd will not give that reminder any weight when determining the ``busy level'' colorations applied to the month calendar. If a reminder line includes the clause \texttt{"TAG nodisplay"}, then Wyrd will neither display that reminder nor give it any weight when determining the month calendar colorations. The tag parameters are case insensitive. WARNING: These tag parameters are not guaranteed to interact well with other Remind front-ends such as tkremind. %@% END-IF %@% % (!WYRDRC) %@% IF LATEX || WYRDRC %@% %@% IF LATEX %@% \section{Advanced Configuration} \label{advanced} %@% ELSE %@% \section{Introduction} CAUTION: while this manpage should be suitable as a quick reference, it may be subject to miscellaneous shortcomings in typesetting. The definitive documentation is the user manual provided with Wyrd in PDF format. %@% END-IF %@% Wyrd reads a run-configuration textfile (generally \texttt{/etc/wyrdrc} or \texttt{/usr/local/etc/wyrdrc}) to determine key bindings, color schemes, and many other settings. You can create a personalized configuration file in \texttt{\$HOME/.wyrdrc}, and select settings that match your usage patterns. The recommended procedure is to ``include'' the \texttt{wyrdrc} file provided with Wyrd %@% IF LATEX %@% (see Section \ref{include}), %@% ELSE %@% (see INCLUDING OTHER RCFILES), %@% END-IF %@% and add or remove settings as desired. %@% IF LATEX %@% \subsection{\texttt{wyrdrc} Syntax} %@% ELSE %@% \section{\texttt{wyrdrc} Syntax} %@% END-IF %@% You may notice that the \texttt{wyrdrc} syntax is similar to the syntax used in the configuration file for the Mutt email client (muttrc). Within the \texttt{wyrdrc} file, strings should be enclosed in double quotes (\texttt{"}). A double quote character inside a string may be represented by %@% IF LATEX %@% \texttt{$\backslash$"} . %@% ELSE %@% \Bs " . %@% END-IF %@% The backslash character must be represented by doubling it %@% IF LATEX %@% (\texttt{$\backslash\backslash$}). %@% ELSE %@% (\Bs\Bs). %@% END-IF %@% %@% IF LATEX %@% \subsubsection{Including Other Rcfiles} \label{include} Syntax: \texttt{include \emph{filename\_string}} \\ \\ %@% ELSE %@% \subsection{Including Other Rcfiles} Syntax: include \emph{filename\_string} \\ \\ %@% END-IF %@% This syntax can be used to include one run-configuration file within another. This command could be used to load the default \texttt{wyrdrc} file (probably found in \texttt{/etc/wyrdrc} or \texttt{/usr/local/etc/wyrdrc}) within your personalized rcfile, %@% IF LATEX %@% \texttt{\~{}/.wyrdrc}. %@% ELSE %@% \Tilde /.wyrdrc . %@% END-IF %@% The filename string should be enclosed in quotes. %@% IF LATEX %@% \subsubsection{Setting Configuration Variables} \label{setvar} Syntax: \texttt{set \emph{variable}=\emph{value\_string}} \\ \\ %@% ELSE %@% \subsection{Setting Configuration Variables} Syntax: set \emph{variable}=\emph{value\_string} \\ \\ %@% END-IF %@% A number of configuration variables can be set using this syntax; check %@% IF LATEX %@% Section \ref{variables} %@% ELSE %@% the CONFIGURATION VARIABLES description %@% END-IF %@% to see a list. The variables are unquoted, but the values should be quoted strings. %@% IF LATEX %@% \subsubsection{Creating Key Bindings} \label{bindings} Syntax: \texttt{bind \emph{key\_identifier operation}} \\ \\ %@% ELSE %@% \subsection{Creating Key Bindings} Syntax: bind \emph{key\_identifier operation} \\ \\ %@% END-IF %@% This command will bind a keypress to execute a calendar operation. The various operations, which should not be enclosed in quotes, may be found in %@% IF LATEX %@% Section \ref{operationslist}. %@% ELSE %@% the section on CALENDAR OPERATIONS. %@% END-IF %@% Key identifiers may be specified by strings that represent a single keypress, for example \texttt{"m"} (quotes included). The key may be prefixed with %@% IF LATEX %@% \texttt{"$\backslash\backslash$C"} or \texttt{"$\backslash\backslash$M"} %@% ELSE %@% "\Bs\Bs C" or "\Bs\Bs M" %@% END-IF %@% to represent Control or Meta (Alt) modifiers, respectively; note that the backslash must be doubled. A number of special keys lack single-character representations, so the following strings may be used to represent them: \begin{itemize} \item \texttt{""} \item \texttt{""} \item \texttt{""} \item \texttt{""} \item \texttt{""} \item \texttt{""} \item \texttt{""} \item \texttt{""} \item \texttt{""} \item \texttt{""} \item \texttt{""} \item \texttt{""} \item \texttt{""} \item \texttt{""} \item \texttt{""} to \texttt{""} \end{itemize} Due to differences between various terminal emulators, this key identifier syntax may not be adequate to describe every keypress. As a workaround, Wyrd will also accept key identifiers in octal notation. As an example, you could use %@% IF LATEX %@% \texttt{$\backslash$024} %@% ELSE %@% \Bs 024 %@% END-IF %@% (do \emph{not} enclose it in quotes) to represent Ctrl-T. Multiple keys may be bound to the same operation, if desired. %@% IF LATEX %@% \subsubsection{Removing Key Bindings} \label{unbindings} Syntax: \texttt{unbind \emph{key\_identifier}} \\ \\ %@% ELSE %@% \subsection{Removing Key Bindings} Syntax: unbind \emph{key\_identifier} \\ \\ %@% END-IF %@% This command will remove all bindings associated with the key identifier. The key identifiers should be defined using the syntax described in the previous section. %@% IF LATEX %@% \subsubsection{Setting the Color Scheme} \label{colors} Syntax: \texttt{color \emph{object} \emph{foreground} \emph{background}} \\ \\ %@% ELSE %@% \subsection{Setting the Color Scheme} Syntax: color \emph{object} \emph{foreground} \emph{background} \\ \\ %@% END-IF %@% This command will apply the specified foreground and background colors to the appropriate object. A list of colorable objects is provided in %@% IF LATEX %@% Section \ref{colorable objects}. %@% ELSE %@% the section on COLORABLE OBJECTS. %@% END-IF %@% Wyrd will recognize the following color keywords: \texttt{black, red, green, yellow, blue, magenta, cyan, white, default}. The \texttt{default} keyword allows you to choose the default foreground or background colors. If you use \texttt{default} for your background color, this will access the transparent background on terminal emulators which support it. %@% IF LATEX %@% \subsection{Configuration Variables} \label{variables} The following configuration variables may be set as described in Section \ref{setvar}: %@% ELSE %@% \section{Configuration Variables} The following configuration variables may be set as described in the SETTING CONFIGURATION VARIABLES section. %@% END-IF %@% \begin{itemize} \item \texttt{remind\_command} \\ Determines the command used to execute Remind. \item \texttt{reminders\_file} \\ Controls which Remind file (or Remind directory) Wyrd will operate on. The default is %@% IF LATEX %@% \~{}/.reminders . %@% ELSE %@% \Tilde /.reminders . %@% END-IF %@% \item \texttt{edit\_old\_command} \\ Controls the command used to edit a pre-existing reminder. The special strings \texttt{'\%file\%'} and \texttt{'\%line\%'} will be replaced with a filename to edit and a line number to navigate to within that file. \item \texttt{edit\_new\_command} \\ Controls the command used to edit a new reminder. The special character \texttt{'\%file\%'} will be replaced with a filename to edit. Ideally, this command should move the cursor to the last line of the file, where the new reminder template is created. \item \texttt{edit\_any\_command} \\ Controls the command used for editing a reminder file without selecting any particular reminder. The special character \texttt{'\%file\%'} will be replaced with a filename to edit. \item \texttt{timed\_template} \\ Controls the format of the \texttt{REM} line created when editing a new timed reminder. The following string substitutions will be made: \texttt{'\%monname\%'} - month name, \texttt{'\%mon\%'} - month number, \texttt{'\%mday\%'} - day of the month, \texttt{'\%year\%'} - year, \texttt{'\%hour\%'} - hour, \texttt{'\%min\%'} - minute, \texttt{'\%wdayname\%'} - weekday name, \texttt{'\%wday\%'} - weekday number. \item \texttt{untimed\_template} \\ Controls the format of the \texttt{REM} line created when editing a new untimed reminder. The substitution syntax is the same as for \texttt{timed\_template}. %@% IF LATEX %@% \item \texttt{template\emph{N}} \\ %@% ELSE %@% \item template\emph{N} \\ %@% END-IF %@% Controls the format of a generic user-defined \texttt{REM} line template; \emph{N} may range from 0 to 9. The substitution syntax is the same as for \texttt{timed\_template}. \item \texttt{busy\_algorithm} \\ An integer value specifying which algorithm to use for measuring how busy the user is on a particular day. If \texttt{busy\_algorithm="1"}, then Wyrd will simply count the total number of reminders triggered on that day. If \texttt{busy\_algorithm="2"}, then Wyrd will count the number of hours of reminders that fall on that day. (Untimed reminders are assumed to occupy \texttt{untimed\_duration} minutes.) \item \texttt{untimed\_duration} \\ An integer value that specifies the assumed duration of an untimed reminder, in minutes. This is used only when computing the busy level with \texttt{busy\_algorithm="2"}. \item \texttt{busy\_level1} \\ An integer value specifying the maximum number of reminders in a day (with \texttt{busy\_algorithm="1"}) or maximum hours of reminders in a day (with \texttt{busy\_algorithm="2"}) which will be colored using the color scheme for \texttt{calendar\_level1}. \item \texttt{busy\_level2} \\ Same as above, using the \texttt{calendar\_level2} color scheme. \item \texttt{busy\_level3} \\ Same as above, using the \texttt{calendar\_level2} color scheme rendered in bold. \item \texttt{busy\_level4} \\ Same as above, using the \texttt{calendar\_level3} color scheme. Any day with more reminders than this will be rendered using the \texttt{calendar\_level3} color scheme rendered in bold. \item \texttt{week\_starts\_monday} \\ A boolean value (\texttt{"true"} or \texttt{"false"}) that determines the first day of the week. \item \texttt{schedule\_12\_hour} \\ A boolean value that determines whether the timed reminders window is drawn using 12- or 24-hour time. \item \texttt{selection\_12\_hour} \\ A boolean value that determines whether the selection information is drawn with 12- or 24-hour time. \item \texttt{status\_12\_hour} \\ A boolean value that determines whether the current time is drawn using a 12- or 24-hour clock. \item \texttt{description\_12\_hour} \\ A boolean value that determines whether reminder start and end times are drawn using 12- or 24-hour time in the description window. This value also controls the format of timestamps in the formatted calendars produced by \texttt{view\_week} and \texttt{view\_month}. \item \texttt{center\_cursor} \\ A boolean value that determines how the screen and cursor move during scrolling operations. When set to \texttt{"true"}, the cursor is fixed in the center of the timed reminders window, and the schedule scrolls around it. When set to \texttt{"false"} (the default), the cursor will move up and down the schedule during scrolling operations. \item \texttt{goto\_big\_endian} \\ A boolean value that determines how the the \texttt{goto} operation will parse dates. When set to \texttt{"true"}, date specifiers should be in ISO 8601 (YYYYMMDD) format. When set to \texttt{"false"}, date specifiers should be in European style DDMMYYYY format. \item \texttt{quick\_date\_US} \\ A boolean value that determines how the \texttt{quick\_add} operation will parse numeric dates with slashes, e.g. 6/1 (or 6/1/2006). When set to \texttt{"true"}, the first number is a month and the second is the day of the month (June 1). When set to \texttt{"false"}, these meanings of these two fields are switched (January 6). \item \texttt{number\_weeks} \\ A boolean value that determines whether or not weeks should be numbered within the month calendar window. Weeks are numbered according to the ISO 8601 standard. The ISO standard week begins on Monday, so to avoid confusion it is recommended that \texttt{week\_starts\_monday} be set to \texttt{"true"} when week numbering is enabled. \item \texttt{home\_sticky} \\ A boolean value that determines whether or not the cursor should "stick" to the "home" position. When this option is set to \texttt{"true"}, then after pressing the \texttt{} key the cursor will automatically follow the current date and time. The effect is cancelled by pressing any of the navigation keys. \item \texttt{untimed\_window\_width} \\ An integer value that determines the target width of the month-calendar window and the untimed reminders window. The allowable range is 34 to (\texttt{\$COLUMNS} - 40) characters, and Wyrd will silently disregard any setting outside this range. \item \texttt{advance\_warning} \\ A boolean value that determines whether or not Wyrd should display advance warning of reminders. When set to \texttt{"true"}, Wyrd will invoke Remind in a mode that generates advance warning of reminders as specified in the reminder file. \item \texttt{untimed\_bold} \\ A boolean value that determines whether or not Wyrd should render untimed reminders using a bold font. \end{itemize} For maximum usefulness, \texttt{busy\_level1} $<$ \texttt{busy\_level2} $<$ \texttt{busy\_level3} $<$ \texttt{busy\_level4}. %@% IF LATEX %@% \subsection{Calendar Operations} \label{operationslist} %@% ELSE %@% \section{Calendar Operations} %@% END-IF %@% Every Wyrd operation can be made available to the interface using the syntax described in %@% IF LATEX %@% Section \ref{bindings}. %@% ELSE %@% the section on CREATING KEY BINDINGS. %@% END-IF %@% The following is a list of every available operation. \begin{itemize} \item \texttt{scroll\_up} \\ move the cursor up one element \item \texttt{scroll\_down} \\ move the cursor down one element \item \texttt{next\_day} \\ jump ahead one day \item \texttt{previous\_day} \\ jump backward one day \item \texttt{next\_week} \\ jump ahead one week \item \texttt{previous\_week} \\ jump backward one week \item \texttt{next\_month} \\ jump ahead one month \item \texttt{previous\_month} \\ jump backward one month \item \texttt{home} \\ jump to the current date and time \item \texttt{goto} \\ begin entering a date specifier to jump to \item \texttt{zoom} \\ zoom in on the day schedule view (this operation is cyclic) \item \texttt{edit} \\ edit the selected reminder \item \texttt{edit\_any} \\ edit a reminder file, without selecting any particular reminder \item \texttt{scroll\_description\_up} \\ scroll the description window contents up (when possible) \item \texttt{scroll\_description\_down} \\ scroll the description window contents down (when possible) \item \texttt{quick\_add} \\ add a ``quick reminder'' \item \texttt{new\_timed} \\ create a new timed reminder \item \texttt{new\_timed\_dialog} \\ same as previous, with a reminder file selection dialog \item \texttt{new\_untimed} \\ create a new untimed reminder \item \texttt{new\_untimed\_dialog} \\ same as previous, with a reminder file selection dialog %@% IF LATEX %@% \item \texttt{new\_template\emph{N}} \\ create a new user-defined reminder using \texttt{template\emph{N}}, where %@% ELSE %@% \item new\_template\emph{N} \\ create a new user-defined reminder using template\emph{N}, where %@% END-IF %@% \emph{N} may range from 0 to 9 %@% IF LATEX %@% \item \texttt{new\_template\emph{N}\_dialog} \\ %@% ELSE %@% \item new\_template\emph{N}\_dialog \\ %@% END-IF %@% same as previous, with a reminder file selection dialog \item copy \\ copy a reminder to Wyrd's clipboard \item cut \\ delete a reminder and copy it to Wyrd's clipboard \item paste \\ paste a reminder from Wyrd's clipboard into the schedule \item paste\_dialog \\ same as previous, with a reminder file selection dialog \item \texttt{switch\_window} \\ switch between the day schedule window on the left, and the untimed reminder window on the right \item \texttt{begin\_search} \\ begin entering a search string \item \texttt{search\_next} \\ search for the next occurrence of the search string \item \texttt{next\_reminder} \\ %@% IF LATEX %@% jump to the next reminder\footnote{The \texttt{next\_reminder} operation locates reminders at the point they occur; if \texttt{advance\_warning} is enabled, \texttt{next\_reminder} will skip over any displayed warnings of an event.} %@% ELSE %@% jump to the next reminder %@% END-IF %@% \item \texttt{view\_remind} \\ view the output of \texttt{remind} for the selected date \item \texttt{view\_remind\_all} \\ view the output of \texttt{remind} for the selected date, triggering all non-expired reminders \item \texttt{view\_week} \\ view Remind's formatted calendar for the week that contains the selected date (the in-calendar timestamp formats are determined by the value of \texttt{description\_12\_hour}) \item \texttt{view\_month} \\ view Remind's formatted calendar for the month that contains the selected date (the in-calendar timestamp formats are determined by the value of \texttt{description\_12\_hour}) \item \texttt{refresh} \\ refresh the display \item \texttt{quit} \\ exit Wyrd \item \texttt{entry\_complete} \\ signal completion of search string entry or date specifier \item \texttt{entry\_backspace} \\ delete the last character of the search string or date specifier \item \texttt{entry\_cancel} \\ cancel entry of a search string or date specifier \end{itemize} %@% IF LATEX %@% \subsection{Colorable Objects} \label{colorable objects} %@% ELSE %@% \section{Colorable Objects} %@% END-IF %@% Each of Wyrd's on-screen elements may be colored by the color scheme of your choice, using the syntax defined in %@% IF LATEX %@% Section \ref{colors}. %@% ELSE %@% the section on SETTING THE COLOR SCHEME. %@% END-IF %@% The following is a list of all colorable objects. \begin{itemize} \item \texttt{help} \\ the help bar at the top of the screen \item \texttt{timed\_default} \\ an empty timeslot in the day-schedule window \item \texttt{timed\_current} \\ the current time in the day-schedule window (if it is visible) \item \texttt{timed\_reminder1} \\ a nonempty timeslot in the day-schedule window, indented to level 1 \item \texttt{timed\_reminder2} \\ a nonempty timeslot in the day-schedule window, indented to level 2 \item \texttt{timed\_reminder3} \\ a nonempty timeslot in the day-schedule window, indented to level 3 \item \texttt{timed\_reminder4} \\ a nonempty timeslot in the day-schedule window, indented to level 4 \item \texttt{untimed\_reminder} \\ an entry in the untimed reminders window \item \texttt{timed\_date} \\ the vertical date strip at the left side of the screen \item \texttt{selection\_info} \\ the line providing date/time for the current selection \item \texttt{description} \\ the reminder description window \item \texttt{status} \\ the bottom bar providing current date and time \item \texttt{calendar\_labels} \\ the month and weekday labels in the calendar window \item \texttt{calendar\_level1} \\ calendar days with low activity \item \texttt{calendar\_level2} \\ calendar days with medium activity \item \texttt{calendar\_level3} \\ calendar days with high activity \item \texttt{calendar\_today} \\ the current day in the calendar window (if it is visible) \item \texttt{left\_divider} \\ the vertical line to the left of the timed reminders window \item \texttt{right\_divider} \\ the vertical and horizontal lines to the right of the timed reminders window \end{itemize} % end WYRDRC %@% END-IF %@% %@% IF !WYRDRC %@% \section{Usage Tips} \begin{itemize} \item Wyrd fills in sensible defaults for the fields of a \texttt{REM} statement, but you will inevitably need to make some small edits to achieve the behavior you want. If you use Vim, you can make your life easier by installing the Vim-Latex Suite and then modifying your %@% IF LATEX %@% \texttt{\~{}/.wyrdrc} %@% ELSE %@% \Tilde/.wyrdrc %@% END-IF %@% to use \texttt{REM} templates like this: %@% IF LATEX %@% \texttt{set timed\_template="REM \%monname\% \%mday\% \%year\% <++>AT \%hour\%:\%min\%<++> DURATION 1:00<++> MSG \%$\backslash$"<++>\%$\backslash$" \%b"} \\ \texttt{set untimed\_template="REM \%monname\% \%mday\% \%year\% <++>MSG \%$\backslash$"<++>\%$\backslash$" \%b"} %@% ELSE %@% \texttt{set timed\_template="REM \%monname\% \%mday\% \%year\% <++>AT \%hour\%:\%min\%<++> DURATION 1:00<++> MSG \%\Bs"<++>\%\Bs" \,\%b"} \\ \texttt{set untimed\_template="REM \%monname\% \%mday\% \%year\% <++>MSG \%\Bs"<++>\%\Bs" \,\%b"} %@% END-IF %@% With this change, hitting Ctrl-J inside Vim (in insert mode) will cause your cursor to jump directly to the \texttt{<++>} markers, enabling you to quickly add any desired Remind delta and message parameters. %@% IF LATEX %@% \item The 43 Folders Wiki %BEGIN LATEX has a page on Wyrd\footnote{http://wiki.43folders.com/index.php/Wyrd}. %END LATEX %HEVEA \begin{rawhtml} has a page on Wyrd. \end{rawhtml} This is a good place to look for other usage tips. %@% END-IF %@% \end{itemize} \section{Licensing} Wyrd is Free Software; you can redistribute it and/or modify it under the terms of the GNU General Public License (GPL), Version 2, as published by the Free Software Foundation. You should have received a copy of the GPL along with this program, in the file \texttt{'COPYING'}. \section{Acknowledgments} Thanks, of course, to David Skoll for writing such a powerful reminder system. Thanks also to Nicolas George, who wrote the OCaml curses bindings used within Wyrd. %@% END-IF %@% \section{Contact info} Wyrd author: Paul Pelzl \texttt{} \\ %@% IF LATEX %@% Wyrd website: \texttt{http://pessimization.com/software/wyrd} \\ Wyrd project page (bug reports, code repository, etc.): \texttt{http://launchpad.net/wyrd} \\ %@% ELSE %@% Wyrd website: \URL{http://pessimization.com/software/wyrd} \\ Wyrd project page (bug reports, code repository, etc.): \URL{http://launchpad.net/wyrd} \\ %@% END-IF %@% \section{Miscellaneous} ``Wyrd is a concept in ancient Anglo-saxon and Nordic cultures roughly corresponding to fate or personal destiny.'' \emph{-- Wikipedia} %@% IF !LATEX && !WYRDRC %@% \section{See Also} \Cmd{wyrdrc}{5}, \Cmd{remind}{1} %@% END-IF %@% %@% IF !LATEX %@% %@% IF WYRDRC %@% \section{See Also} \Cmd{wyrd}{1}, \Cmd{remind}{1} \section{Author} This manpage is written by Paul J. Pelzl . %@% END-IF %@% \LatexManEnd %@% END-IF %@% \end{document} wyrd-1.4.6/doc/TODO0000644000175000017500000000127312103356067012436 0ustar paulpaulWyrd To-Do list ---------------------------------------------------------------------------------- * Consider incremental searching. * Consider an Orpie-like abbreviation syntax for inputting commands. * Consider a more compact "maximum zoom" view that eliminates spaces between reminders--similar to Remind's formatted calendar, but formatted vertically like Wyrd's primary display. * When LINES is sufficiently large, consider adding a bit more month context in the calendar window at the upper right. * If advance warning is enabled, improve search performance by caching reminders with advance warning suppressed. # arch-tag: DO_NOT_CHANGE_13b859a4-395f-4c00-a604-d384b6490bbc wyrd-1.4.6/doc/Makefile0000644000175000017500000000160012103356067013400 0ustar paulpaul# Wyrd documentation makefile all: manual.pdf manual.html post-build-cleanup wyrd.1 wyrdrc.5 src/manual.tex: src/manual.tex.in latex2man -CLATEX -L $< $@ manual.pdf: src/manual.tex cd src && pdflatex manual.tex && pdflatex manual.tex && pdflatex manual.tex mv src/manual.pdf . manual.html: src/manual.tex cd src && hevea -fix manual.tex mv src/manual.html . src/manual.tex.stripped: src/manual.tex.in python src/remove-tt.py $< $@ wyrd.1: src/manual.tex.stripped latex2man -M $< $@ wyrdrc.5: src/manual.tex.stripped latex2man -CWYRDRC -M $< $@ post-build-cleanup: manual.pdf manual.html wyrd.1 wyrdrc.5 cd src && rm -f *.aux *.log *.toc *.haux *.htoc *.stripped *.html manual.tex clean: rm -f manual.tex *.aux *.log *.toc *.haux *.htoc *.pdf *.html *.stripped wyrd.1 wyrdrc.5 cd src && rm -f manual.tex *.aux *.log *.toc *.haux *.htoc *.pdf *.html *.stripped wyrd.1 wyrdrc.5 wyrd-1.4.6/interface_main.ml0000644000175000017500000024260712103356067014507 0ustar paulpaul(* Wyrd -- a curses-based front-end for Remind * Copyright (C) 2005, 2006, 2007, 2008, 2010, 2011-2013 Paul Pelzl * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, Version 2, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Bug reports can be entered at http://bugs.launchpad.net/wyrd . * For anything else, feel free to contact Paul Pelzl at . *) (* interface_main.ml * This file has the bulk of the implementation of the curses-based interface, * including the main program loop that grabs keypresses and processes them. * The screen rendering code is found in interface_draw.ml . *) open Curses open Printf open Interface open Interface_draw exception Interrupt_exception exception Template_undefined of string type reminder_type_t = Timed | Untimed | General of int (*******************************************************************) (* RESIZE HANDLER *) (*******************************************************************) (* create the (new) windows corresponding to the different areas of the screen *) (* note: to get around curses issues with addch on the last character of the * last row, all windows are created one line too long. The last lines are * never used. (Is this the best way to do things?) *) let create_windows screen = let height, width = get_size () in let cal_height = 10 and cal_width = if !Rcfile.untimed_window_width < 34 then 34 else if !Rcfile.untimed_window_width > width - 40 then width - 40 else !Rcfile.untimed_window_width in let msg_height = 6 in let err_height = 1 in let timed_height = height - 1 - msg_height - err_height and timed_width = width - cal_width and untimed_height = height - 1 - msg_height - err_height - cal_height and untimed_width = cal_width in if height >= 23 then if width >= 80 then { stdscr = screen; lines = height; cols = width; help_win = newwin 2 width 0 0; hw_cols = width; timed_win = newwin (succ timed_height) timed_width 1 0; tw_lines = timed_height; tw_cols = timed_width; calendar_win = newwin (succ cal_height) cal_width 1 timed_width; cw_lines = cal_height; cw_cols = cal_width; untimed_win = newwin (succ untimed_height) untimed_width (1 + cal_height) timed_width; uw_lines = untimed_height; uw_cols = untimed_width; msg_win = newwin (succ msg_height) width (1 + timed_height) 0; mw_lines = msg_height; mw_cols = width; err_win = newwin err_height width (pred height) 0; ew_lines = err_height; ew_cols = pred width (* don't print in last line of the last column *) } else (endwin (); failwith "Wyrd requires at least an 80 column window.") else (endwin (); failwith "Wyrd requires at least a 23 line window.") (* wresize all the child windows via wresize and mvwin *) let resize_subwins iface = let height, width = get_size () in let cal_height = 10 and cal_width = if !Rcfile.untimed_window_width < 34 then 34 else if !Rcfile.untimed_window_width > width - 40 then width - 40 else 40 in let msg_height = 6 in let err_height = 1 in let timed_height = height - 1 - msg_height - err_height and timed_width = width - cal_width and untimed_height = height - 1 - msg_height - err_height - cal_height and untimed_width = cal_width in let new_scr = if height >= 23 then if width >= 80 then {iface.scr with lines = height; cols = width; hw_cols = width; tw_lines = timed_height; tw_cols = timed_width; cw_lines = cal_height; cw_cols = cal_width; uw_lines = untimed_height; uw_cols = untimed_width; mw_lines = msg_height; mw_cols = width; ew_lines = err_height; ew_cols = pred width } else (endwin (); failwith "Wyrd requires at least an 80 column window.") else (endwin (); failwith "Wyrd requires at least a 23 line window.") in assert (wresize new_scr.help_win 2 width); assert (wresize new_scr.timed_win (succ timed_height) timed_width); assert (wresize new_scr.calendar_win (succ cal_height) cal_width); assert (mvwin new_scr.calendar_win 1 timed_width); assert (wresize new_scr.untimed_win (succ untimed_height) untimed_width); assert (mvwin new_scr.untimed_win (1 + cal_height) timed_width); assert (wresize new_scr.msg_win (succ msg_height) width); assert (mvwin new_scr.msg_win (1 + timed_height) 0); assert (wresize new_scr.err_win err_height width); assert (mvwin new_scr.err_win (pred height) 0); new_scr (* Drop curses mode, invoke a function, and restore curses mode. *) let drop_curses_across (f : 'a -> 'b) (x : 'a) : 'b = def_prog_mode (); endwin (); let result = f x in reset_prog_mode (); let _ = curs_set 0 in result (* Invoke an external process as Unix.system, but loop on EINTR while waiting for process * completion. This is a workaround for the fact that SIGWINCH may be received while curses mode is * deactivated when we launch an external editor. *) let system_retry_eintr (command : string) : Unix.process_status = match Unix.fork () with | 0 -> begin try Unix.execv "/bin/sh" [| "/bin/sh"; "-c"; command |] with _ -> exit 127 end | pid -> let rec loop_eintr () = try snd (Unix.waitpid [] pid) with Unix.Unix_error (Unix.EINTR, _, _) -> loop_eintr () in loop_eintr () let drop_curses_system (command : string) : Unix.process_status = drop_curses_across system_retry_eintr command (* Parse a natural language event description and append * the result to the specified reminders file. *) let append_quick_event event_spec remfile = let (rem_spec, description) = Time_lang.parse_natural_language_event event_spec in let remline = begin match rem_spec with | Time_lang.Timed (start, finish) -> let date_s = Printf.sprintf "REM %s %d %d " (Utility.string_of_tm_mon start.Unix.tm_mon) start.Unix.tm_mday (start.Unix.tm_year + 1900) in let start_s = Printf.sprintf "AT %.2d:%.2d " start.Unix.tm_hour start.Unix.tm_min in let duration_s = if start <> finish then let (start_ts, _) = Unix.mktime start and (finish_ts, _) = Unix.mktime finish in let dur = int_of_float ((finish_ts -. start_ts) /. 60.0) in Printf.sprintf "DURATION %d:%.2d " (dur / 60) (dur mod 60) else "" in date_s ^ start_s ^ duration_s ^ "MSG " ^ description ^ "\n" | Time_lang.Untimed timespec -> let date_s = Printf.sprintf "REM %s %d %d " (Utility.string_of_tm_mon timespec.Unix.tm_mon) timespec.Unix.tm_mday (timespec.Unix.tm_year + 1900) in date_s ^ "MSG " ^ description ^ "\n" end in (* append the remline to the reminders file *) let remfile_channel = open_out_gen [Open_append; Open_creat; Open_text] 416 (Utility.expand_file remfile) in output_string remfile_channel remline; close_out remfile_channel; (rem_spec, remline) (* refresh the screen *) let handle_refresh (iface : interface_state_t) reminders = let _ = wtouchln iface.scr.help_win 0 1 true in let _ = wtouchln iface.scr.timed_win 0 iface.scr.tw_lines true in let _ = wtouchln iface.scr.calendar_win 0 iface.scr.cw_lines true in let _ = wtouchln iface.scr.untimed_win 0 iface.scr.uw_lines true in let _ = wtouchln iface.scr.msg_win 0 iface.scr.mw_lines true in draw_help iface; let new_iface = draw_timed iface reminders.Remind.all_timed in draw_date_strip new_iface; draw_calendar new_iface reminders; let new_iface = draw_untimed new_iface reminders.Remind.curr_untimed in if String.length reminders.Remind.remind_error > 0 then let _ = beep () in () else (); draw_error new_iface reminders.Remind.remind_error false; (new_iface, reminders) (* handle a curses resize *) let handle_resize (iface : interface_state_t) reminders = endwin (); begin match iface.resize_failed_win with | None -> () | Some w -> let _ = delwin w in () end; begin try let new_scr = resize_subwins iface in let resized_iface = { iface with scr = new_scr; top_untimed = 0; left_selection = if !Rcfile.center_cursor then (iface.scr.tw_lines / 2) - 1 else 1; right_selection = 1; timed_lineinfo = Array.make new_scr.tw_lines []; resize_failed_win = None } in begin try assert (curs_set 0) with _ -> () end; clear (); assert (refresh ()); handle_refresh resized_iface reminders with Failure s -> (* Create a new full-screen window where we can * paint an error message. *) let w = newwin 0 0 0 0 in erase (); let _ = mvwaddstr w 0 0 s in let _ = wnoutrefresh w in let _ = doupdate () in ({iface with resize_failed_win = Some w}, reminders) end (* Any time a new item is selected, the reminders * record needs updating and the screen need redrawing *) let handle_selection_change iface reminders track_home_setting = let new_reminders = Remind.update_reminders reminders (timestamp_of_line iface iface.left_selection) in let new_iface = draw_untimed iface new_reminders.Remind.curr_untimed in let new_iface = draw_timed new_iface new_reminders.Remind.all_timed in draw_date_strip new_iface; draw_calendar new_iface new_reminders; draw_error new_iface "" false; ({new_iface with track_home = track_home_setting}, new_reminders) (* Same as previous, but without calling draw_timed () or * draw_date_strip (). Optimization for the scrolling case. *) let handle_selection_change_scroll iface reminders track_home_setting = let new_reminders = Remind.update_reminders reminders (timestamp_of_line iface iface.left_selection) in draw_calendar iface new_reminders; let new_iface = draw_untimed iface new_reminders.Remind.curr_untimed in draw_error new_iface "" false; ({new_iface with track_home = track_home_setting}, new_reminders) (* handle a "scroll down" event when the timed window is focused * and the center_cursor option is turned on *) let handle_scrolldown_timed_center (iface : interface_state_t) reminders = let second_timestamp = timestamp_of_line iface 1 in let iface2 = { iface with top_timestamp = second_timestamp } in let (new_iface, new_reminders) = handle_selection_change_scroll iface2 reminders false in (* use a curses scroll operation to shift up the timed window *) assert (wscrl new_iface.scr.timed_win 1); (* adjust lineinfo array to compensate for scrolling *) Array.blit iface.timed_lineinfo 1 iface.timed_lineinfo 0 (pred (Array.length iface.timed_lineinfo)); (* do a two-line update to recenter the cursor *) let new_iface = draw_timed_try_window new_iface new_reminders.Remind.all_timed (iface.left_selection - 1) 2 in (* draw in the new line at the bottom of the screen *) let new_iface = draw_timed_try_window new_iface new_reminders.Remind.all_timed (iface.scr.tw_lines - 1) 1 in draw_date_strip new_iface; (new_iface, new_reminders) (* handle a "scroll down" event when the timed window is focused * and the center_cursor option is turned off *) let handle_scrolldown_timed_nocenter (iface : interface_state_t) reminders = if iface.left_selection < pred iface.scr.tw_lines then begin (* case 1: only the cursor moves *) let iface2 = { iface with left_selection = succ iface.left_selection } in let (new_iface, new_reminders) = handle_selection_change_scroll iface2 reminders false in (* make a two-line update to erase and redraw the cursor *) let new_iface = draw_timed_try_window new_iface new_reminders.Remind.all_timed iface.left_selection 2 in (new_iface, new_reminders) end else begin (* case 2: the entire timed window scrolls *) let second_timestamp = timestamp_of_line iface 1 in let iface2 = { iface with top_timestamp = second_timestamp } in let (new_iface, new_reminders) = handle_selection_change_scroll iface2 reminders false in (* use a curses scroll operation to shift up the timed window *) assert (wscrl new_iface.scr.timed_win 1); (* adjust lineinfo array to compensate for scrolling *) Array.blit iface.timed_lineinfo 1 iface.timed_lineinfo 0 (pred (Array.length iface.timed_lineinfo)); (* do a two-line update to erase the cursor and draw in the * new line at the bottom of the screen *) let new_iface = draw_timed_try_window new_iface new_reminders.Remind.all_timed (iface.scr.tw_lines - 2) 2 in draw_date_strip new_iface; (new_iface, new_reminders) end (* handle a "scroll down" event when the timed window is focused *) let handle_scrolldown_timed (iface : interface_state_t) reminders = (* watch out for y2k38 *) let selected_day = Unix.localtime (iface.top_timestamp +. (float_of_int (succ iface.left_selection)) *. (time_inc iface)) in if (selected_day.Unix.tm_year + 1900) > 2037 then begin draw_error iface "requested year is out of range." false; assert (doupdate ()); (iface, reminders) end else let iface = { iface with top_untimed = 0; top_desc = 0; right_selection = 1 } in if !Rcfile.center_cursor then handle_scrolldown_timed_center iface reminders else handle_scrolldown_timed_nocenter iface reminders (* handle a "scroll down" event when the untimed window is focused *) let handle_scrolldown_untimed (iface : interface_state_t) reminders = if iface.right_selection < pred iface.scr.uw_lines then begin if iface.right_selection < iface.len_untimed - iface.top_untimed then begin let new_iface = { iface with right_selection = succ iface.right_selection } in handle_selection_change new_iface reminders false end else (iface, reminders) end else begin if iface.right_selection < iface.len_untimed - iface.top_untimed then begin let new_iface = { iface with top_untimed = succ iface.top_untimed } in handle_selection_change new_iface reminders false end else (iface, reminders) end (* handle a "scroll up" event when the timed window is focused * and the center_cursor option is turned on *) let handle_scrollup_timed_center (iface : interface_state_t) reminders = let prev_timestamp = timestamp_of_line iface (-1) in let iface2 = { iface with top_timestamp = prev_timestamp } in let (new_iface, new_reminders) = handle_selection_change_scroll iface2 reminders false in (* use a curses scroll operation to shift up the timed window *) assert (wscrl new_iface.scr.timed_win (-1)); (* adjust lineinfo array to compensate for scrolling *) Array.blit iface.timed_lineinfo 0 iface.timed_lineinfo 1 (pred (Array.length iface.timed_lineinfo)); (* do a two-line update to recenter the cursor *) let new_iface = draw_timed_try_window new_iface new_reminders.Remind.all_timed iface.left_selection 2 in (* draw in the new top line of the schedule *) let new_iface = draw_timed_try_window new_iface new_reminders.Remind.all_timed 0 1 in draw_date_strip new_iface; (new_iface, new_reminders) (* handle a "scroll up" event when the timed window is focused * and the center_cursor option is turned off *) let handle_scrollup_timed_nocenter (iface : interface_state_t) reminders = if iface.left_selection > 0 then begin (* case 1: only the cursor moves *) let iface2 = { iface with left_selection = pred iface.left_selection } in let (new_iface, new_reminders) = handle_selection_change_scroll iface2 reminders false in (* make a two-line update to erase and redraw the cursor *) let new_iface = draw_timed_try_window new_iface new_reminders.Remind.all_timed (pred iface.left_selection) 2 in (new_iface, new_reminders) end else begin (* case 2: the entire timed window scrolls *) let prev_timestamp = timestamp_of_line iface (-1) in let iface2 = { iface with top_timestamp = prev_timestamp } in let (new_iface, new_reminders) = handle_selection_change_scroll iface2 reminders false in (* use a curses scroll operation to shift up the timed window *) assert (wscrl new_iface.scr.timed_win (-1)); (* adjust lineinfo array to compensate for scrolling *) Array.blit iface.timed_lineinfo 0 iface.timed_lineinfo 1 (pred (Array.length iface.timed_lineinfo)); (* do a two-line update to erase the cursor and draw in the * new line at the bottom of the screen *) let new_iface = draw_timed_try_window new_iface new_reminders.Remind.all_timed 0 2 in draw_date_strip new_iface; (new_iface, new_reminders) end (* handle a "scroll up" event when the timed window is focused *) let handle_scrollup_timed (iface : interface_state_t) reminders = (* watch out for scrolling out of Remind date range *) let selected_day = Unix.localtime iface.top_timestamp in if (selected_day.Unix.tm_year + 1900) < 1991 then begin draw_error iface "requested year is out of range." false; assert (doupdate ()); (iface, reminders) end else let iface = { iface with top_untimed = 0; top_desc = 0; right_selection = 1 } in if !Rcfile.center_cursor then handle_scrollup_timed_center iface reminders else handle_scrollup_timed_nocenter iface reminders (* handle a "scroll up" event when the untimed window is focused *) let handle_scrollup_untimed (iface : interface_state_t) reminders = if iface.right_selection > 1 then let new_iface = { iface with right_selection = pred iface.right_selection } in handle_selection_change new_iface reminders new_iface.track_home else if iface.top_untimed > 0 then let new_iface = { iface with top_untimed = pred iface.top_untimed } in handle_selection_change new_iface reminders new_iface.track_home else (iface, reminders) (* handle a jump to a different day *) let handle_jump (iface : interface_state_t) reminders jump_func = (* new timestamp for top line of screen *) let temp = Unix.localtime iface.top_timestamp in let next_tm = jump_func temp in let (next_ts, normalized_tm) = Unix.mktime next_tm in (* new timestamp for bottom line of screen *) let temp2 = Unix.localtime (iface.top_timestamp +. (float_of_int (succ iface.left_selection)) *. (time_inc iface)) in let next_tm2 = jump_func temp2 in let (_, normalized_tm2) = Unix.mktime next_tm2 in (* check that the date range is OK for both Remind and *nix *) if (normalized_tm.Unix.tm_year + 1900) < 1991 || (normalized_tm2.Unix.tm_year + 1900) > 2037 then begin draw_error iface "requested year is out of range." false; assert (doupdate ()); (iface, reminders) end else let new_iface = { iface with top_timestamp = next_ts; top_desc = 0 } in handle_selection_change new_iface reminders false (* handle switching window focus *) let handle_switch_focus (iface : interface_state_t) reminders = let new_iface = match iface.selected_side with |Left -> {iface with selected_side = Right} |Right -> {iface with selected_side = Left} in handle_selection_change new_iface reminders new_iface.track_home (* handle switching to the current timeslot *) let handle_home (iface : interface_state_t) reminders = let curr_time = Unix.localtime ((Unix.time ()) -. (time_inc iface)) in let (rounded_time, _) = Unix.mktime (round_time iface.zoom_level curr_time) in let new_iface = { iface with top_timestamp = if !Rcfile.center_cursor then rounded_time -. (time_inc iface) *. (float_of_int ((iface.scr.tw_lines / 2) - 2)) else rounded_time -. (time_inc iface) *. 1.; top_desc = 0; selected_side = Left; left_selection = if !Rcfile.center_cursor then (iface.scr.tw_lines / 2) - 1 else 2; right_selection = 1 } in handle_selection_change new_iface reminders true (* handle a zoom keypress *) let handle_zoom (iface : interface_state_t) reminders = let new_iface = let curr_ts = timestamp_of_line iface iface.left_selection in let curr_tm = Unix.localtime curr_ts in let hour_tm = { curr_tm with Unix.tm_sec = 0; Unix.tm_min = 0 } in let (hour_ts, _) = Unix.mktime hour_tm in match iface.zoom_level with |Hour -> let new_top = curr_ts -. (60.0 *. 30.0 *. (float_of_int iface.left_selection)) in { iface with top_timestamp = new_top; top_desc = 0; zoom_level = HalfHour } |HalfHour -> let new_top = curr_ts -. (60.0 *. 15.0 *. (float_of_int iface.left_selection)) in { iface with top_timestamp = new_top; top_desc = 0; zoom_level = QuarterHour } |QuarterHour -> let new_top = hour_ts -. (60.0 *. 60.0 *. (float_of_int iface.left_selection)) in { iface with top_timestamp = new_top; top_desc = 0; zoom_level = Hour } in if new_iface.track_home then handle_home new_iface reminders else let new_iface = draw_timed new_iface reminders.Remind.all_timed in draw_date_strip new_iface; (new_iface, reminders) (* handle creation of a new timed or untimed reminder *) let handle_new_reminder (iface : interface_state_t) reminders rem_type remfile = let ts = timestamp_of_line iface iface.left_selection in let tm = Unix.localtime ts in (* take care of the substitution characters in remline templates *) let substitute template = let rec substitute_aux subst_list s = match subst_list with |[] -> s |(regex, replacement) :: tail -> let new_s = Str.global_replace regex replacement s in substitute_aux tail new_s in substitute_aux [ (Str.regexp "%monname%", Utility.string_of_tm_mon tm.Unix.tm_mon); (Str.regexp "%mon%", string_of_int (succ tm.Unix.tm_mon)); (Str.regexp "%mday%", string_of_int tm.Unix.tm_mday); (Str.regexp "%year%", string_of_int (tm.Unix.tm_year + 1900)); (Str.regexp "%hour%", Printf.sprintf "%.2d" tm.Unix.tm_hour); (Str.regexp "%min%", Printf.sprintf "%.2d" tm.Unix.tm_min); (Str.regexp "%wdayname%", Utility.string_of_tm_wday tm.Unix.tm_wday); (Str.regexp "%wday%", string_of_int tm.Unix.tm_wday) ] template in try let remline = match rem_type with | Timed -> substitute !Rcfile.timed_template | Untimed -> substitute !Rcfile.untimed_template | General x -> let template_status = match x with | 0 -> (!Rcfile.template0, "template0") | 1 -> (!Rcfile.template1, "template1") | 2 -> (!Rcfile.template2, "template2") | 3 -> (!Rcfile.template3, "template3") | 4 -> (!Rcfile.template4, "template4") | 5 -> (!Rcfile.template5, "template5") | 6 -> (!Rcfile.template6, "template6") | 7 -> (!Rcfile.template7, "template7") | 8 -> (!Rcfile.template8, "template8") | 9 -> (!Rcfile.template9, "template9") | _ -> failwith ("unexpected template number " ^ (string_of_int x) ^ " in handle_new_reminder") in begin match template_status with | (None, template_str) -> raise (Template_undefined template_str) | (Some t, _) -> substitute t end in (* append the remline to the reminders file *) let remfile_channel = open_out_gen [Open_append; Open_creat; Open_text] 416 remfile in output_string remfile_channel remline; close_out remfile_channel; (* open the reminders file in an editor *) let filename_sub = Str.regexp "%file%" in let command = Str.global_replace filename_sub remfile !Rcfile.edit_new_command in let editor_process_status = drop_curses_system command in let r = Remind.create_three_month iface.top_timestamp in (* if the untimed list has been altered, change the focus to * the first element of the list *) let new_iface = if List.length r.Remind.curr_untimed <> List.length reminders.Remind.curr_untimed then { iface with top_untimed = 0; top_desc = 0; right_selection = 1 } else iface in begin match editor_process_status with | Unix.WEXITED return_code -> if return_code <> 0 then begin let (new_iface, r) = handle_refresh new_iface r in let _ = beep () in draw_error new_iface "Error when launching editor; configure a different editor in ~/.wyrdrc ." false; assert (doupdate ()); (new_iface, r) end else handle_refresh new_iface r | _ -> let (new_iface, r) = handle_refresh new_iface r in draw_error new_iface "Editor process was interrupted." false; assert (doupdate ()); (new_iface, r) end with Template_undefined template_str -> draw_error iface (template_str ^ " is undefined.") false; assert (doupdate ()); (iface, reminders) (* Search forward for the next occurrence of the current search regex. * * First find the date of the occurrence, by matching on the output of 'remind * -n'. For that date, recompute timed and untimed reminder lists. Filter the * timed and untimed reminder lists to get only the entries falling on the * occurrence date. Search through the filtered timed list first, and locate * the first entry that matches the regex (if any). Then search through the * filtered untimed list, and locate the first entry that matches the regex (if any). * If only one of the lists has a match, return that one; if both lists have a match, * return the one with the earlier timestamp. * Finally, reconfigure the iface record to highlight the matched entry. * * If the user has advance_warning enabled, the algorithm becomes more complicated. * After finding the correct search date, we have to locate reminders that are * present when advance warnings are *suppressed*. This is accomplished by * searching through the reminders list with advanced warning suppressed, then * searching for an *identical string* within the reminders list with advanced * warning enabled. * * The saved search regex can be ignored by providing Some regex as the * override_regex parameter. * * FIXME: This function is about five times too large. *) let handle_find_next (iface : interface_state_t) reminders override_regex = let search_regex = match override_regex with |None -> iface.search_regex |Some regex -> regex in try (* Note: selected_ts is the timestamp of the next timeslot, minus one second. * This ensures that searching begins immediately after the current * selection. *) let selected_ts = (timestamp_of_line iface (succ iface.left_selection)) -. 1.0 in let occurrence_time = Remind.find_next search_regex selected_ts in (* Reminders with advance warning included *) let no_advw_reminders= if !Rcfile.advance_warning then Remind.create_three_month ~suppress_advwarn:true occurrence_time else Remind.update_reminders reminders occurrence_time in (* Reminders with advance warning suppressed *) let advw_reminders = if !Rcfile.advance_warning then Remind.update_reminders reminders occurrence_time else no_advw_reminders in let occurrence_tm = Unix.localtime occurrence_time in let temp1 = { occurrence_tm with Unix.tm_sec = 0; Unix.tm_min = 0; Unix.tm_hour = 0 } in let temp2 = { occurrence_tm with Unix.tm_sec = 0; Unix.tm_min = 0; Unix.tm_hour = 0; Unix.tm_mday = succ occurrence_tm.Unix.tm_mday } in let (day_start_ts, _) = Unix.mktime temp1 in let (day_end_ts, _) = Unix.mktime temp2 in (* filter functions to determine reminders falling on the occurrence day *) let is_current_untimed rem = rem.Remind.ur_start >= day_start_ts && rem.Remind.ur_start < day_end_ts in let is_current_timed rem = rem.Remind.tr_start >= day_start_ts && rem.Remind.tr_start < day_end_ts in (* test the untimed reminders list, with advanced warnings enabled, * for entries that match the specified string *) let rec check_untimed_advw match_string untimed n timed_match = match untimed with |[] -> begin match timed_match with |None -> let _ = beep () in draw_error iface "search expression not found." false; assert (doupdate ()); (iface, reminders) |Some (timed_match_ts, timed_match_iface) -> handle_selection_change timed_match_iface advw_reminders false end |urem :: tail -> begin try if urem.Remind.ur_start > selected_ts && urem.Remind.ur_msg = match_string then let tm = Unix.localtime urem.Remind.ur_start in let (rounded_time, _) = Unix.mktime (round_time iface.zoom_level tm) in let new_iface = (* take care of highlighting the correct untimed reminder *) if n >= iface.scr.uw_lines then if !Rcfile.center_cursor then { iface with top_timestamp = rounded_time -. (time_inc iface) *. (float_of_int (iface.scr.tw_lines / 2 - 1)); top_untimed = n - iface.scr.uw_lines + 1; top_desc = 0; left_selection = (iface.scr.tw_lines / 2) - 1; right_selection = pred iface.scr.uw_lines; selected_side = Right } else { iface with top_timestamp = rounded_time; top_untimed = n - iface.scr.uw_lines + 1; top_desc = 0; left_selection = 0; right_selection = pred iface.scr.uw_lines; selected_side = Right } else if !Rcfile.center_cursor then { iface with top_timestamp = rounded_time -. (time_inc iface) *. (float_of_int (iface.scr.tw_lines / 2 - 1)); top_untimed = 0; top_desc = 0; left_selection = (iface.scr.tw_lines / 2) - 1 ; right_selection = n; selected_side = Right } else { iface with top_timestamp = rounded_time; top_untimed = 0; top_desc = 0; left_selection = 0; right_selection = n; selected_side = Right } in (* choose between the timed reminder match and the untimed reminder match *) begin match timed_match with |None -> handle_selection_change new_iface advw_reminders false |Some (timed_match_ts, timed_match_iface) -> if timed_match_ts < urem.Remind.ur_start then handle_selection_change timed_match_iface advw_reminders false else handle_selection_change new_iface advw_reminders false end else raise Not_found with Not_found -> check_untimed_advw match_string tail (succ n) timed_match end in (* test the untimed reminders list, with advanced warnings suppressed, * for entries that match the regex *) let rec check_untimed_no_advw untimed n timed_match = match untimed with |[] -> begin match timed_match with |None -> let _ = beep () in draw_error iface "search expression not found." false; assert (doupdate ()); (iface, reminders) |Some (timed_match_ts, timed_match_iface) -> handle_selection_change timed_match_iface advw_reminders false end |urem :: tail -> begin try if urem.Remind.ur_start > selected_ts then (* If we find a match, then look for an identical string in * the list of untimed reminders with advance warning enabled *) let _ = Str.search_forward search_regex urem.Remind.ur_msg 0 in let today_untimed_advw = List.filter is_current_untimed advw_reminders.Remind.curr_untimed in check_untimed_advw urem.Remind.ur_msg today_untimed_advw 1 timed_match else raise Not_found with Not_found -> check_untimed_no_advw tail (succ n) timed_match end in (* test the timed reminders list for entries that match the regex *) let rec check_timed timed = match timed with |[] -> let today_untimed_no_advw = List.filter is_current_untimed no_advw_reminders.Remind.curr_untimed in check_untimed_no_advw today_untimed_no_advw 1 None |trem :: tail -> begin try if trem.Remind.tr_start > selected_ts then let _ = Str.search_forward search_regex trem.Remind.tr_msg 0 in let tm = Unix.localtime trem.Remind.tr_start in let (rounded_time, _) = Unix.mktime (round_time iface.zoom_level tm) in let new_iface = if !Rcfile.center_cursor then { iface with top_timestamp = rounded_time -. (time_inc iface) *. (float_of_int (iface.scr.tw_lines / 2 - 1)); top_desc = 0; left_selection = (iface.scr.tw_lines / 2) - 1; right_selection = 1; selected_side = Left } else { iface with top_timestamp = rounded_time -. (time_inc iface) *. 2.; top_desc = 0; left_selection = 2; right_selection = 1; selected_side = Left } in let today_untimed_no_advw = List.filter is_current_untimed no_advw_reminders.Remind.curr_untimed in check_untimed_no_advw today_untimed_no_advw 1 (Some (trem.Remind.tr_start, new_iface)) else raise Not_found with Not_found -> check_timed tail end in let merged_rem = Remind.merge_timed no_advw_reminders.Remind.curr_timed in check_timed (List.filter is_current_timed merged_rem) with Remind.Occurrence_not_found -> let _ = beep () in draw_error iface "search expression not found." false; (iface, reminders) (* Begin entry of a search string *) let handle_begin_search (iface : interface_state_t) reminders = let new_iface = { iface with entry_mode = Extended ExtendedSearch } in draw_error iface "search expression: " true; (new_iface, reminders) (* Find the next reminder after the current selection. * This algorithm is a dirty hack, but actually seems to work: * 1) If an untimed reminder is selected, and if it is not the last * untimed reminder in the list, then highlight the next untimed reminder. * 2) Otherwise, run find_next with a regexp that matches anything. *) let handle_next_reminder (iface : interface_state_t) reminders = if iface.selected_side = Right && iface.right_selection < iface.len_untimed - iface.top_untimed then if !Rcfile.advance_warning then begin (* Compute the list of untimed reminders currently displayed to the user *) let displayed_reminders = Remind.get_untimed_reminders_for_day reminders.Remind.curr_untimed (timestamp_of_line iface iface.left_selection) in (* Compute the same list, with advance warnings suppressed *) let displayed_reminders_no_advw = let reminders_no_advw = Remind.create_three_month ~suppress_advwarn:true (timestamp_of_line iface iface.left_selection) in Remind.get_untimed_reminders_for_day reminders_no_advw.Remind.curr_untimed (timestamp_of_line iface iface.left_selection) in (* Index of currently selected reminder within displayed_reminders *) let selection_index = iface.right_selection + iface.top_untimed in (* Simultaneously iterate through the two lists until we reach * the currently selected element. Theoretically displayed_reminders is a * superset of displayed_reminders_no_advw with ordering preserved, so we * should be able to match identical elements as we go. *) let rec iter_match superset subset n prev_iface prev_rem = match superset with | [] -> (* Some sort of search failure. Just skip over today's untimed * reminders. *) handle_find_next iface reminders (Some (Str.regexp "")) | superset_head :: superset_tail -> begin match subset with | [] -> (* Ran out of reminders in the list with advance warning * suppressed. Therefore we can skip over untimed reminders. *) handle_find_next iface reminders (Some (Str.regexp "")) | subset_head :: subset_tail -> if n > selection_index then let (next_iface, next_rem) = handle_scrolldown_untimed prev_iface prev_rem in if superset_head = subset_head then (* This should be the correct element. End here. *) (next_iface, next_rem) else (* Keep searching forward through superset list * to try to locate this element. *) iter_match superset_tail subset (succ n) next_iface next_rem else if superset_head = subset_head then begin (* Iterate both... *) iter_match superset_tail subset_tail (succ n) prev_iface prev_rem end else begin (* Iterate superset only *) iter_match superset_tail subset (succ n) prev_iface prev_rem end end in iter_match displayed_reminders displayed_reminders_no_advw 1 iface reminders end else (* Easy case. If the user has not selected advance warning, we can just * scroll down the untimed reminders window. *) handle_scrolldown_untimed iface reminders else handle_find_next iface reminders (Some (Str.regexp "")) (* View the reminders for the selected date using 'less'. * If 'trigger_all' is true, then all nonexpired reminders are * triggered. *) let handle_view_reminders (iface : interface_state_t) reminders trigger_all = let ts = timestamp_of_line iface iface.left_selection in let tm = Unix.localtime ts in let rem_date_str = (Utility.string_of_tm_mon tm.Unix.tm_mon) ^ " " ^ (string_of_int tm.Unix.tm_mday) ^ " " ^ (string_of_int (tm.Unix.tm_year + 1900)) in let partial_command = if trigger_all then !Rcfile.remind_command ^ " -q -g -t " else !Rcfile.remind_command ^ " -q -g " in let command = partial_command ^ !Rcfile.reminders_file ^ " " ^ rem_date_str ^ " | less -c" in let _ = drop_curses_system command in handle_refresh iface reminders (* View Remind's formatted calendar output for the selected date. If * 'week_only' is true, then create a week calendar, otherwise a month * calendar. *) let handle_view_calendar (iface : interface_state_t) reminders week_only = let ts = timestamp_of_line iface iface.left_selection in let tm = Unix.localtime ts in let rem_date_str = (Utility.string_of_tm_mon tm.Unix.tm_mon) ^ " " ^ (string_of_int tm.Unix.tm_mday) ^ " " ^ (string_of_int (tm.Unix.tm_year + 1900)) in let partial_command = if week_only then Printf.sprintf "%s -c+1 -w%d " !Rcfile.remind_command iface.scr.cols else Printf.sprintf "%s -c -w%d " !Rcfile.remind_command iface.scr.cols in let time_option = if !Rcfile.description_12_hour then "-b0 " else "-b1 " in let weekday_option = if !Rcfile.week_starts_monday then "-m " else "" in let command = partial_command ^ time_option ^ weekday_option ^ !Rcfile.reminders_file ^ " " ^ rem_date_str ^ " | less -c" in let _ = drop_curses_system command in handle_refresh iface reminders let handle_view_keybindings (iface : interface_state_t) reminders = let bindings = ref [] in let find_binding commandstr operation = match operation with |Rcfile.CommandOp command -> begin try let key_str = Hashtbl.find Rcfile.table_command_key command in bindings := (Printf.sprintf "%-30s%-20s\n" commandstr key_str) :: !bindings with Not_found -> bindings := (Printf.sprintf "%-30s\n" commandstr) :: !bindings end |Rcfile.EntryOp entry -> begin try let key_str = Hashtbl.find Rcfile.table_entry_key entry in bindings := (Printf.sprintf "%-30s%-20s\n" commandstr key_str) :: !bindings with Not_found -> bindings := (Printf.sprintf "%-30s\n" commandstr) :: !bindings end in Hashtbl.iter find_binding Rcfile.table_commandstr_command; let sorted_list = List.fast_sort Pervasives.compare !bindings in def_prog_mode (); endwin (); let out_channel = Unix.open_process_out "less" in List.iter (output_string out_channel) sorted_list; flush out_channel; let _ = Unix.close_process_out out_channel in reset_prog_mode (); begin try assert (curs_set 0) with _ -> () end; handle_refresh iface reminders (* Handle scrolling down during selection dialog loop *) let handle_selection_dialog_scrolldown (elements : string list) (selection : int) (top : int) = if selection < pred (List.length elements) then let lines, cols = get_size () in let new_selection = succ selection in let new_top = if new_selection - top >= pred lines then succ top else top in (new_selection, new_top) else (selection, top) (* Handle scrolling up during selection dialog loop *) let handle_selection_dialog_scrollup (elements : string list) (selection : int) (top : int) = if selection > 0 then let new_selection = pred selection in let new_top = if new_selection < top then pred top else top in (new_selection, new_top) else (selection, top) (* Begin a selection dialog loop *) let do_selection_dialog (iface : interface_state_t) (title : string) (elements : string list) = let init_selection = 0 and init_top = 0 in let rec selection_loop (selection, top) = draw_selection_dialog iface title elements selection top; let key = wgetch iface.scr.help_win in (* trap the wgetch timeout *) if key <> ~-1 then try match Rcfile.command_of_key key with |Rcfile.ScrollDown -> selection_loop (handle_selection_dialog_scrolldown elements selection top) |Rcfile.ScrollUp -> selection_loop (handle_selection_dialog_scrollup elements selection top) |Rcfile.Edit -> List.nth elements selection |_ -> let _ = beep () in selection_loop (selection, top) with Not_found -> let _ = beep () in selection_loop (selection, top) else selection_loop (selection, top) in selection_loop (init_selection, init_top) (* handle editing the selected reminder *) let handle_edit (iface : interface_state_t) reminders = let adjust_s len s = let pad = s ^ (String.make len ' ') in Utility.utf8_string_before pad len in let fl = match iface.selected_side with |Left -> begin match iface.timed_lineinfo.(iface.left_selection) with | [] -> None | tline :: [] -> Some (tline.tl_filename, tline.tl_linenum, tline.tl_msg) | rem_list -> let sorted_rem_list = List.fast_sort sort_lineinfo rem_list in let get_msg tline = (adjust_s 16 tline.tl_timestr) ^ tline.tl_msg in let msg_list = List.rev_map get_msg sorted_rem_list in let selected_msg = do_selection_dialog iface "Choose a reminder to edit" msg_list in let test_msg_match tline = ((adjust_s 16 tline.tl_timestr) ^ tline.tl_msg) = selected_msg in let tline = (List.find test_msg_match sorted_rem_list) in Some (tline.tl_filename, tline.tl_linenum, tline.tl_msg) end |Right -> begin match iface.untimed_lineinfo.(iface.right_selection) with | Some uline -> Some (uline.ul_filename, uline.ul_linenum, uline.ul_msg) | None -> None end in begin match fl with |None -> let (main_remfile, _) = Remind.get_all_remfiles () in if iface.selected_side = Left then handle_new_reminder iface reminders Timed main_remfile else handle_new_reminder iface reminders Untimed main_remfile |Some (filename, line_num, msg) -> let filename_sub = Str.regexp "%file%" in let lineno_sub = Str.regexp "%line%" in let command_partial = Str.global_replace filename_sub filename !Rcfile.edit_old_command in let command = Str.global_replace lineno_sub line_num command_partial in let _ = drop_curses_system command in let r = Remind.create_three_month iface.top_timestamp in (* if the untimed list has been altered, change the focus * to the first element *) let new_iface = if List.length r.Remind.curr_untimed <> List.length reminders.Remind.curr_untimed then { iface with top_untimed = 0; top_desc = 0; right_selection = 1 } else iface in handle_refresh new_iface r end (* handle free editing of the reminders file *) let handle_edit_any (iface : interface_state_t) reminders remfile = let filename_sub = Str.regexp "%file%" in let command = Str.global_replace filename_sub remfile !Rcfile.edit_any_command in let _ = drop_curses_system command in let r = Remind.create_three_month iface.top_timestamp in (* if the untimed list has been altered, change the focus * to the first element *) let new_iface = if List.length r.Remind.curr_untimed <> List.length reminders.Remind.curr_untimed then { iface with top_untimed = 0; top_desc = 0; right_selection = 1 } else iface in handle_refresh new_iface r (* handle scrolling the description window up *) let handle_scroll_desc_up iface reminders = let new_iface = {iface with top_desc = succ iface.top_desc} in handle_refresh new_iface reminders (* handle scrolling the description window down *) let handle_scroll_desc_down iface reminders = let top = max 0 (pred iface.top_desc) in let new_iface = {iface with top_desc = top} in handle_refresh new_iface reminders (* auxiliary function for the following *) let handle_copy_reminder_aux iface reminders copy_only = let adjust_s len s = let pad = s ^ (String.make len ' ') in Utility.utf8_string_before pad len in let fl = match iface.selected_side with |Left -> begin match iface.timed_lineinfo.(iface.left_selection) with | [] -> None | tline :: [] -> Some (tline.tl_filename, tline.tl_linenum) | rem_list -> let sorted_rem_list = List.fast_sort sort_lineinfo rem_list in let get_msg tline = (adjust_s 16 tline.tl_timestr) ^ tline.tl_msg in let msg_list = List.rev_map get_msg sorted_rem_list in let selected_msg = let dialog_msg = if copy_only then "Choose a reminder to copy" else "Choose a reminder to cut" in do_selection_dialog iface dialog_msg msg_list in let _ = handle_refresh iface reminders in let test_msg_match tline = ((adjust_s 16 tline.tl_timestr) ^ tline.tl_msg) = selected_msg in let tline = (List.find test_msg_match sorted_rem_list) in Some (tline.tl_filename, tline.tl_linenum) end |Right -> begin match iface.untimed_lineinfo.(iface.right_selection) with |Some uline -> Some (uline.ul_filename, uline.ul_linenum) |None -> None end in begin match fl with |None -> let _ = beep () in draw_error iface "no reminder is selected." false; assert (doupdate ()); (iface, fl) |Some (filename, line_num_str) -> let in_channel = open_in filename in let cont_regex = Str.regexp ".*\\(\\\\\\)$" in begin try (* grab a copy of the specified line *) let line = ref "" in for curr_line = 1 to int_of_string line_num_str do (* concatenate lines with trailing backslashes *) if Str.string_match cont_regex !line 0 then let bs_loc = Str.group_beginning 1 in line := (Str.string_before !line bs_loc) ^ (input_line in_channel) else line := input_line in_channel done; close_in in_channel; (* break the REM line up into chunks corresponding to the different fields *) let rem_kw_regex = Str.regexp ("\\(REM\\|PRIORITY\\|SKIP\\|BEFORE\\|AFTER\\|" ^ "OMIT\\|AT\\|SCHED\\|WARN\\|UNTIL\\|SCANFROM\\|DURATION\\|TAG\\|" ^ "MSG\\|MSF\\|RUN\\|CAL\\|SATISFY\\|SPECIAL\\|PS\\|PSFILE\\)") in let rem_chunks = Str.full_split rem_kw_regex !line in (* merge the chunks back together, but replace the REM and AT clauses * with special markers *) let rec merge_chunks chunks s found_rem = match chunks with | [] -> if found_rem then s else "REMREPLACE " ^ s | (Str.Delim "REM") :: (Str.Text datespec) :: tail -> merge_chunks tail (s ^ "REMREPLACE") true | (Str.Delim "REM") :: tail -> merge_chunks tail (s ^ "REMREPLACE") true | (Str.Delim "AT") :: (Str.Text timespec) :: tail -> merge_chunks tail (s ^ "ATREPLACE") found_rem | (Str.Delim "AT") :: tail -> merge_chunks tail (s ^ "ATREPLACE") found_rem | (Str.Delim x) :: tail -> merge_chunks tail (s ^ x) found_rem | (Str.Text x) :: tail -> merge_chunks tail (s ^ x) found_rem in let marked_remline = merge_chunks rem_chunks "" false in let new_iface = {iface with rem_buffer = marked_remline} in if copy_only then begin draw_error iface "copied reminder to clipboard." false; assert (doupdate ()); end else (); (new_iface, fl) with |End_of_file -> close_in in_channel; let _ = beep () in draw_error iface "error while copying reminder." false; assert (doupdate ()); (iface, fl) |_ -> let _ = beep () in draw_error iface "unable to parse selected reminder." false; assert (doupdate ()); (iface, fl) end end (* handle copying a reminder string to the buffer *) let handle_copy_reminder iface reminders copy_only = let new_iface, _ = handle_copy_reminder_aux iface reminders copy_only in (new_iface, reminders) (* handle pasting a reminder into a new location *) let handle_paste_reminder (iface : interface_state_t) reminders remfile = let ts = timestamp_of_line iface iface.left_selection in let tm = Unix.localtime ts in let rem_datespec = "REM " ^ Utility.string_of_tm_mon tm.Unix.tm_mon ^ " " ^ string_of_int tm.Unix.tm_mday ^ " " ^ string_of_int (tm.Unix.tm_year + 1900) ^ " " and at_timespec = "AT " ^ Printf.sprintf "%.2d" tm.Unix.tm_hour ^ ":" ^ Printf.sprintf "%.2d" tm.Unix.tm_min ^ " " in (* replace REMREPLACE and ATREPLACE keywords by sensible REM and * AT clauses corresponding to the selected date and time *) let rem_regex = Str.regexp "REMREPLACE" in let at_regex = Str.regexp "ATREPLACE" in let temp = Str.replace_first rem_regex rem_datespec iface.rem_buffer in let new_remline = Str.replace_first at_regex at_timespec temp in (* paste into the reminders file *) let remfile_channel = open_out_gen [Open_append; Open_creat; Open_text] 416 remfile in output_string remfile_channel new_remline; close_out remfile_channel; (* open reminders file in editor *) let filename_sub = Str.regexp "%file%" in let command = Str.global_replace filename_sub remfile !Rcfile.edit_new_command in let _ = drop_curses_system command in let r = Remind.create_three_month iface.top_timestamp in (* if the untimed list has been altered, change the focus to * the first element of the list *) let new_iface = if List.length r.Remind.curr_untimed <> List.length reminders.Remind.curr_untimed then { iface with top_untimed = 0; top_desc = 0; right_selection = 1 } else iface in handle_refresh new_iface r (* handle cutting a reminder and dropping it in the clipboard *) let handle_cut_reminder iface reminders = let (iface, fl) = handle_copy_reminder_aux iface reminders false in begin match fl with |None -> (iface, reminders) |Some (filename, line_num_str) -> let in_channel = open_in filename in let cont_regex = Str.regexp ".*\\(\\\\\\)$" in (* load in the file, but skip over the selected reminder *) let rec process_in_lines lines continuations line_num = try let line = input_line in_channel in if line_num = int_of_string line_num_str then (* throw out any continued lines *) process_in_lines lines [] (succ line_num) else if Str.string_match cont_regex line 0 then (* if there's a backslash, buffer the line in continuations list *) process_in_lines lines (line :: continuations) (succ line_num) else (* if there's no backslash, go ahead and dump the continuations list * into the list of lines to write *) process_in_lines (line :: (continuations @ lines)) [] (succ line_num) with End_of_file -> close_in in_channel; List.rev lines in let remaining_lines = process_in_lines [] [] 1 in let out_channel = open_out filename in (* write out the new file *) let rec write_lines lines = begin match lines with | [] -> close_out out_channel | line :: tail -> output_string out_channel (line ^ "\n"); write_lines tail end in write_lines remaining_lines; let r = Remind.create_three_month iface.top_timestamp in (* if the untimed list has been altered, change the focus to * the first element of the list *) let new_iface = if List.length r.Remind.curr_untimed <> List.length reminders.Remind.curr_untimed then { iface with top_untimed = 0; top_desc = 0; right_selection = 1 } else iface in let final_iface, _ = handle_refresh new_iface r in draw_error final_iface "cut reminder to clipboard." false; assert (doupdate ()); (final_iface, r) end (* handle jumping to a specified date *) let handle_goto (iface : interface_state_t) reminders = let tm = Unix.localtime (Unix.time () -. (time_inc iface)) in let len = String.length iface.extended_input in if not (List.mem len [2; 4; 8]) then failwith "length must be 2, 4, or 8 characters." else begin let (year_s, month_s, day_s) = if !Rcfile.goto_big_endian then if len = 8 then ( String.sub iface.extended_input 0 4, String.sub iface.extended_input 4 2, String.sub iface.extended_input 6 2 ) else if len = 4 then ( string_of_int (tm.Unix.tm_year + 1900), String.sub iface.extended_input 0 2, String.sub iface.extended_input 2 2 ) else ( string_of_int (tm.Unix.tm_year + 1900), string_of_int (tm.Unix.tm_mon + 1), iface.extended_input ) else if len = 8 then ( String.sub iface.extended_input 4 4, String.sub iface.extended_input 2 2, String.sub iface.extended_input 0 2 ) else if len = 4 then ( string_of_int (tm.Unix.tm_year + 1900), String.sub iface.extended_input 2 2, String.sub iface.extended_input 0 2 ) else ( string_of_int (tm.Unix.tm_year + 1900), string_of_int (tm.Unix.tm_mon + 1), iface.extended_input ) in let year = (int_of_string year_s) - 1900 and month = (int_of_string month_s) - 1 and day = int_of_string day_s in let jump_time = { tm with Unix.tm_year = year; Unix.tm_mon = month; Unix.tm_mday = day } in let (rounded_time, rt) = try Unix.mktime (round_time iface.zoom_level jump_time) with _ -> failwith "requested date is out of range." in if (rt.Unix.tm_year + 1900) < 1991 || (rt.Unix.tm_year + 1900) > 2037 then failwith "requested year is out of range." else if rt.Unix.tm_mon <> jump_time.Unix.tm_mon then failwith "requested month is out of range." else if rt.Unix.tm_mday <> jump_time.Unix.tm_mday then failwith "requested day of the month is out of range." else (); let new_iface = { iface with top_timestamp = if !Rcfile.center_cursor then rounded_time -. (time_inc iface) *. (float_of_int ((iface.scr.tw_lines / 2) - 2)) else rounded_time -. (time_inc iface) *. 1.; top_desc = 0; selected_side = Left; left_selection = if !Rcfile.center_cursor then (iface.scr.tw_lines / 2) - 1 else 2; right_selection = 1; entry_mode = Normal; extended_input = "" } in handle_selection_change new_iface reminders false end (* Begin entry of a date/time to navigate to *) let handle_begin_goto (iface : interface_state_t) reminders = let new_iface = { iface with entry_mode = Extended ExtendedGoto } in if !Rcfile.goto_big_endian then draw_error iface "go to date [[YYYY]MM]DD: " true else draw_error iface "go to date DD[MM[YYYY]]: " true; (new_iface, reminders) (* Handle creation of a quick event *) let handle_quick_event (iface : interface_state_t) reminders remfile = try let (rem_spec, remline) = append_quick_event iface.extended_input remfile in (* navigate to the new reminder *) let (is_timed, start) = match rem_spec with | Time_lang.Timed (x, _) -> (true, x) | Time_lang.Untimed x -> (false, x) in let rounded_time = let rt_shift = if is_timed then let (x, _) = Unix.mktime (round_time iface.zoom_level start) in x else let (x, _) = Unix.mktime (round_time iface.zoom_level {start with Unix.tm_hour = 8}) in x in rt_shift -. (time_inc iface) in let r = Remind.create_three_month iface.top_timestamp in let new_iface = { iface with top_timestamp = if !Rcfile.center_cursor then rounded_time -. (time_inc iface) *. (float_of_int ((iface.scr.tw_lines / 2) - 2)) else rounded_time -. (time_inc iface) *. 1.; top_desc = 0; selected_side = if is_timed then Left else Right; left_selection = if !Rcfile.center_cursor then (iface.scr.tw_lines / 2) - 1 else 2; right_selection = 1; entry_mode = Normal; extended_input = "" } in handle_selection_change new_iface r false with Time_lang.Event_parse_error s -> failwith s (* Begin entry of a quick event *) let handle_begin_quick_event (iface : interface_state_t) reminders = let new_iface = { iface with entry_mode = Extended ExtendedQuick } in draw_error iface "event description: " true; (new_iface, reminders) (* handle keyboard input for a hotkey, and update the display appropriately *) let handle_keypress_normal key (iface : interface_state_t) reminders = try match Rcfile.command_of_key key with |Rcfile.ScrollDown -> begin match iface.selected_side with |Left -> handle_scrolldown_timed iface reminders |Right -> handle_scrolldown_untimed iface reminders end |Rcfile.ScrollUp -> begin match iface.selected_side with |Left -> handle_scrollup_timed iface reminders |Right -> handle_scrollup_untimed iface reminders end |Rcfile.NextDay -> let jump_func day = {day with Unix.tm_mday = succ day.Unix.tm_mday} in handle_jump iface reminders jump_func |Rcfile.PrevDay -> let jump_func day = {day with Unix.tm_mday = pred day.Unix.tm_mday} in handle_jump iface reminders jump_func |Rcfile.NextWeek -> let jump_func day = {day with Unix.tm_mday = day.Unix.tm_mday + 7} in handle_jump iface reminders jump_func |Rcfile.PrevWeek -> let jump_func day = {day with Unix.tm_mday = day.Unix.tm_mday - 7} in handle_jump iface reminders jump_func |Rcfile.NextMonth -> let jump_func day = {day with Unix.tm_mon = succ day.Unix.tm_mon} in handle_jump iface reminders jump_func |Rcfile.PrevMonth -> let jump_func day = {day with Unix.tm_mon = pred day.Unix.tm_mon} in handle_jump iface reminders jump_func |Rcfile.Zoom -> handle_zoom iface reminders |Rcfile.SwitchWindow -> handle_switch_focus iface reminders |Rcfile.Home -> handle_home iface reminders |Rcfile.Goto -> handle_begin_goto iface reminders |Rcfile.Edit -> handle_edit iface reminders |Rcfile.EditAny -> let (_, all_remfiles) = Remind.get_all_remfiles () in let selected_remfile = (* if there's only one remfile, jump right in, otherwise * pop up a selection dialog *) if List.length all_remfiles > 1 then do_selection_dialog iface "Choose a reminders file to edit" all_remfiles else List.hd all_remfiles in handle_edit_any iface reminders selected_remfile |Rcfile.CopyReminder -> handle_copy_reminder iface reminders true |Rcfile.CutReminder -> handle_cut_reminder iface reminders |Rcfile.PasteReminder -> if iface.rem_buffer = "" then begin let _ = beep () in draw_error iface "clipboard is empty." false; assert (doupdate ()); (iface, reminders) end else begin let (main_remfile, _) = Remind.get_all_remfiles () in handle_paste_reminder iface reminders main_remfile end |Rcfile.PasteReminderDialog -> if iface.rem_buffer = "" then begin let _ = beep () in draw_error iface "clipboard is empty." false; assert (doupdate ()); (iface, reminders) end else begin let (_, all_remfiles) = Remind.get_all_remfiles () in let selected_remfile = (* if there's only one remfile, jump right in, otherwise * pop up a selection dialog *) if List.length all_remfiles > 1 then do_selection_dialog iface "Choose a reminders file to paste into" all_remfiles else List.hd all_remfiles in handle_paste_reminder iface reminders selected_remfile end |Rcfile.ScrollDescUp -> handle_scroll_desc_up iface reminders |Rcfile.ScrollDescDown -> handle_scroll_desc_down iface reminders |Rcfile.QuickEvent -> handle_begin_quick_event iface reminders |Rcfile.NewTimed -> let (main_remfile, _) = Remind.get_all_remfiles () in handle_new_reminder iface reminders Timed main_remfile |Rcfile.NewTimedDialog -> let remfile = let (_, all_remfiles) = Remind.get_all_remfiles () in do_selection_dialog iface "Choose a reminders file" all_remfiles in handle_new_reminder iface reminders Timed remfile |Rcfile.NewUntimed -> let (main_remfile, _) = Remind.get_all_remfiles () in handle_new_reminder iface reminders Untimed main_remfile |Rcfile.NewUntimedDialog -> let remfile = let (_, all_remfiles) = Remind.get_all_remfiles () in do_selection_dialog iface "Choose a reminders file" all_remfiles in handle_new_reminder iface reminders Untimed remfile |Rcfile.NewGenReminder x -> let (main_remfile, _) = Remind.get_all_remfiles () in handle_new_reminder iface reminders (General x) main_remfile |Rcfile.NewGenReminderDialog x -> let remfile = let (_, all_remfiles) = Remind.get_all_remfiles () in do_selection_dialog iface "Choose a reminders file" all_remfiles in handle_new_reminder iface reminders (General x) remfile |Rcfile.SearchNext -> handle_find_next iface reminders None |Rcfile.BeginSearch -> handle_begin_search iface reminders |Rcfile.NextReminder -> handle_next_reminder iface reminders |Rcfile.ViewReminders -> handle_view_reminders iface reminders false |Rcfile.ViewAllReminders -> handle_view_reminders iface reminders true |Rcfile.ViewWeek -> handle_view_calendar iface reminders true |Rcfile.ViewMonth -> handle_view_calendar iface reminders false |Rcfile.ViewKeybindings -> handle_view_keybindings iface reminders |Rcfile.Refresh -> (* NOTE: I'm not sure why the endwin call is necessary here, * but I'm having problems getting a true full-screen refresh * without it. *) def_prog_mode (); endwin (); reset_prog_mode (); begin try assert (curs_set 0) with _ -> () end; let i = draw_msg iface in let reminders = Remind.create_three_month i.top_timestamp in handle_refresh i reminders |Rcfile.Quit -> let new_iface = {iface with run_wyrd = false} in (new_iface, reminders) with Not_found -> let _ = beep () in draw_error iface "key is not bound." false; assert (doupdate ()); (iface, reminders) (* handle keyboard input and update the display appropriately *) let handle_keypress key (iface : interface_state_t) reminders = match iface.entry_mode with |Normal -> handle_keypress_normal key (iface : interface_state_t) reminders |Extended ext_mode -> begin try begin match Rcfile.entry_of_key key with |Rcfile.EntryComplete -> begin match ext_mode with |ExtendedSearch -> begin try let new_iface = { iface with search_regex = Str.regexp_case_fold iface.extended_input; extended_input = ""; entry_mode = Normal } in handle_find_next new_iface reminders None with Failure err -> let new_iface = { iface with extended_input = ""; entry_mode = Normal } in let _ = beep () in draw_error new_iface ("syntax error in search string: " ^ err) false; assert (doupdate ()); (new_iface, reminders) end |ExtendedGoto -> begin try handle_goto iface reminders with Failure err -> let new_iface = { iface with extended_input = ""; entry_mode = Normal } in let _ = beep () in draw_error new_iface ("syntax error in date specifier: " ^ err) false; assert (doupdate ()); (new_iface, reminders) end |ExtendedQuick -> begin try let (main_remfile, _) = Remind.get_all_remfiles () in handle_quick_event iface reminders main_remfile with Failure err -> let new_iface = { iface with extended_input = ""; entry_mode = Normal } in let _ = beep () in draw_error new_iface ("syntax error in event description: " ^ err) false; assert (doupdate ()); (new_iface, reminders) end end |Rcfile.EntryBackspace -> let len = Utility.utf8_len iface.extended_input in if len > 0 then begin let new_iface = { iface with extended_input = Utility.utf8_string_before iface.extended_input (pred len) } in let prompt = match ext_mode with |ExtendedSearch -> "search expression: " |ExtendedGoto -> if !Rcfile.goto_big_endian then "go to date [[YYYY]MM]DD: " else "go to date DD[MM[YYYY]]: " |ExtendedQuick -> "event description: " in draw_error iface (prompt ^ new_iface.extended_input) true; (new_iface, reminders) end else let _ = beep () in (iface, reminders) |Rcfile.EntryExit -> let new_iface = { iface with extended_input = ""; entry_mode = Normal } in let msg = match ext_mode with |ExtendedSearch -> "search cancelled." |ExtendedGoto -> "date entry cancelled." |ExtendedQuick -> "quick event cancelled." in draw_error new_iface msg false; (new_iface, reminders) end with Not_found -> begin match ext_mode with |ExtendedGoto -> begin try (* only digits are accepted for goto dates *) if key >= 48 && key <= 57 && (String.length iface.extended_input < 8) then begin let c = char_of_int key in let new_iface = { iface with extended_input = iface.extended_input ^ (String.make 1 c) } in if !Rcfile.goto_big_endian then draw_error iface ("go to date [[YYYY]MM]DD: " ^ new_iface.extended_input) true else draw_error iface ("go to date DD[MM[YYYY]]: " ^ new_iface.extended_input) true; (new_iface, reminders) end else failwith "date characters must be digits" with Failure _ -> let _ = beep () in (iface, reminders) end |_ -> begin try (* Only printable characters are accepted for search strings and quick events. "Printable" * is defined as either "printable ASCII" or "non-ASCII UTF-8". Hopefully this definition * will satisfy ncurses. *) if (Curses_config.wide_ncurses && key >= 0x80) || (key >= 32 && key <= 126) then begin let c = char_of_int key in let new_iface = { iface with extended_input = iface.extended_input ^ (String.make 1 c) } in let prompt = match ext_mode with |ExtendedSearch -> "search expression: " |ExtendedQuick -> "event description: " |_ -> failwith "logical error in generating extended entry string" in draw_error new_iface (prompt ^ new_iface.extended_input) true; (new_iface, reminders) end else let err_msg = match ext_mode with |ExtendedSearch -> "cannot search for unprintable characters" |ExtendedQuick -> "events cannot contain unprintable characters" |ExtendedGoto -> "logical error in generating extended entry string" in failwith err_msg with Failure _ | Invalid_argument "char_of_int" -> let _ = beep () in (iface, reminders) end end end let rec do_main_loop (iface : interface_state_t) reminders last_update = if iface.run_wyrd then begin if String.length reminders.Remind.remind_error > 0 then draw_error iface ("Error in reminders file: \"" ^ reminders.Remind.remind_error ^ "\"") false else (); let (iface, wgetch_target) = match iface.resize_failed_win with | None -> (* refresh the msg window (which contains a clock) every wgetch timeout cycle *) let iface = draw_msg iface in assert (doupdate ()); (iface, iface.scr.help_win) | Some w -> (iface, w) in let key = wgetch wgetch_target in let new_iface, new_reminders = (* key = -1 is ncurses wgetch timeout error *) if key <> ~- 1 then if key = Key.resize then handle_resize iface reminders else begin match iface.resize_failed_win with | None -> handle_keypress key iface reminders | Some w -> let _ = beep () in (iface, reminders) end else if iface.track_home then (* cursor tracks the current time if requested *) handle_home iface reminders else (iface, reminders) in let remfile_mtimes = Remind.get_remfile_mtimes () in let curr_time = Unix.time () in (* if stat() indicates that remfiles were updated, or if five minutes has passed, * then poll remind(1) and update the display *) if (remfile_mtimes <> new_iface.remfile_mtimes || curr_time -. last_update > 300.0) && iface.resize_failed_win = None then begin let r = Remind.create_three_month new_iface.top_timestamp in (* if the untimed list has been altered, change the focus to * the timed window *) let new_iface = if List.length r.Remind.curr_untimed <> List.length reminders.Remind.curr_untimed then { new_iface with selected_side = Left; top_untimed = 0; right_selection = 1; remfile_mtimes = remfile_mtimes } else {new_iface with remfile_mtimes = remfile_mtimes} in let (iface2, reminders2) = handle_refresh new_iface r in do_main_loop iface2 reminders2 curr_time end else do_main_loop new_iface new_reminders last_update end else endwin () (* exit main loop *) (* initialize the interface and begin the main loop *) let run (iface : interface_state_t) = let set_bkgd win obj = try let color_index = Hashtbl.find Rcfile.object_palette obj in wbkgd win ((A.color_pair color_index) lor (int_of_char ' ')) with Not_found -> () in (* set up the proper background colors for all the windows *) set_bkgd iface.scr.help_win Rcfile.Help; set_bkgd iface.scr.timed_win Rcfile.Timed_default; set_bkgd iface.scr.calendar_win Rcfile.Calendar_labels; set_bkgd iface.scr.untimed_win Rcfile.Untimed_reminder; set_bkgd iface.scr.msg_win Rcfile.Description; scrollok iface.scr.timed_win true; let reminders = Remind.create_three_month (iface.top_timestamp) in let iface = {iface with remfile_mtimes = Remind.get_remfile_mtimes ()} in assert (keypad iface.scr.help_win true); draw_help iface; draw_date_strip iface; let new_iface = draw_timed iface reminders.Remind.all_timed in draw_calendar new_iface reminders; let new_iface = draw_untimed new_iface reminders.Remind.curr_untimed in let new_iface = draw_msg new_iface in draw_error new_iface "" false; assert (doupdate ()); do_main_loop new_iface reminders (Unix.time ()) (* arch-tag: DO_NOT_CHANGE_b4519dd2-7e94-4cbf-931a-bb5f97445cbf *) wyrd-1.4.6/time_lang.ml0000644000175000017500000005304512103356067013476 0ustar paulpaul(* Wyrd -- a curses-based front-end for Remind * Copyright (C) 2005, 2006, 2007, 2008, 2010, 2011-2013 Paul Pelzl * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, Version 2, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Bug reports can be entered at http://bugs.launchpad.net/wyrd . * For anything else, feel free to contact Paul Pelzl at . *) (* time_lang.ml * * This module implements a regexp-based parser for natural-language descriptions of * events. It recognizes most reasonable permutations of ([DATE] [TIME] DESCRIPTION), * including: * * "do some stuff tomorrow at 3" * "wednesday meeting with Bob 1:30pm-3:00" * "leave for airport noon next Fri" * "6/14 6pm dinner with Tom" * * Preference is generally for US time and date conventions; would be quite difficult to * internationalize this module. *) exception Event_parse_error of string let parse_failwith s = raise (Event_parse_error s) let parse_fail_default () = parse_failwith "unrecognized format for event." type event_t = Timed of (Unix.tm * Unix.tm) | Untimed of Unix.tm (* DEFINE TIME AND DATE REGEXES *) (* Note: careful when changing these regexps. If the grouping tree changes, * then the fields may be misnumbered in code below. *) (* Note: ocaml _really_ needs a raw string syntax to make regexps look more sane... *) let weekdays = "\\(\\(on[ \t]+\\)?\\(next[ \t]+\\)?" ^ "\\(\\(sunday\\|sun\\)\\|\\(monday\\|mon\\)\\|\\(tuesday\\|tue\\|tues\\)\\|" ^ "\\(wednesday\\|wed\\)\\|\\(thursday\\|thu\\|thur\\|thurs\\)\\|" ^ "\\(friday\\|fri\\)\\|\\(saturday\\|sat\\)\\)\\)" (* typical US-style dates, like 6/1 or 6/1/2006 *) let numeric_slash_date = "\\(\\([0-9]+\\)/\\([0-9]+\\)\\(/\\([0-9][0-9][0-9][0-9]\\)\\)?\\)" (* ISO standard dates, like 2006-06-01 *) let iso_date = "\\(\\([0-9][0-9][0-9][0-9]\\)-\\([0-9]+\\)-\\([0-9]+\\)\\)" let numeric_date = "\\(\\(on[ \t]+\\)?\\(" ^ numeric_slash_date ^ "\\|" ^ iso_date ^ "\\)\\)" let short_date = "\\(\\(today\\)\\|\\(tomorrow\\)\\|" ^ "\\(in[ \t]+\\([0-9]+\\)[ \t]+day\\(s\\|s' time\\)?\\)\\)" let date_spec = "\\(" ^ weekdays ^ "\\|" ^ numeric_date ^ "\\|" ^ short_date ^ "\\)" (* 5, or 5:30, or 5pm, or 5:30 pm *) let time_spec = "\\(\\(\\([0-9][0-9]?\\)\\(:\\([0-9][0-9]\\)\\)?[ \t]*\\(am\\|pm\\)?\\)\\|" ^ "\\(noon\\|midnight\\)\\)" (* either match a single time spec, or match a pair formatted as a range: * 5-7 or 5:30pm-7 or 5 until 7 or 5:30 to 7pm ... *) let time_range_spec = "\\(\\(at[ \t]+\\)?" ^ time_spec ^ "\\([ \t]*\\(-\\|to\\|\\until\\)[ \t]*" ^ time_spec ^ "\\)?\\)" let date_start_regex = Str.regexp_case_fold ("[ \t,.]*" ^ date_spec ^ "[ \t,.]+") let time_start_regex = Str.regexp_case_fold ("[ \t,.]*" ^ time_range_spec ^ "[ \t,.]+") let date_end_regex = Str.regexp_case_fold ("[ \t,.]+" ^ date_spec ^ "[ \t,.]*$") let time_end_regex = Str.regexp_case_fold ("[ \t,.]+" ^ time_range_spec ^ "[ \t,.]*$") (* given a current time and an hour/minute/merid specifier, * search forward from current time and provide the next time * value that satisfies the spec. *) (* 'future' is a boolean variable that determines whether the time * is required to be in the future or not (i.e. the present is acceptable) *) let next_matching_time future curr_tm hour min merid = let (curr, _) = Unix.mktime curr_tm in let get_tm hour_shift day_shift = let tm = { curr_tm with Unix.tm_hour = hour + hour_shift; Unix.tm_min = min; Unix.tm_sec = 0; Unix.tm_mday = curr_tm.Unix.tm_mday + day_shift } in Unix.mktime tm in if merid = "am" then (* if "am" is specified... *) (* try using the hour and minute as given *) let (start1, start1_tm) = get_tm 0 0 in if start1 > curr || (start1 = curr && not future) then start1_tm else (* if that fails, just use the same time tomorrow *) let (start2, start2_tm) = get_tm 0 1 in start2_tm else if merid = "pm" then (* if "pm" is specified... *) (* try using the hour and minute as given (but shifted to afternoon) *) let (start1, start1_tm) = get_tm 12 0 in if start1 > curr || (start1 = curr && not future) then start1_tm else (* if that fails, use the same time tomorrow *) let (start2, start2_tm) = get_tm 12 1 in start2_tm else (* if neither "am" nor "pm" are specified... *) (* first use the hour and minute as given *) let (start1, start1_tm) = get_tm 0 0 in if start1 > curr || (start1 = curr && not future) then start1_tm else (* if that fails, look in the afternoon *) let (start2, start2_tm) = get_tm 12 0 in if start2 > curr || (start2 = curr && not future) then start2_tm else (* if that fails, shift to tomorrow morning *) let (start3, start3_tm) = get_tm 0 1 in start3_tm (* Find the next timespec following curr_tm that falls on 'wday'. 'next_week' * is a boolean variable that is true if the event should be interpreted * as occurring next week. *) let find_next_wday curr_tm wday next_week = (* start scanning forward from the current timespec, unless the 'next' * specifier is given; in that case, start from the beginning of * next week *) let scan_from = if next_week then let week_diff = if !Rcfile.week_starts_monday then 7 - ((curr_tm.Unix.tm_wday + 6) mod 7) else 7 - curr_tm.Unix.tm_wday in let temp = { curr_tm with Unix.tm_mday = curr_tm.Unix.tm_mday + week_diff; Unix.tm_hour = 0; Unix.tm_min = 0; Unix.tm_sec = 0 } in let (_, norm) = Unix.mktime temp in norm else curr_tm in let diff = if wday > scan_from.Unix.tm_wday then wday - scan_from.Unix.tm_wday else if wday = scan_from.Unix.tm_wday && next_week then 0 else wday - scan_from.Unix.tm_wday + 7 in let temp = { scan_from with Unix.tm_mday = scan_from.Unix.tm_mday + diff; Unix.tm_hour = 0; Unix.tm_min = 0; Unix.tm_sec = 0 } in let (_, norm) = Unix.mktime temp in norm (* Find the next timespec following curr_tm that satisfies the * month and day provided. *) let find_next_mon_mday curr_tm mon mday = if mon > curr_tm.Unix.tm_mon then let temp = { curr_tm with Unix.tm_mon = mon; Unix.tm_mday = mday; Unix.tm_hour = 0; Unix.tm_min = 0; Unix.tm_sec = 0 } in let (_, norm) = Unix.mktime temp in norm else if mon = curr_tm.Unix.tm_mon && mday > curr_tm.Unix.tm_mday then let temp = { curr_tm with Unix.tm_mday = mday; Unix.tm_hour = 0; Unix.tm_min = 0; Unix.tm_sec = 0 } in let (_, norm) = Unix.mktime temp in norm else let temp = { curr_tm with Unix.tm_year = succ curr_tm.Unix.tm_year; Unix.tm_mon = mon; Unix.tm_mday = mday; Unix.tm_hour = 0; Unix.tm_min = 0; Unix.tm_sec = 0 } in let (_, norm) = Unix.mktime temp in norm (* Parse a natural language date string. *) let parse_natural_language_date date_str = let current = Unix.localtime (Unix.time ()) in let (_, current_tm) = Unix.mktime current in let date_regex = Str.regexp date_spec in if Str.string_match date_regex date_str 0 then begin (* for i = 1 to 30 do try Printf.printf "%2d: \"%s\"\n" i (Str.matched_group i date_str); flush stdout; with Not_found -> () done; *) let get_field num = Str.matched_group num date_str in let handle_weekday () = let has_next = try let _ = get_field 4 in true with Not_found -> false in try (* some variant of "sunday" *) let _ = get_field 6 in find_next_wday current_tm 0 has_next with Not_found -> try (* some variant of "monday" *) let _ = get_field 7 in find_next_wday current_tm 1 has_next with Not_found -> try (* some variant of "tuesday" *) let _ = get_field 8 in find_next_wday current_tm 2 has_next with Not_found -> try (* some variant of "wednesday" *) let _ = get_field 9 in find_next_wday current_tm 3 has_next with Not_found -> try (* some variant of "thursday" *) let _ = get_field 10 in find_next_wday current_tm 4 has_next with Not_found -> try (* some variant of "friday" *) let _ = get_field 11 in find_next_wday current_tm 5 has_next with Not_found -> try (* some variant of "saturday" *) let _ = get_field 12 in find_next_wday current_tm 6 has_next with Not_found -> parse_failwith "please submit a bug report for \"unreachable case 3\"." in let handle_numeric_slash () = try (* US-style numeric date specified with slashes *) let first = int_of_string (get_field 17) in let second = int_of_string (get_field 18) in let (month, monthday) = if !Rcfile.quick_date_US then (* assume US conventions (month first, then day of month) *) (first, second) else (* assume non-US conventions (day of month first, then month) *) (second, first) in if month >= 1 && month <= 12 && monthday >= 1 && monthday <= 31 then begin try let third = int_of_string (get_field 20) in if third >= 1991 && third <= 2037 then let temp = { current_tm with Unix.tm_year = third - 1900; Unix.tm_mon = pred month; Unix.tm_mday = monthday; Unix.tm_hour = 0; Unix.tm_min = 0; Unix.tm_sec = 0 } in let (_, norm) = Unix.mktime temp in norm else parse_fail_default () with Not_found -> find_next_mon_mday current_tm (pred month) monthday end else parse_fail_default () with Not_found -> parse_failwith "please submit a bug report for \"unreachable case 4\"." in let handle_iso () = try (* iso numeric date specified with dashes *) let first = int_of_string (get_field 22) in let second = int_of_string (get_field 23) in let third = int_of_string (get_field 24) in if first >= 1991 && first <= 2037 && second >= 1 && second <= 12 && third >= 1 && third <= 31 then let temp = { current_tm with Unix.tm_year = first - 1900; Unix.tm_mon = pred second; Unix.tm_mday = third; Unix.tm_hour = 0; Unix.tm_min = 0; Unix.tm_sec = 0 } in let (_, norm) = Unix.mktime temp in norm else parse_fail_default () with Not_found -> parse_failwith "please submit a bug report for \"unreachable case 5\"." in let handle_short () = try (* "today" *) let _ = get_field 26 in let temp = { current_tm with Unix.tm_hour = 0; Unix.tm_min = 0; Unix.tm_sec = 0 } in let (_, norm) = Unix.mktime temp in norm with Not_found -> try (* "tomorrow" *) let _ = get_field 27 in let temp = { current_tm with Unix.tm_mday = succ current_tm.Unix.tm_mday; Unix.tm_hour = 0; Unix.tm_min = 0; Unix.tm_sec = 0 } in let (_, norm) = Unix.mktime temp in norm with Not_found -> try (* "in N days" *) let num = int_of_string (get_field 29) in let temp = { current_tm with Unix.tm_mday = current_tm.Unix.tm_mday + num; Unix.tm_hour = 0; Unix.tm_min = 0; Unix.tm_sec = 0 } in let (_, norm) = Unix.mktime temp in norm with Not_found -> parse_failwith "please submit a bug report for \"unreachable case 6\"." in let date_tm = try (* a weekday specifier *) let _ = get_field 5 in handle_weekday () with Not_found -> try (* a numeric date specifier with slashes *) let _ = get_field 16 in handle_numeric_slash () with Not_found -> try (* a numeric date specifier with dashes *) let _ = get_field 21 in handle_iso () with Not_found -> try (* a shortcut date *) let _ = get_field 25 in handle_short () with Not_found -> parse_failwith "please submit a bug report for \"unreachable case 2\"." in date_tm end else parse_failwith "please submit a bug report for \"unreachable case 1\"." (* Parse a natural language time string. *) (* 'future' is a boolean variable that determines whether the time * is required to be in the future or not (i.e. the present is acceptable) *) let parse_natural_language_time future current_tm time_str = let time_regex = Str.regexp time_range_spec in if Str.string_match time_regex time_str 0 then begin (* for i = 1 to 30 do try Printf.printf "%2d: \"%s\"\n" i (Str.matched_group i time_str); flush stdout; with | Not_found -> () done; *) let get_field num = try Str.matched_group num time_str with Not_found -> "" in let start_hour_s = get_field 5 and start_minute_s = get_field 7 and start_meridien_s = get_field 8 and end_hour_s = get_field 14 and end_minute_s = get_field 16 and end_meridien_s = get_field 17 and start_abbrev = get_field 9 and end_abbrev = get_field 18 in (* OK, given a timestamp as context, try to choose the most sensible * interpretation of the time spec. Search forward from current time for * the first start time that matches, then continue searching forward * for the first end time that matches. *) let (start_hour, start_meridien) = if start_abbrev = "noon" then (0, "pm") else if start_abbrev = "midnight" then (0, "am") else if start_hour_s = "" then parse_fail_default () else let temp = int_of_string start_hour_s in if temp = 0 then (0, "am") else if temp >= 13 && temp <= 23 then (temp - 12, "pm") else if temp >= 1 && temp <= 11 then (temp, start_meridien_s) else if temp = 12 then (0, start_meridien_s) else parse_fail_default () in let start_minute = if start_minute_s = "" then 0 else let temp = int_of_string start_minute_s in if temp >= 0 && temp <= 59 then temp else parse_fail_default () in let start_tm = next_matching_time future current_tm start_hour start_minute start_meridien in let end_tm = if end_hour_s = "" && end_abbrev = "" then start_tm else let (end_hour, end_meridien) = if end_abbrev = "noon" then (0, "pm") else if end_abbrev = "midnight" then (0, "am") else let temp = int_of_string end_hour_s in if temp = 0 then (0, "am") else if temp >= 13 && temp <= 23 then (temp - 12, "pm") else if temp >= 1 && temp <= 11 then (temp, end_meridien_s) else if temp = 12 then (0, end_meridien_s) else parse_fail_default () in let end_minute = if end_minute_s = "" then 0 else let temp = int_of_string end_minute_s in if temp >= 0 && temp <= 59 then temp else parse_fail_default () in next_matching_time true start_tm end_hour end_minute end_meridien in (start_tm, end_tm) end else parse_failwith "please submit a bug report for \"unreachable case 10\"." (* at the beginning of the string, searches for date, then time, * then date again, then time again, as necessary *) let rec find_date_time_begin date time event_remainder attempts = let find_element_gen element_start_regex element event_s = match element with | None -> if Str.string_match element_start_regex event_s 0 then begin let new_element = String.lowercase (Str.matched_group 1 event_s) in let pos = Str.match_end () in let new_event_s = Str.string_after event_s pos in ((Some new_element), new_event_s) end else (element, event_s) | Some _ -> (element, event_s) in let find_date = find_element_gen date_start_regex in let find_time = find_element_gen time_start_regex in if attempts >= 2 then (date, time, event_remainder) else let (new_date, event_remainder2) = find_date date event_remainder in let (new_time, event_remainder3) = find_time time event_remainder2 in find_date_time_begin new_date new_time event_remainder3 (succ attempts) (* at the end of the string, searches for date, then time, * then date again, then time again, as necessary *) let rec find_date_time_end date time event_remainder attempts = let find_element_gen element_end_regex element event_s = match element with | None -> begin try let pos = Str.search_forward element_end_regex event_s 0 in let new_element = String.lowercase (Str.matched_group 1 event_s) in let new_event_s = Str.string_before event_s pos in ((Some new_element), new_event_s) with Not_found -> (element, event_s) end | Some _ -> (element, event_s) in let find_date = find_element_gen date_end_regex in let find_time = find_element_gen time_end_regex in if attempts >= 2 then (date, time, event_remainder) else let (new_date, event_remainder2) = find_date date event_remainder in let (new_time, event_remainder3) = find_time time event_remainder2 in find_date_time_end new_date new_time event_remainder3 (succ attempts) (* Primary function of this module. Parses a natural language definition for an event, * which might look something like "Wednesday meeting with Bob at 9:30pm." *) let parse_natural_language_event event_str = let (date, time, description) = (* search at the start of the string first, then at the end *) let (date_begin, time_begin, remainder) = find_date_time_begin None None event_str 0 in find_date_time_end date_begin time_begin remainder 0 in let curr_tm = Unix.localtime (Unix.time ()) in let rem_spec = match date with | None -> begin match time with | None -> parse_fail_default () | Some time_str -> Timed (parse_natural_language_time true curr_tm time_str) end | Some date_str -> let date_tm = parse_natural_language_date date_str in begin match time with | None -> Untimed date_tm | Some time_str -> Timed (parse_natural_language_time false date_tm time_str) end in (rem_spec, description) (* arch-tag: DO_NOT_CHANGE_a43ce66f-688e-42dd-8c2b-83b55c124a5a *) wyrd-1.4.6/README0000644000175000017500000000037312103356067012061 0ustar paulpaulWyrd README file ------------------------------------------------------------------------ Please see the 'doc' subdirectory for installation and usage instructions. DEVELOPERS: Invoke "prep-devtree.sh" to grab a snapshot of the build dependencies. wyrd-1.4.6/prep-release.sh0000755000175000017500000000126612103356067014126 0ustar paulpaul#!/bin/bash # 'prep-release' script # Make all the last-minute changes to prepare the sources for packaging # in a release tarball # # Usage: prep-release.sh DESTDIR # set -e CURSES_BRANCH=lp:ubuntu/ocaml-curses CURSES_REVISION=8 echo "Exporting revision..." bzr export $1 echo "Exporting dependencies..." bzr export -r $CURSES_REVISION $1/curses $CURSES_BRANCH cd $1 pushd curses echo "Generating curses/configure ..." autoheader && autoconf && rm -rf autom4te.cache popd echo "Generating ./configure ..." autoconf && rm -rf autom4te.cache echo "Generating _oasis and setup.ml ..." ./make_oasis.ml && oasis setup echo "Creating documentation..." cd doc && make &> /dev/null echo "Done." wyrd-1.4.6/install.ml.in0000644000175000017500000000174612103356067013613 0ustar paulpaul(* Wyrd -- a curses-based front-end for Remind * Copyright (C) 2005, 2006, 2007, 2008, 2010, 2011-2013 Paul Pelzl * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, Version 2, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Bug reports can be entered at http://bugs.launchpad.net/wyrd . * For anything else, feel free to contact Paul Pelzl at . *) let prefix = "@prefix@";; let sysconfdir = "@sysconfdir@";; wyrd-1.4.6/interface.ml0000644000175000017500000001552212103356067013475 0ustar paulpaul(* Wyrd -- a curses-based front-end for Remind * Copyright (C) 2005, 2006, 2007, 2008, 2010, 2011-2013 Paul Pelzl * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, Version 2, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Bug reports can be entered at http://bugs.launchpad.net/wyrd . * For anything else, feel free to contact Paul Pelzl at . *) (* interface.ml * This file defines the data structure (a record) that stores the * interface state. *) open Curses;; open Rcfile;; exception Not_handled;; (* help_win is provided as an option, because it may be dropped if * the screen width is too small *) type screen_t = { stdscr : window; lines : int; cols : int; help_win : window; hw_cols : int; timed_win : window; tw_lines : int; tw_cols : int; calendar_win : window; cw_lines : int; cw_cols : int; untimed_win : window; uw_lines : int; uw_cols : int; msg_win : window; mw_lines : int; mw_cols : int; err_win : window; ew_lines : int; ew_cols : int } type zoom_t = Hour | HalfHour | QuarterHour type side_t = Left | Right (* keep track of information needed for a line of * the timed reminders window *) type timed_lineinfo_t = { tl_filename : string; tl_linenum : string; tl_timestr : string; tl_msg : string; tl_start : float } (* keep track of information needed for a line of * the untimed reminders window *) type untimed_lineinfo_t = { ul_filename : string; ul_linenum : string; ul_msg : string } type extended_mode_t = ExtendedSearch | ExtendedGoto | ExtendedQuick type entry_mode_t = Normal | Extended of extended_mode_t module SMap = Map.Make(String) (* everything you need to know about the interface state goes in this variable *) type interface_state_t = { version : string; (* program version string *) scr : screen_t; (* curses screen with two or three subwindows *) run_wyrd : bool; (* exit when run_wyrd becomes false *) top_timestamp : float; (* controls what portion of the schedule is viewable *) top_untimed : int; (* controls what portion of untimed reminders are viewable *) top_desc : int; (* controls what portion of the reminder descriptions are viewable *) selected_side : side_t; (* controls which window has the focus *) left_selection : int; (* controls which element of the left window is selected *) right_selection : int; (* controls which element of the right window is selected *) zoom_level : zoom_t; (* controls the resolution of the timed window *) timed_lineinfo : timed_lineinfo_t list array; (* information about the lines of the timed reminder window *) untimed_lineinfo : untimed_lineinfo_t option array; (* same as above, for untimed window *) len_untimed : int; (* number of entries in the untimed reminders list *) remfile_mtimes : float SMap.t; (* for each remfile, maps filename to stat mtime *) search_regex : Str.regexp; (* most recent search string *) extended_input : string; (* buffer to hold search/goto/quick event info *) entry_mode : entry_mode_t; (* decides which mode the interface is in *) last_timed_refresh: float; (* the last time the timed window had a complete refresh *) rem_buffer : string; (* buffer that acts as a clipboard for REM strings *) track_home : bool; (* true if cursor position should "stick" to current time *) resize_failed_win : window option (* if a resize fails, this holds a window pointer for an error msg. *) } (* round to the nearest displayed time value *) let round_time zoom t = match zoom with |Hour -> { t with Unix.tm_sec = 0; Unix.tm_min = 0 } |HalfHour -> { t with Unix.tm_sec = 0; Unix.tm_min = if t.Unix.tm_min >= 30 then 30 else 0 } |QuarterHour -> { t with Unix.tm_sec = 0; Unix.tm_min = if t.Unix.tm_min >= 45 then 45 else if t.Unix.tm_min >= 30 then 30 else if t.Unix.tm_min >= 15 then 15 else 0 } (* create and initialize an interface with default settings *) let make (std : screen_t) = let curr_time = Unix.localtime ((Unix.time ()) -. 60. *. 60.) in let (rounded_time, _) = Unix.mktime (round_time Hour curr_time) in { version = Version.version; scr = std; run_wyrd = true; top_timestamp = if !Rcfile.center_cursor then rounded_time -. 60.0 *. 60.0 *. (float_of_int ((std.tw_lines / 2) - 2)) else rounded_time -. 60.0 *. 60.0; top_untimed = 0; top_desc = 0; selected_side = Left; left_selection = if !Rcfile.center_cursor then (std.tw_lines / 2) - 1 else 2; right_selection = 1; zoom_level = Hour; timed_lineinfo = Array.make std.tw_lines []; untimed_lineinfo = Array.make std.uw_lines None; len_untimed = 0; remfile_mtimes = SMap.empty; search_regex = Str.regexp ""; extended_input = ""; entry_mode = Normal; last_timed_refresh = 0.0; rem_buffer = ""; track_home = !Rcfile.home_sticky; resize_failed_win = None } (* time increment in float seconds *) let time_inc (iface : interface_state_t) = match iface.zoom_level with | Hour -> 60.0 *. 60.0 | HalfHour -> 30.0 *. 60.0 | QuarterHour -> 15.0 *. 60.0 (* time increment in int minutes *) let time_inc_min (iface : interface_state_t) = match iface.zoom_level with | Hour -> 60 | HalfHour -> 30 | QuarterHour -> 15 let timestamp_of_line iface line = iface.top_timestamp +. ((float_of_int line) *. (time_inc iface)) (* arch-tag: DO_NOT_CHANGE_2e912989-cdb2-498a-9bb3-b6d76e94f3a5 *) wyrd-1.4.6/configure0000755000175000017500000040425512103356102013105 0ustar paulpaul#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= PACKAGE_URL= ac_unique_file="install.ml.in" enable_option_checking=no ac_subst_vars='LTLIBOBJS LIBOBJS INSTALL EXE OCAMLWIN32 OCAMLLIB OCAMLVERSION OCAMLBEST INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM subdirs REMINDPATH OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC OCAMLYACC OCAMLLEXDOTOPT OCAMLLEX OCAMLDEP OCAMLOPTDOTOPT OCAMLCDOTOPT OCAMLOPT OCAMLC target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_utf8 ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS' ac_subdirs_all='curses' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-utf8 enable UTF-8 output (requires ncurses wide char support) Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # optional arguments # Check whether --enable-utf8 was given. if test "${enable_utf8+set}" = set; then : enableval=$enable_utf8; try_utf8=$enable_utf8 else try_utf8=no fi # Check for Ocaml compilers # we first look for ocamlc in the path; if not present, we fail # Extract the first word of "ocamlc", so it can be a program name with args. set dummy ocamlc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OCAMLC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OCAMLC"; then ac_cv_prog_OCAMLC="$OCAMLC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OCAMLC="ocamlc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_OCAMLC" && ac_cv_prog_OCAMLC="no" fi fi OCAMLC=$ac_cv_prog_OCAMLC if test -n "$OCAMLC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLC" >&5 $as_echo "$OCAMLC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$OCAMLC" = no ; then as_fn_error $? "Cannot find ocamlc." "$LINENO" 5 fi # we extract Ocaml version number and library path OCAMLVERSION=`$OCAMLC -v | sed -n -e 's|.*version *\(.*\)$|\1|p' ` echo "ocaml version is $OCAMLVERSION" OCAMLLIB=`$OCAMLC -v | tail -n 1 | cut -f 4 -d " "` echo "ocaml library path is $OCAMLLIB" # check for sufficient OCAMLVERSION OCAMLMAJORVERSION=`echo $OCAMLVERSION | cut -d '.' -f 1` OCAMLMINORVERSION=`echo $OCAMLVERSION | cut -d '.' -f 2` if test $OCAMLMAJORVERSION -lt 3 ; then as_fn_error $? "Wyrd requires OCaml version 3.08 or greater." "$LINENO" 5 elif test $OCAMLMAJORVERSION -eq 3; then if test $OCAMLMINORVERSION -lt 8 ; then as_fn_error $? "Wyrd requires OCaml version 3.08 or greater." "$LINENO" 5 fi fi # then we look for ocamlopt; if not present, we issue a warning # if the version is not the same, we also discard it # we set OCAMLBEST to "opt" or "byte", whether ocamlopt is available or not # Extract the first word of "ocamlopt", so it can be a program name with args. set dummy ocamlopt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OCAMLOPT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OCAMLOPT"; then ac_cv_prog_OCAMLOPT="$OCAMLOPT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OCAMLOPT="ocamlopt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_OCAMLOPT" && ac_cv_prog_OCAMLOPT="no" fi fi OCAMLOPT=$ac_cv_prog_OCAMLOPT if test -n "$OCAMLOPT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLOPT" >&5 $as_echo "$OCAMLOPT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi OCAMLBEST=byte if test "$OCAMLOPT" = no ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find ocamlopt; bytecode compilation only." >&5 $as_echo "$as_me: WARNING: Cannot find ocamlopt; bytecode compilation only." >&2;} else { $as_echo "$as_me:${as_lineno-$LINENO}: checking ocamlopt version" >&5 $as_echo_n "checking ocamlopt version... " >&6; } TMPVERSION=`$OCAMLOPT -v | sed -n -e 's|.*version *\(.*\)$|\1|p' ` if test "$TMPVERSION" != "$OCAMLVERSION" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: differs from ocamlc; ocamlopt discarded." >&5 $as_echo "differs from ocamlc; ocamlopt discarded." >&6; } OCAMLOPT=no else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } OCAMLBEST=opt fi fi # checking for ocamlc.opt # Extract the first word of "ocamlc.opt", so it can be a program name with args. set dummy ocamlc.opt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OCAMLCDOTOPT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OCAMLCDOTOPT"; then ac_cv_prog_OCAMLCDOTOPT="$OCAMLCDOTOPT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OCAMLCDOTOPT="ocamlc.opt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_OCAMLCDOTOPT" && ac_cv_prog_OCAMLCDOTOPT="no" fi fi OCAMLCDOTOPT=$ac_cv_prog_OCAMLCDOTOPT if test -n "$OCAMLCDOTOPT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLCDOTOPT" >&5 $as_echo "$OCAMLCDOTOPT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$OCAMLCDOTOPT" != no ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking ocamlc.opt version" >&5 $as_echo_n "checking ocamlc.opt version... " >&6; } TMPVERSION=`$OCAMLCDOTOPT -v | sed -n -e 's|.*version *\(.*\)$|\1|p' ` if test "$TMPVERSION" != "$OCAMLVERSION" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: differs from ocamlc; ocamlc.opt discarded." >&5 $as_echo "differs from ocamlc; ocamlc.opt discarded." >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } OCAMLC=$OCAMLCDOTOPT fi fi # checking for ocamlopt.opt if test "$OCAMLOPT" != no ; then # Extract the first word of "ocamlopt.opt", so it can be a program name with args. set dummy ocamlopt.opt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OCAMLOPTDOTOPT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OCAMLOPTDOTOPT"; then ac_cv_prog_OCAMLOPTDOTOPT="$OCAMLOPTDOTOPT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OCAMLOPTDOTOPT="ocamlopt.opt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_OCAMLOPTDOTOPT" && ac_cv_prog_OCAMLOPTDOTOPT="no" fi fi OCAMLOPTDOTOPT=$ac_cv_prog_OCAMLOPTDOTOPT if test -n "$OCAMLOPTDOTOPT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLOPTDOTOPT" >&5 $as_echo "$OCAMLOPTDOTOPT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$OCAMLOPTDOTOPT" != no ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking ocamlc.opt version" >&5 $as_echo_n "checking ocamlc.opt version... " >&6; } TMPVER=`$OCAMLOPTDOTOPT -v | sed -n -e 's|.*version *\(.*\)$|\1|p' ` if test "$TMPVER" != "$OCAMLVERSION" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: differs from ocamlc; ocamlopt.opt discarded." >&5 $as_echo "differs from ocamlc; ocamlopt.opt discarded." >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } OCAMLOPT=$OCAMLOPTDOTOPT fi fi fi # ocamldep should also be present in the path # Extract the first word of "ocamldep", so it can be a program name with args. set dummy ocamldep; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OCAMLDEP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OCAMLDEP"; then ac_cv_prog_OCAMLDEP="$OCAMLDEP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OCAMLDEP="ocamldep" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_OCAMLDEP" && ac_cv_prog_OCAMLDEP="no" fi fi OCAMLDEP=$ac_cv_prog_OCAMLDEP if test -n "$OCAMLDEP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLDEP" >&5 $as_echo "$OCAMLDEP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$OCAMLDEP" = no ; then as_fn_error $? "Cannot find ocamldep." "$LINENO" 5 fi # Extract the first word of "ocamllex", so it can be a program name with args. set dummy ocamllex; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OCAMLLEX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OCAMLLEX"; then ac_cv_prog_OCAMLLEX="$OCAMLLEX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OCAMLLEX="ocamllex" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_OCAMLLEX" && ac_cv_prog_OCAMLLEX="no" fi fi OCAMLLEX=$ac_cv_prog_OCAMLLEX if test -n "$OCAMLLEX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLLEX" >&5 $as_echo "$OCAMLLEX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$OCAMLLEX" = no ; then as_fn_error $? "Cannot find ocamllex." "$LINENO" 5 else # Extract the first word of "ocamllex.opt", so it can be a program name with args. set dummy ocamllex.opt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OCAMLLEXDOTOPT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OCAMLLEXDOTOPT"; then ac_cv_prog_OCAMLLEXDOTOPT="$OCAMLLEXDOTOPT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OCAMLLEXDOTOPT="ocamllex.opt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_OCAMLLEXDOTOPT" && ac_cv_prog_OCAMLLEXDOTOPT="no" fi fi OCAMLLEXDOTOPT=$ac_cv_prog_OCAMLLEXDOTOPT if test -n "$OCAMLLEXDOTOPT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLLEXDOTOPT" >&5 $as_echo "$OCAMLLEXDOTOPT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$OCAMLLEXDOTOPT" != no ; then OCAMLLEX=$OCAMLLEXDOTOPT fi fi # Extract the first word of "ocamlyacc", so it can be a program name with args. set dummy ocamlyacc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OCAMLYACC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OCAMLYACC"; then ac_cv_prog_OCAMLYACC="$OCAMLYACC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OCAMLYACC="ocamlyacc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_OCAMLYACC" && ac_cv_prog_OCAMLYACC="no" fi fi OCAMLYACC=$ac_cv_prog_OCAMLYACC if test -n "$OCAMLYACC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLYACC" >&5 $as_echo "$OCAMLYACC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$OCAMLYACC" = no ; then as_fn_error $? "Cannot find ocamlyacc." "$LINENO" 5 fi # platform { $as_echo "$as_me:${as_lineno-$LINENO}: checking platform" >&5 $as_echo_n "checking platform... " >&6; } if echo "let _ = Sys.os_type" | ocaml | grep -q Win32; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Win32" >&5 $as_echo "Win32" >&6; } OCAMLWIN32=yes EXE=.exe else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not Win32" >&5 $as_echo "not Win32" >&6; } OCAMLWIN32=no EXE= fi # find a C compiler ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # check Remind version # Extract the first word of "remind", so it can be a program name with args. set dummy remind; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_REMINDPATH+:} false; then : $as_echo_n "(cached) " >&6 else case $REMINDPATH in [\\/]* | ?:[\\/]*) ac_cv_path_REMINDPATH="$REMINDPATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_REMINDPATH="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_REMINDPATH" && ac_cv_path_REMINDPATH="not found" ;; esac fi REMINDPATH=$ac_cv_path_REMINDPATH if test -n "$REMINDPATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $REMINDPATH" >&5 $as_echo "$REMINDPATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x"$REMINDPATH" != x"not found"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking remind version" >&5 $as_echo_n "checking remind version... " >&6; } REMINDVERSION=`strings $REMINDPATH | grep 03\.0` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $REMINDVERSION" >&5 $as_echo "$REMINDVERSION" >&6; } REMMAJORVERSION=`echo $REMINDVERSION | cut -d '.' -f 1` REMMINORVERSION=`echo $REMINDVERSION | cut -d '.' -f 2` REMFIXVERSION=`echo $REMINDVERSION | cut -d '.' -f 3` if test $REMMAJORVERSION -lt 3 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Wyrd requires Remind version 03.01.00 or greater." >&5 $as_echo "$as_me: WARNING: Wyrd requires Remind version 03.01.00 or greater." >&2;} else if test $REMMINORVERSION -lt 1 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Wyrd requires Remind version 03.01.00 or greater." >&5 $as_echo "$as_me: WARNING: Wyrd requires Remind version 03.01.00 or greater." >&2;} fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Wyrd requires Remind version 03.00.24 or greater." >&5 $as_echo "$as_me: WARNING: Wyrd requires Remind version 03.00.24 or greater." >&2;} fi # recursively configure curses if test x"$try_utf8" = x"yes"; then ac_configure_args="$ac_configure_args --enable-widec" fi ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. subdirs="$subdirs curses" # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' # substitutions to perform # Finally create the Makefile from Makefile.in ac_config_files="$ac_config_files Makefile install.ml" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "install.ml") CONFIG_FILES="$CONFIG_FILES install.ml" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi # # CONFIG_SUBDIRS section. # if test "$no_recursion" != yes; then # Remove --cache-file, --srcdir, and --disable-option-checking arguments # so they do not pile up. ac_sub_configure_args= ac_prev= eval "set x $ac_configure_args" shift for ac_arg do if test -n "$ac_prev"; then ac_prev= continue fi case $ac_arg in -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \ | --c=*) ;; --config-cache | -C) ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) ;; --disable-option-checking) ;; *) case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_sub_configure_args " '$ac_arg'" ;; esac done # Always prepend --prefix to ensure using the same prefix # in subdir configurations. ac_arg="--prefix=$prefix" case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args" # Pass --silent if test "$silent" = yes; then ac_sub_configure_args="--silent $ac_sub_configure_args" fi # Always prepend --disable-option-checking to silence warnings, since # different subdirs can have different --enable and --with options. ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args" ac_popdir=`pwd` for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue # Do not complain, so a configure script can configure whichever # parts of a large source tree are present. test -d "$srcdir/$ac_dir" || continue ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)" $as_echo "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5 $as_echo "$ac_msg" >&6 as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" # Check for guested configure; otherwise get Cygnus style configure. if test -f "$ac_srcdir/configure.gnu"; then ac_sub_configure=$ac_srcdir/configure.gnu elif test -f "$ac_srcdir/configure"; then ac_sub_configure=$ac_srcdir/configure elif test -f "$ac_srcdir/configure.in"; then # This should be Cygnus configure. ac_sub_configure=$ac_aux_dir/configure else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5 $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;} ac_sub_configure= fi # The recursion is here. if test -n "$ac_sub_configure"; then # Make the cache file name correct relative to the subdirectory. case $cache_file in [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;; *) # Relative name. ac_sub_cache_file=$ac_top_build_prefix$cache_file ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 $as_echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;} # The eval makes quoting arguments work. eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \ --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" || as_fn_error $? "$ac_sub_configure failed for $ac_dir" "$LINENO" 5 fi cd "$ac_popdir" done fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi chmod a-w Makefile wyrd-1.4.6/main.ml0000644000175000017500000000713512103356067012462 0ustar paulpaul(* Wyrd -- a curses-based front-end for Remind * Copyright (C) 2005, 2006, 2007, 2008, 2010, 2011-2013 Paul Pelzl * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, Version 2, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Bug reports can be entered at http://bugs.launchpad.net/wyrd . * For anything else, feel free to contact Paul Pelzl at . *) open Interface;; open Curses;; (* Load run configuration file *) Rcfile.process_rcfile None;; (* Parse command-line options *) let parse_anonymous_opt anon = Rcfile.reminders_file := anon in let usage = "Usage: wyrd [OPTIONS] [FILE]\n" ^ "Open a front-end to remind(1) using FILE as the reminders file.\n\nOPTIONS:" in let show_version () = print_endline ("Wyrd v" ^ Version.version); print_endline "Copyright (C) 2005, 2006, 2007 Paul Pelzl"; print_endline ""; print_endline "Wyrd comes with ABSOLUTELY NO WARRANTY. This is Free Software,"; print_endline "and you are welcome to redistribute it under certain conditions;"; print_endline "see the source code for details."; print_endline ""; exit 0; in let event_desc_opt = ref None in let do_quick_event event_desc = event_desc_opt := Some event_desc in let parse_definition = [ ("--version", Arg.Unit show_version, " Display version information and exit"); ("-a", Arg.String do_quick_event, " Add given event to reminders file and exit"); ("--add", Arg.String do_quick_event, " Add given event to reminders file and exit"); ] in Arg.parse (Arg.align parse_definition) parse_anonymous_opt usage; (* After parsing all arguments, handle quick reminders. We have to * do it in this order so that the filename (anonymous option) gets * set prior to creating the new event. *) begin match !event_desc_opt with | Some event_desc -> begin try let _ = Interface_main.append_quick_event event_desc !Rcfile.reminders_file in exit 0 with Time_lang.Event_parse_error s -> Printf.fprintf stderr "Error: %s\n" s; exit 1 end | None -> () end;; let initialize_screen () = if Curses_config.wide_ncurses then (* ncursesw doesn't render non-ASCII without the setlocale() call *) let _ = Locale.setlocale Locale.LC_ALL "" in () else (); let std = initscr () in begin try assert (start_color ()); assert (use_default_colors ()); Rcfile.validate_colors () with _ -> endwin (); failwith "Your terminal emulator does not support color." end; assert (keypad std true); assert (cbreak ()); assert (halfdelay 100); assert (noecho ()); begin try assert (curs_set 0) with _ -> () end; Interface_main.create_windows std;; let iface = Interface.make (initialize_screen ());; try Interface_main.run iface with error -> endwin (); Printf.fprintf stderr "Caught error at toplevel:\n%s\n" (Printexc.to_string error); if Printexc.backtrace_status () then Printf.fprintf stderr "\nBacktrace:\n\n%s\n" (Printexc.get_backtrace ()) else ();; (* arch-tag: DO_NOT_CHANGE_eeac13df-e93f-4359-8b70-44fefc40e225 *) wyrd-1.4.6/Makefile.in0000644000175000017500000001205212103356067013243 0ustar paulpaul# # sample Makefile for Objective Caml # Copyright (C) 2001 Jean-Christophe FILLIATRE # # modified 10/26/2003 by Paul Pelzl, for the purpose of building Orpie # modified 03/28/2005 by Paul Pelzl, for the purpose of building Wyrd # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License version 2, as published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Library General Public License version 2 for more details # (enclosed in the file LGPL). # where to install the binaries, rcfiles, manpages, etc. prefix = @prefix@ exec_prefix = @exec_prefix@ sysconfdir = @sysconfdir@ datarootdir = @datarootdir@ BINDIR = $(DESTDIR)/@bindir@ MANDIR = $(DESTDIR)/@mandir@ # other variables set by ./configure OCAMLC = @OCAMLC@ OCAMLOPT = @OCAMLOPT@ OCAMLDEP = @OCAMLDEP@ OCAMLLIB = @OCAMLLIB@ OCAMLBEST = @OCAMLBEST@ OCAMLLEX = @OCAMLLEX@ OCAMLYACC = @OCAMLYACC@ OCAMLVERSION = @OCAMLVERSION@ OCAMLWIN32 = @OCAMLWIN32@ EXE = @EXE@ DEFS = @DEFS@ CC = @CC@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ INSTALL = @INSTALL@ INCLUDES = -I ./curses BFLAGS = -pp camlp4o -g $(INCLUDES) OFLAGS = -pp camlp4o -g $(INCLUDES) DEPFLAGS = -pp camlp4o # main target ############# NAME = wyrd all: $(NAME) $(NAME): $(OCAMLBEST) rm -f $(NAME) && ln -s $(NAME).$(OCAMLBEST) $(NAME) # bytecode and native-code compilation ###################################### CMO = install.cmo version.cmo utility.cmo rcfile.cmo time_lang.cmo interface.cmo cal.cmo \ remind.cmo interface_draw.cmo interface_main.cmo locale.cmo main.cmo CMX = $(CMO:.cmo=.cmx) CMA = str.cma unix.cma CMXA = $(CMA:.cma=.cmxa) COBJS = locale_wrap.o CURSES_CMA = curses/curses.cma CURSES_CMXA = curses/curses.cmxa GENERATED = version.ml byte: $(NAME).byte opt: $(NAME).opt $(NAME).byte: $(COBJS) $(CURSES_CMA) $(CMO) $(OCAMLC) $(BFLAGS) -o $@ $(CURSES_CMA) $(COBJS) $(CMA) $(CMO) $(NAME).opt: $(COBJS) $(CURSES_CMXA) $(CMX) $(OCAMLOPT) $(OFLAGS) -o $@ $(CURSES_CMXA) $(COBJS) $(CMXA) $(CMX) VERSION=1.4.6 version.ml: Makefile echo "let version = \""$(VERSION)"\"" > version.ml echo "let date = \""`date`"\"" >> version.ml $(CURSES_CMA) $(CURSES_CMXA) .stamp_built_curses: $(MAKE) -C curses byte opt && touch .stamp_built_curses $(CMO) $(CMX): .stamp_built_curses # The curses build script does not respond well to getting invoked # by simultaneous processes. .NOTPARALLEL: # installation ############## install-indep: mkdir -p $(BINDIR) mkdir -p $(DESTDIR)/$(sysconfdir) mkdir -p $(MANDIR)/man1 mkdir -p $(MANDIR)/man5 $(INSTALL) -m 644 wyrdrc $(DESTDIR)/$(sysconfdir) $(INSTALL) -m 644 doc/wyrd.1 $(MANDIR)/man1/wyrd.1 $(INSTALL) -m 644 doc/wyrdrc.5 $(MANDIR)/man5/wyrdrc.5 install: install-indep $(INSTALL) -m 755 $(NAME).$(OCAMLBEST) $(BINDIR) mv $(BINDIR)/$(NAME).$(OCAMLBEST) $(BINDIR)/$(NAME) install-byte: install-indep $(INSTALL) -m 755 $(NAME).byte $(BINDIR) mv $(BINDIR)/$(NAME).byte $(BINDIR)/$(NAME) install-opt: install-indep $(INSTALL) -m 755 $(NAME).opt $(BINDIR) mv $(BINDIR)/$(NAME).opt $(BINDIR)/$(NAME) uninstall: rm -f $(BINDIR)/$(NAME)$(EXE) rm -f $(DESTDIR)/$(sysconfdir)/wyrdrc rm -f $(MANDIR)/man1/wyrd.1 rm -f $(MANDIR)/man5/wyrdrc.5 # generic rules ############### .SUFFIXES: # generic build rules for toplevel directory %.cmi : %.mli $(OCAMLC) -c $(BFLAGS) $< %.cmo : %.ml $(OCAMLC) -c $(BFLAGS) $< %.o : %.ml $(OCAMLOPT) -c $(OFLAGS) $< %.cmx : %.ml $(OCAMLOPT) -c $(OFLAGS) $< %.ml : %.mll $(OCAMLLEX) $< %.ml : %.mly $(OCAMLYACC) -v $< %.mli : %.mly $(OCAMLYACC) -v $< %.o : %.c $(OCAMLC) -c $< # Emacs tags ############ tags: find . -name "*.ml*" | sort -r | xargs \ etags "--regex=/let[ \t]+\([^ \t]+\)/\1/" \ "--regex=/let[ \t]+rec[ \t]+\([^ \t]+\)/\1/" \ "--regex=/and[ \t]+\([^ \t]+\)/\1/" \ "--regex=/type[ \t]+\([^ \t]+\)/\1/" \ "--regex=/exception[ \t]+\([^ \t]+\)/\1/" \ "--regex=/val[ \t]+\([^ \t]+\)/\1/" \ "--regex=/module[ \t]+\([^ \t]+\)/\1/" # vi tags ######### vtags: otags -vi -o tags *.ml # Makefile is rebuilt whenever Makefile.in or configure.ac is modified ###################################################################### Makefile: Makefile.in config.status ./config.status config.status: configure ./config.status --recheck configure: configure.ac autoconf # clean ####### partly-clean:: rm -f *.cm[iox] *.o *.a *~ rm -f $(GENERATED) rm -f $(NAME) $(NAME).byte $(NAME).opt rm -f *.aux *.log $(NAME).tex $(NAME).dvi $(NAME).ps curses-clean:: $(MAKE) -C curses clean && rm -f .stamp_built_curses clean:: partly-clean curses-clean dist-clean distclean:: clean rm -f Makefile config.cache config.log config.status install.ml # depend ######## depend:: $(OCAMLDEP) -pp camlp4o $(INCLUDES) *.ml *.mli > depend include depend wyrd-1.4.6/wyrdrc0000644000175000017500000001323212103356067012434 0ustar paulpaul# Wyrd run-configuration file # command for the Remind executable set remind_command="remind" # the default reminder file or directory to display set reminders_file="$HOME/.reminders" # command for editing an old appointment, given a line number %line% and filename %file% set edit_old_command="$EDITOR +%line% \"%file%\"" # command for editing a new appointment, given a filename %file% set edit_new_command="$EDITOR +999999 \"%file%\"" # command for free editing of the reminders file, given a filename %file% set edit_any_command="$EDITOR \"%file%\"" # templates for creating new appointments # %monname% -> month name, %mon% -> month number, %mday% -> day of the month, # %year% -> year, %hour% -> hour, %min% -> minute, %wdayname% -> weekday name # %wday% -> weekday number set timed_template="REM %monname% %mday% %year% AT %hour%:%min% DURATION 1:00 MSG " set untimed_template="REM %monname% %mday% %year% MSG " # weekly recurrence set template0="REM %wdayname% AT %hour%:%min% DURATION 1:00 MSG " set template1="REM %wdayname% MSG " # monthly recurrence set template2="REM %mday% AT %hour%:%min% DURATION 1:00 MSG " set template3="REM %mday% MSG " # algorithm to use for determining busy level # "1" -> count the number of reminders in each day # "2" -> count the number of hours of reminders in each day set busy_algorithm="1" # for busy_algorithm="2", assume that untimed reminders occupy this many minutes set untimed_duration="60" # if busy_algorithm="1", number of reminders per day allowed for each calendar # colorization level; if busy_algorithm="2", use number of hours of reminders # per day set busy_level1="1" # level1 color set busy_level2="3" # level2 color set busy_level3="5" # level2 color, bold set busy_level4="7" # level3 color # (everything else is level3 color, bold) # first day of the week is Sunday set week_starts_monday="false" # 12/24 hour time settings set schedule_12_hour="false" set selection_12_hour="true" set status_12_hour="true" set description_12_hour="true" # whether or not to keep the cursor centered when scrolling through timed # reminders set center_cursor="false" # date syntax for the 'go to date' command can be big or little endian set goto_big_endian="true" # date syntax for the "quick reminder" command can be US style # (6/1 -> June 1) or non-US style (6/1 -> January 6) set quick_date_US="true" # whether or not to number weeks within the month calendar set number_weeks="false" # whether or not the cursor should follow the current time # after pressing the "home" key set home_sticky="true" # whether or not to display advance warnings set advance_warning="false" # width of the untimed reminders window set untimed_window_width="40" # whether or not to render untimed reminders in boldface set untimed_bold="true" # key bindings bind "j" scroll_down bind "" scroll_down bind "k" scroll_up bind "" scroll_up bind "h" switch_window bind "l" switch_window bind "" switch_window bind "" switch_window bind "" previous_day bind "4" previous_day bind "<" previous_day bind "H" previous_day bind "" next_day bind "6" next_day bind ">" next_day bind "L" next_day bind "8" previous_week bind "[" previous_week bind "K" previous_week bind "2" next_week bind "]" next_week bind "J" next_week bind "{" previous_month bind "}" next_month bind "" home bind "g" goto bind "z" zoom bind "" edit bind "" edit bind "e" edit_any bind "y" copy bind "X" cut bind "p" paste bind "P" paste_dialog bind "d" scroll_description_up bind "D" scroll_description_down bind "q" quick_add bind "t" new_timed bind "T" new_timed_dialog bind "u" new_untimed bind "U" new_untimed_dialog bind "w" new_template0 bind "W" new_template1 bind "m" new_template2 bind "M" new_template3 bind "n" search_next bind "/" begin_search bind "" next_reminder bind "r" view_remind bind "R" view_remind_all bind "c" view_week bind "C" view_month bind "?" help bind "\\Cl" refresh bind "Q" quit bind "" entry_complete bind "" entry_complete bind "" entry_backspace bind "" entry_cancel # set up the colors color help green blue color timed_default white black color timed_current white red color timed_reminder1 yellow blue color timed_reminder2 white red color timed_reminder3 white green color timed_reminder4 yellow magenta color untimed_reminder white black color timed_date cyan black color selection_info green blue color description white black color status green blue color calendar_labels white black color calendar_level1 white black color calendar_level2 blue black color calendar_level3 magenta black color calendar_today white red color left_divider cyan blue color right_divider cyan blue # arch-tag: DO_NOT_CHANGE_ee9bb855-2fde-4a61-8645-8ba31b35eaab wyrd-1.4.6/ChangeLog0000644000175000017500000002647312103356067012764 0ustar paulpaulWyrd ChangeLog -------------------------------------------------------------------------------- 2013-02-02 Release 1.4.6: * Fixed a failure to quote filenames in the editor commands provided by the default wyrdrc. * Fixed a crash when the terminal is resized while wyrd is executing an external editor or browser. (In some environments, this would happen every time a reminder file is edited.) * Fixed 'configure' errors when compiling with OCaml 4. * Added Oasis metadata. * Added automatic refresh of the display when reminder files are modified. * Added a backtrace printout for unhandled exceptions. * Fixed a parallel-make race conditoin resulting from integration of upstream ocaml-curses. * Fixed a crash when the terminal is resized. * Fixed some crashes which could be triggered by pressing arrow keys or entering non-printable characters from the "quick add" entry field. 2010-10-23 Release 1.4.5: * Switched from personal fork of OCaml curses bindings to the community-maintained library from http://www.nongnu.org/ocaml-tmk/ . * Fixed bug which prevented "quick add" feature from accepting UTF-8 encoded text. * Implemented improved support for Remind's new "reminder directory" capability. 2008-02-21 Release 1.4.4: * Fixed an instance of insecure tempfile creation. This addresses a security vulnerability that had the potential to cause data loss. 2007-08-17 Release 1.4.3: * Modified the configure script to support weird locations of ncurses term.h . * Deprecated the 'calendar_selection' colorable object. For consistency with the rest of the Wyrd interface, the selected calendar day is now rendered in reverse video. * Added the 'untimed_bold' configuration variable for selecting between normal and boldface rendering of untimed reminders. * Added support for remind's 'filedir()' function within INCLUDE directives, for those who like to "INCLUDE [filedir()]/some-extra-reminders". Thanks to Stefan Wehr for the patch. * Implemented more extensive shell-expansion of filenames specified within wyrdrc, enabling the use of idioms like 'set reminders_file="$DOT_REMINDERS"'. * Added support for Remind 3.1.0 advance warning of reminders throughout the Wyrd interface, enabled via the 'advance_warning' configuration variable. * Support new Remind 3.1.0 date formatting. 2007-05-25 Release 1.4.2: * Added the untimed_window_width rcfile option, which lets the user set the width of the windows on the right side of the display. * Tweaked the resize handler so Wyrd does not completely die when the terminal is resized too small. * Made modifications to support rendering UTF-8 reminders (requires ncurses built with wide char support) * the home_sticky option, allowing the cursor position to automatically track the current time. * Added command-line option to append reminders using the natural language parser. * Eliminated dependence on Bash-style tilde expansion. 2006-07-16 Release 1.4.1: * Fixed the "blank screen" bug that resulted from I/O buffering synchronization issues. * Fixed an error with registering certain color schemes. * Corrected typo in the word "July". * Added the 'quick_date_US' option, allowing users to choose between "month first" or "day first" conventions when entering quick reminders with numeric dates. 2006-06-26 Release 1.4.0: * Added the 'default' color specifier, which accesses the default terminal foreground and background colors. (A 'default' background color also enables background transparency on terminal emulators which support it.) * Reduced the minimum terminal height to 23 lines, so screen(1) users should always be able to use a status bar. * Fixed a bug that caused events with zero duration to overlap. Implemented "quick reminder" command, allowing the user to quickly describe an event using natural language (USA English, at least). * Changed the substitution strings used within wyrdrc, to prevent namespace collisions with Remind's substitution filter. (This breaks compatibility with old wyrdrc files.) * Corrected a bug in the chronological ordering of untimed reminders. * Added some checks to prevent scrolling outside the acceptable date range. * Implemented optional ISO-8601 week numbering. Made some corrections to the coloring code. * Code cleanup. * Remind errors are now handled somewhat sanely. 2006-02-24 Release 1.3.0: * Set the default editor to $EDITOR. * Errors are now detected when launching an editor. * Improved the Remind version detection within the build script. * Implemented the 'goto' operation, which allows the user to manually enter a date and then jump immediately to that day. The boolean option 'goto_big_endian' selects whether dates are represented using YYYYMMDD or DDMMYYYY format. * Implemented the 'cut', 'copy', and 'paste' operations, which provide a convenient interface to duplicate or reschedule reminders. * The 'edit_any' command now spawns a selection dialog only when the user has multiple reminder files. 2005-11-20 Release 1.2.0: * Added the 'busy_algorithm' and 'untimed_duration' configuration variables, which can be used to set the algorithm for determining the "busy" level for each day on the month calendar. There are two algorithms to choose from: count number of triggered reminders per day, or count number of hours of reminders per day. * The configuration script now checks for acceptable versions of OCaml and Remind. * Corrected the build script to support parallel make once again. * Replaced the deprecated "tail -1" syntax in the configure script. * Fixed an off-by-one error in the resize handler, which could cause the Wyrd status line to appear on two different lines. * Fixed a bug that could cause find_next and next_reminder to fail. * Added the configuration variable 'remind_command', which can be used to specify the Remind executable. * The current date and time are now highlighted within the month calendar and timed reminders window, according to the color values set for 'calendar_today' and 'timed_current'. (The selected date is now highlighted in the calendar window according to the 'calendar_selection' setting, rather than the 'calendar_today' setting.) * If there are multiple reminders listed in the message window, they are now sorted by starting timestamp. * Wyrd now chooses tempfile names that are unique for each user. * Added the 'help' command, which generates a list of all keybindings. 2005-09-21 Release 1.1.1: * Updated the build script to support the NetBSD environment. * Implemented a built-in calendar layout algorithm, and removed the dependence on cal(1). 2005-09-15 Release 1.1.0: * Implemented the 'next_reminder' command, which jumps forward to the next reminder in chronological order. * Made 'search_next' more robust--certain edge cases are now handled better. * Improved the alignment of timestamps in the reminder description window. * Fixed a typo in the short string representation for Tuesday. * Implemented the 'view_week' and 'view_month' commands, which view Remind's formatted weekly or monthly calendars for the selected date. * Implemented the 'edit_any' command and associated 'edit_any_template', which can be used to edit a reminder file without selecting any particular reminder. * The untimed reminders window now accepts focus even when there are no untimed reminders. * Executing the 'edit' command on a blank timeslot now creates a new timed reminder. Hitting 'edit' on a blank untimed reminders list creates a new untimed reminder. * Added support for 'nodisplay' and 'noweight' TAG parameters, which can be used to suppress display of reminders or give them no weight when determining the "busy level" colorations on the month calendar. * Removed nonsensical DURATION specifiers from default weekly and monthly untimed reminder templates. * Added the 'center_cursor' option, which can be used to fix the cursor in the center of the timed reminders window while scrolling. * Fixed an assertion failure caused by entering an unprintable character in a search string. 2005-06-23 Release 1.0.0: * Added a screen refresh function. * Implemented overlapping timed reminders and associated routines for handling multiple reminders in a single timeslot. Colorable object 'timed_reminder' has been deprecated in favor of 'timed_reminder1' through 'timed_reminder4', so that overlapping reminders can be given different colors. * Corrected the disappearing cursor bug associated with jumping between days with differing numbers of untimed reminders. 2005-05-04 Release 0.3.0: * Converted the documentation to LaTeX format, with PDF, HTML, and manpage targets. * Added "new_*_dialog" commands for creating new reminders. These commands will generate a selection dialog for choosing which reminder file to add the new reminder to. * Added a bunch of generic user-defined reminder templates. By default, some of these are configured to generate weekly and monthly reminders. * Added a beep and error message when pressing an unbound key. * Start and end times in the description window had been rendered according to the value of schedule_12_hour; now they are rendered according to the value of new variable description_12_hour . * a rare bug that could cause timed reminders to become temporarily invisible at month boundaries. * Optimized rendering of timed reminders window when scrolling (should be a little smoother now on slow hardware). 2005-04-26 Release 0.2.0: * Made colors configurable via the rcfile. * Made time representation (12/24 hour) configurable via the rcfile. * Implemented external viewing of triggered reminders ("rem -q -g") via less(1). * Added a resize handler. * Added a configuration variable to switch the first day of the week between Sunday and Monday. * Wyrd now accepts an optional reminders file as a command-line parameter. 2005-04-16 Release 0.1.3: * A more suitable error message is generated when trying to run Wyrd on terminals without color support. * Wyrd now discards exceptions due to errors on curs_set(), which is not supported in all terminals. * Made installation script portable to BSD install(1). 2005-04-15 Release 0.1.2: * Upon further investigation, cpp appears to be completely broken on OS X. Wyrd now ships with pre-preprocessed ML files. 2005-04-15 Release 0.1.1: * Changed invocations of 'cpp' to 'cpp -P' to correct compilation errors on OS X, maybe others. 2005-04-15 Release 0.1.0: * Initial release. wyrd-1.4.6/update_boilerplate.py0000755000175000017500000000303612103356067015421 0ustar paulpaul#!/usr/bin/env python import re from glob import glob BOILERPLATE = """\ (* Wyrd -- a curses-based front-end for Remind * Copyright (C) 2005, 2006, 2007, 2008, 2010, 2011-2013 Paul Pelzl * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, Version 2, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Bug reports can be entered at http://bugs.launchpad.net/wyrd . * For anything else, feel free to contact Paul Pelzl at . *)""" boilerplate_regex = re.compile(r'\(\*.*?\*\)', re.DOTALL) def update_boilerplate(filename): with open(filename, 'r') as f: content = f.read() content = boilerplate_regex.sub(BOILERPLATE, content, 1) with open(filename, 'w') as f: f.write(content) AUTOGENERATED = ['install.ml', 'version.ml', 'setup.ml', 'make_oasis.ml'] FILENAMES = [x for x in glob('*.ml') + glob('*.mli') + glob('*.ml.in') if x not in AUTOGENERATED] for filename in FILENAMES: print 'Updating %s...' % filename update_boilerplate(filename) wyrd-1.4.6/_oasis0000644000175000017500000000145112103356102012365 0ustar paulpaulOASISFormat: 0.2 Name: wyrd Version: 1.4.6 Synopsis: curses front-end for 'remind' calendar application Homepage: http://pessimization.com/software/wyrd Authors: Paul Pelzl License: GPL-2.0 LicenseFile: COPYING PostConfCommand: touch setup.data ConfType: custom (0.2) BuildType: custom (0.2) InstallType: custom (0.2) XCustomConf: ./configure XCustomBuild: make XCustomBuildClean: make clean XCustomBuildDistclean: make distclean XCustomInstall: make install XCustomUninstall: make uninstall Executable wyrd Path: . MainIs: main.ml wyrd-1.4.6/remind.ml0000644000175000017500000010135512103356067013013 0ustar paulpaul(* Wyrd -- a curses-based front-end for Remind * Copyright (C) 2005, 2006, 2007, 2008, 2010, 2011-2013 Paul Pelzl * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, Version 2, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Bug reports can be entered at http://bugs.launchpad.net/wyrd . * For anything else, feel free to contact Paul Pelzl at . *) (* remind.ml * functions for interfacing with 'remind(1)' *) exception Occurrence_not_found open Utility (* Define a Set that takes pairs of integers as keys. *) module IntPair = struct type t = int * int let compare i j = Pervasives.compare i j end module IPSet = Set.Make (IntPair) (* A record for an individual timed reminder, as read from * the output of 'remind -s'. *) type timed_rem_t = { tr_start : float; tr_end : float; tr_msg : string; tr_filename : string; tr_linenum : string; tr_has_weight : bool } (* A record for an individual untimed reminder, as read from * the output of 'remind -s'. *) type untimed_rem_t = { ur_start : float; ur_msg : string; ur_filename : string; ur_linenum : string; ur_has_weight : bool } (* Storage for a three-month window of reminders and * the calendar for the current month. * Makes it possible to handle edge effects of moving * from month to month without constantly calling * rem(1) and regenerating calendar layouts. * * Timed reminders are stored in an array of lists, * with each element of the array representing a different * indentation level on the timetable. Untimed reminders * have no indentation, so they are simply stored in * lists. *) type three_month_rem_t = { curr_timestamp : float; prev_timed : timed_rem_t list array; curr_timed : timed_rem_t list array; next_timed : timed_rem_t list array; all_timed : timed_rem_t list array; prev_untimed : untimed_rem_t list; curr_untimed : untimed_rem_t list; next_untimed : untimed_rem_t list; all_untimed : untimed_rem_t list; curr_counts : int array; curr_cal : Cal.t; remind_error : string } (* Get the starting timestamp and time record for a given month *) let month_start_of_tm tm = let month_start_tm = {empty_tm with Unix.tm_mon = tm.Unix.tm_mon; Unix.tm_year = tm.Unix.tm_year; } in Unix.mktime month_start_tm (* Process information about a timed reminder, create a new reminder * record for it, and store it in the timed reminders array at the * proper indentation level. * * The indentation levels are determined by maintaining an array that indicates * which levels have been used for each hourly timeslot. As each reminder is * processed, we look into the array to find the smallest indentation level * available. Complexity is approximately * (number of reminders) * (average reminder duration). Since indentation is * determined a month at a time, there may be some minor discrepancies at * month borders. *) let process_timed tm duration_s month_start_ts indentations partial_trem timed = let (f_rem_ts, _) = Unix.mktime tm in let duration = if duration_s = "*" then 0.0 else float_of_string duration_s in (* compute the indentation level *) (* top_index and bottom_index provide the range of row indices into * array indentations that are covered by this reminder *) let top_index = try int_of_float ((f_rem_ts -. month_start_ts) /. 3600.0) with _ -> 0 in let bottom_index = try let real_bottom_index = let shift = if duration > 0.0 then (f_rem_ts +. (duration *. 60.0) -. month_start_ts) /. 3600.0 else (f_rem_ts +. (duration +. 60.0) -. month_start_ts) /. 3600.0 in (* catch the edge effects when reminders end on hour boundaries *) if shift = float_of_int (int_of_float shift) then pred (int_of_float shift) else int_of_float shift in (* the bottom index could flow off of this month, in which case * we truncate and hope everything works out *) if real_bottom_index > pred (Array.length indentations) then pred (Array.length indentations) else real_bottom_index with _ -> top_index in (* locate the smallest free indentation level *) let rec find_indent level = if level < Array.length indentations.(0) then begin let collision = ref false in for i = top_index to bottom_index do if indentations.(i).(level) then collision := true else () done; if !collision then find_indent (succ level) else begin for i = top_index to bottom_index do indentations.(i).(level) <- true done; level end end else (* give up and default to maximum indentation *) pred (Array.length indentations.(0)) in let indent = find_indent 0 in let trem = {partial_trem with tr_start = f_rem_ts; tr_end = f_rem_ts +. (duration *. 60.); } in timed.(indent) <- trem :: timed.(indent) (* Obtain two lists of reminders for the month of the timestamp argument. * The first list is for timed reminders, the second is for untimed. * The timed reminders list also provides the indentation levels that * draw_timed should use to render each reminder. * * The indentation levels are determined by maintaining an array that indicates * which levels have been used for each hourly timeslot. As each reminder is * processed, we look into the array to find the smallest indentation level * available. Complexity is approximately * (number of reminders) * (average reminder duration). Since indentation is * determined a month at a time, there may be some minor discrepancies at * month borders. * * The optional argument 'suppress_advwarn', if true, will override * the "advance_warning" rcfile option. *) let month_reminders ?(suppress_advwarn=false) timestamp = let comment_regex = Str.regexp "^#.*fileinfo \\([^ ]+\\) \\(.*\\)$" in let rem_regex = Str.regexp "\\([^ ]+\\) [^ ]+ \\([^ ]+\\) \\([^ ]+\\) \\([^ ]+\\) \\(.*\\)$" in let nodisplay_regex = Str.regexp_case_fold ".*nodisplay" in let noweight_regex = Str.regexp_case_fold ".*noweight" in let tm = Unix.localtime timestamp in let rem_date_str = (string_of_tm_mon tm.Unix.tm_mon) ^ " " ^ (string_of_int tm.Unix.tm_mday) ^ " " ^ (string_of_int (tm.Unix.tm_year + 1900)) in let remind_s_flag = if suppress_advwarn then " -s" else if !Rcfile.advance_warning then " -sa" else " -s" in let full_remind_command = !Rcfile.remind_command ^ remind_s_flag ^ " -l -g -b2 " ^ !Rcfile.reminders_file ^ " " ^ rem_date_str in let (out_lines, err_lines) = Utility.read_all_shell_command_output full_remind_command in (* check for Remind errors *) let remind_err = if List.length err_lines > 0 then List.hd err_lines else "" in let num_indentations = 4 in let indentations = Array.make_matrix (24 * 31) num_indentations false in let (month_start_ts, _) = month_start_of_tm tm in let timed = Array.make num_indentations [] in let rec build_lists lines untimed = begin match lines with | [] -> for i = 0 to pred (Array.length timed) do timed.(i) <- List.rev timed.(i) done; (remind_err, timed, List.rev untimed) | comment_line :: rem_line :: lines_tail -> begin try if Str.string_match comment_regex comment_line 0 then begin let line_num_s = Str.matched_group 1 comment_line and filename = Str.matched_group 2 comment_line in if Str.string_match rem_regex rem_line 0 then begin let date_s = Str.matched_group 1 rem_line and tag = Str.matched_group 2 rem_line and duration_s = Str.matched_group 3 rem_line and min_s = Str.matched_group 4 rem_line and msg = Str.matched_group 5 rem_line in (* further subdivide the date string *) let date_arr = Array.of_list (Str.split (Str.regexp "[/-]") date_s) in let year = int_of_string date_arr.(0) and month = int_of_string date_arr.(1) and day = int_of_string date_arr.(2) in let temp = {empty_tm with Unix.tm_mday = day; Unix.tm_mon = pred month; Unix.tm_year = year - 1900; } in (* check whether this reminder is tagged 'nodisplay' *) if (Str.string_match nodisplay_regex tag 0) then (* skip this reminder due to a 'nodisplay' tag *) build_lists lines_tail untimed else begin let has_weight = not (Str.string_match noweight_regex tag 0) in if min_s = "*" then (* if minutes are not provided, this must be an untimed reminder *) let (f_rem_ts, _) = Unix.mktime temp in let urem = { ur_start = f_rem_ts; ur_msg = msg; ur_filename = filename; ur_linenum = line_num_s; ur_has_weight = has_weight } in build_lists lines_tail (urem :: untimed) else begin (* if minutes are provided, this must be a timed reminder *) let temp_with_min = {temp with Unix.tm_min = int_of_string min_s} in let partial_trem = { tr_start = 0.0; (* still needs to be filled in *) tr_end = 0.0; (* still needs to be filled in *) tr_msg = msg; tr_filename = filename; tr_linenum = line_num_s; tr_has_weight = has_weight } in process_timed temp_with_min duration_s month_start_ts indentations partial_trem timed; build_lists lines_tail untimed end end end else (* if there was no rem_regex match, continue with next line *) build_lists (rem_line :: lines_tail) untimed end else (* if there was no comment_regex match, continue with next line *) build_lists (rem_line :: lines_tail) untimed with _ -> (* if there's an error in regexp matching or string coersion, * just drop that reminder and go to the next line *) build_lists (rem_line :: lines_tail) untimed end | comment_line :: [] -> (* this line doesn't conform to the spec, so throw it out *) build_lists [] untimed end in build_lists out_lines [] (* generate a count of how many reminders fall on any given day of * the month *) let count_reminders month_start_tm timed untimed = let rem_counts = Array.make 31 0 in let count_rems start has_weight = let tm = Unix.localtime start in if has_weight && tm.Unix.tm_year = month_start_tm.Unix.tm_year && tm.Unix.tm_mon = month_start_tm.Unix.tm_mon then let day = pred tm.Unix.tm_mday in rem_counts.(day) <- succ rem_counts.(day) else () in let count_timed rem = count_rems rem.tr_start rem.tr_has_weight in let count_untimed rem = count_rems rem.ur_start rem.ur_has_weight in Array.iter (List.iter count_timed) timed; List.iter count_untimed untimed; rem_counts (* generate a count of how many hours of reminders one has on * any given day of the month. Note: some minor errors can * occur during DST, but this is too small to worry about. *) let count_busy_hours month_start_tm timed untimed = let hour_counts = Array.make 31 0.0 in let last_day = let temp = {month_start_tm with Unix.tm_mday = 32} in let (_, nextmonth) = Unix.mktime temp in 32 - nextmonth.Unix.tm_mday in let count_hours start stop has_weight = if has_weight then for day = 1 to last_day do let day_tm = {month_start_tm with Unix.tm_mday = day} in let (day_ts, _) = Unix.mktime day_tm in if day_ts >= start then if stop > day_ts +. 86400. then hour_counts.(pred day) <- hour_counts.(pred day) +. 24. else if stop > day_ts then hour_counts.(pred day) <- hour_counts.(pred day) +. ((stop -. day_ts) /. 3600.) else () else if day_ts +. 86400. > start then if stop > day_ts +. 86400. then hour_counts.(pred day) <- hour_counts.(pred day) +. 24. -. ((start -. day_ts) /. 3600.) else hour_counts.(pred day) <- hour_counts.(pred day) +. ((stop -. start) /. 3600.) else () done else () in let count_timed rem = count_hours rem.tr_start rem.tr_end rem.tr_has_weight in let count_untimed rem = let stop = rem.ur_start +. (!Rcfile.untimed_duration *. 60.) in count_hours rem.ur_start stop rem.ur_has_weight in Array.iter (List.iter count_timed) timed; List.iter count_untimed untimed; Array.map int_of_float hour_counts (* determine the busy-ness level for each day in the month *) let count_busy month_tm timed untimed = let month_start_tm = { month_tm with Unix.tm_sec = 0; Unix.tm_min = 0; Unix.tm_hour = 0; Unix.tm_mday = 1 } in match !Rcfile.busy_algorithm with |1 -> count_reminders month_start_tm timed untimed |2 -> count_busy_hours month_start_tm timed untimed |_ -> Rcfile.config_failwith "busy_algorithm must be either 1 or 2" (* comparison functions for sorting reminders chronologically *) let cmp_timed rem_a rem_b = compare rem_a.tr_start rem_b.tr_start let cmp_untimed rem_a rem_b = compare rem_a.ur_start rem_b.ur_start (* take an array of timed reminder lists and merge them into * a single list sorted by starting timestamp *) let merge_timed timed = let all_rem = ref [] in for i = 0 to pred (Array.length timed) do all_rem := List.rev_append timed.(i) !all_rem done; List.fast_sort cmp_timed !all_rem (* same thing as List.append (or @), but tail-recursive *) let safe_append a b = List.rev_append (List.rev a) b (* initialize a new three-month reminder record *) let create_three_month ?(suppress_advwarn=false) timestamp = let month_start_tm = { Unix.localtime timestamp with Unix.tm_sec = 0; Unix.tm_min = 0; Unix.tm_hour = 0; Unix.tm_mday = 1 } in let (curr_ts, _) = Unix.mktime month_start_tm in let temp_prev = { month_start_tm with Unix.tm_mon = pred month_start_tm.Unix.tm_mon } in let temp_next = { month_start_tm with Unix.tm_mon = succ month_start_tm.Unix.tm_mon } in let (prev_ts, _) = Unix.mktime temp_prev and (next_ts, _) = Unix.mktime temp_next in let (pre, pt, pu) = month_reminders ~suppress_advwarn:suppress_advwarn prev_ts in let (cre, ct, cu) = month_reminders ~suppress_advwarn:suppress_advwarn curr_ts in let (nre, nt, nu) = month_reminders ~suppress_advwarn:suppress_advwarn next_ts in let at = Array.make (Array.length pt) [] in for i = 0 to pred (Array.length at) do at.(i) <- safe_append pt.(i) (safe_append ct.(i) nt.(i)) done; let err_str = if String.length pre > 0 then pre else if String.length cre > 0 then cre else nre in let au = safe_append pu (safe_append cu nu) in { curr_timestamp = curr_ts; prev_timed = pt; curr_timed = ct; next_timed = nt; all_timed = at; prev_untimed = pu; curr_untimed = cu; next_untimed = nu; all_untimed = au; curr_counts = count_busy month_start_tm at au; curr_cal = Cal.make curr_ts !Rcfile.week_starts_monday; remind_error = err_str } (* Update a three-month reminders record for the next month *) let next_month reminders = let curr_tm = Unix.localtime reminders.curr_timestamp in let temp1 = { curr_tm with Unix.tm_mon = succ curr_tm.Unix.tm_mon } in let temp2 = { curr_tm with Unix.tm_mon = curr_tm.Unix.tm_mon + 2 } in let (new_curr_timestamp, temp1) = Unix.mktime temp1 in let (next_timestamp, temp2) = Unix.mktime temp2 in let (re, t, u) = month_reminders next_timestamp in let at = Array.make (Array.length t) [] in for i = 0 to pred (Array.length t) do at.(i) <- safe_append reminders.curr_timed.(i) (safe_append reminders.next_timed.(i) t.(i)) done; let au = safe_append reminders.curr_untimed (safe_append reminders.next_untimed u) in { curr_timestamp = new_curr_timestamp; prev_timed = reminders.curr_timed; curr_timed = reminders.next_timed; next_timed = t; all_timed = at; prev_untimed = reminders.curr_untimed; curr_untimed = reminders.next_untimed; next_untimed = u; all_untimed = au; curr_counts = count_busy temp1 at au; curr_cal = Cal.make new_curr_timestamp !Rcfile.week_starts_monday; remind_error = re } (* Update a three-month reminders record for the previous month *) let prev_month reminders = let curr_tm = Unix.localtime reminders.curr_timestamp in let temp1 = { curr_tm with Unix.tm_mon = pred curr_tm.Unix.tm_mon } in let temp2 = { curr_tm with Unix.tm_mon = curr_tm.Unix.tm_mon - 2 } in let (new_curr_timestamp, temp1) = Unix.mktime temp1 in let (prev_timestamp, temp2) = Unix.mktime temp2 in let (re, t, u) = month_reminders prev_timestamp in let at = Array.make (Array.length t) [] in for i = 0 to pred (Array.length t) do at.(i) <- safe_append t.(i) (safe_append reminders.prev_timed.(i) reminders.curr_timed.(i)) done; let au = safe_append u (safe_append reminders.prev_untimed reminders.curr_untimed) in { curr_timestamp = new_curr_timestamp; prev_timed = t; curr_timed = reminders.prev_timed; next_timed = reminders.curr_timed; all_timed = at; prev_untimed = u; curr_untimed = reminders.prev_untimed; next_untimed = reminders.curr_untimed; all_untimed = au; curr_counts = count_busy temp1 at au; curr_cal = Cal.make new_curr_timestamp !Rcfile.week_starts_monday; remind_error = re } (* Return a new reminders record centered on the current timestamp, * doing as little work as possible. *) let update_reminders rem timestamp = let tm = Unix.localtime timestamp and rem_tm = Unix.localtime rem.curr_timestamp in if tm.Unix.tm_year = rem_tm.Unix.tm_year && tm.Unix.tm_mon = rem_tm.Unix.tm_mon then rem else let temp1 = { rem_tm with Unix.tm_mon = pred rem_tm.Unix.tm_mon } in let temp2 = { rem_tm with Unix.tm_mon = succ rem_tm.Unix.tm_mon } in let (_, prev_tm) = Unix.mktime temp1 in let (_, next_tm) = Unix.mktime temp2 in if tm.Unix.tm_year = prev_tm.Unix.tm_year && tm.Unix.tm_mon = prev_tm.Unix.tm_mon then prev_month rem else if tm.Unix.tm_year = next_tm.Unix.tm_year && tm.Unix.tm_mon = next_tm.Unix.tm_mon then next_month rem else create_three_month timestamp (* Look at all 'next' reminders after the given timestamp. Search * through the list for the first occurrence of the search regexp, and return * a timestamp for that date. * This calls 'remind -n' twice--once for the current day, once for the next day. * The second call is necessary because reminders falling on the current day * but before the current timestamp will effectively suppress later recurrences * of that reminder. * * We also have to make a separate check that the matched reminder is not tagged * with 'nodisplay'; since these reminders don't show up on the display, Wyrd * should not be able to match them. *) let find_next msg_regex timestamp = let rem_regex = Str.regexp "^\\([^ ]+\\)[/-]\\([^ ]+\\)[/-]\\([^ ]+\\) [^ ]+ \\([^ ]+\\) [^ ]+ \\([^ ]+\\) \\([^ ]+.*\\)$" in let nodisplay_regex = Str.regexp_case_fold ".*nodisplay" in let tm1 = Unix.localtime timestamp in let temp = {tm1 with Unix.tm_mday = succ tm1.Unix.tm_mday} in (* add 24 hours *) let (_, tm2) = Unix.mktime temp in let rem_date_str1 = (string_of_tm_mon tm1.Unix.tm_mon) ^ " " ^ (string_of_int tm1.Unix.tm_mday) ^ " " ^ (string_of_int (tm1.Unix.tm_year + 1900)) in let rem_date_str2 = (string_of_tm_mon tm2.Unix.tm_mon) ^ " " ^ (string_of_int tm2.Unix.tm_mday) ^ " " ^ (string_of_int (tm2.Unix.tm_year + 1900)) in let remind_output_for_month date_str = let remind_month_command = !Rcfile.remind_command ^ " -n -s -b1 " ^ !Rcfile.reminders_file ^ " " ^ date_str in let (out_lines, _) = Utility.read_all_shell_command_output remind_month_command in out_lines in (* concatenate the outputs from two consecutive months of Remind data, then sort * the lines by leading datestamp *) let two_month_output = List.rev_append (remind_output_for_month rem_date_str1) (remind_output_for_month rem_date_str2) in let out_lines = List.fast_sort compare two_month_output in let rec check_messages lines = begin match lines with | [] -> raise Occurrence_not_found | line :: lines_tail -> begin try if Str.string_match rem_regex line 0 then begin (* go here if this line is a timed reminder *) let year = int_of_string (Str.matched_group 1 line) and month = int_of_string (Str.matched_group 2 line) and day = int_of_string (Str.matched_group 3 line) and tag = Str.matched_group 4 line and min_s = Str.matched_group 5 line and msg = Str.matched_group 6 line in let temp = {empty_tm with Unix.tm_min = if min_s = "*" then 0 else (int_of_string min_s); Unix.tm_mday = day; Unix.tm_mon = pred month; Unix.tm_year = year - 1900; } in let (ts, _) = Unix.mktime temp in if ts > timestamp then begin try let _ = Str.search_forward msg_regex msg 0 in (* only return the match if this value is not tagged 'nodisplay' *) if not (Str.string_match nodisplay_regex tag 0) then ts else check_messages lines_tail with Not_found -> check_messages lines_tail end else begin check_messages lines_tail end end else (* if there was no regexp match, continue with next line *) check_messages lines_tail with | Failure s -> (* if there's an error in string coersion, just drop that reminder and go * to the next line *) check_messages lines_tail end end in check_messages out_lines (* Get a list of file or directory names INCLUDEd in a specific reminders file *) let parse_include_directives remfile = let filedir = Filename.dirname remfile in try let remfile_channel = open_in remfile in (* match "include " *) let include_regex = Str.regexp_case_fold "^[ \t]*include[ \t]+\\([^ \t]+.*\\)$" in (* match "[filedir()]" so we can do a Remind-like directory substitution *) let filedir_regex = Str.regexp_case_fold "\\[[ \t]*filedir[ \t]*([ \t]*)[ \t]*\\]" in let rec build_filelist files = try let line = input_line remfile_channel in if Str.string_match include_regex line 0 then let include_expr = Utility.strip (Str.matched_group 1 line) in let new_file = Str.global_replace filedir_regex filedir include_expr in build_filelist (new_file :: files) else build_filelist files with End_of_file -> close_in remfile_channel; files in build_filelist [] with Sys_error _ -> (* File does not exist *) [] (* Given a directory name and an open handle to it, locate all *.rem files contained therein. * Closes the directory handle on exit. *) let find_remdir_scripts dirname remdir_handle = let safe_get_filename () = try Some (Unix.readdir remdir_handle) with End_of_file -> None in let rec listdir filelist = match safe_get_filename () with | Some filename -> listdir ((Filename.concat dirname filename) :: filelist) | None -> Unix.closedir remdir_handle; filelist in let is_rem_script filename = Filename.check_suffix filename ".rem" in List.filter is_rem_script (listdir []) (* Recursively compute a subtree of reminder files that Remind would execute * as a result of a single INCLUDE directive. is a list of * files and directories specified via a number of Remind INCLUDE statements. * is a Set of include directives which have already been * processed. is a list of filenames which are already * known to be included; this is effectively a subset of the . * * We test that a file or directory has been visited by statting it and testing for * containment of the (dev, inode) pair in the Set . This should * do the right thing in case of symlinks, relative paths, etc. *) let rec get_included_filenames known_included_filenames known_include_directives pending_include_directives = match pending_include_directives with | [] -> List.fast_sort compare known_included_filenames | include_directive :: remaining_include_directives -> begin try (* The (dev, inode) pair uniquely identifies a file or directory. *) let directive_id = let status = Unix.stat include_directive in (status.Unix.st_dev, status.Unix.st_ino) in if IPSet.mem directive_id known_include_directives then (* This include directive has already been processed... skip it *) get_included_filenames known_included_filenames known_include_directives remaining_include_directives else begin try (* This is a new include directive. Start by assuming it's a directory. If that works, * treat each of the .rem scripts inside this directory as a new INCLUDE directive. *) let remdir_handle = Unix.opendir include_directive in let new_include_directives = find_remdir_scripts include_directive remdir_handle in get_included_filenames known_included_filenames (IPSet.add directive_id known_include_directives) (List.rev_append new_include_directives remaining_include_directives) with Unix.Unix_error _ -> (* This include directive could not be opened as a directory. * Treat it as a regular file: parse it to locate additional * INCLUDE lines, and add the additional includes to the pending list. *) let new_include_directives = parse_include_directives include_directive in get_included_filenames (include_directive :: known_included_filenames) (IPSet.add directive_id known_include_directives) (List.rev_append new_include_directives remaining_include_directives) end with Unix.Unix_error (Unix.ENOENT, _, _) -> (* include_directive cannot be found on disk... skip it *) get_included_filenames known_included_filenames known_include_directives remaining_include_directives end (* Get a tuple of the form (primary remfile, all remfiles). If !Rcfile.reminders_file * is a single file, then "primary_remfile" is that file, and "all_remfiles" is * formed by parsing the INCLUDE statements. If !Rcfile.reminders_file is * a directory, then "primary remfile" is the first file in the directory with * extension ".rem", and "all remfiles" is all files with extension ".rem" * combined with all INCLUDEd files. *) let get_all_remfiles () = (* Test whether a filename represents an existing directory. *) let is_existing_dir fn = try let status = Unix.stat fn in status.Unix.st_kind = Unix.S_DIR with Unix.Unix_error _ -> false in let toplevel_include_directive = Utility.expand_file !Rcfile.reminders_file in if is_existing_dir toplevel_include_directive then try let toplevel_scripts = find_remdir_scripts toplevel_include_directive (Unix.opendir toplevel_include_directive) in if toplevel_scripts = [] then (* User selected an empty reminders directory. Make up a reasonable default filename. *) let default_filename = Filename.concat toplevel_include_directive "reminders.rem" in (default_filename, [default_filename]) else (* Nonempty reminders directory. Choose first entry as primary file, and parse * through all files to get the INCLUDE structure. *) let sorted_scripts = List.fast_sort compare toplevel_scripts in (List.hd sorted_scripts, get_included_filenames [] IPSet.empty sorted_scripts) with Unix.Unix_error _ -> (* Can't open the directory... *) failwith (Printf.sprintf "Can't open reminders directory \"%s\"" toplevel_include_directive) else (* toplevel include directive is not a directory. Treat it as a regular file, * which need not exist. *) let all_includes = get_included_filenames [] IPSet.empty [toplevel_include_directive] in if all_includes = [] then (* Special case: if the toplevel include does not exist, pretend it does exist *) (toplevel_include_directive, [toplevel_include_directive]) else (toplevel_include_directive, all_includes) (* Filter a list of untimed reminders, returning a list of those * reminders falling on the same day as the timestamp. *) let get_untimed_reminders_for_day untimed_reminders timestamp = let curr_tm = Unix.localtime timestamp in let temp1 = { curr_tm with Unix.tm_sec = 0; Unix.tm_min = 0; Unix.tm_hour = 0 } in let temp2 = { curr_tm with Unix.tm_sec = 0; Unix.tm_min = 0; Unix.tm_hour = 0; Unix.tm_mday = succ curr_tm.Unix.tm_mday } in let (day_start_ts, _) = Unix.mktime temp1 in let (day_end_ts, _) = Unix.mktime temp2 in let is_current rem = rem.ur_start >= day_start_ts && rem.ur_start < day_end_ts in List.filter is_current untimed_reminders (* Forms a list of all remfiles in use, and stats them all to * get the mtimes. *) let get_remfile_mtimes () = let safe_mtime filename = try let st = Unix.stat filename in st.Unix.st_mtime with Unix.Unix_error _ -> 0.0 in let (_, all_remfiles) = get_all_remfiles () in List.fold_left (fun acc remfile -> Interface.SMap.add remfile (safe_mtime remfile) acc) Interface.SMap.empty all_remfiles (* arch-tag: DO_NOT_CHANGE_6bb48a1c-2b0c-4254-ba3a-ee9b48007169 *) wyrd-1.4.6/interface_draw.ml0000644000175000017500000010622112103356067014507 0ustar paulpaul(* Wyrd -- a curses-based front-end for Remind * Copyright (C) 2005, 2006, 2007, 2008, 2010, 2011-2013 Paul Pelzl * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, Version 2, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Bug reports can be entered at http://bugs.launchpad.net/wyrd . * For anything else, feel free to contact Paul Pelzl at . *) (* interface_draw.ml * All drawing operations are found here. *) open Interface open Curses open Remind open Utility (* sort timed lineinfo entries by starting timestamp *) let sort_lineinfo line1 line2 = ~- (Pervasives.compare line1.tl_start line2.tl_start) (* Word-wrap a string--split the string at whitespace boundaries * to form a list of strings, each of which has length less than * 'len'. *) let word_wrap (s : string) (len : int) = let ws = Str.regexp "[\t ]+" in let split_words = Str.split ws s in let rec process_words words lines = match words with |[] -> List.rev lines |word :: remaining_words -> let word_len = utf8_len word in begin match lines with |[] -> process_words words [""] |line :: remaining_lines -> let line_len = utf8_len line in if word_len + line_len + 1 <= len then if line_len = 0 then process_words remaining_words (word :: remaining_lines) else process_words remaining_words ((line ^ " " ^ word) :: remaining_lines) else if word_len <= len then process_words remaining_words (word :: line :: remaining_lines) else (* No choice but to break the word apart *) let front = utf8_string_before word len and back = utf8_string_after word len in process_words (back :: remaining_words) (front :: line :: remaining_lines) end in process_words split_words [] (* Generate a 12-hour clock representation of a time record *) let twelve_hour_string tm = if tm.Unix.tm_hour >= 12 then let hour = tm.Unix.tm_hour - 12 in if hour = 0 then Printf.sprintf "12:%.2dpm" tm.Unix.tm_min else Printf.sprintf "%d:%.2dpm" hour tm.Unix.tm_min else if tm.Unix.tm_hour = 0 then Printf.sprintf "12:%.2dam" tm.Unix.tm_min else Printf.sprintf "%d:%.2dam" tm.Unix.tm_hour tm.Unix.tm_min (* Generate a 12-hour clock representation of a time record, with whitespace padding *) let twelve_hour_string_pad tm = if tm.Unix.tm_hour >= 12 then let hour = tm.Unix.tm_hour - 12 in if hour = 0 then Printf.sprintf "12:%.2dpm" tm.Unix.tm_min else Printf.sprintf "%2d:%.2dpm" hour tm.Unix.tm_min else if tm.Unix.tm_hour = 0 then Printf.sprintf "12:%.2dam" tm.Unix.tm_min else Printf.sprintf "%2d:%.2dam" tm.Unix.tm_hour tm.Unix.tm_min (* Generate a 24-hour clock representation of a time record *) let twentyfour_hour_string tm = Printf.sprintf "%.2d:%.2d" tm.Unix.tm_hour tm.Unix.tm_min (* Draw a string in a specified window and location, using exactly 'len' * characters and truncating with ellipses if necessary. *) let trunc_mvwaddstr win line col len s = let fixed_s = let s_len = utf8_len s in if s_len <= len then let pad = String.make (len - s_len) ' ' in s ^ pad else if len >= 3 then (utf8_string_before s (len - 3)) ^ "..." else if len >= 0 then utf8_string_before s len else "" in assert (mvwaddstr win line col fixed_s) (* Draw the one-line help window at the top of the screen *) let draw_help (iface : interface_state_t) = Rcfile.color_on iface.scr.help_win Rcfile.Help; wattron iface.scr.help_win (A.bold lor A.underline); let rec build_help_line operations s = match operations with |[] -> s |(op, op_string) :: tail -> try let key_string = Rcfile.key_of_command op in build_help_line tail (s ^ key_string ^ ":" ^ op_string ^ " ") with Not_found -> build_help_line tail s in let help_string = build_help_line [(Rcfile.ViewKeybindings, "help"); (Rcfile.NewTimed, "new timed"); (Rcfile.NewUntimed, "new untimed"); (Rcfile.Edit, "edit"); (Rcfile.Home, "home"); (Rcfile.Zoom, "zoom"); (Rcfile.BeginSearch, "search"); (Rcfile.Quit, "quit")] "" in trunc_mvwaddstr iface.scr.help_win 0 0 iface.scr.hw_cols help_string; assert (wnoutrefresh iface.scr.help_win) (* Draw the vertical date strip at the left of the timed window. * Note: non-trivial. * The first date stamp is a special case; it is drawn at the top * of the screen and truncated at the beginning to fit before the * first date change. The remaining date stamps are all drawn immediately * after any date changes, and truncated at the end to fit in the * window. * Step 1: determine the line numbers on which the dates change * Step 2: create a string to represent the vertical strip * Step 3: draw each of the characters of the string onto the window *) let draw_date_strip (iface : interface_state_t) = (* draw the vertical line to the right of the date string *) let acs = get_acs_codes () in Rcfile.color_on iface.scr.timed_win Rcfile.Left_divider; wattron iface.scr.timed_win A.bold; mvwvline iface.scr.timed_win 0 1 acs.Acs.vline iface.scr.tw_lines; Rcfile.color_off iface.scr.timed_win Rcfile.Left_divider; (* determine the line numbers and timestamps of any date changes within the * timed window *) let rec check_timestamp date_changes timestamp line = if line >= iface.scr.tw_lines then date_changes else let timestamp_tm = Unix.localtime timestamp in let next_timestamp = timestamp +. (time_inc iface) in let temp = { timestamp_tm with Unix.tm_sec = 0; Unix.tm_min = ~- (time_inc_min iface); Unix.tm_hour = 0 } in let (_, before_midnight) = Unix.mktime temp in if timestamp_tm.Unix.tm_min = before_midnight.Unix.tm_min && timestamp_tm.Unix.tm_hour = before_midnight.Unix.tm_hour then check_timestamp ((line, timestamp) :: date_changes) next_timestamp (succ line) else check_timestamp date_changes next_timestamp (succ line) in let date_changes = List.rev (check_timestamp [] iface.top_timestamp 0) in (* generate a string to represent the vertical strip *) let date_chars = if List.length date_changes > 0 then begin (* special case for the top date string, which is always at the * top of the screen *) let (line, timestamp) = List.hd date_changes in let tm = Unix.localtime timestamp in let top_date_str = if line >= 7 then (* the date will fit completely *) (Printf.sprintf " %s %.2d" (string_of_tm_mon tm.Unix.tm_mon) tm.Unix.tm_mday) ^ (String.make (line - 7) ' ') else (* there's not enough room for the date, so truncate it *) Str.last_chars (Printf.sprintf " %s %.2d" (string_of_tm_mon tm.Unix.tm_mon) tm.Unix.tm_mday) line in (* all other dates are just rendered at the top of their respective windows *) let rec add_date date_str changes = match changes with | [] -> date_str | (line, timestamp) :: tail -> let tm = Unix.localtime timestamp in let temp = { tm with Unix.tm_mday = succ tm.Unix.tm_mday } in let (_, next_day) = Unix.mktime temp in let s_len = if List.length tail > 0 then let (next_line, _) = List.hd tail in next_line - line else iface.scr.tw_lines - line in let temp_s = (Printf.sprintf "-%s %.2d" (string_of_tm_mon next_day.Unix.tm_mon) next_day.Unix.tm_mday) ^ (String.make 100 ' ') in add_date (date_str ^ (Str.string_before temp_s s_len)) tail in add_date top_date_str date_changes end else (* if there are no date changes (e.g. for small window) then just grab the proper * date from the top_timestamp *) let tm = Unix.localtime iface.top_timestamp in (Printf.sprintf " %s %.2d" (string_of_tm_mon tm.Unix.tm_mon) tm.Unix.tm_mday) ^ (String.make (iface.scr.tw_lines - 6) ' ') in (* draw the date string vertically, one character at a time *) for i = 0 to pred iface.scr.tw_lines do if date_chars.[i] = '-' then begin wattron iface.scr.timed_win A.underline; Rcfile.color_on iface.scr.timed_win Rcfile.Timed_date; assert (mvwaddch iface.scr.timed_win i 0 acs.Acs.hline); Rcfile.color_off iface.scr.timed_win Rcfile.Timed_date; Rcfile.color_on iface.scr.timed_win Rcfile.Left_divider; assert (mvwaddch iface.scr.timed_win i 1 acs.Acs.rtee); Rcfile.color_off iface.scr.timed_win Rcfile.Left_divider; wattroff iface.scr.timed_win A.underline; end else begin Rcfile.color_on iface.scr.timed_win Rcfile.Timed_date; assert (mvwaddch iface.scr.timed_win i 0 (int_of_char date_chars.[i])); Rcfile.color_off iface.scr.timed_win Rcfile.Timed_date; end done; wattroff iface.scr.timed_win (A.bold lor A.underline); assert (wnoutrefresh iface.scr.timed_win) (* Draw a portion of the timed schedule. The algorithm iterates across all * reminders in a three month period, and draws them in one by one. An array * is used to keep track of which lines have not yet been drawn, so that these * can be filled in later. * * This routine also updates iface.timed_lineinfo. *) let draw_timed_window iface reminders top lines = let round_down x = if x >= 0.0 then int_of_float x else pred (int_of_float x) in let indent_colors = [| Rcfile.Timed_reminder1; Rcfile.Timed_reminder2; Rcfile.Timed_reminder3; Rcfile.Timed_reminder4 |] in let acs = get_acs_codes () in let blank = String.make iface.scr.tw_cols ' ' in let top_timestamp = timestamp_of_line iface top in let top_tm = Unix.localtime top_timestamp in let temp = { top_tm with Unix.tm_sec = 0; Unix.tm_min = ~- (time_inc_min iface); Unix.tm_hour = 0 } in let (_, before_midnight) = Unix.mktime temp in let string_of_tm = if !Rcfile.schedule_12_hour then twelve_hour_string_pad else twentyfour_hour_string in (* this ensures that if there are multiple reminder descriptions * displayed simultaneously, the dashes between start and end times * will line up properly *) let (desc_string_of_tm1, desc_string_of_tm2) = if !Rcfile.description_12_hour then (twelve_hour_string_pad, twelve_hour_string) else (twentyfour_hour_string, twentyfour_hour_string) in Rcfile.color_on iface.scr.timed_win Rcfile.Timed_default; (* draw in the blank timeslots *) for i = top to pred (top + lines) do iface.timed_lineinfo.(i) <- []; if i = iface.left_selection && iface.selected_side = Left then wattron iface.scr.timed_win A.reverse else wattroff iface.scr.timed_win A.reverse; let ts = timestamp_of_line iface i in let tm = Unix.localtime ts in let ts_str = string_of_tm tm in let curr_ts = Unix.time () in (* the current time is highlighted *) if curr_ts >= ts && curr_ts < (timestamp_of_line iface (succ i)) then begin Rcfile.color_on iface.scr.timed_win Rcfile.Timed_current; wattron iface.scr.timed_win A.bold end else (); if tm.Unix.tm_hour = before_midnight.Unix.tm_hour && tm.Unix.tm_min = before_midnight.Unix.tm_min then wattron iface.scr.timed_win A.underline else wattroff iface.scr.timed_win A.underline; assert (mvwaddstr iface.scr.timed_win i 2 ts_str); Rcfile.color_off iface.scr.timed_win Rcfile.Timed_current; wattroff iface.scr.timed_win A.bold; Rcfile.color_on iface.scr.timed_win Rcfile.Timed_default; let s = Str.string_before blank (iface.scr.tw_cols - 7) in assert (mvwaddstr iface.scr.timed_win i 7 s) done; Rcfile.color_off iface.scr.timed_win Rcfile.Timed_default; wattroff iface.scr.timed_win (A.reverse lor A.underline); (* draw in the timed reminders *) let rec process_reminders rem_list indent = Rcfile.color_on iface.scr.timed_win indent_colors.(indent); wattron iface.scr.timed_win A.bold; begin match rem_list with |[] -> () |rem :: tail -> let rem_top_line = round_down ((rem.tr_start -. iface.top_timestamp) /. (time_inc iface)) in let get_time_str () = if rem.tr_end > rem.tr_start then (desc_string_of_tm1 (Unix.localtime rem.tr_start)) ^ "-" ^ (desc_string_of_tm2 (Unix.localtime rem.tr_end)) ^ " " else (desc_string_of_tm1 (Unix.localtime rem.tr_start)) ^ " " in (* draw the top line of a reminder *) let clock_pad = if !Rcfile.schedule_12_hour then 10 else 8 in if rem_top_line >= top && rem_top_line < top + lines then begin let time_str = get_time_str () in let ts = timestamp_of_line iface rem_top_line in let tm = Unix.localtime ts in if rem_top_line = iface.left_selection && iface.selected_side = Left then wattron iface.scr.timed_win A.reverse else wattroff iface.scr.timed_win A.reverse; if tm.Unix.tm_hour = before_midnight.Unix.tm_hour && tm.Unix.tm_min = before_midnight.Unix.tm_min then wattron iface.scr.timed_win A.underline else wattroff iface.scr.timed_win A.underline; let curr_lineinfo = { tl_filename = rem.tr_filename; tl_linenum = rem.tr_linenum; tl_timestr = time_str; tl_msg = rem.tr_msg; tl_start = rem.tr_start } in iface.timed_lineinfo.(rem_top_line) <- (curr_lineinfo :: iface.timed_lineinfo.(rem_top_line)); trunc_mvwaddstr iface.scr.timed_win rem_top_line (clock_pad + (9 * indent)) (iface.scr.tw_cols - clock_pad - (9 * indent)) (" " ^ rem.tr_msg); assert (mvwaddch iface.scr.timed_win rem_top_line (clock_pad + (9 * indent)) acs.Acs.vline) end else (); (* draw any remaining lines of this reminder, as determined by the duration *) let count = ref 1 in while ((timestamp_of_line iface (rem_top_line + !count)) < rem.tr_end) && (rem_top_line + !count < top + lines) do if rem_top_line + !count >= top then begin let time_str = get_time_str () in let ts = timestamp_of_line iface (rem_top_line + !count) in let tm = Unix.localtime ts in if rem_top_line + !count = iface.left_selection && iface.selected_side = Left then wattron iface.scr.timed_win A.reverse else wattroff iface.scr.timed_win A.reverse; if tm.Unix.tm_hour = before_midnight.Unix.tm_hour && tm.Unix.tm_min = before_midnight.Unix.tm_min then wattron iface.scr.timed_win A.underline else wattroff iface.scr.timed_win A.underline; let curr_lineinfo = { tl_filename = rem.tr_filename; tl_linenum = rem.tr_linenum; tl_timestr = time_str; tl_msg = rem.tr_msg; tl_start = rem.tr_start } in iface.timed_lineinfo.(rem_top_line + !count) <- (curr_lineinfo :: iface.timed_lineinfo.(rem_top_line + !count)); trunc_mvwaddstr iface.scr.timed_win (rem_top_line + !count) (clock_pad + (9 * indent)) (iface.scr.tw_cols - clock_pad - (9 * indent)) " "; assert (mvwaddch iface.scr.timed_win (rem_top_line + !count) (clock_pad + (9 * indent)) acs.Acs.vline) end else (); count := succ !count done; (* The reminders list is sorted chronologically, so once we hit a reminder * that falls after the end of the calendar window we can stop. *) if rem_top_line < top + lines then process_reminders tail indent else () end; Rcfile.color_off iface.scr.timed_win indent_colors.(indent) in (* reminders are rendered in order of indentation level, so the reminders with * higher indentation overlap those with lower indentation *) for indent = 0 to pred (Array.length reminders) do process_reminders reminders.(indent) indent done; wattroff iface.scr.timed_win (A.bold lor A.reverse); assert (wnoutrefresh iface.scr.timed_win) (* Draw the entire timed reminders window *) let draw_timed iface reminders = draw_timed_window iface reminders 0 iface.scr.tw_lines; {iface with last_timed_refresh = Unix.time ()} (* Draw just a portion of the timed window when possible. If * iface.last_timed_refresh indicates that the display is stale, * then do a whole-window update. This is to make sure that the * current timeslot gets highlighted properly, and old highlights * get erased. *) let draw_timed_try_window iface reminders top lines = let curr_tm = Unix.localtime (Unix.time ()) in let timeslot = round_time iface.zoom_level curr_tm in let (ts, _) = Unix.mktime timeslot in if iface.last_timed_refresh < ts then draw_timed iface reminders else begin draw_timed_window iface reminders top lines; iface end (* render a calendar for the given reminders record *) let draw_calendar (iface : interface_state_t) (reminders : three_month_rem_t) : unit = let sel_tm = Unix.localtime (timestamp_of_line iface iface.left_selection) and today_tm = Unix.localtime (Unix.time()) in let cal = reminders.curr_cal in let acs = get_acs_codes () in Rcfile.color_on iface.scr.calendar_win Rcfile.Right_divider; wattron iface.scr.calendar_win A.bold; mvwvline iface.scr.calendar_win 0 0 acs.Acs.vline iface.scr.cw_lines; Rcfile.color_off iface.scr.calendar_win Rcfile.Right_divider; let hspacer = (iface.scr.cw_cols - 20) / 2 in let vspacer = (iface.scr.cw_lines - 8) / 2 in assert (wmove iface.scr.calendar_win vspacer hspacer); wclrtoeol iface.scr.calendar_win; Rcfile.color_on iface.scr.calendar_win Rcfile.Calendar_labels; wattron iface.scr.calendar_win A.bold; assert (waddstr iface.scr.calendar_win cal.Cal.title); wattroff iface.scr.calendar_win A.bold; assert (wmove iface.scr.calendar_win (vspacer + 1) hspacer); wclrtoeol iface.scr.calendar_win; assert (waddstr iface.scr.calendar_win cal.Cal.weekdays); Rcfile.color_off iface.scr.calendar_win Rcfile.Calendar_labels; (* draw the day numbers *) let ws = Str.regexp " " in let rec draw_week weeks line = match weeks with | [] -> assert (wmove iface.scr.calendar_win line hspacer); wclrtoeol iface.scr.calendar_win | week :: tail -> let split_week = Str.full_split ws week in assert (wmove iface.scr.calendar_win line hspacer); wclrtoeol iface.scr.calendar_win; let rec draw_el elements = match elements with | [] -> () | el :: days -> begin match el with |Str.Delim s -> assert (waddstr iface.scr.calendar_win s) |Str.Text d -> let day = pred (int_of_string d) in if succ day = sel_tm.Unix.tm_mday then begin (* highlight selected day in reverse video *) wattron iface.scr.calendar_win A.reverse; (* assert (waddstr iface.scr.calendar_win d); *) end else (); if today_tm.Unix.tm_year = sel_tm.Unix.tm_year && today_tm.Unix.tm_mon = sel_tm.Unix.tm_mon && succ day = today_tm.Unix.tm_mday then begin (* highlight today's date *) Rcfile.color_on iface.scr.calendar_win Rcfile.Calendar_today; wattron iface.scr.calendar_win A.bold; assert (waddstr iface.scr.calendar_win d); Rcfile.color_off iface.scr.calendar_win Rcfile.Calendar_today; wattroff iface.scr.calendar_win A.bold end else if reminders.curr_counts.(day) <= !Rcfile.busy_level1 then begin Rcfile.color_on iface.scr.calendar_win Rcfile.Calendar_level1; assert (waddstr iface.scr.calendar_win d); Rcfile.color_off iface.scr.calendar_win Rcfile.Calendar_level1 end else if reminders.curr_counts.(day) <= !Rcfile.busy_level2 then begin Rcfile.color_on iface.scr.calendar_win Rcfile.Calendar_level2; assert (waddstr iface.scr.calendar_win d); Rcfile.color_off iface.scr.calendar_win Rcfile.Calendar_level2 end else if reminders.curr_counts.(day) <= !Rcfile.busy_level3 then begin Rcfile.color_on iface.scr.calendar_win Rcfile.Calendar_level2; wattron iface.scr.calendar_win A.bold; assert (waddstr iface.scr.calendar_win d); Rcfile.color_off iface.scr.calendar_win Rcfile.Calendar_level2; wattroff iface.scr.calendar_win A.bold end else if reminders.curr_counts.(day) <= !Rcfile.busy_level4 then begin Rcfile.color_on iface.scr.calendar_win Rcfile.Calendar_level3; assert (waddstr iface.scr.calendar_win d); Rcfile.color_off iface.scr.calendar_win Rcfile.Calendar_level3 end else begin Rcfile.color_on iface.scr.calendar_win Rcfile.Calendar_level3; wattron iface.scr.calendar_win A.bold; assert (waddstr iface.scr.calendar_win d); Rcfile.color_off iface.scr.calendar_win Rcfile.Calendar_level3; wattroff iface.scr.calendar_win A.bold end; wattroff iface.scr.calendar_win A.reverse end; draw_el days in draw_el split_week; draw_week tail (succ line) in draw_week cal.Cal.days (vspacer + 2); (* draw the week numbers *) if !Rcfile.number_weeks then begin let weeknum_col = hspacer + (utf8_len cal.Cal.weekdays) + 2 in Rcfile.color_on iface.scr.calendar_win Rcfile.Calendar_labels; assert (wmove iface.scr.calendar_win (vspacer + 1) weeknum_col); assert (waddch iface.scr.calendar_win acs.Acs.vline); assert (waddstr iface.scr.calendar_win "Wk#"); Rcfile.color_off iface.scr.calendar_win Rcfile.Calendar_labels; let rec print_weeknum weeknums line = match weeknums with | [] -> () | weeknum :: tail -> assert (wmove iface.scr.calendar_win (vspacer + line) weeknum_col); assert (waddch iface.scr.calendar_win acs.Acs.vline); assert (waddstr iface.scr.calendar_win weeknum); print_weeknum tail (succ line); in print_weeknum cal.Cal.weeknums 2; end else (); assert (wnoutrefresh iface.scr.calendar_win) (* Draw the untimed reminders window *) let draw_untimed (iface : interface_state_t) reminders = let lineinfo = Array.make iface.scr.uw_lines None in let blank = String.make iface.scr.uw_cols ' ' in let curr_ts = timestamp_of_line iface iface.left_selection in let today_reminders = Remind.get_untimed_reminders_for_day reminders curr_ts in werase iface.scr.untimed_win; let acs = get_acs_codes () in Rcfile.color_on iface.scr.untimed_win Rcfile.Right_divider; wattron iface.scr.untimed_win A.bold; assert (mvwaddch iface.scr.untimed_win 0 0 acs.Acs.ltee); mvwhline iface.scr.untimed_win 0 1 acs.Acs.hline (pred iface.scr.uw_cols); mvwvline iface.scr.untimed_win 1 0 acs.Acs.vline (pred iface.scr.uw_lines); Rcfile.color_off iface.scr.untimed_win Rcfile.Right_divider; if not !Rcfile.untimed_bold then wattroff iface.scr.untimed_win A.bold else (); Rcfile.color_on iface.scr.untimed_win Rcfile.Untimed_reminder; (* make sure the cursor doesn't unexpectedly disappear *) let iface = if iface.selected_side = Right && iface.right_selection > List.length today_reminders then if List.length today_reminders = 0 then { iface with right_selection = 1; } else { iface with right_selection = List.length today_reminders } else iface in let rec render_lines rem_list n line = match rem_list with |[] -> if n = 0 && iface.selected_side = Right then begin wattron iface.scr.untimed_win A.reverse; trunc_mvwaddstr iface.scr.untimed_win line 2 (iface.scr.uw_cols - 3) blank; wattroff iface.scr.untimed_win A.reverse end else () |rem :: tail -> if line < iface.scr.uw_lines then if n >= iface.top_untimed then begin if line = iface.right_selection && iface.selected_side = Right then wattron iface.scr.untimed_win A.reverse else wattroff iface.scr.untimed_win A.reverse; trunc_mvwaddstr iface.scr.untimed_win line 2 (iface.scr.uw_cols - 3) ("* " ^ rem.ur_msg); let curr_lineinfo = { ul_filename = rem.ur_filename; ul_linenum = rem.ur_linenum; ul_msg = rem.ur_msg } in lineinfo.(line) <- Some curr_lineinfo; render_lines tail (succ n) (succ line) end else render_lines tail (succ n) line else () in render_lines today_reminders 0 1; Rcfile.color_off iface.scr.untimed_win Rcfile.Untimed_reminder; wattroff iface.scr.untimed_win (A.bold lor A.reverse); (* if there's not enough window space to display all untimed reminders, display * arrows to indicate scrolling ability *) if iface.top_untimed > 0 then begin assert (mvwaddch iface.scr.untimed_win 1 (pred iface.scr.uw_cols) (int_of_char '^')); assert (mvwaddch iface.scr.untimed_win 2 (pred iface.scr.uw_cols) (int_of_char '^')) end else (); if List.length today_reminders > pred iface.scr.uw_lines + iface.top_untimed then begin assert (mvwaddch iface.scr.untimed_win (pred iface.scr.uw_lines) (pred iface.scr.uw_cols) (int_of_char 'v')); assert (mvwaddch iface.scr.untimed_win (iface.scr.uw_lines - 2) (pred iface.scr.uw_cols) (int_of_char 'v')) end else (); assert (wnoutrefresh iface.scr.untimed_win); {iface with untimed_lineinfo = lineinfo; len_untimed = List.length today_reminders} (* Draw the message window *) let draw_msg iface = let sel_tm = Unix.localtime (timestamp_of_line iface iface.left_selection) in let day_s = Printf.sprintf "%s, %s %.2d" (full_string_of_tm_wday sel_tm.Unix.tm_wday) (full_string_of_tm_mon sel_tm.Unix.tm_mon) sel_tm.Unix.tm_mday in let day_time_s = match iface.selected_side with |Left -> day_s ^ " at " ^ if !Rcfile.selection_12_hour then twelve_hour_string sel_tm else twentyfour_hour_string sel_tm |Right -> day_s in for i = 0 to pred iface.scr.mw_lines do assert (wmove iface.scr.msg_win i 0); wclrtoeol iface.scr.msg_win done; (* draw the date stamp *) Rcfile.color_on iface.scr.msg_win Rcfile.Selection_info; wattron iface.scr.msg_win (A.bold lor A.underline); trunc_mvwaddstr iface.scr.msg_win 0 0 iface.scr.mw_cols day_time_s; Rcfile.color_off iface.scr.msg_win Rcfile.Selection_info; wattroff iface.scr.msg_win (A.bold lor A.underline); (* draw the current date *) let curr_tm = Unix.localtime (Unix.time ()) in Rcfile.color_on iface.scr.msg_win Rcfile.Status; wattron iface.scr.msg_win A.bold; let curr_tm_str = if !Rcfile.status_12_hour then twelve_hour_string curr_tm else twentyfour_hour_string curr_tm in let s = Printf.sprintf "Wyrd v%s Currently: %s, %s %.2d at %s" Version.version (full_string_of_tm_wday curr_tm.Unix.tm_wday) (full_string_of_tm_mon curr_tm.Unix.tm_mon) curr_tm.Unix.tm_mday curr_tm_str in trunc_mvwaddstr iface.scr.msg_win (pred iface.scr.mw_lines) 0 iface.scr.mw_cols s; Rcfile.color_off iface.scr.msg_win Rcfile.Status; wattroff iface.scr.msg_win A.bold; (* draw the full MSG string, word wrapping as necessary *) let pad = String.make 16 ' ' in let rec render_desc times descriptions output = let rec render_line lines temp_output = match lines with |[] -> temp_output |line :: lines_tail -> render_line lines_tail ((pad ^ line) :: temp_output) in match descriptions with |[] -> List.rev output |desc :: desc_tail -> let time_str = Str.string_before ((List.hd times) ^ pad) 16 in let first_line = time_str ^ (List.hd desc) in render_desc (List.tl times) desc_tail ((render_line (List.tl desc) []) @ first_line :: output) in let (times, descriptions) = match iface.selected_side with |Left -> begin match iface.timed_lineinfo.(iface.left_selection) with |[] -> ([""], [["(no reminder selected)"]]) |rem_list -> let sorted_rem_list = List.fast_sort sort_lineinfo rem_list in let get_times tline = tline.tl_timestr in let get_lines tline = word_wrap tline.tl_msg (iface.scr.mw_cols - 24) in (List.rev_map get_times sorted_rem_list, List.rev_map get_lines sorted_rem_list) end |Right -> begin match iface.untimed_lineinfo.(iface.right_selection) with |None -> ([""], [["(no reminder selected)"]]) |Some uline -> ([""], [word_wrap uline.ul_msg (iface.scr.mw_cols - 24)]) end in let desc_lines = render_desc times descriptions [] in (* draw the pre-rendered lines to the screen *) Rcfile.color_on iface.scr.msg_win Rcfile.Description; let rec draw_desc_lines lines start line_num = match lines with |[] -> () |line :: tail -> if start > 0 then draw_desc_lines tail (pred start) line_num else if line_num < pred iface.scr.mw_lines then begin assert (mvwaddstr iface.scr.msg_win line_num 5 line); draw_desc_lines tail start (succ line_num) end else () in let adjusted_top = let max_top = max ((List.length desc_lines) - iface.scr.mw_lines + 2) 0 in min iface.top_desc max_top in draw_desc_lines desc_lines adjusted_top 1; if adjusted_top > 0 then begin assert (mvwaddch iface.scr.msg_win 1 (iface.scr.mw_cols - 1) (int_of_char '^')); assert (mvwaddch iface.scr.msg_win 2 (iface.scr.mw_cols - 1) (int_of_char '^')) end else (); if adjusted_top < List.length desc_lines - iface.scr.mw_lines + 2 then begin assert (mvwaddch iface.scr.msg_win (iface.scr.mw_lines - 2) (iface.scr.mw_cols - 1) (int_of_char 'v')); assert (mvwaddch iface.scr.msg_win (iface.scr.mw_lines - 3) (iface.scr.mw_cols - 1) (int_of_char 'v')) end else (); Rcfile.color_off iface.scr.msg_win Rcfile.Description; assert (wnoutrefresh iface.scr.msg_win); {iface with top_desc = adjusted_top} (* Draw a message in the error window. If draw_cursor = true, then * add a blinking cursor at the end of the message. *) let draw_error iface err draw_cursor = werase iface.scr.err_win; trunc_mvwaddstr iface.scr.err_win 0 0 iface.scr.ew_cols err; let len = utf8_len err in if draw_cursor && len <= pred iface.scr.ew_cols then begin wattron iface.scr.err_win A.blink; assert (mvwaddch iface.scr.err_win 0 len (int_of_char '_')); wattroff iface.scr.err_win A.blink end else (); assert (wnoutrefresh iface.scr.err_win) (* Draw a selection dialog. *) let draw_selection_dialog (iface : interface_state_t) (title : string) (elements : string list) (selection : int) (top : int) = erase (); (* draw the title *) Rcfile.color_on iface.scr.stdscr Rcfile.Help; attron A.bold; trunc_mvwaddstr iface.scr.stdscr 0 0 iface.scr.cols title; Rcfile.color_off iface.scr.stdscr Rcfile.Help; attroff A.bold; (* draw the list elements *) Rcfile.color_on iface.scr.stdscr Rcfile.Untimed_reminder; let rec draw_element el_list line count = match el_list with | [] -> () | el :: tail -> if count >= top && line < iface.scr.lines then begin if count = selection then begin attron A.reverse; trunc_mvwaddstr iface.scr.stdscr line 2 (iface.scr.cols - 4) el; attroff A.reverse; end else trunc_mvwaddstr iface.scr.stdscr line 2 (iface.scr.cols - 4) el; draw_element tail (succ line) (succ count) end else draw_element tail line (succ count) in draw_element elements 1 0; (* if there's not enough window space to display all reminder files, display * arrows to indicate scrolling ability *) if top > 0 then begin assert (mvaddch 1 (iface.scr.cols - 2) (int_of_char '^')); assert (mvaddch 2 (iface.scr.cols - 2) (int_of_char '^')) end else (); if List.length elements > pred iface.scr.lines + top then begin assert (mvaddch (pred iface.scr.lines) (iface.scr.cols - 2) (int_of_char 'v')); assert (mvaddch (iface.scr.lines - 2) (iface.scr.cols - 2) (int_of_char 'v')) end else (); Rcfile.color_off iface.scr.stdscr Rcfile.Untimed_reminder; assert (refresh ()) (* arch-tag: DO_NOT_CHANGE_9ff0fd0c-6eb1-410f-8fcf-6dfcf94b346a *) wyrd-1.4.6/make_oasis.ml0000755000175000017500000000226412103356067013652 0ustar paulpaul#!/usr/bin/env ocaml #use "topfind";; #thread;; (* Batteries apparently needs this... *) #require "batteries";; open Batteries;; let input_filename = "_oasis.in" in let output_filename = "_oasis" in (* Extract the VERSION=x.y.z line from Makefile.in *) let makefile_version_number = let version_regex = Str.regexp "^VERSION[ \\t]*=\\([^ \\t]+\\)[ \\t]*$" in let lines = File.lines_of "Makefile.in" in let matching_line = Enum.find (fun line -> Str.string_match version_regex line 0) lines in Str.matched_group 1 matching_line in (* Plug this version into the appropriate place in _oasis.in *) let oasis_content = let oasis_version_regex = Str.regexp "@WYRD_VERSION@" in let oasis_template = File.with_file_in input_filename IO.read_all in let replace_count = ref 0 in let subst input = let () = incr replace_count in makefile_version_number in let result = Str.global_substitute oasis_version_regex subst oasis_template in let () = assert (!replace_count = 1) in result in let () = File.with_file_out output_filename (fun ch -> IO.nwrite ch oasis_content) in Printf.printf "Wrote ./%s using version number \"%s\".\n" output_filename makefile_version_number;; wyrd-1.4.6/setup.ml0000644000175000017500000032222212103356102012661 0ustar paulpaul(* setup.ml generated for the first time by OASIS v0.2.0 *) (* OASIS_START *) (* DO NOT EDIT (digest: bc7b6e0baeb13541a4989f56e19ebc42) *) (* Regenerated by OASIS v0.2.0 Visit http://oasis.forge.ocamlcore.org for more information and documentation about functions used in this file. *) module OASISGettext = struct # 21 "/tmp/buildd/oasis-0.2.0/src/oasis/OASISGettext.ml" let ns_ str = str let s_ str = str let f_ (str : ('a, 'b, 'c, 'd) format4) = str let fn_ fmt1 fmt2 n = if n = 1 then fmt1^^"" else fmt2^^"" let init = [] end module OASISContext = struct # 21 "/tmp/buildd/oasis-0.2.0/src/oasis/OASISContext.ml" open OASISGettext type level = [ `Debug | `Info | `Warning | `Error] type t = { verbose: bool; debug: bool; ignore_plugins: bool; printf: level -> string -> unit; } let printf lvl str = let beg = match lvl with | `Error -> s_ "E: " | `Warning -> s_ "W: " | `Info -> s_ "I: " | `Debug -> s_ "D: " in match lvl with | `Error -> prerr_endline (beg^str) | _ -> print_endline (beg^str) let default = ref { verbose = true; debug = false; ignore_plugins = false; printf = printf; } let quiet = {!default with verbose = false; debug = false; } let args () = ["-quiet", Arg.Unit (fun () -> default := {!default with verbose = false}), (s_ " Run quietly"); "-debug", Arg.Unit (fun () -> default := {!default with debug = true}), (s_ " Output debug message")] end module OASISUtils = struct # 21 "/tmp/buildd/oasis-0.2.0/src/oasis/OASISUtils.ml" module MapString = Map.Make(String) let map_string_of_assoc assoc = List.fold_left (fun acc (k, v) -> MapString.add k v acc) MapString.empty assoc module SetString = Set.Make(String) let set_string_add_list st lst = List.fold_left (fun acc e -> SetString.add e acc) st lst let set_string_of_list = set_string_add_list SetString.empty let compare_csl s1 s2 = String.compare (String.lowercase s1) (String.lowercase s2) module HashStringCsl = Hashtbl.Make (struct type t = string let equal s1 s2 = (String.lowercase s1) = (String.lowercase s2) let hash s = Hashtbl.hash (String.lowercase s) end) let split sep str = let str_len = String.length str in let rec split_aux acc pos = if pos < str_len then ( let pos_sep = try String.index_from str pos sep with Not_found -> str_len in let part = String.sub str pos (pos_sep - pos) in let acc = part :: acc in if pos_sep >= str_len then ( (* Nothing more in the string *) List.rev acc ) else if pos_sep = (str_len - 1) then ( (* String end with a separator *) List.rev ("" :: acc) ) else ( split_aux acc (pos_sep + 1) ) ) else ( List.rev acc ) in split_aux [] 0 let varname_of_string ?(hyphen='_') s = if String.length s = 0 then begin invalid_arg "varname_of_string" end else begin let buff = Buffer.create (String.length s) in (* Start with a _ if digit *) if '0' <= s.[0] && s.[0] <= '9' then Buffer.add_char buff hyphen; String.iter (fun c -> if ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || ('0' <= c && c <= '9') then Buffer.add_char buff c else Buffer.add_char buff hyphen) s; String.lowercase (Buffer.contents buff) end let varname_concat ?(hyphen='_') p s = let p = let p_len = String.length p in if p_len > 0 && p.[p_len - 1] = hyphen then String.sub p 0 (p_len - 1) else p in let s = let s_len = String.length s in if s_len > 0 && s.[0] = hyphen then String.sub s 1 (s_len - 1) else s in Printf.sprintf "%s%c%s" p hyphen s let is_varname str = str = varname_of_string str let failwithf1 fmt a = failwith (Printf.sprintf fmt a) let failwithf2 fmt a b = failwith (Printf.sprintf fmt a b) let failwithf3 fmt a b c = failwith (Printf.sprintf fmt a b c) let failwithf4 fmt a b c d = failwith (Printf.sprintf fmt a b c d) let failwithf5 fmt a b c d e = failwith (Printf.sprintf fmt a b c d e) end module PropList = struct # 21 "/tmp/buildd/oasis-0.2.0/src/oasis/PropList.ml" open OASISGettext type name = string exception Not_set of name * string option exception No_printer of name exception Unknown_field of name * name let string_of_exception = function | Not_set (nm, Some rsn) -> Printf.sprintf (f_ "Field '%s' is not set: %s") nm rsn | Not_set (nm, None) -> Printf.sprintf (f_ "Field '%s' is not set") nm | No_printer nm -> Printf.sprintf (f_ "No default printer for value %s") nm | Unknown_field (nm, schm) -> Printf.sprintf (f_ "Field %s is not defined in schema %s") nm schm | e -> raise e module Data = struct type t = (name, unit -> unit) Hashtbl.t let create () = Hashtbl.create 13 let clear t = Hashtbl.clear t # 59 "/tmp/buildd/oasis-0.2.0/src/oasis/PropList.ml" end module Schema = struct type ('ctxt, 'extra) value = { get: Data.t -> string; set: Data.t -> ?context:'ctxt -> string -> unit; help: (unit -> string) option; extra: 'extra; } type ('ctxt, 'extra) t = { name: name; fields: (name, ('ctxt, 'extra) value) Hashtbl.t; order: name Queue.t; name_norm: string -> string; } let create ?(case_insensitive=false) nm = { name = nm; fields = Hashtbl.create 13; order = Queue.create (); name_norm = (if case_insensitive then String.lowercase else fun s -> s); } let add t nm set get extra help = let key = t.name_norm nm in if Hashtbl.mem t.fields key then failwith (Printf.sprintf (f_ "Field '%s' is already defined in schema '%s'") nm t.name); Hashtbl.add t.fields key { set = set; get = get; help = help; extra = extra; }; Queue.add nm t.order let mem t nm = Hashtbl.mem t.fields nm let find t nm = try Hashtbl.find t.fields (t.name_norm nm) with Not_found -> raise (Unknown_field (nm, t.name)) let get t data nm = (find t nm).get data let set t data nm ?context x = (find t nm).set data ?context x let fold f acc t = Queue.fold (fun acc k -> let v = find t k in f acc k v.extra v.help) acc t.order let iter f t = fold (fun () -> f) () t let name t = t.name end module Field = struct type ('ctxt, 'value, 'extra) t = { set: Data.t -> ?context:'ctxt -> 'value -> unit; get: Data.t -> 'value; sets: Data.t -> ?context:'ctxt -> string -> unit; gets: Data.t -> string; help: (unit -> string) option; extra: 'extra; } let new_id = let last_id = ref 0 in fun () -> incr last_id; !last_id let create ?schema ?name ?parse ?print ?default ?update ?help extra = (* Default value container *) let v = ref None in (* If name is not given, create unique one *) let nm = match name with | Some s -> s | None -> Printf.sprintf "_anon_%d" (new_id ()) in (* Last chance to get a value: the default *) let default () = match default with | Some d -> d | None -> raise (Not_set (nm, Some (s_ "no default value"))) in (* Get data *) let get data = (* Get value *) try (Hashtbl.find data nm) (); match !v with | Some x -> x | None -> default () with Not_found -> default () in (* Set data *) let set data ?context x = let x = match update with | Some f -> begin try f ?context (get data) x with Not_set _ -> x end | None -> x in Hashtbl.replace data nm (fun () -> v := Some x) in (* Parse string value, if possible *) let parse = match parse with | Some f -> f | None -> fun ?context s -> failwith (Printf.sprintf (f_ "Cannot parse field '%s' when setting value %S") nm s) in (* Set data, from string *) let sets data ?context s = set ?context data (parse ?context s) in (* Output value as string, if possible *) let print = match print with | Some f -> f | None -> fun _ -> raise (No_printer nm) in (* Get data, as a string *) let gets data = print (get data) in begin match schema with | Some t -> Schema.add t nm sets gets extra help | None -> () end; { set = set; get = get; sets = sets; gets = gets; help = help; extra = extra; } let fset data t ?context x = t.set data ?context x let fget data t = t.get data let fsets data t ?context s = t.sets data ?context s let fgets data t = t.gets data end module FieldRO = struct let create ?schema ?name ?parse ?print ?default ?update ?help extra = let fld = Field.create ?schema ?name ?parse ?print ?default ?update ?help extra in fun data -> Field.fget data fld end end module OASISMessage = struct # 21 "/tmp/buildd/oasis-0.2.0/src/oasis/OASISMessage.ml" open OASISGettext open OASISContext let generic_message ~ctxt lvl fmt = let cond = match lvl with | `Debug -> ctxt.debug | _ -> ctxt.verbose in Printf.ksprintf (fun str -> if cond then begin ctxt.printf lvl str end) fmt let debug ~ctxt fmt = generic_message ~ctxt `Debug fmt let info ~ctxt fmt = generic_message ~ctxt `Info fmt let warning ~ctxt fmt = generic_message ~ctxt `Warning fmt let error ~ctxt fmt = generic_message ~ctxt `Error fmt let string_of_exception e = try PropList.string_of_exception e with | Failure s -> s | e -> Printexc.to_string e (* TODO let register_exn_printer f = *) end module OASISVersion = struct # 21 "/tmp/buildd/oasis-0.2.0/src/oasis/OASISVersion.ml" open OASISGettext type s = string type t = string type comparator = | VGreater of t | VGreaterEqual of t | VEqual of t | VLesser of t | VLesserEqual of t | VOr of comparator * comparator | VAnd of comparator * comparator (* Range of allowed characters *) let is_digit c = '0' <= c && c <= '9' let is_alpha c = ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') let is_special = function | '.' | '+' | '-' | '~' -> true | _ -> false let rec version_compare v1 v2 = if v1 <> "" || v2 <> "" then begin (* Compare ascii string, using special meaning for version * related char *) let val_ascii c = if c = '~' then -1 else if is_digit c then 0 else if c = '\000' then 0 else if is_alpha c then Char.code c else (Char.code c) + 256 in let len1 = String.length v1 in let len2 = String.length v2 in let p = ref 0 in (** Compare ascii part *) let compare_vascii () = let cmp = ref 0 in while !cmp = 0 && !p < len1 && !p < len2 && not (is_digit v1.[!p] && is_digit v2.[!p]) do cmp := (val_ascii v1.[!p]) - (val_ascii v2.[!p]); incr p done; if !cmp = 0 && !p < len1 && !p = len2 then val_ascii v1.[!p] else if !cmp = 0 && !p = len1 && !p < len2 then - (val_ascii v2.[!p]) else !cmp in (** Compare digit part *) let compare_digit () = let extract_int v p = let start_p = !p in while !p < String.length v && is_digit v.[!p] do incr p done; match String.sub v start_p (!p - start_p) with | "" -> 0, v | s -> int_of_string s, String.sub v !p ((String.length v) - !p) in let i1, tl1 = extract_int v1 (ref !p) in let i2, tl2 = extract_int v2 (ref !p) in i1 - i2, tl1, tl2 in match compare_vascii () with | 0 -> begin match compare_digit () with | 0, tl1, tl2 -> if tl1 <> "" && is_digit tl1.[0] then 1 else if tl2 <> "" && is_digit tl2.[0] then -1 else version_compare tl1 tl2 | n, _, _ -> n end | n -> n end else begin 0 end let version_of_string str = String.iter (fun c -> if is_alpha c || is_digit c || is_special c then () else failwith (Printf.sprintf (f_ "Char %C is not allowed in version '%s'") c str)) str; str let string_of_version t = t let chop t = try let pos = String.rindex t '.' in String.sub t 0 pos with Not_found -> t let rec comparator_apply v op = match op with | VGreater cv -> (version_compare v cv) > 0 | VGreaterEqual cv -> (version_compare v cv) >= 0 | VLesser cv -> (version_compare v cv) < 0 | VLesserEqual cv -> (version_compare v cv) <= 0 | VEqual cv -> (version_compare v cv) = 0 | VOr (op1, op2) -> (comparator_apply v op1) || (comparator_apply v op2) | VAnd (op1, op2) -> (comparator_apply v op1) && (comparator_apply v op2) let rec string_of_comparator = function | VGreater v -> "> "^(string_of_version v) | VEqual v -> "= "^(string_of_version v) | VLesser v -> "< "^(string_of_version v) | VGreaterEqual v -> ">= "^(string_of_version v) | VLesserEqual v -> "<= "^(string_of_version v) | VOr (c1, c2) -> (string_of_comparator c1)^" || "^(string_of_comparator c2) | VAnd (c1, c2) -> (string_of_comparator c1)^" && "^(string_of_comparator c2) let rec varname_of_comparator = let concat p v = OASISUtils.varname_concat p (OASISUtils.varname_of_string (string_of_version v)) in function | VGreater v -> concat "gt" v | VLesser v -> concat "lt" v | VEqual v -> concat "eq" v | VGreaterEqual v -> concat "ge" v | VLesserEqual v -> concat "le" v | VOr (c1, c2) -> (varname_of_comparator c1)^"_or_"^(varname_of_comparator c2) | VAnd (c1, c2) -> (varname_of_comparator c1)^"_and_"^(varname_of_comparator c2) end module OASISLicense = struct # 21 "/tmp/buildd/oasis-0.2.0/src/oasis/OASISLicense.ml" (** License for _oasis fields @author Sylvain Le Gall *) type license = string type license_exception = string type license_version = | Version of OASISVersion.t | VersionOrLater of OASISVersion.t | NoVersion type license_dep_5 = { license: license; exceptions: license_exception list; version: license_version; } type t = | DEP5License of license_dep_5 | OtherLicense of string (* URL *) end module OASISExpr = struct # 21 "/tmp/buildd/oasis-0.2.0/src/oasis/OASISExpr.ml" open OASISGettext type test = string type flag = string type t = | EBool of bool | ENot of t | EAnd of t * t | EOr of t * t | EFlag of flag | ETest of test * string type 'a choices = (t * 'a) list let eval var_get t = let rec eval' = function | EBool b -> b | ENot e -> not (eval' e) | EAnd (e1, e2) -> (eval' e1) && (eval' e2) | EOr (e1, e2) -> (eval' e1) || (eval' e2) | EFlag nm -> let v = var_get nm in assert(v = "true" || v = "false"); (v = "true") | ETest (nm, vl) -> let v = var_get nm in (v = vl) in eval' t let choose ?printer ?name var_get lst = let rec choose_aux = function | (cond, vl) :: tl -> if eval var_get cond then vl else choose_aux tl | [] -> let str_lst = if lst = [] then s_ "" else String.concat (s_ ", ") (List.map (fun (cond, vl) -> match printer with | Some p -> p vl | None -> s_ "") lst) in match name with | Some nm -> failwith (Printf.sprintf (f_ "No result for the choice list '%s': %s") nm str_lst) | None -> failwith (Printf.sprintf (f_ "No result for a choice list: %s") str_lst) in choose_aux (List.rev lst) end module OASISTypes = struct # 21 "/tmp/buildd/oasis-0.2.0/src/oasis/OASISTypes.ml" type name = string type package_name = string type url = string type unix_dirname = string type unix_filename = string type host_dirname = string type host_filename = string type prog = string type arg = string type args = string list type command_line = (prog * arg list) type findlib_name = string type findlib_full = string type compiled_object = | Byte | Native | Best type dependency = | FindlibPackage of findlib_full * OASISVersion.comparator option | InternalLibrary of name type tool = | ExternalTool of name | InternalExecutable of name type vcs = | Darcs | Git | Svn | Cvs | Hg | Bzr | Arch | Monotone | OtherVCS of url type plugin_kind = [ `Configure | `Build | `Doc | `Test | `Install | `Extra ] type plugin_data_purpose = [ `Configure | `Build | `Install | `Clean | `Distclean | `Install | `Uninstall | `Test | `Doc | `Extra | `Other of string ] type 'a plugin = 'a * name * OASISVersion.t option type all_plugin = plugin_kind plugin type plugin_data = (all_plugin * plugin_data_purpose * (unit -> unit)) list # 102 "/tmp/buildd/oasis-0.2.0/src/oasis/OASISTypes.ml" type 'a conditional = 'a OASISExpr.choices type custom = { pre_command: (command_line option) conditional; post_command: (command_line option) conditional; } type common_section = { cs_name: name; cs_data: PropList.Data.t; cs_plugin_data: plugin_data; } type build_section = { bs_build: bool conditional; bs_install: bool conditional; bs_path: unix_dirname; bs_compiled_object: compiled_object; bs_build_depends: dependency list; bs_build_tools: tool list; bs_c_sources: unix_filename list; bs_data_files: (unix_filename * unix_filename option) list; bs_ccopt: args conditional; bs_cclib: args conditional; bs_dlllib: args conditional; bs_dllpath: args conditional; bs_byteopt: args conditional; bs_nativeopt: args conditional; } type library = { lib_modules: string list; lib_internal_modules: string list; lib_findlib_parent: findlib_name option; lib_findlib_name: findlib_name option; lib_findlib_containers: findlib_name list; } type executable = { exec_custom: bool; exec_main_is: unix_filename; } type flag = { flag_description: string option; flag_default: bool conditional; } type source_repository = { src_repo_type: vcs; src_repo_location: url; src_repo_browser: url option; src_repo_module: string option; src_repo_branch: string option; src_repo_tag: string option; src_repo_subdir: unix_filename option; } type test = { test_type: [`Test] plugin; test_command: command_line conditional; test_custom: custom; test_working_directory: unix_filename option; test_run: bool conditional; test_tools: tool list; } type doc_format = | HTML of unix_filename | DocText | PDF | PostScript | Info of unix_filename | DVI | OtherDoc type doc = { doc_type: [`Doc] plugin; doc_custom: custom; doc_build: bool conditional; doc_install: bool conditional; doc_install_dir: unix_filename; doc_title: string; doc_authors: string list; doc_abstract: string option; doc_format: doc_format; doc_data_files: (unix_filename * unix_filename option) list; doc_build_tools: tool list; } type section = | Library of common_section * build_section * library | Executable of common_section * build_section * executable | Flag of common_section * flag | SrcRepo of common_section * source_repository | Test of common_section * test | Doc of common_section * doc type package = { oasis_version: OASISVersion.t; ocaml_version: OASISVersion.comparator option; findlib_version: OASISVersion.comparator option; name: package_name; version: OASISVersion.t; license: OASISLicense.t; license_file: unix_filename option; copyrights: string list; maintainers: string list; authors: string list; homepage: url option; synopsis: string; description: string option; categories: url list; conf_type: [`Configure] plugin; conf_custom: custom; build_type: [`Build] plugin; build_custom: custom; install_type: [`Install] plugin; install_custom: custom; uninstall_custom: custom; clean_custom: custom; distclean_custom: custom; files_ab: unix_filename list; sections: section list; plugins: [`Extra] plugin list; schema_data: PropList.Data.t; plugin_data: plugin_data; } end module OASISUnixPath = struct # 21 "/tmp/buildd/oasis-0.2.0/src/oasis/OASISUnixPath.ml" type unix_filename = string type unix_dirname = string type host_filename = string type host_dirname = string let current_dir_name = "." let parent_dir_name = ".." let concat f1 f2 = if f1 = current_dir_name then f2 else if f2 = current_dir_name then f1 else f1^"/"^f2 let make = function | hd :: tl -> List.fold_left (fun f p -> concat f p) hd tl | [] -> invalid_arg "OASISUnixPath.make" let dirname f = try String.sub f 0 (String.rindex f '/') with Not_found -> current_dir_name let basename f = try let pos_start = (String.rindex f '/') + 1 in String.sub f pos_start ((String.length f) - pos_start) with Not_found -> f let chop_extension f = try let last_dot = String.rindex f '.' in let sub = String.sub f 0 last_dot in try let last_slash = String.rindex f '/' in if last_slash < last_dot then sub else f with Not_found -> sub with Not_found -> f end module OASISSection = struct # 21 "/tmp/buildd/oasis-0.2.0/src/oasis/OASISSection.ml" (** Manipulate section @author Sylvain Le Gall *) open OASISTypes type section_kind = | KLibrary | KExecutable | KFlag | KSrcRepo | KTest | KDoc (** Extract generic information *) let section_kind_common = function | Library (cs, _, _) -> KLibrary, cs | Executable (cs, _, _) -> KExecutable, cs | Flag (cs, _) -> KFlag, cs | SrcRepo (cs, _) -> KSrcRepo, cs | Test (cs, _) -> KTest, cs | Doc (cs, _) -> KDoc, cs (** Common section of a section *) let section_common sct = snd (section_kind_common sct) (** Key used to identify section *) let section_id sct = let k, cs = section_kind_common sct in k, cs.cs_name let string_of_section sct = let k, nm = section_id sct in (match k with | KLibrary -> "library" | KExecutable -> "executable" | KFlag -> "flag" | KSrcRepo -> "src repository" | KTest -> "test" | KDoc -> "doc") ^" "^nm end module OASISBuildSection = struct # 21 "/tmp/buildd/oasis-0.2.0/src/oasis/OASISBuildSection.ml" end module OASISExecutable = struct # 21 "/tmp/buildd/oasis-0.2.0/src/oasis/OASISExecutable.ml" open OASISTypes let unix_exec_is (cs, bs, exec) is_native ext_dll suffix_program = let dir = OASISUnixPath.concat bs.bs_path (OASISUnixPath.dirname exec.exec_main_is) in let is_native_exec = match bs.bs_compiled_object with | Native -> true | Best -> is_native () | Byte -> false in OASISUnixPath.concat dir (cs.cs_name^(suffix_program ())), if not is_native_exec && not exec.exec_custom && bs.bs_c_sources <> [] then Some (dir^"/dll"^cs.cs_name^(ext_dll ())) else None end module OASISLibrary = struct # 21 "/tmp/buildd/oasis-0.2.0/src/oasis/OASISLibrary.ml" open OASISTypes open OASISUtils open OASISGettext type library_name = name let generated_unix_files ~ctxt (cs, bs, lib) source_file_exists is_native ext_lib ext_dll = (* The headers that should be compiled along *) let headers = List.fold_left (fun hdrs modul -> try let base_fn = List.find (fun fn -> source_file_exists (fn^".ml") || source_file_exists (fn^".mli") || source_file_exists (fn^".mll") || source_file_exists (fn^".mly")) (List.map (OASISUnixPath.concat bs.bs_path) [modul; String.uncapitalize modul; String.capitalize modul]) in [base_fn^".cmi"] :: hdrs with Not_found -> OASISMessage.warning ~ctxt (f_ "Cannot find source file matching \ module '%s' in library %s") modul cs.cs_name; (List.map (OASISUnixPath.concat bs.bs_path) [modul^".cmi"; String.uncapitalize modul ^ ".cmi"; String.capitalize modul ^ ".cmi"]) :: hdrs) [] lib.lib_modules in let acc_nopath = [] in (* Compute what libraries should be built *) let acc_nopath = let byte acc = [cs.cs_name^".cma"] :: acc in let native acc = [cs.cs_name^".cmxa"] :: [cs.cs_name^(ext_lib ())] :: acc in match bs.bs_compiled_object with | Native -> byte (native acc_nopath) | Best when is_native () -> byte (native acc_nopath) | Byte | Best -> byte acc_nopath in (* Add C library to be built *) let acc_nopath = if bs.bs_c_sources <> [] then begin ["lib"^cs.cs_name^(ext_lib ())] :: ["dll"^cs.cs_name^(ext_dll ())] :: acc_nopath end else acc_nopath in (* All the files generated *) List.rev_append (List.rev_map (List.rev_map (OASISUnixPath.concat bs.bs_path)) acc_nopath) headers type group_t = | Container of findlib_name * (group_t list) | Package of (findlib_name * common_section * build_section * library * (group_t list)) let group_libs pkg = (** Associate a name with its children *) let children = List.fold_left (fun mp -> function | Library (cs, bs, lib) -> begin match lib.lib_findlib_parent with | Some p_nm -> begin let children = try MapString.find p_nm mp with Not_found -> [] in MapString.add p_nm ((cs, bs, lib) :: children) mp end | None -> mp end | _ -> mp) MapString.empty pkg.sections in (* Compute findlib name of a single node *) let findlib_name (cs, _, lib) = match lib.lib_findlib_name with | Some nm -> nm | None -> cs.cs_name in (** Build a package tree *) let rec tree_of_library containers ((cs, bs, lib) as acc) = match containers with | hd :: tl -> Container (hd, [tree_of_library tl acc]) | [] -> (* TODO: allow merging containers with the same * name *) Package (findlib_name acc, cs, bs, lib, (try List.rev_map (fun ((_, _, child_lib) as child_acc) -> tree_of_library child_lib.lib_findlib_containers child_acc) (MapString.find cs.cs_name children) with Not_found -> [])) in (* TODO: check that libraries are unique *) List.fold_left (fun acc -> function | Library (cs, bs, lib) when lib.lib_findlib_parent = None -> (tree_of_library lib.lib_findlib_containers (cs, bs, lib)) :: acc | _ -> acc) [] pkg.sections (** Compute internal to findlib library matchings, including subpackage and return a map of it. *) let findlib_name_map pkg = (* Compute names in a tree *) let rec findlib_names_aux path mp grp = let fndlb_nm, children, mp = match grp with | Container (fndlb_nm, children) -> fndlb_nm, children, mp | Package (fndlb_nm, {cs_name = nm}, _, _, children) -> fndlb_nm, children, (MapString.add nm (path, fndlb_nm) mp) in let fndlb_nm_full = (match path with | Some pth -> pth^"." | None -> "")^ fndlb_nm in List.fold_left (findlib_names_aux (Some fndlb_nm_full)) mp children in List.fold_left (findlib_names_aux None) MapString.empty (group_libs pkg) let findlib_of_name ?(recurse=false) map nm = try let (path, fndlb_nm) = MapString.find nm map in match path with | Some pth when recurse -> pth^"."^fndlb_nm | _ -> fndlb_nm with Not_found -> failwithf1 (f_ "Unable to translate internal library '%s' to findlib name") nm let name_findlib_map pkg = let mp = findlib_name_map pkg in MapString.fold (fun nm _ acc -> let fndlb_nm_full = findlib_of_name ~recurse:true mp nm in MapString.add fndlb_nm_full nm acc) mp MapString.empty let findlib_of_group = function | Container (fndlb_nm, _) | Package (fndlb_nm, _, _, _, _) -> fndlb_nm let root_of_group grp = let rec root_lib_aux = function | Container (_, children) -> root_lib_lst children | Package (_, cs, bs, lib, children) -> if lib.lib_findlib_parent = None then cs, bs, lib else root_lib_lst children and root_lib_lst = function | [] -> raise Not_found | hd :: tl -> try root_lib_aux hd with Not_found -> root_lib_lst tl in try root_lib_aux grp with Not_found -> failwithf1 (f_ "Unable to determine root library of findlib library '%s'") (findlib_of_group grp) end module OASISFlag = struct # 21 "/tmp/buildd/oasis-0.2.0/src/oasis/OASISFlag.ml" end module OASISPackage = struct # 21 "/tmp/buildd/oasis-0.2.0/src/oasis/OASISPackage.ml" end module OASISSourceRepository = struct # 21 "/tmp/buildd/oasis-0.2.0/src/oasis/OASISSourceRepository.ml" end module OASISTest = struct # 21 "/tmp/buildd/oasis-0.2.0/src/oasis/OASISTest.ml" end module OASISDocument = struct # 21 "/tmp/buildd/oasis-0.2.0/src/oasis/OASISDocument.ml" end module BaseEnvLight = struct # 21 "/tmp/buildd/oasis-0.2.0/src/base/BaseEnvLight.ml" module MapString = Map.Make(String) type t = string MapString.t let default_filename = Filename.concat (Sys.getcwd ()) "setup.data" let load ?(allow_empty=false) ?(filename=default_filename) () = if Sys.file_exists filename then begin let chn = open_in_bin filename in let st = Stream.of_channel chn in let line = ref 1 in let st_line = Stream.from (fun _ -> try match Stream.next st with | '\n' -> incr line; Some '\n' | c -> Some c with Stream.Failure -> None) in let lexer = Genlex.make_lexer ["="] st_line in let rec read_file mp = match Stream.npeek 3 lexer with | [Genlex.Ident nm; Genlex.Kwd "="; Genlex.String value] -> Stream.junk lexer; Stream.junk lexer; Stream.junk lexer; read_file (MapString.add nm value mp) | [] -> mp | _ -> failwith (Printf.sprintf "Malformed data file '%s' line %d" filename !line) in let mp = read_file MapString.empty in close_in chn; mp end else if allow_empty then begin MapString.empty end else begin failwith (Printf.sprintf "Unable to load environment, the file '%s' doesn't exist." filename) end let var_get name env = let rec var_expand str = let buff = Buffer.create ((String.length str) * 2) in Buffer.add_substitute buff (fun var -> try var_expand (MapString.find var env) with Not_found -> failwith (Printf.sprintf "No variable %s defined when trying to expand %S." var str)) str; Buffer.contents buff in var_expand (MapString.find name env) let var_choose lst env = OASISExpr.choose (fun nm -> var_get nm env) lst end module BaseContext = struct # 21 "/tmp/buildd/oasis-0.2.0/src/base/BaseContext.ml" open OASISContext let args = args let default = default end module BaseMessage = struct # 21 "/tmp/buildd/oasis-0.2.0/src/base/BaseMessage.ml" (** Message to user, overrid for Base @author Sylvain Le Gall *) open OASISMessage open BaseContext let debug fmt = debug ~ctxt:!default fmt let info fmt = info ~ctxt:!default fmt let warning fmt = warning ~ctxt:!default fmt let error fmt = error ~ctxt:!default fmt let string_of_exception = string_of_exception end module BaseFilePath = struct # 21 "/tmp/buildd/oasis-0.2.0/src/base/BaseFilePath.ml" open Filename module Unix = OASISUnixPath let make = function | [] -> invalid_arg "BaseFilename.make" | hd :: tl -> List.fold_left Filename.concat hd tl let of_unix ufn = if Sys.os_type = "Unix" then ufn else make (List.map (fun p -> if p = Unix.current_dir_name then current_dir_name else if p = Unix.parent_dir_name then parent_dir_name else p) (OASISUtils.split '/' ufn)) end module BaseEnv = struct # 21 "/tmp/buildd/oasis-0.2.0/src/base/BaseEnv.ml" open OASISTypes open OASISGettext open OASISUtils open PropList module MapString = BaseEnvLight.MapString type origin_t = | ODefault | OGetEnv | OFileLoad | OCommandLine type cli_handle_t = | CLINone | CLIAuto | CLIWith | CLIEnable | CLIUser of (Arg.key * Arg.spec * Arg.doc) list type definition_t = { hide: bool; dump: bool; cli: cli_handle_t; arg_help: string option; group: string option; } let schema = Schema.create "environment" (* Environment data *) let env = Data.create () (* Environment data from file *) let env_from_file = ref MapString.empty (* Lexer for var *) let var_lxr = Genlex.make_lexer [] let rec var_expand str = let buff = Buffer.create ((String.length str) * 2) in Buffer.add_substitute buff (fun var -> try (* TODO: this is a quick hack to allow calling Test.Command * without defining executable name really. I.e. if there is * an exec Executable toto, then $(toto) should be replace * by its real name. It is however useful to have this function * for other variable that depend on the host and should be * written better than that. *) let st = var_lxr (Stream.of_string var) in match Stream.npeek 3 st with | [Genlex.Ident "utoh"; Genlex.Ident nm] -> BaseFilePath.of_unix (var_get nm) | [Genlex.Ident "utoh"; Genlex.String s] -> BaseFilePath.of_unix s | [Genlex.Ident "ocaml_escaped"; Genlex.Ident nm] -> String.escaped (var_get nm) | [Genlex.Ident "ocaml_escaped"; Genlex.String s] -> String.escaped s | [Genlex.Ident nm] -> var_get nm | _ -> failwithf2 (f_ "Unknown expression '%s' in variable expansion of %s.") var str with | Unknown_field (_, _) -> failwithf2 (f_ "No variable %s defined when trying to expand %S.") var str | Stream.Error e -> failwithf3 (f_ "Syntax error when parsing '%s' when trying to \ expand %S: %s") var str e) str; Buffer.contents buff and var_get name = let vl = try Schema.get schema env name with Unknown_field _ as e -> begin try MapString.find name !env_from_file with Not_found -> raise e end in var_expand vl let var_choose ?printer ?name lst = OASISExpr.choose ?printer ?name var_get lst let var_protect vl = let buff = Buffer.create (String.length vl) in String.iter (function | '$' -> Buffer.add_string buff "\\$" | c -> Buffer.add_char buff c) vl; Buffer.contents buff let var_define ?(hide=false) ?(dump=true) ?short_desc ?(cli=CLINone) ?arg_help ?group name (* TODO: type constraint on the fact that name must be a valid OCaml id *) dflt = let default = [ OFileLoad, lazy (MapString.find name !env_from_file); ODefault, dflt; OGetEnv, lazy (Sys.getenv name); ] in let extra = { hide = hide; dump = dump; cli = cli; arg_help = arg_help; group = group; } in (* Try to find a value that can be defined *) let var_get_low lst = let errors, res = List.fold_left (fun (errors, res) (_, v) -> if res = None then begin try errors, Some (Lazy.force v) with | Not_found -> errors, res | Failure rsn -> (rsn :: errors), res | e -> (Printexc.to_string e) :: errors, res end else errors, res) ([], None) (List.sort (fun (o1, _) (o2, _) -> if o1 < o2 then 1 else if o1 = o2 then 0 else -1) lst) in match res, errors with | Some v, _ -> v | None, [] -> raise (Not_set (name, None)) | None, lst -> raise (Not_set (name, Some (String.concat (s_ ", ") lst))) in let help = match short_desc with | Some fs -> Some fs | None -> None in let var_get_lst = FieldRO.create ~schema ~name ~parse:(fun ?(context=ODefault) s -> [context, lazy s]) ~print:var_get_low ~default ~update:(fun ?context x old_x -> x @ old_x) ?help extra in fun () -> var_expand (var_get_low (var_get_lst env)) let var_redefine ?hide ?dump ?short_desc ?cli ?arg_help ?group name dflt = if Schema.mem schema name then begin Schema.set schema env ~context:ODefault name (Lazy.force dflt); fun () -> var_get name end else begin var_define ?hide ?dump ?short_desc ?cli ?arg_help ?group name dflt end let var_ignore (e : unit -> string) = () let print_hidden = var_define ~hide:true ~dump:false ~cli:CLIAuto ~arg_help:"Print even non-printable variable. (debug)" "print_hidden" (lazy "false") let var_all () = List.rev (Schema.fold (fun acc nm def _ -> if not def.hide || bool_of_string (print_hidden ()) then nm :: acc else acc) [] schema) let default_filename = BaseEnvLight.default_filename let load ?allow_empty ?filename () = env_from_file := BaseEnvLight.load ?allow_empty ?filename () let unload () = (* TODO: reset lazy values *) env_from_file := MapString.empty; Data.clear env let dump ?(filename=default_filename) () = let chn = open_out_bin filename in Schema.iter (fun nm def _ -> if def.dump then begin try let value = Schema.get schema env nm in Printf.fprintf chn "%s = %S\n" nm value with Not_set _ -> () end) schema; close_out chn let print () = let printable_vars = Schema.fold (fun acc nm def short_descr_opt -> if not def.hide || bool_of_string (print_hidden ()) then begin try let value = Schema.get schema env nm in let txt = match short_descr_opt with | Some s -> s () | None -> nm in (txt, value) :: acc with Not_set _ -> acc end else acc) [] schema in let max_length = List.fold_left max 0 (List.rev_map String.length (List.rev_map fst printable_vars)) in let dot_pad str = String.make ((max_length - (String.length str)) + 3) '.' in print_newline (); print_endline "Configuration: "; print_newline (); List.iter (fun (name,value) -> Printf.printf "%s: %s %s\n" name (dot_pad name) value) printable_vars; Printf.printf "%!"; print_newline () let args () = let arg_concat = OASISUtils.varname_concat ~hyphen:'-' in [ "--override", Arg.Tuple ( let rvr = ref "" in let rvl = ref "" in [ Arg.Set_string rvr; Arg.Set_string rvl; Arg.Unit (fun () -> Schema.set schema env ~context:OCommandLine !rvr !rvl) ] ), "var+val Override any configuration variable."; ] @ List.flatten (Schema.fold (fun acc name def short_descr_opt -> let var_set s = Schema.set schema env ~context:OCommandLine name s in let arg_name = OASISUtils.varname_of_string ~hyphen:'-' name in let hlp = match short_descr_opt with | Some txt -> txt () | None -> "" in let arg_hlp = match def.arg_help with | Some s -> s | None -> "str" in let default_value = try Printf.sprintf (f_ " [%s]") (Schema.get schema env name) with Not_set _ -> "" in let args = match def.cli with | CLINone -> [] | CLIAuto -> [ arg_concat "--" arg_name, Arg.String var_set, Printf.sprintf (f_ "%s %s%s") arg_hlp hlp default_value ] | CLIWith -> [ arg_concat "--with-" arg_name, Arg.String var_set, Printf.sprintf (f_ "%s %s%s") arg_hlp hlp default_value ] | CLIEnable -> [ arg_concat "--enable-" arg_name, Arg.Unit (fun () -> var_set "true"), Printf.sprintf (f_ " %s%s") hlp (if default_value = " [true]" then (s_ " [default]") else ""); arg_concat "--disable-" arg_name, Arg.Unit (fun () -> var_set "false"), Printf.sprintf (f_ " %s%s") hlp (if default_value = " [false]" then (s_ " [default]") else ""); ] | CLIUser lst -> lst in args :: acc) [] schema) end module BaseExec = struct # 21 "/tmp/buildd/oasis-0.2.0/src/base/BaseExec.ml" open OASISGettext open OASISUtils open BaseMessage let run ?f_exit_code cmd args = let cmdline = String.concat " " (cmd :: args) in info (f_ "Running command '%s'") cmdline; match f_exit_code, Sys.command cmdline with | None, 0 -> () | None, i -> failwithf2 (f_ "Command '%s' terminated with error code %d") cmdline i | Some f, i -> f i let run_read_output cmd args = let fn = Filename.temp_file "oasis-" ".txt" in let () = try run cmd (args @ [">"; Filename.quote fn]) with e -> Sys.remove fn; raise e in let chn = open_in fn in let routput = ref [] in ( try while true do routput := (input_line chn) :: !routput done with End_of_file -> () ); close_in chn; Sys.remove fn; List.rev !routput let run_read_one_line cmd args = match run_read_output cmd args with | [fst] -> fst | lst -> failwithf1 (f_ "Command return unexpected output %S") (String.concat "\n" lst) end module BaseFileUtil = struct # 21 "/tmp/buildd/oasis-0.2.0/src/base/BaseFileUtil.ml" open OASISGettext let find_file paths exts = (* Cardinal product of two list *) let ( * ) lst1 lst2 = List.flatten (List.map (fun a -> List.map (fun b -> a,b) lst2) lst1) in let rec combined_paths lst = match lst with | p1 :: p2 :: tl -> let acc = (List.map (fun (a,b) -> Filename.concat a b) (p1 * p2)) in combined_paths (acc :: tl) | [e] -> e | [] -> [] in let alternatives = List.map (fun (p,e) -> if String.length e > 0 && e.[0] <> '.' then p ^ "." ^ e else p ^ e) ((combined_paths paths) * exts) in List.find Sys.file_exists alternatives let which prg = let path_sep = match Sys.os_type with | "Win32" -> ';' | _ -> ':' in let path_lst = OASISUtils.split path_sep (Sys.getenv "PATH") in let exec_ext = match Sys.os_type with | "Win32" -> "" :: (OASISUtils.split path_sep (Sys.getenv "PATHEXT")) | _ -> [""] in find_file [path_lst; [prg]] exec_ext (**/**) let rec fix_dir dn = (* Windows hack because Sys.file_exists "src\\" = false when * Sys.file_exists "src" = true *) let ln = String.length dn in if Sys.os_type = "Win32" && ln > 0 && dn.[ln - 1] = '\\' then fix_dir (String.sub dn 0 (ln - 1)) else dn let q = Filename.quote (**/**) let cp src tgt = BaseExec.run (match Sys.os_type with | "Win32" -> "copy" | _ -> "cp") [q src; q tgt] let mkdir tgt = BaseExec.run (match Sys.os_type with | "Win32" -> "md" | _ -> "mkdir") [q tgt] let rec mkdir_parent f tgt = let tgt = fix_dir tgt in if Sys.file_exists tgt then begin if not (Sys.is_directory tgt) then OASISUtils.failwithf1 (f_ "Cannot create directory '%s', a file of the same name already \ exists") tgt end else begin mkdir_parent f (Filename.dirname tgt); if not (Sys.file_exists tgt) then begin f tgt; mkdir tgt end end let rmdir tgt = if Sys.readdir tgt = [||] then begin match Sys.os_type with | "Win32" -> BaseExec.run "rd" [q tgt] | _ -> BaseExec.run "rm" ["-r"; q tgt] end let glob fn = let basename = Filename.basename fn in if String.length basename >= 2 && basename.[0] = '*' && basename.[1] = '.' then begin let ext_len = (String.length basename) - 2 in let ext = String.sub basename 2 ext_len in let dirname = Filename.dirname fn in Array.fold_left (fun acc fn -> try let fn_ext = String.sub fn ((String.length fn) - ext_len) ext_len in if fn_ext = ext then (Filename.concat dirname fn) :: acc else acc with Invalid_argument _ -> acc) [] (Sys.readdir dirname) end else begin if Sys.file_exists fn then [fn] else [] end end module BaseArgExt = struct # 21 "/tmp/buildd/oasis-0.2.0/src/base/BaseArgExt.ml" open OASISUtils open OASISGettext let parse argv args = (* Simulate command line for Arg *) let current = ref 0 in try Arg.parse_argv ~current:current (Array.concat [[|"none"|]; argv]) (Arg.align args) (failwithf1 (f_ "Don't know what to do with arguments: '%s'")) (s_ "configure options:") with | Arg.Help txt -> print_endline txt; exit 0 | Arg.Bad txt -> prerr_endline txt; exit 1 end module BaseCheck = struct # 21 "/tmp/buildd/oasis-0.2.0/src/base/BaseCheck.ml" open BaseEnv open BaseMessage open OASISUtils open OASISGettext let prog_best prg prg_lst = var_redefine prg (lazy (let alternate = List.fold_left (fun res e -> match res with | Some _ -> res | None -> try Some (BaseFileUtil.which e) with Not_found -> None) None prg_lst in match alternate with | Some prg -> prg | None -> raise Not_found)) let prog prg = prog_best prg [prg] let prog_opt prg = prog_best prg [prg^".opt"; prg] let ocamlfind = prog "ocamlfind" let version var_prefix cmp fversion () = (* Really compare version provided *) let var = var_prefix^"_version_"^(OASISVersion.varname_of_comparator cmp) in var_redefine ~hide:true var (lazy (let version_str = match fversion () with | "[Distributed with OCaml]" -> begin try (var_get "ocaml_version") with Not_found -> warning (f_ "Variable ocaml_version not defined, fallback \ to default"); Sys.ocaml_version end | res -> res in let version = OASISVersion.version_of_string version_str in if OASISVersion.comparator_apply version cmp then version_str else failwithf3 (f_ "Cannot satisfy version constraint on %s: %s (version: %s)") var_prefix (OASISVersion.string_of_comparator cmp) version_str)) () let package_version pkg = BaseExec.run_read_one_line (ocamlfind ()) ["query"; "-format"; "%v"; pkg] let package ?version_comparator pkg () = let var = OASISUtils.varname_concat "pkg_" (OASISUtils.varname_of_string pkg) in let findlib_dir pkg = let dir = BaseExec.run_read_one_line (ocamlfind ()) ["query"; "-format"; "%d"; pkg] in if Sys.file_exists dir && Sys.is_directory dir then dir else failwithf2 (f_ "When looking for findlib package %s, \ directory %s return doesn't exist") pkg dir in let vl = var_redefine var (lazy (findlib_dir pkg)) () in ( match version_comparator with | Some ver_cmp -> ignore (version var ver_cmp (fun _ -> package_version pkg) ()) | None -> () ); vl end module BaseOCamlcConfig = struct # 21 "/tmp/buildd/oasis-0.2.0/src/base/BaseOCamlcConfig.ml" open BaseEnv open OASISUtils open OASISGettext module SMap = Map.Make(String) let ocamlc = BaseCheck.prog_opt "ocamlc" let ocamlc_config_map = (* Map name to value for ocamlc -config output (name ^": "^value) *) let rec split_field mp lst = match lst with | line :: tl -> let mp = try let pos_semicolon = String.index line ':' in if pos_semicolon > 1 then ( let name = String.sub line 0 pos_semicolon in let linelen = String.length line in let value = if linelen > pos_semicolon + 2 then String.sub line (pos_semicolon + 2) (linelen - pos_semicolon - 2) else "" in SMap.add name value mp ) else ( mp ) with Not_found -> ( mp ) in split_field mp tl | [] -> mp in var_redefine "ocamlc_config_map" ~hide:true ~dump:false (lazy (var_protect (Marshal.to_string (split_field SMap.empty (BaseExec.run_read_output (ocamlc ()) ["-config"])) []))) let var_define nm = (* Extract data from ocamlc -config *) let avlbl_config_get () = Marshal.from_string (ocamlc_config_map ()) 0 in let nm_config = match nm with | "ocaml_version" -> "version" | _ -> nm in var_redefine nm (lazy (try let map = avlbl_config_get () in let value = SMap.find nm_config map in value with Not_found -> failwithf2 (f_ "Cannot find field '%s' in '%s -config' output") nm (ocamlc ()))) end module BaseStandardVar = struct # 21 "/tmp/buildd/oasis-0.2.0/src/base/BaseStandardVar.ml" open OASISGettext open OASISTypes open OASISExpr open BaseCheck open BaseEnv let ocamlfind = BaseCheck.ocamlfind let ocamlc = BaseOCamlcConfig.ocamlc let ocamlopt = prog_opt "ocamlopt" let ocamlbuild = prog "ocamlbuild" (**/**) let rpkg = ref None let pkg_get () = match !rpkg with | Some pkg -> pkg | None -> failwith (s_ "OASIS Package is not set") (**/**) let pkg_name = var_define ~short_desc:(fun () -> s_ "Package name") "pkg_name" (lazy (pkg_get ()).name) let pkg_version = var_define ~short_desc:(fun () -> s_ "Package version") "pkg_version" (lazy (OASISVersion.string_of_version (pkg_get ()).version)) let c = BaseOCamlcConfig.var_define let os_type = c "os_type" let system = c "system" let architecture = c "architecture" let ccomp_type = c "ccomp_type" let ocaml_version = c "ocaml_version" (* TODO: Check standard variable presence at runtime *) let standard_library_default = c "standard_library_default" let standard_library = c "standard_library" let standard_runtime = c "standard_runtime" let bytecomp_c_compiler = c "bytecomp_c_compiler" let native_c_compiler = c "native_c_compiler" let model = c "model" let ext_obj = c "ext_obj" let ext_asm = c "ext_asm" let ext_lib = c "ext_lib" let ext_dll = c "ext_dll" let default_executable_name = c "default_executable_name" let systhread_supported = c "systhread_supported" (**/**) let p name hlp dflt = var_define ~short_desc:hlp ~cli:CLIAuto ~arg_help:"dir" name dflt let (/) a b = if os_type () = Sys.os_type then Filename.concat a b else if os_type () = "Unix" then BaseFilePath.Unix.concat a b else OASISUtils.failwithf1 (f_ "Cannot handle os_type %s filename concat") (os_type ()) (**/**) let prefix = p "prefix" (fun () -> s_ "Install architecture-independent files dir") (lazy (match os_type () with | "Win32" -> let program_files = Sys.getenv "PROGRAMFILES" in program_files/(pkg_name ()) | _ -> "/usr/local")) let exec_prefix = p "exec_prefix" (fun () -> s_ "Install architecture-dependent files in dir") (lazy "$prefix") let bindir = p "bindir" (fun () -> s_ "User executables") (lazy ("$exec_prefix"/"bin")) let sbindir = p "sbindir" (fun () -> s_ "System admin executables") (lazy ("$exec_prefix"/"sbin")) let libexecdir = p "libexecdir" (fun () -> s_ "Program executables") (lazy ("$exec_prefix"/"libexec")) let sysconfdir = p "sysconfdir" (fun () -> s_ "Read-only single-machine data") (lazy ("$prefix"/"etc")) let sharedstatedir = p "sharedstatedir" (fun () -> s_ "Modifiable architecture-independent data") (lazy ("$prefix"/"com")) let localstatedir = p "localstatedir" (fun () -> s_ "Modifiable single-machine data") (lazy ("$prefix"/"var")) let libdir = p "libdir" (fun () -> s_ "Object code libraries") (lazy ("$exec_prefix"/"lib")) let datarootdir = p "datarootdir" (fun () -> s_ "Read-only arch-independent data root") (lazy ("$prefix"/"share")) let datadir = p "datadir" (fun () -> s_ "Read-only architecture-independent data") (lazy ("$datarootdir")) let infodir = p "infodir" (fun () -> s_ "Info documentation") (lazy ("$datarootdir"/"info")) let localedir = p "localedir" (fun () -> s_ "Locale-dependent data") (lazy ("$datarootdir"/"locale")) let mandir = p "mandir" (fun () -> s_ "Man documentation") (lazy ("$datarootdir"/"man")) let docdir = p "docdir" (fun () -> s_ "Documentation root") (lazy ("$datarootdir"/"doc"/"$pkg_name")) let htmldir = p "htmldir" (fun () -> s_ "HTML documentation") (lazy ("$docdir")) let dvidir = p "dvidir" (fun () -> s_ "DVI documentation") (lazy ("$docdir")) let pdfdir = p "pdfdir" (fun () -> s_ "PDF documentation") (lazy ("$docdir")) let psdir = p "psdir" (fun () -> s_ "PS documentation") (lazy ("$docdir")) let destdir = p "destdir" (fun () -> s_ "Prepend a path when installing package") (lazy (raise (PropList.Not_set ("destdir", Some (s_ "undefined by construct"))))) let findlib_version = var_define "findlib_version" (lazy (BaseCheck.package_version "findlib")) let is_native = var_define "is_native" (lazy (try let _s : string = ocamlopt () in "true" with PropList.Not_set _ -> let _s : string = ocamlc () in "false")) let ext_program = var_define "suffix_program" (lazy (match os_type () with | "Win32" -> ".exe" | _ -> "" )) let rm = var_define ~short_desc:(fun () -> s_ "Remove a file.") "rm" (lazy (match os_type () with | "Win32" -> "del" | _ -> "rm -f")) let rmdir = var_define ~short_desc:(fun () -> s_ "Remove a directory.") "rmdir" (lazy (match os_type () with | "Win32" -> "rd" | _ -> "rm -rf")) let debug = var_define ~short_desc:(fun () -> s_ "Compile with ocaml debug flag on.") "debug" (lazy "true") let profile = var_define ~short_desc:(fun () -> s_ "Compile with ocaml profile flag on.") "profile" (lazy "false") let init pkg = rpkg := Some pkg end module BaseFileAB = struct # 21 "/tmp/buildd/oasis-0.2.0/src/base/BaseFileAB.ml" open BaseEnv open OASISGettext open BaseMessage let to_filename fn = let fn = BaseFilePath.of_unix fn in if not (Filename.check_suffix fn ".ab") then warning (f_ "File '%s' doesn't have '.ab' extension") fn; Filename.chop_extension fn let replace fn_lst = let buff = Buffer.create 13 in List.iter (fun fn -> let fn = BaseFilePath.of_unix fn in let chn_in = open_in fn in let chn_out = open_out (to_filename fn) in ( try while true do Buffer.add_string buff (var_expand (input_line chn_in)); Buffer.add_char buff '\n' done with End_of_file -> () ); Buffer.output_buffer chn_out buff; Buffer.clear buff; close_in chn_in; close_out chn_out) fn_lst end module BaseLog = struct # 21 "/tmp/buildd/oasis-0.2.0/src/base/BaseLog.ml" open OASISUtils let default_filename = Filename.concat (Filename.dirname BaseEnv.default_filename) "setup.log" module SetTupleString = Set.Make (struct type t = string * string let compare (s11, s12) (s21, s22) = match String.compare s11 s21 with | 0 -> String.compare s12 s22 | n -> n end) let load () = if Sys.file_exists default_filename then begin let chn = open_in default_filename in let scbuf = Scanf.Scanning.from_file default_filename in let rec read_aux (st, lst) = if not (Scanf.Scanning.end_of_input scbuf) then begin let acc = try Scanf.bscanf scbuf "%S %S@\n" (fun e d -> let t = e, d in if SetTupleString.mem t st then st, lst else SetTupleString.add t st, t :: lst) with Scanf.Scan_failure _ -> failwith (Scanf.bscanf scbuf "%l" (fun line -> Printf.sprintf "Malformed log file '%s' at line %d" default_filename line)) in read_aux acc end else begin close_in chn; List.rev lst end in read_aux (SetTupleString.empty, []) end else begin [] end let register event data = let chn_out = open_out_gen [Open_append; Open_creat; Open_text] 0o644 default_filename in Printf.fprintf chn_out "%S %S\n" event data; close_out chn_out let unregister event data = if Sys.file_exists default_filename then begin let lst = load () in let chn_out = open_out default_filename in let write_something = ref false in List.iter (fun (e, d) -> if e <> event || d <> data then begin write_something := true; Printf.fprintf chn_out "%S %S\n" e d end) lst; close_out chn_out; if not !write_something then Sys.remove default_filename end let filter events = let st_events = List.fold_left (fun st e -> SetString.add e st) SetString.empty events in List.filter (fun (e, _) -> SetString.mem e st_events) (load ()) let exists event data = List.exists (fun v -> (event, data) = v) (load ()) end module BaseBuilt = struct # 21 "/tmp/buildd/oasis-0.2.0/src/base/BaseBuilt.ml" open OASISTypes open OASISGettext open BaseStandardVar open BaseMessage type t = | BExec (* Executable *) | BExecLib (* Library coming with executable *) | BLib (* Library *) | BDoc (* Document *) let to_log_event_file t nm = "built_"^ (match t with | BExec -> "exec" | BExecLib -> "exec_lib" | BLib -> "lib" | BDoc -> "doc")^ "_"^nm let to_log_event_done t nm = "is_"^(to_log_event_file t nm) let register t nm lst = BaseLog.register (to_log_event_done t nm) "true"; List.iter (fun alt -> let registered = List.fold_left (fun registered fn -> if Sys.file_exists fn then begin BaseLog.register (to_log_event_file t nm) (if Filename.is_relative fn then Filename.concat (Sys.getcwd ()) fn else fn); true end else registered) false alt in if not registered then warning (f_ "Cannot find an existing alternative files among: %s") (String.concat (s_ ", ") alt)) lst let unregister t nm = List.iter (fun (e, d) -> BaseLog.unregister e d) (BaseLog.filter [to_log_event_file t nm; to_log_event_done t nm]) let fold t nm f acc = List.fold_left (fun acc (_, fn) -> if Sys.file_exists fn then begin f acc fn end else begin warning (f_ "File '%s' has been marked as built \ for %s but doesn't exist") fn (Printf.sprintf (match t with | BExec | BExecLib -> (f_ "executable %s") | BLib -> (f_ "library %s") | BDoc -> (f_ "documentation %s")) nm); acc end) acc (BaseLog.filter [to_log_event_file t nm]) let is_built t nm = List.fold_left (fun is_built (_, d) -> (try bool_of_string d with _ -> false)) false (BaseLog.filter [to_log_event_done t nm]) let of_executable ffn (cs, bs, exec) = let unix_exec_is, unix_dll_opt = OASISExecutable.unix_exec_is (cs, bs, exec) (fun () -> bool_of_string (is_native ())) ext_dll ext_program in let evs = (BExec, cs.cs_name, [[ffn unix_exec_is]]) :: (match unix_dll_opt with | Some fn -> [BExecLib, cs.cs_name, [[ffn fn]]] | None -> []) in evs, unix_exec_is, unix_dll_opt let of_library ffn (cs, bs, lib) = let unix_lst = OASISLibrary.generated_unix_files ~ctxt:!BaseContext.default (cs, bs, lib) (fun fn -> Sys.file_exists (BaseFilePath.of_unix fn)) (fun () -> bool_of_string (is_native ())) ext_lib ext_dll in let evs = [BLib, cs.cs_name, List.map (List.map ffn) unix_lst] in evs, unix_lst end module BaseCustom = struct # 21 "/tmp/buildd/oasis-0.2.0/src/base/BaseCustom.ml" open BaseEnv open BaseMessage open OASISTypes open OASISGettext let run cmd args extra_args = BaseExec.run (var_expand cmd) (List.map var_expand (args @ (Array.to_list extra_args))) let hook ?(failsafe=false) cstm f e = let optional_command lst = let printer = function | Some (cmd, args) -> String.concat " " (cmd :: args) | None -> s_ "No command" in match var_choose ~name:(s_ "Pre/Post Command") ~printer lst with | Some (cmd, args) -> begin try run cmd args [||] with e when failsafe -> warning (f_ "Command '%s' fail with error: %s") (String.concat " " (cmd :: args)) (match e with | Failure msg -> msg | e -> Printexc.to_string e) end | None -> () in let res = optional_command cstm.pre_command; f e in optional_command cstm.post_command; res end module BaseDynVar = struct # 21 "/tmp/buildd/oasis-0.2.0/src/base/BaseDynVar.ml" open OASISTypes open OASISGettext open BaseEnv open BaseBuilt let init pkg = List.iter (function | Executable (cs, bs, exec) -> var_ignore (var_redefine (* We don't save this variable *) ~dump:false ~short_desc:(fun () -> Printf.sprintf (f_ "Filename of executable '%s'") cs.cs_name) cs.cs_name (lazy (let fn_opt = fold BExec cs.cs_name (fun _ fn -> Some fn) None in match fn_opt with | Some fn -> fn | None -> raise (PropList.Not_set (cs.cs_name, Some (Printf.sprintf (f_ "Executable '%s' not yet built.") cs.cs_name)))))) | Library _ | Flag _ | Test _ | SrcRepo _ | Doc _ -> ()) pkg.sections end module BaseTest = struct # 21 "/tmp/buildd/oasis-0.2.0/src/base/BaseTest.ml" open BaseEnv open BaseMessage open OASISTypes open OASISExpr open OASISGettext let test lst pkg extra_args = let one_test (failure, n) (test_plugin, cs, test) = if var_choose ~name:(Printf.sprintf (f_ "test %s run") cs.cs_name) ~printer:string_of_bool test.test_run then begin let () = info (f_ "Running test '%s'") cs.cs_name in let back_cwd = match test.test_working_directory with | Some dir -> let cwd = Sys.getcwd () in let chdir d = info (f_ "Changing directory to '%s'") d; Sys.chdir d in chdir dir; fun () -> chdir cwd | None -> fun () -> () in try let failure_percent = BaseCustom.hook test.test_custom (test_plugin pkg (cs, test)) extra_args in back_cwd (); (failure_percent +. failure, n + 1) with e -> begin back_cwd (); raise e end end else begin info (f_ "Skipping test '%s'") cs.cs_name; (failure, n) end in let (failed, n) = List.fold_left one_test (0.0, 0) lst in let failure_percent = if n = 0 then 0.0 else failed /. (float_of_int n) in let msg = Printf.sprintf (f_ "Tests had a %.2f%% failure rate") (100. *. failure_percent) in if failure_percent > 0.0 then failwith msg else info "%s" msg end module BaseDoc = struct # 21 "/tmp/buildd/oasis-0.2.0/src/base/BaseDoc.ml" open BaseEnv open BaseMessage open OASISTypes open OASISGettext let doc lst pkg extra_args = let one_doc (doc_plugin, cs, doc) = if var_choose ~name:(Printf.sprintf (f_ "documentation %s build") cs.cs_name) ~printer:string_of_bool doc.doc_build then begin info (f_ "Building documentation '%s'") cs.cs_name; BaseCustom.hook doc.doc_custom (doc_plugin pkg (cs, doc)) extra_args end in List.iter one_doc lst end module BaseSetup = struct # 21 "/tmp/buildd/oasis-0.2.0/src/base/BaseSetup.ml" open BaseEnv open BaseMessage open OASISTypes open OASISSection open OASISGettext open OASISUtils type std_args_fun = package -> string array -> unit type ('a, 'b) section_args_fun = name * (package -> (common_section * 'a) -> string array -> 'b) type t = { configure: std_args_fun; build: std_args_fun; doc: ((doc, unit) section_args_fun) list; test: ((test, float) section_args_fun) list; install: std_args_fun; uninstall: std_args_fun; clean: std_args_fun list; clean_doc: (doc, unit) section_args_fun list; clean_test: (test, unit) section_args_fun list; distclean: std_args_fun list; distclean_doc: (doc, unit) section_args_fun list; distclean_test: (test, unit) section_args_fun list; package: package; version: string; } (* Associate a plugin function with data from package *) let join_plugin_sections filter_map lst = List.rev (List.fold_left (fun acc sct -> match filter_map sct with | Some e -> e :: acc | None -> acc) [] lst) (* Search for plugin data associated with a section name *) let lookup_plugin_section plugin action nm lst = try List.assoc nm lst with Not_found -> failwithf3 (f_ "Cannot find plugin %s matching section %s for %s action") plugin nm action let configure t args = (* Run configure *) BaseCustom.hook t.package.conf_custom (t.configure t.package) args; (* Reload environment *) unload (); load (); (* Replace data in file *) BaseFileAB.replace t.package.files_ab let build t args = BaseCustom.hook t.package.build_custom (t.build t.package) args let doc t args = BaseDoc.doc (join_plugin_sections (function | Doc (cs, e) -> Some (lookup_plugin_section "documentation" (s_ "build") cs.cs_name t.doc, cs, e) | _ -> None) t.package.sections) t.package args let test t args = BaseTest.test (join_plugin_sections (function | Test (cs, e) -> Some (lookup_plugin_section "test" (s_ "run") cs.cs_name t.test, cs, e) | _ -> None) t.package.sections) t.package args let all t args = let rno_doc = ref false in let rno_test = ref false in Arg.parse_argv ~current:(ref 0) (Array.of_list ((Sys.executable_name^" all") :: (Array.to_list args))) [ "-no-doc", Arg.Set rno_doc, s_ "Don't run doc target"; "-no-test", Arg.Set rno_test, s_ "Don't run test target"; ] (failwithf1 (f_ "Don't know what to do with '%s'")) ""; info "Running configure step"; configure t [||]; info "Running build step"; build t [||]; (* Load setup.log dynamic variables *) BaseDynVar.init t.package; if not !rno_doc then begin info "Running doc step"; doc t [||]; end else begin info "Skipping doc step" end; if not !rno_test then begin info "Running test step"; test t [||] end else begin info "Skipping test step" end let install t args = BaseCustom.hook t.package.install_custom (t.install t.package) args let uninstall t args = BaseCustom.hook t.package.uninstall_custom (t.uninstall t.package) args let reinstall t args = uninstall t args; install t args let clean, distclean = let failsafe f a = try f a with e -> warning (f_ "Action fail with error: %s") (match e with | Failure msg -> msg | e -> Printexc.to_string e) in let generic_clean t cstm mains docs tests args = BaseCustom.hook ~failsafe:true cstm (fun () -> (* Clean section *) List.iter (function | Test (cs, test) -> let f = try List.assoc cs.cs_name tests with Not_found -> fun _ _ _ -> () in failsafe (f t.package (cs, test)) args | Doc (cs, doc) -> let f = try List.assoc cs.cs_name docs with Not_found -> fun _ _ _ -> () in failsafe (f t.package (cs, doc)) args | Library _ | Executable _ | Flag _ | SrcRepo _ -> ()) t.package.sections; (* Clean whole package *) List.iter (fun f -> failsafe (f t.package) args) mains) () in let clean t args = generic_clean t t.package.clean_custom t.clean t.clean_doc t.clean_test args in let distclean t args = (* Call clean *) clean t args; (* Remove generated file *) List.iter (fun fn -> if Sys.file_exists fn then begin info (f_ "Remove '%s'") fn; Sys.remove fn end) (BaseEnv.default_filename :: BaseLog.default_filename :: (List.rev_map BaseFileAB.to_filename t.package.files_ab)); (* Call distclean code *) generic_clean t t.package.distclean_custom t.distclean t.distclean_doc t.distclean_test args in clean, distclean let version t _ = print_endline t.version let setup t = let catch_exn = ref true in try let act_ref = ref (fun _ -> failwithf2 (f_ "No action defined, run '%s %s -help'") Sys.executable_name Sys.argv.(0)) in let extra_args_ref = ref [] in let allow_empty_env_ref = ref false in let arg_handle ?(allow_empty_env=false) act = Arg.Tuple [ Arg.Rest (fun str -> extra_args_ref := str :: !extra_args_ref); Arg.Unit (fun () -> allow_empty_env_ref := allow_empty_env; act_ref := act); ] in Arg.parse (Arg.align [ "-configure", arg_handle ~allow_empty_env:true configure, s_ "[options*] Configure the whole build process."; "-build", arg_handle build, s_ "[options*] Build executables and libraries."; "-doc", arg_handle doc, s_ "[options*] Build documents."; "-test", arg_handle test, s_ "[options*] Run tests."; "-all", arg_handle ~allow_empty_env:true all, s_ "[options*] Run configure, build, doc and test targets."; "-install", arg_handle install, s_ "[options*] Install libraries, data, executables \ and documents."; "-uninstall", arg_handle uninstall, s_ "[options*] Uninstall libraries, data, executables \ and documents."; "-reinstall", arg_handle reinstall, s_ "[options*] Uninstall and install libraries, data, \ executables and documents."; "-clean", arg_handle ~allow_empty_env:true clean, s_ "[options*] Clean files generated by a build."; "-distclean", arg_handle ~allow_empty_env:true distclean, s_ "[options*] Clean files generated by a build and configure."; "-version", arg_handle ~allow_empty_env:true version, s_ " Display version of OASIS used to generate this setup.ml."; "-no-catch-exn", Arg.Clear catch_exn, s_ " Don't catch exception, useful for debugging."; ] @ (BaseContext.args ())) (failwithf1 (f_ "Don't know what to do with '%s'")) (s_ "Setup and run build process current package\n"); (* Build initial environment *) load ~allow_empty:!allow_empty_env_ref (); (** Initialize flags *) List.iter (function | Flag (cs, {flag_description = hlp; flag_default = choices}) -> begin let apply ?short_desc () = var_ignore (var_define ~cli:CLIEnable ?short_desc (OASISUtils.varname_of_string cs.cs_name) (lazy (string_of_bool (var_choose ~name:(Printf.sprintf (f_ "default value of flag %s") cs.cs_name) ~printer:string_of_bool choices)))) in match hlp with | Some hlp -> apply ~short_desc:(fun () -> hlp) () | None -> apply () end | _ -> ()) t.package.sections; BaseStandardVar.init t.package; BaseDynVar.init t.package; !act_ref t (Array.of_list (List.rev !extra_args_ref)) with e when !catch_exn -> error "%s" (string_of_exception e); exit 1 end module BaseDev = struct # 21 "/tmp/buildd/oasis-0.2.0/src/base/BaseDev.ml" open OASISGettext open BaseMessage type t = { oasis_cmd: string; } let update_and_run t = (* Command line to run setup-dev *) let oasis_args = "setup-dev" :: "-run" :: Sys.executable_name :: (Array.to_list Sys.argv) in let exit_on_child_error = function | 0 -> () | 2 -> (* Bad CLI arguments *) error (f_ "The command '%s %s' exit with code 2. It often means that we \ don't use the right command-line arguments, rerun \ 'oasis setup-dev'.") t.oasis_cmd (String.concat " " oasis_args) | 127 -> (* Cannot find OASIS *) error (f_ "Cannot find executable '%s', check where 'oasis' is located \ and rerun 'oasis setup-dev'") t.oasis_cmd | i -> exit i in let () = (* Run OASIS to generate a temporary setup.ml *) BaseExec.run ~f_exit_code:exit_on_child_error t.oasis_cmd oasis_args in () end module CustomPlugin = struct # 21 "/tmp/buildd/oasis-0.2.0/src/plugins/custom/CustomPlugin.ml" (** Generate custom configure/build/doc/test/install system @author *) open BaseEnv open OASISGettext open OASISTypes type t = { cmd_main: command_line conditional; cmd_clean: (command_line option) conditional; cmd_distclean: (command_line option) conditional; } let run = BaseCustom.run let main t _ extra_args = let cmd, args = var_choose ~name:(s_ "main command") t.cmd_main in run cmd args extra_args let clean t pkg extra_args = match var_choose t.cmd_clean with | Some (cmd, args) -> run cmd args extra_args | _ -> () let distclean t pkg extra_args = match var_choose t.cmd_distclean with | Some (cmd, args) -> run cmd args extra_args | _ -> () module Build = struct let main t pkg extra_args = main t pkg extra_args; List.iter (fun sct -> let evs = match sct with | Library (cs, bs, lib) when var_choose bs.bs_build -> begin let evs, _ = BaseBuilt.of_library BaseFilePath.of_unix (cs, bs, lib) in evs end | Executable (cs, bs, exec) when var_choose bs.bs_build -> begin let evs, _, _ = BaseBuilt.of_executable BaseFilePath.of_unix (cs, bs, exec) in evs end | _ -> [] in List.iter (fun (bt, bnm, lst) -> BaseBuilt.register bt bnm lst) evs) pkg.sections let clean t pkg extra_args = clean t pkg extra_args; (* TODO: this seems to be pretty generic (at least wrt to ocamlbuild * considering moving this to BaseSetup? *) List.iter (function | Library (cs, _, _) -> BaseBuilt.unregister BaseBuilt.BLib cs.cs_name | Executable (cs, _, _) -> BaseBuilt.unregister BaseBuilt.BExec cs.cs_name; BaseBuilt.unregister BaseBuilt.BExecLib cs.cs_name | _ -> ()) pkg.sections let distclean t pkg extra_args = distclean t pkg extra_args end module Test = struct let main t pkg (cs, test) extra_args = try main t pkg extra_args; 0.0 with Failure s -> BaseMessage.warning (f_ "Test '%s' fails: %s") cs.cs_name s; 1.0 let clean t pkg (cs, test) extra_args = clean t pkg extra_args let distclean t pkg (cs, test) extra_args = distclean t pkg extra_args end module Doc = struct let main t pkg (cs, _) extra_args = main t pkg extra_args; BaseBuilt.register BaseBuilt.BDoc cs.cs_name [] let clean t pkg (cs, _) extra_args = clean t pkg extra_args; BaseBuilt.unregister BaseBuilt.BDoc cs.cs_name let distclean t pkg (cs, _) extra_args = distclean t pkg extra_args end end open OASISTypes;; let setup_t = { BaseSetup.configure = CustomPlugin.main { CustomPlugin.cmd_main = [(OASISExpr.EBool true, ("./configure", []))]; cmd_clean = [(OASISExpr.EBool true, None)]; cmd_distclean = [(OASISExpr.EBool true, None)]; }; build = CustomPlugin.Build.main { CustomPlugin.cmd_main = [(OASISExpr.EBool true, ("make", []))]; cmd_clean = [(OASISExpr.EBool true, Some (("make", ["clean"])))]; cmd_distclean = [(OASISExpr.EBool true, Some (("make", ["distclean"])))]; }; test = []; doc = []; install = CustomPlugin.main { CustomPlugin.cmd_main = [(OASISExpr.EBool true, ("make", ["install"]))]; cmd_clean = [(OASISExpr.EBool true, None)]; cmd_distclean = [(OASISExpr.EBool true, None)]; }; uninstall = CustomPlugin.main { CustomPlugin.cmd_main = [(OASISExpr.EBool true, ("make", ["uninstall"]))]; cmd_clean = [(OASISExpr.EBool true, None)]; cmd_distclean = [(OASISExpr.EBool true, None)]; }; clean = [ CustomPlugin.clean { CustomPlugin.cmd_main = [(OASISExpr.EBool true, ("./configure", []))]; cmd_clean = [(OASISExpr.EBool true, None)]; cmd_distclean = [(OASISExpr.EBool true, None)]; }; CustomPlugin.Build.clean { CustomPlugin.cmd_main = [(OASISExpr.EBool true, ("make", []))]; cmd_clean = [(OASISExpr.EBool true, Some (("make", ["clean"])))]; cmd_distclean = [(OASISExpr.EBool true, Some (("make", ["distclean"])))]; }; CustomPlugin.clean { CustomPlugin.cmd_main = [(OASISExpr.EBool true, ("make", ["install"]))]; cmd_clean = [(OASISExpr.EBool true, None)]; cmd_distclean = [(OASISExpr.EBool true, None)]; }; CustomPlugin.clean { CustomPlugin.cmd_main = [(OASISExpr.EBool true, ("make", ["uninstall"]))]; cmd_clean = [(OASISExpr.EBool true, None)]; cmd_distclean = [(OASISExpr.EBool true, None)]; } ]; clean_test = []; clean_doc = []; distclean = [ CustomPlugin.distclean { CustomPlugin.cmd_main = [(OASISExpr.EBool true, ("./configure", []))]; cmd_clean = [(OASISExpr.EBool true, None)]; cmd_distclean = [(OASISExpr.EBool true, None)]; }; CustomPlugin.Build.distclean { CustomPlugin.cmd_main = [(OASISExpr.EBool true, ("make", []))]; cmd_clean = [(OASISExpr.EBool true, Some (("make", ["clean"])))]; cmd_distclean = [(OASISExpr.EBool true, Some (("make", ["distclean"])))]; }; CustomPlugin.distclean { CustomPlugin.cmd_main = [(OASISExpr.EBool true, ("make", ["install"]))]; cmd_clean = [(OASISExpr.EBool true, None)]; cmd_distclean = [(OASISExpr.EBool true, None)]; }; CustomPlugin.distclean { CustomPlugin.cmd_main = [(OASISExpr.EBool true, ("make", ["uninstall"]))]; cmd_clean = [(OASISExpr.EBool true, None)]; cmd_distclean = [(OASISExpr.EBool true, None)]; } ]; distclean_test = []; distclean_doc = []; package = { oasis_version = "0.2"; ocaml_version = None; findlib_version = None; name = "wyrd"; version = "1.4.6"; license = OASISLicense.DEP5License { OASISLicense.license = "GPL"; exceptions = []; version = OASISLicense.Version "2.0"; }; license_file = Some "COPYING"; copyrights = []; maintainers = []; authors = ["Paul Pelzl "]; homepage = Some "http://pessimization.com/software/wyrd"; synopsis = "curses front-end for 'remind' calendar application"; description = None; categories = []; conf_type = (`Configure, "custom", Some "0.2"); conf_custom = { pre_command = [(OASISExpr.EBool true, None)]; post_command = [(OASISExpr.EBool true, Some (("touch", ["setup.data"])))]; }; build_type = (`Build, "custom", Some "0.2"); build_custom = { pre_command = [(OASISExpr.EBool true, None)]; post_command = [(OASISExpr.EBool true, None)]; }; install_type = (`Install, "custom", Some "0.2"); install_custom = { pre_command = [(OASISExpr.EBool true, None)]; post_command = [(OASISExpr.EBool true, None)]; }; uninstall_custom = { pre_command = [(OASISExpr.EBool true, None)]; post_command = [(OASISExpr.EBool true, None)]; }; clean_custom = { pre_command = [(OASISExpr.EBool true, None)]; post_command = [(OASISExpr.EBool true, None)]; }; distclean_custom = { pre_command = [(OASISExpr.EBool true, None)]; post_command = [(OASISExpr.EBool true, None)]; }; files_ab = []; sections = [ Executable ({ cs_name = "wyrd"; cs_data = PropList.Data.create (); cs_plugin_data = []; }, { bs_build = [(OASISExpr.EBool true, true)]; bs_install = [(OASISExpr.EBool true, true)]; bs_path = "."; bs_compiled_object = Byte; bs_build_depends = []; bs_build_tools = []; bs_c_sources = []; bs_data_files = []; bs_ccopt = [(OASISExpr.EBool true, [])]; bs_cclib = [(OASISExpr.EBool true, [])]; bs_dlllib = [(OASISExpr.EBool true, [])]; bs_dllpath = [(OASISExpr.EBool true, [])]; bs_byteopt = [(OASISExpr.EBool true, [])]; bs_nativeopt = [(OASISExpr.EBool true, [])]; }, {exec_custom = false; exec_main_is = "main.ml"; }) ]; plugins = []; schema_data = PropList.Data.create (); plugin_data = []; }; version = "0.2.0"; };; let setup () = BaseSetup.setup setup_t;; (* OASIS_STOP *) let () = setup ();; wyrd-1.4.6/locale.mli0000644000175000017500000000240012103356067013134 0ustar paulpaul(* Wyrd -- a curses-based front-end for Remind * Copyright (C) 2005, 2006, 2007, 2008, 2010, 2011-2013 Paul Pelzl * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, Version 2, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Bug reports can be entered at http://bugs.launchpad.net/wyrd . * For anything else, feel free to contact Paul Pelzl at . *) (* OCaml binding for setlocale(), required to kick ncurses into * properly rendering non-ASCII chars. *) type t = LC_ALL | LC_COLLATE | LC_CTYPE | LC_MONETARY | LC_NUMERIC | LC_TIME | LC_MESSAGES | LC_UNDEFINED of int external setlocale_int : int -> string -> string = "ml_setlocale" val setlocale : t -> string -> string wyrd-1.4.6/COPYING0000644000175000017500000004312712103356067012240 0ustar paulpaul GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. wyrd-1.4.6/configure.ac0000644000175000017500000001422512103356067013470 0ustar paulpaul# # autoconf input for Objective Caml programs # Copyright (C) 2001 Jean-Christophe Filliātre # from a first script by Georges Mariano # # modified 10/26/03 by Paul Pelzl, for inclusion with Orpie # (added ocaml-gsl detection, removed unnecessary checks) # modified 03/28/05 by Paul Pelzl, for inclusion with Wyrd # (removed unnecessary gsl detection) # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License version 2, as published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Library General Public License version 2 for more details # (enclosed in the file LGPL). # the script generated by autoconf from this input will set the following # variables: # OCAMLC "ocamlc" if present in the path, or a failure # or "ocamlc.opt" if present with same version number as ocamlc # OCAMLOPT "ocamlopt" (or "ocamlopt.opt" if present), or "no" # OCAMLBEST either "byte" if no native compiler was found, # or "opt" otherwise # OCAMLDEP "ocamldep" # OCAMLLIB the path to the ocaml standard library # OCAMLVERSION the ocaml version number # OCAMLWIN32 "yes"/"no" depending on Sys.os_type = "Win32" # EXE ".exe" if OCAMLWIN32=yes, "" otherwise # check for one particular file of the sources # ADAPT THE FOLLOWING LINE TO YOUR SOURCES! AC_INIT(install.ml.in) # optional arguments AC_ARG_ENABLE(utf8, [ --enable-utf8 enable UTF-8 output (requires ncurses wide char support)], [try_utf8=$enable_utf8], [try_utf8=no]) # Check for Ocaml compilers # we first look for ocamlc in the path; if not present, we fail AC_CHECK_PROG(OCAMLC,ocamlc,ocamlc,no) if test "$OCAMLC" = no ; then AC_MSG_ERROR(Cannot find ocamlc.) fi # we extract Ocaml version number and library path OCAMLVERSION=`$OCAMLC -v | sed -n -e 's|.*version *\(.*\)$|\1|p' ` echo "ocaml version is $OCAMLVERSION" OCAMLLIB=`$OCAMLC -v | tail -n 1 | cut -f 4 -d " "` echo "ocaml library path is $OCAMLLIB" # check for sufficient OCAMLVERSION OCAMLMAJORVERSION=`echo $OCAMLVERSION | cut -d '.' -f 1` OCAMLMINORVERSION=`echo $OCAMLVERSION | cut -d '.' -f 2` if test $OCAMLMAJORVERSION -lt 3 ; then AC_MSG_ERROR(Wyrd requires OCaml version 3.08 or greater.) elif test $OCAMLMAJORVERSION -eq 3; then if test $OCAMLMINORVERSION -lt 8 ; then AC_MSG_ERROR(Wyrd requires OCaml version 3.08 or greater.) fi fi # then we look for ocamlopt; if not present, we issue a warning # if the version is not the same, we also discard it # we set OCAMLBEST to "opt" or "byte", whether ocamlopt is available or not AC_CHECK_PROG(OCAMLOPT,ocamlopt,ocamlopt,no) OCAMLBEST=byte if test "$OCAMLOPT" = no ; then AC_MSG_WARN(Cannot find ocamlopt; bytecode compilation only.) else AC_MSG_CHECKING(ocamlopt version) TMPVERSION=`$OCAMLOPT -v | sed -n -e 's|.*version *\(.*\)$|\1|p' ` if test "$TMPVERSION" != "$OCAMLVERSION" ; then AC_MSG_RESULT(differs from ocamlc; ocamlopt discarded.) OCAMLOPT=no else AC_MSG_RESULT(ok) OCAMLBEST=opt fi fi # checking for ocamlc.opt AC_CHECK_PROG(OCAMLCDOTOPT,ocamlc.opt,ocamlc.opt,no) if test "$OCAMLCDOTOPT" != no ; then AC_MSG_CHECKING(ocamlc.opt version) TMPVERSION=`$OCAMLCDOTOPT -v | sed -n -e 's|.*version *\(.*\)$|\1|p' ` if test "$TMPVERSION" != "$OCAMLVERSION" ; then AC_MSG_RESULT(differs from ocamlc; ocamlc.opt discarded.) else AC_MSG_RESULT(ok) OCAMLC=$OCAMLCDOTOPT fi fi # checking for ocamlopt.opt if test "$OCAMLOPT" != no ; then AC_CHECK_PROG(OCAMLOPTDOTOPT,ocamlopt.opt,ocamlopt.opt,no) if test "$OCAMLOPTDOTOPT" != no ; then AC_MSG_CHECKING(ocamlc.opt version) TMPVER=`$OCAMLOPTDOTOPT -v | sed -n -e 's|.*version *\(.*\)$|\1|p' ` if test "$TMPVER" != "$OCAMLVERSION" ; then AC_MSG_RESULT(differs from ocamlc; ocamlopt.opt discarded.) else AC_MSG_RESULT(ok) OCAMLOPT=$OCAMLOPTDOTOPT fi fi fi # ocamldep should also be present in the path AC_CHECK_PROG(OCAMLDEP,ocamldep,ocamldep,no) if test "$OCAMLDEP" = no ; then AC_MSG_ERROR(Cannot find ocamldep.) fi AC_CHECK_PROG(OCAMLLEX,ocamllex,ocamllex,no) if test "$OCAMLLEX" = no ; then AC_MSG_ERROR(Cannot find ocamllex.) else AC_CHECK_PROG(OCAMLLEXDOTOPT,ocamllex.opt,ocamllex.opt,no) if test "$OCAMLLEXDOTOPT" != no ; then OCAMLLEX=$OCAMLLEXDOTOPT fi fi AC_CHECK_PROG(OCAMLYACC,ocamlyacc,ocamlyacc,no) if test "$OCAMLYACC" = no ; then AC_MSG_ERROR(Cannot find ocamlyacc.) fi # platform AC_MSG_CHECKING(platform) if echo "let _ = Sys.os_type" | ocaml | grep -q Win32; then AC_MSG_RESULT(Win32) OCAMLWIN32=yes EXE=.exe else AC_MSG_RESULT(not Win32) OCAMLWIN32=no EXE= fi # find a C compiler AC_PROG_CC() # check Remind version AC_PATH_PROG(REMINDPATH, remind, not found) if test x"$REMINDPATH" != x"not found"; then AC_MSG_CHECKING(remind version) REMINDVERSION=`strings $REMINDPATH | grep 03\.0` AC_MSG_RESULT($REMINDVERSION) REMMAJORVERSION=`echo $REMINDVERSION | cut -d '.' -f 1` REMMINORVERSION=`echo $REMINDVERSION | cut -d '.' -f 2` REMFIXVERSION=`echo $REMINDVERSION | cut -d '.' -f 3` if test $REMMAJORVERSION -lt 3 ; then AC_MSG_WARN(Wyrd requires Remind version 03.01.00 or greater.) else if test $REMMINORVERSION -lt 1 ; then AC_MSG_WARN(Wyrd requires Remind version 03.01.00 or greater.) fi fi else AC_MSG_WARN(Wyrd requires Remind version 03.00.24 or greater.) fi # recursively configure curses if test x"$try_utf8" = x"yes"; then ac_configure_args="$ac_configure_args --enable-widec" fi AC_CONFIG_SUBDIRS([curses]) AC_PROG_INSTALL() # substitutions to perform AC_SUBST(OCAMLC) AC_SUBST(OCAMLOPT) AC_SUBST(OCAMLDEP) AC_SUBST(OCAMLLEX) AC_SUBST(OCAMLYACC) AC_SUBST(OCAMLBEST) AC_SUBST(OCAMLVERSION) AC_SUBST(OCAMLLIB) AC_SUBST(OCAMLWIN32) AC_SUBST(EXE) AC_SUBST(DEFS) AC_SUBST(CC) AC_SUBST(CFLAGS) AC_SUBST(CPPFLAGS) AC_SUBST(LDFLAGS) AC_SUBST(INSTALL) # Finally create the Makefile from Makefile.in AC_OUTPUT(Makefile install.ml) chmod a-w Makefile wyrd-1.4.6/prep-devtree.sh0000755000175000017500000000052112103356067014135 0ustar paulpaul#!/bin/bash set -e CURSES_BRANCH=lp:ubuntu/ocaml-curses CURSES_REVISION=8 echo "Getting curses lib ..." bzr branch -r $CURSES_REVISION $CURSES_BRANCH curses pushd curses echo "Generating curses/configure ..." autoheader && autoconf && rm -rf autom4te.cache popd echo "Generating ./configure ..." autoconf && rm -rf autom4te.cache wyrd-1.4.6/locale.ml0000644000175000017500000000322412103356067012770 0ustar paulpaul(* Wyrd -- a curses-based front-end for Remind * Copyright (C) 2005, 2006, 2007, 2008, 2010, 2011-2013 Paul Pelzl * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, Version 2, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Bug reports can be entered at http://bugs.launchpad.net/wyrd . * For anything else, feel free to contact Paul Pelzl at . *) (* OCaml binding for setlocale(), required to kick ncurses into * properly rendering non-ASCII chars. *) type t = LC_ALL | LC_COLLATE | LC_CTYPE | LC_MONETARY | LC_NUMERIC | LC_TIME | LC_MESSAGES | LC_UNDEFINED of int (* Binds to C library setlocale() *) external setlocale_int : int -> string -> string = "ml_setlocale" (* Provide a more OCamlish interface *) let setlocale (category : t) (param : string) = let int_category = match category with | LC_ALL -> 0 | LC_COLLATE -> 1 | LC_CTYPE -> 2 | LC_MONETARY -> 3 | LC_NUMERIC -> 4 | LC_TIME -> 5 | LC_MESSAGES -> 6 | LC_UNDEFINED i -> i in setlocale_int int_category param wyrd-1.4.6/wyrd.spec0000644000175000017500000000236712103356067013047 0ustar paulpaul############ wyrd.spec ############ # This is for debug-flavor. Do not remove. Package is stripped conditionally. #%#define __os_install_post %{nil} # %#define __spec_install_post /usr/lib/rpm/brp-compress %define name wyrd %define version 1.4.1 %define sfx tar.gz %define release 1 %define descr term based calendar frontend for remind Summary: %{descr} Name: %{name} Version: %{version} Release: %{release} Source0: %{name}-%{version}.%{sfx} Copyright: GPL Group: System Environment/Libs BuildRoot: %{_tmppath}/%{name}-%{version}-buildroot #Prefix: %#{_prefix} #URL: %description %{descr} %prep case "${RPM_COMMAND:-all}" in all) %setup -q ;; esac %build case "${RPM_COMMAND:-all}" in all|config) #export CFLAGS="$RPM_OPT_FLAGS -O1 -g" #./configure --prefix=%{prefix} %configure ;; esac case "${RPM_COMMAND:-all}" in all|config|build) make ;; esac %install case "${RPM_COMMAND:-all}" in all|config|build|install) mkdir -p $RPM_BUILD_ROOT/etc make DESTDIR=$RPM_BUILD_ROOT install ;;esac %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) %doc COPYING README TODO %{_prefix}/* /etc/* %changelog * Fri Dec 26 2003 Richard Zidlicky - created skel.spec # arch-tag: DO_NOT_CHANGE_0dfb61c0-79d1-4f5a-a711-b24213b5dc62 wyrd-1.4.6/install-sh0000755000175000017500000003253712103356067013214 0ustar paulpaul#!/bin/sh # install - install a program, script, or datafile scriptversion=2009-04-28.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: wyrd-1.4.6/utility.ml0000644000175000017500000002762112103356067013243 0ustar paulpaul(* Wyrd -- a curses-based front-end for Remind * Copyright (C) 2005, 2006, 2007, 2008, 2010, 2011-2013 Paul Pelzl * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, Version 2, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Bug reports can be entered at http://bugs.launchpad.net/wyrd . * For anything else, feel free to contact Paul Pelzl at . *) (* utility.ml * * miscellaneous helper functions that don't really fit elsewhere *) exception String_of_tm_mon_failure of string exception String_of_tm_wday_failure of string exception Unicode_length_failure of string (* append a file to a directory, with the proper number * of slashes *) let join_path dirname filename = let dir_last = dirname.[String.length dirname - 1] and file_first = filename.[0] in if dir_last = '/' && file_first = '/' then dirname ^ (Str.string_after filename 1) else if dir_last <> '/' && file_first <> '/' then dirname ^ "/" ^ filename else dirname ^ filename (* Perform shell expansion of environment variables. *) let shell_expand text = let split_regex = Str.regexp "=" in (* Get a list of all environment variable mappings *) let add_mapping env_mapping mapping_list = match Str.split split_regex env_mapping with | key :: value :: [] -> (key, value) :: mapping_list | _ -> mapping_list in let env_mappings = Array.fold_right add_mapping (Unix.environment ()) [] in let rec apply_mappings mapping_list s = match mapping_list with | [] -> s | (var, expansion) :: tail -> let var_regex = Str.regexp_string ("$" ^ var) in apply_mappings tail (Str.global_replace var_regex expansion s) in apply_mappings env_mappings text (* If the filename starts with "~", substitute $HOME. Then do shell * expansion on the resulting string. *) let expand_file filename = let tilde_expansion = if String.length filename >= 2 && Str.string_before filename 2 = "~/" then "$HOME" ^ Str.string_after filename 1 else filename in shell_expand tilde_expansion (* Do whatever is necessary to open up a file for writing. If it already exists, * open it as-is. If it does not exist, make sure that all prefix directories * do exist, then open a new file. *) let open_or_create_out_gen is_binary filename = let exp_file = expand_file filename in (* Test whether the file exists *) if Sys.file_exists exp_file then if is_binary then open_out_bin exp_file else open_out exp_file else (* Check whether all directories exist *) let dir_path = Filename.dirname exp_file in let dir_list = Str.split (Str.regexp "/+") dir_path in (* if necessary, add the first "/" to the first directory *) let slash_dir_list = if not (Filename.is_relative dir_path) then ("/" ^ (List.hd dir_list)) :: (List.tl dir_list) else dir_list in let rec make_directories d_list = match d_list with | [] -> () | d :: tail -> begin try Sys.chdir d with Sys_error err_msg -> begin let _ = Sys.command ("mkdir " ^ d) in Sys.chdir d end end; make_directories tail in make_directories slash_dir_list; if is_binary then open_out_bin (Filename.basename exp_file) else open_out (Filename.basename exp_file) let open_or_create_out_bin filename = open_or_create_out_gen true filename let open_or_create_out_ascii filename = open_or_create_out_gen false filename (* open a filename, with tilde/$HOME expansion *) let expand_open_in_gen is_binary filename = (* If the filename starts with "~", substitute $HOME *) if is_binary then open_in_bin (expand_file filename) else open_in (expand_file filename) let expand_open_in_bin filename = expand_open_in_gen true filename let expand_open_in_ascii filename = expand_open_in_gen false filename let string_of_tm_mon i = match i with | 0 -> "Jan" | 1 -> "Feb" | 2 -> "Mar" | 3 -> "Apr" | 4 -> "May" | 5 -> "Jun" | 6 -> "Jul" | 7 -> "Aug" | 8 -> "Sep" | 9 -> "Oct" |10 -> "Nov" |11 -> "Dec" | x -> raise (String_of_tm_mon_failure ("unknown month " ^ (string_of_int x))) let full_string_of_tm_mon i = match i with | 0 -> "January" | 1 -> "February" | 2 -> "March" | 3 -> "April" | 4 -> "May" | 5 -> "June" | 6 -> "July" | 7 -> "August" | 8 -> "September" | 9 -> "October" |10 -> "November" |11 -> "December" | x -> raise (String_of_tm_mon_failure ("unknown month " ^ (string_of_int x))) let short_string_of_tm_wday i = match i with | 0 -> "Su" | 1 -> "Mo" | 2 -> "Tu" | 3 -> "We" | 4 -> "Th" | 5 -> "Fr" | 6 -> "Sa" | x -> raise (String_of_tm_wday_failure ("unknown weekday " ^ (string_of_int x))) let string_of_tm_wday i = match i with | 0 -> "Sun" | 1 -> "Mon" | 2 -> "Tue" | 3 -> "Wed" | 4 -> "Thu" | 5 -> "Fri" | 6 -> "Sat" | x -> raise (String_of_tm_wday_failure ("unknown weekday " ^ (string_of_int x))) let full_string_of_tm_wday i = match i with | 0 -> "Sunday" | 1 -> "Monday" | 2 -> "Tuesday" | 3 -> "Wednesday" | 4 -> "Thursday" | 5 -> "Friday" | 6 -> "Saturday" | x -> raise (String_of_tm_wday_failure ("unknown weekday " ^ (string_of_int x))) (* it's useful to have an empty date record to save some typing *) let empty_tm = { Unix.tm_sec = 0; Unix.tm_min = 0; Unix.tm_hour = 0; Unix.tm_mday = 1; Unix.tm_mon = 0; Unix.tm_year = 1900; Unix.tm_wday = 0; Unix.tm_yday = 0; Unix.tm_isdst = false } (* strip whitespace *) let lstrip s = (* Any amount of whitespace, followed by a non-whitespace char, * followed by any number of characters. If match fails, * then the string must be entirely whitespace. *) let re = Str.regexp "[ \t]*\\([^ \t].*\\)" in if Str.string_match re s 0 then Str.replace_first re "\\1" s else "" let rstrip s = (* Any number of characters, followed by a non-whitespace char, * followed by any number of whitespace chars. If match * fails, then the string must be entirely whitespace. *) let re = Str.regexp "\\(.*[^ \t]\\).*" in if Str.string_match re s 0 then Str.replace_first re "\\1" s else "" let strip s = lstrip (rstrip s) (* Use the shell to open a process, read all output from both stdout and stderr, * and close the pipes to the process again. Returns a list of lines from * stdout, and a list of lines from stderr. * * Uses select(), so it should be robust to I/O buffering synchronization * issues. *) let read_all_shell_command_output shell_command = let (in_read, in_write) = Unix.pipe () and (out_read, out_write) = Unix.pipe () and (err_read, err_write) = Unix.pipe () in let rec read_output out_str err_str out_done err_done = if out_done && err_done then (out_str, err_str) else begin let out_lst = if out_done then [] else [out_read] and err_lst = if err_done then [] else [err_read] in (* find some output to read *) let (read_list, _, _) = Unix.select (out_lst @ err_lst) [] [] (10.0) in if List.length read_list > 0 then begin let chan = List.hd read_list in let buf = String.make 256 ' ' in let chars_read = Unix.read chan buf 0 256 in if chars_read = 0 then (* no chars read indicates EOF *) if chan = out_read then read_output out_str err_str true err_done else read_output out_str err_str out_done true else (* if 1-256 characters are read, append them to the proper * buffer and continue *) let s = String.sub buf 0 chars_read in if chan = out_read then read_output (out_str ^ s) err_str out_done err_done else read_output out_str (err_str ^ s) out_done err_done end else (out_str, err_str) end in (* launch the shell process *) let pid = Unix.create_process "/bin/sh" [| "/bin/sh"; "-c"; shell_command |] in_read out_write err_write in (* these belong to remind, so close them off *) Unix.close in_read; Unix.close out_write; Unix.close err_write; let (out_str, err_str) = read_output "" "" false false in (* clean up remind zombie *) let _ = Unix.waitpid [] pid in (* close off our end of the IPC pipes *) Unix.close in_write; Unix.close out_read; Unix.close err_read; let newline_regex = Str.regexp "\n" in let out_lines = Str.split newline_regex out_str and err_lines = Str.split newline_regex err_str in (out_lines, err_lines) (* Compute the number of bytes required to store a utf-8 character. * Input is the first byte of the character. *) let utf8_width (byte : char) = let c = Char.code byte in if c < 0x80 then 1 else if c < 0xc0 then raise (Unicode_length_failure "illegal byte") else if c < 0xe0 then 2 else if c < 0xf0 then 3 else if c < 0xf8 then 4 else if c < 0xfc then 5 else if c < 0xfe then 6 else raise (Unicode_length_failure "illegal byte") (* Compute the number of UTF-8 characters contained in an ocaml String. *) let utf8_len s = let s_len = String.length s in let rec len_aux byte_pos char_count = if byte_pos >= s_len then char_count else let num_bytes = utf8_width s.[byte_pos] in len_aux (byte_pos + num_bytes) (succ char_count) in if Curses.Curses_config.wide_ncurses then len_aux 0 0 else (* If build process does not detect ncursesw, then fall back * on standard string behavior. *) s_len (* Form the substring of all characters from 's' in positions before 'n', * where 'n' may be measured in characters rather than bytes. Does the right * thing for utf-8 wide characters. *) let utf8_string_before s n = let rec build_substr substr utf8_pos byte_pos = if utf8_pos >= n then substr else let num_new_bytes = utf8_width s.[byte_pos] in let new_bytes = String.make num_new_bytes s.[byte_pos] in for i = 1 to pred num_new_bytes do new_bytes.[i] <- s.[byte_pos + i] done; build_substr (substr ^ new_bytes) (succ utf8_pos) (byte_pos + num_new_bytes) in if Curses.Curses_config.wide_ncurses then build_substr "" 0 0 else (* If we're not using utf-8, fall back on standard string behavior. *) Str.string_before s n (* Form the substring of all characters from 's' in positions 'n' or greater, * where 'n' may be measured in characters rather than bytes. Does the right * thing for utf-8 wide characters. *) let utf8_string_after s n = if Curses.Curses_config.wide_ncurses then begin let starting_byte = ref 0 in for utf8_char = 0 to pred n do starting_byte := !starting_byte + (utf8_width s.[!starting_byte]) done; Str.string_after s !starting_byte end else (* If we're not using utf-8, fall back on standard string behavior. *) Str.string_after s n (* arch-tag: DO_NOT_CHANGE_a87790db-2dd0-496c-9620-ed968f3253fd *)