Ajla 0.1.0
[ajla.git] / programs / acmd / prompt.ajla
blobe97b92f799549c2f826420fc6724df08ff6ff7f0
1 {*
2  * Copyright (C) 2024 Mikulas Patocka
3  *
4  * This file is part of Ajla.
5  *
6  * Ajla is free software: you can redistribute it and/or modify it under the
7  * terms of the GNU General Public License as published by the Free Software
8  * Foundation, either version 3 of the License, or (at your option) any later
9  * version.
10  *
11  * Ajla is distributed in the hope that it will be useful, but WITHOUT ANY
12  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
13  * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along with
16  * Ajla. If not, see <https://www.gnu.org/licenses/>.
17  *}
19 unit prompt;
21 uses common;
23 fn shell_expand_prompt(w : world, ro : acmd_ro, p : bytes, d : bytes) : (world, string);
25 implementation
27 fn date_d(implicit w : world, implicit ro : acmd_ro) : (world, string)
29         var time := get_real_time();
30         var c := time_to_calendar(ro.tz, time);
31         return weekdays[c.wday] + ` ` + months[c.month] + ` ` + locale_to_string(ro.loc, ntos(c.day + 1));
34 fn time_t(implicit w : world, implicit ro : acmd_ro, h24 sec : bool) : (world, string)
36         var time := get_real_time();
37         var c := time_to_calendar(ro.tz, time);
38         var result := ``;
39         if h24 then
40                 result += list_left_pad(locale_to_string(ro.loc, ntos(c.hour)), 2, '0');
41         else
42                 result += list_left_pad(locale_to_string(ro.loc, ntos((c.hour + 11) mod 12 + 1)), 2, '0');
43         result += `:` + list_left_pad(locale_to_string(ro.loc, ntos(c.min)), 2, '0');
44         if sec then [
45                 result += `:` + list_left_pad(locale_to_string(ro.loc, ntos(c.sec)), 2, '0');
46         ]
47         return result;
50 fn shell_expand_prompt(implicit w : world, implicit ro : acmd_ro, p : bytes, d : bytes) : (world, string)
52         var result := ``;
53         var ps := locale_to_string(ro.loc, p);
54         for i := 0 to len(ps) do [
55                 if ps[i] = '\', i < len(ps) - 1 then [
56                         var c := ps[i + 1];
57                         if c = 'a' then [
58                         ] else if c = 'd' then [
59                                 var d := date_d();
60                                 result += d;
61                         ] else if c = 'e' then [
62                         ] else if c = 'h' or c = 'H' then [
63                                 var h := get_host_name();
64                                 if h = "" then [
65                                         var e := treemap_search(ro.env, "HOSTNAME");
66                                         if e is j then
67                                                 h := e.j;
68                                 ]
69                                 if c = 'h' then [
70                                         var l := list_search(h, '.');
71                                         if l >= 0 then
72                                                 h := h[ .. l];
73                                 ]
74                                 result += locale_to_string(ro.loc, h);
75                         ] else if c = 't' then [
76                                 var t := time_t(true, true);
77                                 result += t;
78                         ] else if c = 'T' then [
79                                 var t := time_t(false, true);
80                                 result += t;
81                         ] else if c = '@' then [
82                                 var t := time_t(false, false);
83                                 result += t;
84                         ] else if c = 'A' then [
85                                 var t := time_t(true, false);
86                                 result += t;
87                         ] else if c = 'u' then [
88                                 var e := treemap_search(ro.env, "HOSTNAME");
89                                 if e is j then [
90                                         result += locale_to_string(ro.loc, e.j);
91                                 ]
92                         ] else if c = 'w' or c = 'W' then [
93                                 var w := path_shortcut_home(ro.home, d);
94                                 if c = 'W' then [
95                                         var p := list_search_backwards_fn(w, path_is_separator);
96                                         if p >= 0 then
97                                                 w := w[p + 1 .. ];
98                                 ]
99                                 result += locale_to_string(ro.loc, w);
100                         ] else if c = '$' then [
101                                 var uid_s := treemap_search(ro.env, "UID");
102                                 var uid := ston(uid_s.j);
103                                 if not is_exception uid, uid = 0 then
104                                         result +<= '#';
105                                 else
106                                         result +<= '$';
107                         ] else if c = '\' then [
108                                 result +<= '\';
109                         ] else if c = '[' then [
110                                 while i < len(ps) - 1, not(ps[i] = '\' and ps[i + 1] = ']') do
111                                         i += 1;
112                         ] else if c >= '0', c <= '7' then [
113                                 var oct := c - '0';
114                                 if i + 1 < len(ps), ps[i + 1] >= '0', ps[i + 1] <= '7' then [
115                                         oct := 8 * oct + (ps[i + 1] - '0');
116                                         i += 1;
117                                 ]
118                                 if i + 1 < len(ps), ps[i + 1] >= '0', ps[i + 1] <= '7' then [
119                                         oct := 8 * oct + (ps[i + 1] - '0');
120                                         i += 1;
121                                 ]
122                                 result +<= oct;
123                         ]
124                         i += 1;
125                         continue;
126                 ]
127                 result +<= ps[i];
128         ]
129         return result;