Topics
- Core
- Core Application Framework
- Choosing an Application Design
- Writing Small Applications with Functions
- Building Event-Driven Applications
- Building Procedural Applications
- Organizing Command-Style Tools
- Composing Applications from Services
- Running as a Service or Foreground Daemon
- Adding Build Version Information
- Creating Release Packages
- Choosing an Application Design
- Writing Small Applications with Functions
- Building Event-Driven Applications
- Building Procedural Applications
- Building Command-Style Applications
- Building an Application from Parts
- Designing Application Parts
- Running Application Parts Independently
- Creating Services and Foreground Daemons
- Adding Git Version Information to Your App
- Creating Release Packages
- Registering Packages in CMake
- Configuring Release Package Contents
- Signing and Notarizing Release Packages
- Core Application Framework
- Memory
- Working with Bits and Bytes
- Reading and Writing Bit Streams
- Working with Predefined Byte-Spans
- Working with Fixed Byte Arrays
- When a Fixed Array Fits the Problem
- Inspecting Individual Bytes
- Changing Selected Bytes
- Changing Byte Ranges
- Moving a Complete Bit String or Separate Bytes
- Borrowing an Existing Range
- Copying an Exact Span into an Array
- Converting Fixed Arrays to Dynamic Byte Storage
- Choosing Byte Blocks, Buffers, and Ring Buffers
- Working with Byte Blocks
- Shared ByteBlock Storage and Copy-on-Write
- ByteBlock Ownership and Other Byte Containers
- Creating Blocks
- Byte Prefix, Suffix, Containment, and Search Operations
- Reading Individual Bytes
- Reading Native Integers
- Converting ByteBlocks to Buffers, Vectors, and Spans
- Editing and Assembling Small Blocks
- Controlling Editor Storage
- Comparing Blocks
- Byte Integer Formats Explained
- Using Byte Buffers
- Using Byte Ring Buffers
- Reading and Parsing Byte Streams
- Writing Byte Streams
- Encoding Text in Binary Byte Streams
- Designing Custom Copy-on-Write Containers
- Marking Unsafe Memory Access in Code
- Compression
- Compiled Resources
- Security Topics
- Cryptology
- Text Strings
- Text Strings Overview
- Using Strings as Everyday Values
- Understanding String Attributes
- Transforming Read-only Strings
- Editing One Working Value in Place
- Managing StringEditor Storage
- Finding Text Positions
- Slicing and Splitting Strings
- Accessing Characters and Writing Parsers
- Comparing Whole and Partial Text
- Normalizing Unicode Strings
- Working with Character Sets
- Fuzzy Matching with Edit Distance
- Using Strings
- String Attributes
- Transforming Strings
- Editing Strings in Place
- Managing StringEditor Storage
- Finding Text Positions
- Slicing and Splitting Strings
- Character Access and Parsing of Strings
- Choosing Character Iteration, Parsing, or Indexed Access
- Byte Indexes and Code-Point Indexes
- Parsing with
StringCharReader - Iterating over Decoded Characters
- Sequential Character Reading with Native Indexes
- Indexed Character Access
- Why UTF-32 Changes the Cost of Indexed Access
- Character Access Methods and Their Costs
- Comparing Whole and Partial Strings
- Normalizing Unicode Strings
- Working with Character Sets
- Fuzzy Matching with Edit Distance
- Text Strings Overview
- Text Formatting
- Text Rendering
- Text Placeholders
- Text Parsing and Encoding
- Text Parsing and Encoding Overview
- Converting Text and Scalar Values
- Recognizing Text Patterns
- Converting Strings
- Encoding Internationalized Names
- Encoding Byte Data as Base-N Text
- Writing Bytes as Base-N Text
- Reading Base-N Text into Bytes
- Parsing HTML into Documents
- Parsing Compact Named-Key Parameters
- Configuring Named-Key Parameter Lists
- Customizing Named-Key Syntax
- Data Formats
- Configuration
- Configuration Overview
- Parsing Configuration Documents
- Working with Configuration Trees
- Accessing Configuration Values
- Validating Documents with Rule Schemas
- Using Values after Validation
- Resolving Configuration Sources
- Controlling Access to Configuration Sources
- Using Placeholders in Configuration Text
- Trusting Signed Configuration Files
- Validating Configuration Signatures
- Signing Configuration Documents
- Command Line Options System
- Exceptions, Errors and Diagnostics
- Filesystem Access and Manipulation
- Random and Secrets
- Dates and Time
- Dates and Time Overview
- Working with Dates
- Working with Times
- Working with UTC Timestamps
- Choosing an Instant Type
- Constructing and Checking an Instant
- Parsing and Formatting ISO Timestamp Text
- Storing Fields and Portable Bytes
- Timestamp and DateTime Conversions and Display Zones
- Converting Epoch Counts Without Losing Meaning
- Shifting an Instant by a Fixed Interval
- Finding the Distance Between Instants
- Continuing with Calendar and Clock Tasks
- Working with DateTime Values
- Keeping an Instant and Its Display Together
- Resolving Calendar Fields
- Reading Local and UTC Fields
- Comparing Instants and Comparing Complete Values
- Changing the Display and Resolving Clock Transitions
- Reading and Writing ISO Text
- Choosing an Epoch and an External Number Format
- Applying Elapsed and Calendar Changes
- Keeping a Recurring Local Time
- Customizing ISO Date and Time Output
- Working with Whole-Second Durations
- Writing Time Values with Literals
- Working with Typed Time Amounts
- Working with Precise Time Intervals
- Customizing Time Interval Output
- Understanding Calendar Changes
- Working with Calendar and Time Parts
- Calendar Positions versus Time Quantities
- Available Parts and Their Numbering
- Constructing and Checking a Part
- Converting Calendar Labels to Zero-Based Amounts
- Finding Lengths and Valid Days
- Navigating Across Calendar Boundaries
- Finding a Weekday Occurrence
- Converting Ordinal Dates
- DateParts, TimeParts, and DateTimeParts
- Measuring Elapsed Time
- Working with Monotonic Time Points
- Keeping a Wall-Clock Time with Its Zone
- Working with Time Zones
- Regular Expressions
- Event System
- Event System Overview
- Event System Concepts and Facilities
- Application Event Loops
- Processing Work on Event Threads
- Event Loops in Application Parts
- Connecting to Event Sources
- Callback Ownership and Lifetime
- Invocations and Timers
- Simplifying Event Code with Bindings
- Asynchronous Task Workflows
- Communication Between Loops
- Cancellation and Shutdown
- Handling Event Failures
- Keeping Loops Responsive Under Load
- Owning Loop Execution
- Extending the Event System
- Related Topics
- Events in Erbsland Core
- Running an Application with Event Loops
- Processing Work on Event Threads
- Using Event Loops in Application Parts
- Connecting to Event Sources
- Handling Event Failures
- API Call Failures, Operation Errors, and Callback Exceptions
- Operation Errors and Task Completion
- Reporting Captured Callback Failures
- Continuing, Quitting, or Failing the Application
- Custom Callback Failure Handlers
- Releasing a Caller Waiting for Worker Results
- Exception Boundaries for Extension Authors
- Keeping Callbacks and Their Owners Alive
- Scheduling Work and Timers
- Simplifying Event Code with Bindings
- Building Workflows Across Callbacks
- Communicating Between Event Loops
- Cancelling Work and Shutting Down
- Keeping Event Loops Responsive Under Load
- Driving Event Loops Directly
- Designing Objects That Produce Events
- Defining and Posting Typed Events
- Writing an Event Backend
- Integrating Native Waiting and Custom Drivers
- Event System Overview
- Logging
- Logging Overview
- Choosing a Logging Setup
- Writing Log Messages
- Configuring Logging in Code
- Formatting Log Lines
- Setting the Default Log Line Format
- Line Patterns and Field Placeholders
- UTC and Local Timestamp Formats
- Severity Name Formats
- Stream Name Formats
- Left-Truncated Stream Name Limits
- Multiline Messages and First-Line Truncation
- Message Character Limits
- Total Rendered Line Limits
- Truncation Marks
- Per-Writer Line Formats
- Producer Message Limits versus Rendered Line Limits
- Configuring Log Manager Limits
- Using Trace Sections
- Trace-Section Filtering and Log Levels
- Attaching Trace Sections to Log Streams
- Guarding Trace Preparation with traceEnabled()
- Naming and Grouping Trace Sections
- Enabling Trace Sections and Matching Writer Routes
- Trace-Section Configuration at Startup
- Runtime Configuration Replacement and Trace Flags
- Using Log Writers
- Log Writers, Manager Delivery, and Routes
- Add a Writer to the Configuration
- Route the Right Entries to Each Writer
- Console, File, and Syslog Writers
- Show Immediate Feedback on the Console
- Keep Durable Operational History in a File
- Send Service Events to a Syslog Collector
- Recent Errors on Application Exit
- Implementing a Custom Log Writer
- Writing Logs to the Console
- Writing Logs to Files
- Add a File Writer to a Log Configuration
- File Writer Path and Options
- Choose Append or Overwrite for the First Open
- Time-Based and Size-Based File Rotation
- Set the Byte Threshold for Size Rotation
- Rotated Archive Retention
- External File Replacement and Automatic Reopening
- File Writer Failures and Recovery
- Sending Logs to Syslog
- Add a Syslog Writer to the Configuration
- Syslog Log Writer Options
- Choose UDP, TCP, or TLS Transport
- Select the Collector Endpoint
- Choose the RFC Facility
- Host Name: HOSTNAME
- Application Name: APP-NAME
- Process Identifier: PROCID
- Message Identifier: MSGID
- RFC 5424 Header Format
- Select the TLS Configuration Label
- Bound Pending Network Data
- Plan for Collector and Network Failures
- Loading Logging Configuration
- Logging Configuration File Locations
- Load a Dedicated
log.elcl - Load
LogFromapplication.elcl - Validate the Log Configuration Before Parsing
- Parsing and Installing a Logging Configuration Snapshot
- Root, Nested, and Invalid Logging Configuration Examples
- Application Reporting of Logging Configuration Errors
- Writing an ELCL Logging Configuration
- Minimal Console Writer Configuration
- Queue Limits, Line Formats, and Log Routing
- Default Log Line Format
- Log Queue Limits, Reservations, and Shutdown Timeout
- Enabled Trace Sections
- Writer Routes and Level/Path Filters
- Per-Writer Log Line Formats
- Console Paragraph Layout and Wrapping
- File Paths, Rotation, and Archive Retention
- Syslog Transport, Collector, and Header Fields
- Streams
- Working with Streams
- Creating Streams and Managing Ownership
- Byte Input and Output
- Text Input, Output, and Encoding
- Choose the Text Operation That Matches the Task
- Process Unicode Without Splitting Encoded Characters
- Read Lines Without Losing Their Structure
- Produce Text as Complete Atomic Requests
- Capture Reusable Text Output in Memory
- Match the Encoding and BOM Policy to the Format
- Choose Deliberately How Malformed Text Is Handled
- Standard Streams
- Standard Stream Proxies and Redirection
- Standard Output and Error Helpers in stream::io
- Keep Results and Diagnostics on Separate Channels
- Make Standard Input Deterministic with Scoped Redirection
- Protect Native Standard-Input Buffers
- Capture Output Without Changing the Producer
- Compose Redirections in Strictly Nested Scopes
- Treat Redirects as Shared Process State
- Readiness and Timeouts
- Buffering and Back Pressure
- Stream Lifecycle
- Temporary Streams
- Positioning Streams
- Stream Errors and Diagnostics
- Coroutine Streams
- Writing Custom Streams
- Network
- Color Terminal
- Color Terminal Demos
- Terminal Setup and Screen Rendering
- Implementing Terminal Backends
- Keyboard Input and Terminal Text Editing
- Polling for Keys in a Redraw Loop
- Switching Between Key and Line Input
- Reading Editable Text
- Polling the ReadLine Text Editor
- Editing and Multiple Lines
- History and Draft Text
- Masked Secret Input and Empty-Input Placeholders
- Text Editor Layouts and Terminal-State Cleanup
- Inactivity Timeout
- Describing Key Bindings
- Matching Decoded Key Types
- Cursor-Based Terminal Output
- Working with Terminal Buffers
- Viewing and Scrolling Terminal Buffers
- Drawing Terminal Frames, Borders, and Tiles
- Rendering Text in Terminal Buffers
- Configuring Terminal Paragraph Layout
- Rendering Terminal Bitmaps
- Rendering and Defining Bitmap Fonts
- Terminal Text Blocks and Block Strings
- Terminal Colors and Animated Palettes
- Terminal Layout Geometry
- Deriving Layout Regions from a Canvas
- Combining, Intersecting, and Testing Rectangles
- Aligning Smaller Content and Cropping Larger Sources
- Splitting a Rectangle into Grid Cells
- Walking Neighbors and Frame Perimeters
- Deriving Bounds and Keeping Cursors in Range
- Orientation Helpers and Coordinate Values