Skip to content

Instantly share code, notes, and snippets.

@dgv
Created January 11, 2012 05:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dgv/1593205 to your computer and use it in GitHub Desktop.
Save dgv/1593205 to your computer and use it in GitHub Desktop.
spark lines for your shell - spark of @holman in free pascal
{
spark lines for your shell - for free pascal
based: https://github.com/holman/spark
$Spark: spark.lpr,v 1.0 2012/01/03 14:11:02 dgvargas Exp $
}
program spark;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, SysUtils, CustApp, StrUtils, Pipes
{ you can add units after this };
type
{ TSpark }
TSpark = class(TCustomApplication)
protected
procedure DoRun; override;
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
procedure WriteHelp; virtual;
end;
{ TSpark }
procedure TSpark.DoRun;
function Occurrences(const Substring, Text: string): integer;
var
offset: integer;
begin
result := 0;
offset := PosEx(Substring, Text, 1);
while offset <> 0 do
begin
inc(result);
offset := PosEx(Substring, Text, offset + length(Substring));
end;
end;
const
Ticks : array[0..7] of string = ('▁','▂','▃','▄','▅','▆','▇','█');
var
ErrorMsg, params_line, string_number: String;
i,f,n: integer;
min, max: longword;
numbers: array of longword;
begin
// quick check parameters
ErrorMsg:=CheckOptions('h','help');
if ErrorMsg<>'' then begin
ShowException(Exception.Create(ErrorMsg));
Terminate;
Exit;
end;
// parse parameters
if HasOption('h','help') or (ParamCount=0) then begin
WriteHelp;
Terminate;
Exit;
end;
if (ParamCount=1) then begin
setlength(numbers,(Occurrences(',',Params[1])+1));
params_line:=StringReplace(Params[1],',',' ',[rfReplaceAll]);
end
else
begin
setlength(numbers,ParamCount);
for n:=1 to ParamCount do begin
params_line:= params_line+ Params[n]+' ';
end;
params_line:= copy(params_line,1,length(params_line)-1);
end;
// load numbers
i:=0;
string_number:='';
for n:=1 to length(params_line) do begin
if params_line[n]<>' ' then begin
string_number:= string_number+params_line[n];
if n = length(params_line) then
numbers[i]:= StrToQWordDef(string_number,1);
end
else
begin
numbers[i]:= StrToQWordDef(string_number,1);
string_number:= '';
inc(i);
end;
end;
// determine range
min:= $ffffffff;
max:= 0;
for n:=0 to length(numbers)-1 do begin
if (numbers[n] < min) then min:= numbers[n];
if (numbers[n] > max) then max:= numbers[n];
end;
f:= trunc(((max-min) shl 8)/(length(Ticks)-1));
if (f < 1) then f:= 1;
// print ticks
for n:=0 to length(numbers)-1 do begin
Write(Ticks[trunc(((numbers[n]-min) shl 8)/f)]);
end;
WriteLn('');
Terminate;
end;
constructor TSpark.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
StopOnException:=True;
end;
destructor TSpark.Destroy;
begin
inherited Destroy;
end;
procedure TSpark.WriteHelp;
begin
writeln(' USAGE:'#10,
' ',ExtractFileName(ExeName),' [-h] VALUE,...'#10,
' EXAMPLES:'#10,
' spark 1 5 22 13 53'#10,
' ▁▁▃▂█'#10,
' spark 0,30,55,80,33,150'#10,
' ▁▂▃▄▂█'#10);
{' echo 9 13 5 17 1 | spark'#10,
' ▄▆▂█▁'#10); pipe dont works =( }
end;
var
Application: TSpark;
{$IFDEF WINDOWS}{$R spark.rc}{$ENDIF}
{$IFDEF WINDOWS}{$R spark.rc}{$ENDIF}
begin
Application:=TSpark.Create(nil);
Application.Title:='Spark';
Application.Run;
Application.Free;
end.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment