Softanza
DémarrerEnglish
Softanza
Recherche · narration

Softanza's System Call : Built on the System Process API

Haro's native system() function works well for cross-platform command execution. Softanza enhances this foundation through stzsystem() function and stzSystemCall class , leveraging the Softanza Engine's system process API for:

par Mansour Ayouni · dans le dépôt depuis le 2025-12-07 · tutoriel · domaine Programmation système

Cet article est écrit en anglais, comme la bibliothèque.

Motivation

  • Performance: Optimized process management and I/O handling
  • Configurability: Fine-grained control over execution, timeouts, and output capture
  • Programmer Experience: Natural syntax, automatic shell handling, and rich error information

Core Enhancement: Natural Command Syntax

stzsystem() accepts commands as you'd type them in a terminal:

Haro
? stzsystem("echo Hello")           #--> Hello
? stzsystem("dir systest/")         #--> (file listing)
? stzsystem("date /t")              #--> Current date

illustration

Automatic Shell Intelligence Detects when commands need shell interpretation (pipes, redirects, operators) and wraps appropriately:

Haro
? stzsystem("dir | findstr .txt")   # Auto: cmd.exe /c
? stzsystem("echo test && dir")     # Chains work seamlessly

illustration

Path Flexibility Forward or backslashes work on any OS, with smart flag preservation:

Haro
? stzsystem("dir systest/")         # / → \ on Windows
? stzsystem("date /t")              # /t flag preserved

illustration

Return Type Specification Append @RETURN:type to automatically convert output to the desired type:

Haro
# String output (default)
? stzsystem("echo test")
#--> "test"

# List output - splits into lines
oCall = new stzSystemCall("dir /B @RETURN:list")
oCall.Run()
? oCall.Output()
#--> ["file1.txt", "file2.txt", "folder"]

# Number output - extracts first numeric value
oCall = new stzSystemCall("echo 42 @RETURN:number")
oCall.Run()
? oCall.Output()
#--> 42

illustration

The uppercase @RETURN: keyword is visually distinct from the command string, making intent clear at a glance.

Advanced Control: The stzSystemCall Class

For complex scenarios requiring configuration:

Haro
oCall = new stzSystemCall("systeminfo")
oCall {
    SetTimeout(5000)
    HideConsole()
    CaptureOutput()
    Run()
    
    ? "Success: " + Succeeded()
    ? "Data: " + Output()
    ? "Exit code: " + ExitCode()
}

illustration

Execution Control

Haro
oCall = StzSystemCallQ("long-task")
oCall {
    SetTimeout(30000)      # 30 seconds
    ShowConsole()          # Visible progress
    DontCaptureError()     # Ignore stderr
    Run()
}

illustration

Parameter Templates

Haro
oCall = new stzSystemCall(Sys(:CopyFile))
oCall.SetParams([
    [:source, "file1.txt"],
    [:dest, "backup/file1.txt"]
])
oCall.Run()

illustration

Reusable Objects

Haro
oCall = new stzSystemCall("cmd.exe")

# First task
oCall.SetArgs(["/c", "echo", "Task 1"])
oCall.Run()

# Reset and reuse
oCall.Reset()
oCall.SetArgs(["/c", "dir"])
oCall.Run()

illustration

Cross-Platform Abstraction: Sys() Commands

stzSystemCallData.ring provides 30+ unified commands that work identically across Windows, macOS, and Linux, and callable simply by the small Sys(:Command) function:

Haro
# Same code, any OS
? stzsystem(Sys(:CurrentDir))       #--> /home/user or C:\Users\...
? stzsystem(Sys(:SystemInfo))       #--> Platform-appropriate details

oCall = new stzSystemCall(Sys(:ListFiles))
oCall.Run()
acFiles = oCall.Output()            #--> Auto-typed as list

illustration

Each Sys() command includes:

  • Platform-specific implementations
  • Parameter definitions
  • Return type annotations
  • Human-readable descriptions

Type-Aware Returns

Sys() commands include @RETURN: internally so the output is returned automatically in the correct type: :

Haro
# Returns list
oCall = new stzSystemCall(Sys(:ListFiles))
oCall.Run()
acFiles = oCall.Output()  # Already a list

# Returns number
oCall = new stzSystemCall(Sys(:CountLines))
oCall.SetParam(:file, "data.txt")
oCall.Run()
nLines = oCall.Output()   # Already a number

illustration

Rich Error Information

Haro
oCall = StzSystemCallQ("cmd.exe")
oCall.WithArgs(["/c", "type", "missing.txt"])
oCall.Run()

? oCall.Succeeded()     #--> FALSE
? oCall.Failed()        #--> TRUE
? oCall.ExitCode()      #--> 1
? oCall.Error()         #--> Full error message
? oCall.HasOutput()     #--> TRUE/FALSE

illustration

Technical Implementation

Shell Detection (UseShellIfNeeded())

  • Scans for operators: |, >, <, &&, ||, &
  • Recognizes 40+ built-in commands (echo, cd, if, for, etc.)
  • Wraps in cmd.exe /c (Windows) or sh -c (Unix) when needed

Path Normalization (NormalizePathsInCommand())

  • Converts path separators contextually
  • Preserves command flags (/t, /s, /b)
  • OS-aware transformation

System Process API Benefits

  • Efficient process lifecycle management
  • Asynchronous I/O with timeout control
  • Separate stdout/stderr capture
  • Environment variable handling

Fluent API Design

Method chaining for readable configuration:

Haro
StzSystemCallQ("git").
    WithArgsQ(["status"]).
    SetTimeoutQ(5000).
    HideConsoleQ().
    RunQ().
    Output()

illustration

Usage Patterns

Quick one-liners:

Haro
? stzsystem("whoami")

illustration

Configured execution:

Haro
oCall = new stzSystemCall("ffmpeg")
oCall.SetArgs(["-i", "video.mp4", "output.avi"])
oCall.SetTimeout(60000)
oCall.Run()

illustration

Silent background tasks:

Haro
StzSystemCallQ("backup-script").RunSilently()

illustration

Platform-agnostic operations:

Haro
oCall = new stzSystemCall(Sys(:MakeDir))
oCall.SetParam(:path, "project/logs")
oCall.Run()

illustration

Extensibility

Add custom commands to $aStzSystemCommands:

Haro
$aStzSystemCommands + [
    :GitStatus = [
        :windows = ["git", ["status"]],
        :unix = ["git", ["status"]],
        :description = "Check git repository status",
        :ReturnType = "string"
    ]
]

illustration

Summary

Softanza augments Haro's system interaction with:

  • Natural command syntax with automatic shell handling
  • Comprehensive execution control and configuration
  • Type-safe, cross-platform command abstractions
  • Rich error handling and output management
  • Engine-powered performance and reliability

The three-layer approach serves different needs: stzsystem() for simplicity, stzSystemCall for control, and Sys() for portability.

Citer

Mansour Ayouni. « Softanza's System Call : Built on the System Process API ». Softanza narrations, 2025. https://mayouni.github.io/stzsite/fr/narrations/stzsystemcalldoc.html

Non exécuté : son code touche aux fichiers, au réseau, à l'horloge ou au hasard. L'article est publié tel qu'il est écrit ; ses blocs sont des illustrations. Le code des articles est du code Haro. Là où un article a été écrit avant que la langue prenne son nom actuel, le nom a été changé et rien d'autre. Genre, domaine et série lus dans le nom du fichier, année tirée du premier commit : dérivés, jusqu'à ce que l'article porte son propre en-tête. Le fichier sur GitHub(s'ouvre dans un nouvel onglet)