diff options
Diffstat (limited to 'shell')
-rw-r--r-- | shell/Config.in | 2 | ||||
-rw-r--r-- | shell/Makefile | 2 | ||||
-rw-r--r-- | shell/Makefile.in | 2 | ||||
-rw-r--r-- | shell/ash.c | 2 | ||||
-rw-r--r-- | shell/hush.c | 112 | ||||
-rw-r--r-- | shell/lash.c | 6 | ||||
-rw-r--r-- | shell/msh.c | 54 |
7 files changed, 90 insertions, 90 deletions
diff --git a/shell/Config.in b/shell/Config.in index 892b96e78..bcb5e719b 100644 --- a/shell/Config.in +++ b/shell/Config.in @@ -41,7 +41,7 @@ config CONFIG_ASH the most complete and most pedantically correct shell included with busybox. This shell is actually a derivative of the Debian 'dash' shell (by Herbert Xu), which was created by porting the 'ash' shell - (written by Kenneth Almquist) from NetBSD. + (written by Kenneth Almquist) from NetBSD. comment "Ash Shell Options" depends on CONFIG_ASH diff --git a/shell/Makefile b/shell/Makefile index a08219262..8f476c19e 100644 --- a/shell/Makefile +++ b/shell/Makefile @@ -1,6 +1,6 @@ # Makefile for busybox # -# Copyright (C) 1999-2003 by Erik Andersen <andersen@codepoet.org> +# Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org> # # 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 diff --git a/shell/Makefile.in b/shell/Makefile.in index c5be7ba79..7b9f41ed4 100644 --- a/shell/Makefile.in +++ b/shell/Makefile.in @@ -1,6 +1,6 @@ # Makefile for busybox # -# Copyright (C) 1999-2003 by Erik Andersen <andersen@codepoet.org> +# Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org> # # 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 diff --git a/shell/ash.c b/shell/ash.c index 8c2493ece..060860c07 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -7615,7 +7615,7 @@ cmdputs(const char *s) int quoted = 0; static const char *const vstype[16] = { nullstr, "}", "-", "+", "?", "=", - "%", "%%", "#", "##", nullstr + "%", "%%", "#", "##", nullstr }; nextc = makestrspace((strlen(s) + 1) * 8, cmdnextc); diff --git a/shell/hush.c b/shell/hush.c index 84818ffa3..5da975746 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -12,7 +12,7 @@ * written Dec 2000 and Jan 2001 by Larry Doolittle. The * execution engine, the builtins, and much of the underlying * support has been adapted from busybox-0.49pre's lash, which is - * Copyright (C) 1999-2003 by Erik Andersen <andersen@codepoet.org> + * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org> * written by Erik Andersen <andersen@codepoet.org>. That, in turn, * is based in part on ladsh.c, by Michael K. Johnson and Erik W. * Troan, which they placed in the public domain. I don't know @@ -197,7 +197,7 @@ struct redir_struct { redir_type type; /* type of redirection */ int fd; /* file descriptor being redirected */ int dup; /* -1, or file descriptor being duplicated */ - struct redir_struct *next; /* pointer to the next redirect in the list */ + struct redir_struct *next; /* pointer to the next redirect in the list */ glob_t word; /* *word.gl_pathv is the filename */ }; @@ -248,7 +248,7 @@ char **global_argv; unsigned int global_argc; unsigned int last_return_code; extern char **environ; /* This is in <unistd.h>, but protected with __USE_GNU */ - + /* "globals" within this file */ static char *ifs; static char map[256]; @@ -421,7 +421,7 @@ static struct built_in_command bltins[] = { {"continue", "Continue for, while or until loop", builtin_not_written}, {"env", "Print all environment variables", builtin_env}, {"eval", "Construct and run shell command", builtin_eval}, - {"exec", "Exec command, replacing this shell with the exec'd process", + {"exec", "Exec command, replacing this shell with the exec'd process", builtin_exec}, {"exit", "Exit from shell()", builtin_exit}, {"export", "Set environment variable", builtin_export}, @@ -456,10 +456,10 @@ static int builtin_eval(struct child_prog *child) { char *str = NULL; int rcode = EXIT_SUCCESS; - + if (child->argv[1]) { str = make_string(child->argv + 1); - parse_string_outer(str, FLAG_EXIT_FROM_LOOP | + parse_string_outer(str, FLAG_EXIT_FROM_LOOP | FLAG_PARSE_SEMICOLON); free(str); rcode = last_return_code; @@ -873,7 +873,7 @@ static inline void cmdedit_set_initial_prompt(void) PS1 = getenv("PS1"); if(PS1==0) PS1 = "\\w \\$ "; -#endif +#endif } static inline void setup_prompt_string(int promptmode, char **prompt_str) @@ -919,7 +919,7 @@ static void get_user_input(struct in_str *i) i->p = the_command; } -/* This is the magic location that prints prompts +/* This is the magic location that prints prompts * and gets data back from the user */ static int file_get(struct in_str *i) { @@ -1110,14 +1110,14 @@ static void pseudo_exec(struct child_prog *child) } /* Check if the command matches any busybox internal commands - * ("applets") here. + * ("applets") here. * FIXME: This feature is not 100% safe, since * BusyBox is not fully reentrant, so we have no guarantee the things * from the .bss are still zeroed, or that things from .data are still * at their defaults. We could exec ourself from /proc/self/exe, but I * really dislike relying on /proc for things. We could exec ourself * from global_argv[0], but if we are in a chroot, we may not be able - * to find ourself... */ + * to find ourself... */ #ifdef CONFIG_FEATURE_SH_STANDALONE_SHELL { int argc_l; @@ -1196,7 +1196,7 @@ static void insert_bg_job(struct pipe *pi) } } - /* we don't wait for background thejobs to return -- append it + /* we don't wait for background thejobs to return -- append it to the list of backgrounded thejobs and leave it alone */ printf("[%d] %d\n", thejob->jobid, thejob->progs[0].pid); last_bg_pid = thejob->progs[0].pid; @@ -1226,7 +1226,7 @@ static void remove_bg_job(struct pipe *pi) free(pi); } -/* Checks to see if any processes have exited -- if they +/* Checks to see if any processes have exited -- if they have, figure out why and see if a job has completed */ static int checkjobs(struct pipe* fg_pipe) { @@ -1246,7 +1246,7 @@ static int checkjobs(struct pipe* fg_pipe) int i, rcode = 0; for (i=0; i < fg_pipe->num_progs; i++) { if (fg_pipe->progs[i].pid == childpid) { - if (i==fg_pipe->num_progs-1) + if (i==fg_pipe->num_progs-1) rcode=WEXITSTATUS(status); (fg_pipe->num_progs)--; return(rcode); @@ -1289,7 +1289,7 @@ static int checkjobs(struct pipe* fg_pipe) if (pi->stopped_progs == pi->num_progs) { printf("\n"JOB_STATUS_FORMAT, pi->jobid, "Stopped", pi->text); } -#endif +#endif } } @@ -1378,7 +1378,7 @@ static int run_pipe_real(struct pipe *pi) /* Ok, this case is tricky. We have to decide if this is a * local variable, or an already exported variable. If it is * already exported, we have to export the new value. If it is - * not exported, we need only set this as a local variable. + * not exported, we need only set this as a local variable. * This junk is all to decide whether or not to export this * variable. */ int export_me=0; @@ -1408,7 +1408,7 @@ static int run_pipe_real(struct pipe *pi) } if (child->sp) { char * str = NULL; - + str = make_string((child->argv + i)); parse_string_outer(str, FLAG_EXIT_FROM_LOOP | FLAG_REPARSING); free(str); @@ -1454,7 +1454,7 @@ static int run_pipe_real(struct pipe *pi) #if !defined(__UCLIBC__) || defined(__UCLIBC_HAS_MMU__) if (!(child->pid = fork())) #else - if (!(child->pid = vfork())) + if (!(child->pid = vfork())) #endif { /* Set the handling for job control signals back to the default. */ @@ -1465,7 +1465,7 @@ static int run_pipe_real(struct pipe *pi) signal(SIGTTIN, SIG_DFL); signal(SIGTTOU, SIG_DFL); signal(SIGCHLD, SIG_DFL); - + close_all(); if (nextin != 0) { @@ -1497,7 +1497,7 @@ static int run_pipe_real(struct pipe *pi) pseudo_exec(child); } - + /* put our child in the process group whose leader is the first process in this pipe */ @@ -1513,7 +1513,7 @@ static int run_pipe_real(struct pipe *pi) if (nextout != 1) close(nextout); - /* If there isn't another process, nextin is garbage + /* If there isn't another process, nextin is garbage but it doesn't matter */ nextin = pipefds[0]; } @@ -1539,12 +1539,12 @@ static int run_list_real(struct pipe *pi) (rpipe->next == NULL)) { syntax(); return 1; - } - if ((rpipe->r_mode == RES_IN && - (rpipe->next->r_mode == RES_IN && + } + if ((rpipe->r_mode == RES_IN && + (rpipe->next->r_mode == RES_IN && rpipe->next->progs->argv != NULL))|| (rpipe->r_mode == RES_FOR && - rpipe->next->r_mode != RES_IN)) { + rpipe->next->r_mode != RES_IN)) { syntax(); return 1; } @@ -1572,7 +1572,7 @@ static int run_list_real(struct pipe *pi) if (rmode == RES_ELIF && !if_code) continue; if (rmode == RES_FOR && pi->num_progs) { if (!list) { - /* if no variable values after "in" we skip "for" */ + /* if no variable values after "in" we skip "for" */ if (!pi->next->progs->argv) continue; /* create list of variable values */ list = make_list_in(pi->next->progs->argv, @@ -1581,7 +1581,7 @@ static int run_list_real(struct pipe *pi) save_name = pi->progs->argv[0]; pi->progs->argv[0] = NULL; flag_rep = 1; - } + } if (!(*list)) { free(pi->progs->argv[0]); free(save_list); @@ -1591,26 +1591,26 @@ static int run_list_real(struct pipe *pi) pi->progs->glob_result.gl_pathv[0] = pi->progs->argv[0]; continue; - } else { + } else { /* insert new value from list for variable */ - if (pi->progs->argv[0]) + if (pi->progs->argv[0]) free(pi->progs->argv[0]); pi->progs->argv[0] = *list++; pi->progs->glob_result.gl_pathv[0] = pi->progs->argv[0]; } - } + } if (rmode == RES_IN) continue; if (rmode == RES_DO) { if (!flag_rep) continue; - } + } if ((rmode == RES_DONE)) { if (flag_rep) { flag_restore = 1; } else { rpipe = NULL; } - } + } if (pi->num_progs == 0) continue; save_num_progs = pi->num_progs; /* save number of programs */ rcode = run_pipe_real(pi); @@ -1642,9 +1642,9 @@ static int run_list_real(struct pipe *pi) pi->num_progs = save_num_progs; /* restore number of programs */ if ( rmode == RES_IF || rmode == RES_ELIF ) next_if_code=rcode; /* can be overwritten a number of times */ - if (rmode == RES_WHILE) + if (rmode == RES_WHILE) flag_rep = !last_return_code; - if (rmode == RES_UNTIL) + if (rmode == RES_UNTIL) flag_rep = last_return_code; if ( (rcode==EXIT_SUCCESS && pi->followup==PIPE_OR) || (rcode!=EXIT_SUCCESS && pi->followup==PIPE_AND) ) @@ -1723,7 +1723,7 @@ static int free_pipe_list(struct pipe *head, int indent) pi->next=NULL; free(pi); } - return rcode; + return rcode; } /* Select which version we will use */ @@ -1732,7 +1732,7 @@ static int run_list(struct pipe *pi) int rcode=0; if (fake_mode==0) { rcode = run_list_real(pi); - } + } /* free_pipe_list has the side effect of clearing memory * In the long run that function can be merged with run_list_real, * but doing that now would hobble the debugging effort. */ @@ -1862,7 +1862,7 @@ static int set_local_var(const char *s, int flg_export) /* Assume when we enter this function that we are already in * NAME=VALUE format. So the first order of business is to - * split 's' on the '=' into 'name' and 'value' */ + * split 's' on the '=' into 'name' and 'value' */ value = strchr(name, '='); if (value==0 && ++value==0) { free(name); @@ -1991,7 +1991,7 @@ static int setup_redirect(struct p_context *ctx, int fd, redir_type style, debug_printf("Redirect type %d%s\n", redir->fd, redir_table[style].descrip); - /* Check for a '2>&1' type redirect */ + /* Check for a '2>&1' type redirect */ redir->dup = redirect_dup_num(input); if (redir->dup == -2) return 1; /* syntax error */ if (redir->dup != -1) { @@ -2377,9 +2377,9 @@ static int parse_group(o_string *dest, struct p_context *ctx, static char *lookup_param(char *src) { char *p=NULL; - if (src) { + if (src) { p = getenv(src); - if (!p) + if (!p) p = get_local_var(src); } return p; @@ -2499,7 +2499,7 @@ int parse_stream(o_string *dest, struct p_context *ctx, if (m==2) { /* unquoted IFS */ if (done_word(dest, ctx)) { return 1; - } + } /* If we aren't performing a substitution, treat a newline as a * command separator. */ if (end_trigger != '\0' && ch=='\n') @@ -2624,7 +2624,7 @@ int parse_stream(o_string *dest, struct p_context *ctx, } /* complain if quote? No, maybe we just finished a command substitution * that was quoted. Example: - * $ echo "`cat foo` plus more" + * $ echo "`cat foo` plus more" * and we just got the EOF generated by the subshell that ran "cat foo" * The only real complaint is if we got an EOF when end_trigger != '\0', * that is, we were really supposed to get end_trigger, and never got @@ -2684,7 +2684,7 @@ int parse_stream_outer(struct in_str *inp, int flag) if (ctx.old_flag != 0) { free(ctx.stack); b_reset(&temp); - } + } temp.nonnull = 0; temp.quote = 0; inp->p = NULL; @@ -2748,9 +2748,9 @@ int hush_main(int argc, char **argv) /* XXX what should these be while sourcing /etc/profile? */ global_argc = argc; global_argv = argv; - + /* (re?) initialize globals. Sometimes hush_main() ends up calling - * hush_main(), therefore we cannot rely on the BSS to zero out this + * hush_main(), therefore we cannot rely on the BSS to zero out this * stuff. Reset these to 0 every time. */ ifs = NULL; /* map[] is taken care of with call to update_ifs_map() */ @@ -2770,7 +2770,7 @@ int hush_main(int argc, char **argv) #endif PS2 = "> "; - /* initialize our shell local variables with the values + /* initialize our shell local variables with the values * currently living in the environment */ if (e) { for (; *e; e++) @@ -2790,7 +2790,7 @@ int hush_main(int argc, char **argv) } } input=stdin; - + while ((opt = getopt(argc, argv, "c:xif")) > 0) { switch (opt) { case 'c': @@ -2832,13 +2832,13 @@ int hush_main(int argc, char **argv) debug_printf("\ninteractive=%d\n", interactive); if (interactive) { /* Looks like they want an interactive shell */ -#ifndef CONFIG_FEATURE_SH_EXTRA_QUIET +#ifndef CONFIG_FEATURE_SH_EXTRA_QUIET printf( "\n\n" BB_BANNER " hush - the humble shell v0.01 (testing)\n"); printf( "Enter 'help' for a list of built-in commands.\n\n"); #endif setup_job_control(); } - + if (argv[optind]==NULL) { opt=parse_file_outer(stdin); goto final_return; @@ -2877,7 +2877,7 @@ static char *insert_var_value(char *inp) int len; int done = 0; char *p, *p1, *res_str = NULL; - + while ((p = strchr(inp, SPECIAL_VAR_SYMBOL))) { if (p != inp) { len = p - inp; @@ -2893,7 +2893,7 @@ static char *insert_var_value(char *inp) res_str = xrealloc(res_str, (1 + len)); strcpy((res_str + res_str_len), p1); res_str_len = len; - } + } *p = SPECIAL_VAR_SYMBOL; inp = ++p; done = 1; @@ -2915,8 +2915,8 @@ static char **make_list_in(char **inp, char *name) int n = 0; char **list; char *p1, *p2, *p3; - - /* create list of variable values */ + + /* create list of variable values */ list = xmalloc(sizeof(*list)); for (i = 0; inp[i]; i++) { p3 = insert_var_value(inp[i]); @@ -2928,13 +2928,13 @@ static char **make_list_in(char **inp, char *name) } if ((p2 = strchr(p1, ' '))) { len = p2 - p1; - } else { + } else { len = strlen(p1); p2 = p1 + len; } - /* we use n + 2 in realloc for list,because we add + /* we use n + 2 in realloc for list,because we add * new element and then we will add NULL element */ - list = xrealloc(list, sizeof(*list) * (n + 2)); + list = xrealloc(list, sizeof(*list) * (n + 2)); list[n] = xmalloc(2 + name_len + len); strcpy(list[n], name); strcat(list[n], "="); @@ -2946,7 +2946,7 @@ static char **make_list_in(char **inp, char *name) } list[n] = NULL; return list; -} +} /* Make new string for parser */ static char * make_string(char ** inp) diff --git a/shell/lash.c b/shell/lash.c index e4b1b129f..d2d4298fb 100644 --- a/shell/lash.c +++ b/shell/lash.c @@ -2,7 +2,7 @@ /* * lash -- the BusyBox Lame-Ass SHell * - * Copyright (C) 1999-2003 by Erik Andersen <andersen@codepoet.org> + * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org> * * Based in part on ladsh.c by Michael K. Johnson and Erik W. Troan, which is * under the following liberal license: "We have placed this source code in the @@ -927,7 +927,7 @@ static int expand_arguments(char *command) } if (var) { - /* a single character construction was found, and + /* a single character construction was found, and * already handled in the case statement */ src=dst+2; } else { @@ -1093,7 +1093,7 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg) prog->redirects[i].fd = -1; if (buf != prog->argv[argc_l]) { - /* the stuff before this character may be the file number + /* the stuff before this character may be the file number being redirected */ prog->redirects[i].fd = strtol(prog->argv[argc_l], &chptr, 10); diff --git a/shell/msh.c b/shell/msh.c index 31dd04f3e..e7059507a 100644 --- a/shell/msh.c +++ b/shell/msh.c @@ -23,7 +23,7 @@ * 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 - * + * * Original copyright notice is retained at the end of this file. */ @@ -770,7 +770,7 @@ extern int msh_main(int argc, char **argv) if (--argc > 0) PUSHIO(aword, *++argv, iof = nlchar); break; - + case 'q': qflag = SIG_DFL; break; @@ -784,7 +784,7 @@ extern int msh_main(int argc, char **argv) setval(prompt, ""); iof = linechar; break; - + case 'i': interactive++; default: @@ -809,7 +809,7 @@ extern int msh_main(int argc, char **argv) PUSHIO(afile, 0, iof); if (isatty(0) && isatty(1) && !cflag) { interactive++; -#ifndef CONFIG_FEATURE_SH_EXTRA_QUIET +#ifndef CONFIG_FEATURE_SH_EXTRA_QUIET printf( "\n\n" BB_BANNER " Built-in shell (msh)\n"); printf( "Enter 'help' for a list of built-in commands.\n\n"); #endif @@ -838,7 +838,7 @@ extern int msh_main(int argc, char **argv) ap++; } } - } + } setval(lookup("#"), putn((--dolc < 0) ? (dolc = 0) : dolc)); for (;;) { @@ -2303,7 +2303,7 @@ int act; #if __GNUC__ /* Avoid longjmp clobbering */ (void) ℘ -#endif +#endif if (t == NULL) @@ -2318,7 +2318,7 @@ int act; case TPAREN: rv = execute(t->left, pin, pout, 0); break; - + case TCOM: { int child; @@ -2395,7 +2395,7 @@ int act; } else { i = -1; while (*wp++ != NULL) - ; + ; } vp = lookup(t->str); while (setjmp(bc.brkpt)) @@ -2497,7 +2497,7 @@ forkexec( register struct op *t, int *pin, int *pout, int act, char **wp, int *p (void) &cp; (void) &resetsig; (void) &owp; -#endif +#endif owp = wp; resetsig = 0; @@ -2532,7 +2532,7 @@ forkexec( register struct op *t, int *pin, int *pout, int act, char **wp, int *p hintr = intr; hbrklist = brklist; hexecflg = execflg; - + i = vfork(); if (i != 0) { /* who wrote this crappy non vfork safe shit? */ @@ -2563,7 +2563,7 @@ forkexec( register struct op *t, int *pin, int *pout, int act, char **wp, int *p (*pforked)++; brklist = 0; execflg = 0; - } + } if (owp != NULL) while ((cp = *owp++) != NULL && assign(cp, COPYV)) if (shcom == NULL) @@ -2841,7 +2841,7 @@ char *c, **v, **envp; #endif optind = 1; if (find_applet_by_name(name)) { - /* We have to exec here since we vforked. Running + /* We have to exec here since we vforked. Running * run_applet_by_name() won't work and bad things * will happen. */ execve("/proc/self/exe", v, envp); @@ -2964,8 +2964,8 @@ static int dohelp(struct op *t ) for (i=0, applet = applets; i < NUM_APPLETS; applet++, i++) { if (!applet->name) continue; - - col += printf("%s%s", ((col == 0) ? "\t" : " "), + + col += printf("%s%s", ((col == 0) ? "\t" : " "), applet->name); if (col > 60) { printf("\n"); @@ -3194,7 +3194,7 @@ register struct op *t; if (n == SIGINT) setsig(n, onintr); else - setsig(n, n == SIGQUIT ? SIG_IGN + setsig(n, n == SIGQUIT ? SIG_IGN : SIG_DFL); else setsig(n, SIG_DFL); @@ -3784,7 +3784,7 @@ int quoted; /* Avoid longjmp clobbering */ (void) &cp; #endif - + for (cp = e.iop->argp->aword; *cp != '`'; cp++) if (*cp == 0) { err("no closing `"); @@ -3837,7 +3837,7 @@ int quoted; err("unclosed ${\n"); return(0); } - if (operator) { + if (operator) { src++; while (*src && (*src != '}')) { alt_value[alt_index++] = *src++; @@ -3875,7 +3875,7 @@ int quoted; } } *dest = '\0'; - + if (openpipe(pf) < 0) return(0); while ((i = vfork()) == -1 && errno == EAGAIN) @@ -3897,7 +3897,7 @@ int quoted; for (j=0; j<=_NSIG; j++) if (ourtrap[j] && signal(j, SIG_IGN) != SIG_IGN) signal(j, SIG_DFL); - + dup2(pf[1], 1); closepipe(pf); @@ -4121,7 +4121,7 @@ register struct wdblock *wb; wb->w_words[wb->w_nword++] = wd; return(wb); } -static +static char ** getwords(wb) register struct wdblock *wb; @@ -4557,7 +4557,7 @@ register struct ioarg *ap; c = mycommand[position]; position++; return(c); - } else + } else #endif { i = safe_read(ap->afile, &c, sizeof(c)); @@ -4858,7 +4858,7 @@ int xdoll; char c; char tname[30] = ".msh_XXXXXX"; jmp_buf ev; - + tf = mkstemp(tname); if (tf < 0) return (-1); @@ -4917,24 +4917,24 @@ int area; /* * Copyright (c) 1987,1997, Prentice Hall * All rights reserved. - * + * * Redistribution and use of the MINIX operating system in source and * binary forms, with or without modification, are permitted provided * that the following conditions are met: - * + * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. - * + * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. - * + * * Neither the name of Prentice Hall nor the names of the software * authors or contributors may be used to endorse or promote * products derived from this software without specific prior * written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS, AUTHORS, AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |