summary refs log tree commit diff stats
path: root/doc/pydoc/ranger.ext.html
blob: d58c1b87b0cea55c16c24dc1d1126357ab6d91a5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><title>Python: package ranger.ext</title>
</head><body bgcolor="#f0f0f8">

<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
<tr bgcolor="#7799ee">
<td valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong><a href="ranger.html"><font color="#ffffff">ranger</font></a>.ext</strong></big></big></font></td
><td align=right valign=bottom
><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/home/hut/ranger/ranger/ext/__init__.py">/home/hut/ranger/ranger/ext/__init__.py</a></font></td></tr></table>
    <p><tt>This&nbsp;package&nbsp;includes&nbsp;extensions&nbsp;with&nbsp;broader&nbsp;usability</tt></p>
<p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#aa55cc">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Package Contents</strong></big></font></td></tr>
    
<tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="ranger.ext.accumulator.html">accumulator</a><br>
<a href="ranger.ext.command_parser.html">command_parser</a><br>
<a href="ranger.ext.curses_interrupt_handler.html">curses_interrupt_handler</a><br>
<a href="ranger.ext.get_all_modules.html">get_all_modules</a><br>
</td><td width="25%" valign=top><a href="ranger.ext.get_executables.html">get_executables</a><br>
<a href="ranger.ext.human_readable.html">human_readable</a><br>
<a href="ranger.ext.iter_tools.html">iter_tools</a><br>
<a href="ranger.ext.mount_path.html">mount_path</a><br>
</td><td width="25%" valign=top><a href="ranger.ext.move.html">move</a><br>
<a href="ranger.ext.openstruct.html">openstruct</a><br>
<a href="ranger.ext.shell_escape.html">shell_escape</a><br>
<a href="ranger.ext.shutil_generatorized.html">shutil_generatorized</a><br>
</td><td width="25%" valign=top><a href="ranger.ext.waitpid_no_intr.html">waitpid_no_intr</a><br>
</td></tr></table></td></tr></table>
</body></html>
utine->calls.empty()); if (current_call().next_ingredient_to_process < SIZE(current_call().ingredient_atoms)) { reagent/*copy*/ product = current_instruction().products.at(0); // End Preprocess NEXT_INGREDIENT product if (current_recipe_name() == "main") { // no ingredient types since the call might be implicit; assume ingredients are always strings // todo: how to test this? if (!is_mu_string(product)) raise << "main: wrong type for ingredient '" << product.original_string << "'\n" << end(); } else if (!types_coercible(product, current_call().ingredients.at(current_call().next_ingredient_to_process))) { raise << maybe(current_recipe_name()) << "wrong type for ingredient '" << product.original_string << "'\n" << end(); // End next-ingredient Type Mismatch Error } products.push_back( current_call().ingredient_atoms.at(current_call().next_ingredient_to_process)); assert(SIZE(products) == 1); products.resize(2); // push a new vector products.at(1).push_back(1); ++current_call().next_ingredient_to_process; } else { if (SIZE(current_instruction().products) < 2) raise << maybe(current_recipe_name()) << "no ingredient to save in '" << current_instruction().products.at(0).original_string << "'\n" << end(); if (current_instruction().products.empty()) break; products.resize(2); // pad the first product with sufficient zeros to match its type int size = size_of(current_instruction().products.at(0)); for (int i = 0; i < size; ++i) products.at(0).push_back(0); products.at(1).push_back(0); } break; } :(scenario next_ingredient_fail_on_missing) % Hide_errors = true; def main [ f ] def f [ 11:number <- next-ingredient ] +error: f: no ingredient to save in '11:number' :(scenario rewind_ingredients) def main [ f 2 ] def f [ 12:number <- next-ingredient # consume ingredient _, 1:boolean <- next-ingredient # will not find any ingredients rewind-ingredients 13:number, 2:boolean <- next-ingredient # will find ingredient again ] +mem: storing 2 in location 12 +mem: storing 0 in location 1 +mem: storing 2 in location 13 +mem: storing 1 in location 2 :(before "End Primitive Recipe Declarations") REWIND_INGREDIENTS, :(before "End Primitive Recipe Numbers") put(Recipe_ordinal, "rewind-ingredients", REWIND_INGREDIENTS); :(before "End Primitive Recipe Checks") case REWIND_INGREDIENTS: { break; } :(before "End Primitive Recipe Implementations") case REWIND_INGREDIENTS: { current_call().next_ingredient_to_process = 0; break; } :(scenario ingredient) def main [ f 1, 2 ] def f [ 12:number <- ingredient 1 # consume second ingredient first 13:number, 1:boolean <- next-ingredient # next-ingredient tries to scan past that ] +mem: storing 2 in location 12 +mem: storing 0 in location 1 :(before "End Primitive Recipe Declarations") INGREDIENT, :(before "End Primitive Recipe Numbers") put(Recipe_ordinal, "ingredient", INGREDIENT); :(before "End Primitive Recipe Checks") case INGREDIENT: { if (SIZE(inst.ingredients) != 1) { raise << maybe(get(Recipe, r).name) << "'ingredient' expects exactly one ingredient, but got '" << inst.original_string << "'\n" << end(); break; } if (!is_literal(inst.ingredients.at(0)) && !is_mu_number(inst.ingredients.at(0))) { raise << maybe(get(Recipe, r).name) << "'ingredient' expects a literal ingredient, but got '" << inst.ingredients.at(0).original_string << "'\n" << end(); break; } break; } :(before "End Primitive Recipe Implementations") case INGREDIENT: { if (static_cast<int>(ingredients.at(0).at(0)) < SIZE(current_call().ingredient_atoms)) { current_call().next_ingredient_to_process = ingredients.at(0).at(0); products.push_back( current_call().ingredient_atoms.at(current_call().next_ingredient_to_process)); assert(SIZE(products) == 1); products.resize(2); // push a new vector products.at(1).push_back(1); ++current_call().next_ingredient_to_process; } else { if (SIZE(current_instruction().products) > 1) { products.resize(2); products.at(0).push_back(0); // todo: will fail noisily if we try to read a compound value products.at(1).push_back(0); } } break; } //: a particularly common array type is the string, or address:array:character :(code) bool is_mu_string(reagent/*copy*/ x) { // End Preprocess is_mu_string(reagent x) return x.type && !x.type->atom && x.type->left->atom && x.type->left->value == get(Type_ordinal, "address") && x.type->right && !x.type->right->atom && x.type->right->left->atom && x.type->right->left->value == get(Type_ordinal, "array") && x.type->right->right && x.type->right->right->atom && x.type->right->right->value == get(Type_ordinal, "character"); }