# Fill a region of memory with zeroes.
== code
copy-bytes: # src: (addr byte), dest: (addr byte), size: int
# pseudocode:
# curr-src/esi = src
# curr-dest/edi = dest
# i/ecx = 0
# while true
# if (i >= size) break
# *curr-dest = *curr-src
# ++curr-src
# ++curr-dest
# ++i
#
# . prologue
55/push-ebp
89/<- %ebp 4/r32/esp
# . save registers
50/push-eax
51/push-ecx
52/push-edx
56/push-esi
57/push-edi
# curr-src/esi = src
8b/-> *(ebp+8) 6/r32/esi
# curr-dest/edi = dest
8b/-> *(ebp+0xc) 7/r32/edi
# var i/ecx: int = 0
b9/copy-to-ecx 0/imm32
# edx = size
8b/-> *(ebp+0x10) 2/r32/edx
{
# if (i >= size) break
39/compare %ecx 2/r32/edx
7d/jump-if->= break/disp8
# *curr-dest = *curr-src
8a/byte-> *esi 0/r32/AL
88/byte<- *edi 0/r32/AL
# update
46/increment-esi
47/increment-edi
41/increment-ecx
eb/jump loop/disp8
}
$copy-bytes:end:
# . restore registers
5f/pop-to-edi
5e/pop-to-esi
5a/pop-to-edx
59/pop-to-ecx
58/pop-to-eax
# . epilogue
89/<- %esp 5/r32/ebp
5d/pop-to-ebp
c3/return
stream-to-string: # in: (addr stream _), out: (addr handle array _)
# . prologue
55/push-ebp
89/<- %ebp 4/r32/esp
# . save registers
50/push-eax
51/push-ecx
52/push-edx
56/push-esi
# esi = s
8b/-> *(ebp+8) 6/r32/esi
# var len/ecx: int = s->write - s->read
8b/-> *esi 1/r32/ecx
2b/subtract *(esi+4) 1/r32/ecx
# allocate
(allocate-array Heap %ecx *(ebp+0xc))
# var in/edx: (addr byte) = s->data + s->read
8b/-> *(esi+4) 2/r32/edx
8d/copy-address *(esi+edx+0xc) 2/r32/edx
# var dest/eax: (addr byte) = data for out
8b/-> *(ebp+0xc) 0/r32/eax
(lookup *eax *(eax+4)) # => eax
8d/copy-address *(eax+4) 0/r32/eax
#
(copy-bytes %edx %eax %ecx)
$stream-to-string:end:
# . restore registers
5e/pop-to-esi
5a/pop-to-edx
59/pop-to-ecx
58/pop-to-eax
# . epilogue
89/<- %esp 5/r32/ebp
5d/pop-to-ebp
c3/return
test-stream-to-string:
# . prologue
55/push-ebp
89/<- %ebp 4/r32/esp
# setup
(clear-stream _test-input-stream)
(write _test-input-stream "abc")
# skip something
(read-byte _test-input-stream) # => eax
# var out/ecx: (handle array byte)
68/push 0/imm32
68/push 0/imm32
89/<- %ecx 4/r32/esp
#
(stream-to-string _test-input-stream %ecx)
(lookup *ecx *(ecx+4)) # => eax
(check-strings-equal %eax "bc")
# . epilogue
89/<- %esp 5/r32/ebp
5d/pop-to-ebp
c3/return
r.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */=head1 NAME
rifle - ranger's file opener
=head1 SYNOPSIS
B<rifle> [B<--help>] [B<-f> I<FLAGS>] [B<-l>] [B<-p> I<KEYWORD>]
[B<-w> I<PROGRAM>] I<files>
=head1 DESCRIPTION
rifle is a powerful file executor that allows for complex file type checking,
written to meet the needs of the file manager I<ranger>. rifle's strength lies
in automatically determining file types, depending on which programs are
installed on the system, even without any user interaction.
=head1 OPTIONS
=over 14
=item B<-f> I<FLAGS>
Specify flags for opening the files. Flags are letters that changes how the
program is executed. Any combination of flags will work. Writing uppercase
flags will negate the effect of all previously used lowercase flags of the same
letter.
Table of all flags:
f fork program to background
r run program as root, using sudo
t run program in a separate terminal, as specified by $TERMCMD
=item B<-l>
List all possible ways to open the specified files. Each line will contain information in the format of I<id:label:flags:command>. I<id> is the identification number. I<label> is an arbitrary string that was specified for this command, I<flags> are the flags that are used by default, and I<command> is the command that is going to be executed.
=item B<-p> I<KEYWORD>
Pick a method to open the files.
I<KEYWORD> is either the ID number listed by C<rifle -l> or a string that matches a label in the configuration file.
=item B<-w> I<PROGRAM>
Open the files with the program I<PROGRAM>
=item B<-h>, B<--help>
Print a list of options and exit.
=back
=head1 FILES
rifle shares configuration files with ranger, though ranger is not required in
order to use rifle. The configuration file F<rifle.conf> is expected to be at
F<~/.config/ranger/rifle.conf>.
This file specifies patterns for determining the commands to open files with.
The syntax is described in the comments of the default F<rifle.conf> that ships
with ranger. To obtain it, you need to run: C<ranger --copy-config=rifle>
=head1 ENVIRONMENT
=over 8
=item EDITOR
Determines which editor to use for editing files (in the default F<rifle.conf>).
=item PAGER
Determines which pager to use for displaying files (in the default F<rifle.conf>).
=item TERMCMD
Determines the terminal emulator command for use with the I<t> flag. It is required that the value is the path to an executable file which accepts the "-e COMMAND" argument.
=item XDG_CONFIG_HOME
Specifies the directory for configuration files. Defaults to F<$HOME/.config>.
=back
=head1 EXAMPLES
List all the different methods:
$ rifle -l helloworld.py
0:editor::"$EDITOR" -- "$@"
1:pager::"$PAGER" -- "$@"
2:::python -- "$1"
Display its content by opening it with "cat":
$ rifle -w cat helloworld.py
print("Hello World!")
Run it by picking the method 2, which calls 'python -- "$1"':
$ rifle -p 2 helloworld.py
Hello World!
Display the file in a pager inside a new terminal, run as root:
$ rifle -p 1 -f tr helloworld.py