Thanks for using Compiler Explorer
Sponsors
Jakt
C++
Ada
Algol68
Analysis
Android Java
Android Kotlin
Assembly
C
C3
Carbon
C with Coccinelle
C++ with Coccinelle
C++ (Circle)
CIRCT
Clean
CMake
CMakeScript
COBOL
C++ for OpenCL
MLIR
Cppx
Cppx-Blue
Cppx-Gold
Cpp2-cppfront
Crystal
C#
CUDA C++
D
Dart
Elixir
Erlang
Fortran
F#
GLSL
Go
Haskell
HLSL
Hook
Hylo
IL
ispc
Java
Julia
Kotlin
LLVM IR
LLVM MIR
Modula-2
Mojo
Nim
Numba
Nix
Objective-C
Objective-C++
OCaml
Odin
OpenCL C
Pascal
Pony
PTX
Python
Racket
Raku
Ruby
Rust
Sail
Snowball
Scala
Slang
Solidity
Spice
SPIR-V
Swift
LLVM TableGen
Toit
Triton
TypeScript Native
V
Vala
Visual Basic
Vyper
WASM
Zig
Javascript
GIMPLE
Ygen
sway
ada source #2
Output
Compile to binary object
Link to binary
Execute the code
Intel asm syntax
Demangle identifiers
Verbose demangling
Filters
Unused labels
Library functions
Directives
Comments
Horizontal whitespace
Debug intrinsics
Compiler
S390X GNAT 11.2.0
S390X GNAT 12.1.0
S390X GNAT 12.2.0
S390X GNAT 12.3.0
S390X GNAT 12.4.0
S390X GNAT 12.5.0
S390X GNAT 13.1.0
S390X GNAT 13.2.0
S390X GNAT 13.3.0
S390X GNAT 13.4.0
S390X GNAT 14.1.0
S390X GNAT 14.2.0
S390X GNAT 14.3.0
S390X GNAT 15.1.0
S390X GNAT 15.2.0
arm gnat 10.3.0-2 (Alire)
arm gnat 11.2.0-3 (Alire)
arm gnat 13.1.0
arm gnat 13.2.0
arm gnat 13.3.0
arm gnat 13.4.0
arm gnat 14.1.0
arm gnat 14.2.0
arm gnat 14.3.0
arm gnat 15.1.0
arm gnat 15.2.0
arm64 gnat 12.1.0
arm64 gnat 12.2.0
arm64 gnat 12.3.0
arm64 gnat 12.4.0
arm64 gnat 12.5.0
arm64 gnat 13.1.0
arm64 gnat 13.2.0
arm64 gnat 13.3.0
arm64 gnat 13.4.0
arm64 gnat 14.1.0
arm64 gnat 14.2.0
arm64 gnat 14.3.0
arm64 gnat 15.1.0
arm64 gnat 15.2.0
hppa gnat 14.2.0
hppa gnat 14.3.0
hppa gnat 15.1.0
hppa gnat 15.2.0
loongarch64 gnat 14.1.0
loongarch64 gnat 14.2.0
loongarch64 gnat 14.3.0
loongarch64 gnat 15.1.0
loongarch64 gnat 15.2.0
mips gnat 11.2.0
mips gnat 12.1.0
mips gnat 12.2.0
mips gnat 12.3.0
mips gnat 12.4.0
mips gnat 12.5.0
mips gnat 13.1.0
mips gnat 13.2.0
mips gnat 13.3.0
mips gnat 13.4.0
mips gnat 14.1.0
mips gnat 14.2.0
mips gnat 14.3.0
mips gnat 15.1.0
mips gnat 15.2.0
mips64 gnat 11.2.0
mips64 gnat 12.1.0
mips64 gnat 12.2.0
mips64 gnat 12.3.0
mips64 gnat 12.4.0
mips64 gnat 12.5.0
mips64 gnat 13.1.0
mips64 gnat 13.2.0
mips64 gnat 13.3.0
mips64 gnat 13.4.0
mips64 gnat 14.1.0
mips64 gnat 14.2.0
mips64 gnat 14.3.0
mips64 gnat 15.1.0
mips64 gnat 15.2.0
powerpc gnat 11.2.0
powerpc gnat 12.1.0
powerpc gnat 12.2.0
powerpc gnat 12.3.0
powerpc gnat 12.4.0
powerpc gnat 12.5.0
powerpc gnat 13.1.0
powerpc gnat 13.2.0
powerpc gnat 13.3.0
powerpc gnat 13.4.0
powerpc gnat 14.1.0
powerpc gnat 14.2.0
powerpc gnat 14.3.0
powerpc gnat 15.1.0
powerpc gnat 15.2.0
powerpc64 gnat 11.2.0
powerpc64 gnat 12.1.0
powerpc64 gnat 12.2.0
powerpc64 gnat 12.3.0
powerpc64 gnat 12.4.0
powerpc64 gnat 12.5.0
powerpc64 gnat 13.1.0
powerpc64 gnat 13.2.0
powerpc64 gnat 13.3.0
powerpc64 gnat 13.4.0
powerpc64 gnat 14.1.0
powerpc64 gnat 14.2.0
powerpc64 gnat 14.3.0
powerpc64 gnat 15.1.0
powerpc64 gnat 15.2.0
powerpc64 gnat trunk
powerpc64le gnat 11.2.0
powerpc64le gnat 12.1.0
powerpc64le gnat 12.2.0
powerpc64le gnat 12.3.0
powerpc64le gnat 12.4.0
powerpc64le gnat 12.5.0
powerpc64le gnat 13.1.0
powerpc64le gnat 13.2.0
powerpc64le gnat 13.3.0
powerpc64le gnat 13.4.0
powerpc64le gnat 14.1.0
powerpc64le gnat 14.2.0
powerpc64le gnat 14.3.0
powerpc64le gnat 15.1.0
powerpc64le gnat 15.2.0
powerpc64le gnat trunk
riscv64 gnat 10.3.0-2 (Alire)
riscv64 gnat 11.2.0-3 (Alire)
riscv64 gnat 12.3.0
riscv64 gnat 12.4.0
riscv64 gnat 12.5.0
riscv64 gnat 13.1.0
riscv64 gnat 13.2.0
riscv64 gnat 13.3.0
riscv64 gnat 13.4.0
riscv64 gnat 14.1.0
riscv64 gnat 14.2.0
riscv64 gnat 14.3.0
riscv64 gnat 15.1.0
riscv64 gnat 15.2.0
sparc gnat 12.2.0
sparc gnat 12.3.0
sparc gnat 12.4.0
sparc gnat 12.5.0
sparc gnat 13.1.0
sparc gnat 13.2.0
sparc gnat 13.3.0
sparc gnat 13.4.0
sparc gnat 14.1.0
sparc gnat 14.2.0
sparc gnat 14.3.0
sparc gnat 15.1.0
sparc gnat 15.2.0
sparc leon gnat 13.1.0
sparc leon gnat 13.2.0
sparc leon gnat 13.3.0
sparc leon gnat 13.4.0
sparc leon gnat 14.1.0
sparc leon gnat 14.2.0
sparc leon gnat 14.3.0
sparc64 gnat 12.2.0
sparc64 gnat 12.3.0
sparc64 gnat 12.4.0
sparc64 gnat 12.5.0
sparc64 gnat 13.1.0
sparc64 gnat 13.2.0
sparc64 gnat 13.3.0
sparc64 gnat 13.4.0
sparc64 gnat 14.1.0
sparc64 gnat 14.2.0
sparc64 gnat 14.3.0
sparc64 gnat 15.1.0
sparc64 gnat 15.2.0
x86-64 gnat (trunk)
x86-64 gnat 10.2
x86-64 gnat 10.4
x86-64 gnat 10.4 (assertions)
x86-64 gnat 10.5
x86-64 gnat 10.5 (assertions)
x86-64 gnat 11.1
x86-64 gnat 11.1 (assertions)
x86-64 gnat 11.2
x86-64 gnat 11.2 (assertions)
x86-64 gnat 11.3
x86-64 gnat 11.3 (assertions)
x86-64 gnat 11.4
x86-64 gnat 11.4 (assertions)
x86-64 gnat 12.1
x86-64 gnat 12.1 (assertions)
x86-64 gnat 12.2
x86-64 gnat 12.2 (assertions)
x86-64 gnat 12.3
x86-64 gnat 12.3 (assertions)
x86-64 gnat 12.4
x86-64 gnat 12.4 (assertions)
x86-64 gnat 12.5
x86-64 gnat 12.5 (assertions)
x86-64 gnat 13.1
x86-64 gnat 13.1 (assertions)
x86-64 gnat 13.2
x86-64 gnat 13.2 (assertions)
x86-64 gnat 13.3
x86-64 gnat 13.3 (assertions)
x86-64 gnat 13.4
x86-64 gnat 13.4 (assertions)
x86-64 gnat 14.1
x86-64 gnat 14.1 (assertions)
x86-64 gnat 14.2
x86-64 gnat 14.2 (assertions)
x86-64 gnat 14.3
x86-64 gnat 14.3 (assertions)
x86-64 gnat 15.1
x86-64 gnat 15.1 (assertions)
x86-64 gnat 15.2
x86-64 gnat 15.2 (assertions)
x86-64 gnat 8.2
x86-64 gnat 9.5
Options
Source code
-- sarge.ads - Specification file for the Sarge command line argument parser project. -- 2019/04/10, Maya Posch with Ada.Strings.Unbounded; use Ada.Strings.Unbounded; with Ada.Containers.Vectors; with Ada.Containers.Indefinite_Ordered_Maps; use Ada.Containers; package Sarge is type Argument is record arg_short: aliased Unbounded_String; arg_long: aliased Unbounded_String; description: aliased Unbounded_String; hasValue: aliased boolean := False; value: aliased Unbounded_String; parsed: aliased boolean := False; end record; type Argument_Access is access all Argument; procedure setArgument(arg_short: in Unbounded_String; arg_long: in Unbounded_String; desc: in Unbounded_String; hasVal: in boolean); procedure setPermissive(value: boolean); procedure setDescription(desc: in Unbounded_String); procedure setUsage(usage: in Unbounded_String); function parseArguments return boolean; function getFlag(arg_flag: in Unbounded_String; arg_value: out Unbounded_String) return boolean; function exists(arg_flag: in Unbounded_String) return boolean; function getTextArgument(index: in Integer; value: out Unbounded_String) return boolean; procedure printHelp; function flagCount return integer; function executableName return Unbounded_String; private function "+"(S : in String) return Unbounded_String renames Ada.Strings.Unbounded.To_Unbounded_String; package arg_vector is new Vectors(Natural, Argument); args : arg_vector.vector; --package argNames_map is new Indefinite_Ordered_Maps(Unbounded_String, Argument_Access); package argNames_map is new Indefinite_Ordered_Maps(Unbounded_String, Natural); argNames : argNames_map.map; parsed : boolean; flagCounter : Integer := 0; execName : Unbounded_String; description : Unbounded_String; usageStr : Unbounded_String; package tArgVector is new Vectors(Natural, Unbounded_String); textArguments : tArgVector.vector; permissive : boolean := false; end Sarge;
ada source #1
Output
Compile to binary object
Link to binary
Execute the code
Intel asm syntax
Demangle identifiers
Verbose demangling
Filters
Unused labels
Library functions
Directives
Comments
Horizontal whitespace
Debug intrinsics
Compiler
S390X GNAT 11.2.0
S390X GNAT 12.1.0
S390X GNAT 12.2.0
S390X GNAT 12.3.0
S390X GNAT 12.4.0
S390X GNAT 12.5.0
S390X GNAT 13.1.0
S390X GNAT 13.2.0
S390X GNAT 13.3.0
S390X GNAT 13.4.0
S390X GNAT 14.1.0
S390X GNAT 14.2.0
S390X GNAT 14.3.0
S390X GNAT 15.1.0
S390X GNAT 15.2.0
arm gnat 10.3.0-2 (Alire)
arm gnat 11.2.0-3 (Alire)
arm gnat 13.1.0
arm gnat 13.2.0
arm gnat 13.3.0
arm gnat 13.4.0
arm gnat 14.1.0
arm gnat 14.2.0
arm gnat 14.3.0
arm gnat 15.1.0
arm gnat 15.2.0
arm64 gnat 12.1.0
arm64 gnat 12.2.0
arm64 gnat 12.3.0
arm64 gnat 12.4.0
arm64 gnat 12.5.0
arm64 gnat 13.1.0
arm64 gnat 13.2.0
arm64 gnat 13.3.0
arm64 gnat 13.4.0
arm64 gnat 14.1.0
arm64 gnat 14.2.0
arm64 gnat 14.3.0
arm64 gnat 15.1.0
arm64 gnat 15.2.0
hppa gnat 14.2.0
hppa gnat 14.3.0
hppa gnat 15.1.0
hppa gnat 15.2.0
loongarch64 gnat 14.1.0
loongarch64 gnat 14.2.0
loongarch64 gnat 14.3.0
loongarch64 gnat 15.1.0
loongarch64 gnat 15.2.0
mips gnat 11.2.0
mips gnat 12.1.0
mips gnat 12.2.0
mips gnat 12.3.0
mips gnat 12.4.0
mips gnat 12.5.0
mips gnat 13.1.0
mips gnat 13.2.0
mips gnat 13.3.0
mips gnat 13.4.0
mips gnat 14.1.0
mips gnat 14.2.0
mips gnat 14.3.0
mips gnat 15.1.0
mips gnat 15.2.0
mips64 gnat 11.2.0
mips64 gnat 12.1.0
mips64 gnat 12.2.0
mips64 gnat 12.3.0
mips64 gnat 12.4.0
mips64 gnat 12.5.0
mips64 gnat 13.1.0
mips64 gnat 13.2.0
mips64 gnat 13.3.0
mips64 gnat 13.4.0
mips64 gnat 14.1.0
mips64 gnat 14.2.0
mips64 gnat 14.3.0
mips64 gnat 15.1.0
mips64 gnat 15.2.0
powerpc gnat 11.2.0
powerpc gnat 12.1.0
powerpc gnat 12.2.0
powerpc gnat 12.3.0
powerpc gnat 12.4.0
powerpc gnat 12.5.0
powerpc gnat 13.1.0
powerpc gnat 13.2.0
powerpc gnat 13.3.0
powerpc gnat 13.4.0
powerpc gnat 14.1.0
powerpc gnat 14.2.0
powerpc gnat 14.3.0
powerpc gnat 15.1.0
powerpc gnat 15.2.0
powerpc64 gnat 11.2.0
powerpc64 gnat 12.1.0
powerpc64 gnat 12.2.0
powerpc64 gnat 12.3.0
powerpc64 gnat 12.4.0
powerpc64 gnat 12.5.0
powerpc64 gnat 13.1.0
powerpc64 gnat 13.2.0
powerpc64 gnat 13.3.0
powerpc64 gnat 13.4.0
powerpc64 gnat 14.1.0
powerpc64 gnat 14.2.0
powerpc64 gnat 14.3.0
powerpc64 gnat 15.1.0
powerpc64 gnat 15.2.0
powerpc64 gnat trunk
powerpc64le gnat 11.2.0
powerpc64le gnat 12.1.0
powerpc64le gnat 12.2.0
powerpc64le gnat 12.3.0
powerpc64le gnat 12.4.0
powerpc64le gnat 12.5.0
powerpc64le gnat 13.1.0
powerpc64le gnat 13.2.0
powerpc64le gnat 13.3.0
powerpc64le gnat 13.4.0
powerpc64le gnat 14.1.0
powerpc64le gnat 14.2.0
powerpc64le gnat 14.3.0
powerpc64le gnat 15.1.0
powerpc64le gnat 15.2.0
powerpc64le gnat trunk
riscv64 gnat 10.3.0-2 (Alire)
riscv64 gnat 11.2.0-3 (Alire)
riscv64 gnat 12.3.0
riscv64 gnat 12.4.0
riscv64 gnat 12.5.0
riscv64 gnat 13.1.0
riscv64 gnat 13.2.0
riscv64 gnat 13.3.0
riscv64 gnat 13.4.0
riscv64 gnat 14.1.0
riscv64 gnat 14.2.0
riscv64 gnat 14.3.0
riscv64 gnat 15.1.0
riscv64 gnat 15.2.0
sparc gnat 12.2.0
sparc gnat 12.3.0
sparc gnat 12.4.0
sparc gnat 12.5.0
sparc gnat 13.1.0
sparc gnat 13.2.0
sparc gnat 13.3.0
sparc gnat 13.4.0
sparc gnat 14.1.0
sparc gnat 14.2.0
sparc gnat 14.3.0
sparc gnat 15.1.0
sparc gnat 15.2.0
sparc leon gnat 13.1.0
sparc leon gnat 13.2.0
sparc leon gnat 13.3.0
sparc leon gnat 13.4.0
sparc leon gnat 14.1.0
sparc leon gnat 14.2.0
sparc leon gnat 14.3.0
sparc64 gnat 12.2.0
sparc64 gnat 12.3.0
sparc64 gnat 12.4.0
sparc64 gnat 12.5.0
sparc64 gnat 13.1.0
sparc64 gnat 13.2.0
sparc64 gnat 13.3.0
sparc64 gnat 13.4.0
sparc64 gnat 14.1.0
sparc64 gnat 14.2.0
sparc64 gnat 14.3.0
sparc64 gnat 15.1.0
sparc64 gnat 15.2.0
x86-64 gnat (trunk)
x86-64 gnat 10.2
x86-64 gnat 10.4
x86-64 gnat 10.4 (assertions)
x86-64 gnat 10.5
x86-64 gnat 10.5 (assertions)
x86-64 gnat 11.1
x86-64 gnat 11.1 (assertions)
x86-64 gnat 11.2
x86-64 gnat 11.2 (assertions)
x86-64 gnat 11.3
x86-64 gnat 11.3 (assertions)
x86-64 gnat 11.4
x86-64 gnat 11.4 (assertions)
x86-64 gnat 12.1
x86-64 gnat 12.1 (assertions)
x86-64 gnat 12.2
x86-64 gnat 12.2 (assertions)
x86-64 gnat 12.3
x86-64 gnat 12.3 (assertions)
x86-64 gnat 12.4
x86-64 gnat 12.4 (assertions)
x86-64 gnat 12.5
x86-64 gnat 12.5 (assertions)
x86-64 gnat 13.1
x86-64 gnat 13.1 (assertions)
x86-64 gnat 13.2
x86-64 gnat 13.2 (assertions)
x86-64 gnat 13.3
x86-64 gnat 13.3 (assertions)
x86-64 gnat 13.4
x86-64 gnat 13.4 (assertions)
x86-64 gnat 14.1
x86-64 gnat 14.1 (assertions)
x86-64 gnat 14.2
x86-64 gnat 14.2 (assertions)
x86-64 gnat 14.3
x86-64 gnat 14.3 (assertions)
x86-64 gnat 15.1
x86-64 gnat 15.1 (assertions)
x86-64 gnat 15.2
x86-64 gnat 15.2 (assertions)
x86-64 gnat 8.2
x86-64 gnat 9.5
Options
Source code
pragma Source_File_Name (Sarge_Test, Body_File_Name => "example.adb"); with Sarge; with Ada.Text_IO; use Ada.Text_IO; with Ada.Strings.Unbounded; use Ada.Strings.Unbounded; with Ada.Strings.Unbounded.Text_IO; use Ada.Strings.Unbounded.Text_IO; procedure Sarge_Test is function "+"(S : in String) return Unbounded_String renames Ada.Strings.Unbounded.To_Unbounded_String; kittens: Unbounded_String; number: Unbounded_String; textarg: Unbounded_String; begin -- Create Sarge instance, set stuff, parse stuff. Sarge.setArgument(+"h", +"help", +"Get help.", False); Sarge.setArgument(+"k", +"kittens", +"K is for kittens. Everyone needs kittens in their life.", True); Sarge.setArgument(+"n", +"number", +"Gimme a number. Any number.", True); Sarge.setArgument(+"a", +"apple", +"Just an apple.", False); Sarge.setArgument(+"b", +"bear", +"Look, it's a bear.", False); Sarge.setArgument(+"", +"snake", +"Snakes only come in long form, there are no short snakes.", False); Sarge.setDescription(+"Sarge command line argument parsing testing app. For demonstration purposes and testing."); Sarge.setUsage(+"sarge_test <options>"); if Sarge.parseArguments /= True then put_line("Couldn't parse arguments..."); return; end if; put_line("Number of flags found: " & Sarge.flagCount'Image); if Sarge.exists(+"help") /= False then Sarge.printHelp; else put_line("No help requested..."); end if; -- Read out Kittens and Number. if Sarge.getFlag(+"kittens", kittens) = True then put_line("Got kittens: " & kittens); end if; if Sarge.getFlag(+"number", number) = True then put_line("Got number: " & number); end if; if Sarge.getTextArgument(0, textarg) = True then put_line("Got text argument: " & textarg); end if; end Sarge_Test;
ada source #3
Output
Compile to binary object
Link to binary
Execute the code
Intel asm syntax
Demangle identifiers
Verbose demangling
Filters
Unused labels
Library functions
Directives
Comments
Horizontal whitespace
Debug intrinsics
Compiler
S390X GNAT 11.2.0
S390X GNAT 12.1.0
S390X GNAT 12.2.0
S390X GNAT 12.3.0
S390X GNAT 12.4.0
S390X GNAT 12.5.0
S390X GNAT 13.1.0
S390X GNAT 13.2.0
S390X GNAT 13.3.0
S390X GNAT 13.4.0
S390X GNAT 14.1.0
S390X GNAT 14.2.0
S390X GNAT 14.3.0
S390X GNAT 15.1.0
S390X GNAT 15.2.0
arm gnat 10.3.0-2 (Alire)
arm gnat 11.2.0-3 (Alire)
arm gnat 13.1.0
arm gnat 13.2.0
arm gnat 13.3.0
arm gnat 13.4.0
arm gnat 14.1.0
arm gnat 14.2.0
arm gnat 14.3.0
arm gnat 15.1.0
arm gnat 15.2.0
arm64 gnat 12.1.0
arm64 gnat 12.2.0
arm64 gnat 12.3.0
arm64 gnat 12.4.0
arm64 gnat 12.5.0
arm64 gnat 13.1.0
arm64 gnat 13.2.0
arm64 gnat 13.3.0
arm64 gnat 13.4.0
arm64 gnat 14.1.0
arm64 gnat 14.2.0
arm64 gnat 14.3.0
arm64 gnat 15.1.0
arm64 gnat 15.2.0
hppa gnat 14.2.0
hppa gnat 14.3.0
hppa gnat 15.1.0
hppa gnat 15.2.0
loongarch64 gnat 14.1.0
loongarch64 gnat 14.2.0
loongarch64 gnat 14.3.0
loongarch64 gnat 15.1.0
loongarch64 gnat 15.2.0
mips gnat 11.2.0
mips gnat 12.1.0
mips gnat 12.2.0
mips gnat 12.3.0
mips gnat 12.4.0
mips gnat 12.5.0
mips gnat 13.1.0
mips gnat 13.2.0
mips gnat 13.3.0
mips gnat 13.4.0
mips gnat 14.1.0
mips gnat 14.2.0
mips gnat 14.3.0
mips gnat 15.1.0
mips gnat 15.2.0
mips64 gnat 11.2.0
mips64 gnat 12.1.0
mips64 gnat 12.2.0
mips64 gnat 12.3.0
mips64 gnat 12.4.0
mips64 gnat 12.5.0
mips64 gnat 13.1.0
mips64 gnat 13.2.0
mips64 gnat 13.3.0
mips64 gnat 13.4.0
mips64 gnat 14.1.0
mips64 gnat 14.2.0
mips64 gnat 14.3.0
mips64 gnat 15.1.0
mips64 gnat 15.2.0
powerpc gnat 11.2.0
powerpc gnat 12.1.0
powerpc gnat 12.2.0
powerpc gnat 12.3.0
powerpc gnat 12.4.0
powerpc gnat 12.5.0
powerpc gnat 13.1.0
powerpc gnat 13.2.0
powerpc gnat 13.3.0
powerpc gnat 13.4.0
powerpc gnat 14.1.0
powerpc gnat 14.2.0
powerpc gnat 14.3.0
powerpc gnat 15.1.0
powerpc gnat 15.2.0
powerpc64 gnat 11.2.0
powerpc64 gnat 12.1.0
powerpc64 gnat 12.2.0
powerpc64 gnat 12.3.0
powerpc64 gnat 12.4.0
powerpc64 gnat 12.5.0
powerpc64 gnat 13.1.0
powerpc64 gnat 13.2.0
powerpc64 gnat 13.3.0
powerpc64 gnat 13.4.0
powerpc64 gnat 14.1.0
powerpc64 gnat 14.2.0
powerpc64 gnat 14.3.0
powerpc64 gnat 15.1.0
powerpc64 gnat 15.2.0
powerpc64 gnat trunk
powerpc64le gnat 11.2.0
powerpc64le gnat 12.1.0
powerpc64le gnat 12.2.0
powerpc64le gnat 12.3.0
powerpc64le gnat 12.4.0
powerpc64le gnat 12.5.0
powerpc64le gnat 13.1.0
powerpc64le gnat 13.2.0
powerpc64le gnat 13.3.0
powerpc64le gnat 13.4.0
powerpc64le gnat 14.1.0
powerpc64le gnat 14.2.0
powerpc64le gnat 14.3.0
powerpc64le gnat 15.1.0
powerpc64le gnat 15.2.0
powerpc64le gnat trunk
riscv64 gnat 10.3.0-2 (Alire)
riscv64 gnat 11.2.0-3 (Alire)
riscv64 gnat 12.3.0
riscv64 gnat 12.4.0
riscv64 gnat 12.5.0
riscv64 gnat 13.1.0
riscv64 gnat 13.2.0
riscv64 gnat 13.3.0
riscv64 gnat 13.4.0
riscv64 gnat 14.1.0
riscv64 gnat 14.2.0
riscv64 gnat 14.3.0
riscv64 gnat 15.1.0
riscv64 gnat 15.2.0
sparc gnat 12.2.0
sparc gnat 12.3.0
sparc gnat 12.4.0
sparc gnat 12.5.0
sparc gnat 13.1.0
sparc gnat 13.2.0
sparc gnat 13.3.0
sparc gnat 13.4.0
sparc gnat 14.1.0
sparc gnat 14.2.0
sparc gnat 14.3.0
sparc gnat 15.1.0
sparc gnat 15.2.0
sparc leon gnat 13.1.0
sparc leon gnat 13.2.0
sparc leon gnat 13.3.0
sparc leon gnat 13.4.0
sparc leon gnat 14.1.0
sparc leon gnat 14.2.0
sparc leon gnat 14.3.0
sparc64 gnat 12.2.0
sparc64 gnat 12.3.0
sparc64 gnat 12.4.0
sparc64 gnat 12.5.0
sparc64 gnat 13.1.0
sparc64 gnat 13.2.0
sparc64 gnat 13.3.0
sparc64 gnat 13.4.0
sparc64 gnat 14.1.0
sparc64 gnat 14.2.0
sparc64 gnat 14.3.0
sparc64 gnat 15.1.0
sparc64 gnat 15.2.0
x86-64 gnat (trunk)
x86-64 gnat 10.2
x86-64 gnat 10.4
x86-64 gnat 10.4 (assertions)
x86-64 gnat 10.5
x86-64 gnat 10.5 (assertions)
x86-64 gnat 11.1
x86-64 gnat 11.1 (assertions)
x86-64 gnat 11.2
x86-64 gnat 11.2 (assertions)
x86-64 gnat 11.3
x86-64 gnat 11.3 (assertions)
x86-64 gnat 11.4
x86-64 gnat 11.4 (assertions)
x86-64 gnat 12.1
x86-64 gnat 12.1 (assertions)
x86-64 gnat 12.2
x86-64 gnat 12.2 (assertions)
x86-64 gnat 12.3
x86-64 gnat 12.3 (assertions)
x86-64 gnat 12.4
x86-64 gnat 12.4 (assertions)
x86-64 gnat 12.5
x86-64 gnat 12.5 (assertions)
x86-64 gnat 13.1
x86-64 gnat 13.1 (assertions)
x86-64 gnat 13.2
x86-64 gnat 13.2 (assertions)
x86-64 gnat 13.3
x86-64 gnat 13.3 (assertions)
x86-64 gnat 13.4
x86-64 gnat 13.4 (assertions)
x86-64 gnat 14.1
x86-64 gnat 14.1 (assertions)
x86-64 gnat 14.2
x86-64 gnat 14.2 (assertions)
x86-64 gnat 14.3
x86-64 gnat 14.3 (assertions)
x86-64 gnat 15.1
x86-64 gnat 15.1 (assertions)
x86-64 gnat 15.2
x86-64 gnat 15.2 (assertions)
x86-64 gnat 8.2
x86-64 gnat 9.5
Options
Source code
-- sarge.adb - Implementation file for the Sarge command line argument parser project. -- 2019/04/10, Maya Posch with Ada.Command_Line; with Ada.Text_IO; use Ada.Text_IO; with Ada.Strings.Unbounded.Text_IO; use Ada.Strings.Unbounded.Text_IO; package body Sarge is --- SET ARGUMENT --- procedure setArgument(arg_short: in Unbounded_String; arg_long: in Unbounded_String; desc: in Unbounded_String; hasVal: in boolean) is arg: aliased Argument := (arg_short => arg_short, arg_long => arg_long, description => desc, hasValue => hasVal, value => +"", parsed => False); begin args.append(arg); -- Set up links. if length(arg_short) > 0 then argNames.include(arg_short, args.Last_Index); end if; if length(arg_long) > 0 then argNames.include(arg_long, args.Last_Index); end if; end setArgument; --- SET PERMISSIVE --- procedure setPermissive(value: boolean) is begin permissive := value; end setPermissive; --- SET DESCRIPTION --- procedure setDescription(desc: in Unbounded_String) is begin description := desc; end setDescription; --- SET USAGE --- procedure setUsage(usage: in Unbounded_String) is begin usageStr := usage; end setUsage; --- PARSE ARGUMENTS --- function parseArguments return boolean is flag_it: argNames_map.Cursor; expectValue: boolean := False; arg: Unbounded_String; short_arg: Unbounded_String; begin -- execName := +Ada.Command_Line.command_name; for arg_i in 1..Ada.Command_Line.argument_count loop arg := +Ada.Command_Line.Argument(arg_i); -- Each flag will start with a '-' character. Multiple flags can be joined together in -- the same string if they're the short form flag type (one character per flag). if expectValue = True then -- Copy value. args.Reference(argNames_map.Element(flag_it)).value := arg; expectValue := False; elsif Ada.Strings.Unbounded.Slice(arg, 1, 1) = "-" then if permissive = false and textArguments.Length > 0 then put_line("Flags not allowed after text arguments."); return False; end if; -- Parse flag. -- First check for the long form. if Ada.Strings.Unbounded.Slice(arg, 1, 2) = "--" then -- Long form of the flag. -- First delete the preceding dashes. arg := Ada.Strings.Unbounded.Delete(arg, 1, 2); if not argNames.contains(arg) then if permissive = true then goto Continue; end if; -- Flag wasn't found. Abort. Ada.Strings.Unbounded.Text_IO.put_line("Long flag " & arg & " wasn't found"); return False; end if; -- Mark as found. flag_it := argNames.find(arg); args(argNames_map.Element(flag_it)).parsed := True; flagCounter := flagCounter + 1; if args(argNames_map.Element(flag_it)).hasValue = True then expectValue := True; end if; else -- Parse short form flag. Parse all of them sequentially. Only the last one -- is allowed to have an additional value following it. -- First delete the preceding dash. arg := Ada.Strings.Unbounded.Delete(arg, 1, 1); for i in 1 .. Ada.Strings.Unbounded.Length(arg) loop Ada.Strings.Unbounded.Append(short_arg, Ada.Strings.Unbounded.Element(arg, i)); if argNames_map.Contains(argNames, short_arg) /= True then if permissive = true then goto Continue; end if; -- Flag wasn't found. Abort. put_line("Short flag " & short_arg & " wasn't found."); return False; end if; flag_it := argNames.find(short_arg); -- Mark as found. args(argNames_map.Element(flag_it)).parsed := True; flagCounter := flagCounter + 1; if args(argNames_map.Element(flag_it)).hasValue = True then if i /= (Ada.Strings.Unbounded.Length(arg)) then -- Flag isn't at end, thus cannot have value. put_line("Flag " & short_arg & " needs to be followed by a value string."); return False; else expectValue := True; end if; end if; Ada.Strings.Unbounded.Delete(short_arg, 1, 1); end loop; end if; else -- Add to text argument vector. textArguments.append(arg); end if; <<Continue>> end loop; parsed := True; return True; end parseArguments; --- GET FLAG --- function getFlag(arg_flag: in Unbounded_String; arg_value: out Unbounded_String) return boolean is flag_it: argNames_map.Cursor; use argNames_map; begin if parsed /= True then return False; end if; flag_it := argNames.find(arg_flag); if flag_it = argNames_map.No_Element then return False; elsif args(argNames_map.Element(flag_it)).parsed /= True then return False; end if; if args(argNames_map.Element(flag_it)).hasValue = True then arg_value := args(argNames_map.Element(flag_it)).value; end if; return True; end getFlag; --- EXISTS --- function exists(arg_flag: in Unbounded_String) return boolean is flag_it: argNames_map.Cursor; use argNames_map; begin if parsed /= True then return False; end if; flag_it := argNames.find(arg_flag); if flag_it = argNames_map.No_Element then return False; elsif args(argNames_map.Element(flag_it)).parsed /= True then return False; end if; return True; end exists; --- GET TEXT ARGUMENT --- function getTextArgument(index: in Integer; value: out Unbounded_String) return boolean is begin if index < Integer(tArgVector.length(textArguments)) then value := textArguments(index); return True; end if; return False; end getTextArgument; --- PRINT HELP --- procedure printHelp is count: Integer := 1; spaceCnt: Integer; begin put_line(""); put_line(description); put_line("Usage:"); put_line(usageStr); put_line(""); put_line("Options:"); -- Determine whitespace needed between arg_long and description. for flag in args.Iterate loop if Integer(Ada.Strings.Unbounded.length(args(flag).arg_long)) > count then count := Integer(Ada.Strings.Unbounded.length(args(flag).arg_long)); end if; end loop; count := count + 3; -- Number of actual spaces between the longest arg_long and description. -- Print out the options. for opt in args.Iterate loop --spaceStr := Unbound_String(count - Ada.Strings.Unbounded.length(args(opt).arg_long) spaceCnt := (count - Integer(Ada.Strings.Unbounded.length(args(opt).arg_long))); if Ada.Strings.Unbounded.length(args(opt).arg_short) < 1 then Ada.Strings.Unbounded.Text_IO.put_line(" " & args(opt).arg_short & "--" & args(opt).arg_long & spaceCnt * " " & args(opt).description); else Ada.Strings.Unbounded.Text_IO.put_line("-" & args(opt).arg_short & ", --" & args(opt).arg_long & spaceCnt * " " & args(opt).description); end if; end loop; end printHelp; --- FLAG COUNT --- function flagCount return integer is begin return flagCounter; end flagCount; --- EXECUTABLE NAME --- function executableName return Unbounded_String is begin return execName; end executableName; end Sarge;
Become a Patron
Sponsor on GitHub
Donate via PayPal
Compiler Explorer Shop
Source on GitHub
Mailing list
Installed libraries
Wiki
Report an issue
How it works
Contact the author
CE on Mastodon
CE on Bluesky
Statistics
Changelog
Version tree