Definition at line 69 of file prompt.c.
70{
71#define MAX_PROMPT_SIZE 256
74 bool esc = false;
75 const char *p;
76 const char *prompt_string = "? ";
77 static size_t last_prompt1_width = 0;
78
79 switch (status)
80 {
83 break;
84
92 break;
93
96 break;
97 }
98
99 destination[0] = '\0';
100
101 for (p = prompt_string;
102 *p && strlen(destination) < sizeof(destination) - 1;
103 p++)
104 {
105 memset(
buf, 0,
sizeof(
buf));
106 if (esc)
107 {
108 switch (*p)
109 {
110
111 case '/':
114 break;
115 case '~':
117 {
118 const char *var;
119
121 ((var = getenv(
"PGDATABASE")) && strcmp(var,
PQdb(
pset.
db)) == 0))
123 else
125 }
126 break;
127
128
129 case 'w':
132 Min(last_prompt1_width,
sizeof(
buf) - 1));
133 break;
134
135
136 case 'M':
137 case 'm':
139 {
141
142
144 {
146 if (*p == 'm')
147 buf[strcspn(
buf,
".")] =
'\0';
148 }
149
150 else
151 {
152 if (!host
154 || *p == 'm')
156 else
158 }
159 }
160 break;
161
162 case '>':
165 break;
166
167 case 'n':
170 break;
171
172 case 'S':
174 {
176
177
179 }
180 break;
181
182 case 's':
183 {
185
186 if (service_name)
188 }
189 break;
190
191 case 'p':
193 {
195
196 if (pid)
198 }
199 break;
200
201 case 'P':
202 {
204
209 else
211 break;
212 }
213
214 case '0':
215 case '1':
216 case '2':
217 case '3':
218 case '4':
219 case '5':
220 case '6':
221 case '7':
223 --p;
224 break;
225 case 'R':
226 switch (status)
227 {
235 else
237 break;
240 break;
243 break;
246 break;
249 break;
252 break;
255 break;
256 default:
258 break;
259 }
260 break;
261
262 case 'x':
265 else
267 {
270 break;
274 break;
277 break;
278 default:
280 break;
281 }
282 break;
283
284 case 'l':
286 break;
287
288 case '?':
289
290 break;
291
292 case '#':
295 else
297 break;
298
299
300 case '`':
301 {
302 int cmdend = strcspn(p + 1, "`");
303 char *file =
pnstrdup(p + 1, cmdend);
305
306 fflush(NULL);
307 fd = popen(file,
"r");
309 {
310 if (fgets(
buf,
sizeof(
buf),
fd) == NULL)
313 }
314
315
317
319 p += cmdend + 1;
320 break;
321 }
322
323
324 case ':':
325 {
326 int nameend = strcspn(p + 1, ":");
329
334 p += nameend + 1;
335 break;
336 }
337
338 case '[':
339 case ']':
340#if defined(USE_READLINE) && defined(RL_PROMPT_START_IGNORE)
341
342
343
344
345
346
347 buf[0] = (*p ==
'[') ? RL_PROMPT_START_IGNORE : RL_PROMPT_END_IGNORE;
349#endif
350 break;
351
352 default:
355 break;
356 }
357 esc = false;
358 }
359 else if (*p == '%')
360 esc = true;
361 else
362 {
365 esc = false;
366 }
367
368 if (!esc)
369 strlcat(destination,
buf,
sizeof(destination));
370 }
371
372
374 {
375 char *p = destination;
376 char *end = p + strlen(p);
377 bool visible = true;
378
379 last_prompt1_width = 0;
380 while (*p)
381 {
382#if defined(USE_READLINE) && defined(RL_PROMPT_START_IGNORE)
383 if (*p == RL_PROMPT_START_IGNORE)
384 {
385 visible = false;
386 ++p;
387 }
388 else if (*p == RL_PROMPT_END_IGNORE)
389 {
390 visible = true;
391 ++p;
392 }
393 else
394#endif
395 {
396 int chlen,
397 chwidth;
398
400 if (p + chlen > end)
401 break;
402
403 if (visible)
404 {
406
407 if (*p == '\n')
408 last_prompt1_width = 0;
409 else if (chwidth > 0)
410 last_prompt1_width += chwidth;
411 }
412
413 p += chlen;
414 }
415 }
416 }
417
418 return destination;
419}
const char * session_username(void)
#define unconstify(underlying_type, expr)
bool conditional_active(ConditionalStack cstack)
char * PQdb(const PGconn *conn)
char * PQport(const PGconn *conn)
PGTransactionStatusType PQtransactionStatus(const PGconn *conn)
char * PQhost(const PGconn *conn)
const char * PQparameterStatus(const PGconn *conn, const char *paramName)
int PQbackendPID(const PGconn *conn)
char * PQuser(const PGconn *conn)
PGpipelineStatus PQpipelineStatus(const PGconn *conn)
int PQmblen(const char *s, int encoding)
int PQdsplen(const char *s, int encoding)
char * pnstrdup(const char *in, Size len)
#define DEFAULT_PGSOCKET_DIR
static bool is_superuser(Archive *fout)
size_t strlcat(char *dst, const char *src, size_t siz)
size_t strlcpy(char *dst, const char *src, size_t siz)
static bool is_unixsock_path(const char *path)
static int fd(const char *x, int i)
int pg_strip_crlf(char *str)
const char * GetVariable(VariableSpace space, const char *name)
References buf, conditional_active(), _psqlSettings::db, DEFAULT_PGSOCKET_DIR, _psqlSettings::encoding, fd(), free, GetVariable(), is_superuser(), is_unixsock_path(), MAX_PROMPT_SIZE, Min, name, pg_strip_crlf(), pnstrdup(), PQ_PIPELINE_ABORTED, PQ_PIPELINE_ON, PQbackendPID(), PQdb(), PQdsplen(), PQhost(), PQmblen(), PQparameterStatus(), PQpipelineStatus(), PQport(), PQTRANS_ACTIVE, PQTRANS_IDLE, PQTRANS_INERROR, PQTRANS_INTRANS, PQtransactionStatus(), PQuser(), _psqlSettings::prompt1, _psqlSettings::prompt2, _psqlSettings::prompt3, PROMPT_COMMENT, PROMPT_CONTINUE, PROMPT_COPY, PROMPT_DOLLARQUOTE, PROMPT_DOUBLEQUOTE, PROMPT_PAREN, PROMPT_READY, PROMPT_SINGLEQUOTE, pset, session_username(), _psqlSettings::singleline, snprintf, _psqlSettings::stmt_lineno, strlcat(), strlcpy(), UINT64_FORMAT, unconstify, val, and _psqlSettings::vars.
Referenced by handleCopyIn(), and MainLoop().