Merge branch 'master' into parser_cleanup

This commit is contained in:
ridiculousfish 2014-03-01 20:33:26 -08:00
commit b187125b63
63 changed files with 182 additions and 104 deletions

View file

@ -422,7 +422,7 @@ INPUT =
# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp
# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm
FILE_PATTERNS = *.h *.cpp
FILE_PATTERNS = *.h *.c
# The RECURSIVE tag can be used to turn specify whether or not subdirectories
# should be searched for input files as well. Possible values are YES and NO.

View file

@ -1,4 +1,4 @@
/** \file builtin.cpp
/** \file builtin.c
Functions for executing builtin functions.
How to add a new builtin function:

View file

@ -1,4 +1,4 @@
/** \file builtin_commandline.cpp Functions defining the commandline builtin
/** \file builtin_commandline.c Functions defining the commandline builtin
Functions used for implementing the commandline builtin.

View file

@ -1,4 +1,4 @@
/** \file builtin_complete.cpp Functions defining the complete builtin
/** \file builtin_complete.c Functions defining the complete builtin
Functions used for implementing the complete builtin.
@ -279,8 +279,8 @@ const wchar_t *builtin_complete_get_temporary_buffer()
/**
The complete builtin. Used for specifying programmable
tab-completions. Calls the functions in complete.cpp for any heavy
lifting. Defined in builtin_complete.cpp
tab-completions. Calls the functions in complete.c for any heavy
lifting. Defined in builtin_complete.c
*/
static int builtin_complete(parser_t &parser, wchar_t **argv)
{

View file

@ -1,4 +1,4 @@
/** \file builtin_jobs.cpp
/** \file builtin_jobs.c
Functions for executing the jobs builtin.
*/
#include "config.h"

View file

@ -1,6 +1,3 @@
/** \file builtin_printf.cpp
*/
/* printf - format and print data
Copyright (C) 1990-2007 Free Software Foundation, Inc.

View file

@ -1,4 +1,4 @@
/** \file builtin_set.cpp Functions defining the set builtin
/** \file builtin_set.c Functions defining the set builtin
Functions used for implementing the set builtin.

View file

@ -646,11 +646,13 @@ expression *test_parser::parse_args(const wcstring_list_t &args, wcstring &err)
expression *result = parser.parse_expression(0, (unsigned int)args.size());
/* Handle errors */
bool errored = false;
for (size_t i = 0; i < parser.errors.size(); i++)
{
err.append(L"test: ");
err.append(parser.errors.at(i));
err.push_back(L'\n');
errored = true;
// For now we only show the first error
break;
}
@ -665,6 +667,7 @@ expression *test_parser::parse_args(const wcstring_list_t &args, wcstring &err)
{
append_format(err, L"test: unexpected argument at index %lu: '%ls'\n", (unsigned long)result->range.end, args.at(result->range.end).c_str());
}
errored = true;
delete result;
result = NULL;

View file

@ -1,4 +1,4 @@
/** \file builtin_ulimit.cpp Functions defining the ulimit builtin
/** \file builtin_ulimit.c Functions defining the ulimit builtin
Functions used for implementing the ulimit builtin.

View file

@ -1,4 +1,4 @@
/** \file common.cpp
/** \file common.c
Various functions, mostly string utilities, that are used by most
parts of fish.
@ -866,7 +866,11 @@ void write_screen(const wcstring &msg, wcstring &buff)
/*
If token is zero character long, we don't do anything
*/
if (overflow)
if (pos == start)
{
start = pos = pos+1;
}
else if (overflow)
{
/*
In case of overflow, we print a newline, except if we already are at position 0

View file

@ -1,4 +1,4 @@
/** \file complete.cpp Functions related to tab-completion.
/** \file complete.c Functions related to tab-completion.
These functions are used for storing and retrieving tab-completion data, as well as for performing tab-completion.
*/

View file

@ -1,4 +1,4 @@
/** \file env.cpp
/** \file env.c
Functions for setting and getting environment variables.
*/
#include "config.h"

View file

@ -1,9 +1,3 @@
/** \file env_universal.cpp
Various functions, mostly string utilities, that are used by most
parts of fish.
*/
#include "config.h"

View file

@ -1,4 +1,5 @@
/** \file env_universal_common.cpp
/**
\file env_universal_common.c
The utility library for universal variables. Used both by the
client library and by the daemon.

View file

@ -1,4 +1,4 @@
/** \file event.cpp
/** \file event.c
Functions for handling event triggers

View file

@ -1,4 +1,4 @@
/** \file exec.cpp
/** \file exec.c
Functions for executing a program.
Some of the code in this file is based on code from the Glibc

View file

@ -1,4 +1,4 @@
/**\file expand.cpp
/**\file expand.c
String expansion functions. These functions perform several kinds of
parameter expansion.

View file

@ -1,5 +1,4 @@
/** \file fallback.cpp
/**
This file only contains fallback implementations of functions which
have been found to be missing or broken by the configuration
scripts.

View file

@ -1,6 +1,3 @@
/** \file fish.cpp
The main loop of fish.
*/
/*
Copyright (C) 2005-2008 Axel Liljencrantz
@ -18,6 +15,11 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/** \file fish.c
The main loop of <tt>fish</tt>.
*/
#include "config.h"
@ -211,6 +213,8 @@ static struct config_paths_t determine_config_directory_paths(const char *argv0)
paths.sysconf = L"" SYSCONFDIR "/fish";
paths.doc = L"" DOCDIR;
paths.bin = L"" BINDIR;
done = true;
}
return paths;

View file

@ -1,6 +1,3 @@
/** \file fish_indent.cpp
The fish_indent proegram.
*/
/*
Copyright (C) 2005-2008 Axel Liljencrantz
@ -18,6 +15,11 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/** \file fish_indent.cpp
The fish_indent proegram.
*/
#include "config.h"
#include <stdlib.h>

View file

@ -1,7 +1,3 @@
/** \file fish_pager.cpp
*/
#include "config.h"
#include <stdlib.h>
@ -443,6 +439,9 @@ static void completion_print_item(const wchar_t *prefix, comp_t *c, int width, b
writech(L' ');
}
set_color(get_color(HIGHLIGHT_PAGER_DESCRIPTION), bg);
written += print_max(L"(", 1, 0);
written += print_max(c->desc.c_str(), desc_width, 0);
written += print_max(L")", 1, 0);
}
else
{

View file

@ -1,4 +1,4 @@
/** \file fish_tests.cpp
/** \file fish_tests.c
Various bug and feature tests. Compiled and run by make test.
*/

View file

@ -1,4 +1,4 @@
/** \file fishd.cpp
/** \file fishd.c
The universal variable server. fishd is automatically started by fish
if a fishd server isn't already running. fishd reads any saved

View file

@ -1,4 +1,4 @@
/** \file function.cpp
/** \file function.c
Prototypes for functions for storing and retrieving function
information. These functions also take care of autoloading

View file

@ -1,4 +1,4 @@
/** \file highlight.cpp
/** \file highlight.c
Functions for syntax highlighting
*/
#include "config.h"

View file

@ -1,4 +1,4 @@
/** \file input.cpp
/** \file input.c
Functions for reading a character of input from stdin.

View file

@ -1,4 +1,4 @@
/** \file input_common.cpp
/** \file input_common.c
Implementation file for the low level input library

View file

@ -1,4 +1,4 @@
/** \file intern.cpp
/** \file intern.c
Library for pooling common strings

2
io.cpp
View file

@ -1,4 +1,4 @@
/** \file io.cpp
/** \file io.c
Utilities for io redirection.

View file

@ -1,6 +1,3 @@
/** \file iothread.cpp
*/
#include "config.h"
#include "iothread.h"
#include "common.h"

View file

@ -1,5 +1,4 @@
/** \file key_reader.cpp
/*
A small utility to print the resulting key codes from pressing a
key. Servers the same function as hitting ^V in bash, but I prefer
the way key_reader works.

View file

@ -1,4 +1,4 @@
/** \file kill.cpp
/** \file kill.c
The killring.
Works like the killring in emacs and readline. The killring is cut

View file

@ -1,4 +1,4 @@
/** \file mimedb.cpp
/** \file mimedb.c
mimedb is a program for checking the mimetype, description and
default action associated with a file or mimetype. It uses the

View file

@ -1,4 +1,4 @@
/** \file output.cpp
/** \file output.c
Generic output functions
*/

View file

@ -1,7 +1,3 @@
/** \file pager.cpp
*/
#include "config.h"
#include "pager.h"
@ -149,6 +145,9 @@ line_t pager_t::completion_print_item(const wcstring &prefix, const comp_t *c, s
{
written += print_max(L" ", packed_color, 1, false, &line_data);
}
written += print_max(L"(", packed_color, 1, false, &line_data);
written += print_max(c->desc, packed_color, desc_width, false, &line_data);
written += print_max(L")", packed_color, 1, false, &line_data);
}
else
{
@ -632,6 +631,11 @@ bool pager_t::completion_try_print(size_t cols, const wcstring &prefix, const co
{
search_field_text.append(PAGER_SEARCH_FIELD_WIDTH - search_field_text.size(), L' ');
}
line_t *search_field = &rendering->screen_data.insert_line_at_index(0);
/* We limit the width to term_width - 1 */
int search_field_written = print_max(SEARCH_FIELD_PROMPT, highlight_spec_normal, term_width - 1, false, search_field);
search_field_written += print_max(search_field_text, highlight_modifier_force_underline, term_width - search_field_written - 1, false, search_field);
}
}
@ -743,7 +747,7 @@ bool pager_t::select_next_completion_in_direction(selection_direction_t directio
}
/* Ok, we had something selected already. Select something different. */
size_t new_selected_completion_idx;
size_t new_selected_completion_idx = selected_completion_idx;
if (! selection_direction_is_cardinal(direction))
{
/* Next, previous, or deselect, all easy */

View file

@ -50,7 +50,7 @@ static wcstring profiling_cmd_name_for_redirectable_block(const parse_node_t &no
return result;
}
parse_execution_context_t::parse_execution_context_t(const parse_node_tree_t &t, const wcstring &s, parser_t *p, int initial_eval_level) : tree(t), src(s), parser(p), eval_level(initial_eval_level)
parse_execution_context_t::parse_execution_context_t(const parse_node_tree_t &t, const wcstring &s, parser_t *p, int initial_eval_level) : tree(t), src(s), parser(p), eval_level(initial_eval_level), executing_node_idx(NODE_OFFSET_INVALID), cached_lineno_offset(0), cached_lineno_count(0)
{
}
@ -506,6 +506,7 @@ parse_execution_result_t parse_execution_context_t::run_for_statement(const pars
parse_execution_result_t parse_execution_context_t::run_switch_statement(const parse_node_t &statement)
{
assert(statement.type == symbol_switch_statement);
parse_execution_result_t ret = parse_execution_success;
const parse_node_t *matching_case_item = NULL;
parse_execution_result_t result = parse_execution_success;
@ -531,6 +532,7 @@ parse_execution_result_t parse_execution_context_t::run_switch_statement(const p
{
/* Store the node that failed to expand */
report_error(switch_value_node, WILDCARD_ERR_MSG, switch_value.c_str());
ret = parse_execution_errored;
break;
}
@ -1301,6 +1303,9 @@ parse_execution_result_t parse_execution_context_t::run_1_job(const parse_node_t
/* Increment the eval_level for the duration of this command */
scoped_push<int> saved_eval_level(&eval_level, eval_level + 1);
/* Save the node index */
scoped_push<node_offset_t> saved_node_offset(&executing_node_idx, this->get_offset(job_node));
/* Profiling support */
long long start_time = 0, parse_time = 0, exec_time = 0;
profile_item_t *profile_item = this->parser->create_profile_item();
@ -1523,3 +1528,58 @@ parse_execution_result_t parse_execution_context_t::eval_node_at_offset(node_off
return status;
}
int parse_execution_context_t::get_current_line_number()
{
/* If we're not executing anything, return -1 */
if (this->executing_node_idx == NODE_OFFSET_INVALID)
{
return -1;
}
/* If for some reason we're executing a node without source, return -1 */
const parse_node_t &node = tree.at(this->executing_node_idx);
if (! node.has_source())
{
return -1;
}
/* Count the number of newlines, leveraging our cache */
const size_t offset = tree.at(this->executing_node_idx).source_start;
assert(offset <= src.size());
/* Easy hack to handle 0 */
if (offset == 0)
{
return 1;
}
/* We want to return (one plus) the number of newlines at offsets less than the given offset. cached_lineno_count is the number of newlines at indexes less than cached_lineno_offset. */
const wchar_t *str = src.c_str();
if (offset > cached_lineno_offset)
{
size_t i;
for (i = cached_lineno_offset; str[i] != L'\0' && i < offset; i++)
{
/* Add one for every newline we find in the range [cached_lineno_offset, offset) */
if (str[i] == L'\n')
{
cached_lineno_count++;
}
}
cached_lineno_offset = i; //note: i, not offset, in case offset is beyond the length of the string
}
else if (offset < cached_lineno_offset)
{
/* Subtract one for every newline we find in the range [offset, cached_lineno_offset) */
for (size_t i = offset; i < cached_lineno_offset; i++)
{
if (str[i] == L'\n')
{
cached_lineno_count--;
}
}
cached_lineno_offset = offset;
}
return cached_lineno_count + 1;
}

View file

@ -40,6 +40,13 @@ private:
int eval_level;
/* The currently executing node index, used to indicate the line number */
node_offset_t executing_node_idx;
/* Cached line number information */
size_t cached_lineno_offset;
int cached_lineno_count;
/* No copying allowed */
parse_execution_context_t(const parse_execution_context_t&);
parse_execution_context_t& operator=(const parse_execution_context_t&);
@ -106,6 +113,9 @@ public:
/* Returns the current eval level */
int current_eval_level() const { return eval_level; }
/* Returns the current line number. Not const since it touches cached_lineno_offset */
int get_current_line_number();
/* Start executing at the given node offset. Returns 0 if there was no error, 1 if there was an error */
parse_execution_result_t eval_node_at_offset(node_offset_t offset, const block_t *associated_block, const io_chain_t &io);

View file

@ -1,7 +1,3 @@
/** \file parse_productions.cpp
*/
#include "parse_productions.h"
using namespace parse_productions;

View file

@ -1,6 +1,3 @@
/** \file parse_tree.cpp
*/
#include "parse_productions.h"
#include "tokenizer.h"
#include "fallback.h"
@ -990,6 +987,7 @@ void parse_ll_t::accept_tokens(parse_token_t token1, parse_token_t token2)
{
fprintf(stderr, "Consumed token %ls\n", token1.describe().c_str());
}
consumed = true;
break;
}

View file

@ -1,4 +1,4 @@
/** \file parse_util.cpp
/** \file parse_util.c
Various mostly unrelated utility functions related to parsing,
loading and evaluating fish code.

View file

@ -1,4 +1,4 @@
/** \file parser.cpp
/** \file parser.c
The fish parser. Contains functions for parsing and evaluating code.
@ -826,6 +826,16 @@ const wchar_t *parser_t::is_function() const
int parser_t::get_lineno() const
{
if (parser_use_ast())
{
int lineno = -1;
if (! execution_contexts.empty())
{
lineno = execution_contexts.back()->get_current_line_number();
}
return lineno;
}
int lineno;
if (! current_tokenizer || ! tok_string(current_tokenizer))
@ -1162,6 +1172,13 @@ int parser_t::eval_new_parser(const wcstring &cmd, const io_chain_t &io, enum bl
parse_execution_context_t *ctx = new parse_execution_context_t(tree, cmd, this, exec_eval_level);
execution_contexts.push_back(ctx);
/* Execute the first node */
int result = 1;
if (! tree.empty())
{
result = this->eval_block_node(0, io, block_type);
}
/* Clean up the execution context stack */
assert(! execution_contexts.empty() && execution_contexts.back() == ctx);
execution_contexts.pop_back();

View file

@ -1,4 +1,4 @@
/** \file parser_keywords.cpp
/** \file parser_keywords.c
Functions having to do with parser keywords, like testing if a function is a block command.
*/

View file

@ -1,7 +1,3 @@
/** \file path.cpp
*/
#include "config.h"
#include <stdlib.h>

View file

@ -1,4 +1,5 @@
/** \file print_help.cpp
/** \file print_help.c
Print help message for the specified command
*/

View file

@ -1,4 +1,4 @@
/** \file proc.cpp
/** \file proc.c
Utilities for keeping track of jobs, processes and subshells, as
well as signal handling functions for tracking children. These
@ -383,6 +383,8 @@ static void mark_process_status(const job_t *j, process_t *p, int status)
}
else
{
ssize_t ignore;
/* This should never be reached */
p->completed = 1;
@ -396,6 +398,7 @@ static void mark_process_status(const job_t *j, process_t *p, int status)
handler. If things aren't working properly, it's safer to
give up.
*/
ignore = write(2, mess, strlen(mess));
}
}

View file

@ -1,4 +1,4 @@
/** \file reader.cpp
/** \file reader.c
Functions for reading data from stdin and passing to the
parser. If stdin is a keyboard, it supplies a killring, history,

View file

@ -1,4 +1,4 @@
/** \file sanity.cpp
/** \file sanity.c
Functions for performing sanity checks on the program state
*/
#include "config.h"

View file

@ -1,4 +1,4 @@
/** \file screen.cpp High level library for handling the terminal screen
/** \file screen.c High level library for handling the terminal screen
The screen library allows the interactive reader to write its
output to screen efficiently by keeping an internal representation
@ -298,6 +298,7 @@ size_t escape_code_length(const wchar_t *code)
if (code[1] >= L'@' && code[1] <= L'_')
{
resulting_length = 2;
found = true;
}
}

Binary file not shown.

View file

@ -1,4 +1,4 @@
/** \file signal.cpp
/** \file signal.c
The library for various signal related issues
@ -477,7 +477,7 @@ static void handle_int(int sig, siginfo_t *info, void *context)
}
/**
sigchld handler. Does notification and calls the handler in proc.cpp
sigchld handler. Does notification and calls the handler in proc.c
*/
static void handle_chld(int sig, siginfo_t *info, void *context)
{

View file

@ -79,4 +79,9 @@ for $var1 in 1 2 3
end
echo
# Test status -n
eval 'status -n
status -n
status -n'
false

View file

@ -10,3 +10,6 @@ Foop
Doop
Testing for loop
123
1
2
3

View file

@ -1,4 +1,4 @@
/** \file tokenizer.cpp
/** \file tokenizer.c
A specialized tokenizer for tokenizing the fish language. In the
future, the tokenizer should be extended to support marks,

View file

@ -1,4 +1,4 @@
/** \file util.cpp
/** \file util.c
Generic utilities library.
Contains datastructures such as automatically growing array lists, priority queues, etc.

View file

@ -1,4 +1,4 @@
/** \file wgetopt.cpp
/** \file wgetopt.c
A version of the getopt library for use with wide character strings.
This is simply the gnu getopt library, but converted for use with

View file

@ -1,4 +1,4 @@
/** \file wildcard.cpp
/** \file wildcard.c
Fish needs it's own globbing implementation to support
tab-expansion of globbed parameters. Also provides recursive

View file

@ -1,4 +1,4 @@
/** \file wutil.cpp
/** \file wutil.c
Wide character equivalents of various standard unix
functions.
*/

View file

@ -1,6 +1,3 @@
/** \file xdgmime.cpp
*/
/* -*- mode: C; c-file-style: "gnu" -*- */
/* xdgmime.c: XDG Mime Spec mime resolver. Based on version 0.11 of the spec.
*

View file

@ -1,7 +1,5 @@
/** \file xdgmimealias.cpp
*/
/* -*- mode: C; c-file-style: "gnu" -*- */
/* xdgmimealias.cpp: Private file. Datastructure for storing the aliases.
/* xdgmimealias.c: Private file. Datastructure for storing the aliases.
*
* More info can be found at http://www.freedesktop.org/standards/
*

View file

@ -1,7 +1,5 @@
/** \file xdgmimeglob.cpp
*/
/* -*- mode: C; c-file-style: "gnu" -*- */
/* xdgmimeglob.cpp: Private file. Datastructure for storing the globs.
/* xdgmimeglob.c: Private file. Datastructure for storing the globs.
*
* More info can be found at http://www.freedesktop.org/standards/
*

View file

@ -1,8 +1,5 @@
/** \file xdgmimeint.cpp
*/
/* -*- mode: C; c-file-style: "gnu" -*- */
/* xdgmimeint.cpp: Internal defines and functions.
/* xdgmimeint.c: Internal defines and functions.
*
* More info can be found at http://www.freedesktop.org/standards/
*

View file

@ -1,6 +1,3 @@
/** \file xdgmimemagic.cpp
*/
/* -*- mode: C; c-file-style: "gnu" -*- */
/* xdgmimemagic.: Private file. Datastructure for storing magic files.
*

View file

@ -1,5 +1,3 @@
/** \file xdgmimeparent.cpp
*/
/* -*- mode: C; c-file-style: "gnu" -*- */
/* xdgmimealias.c: Private file. Datastructure for storing the hierarchy.
*