Pure-compatible deferred logger for PIC. Messages are buffered and flushed after the pure call chain returns.
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| integer(kind=default_int), | public, | parameter | :: | max_log_entries | = | 64 |
Maximum number of log entries a buffer can hold |
| integer(kind=default_int), | private, | parameter | :: | max_label_len | = | 16 |
Maximum length of a level label |
| integer(kind=default_int), | private, | parameter | :: | max_message_len | = | 256 |
Maximum length of a log message |
| integer(kind=default_int), | private, | parameter | :: | max_name_len | = | 64 |
Maximum length of a module or procedure name |
Buffer that accumulates log entries inside pure code. Pass as intent(inout) through pure call chains, then flush with flush_log_buffer once back in impure context.
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| integer(kind=default_int), | public | :: | count | = | 0 |
Number of entries currently stored |
|
| type(log_entry_type), | public | :: | entries(max_log_entries) | ||||
| integer(kind=default_int), | public | :: | overflow | = | 0 |
Number of entries dropped because the buffer was full |
|
| integer(kind=default_int), | public | :: | truncated | = | 0 |
Number of entries where message or names were truncated |
A single deferred log entry
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| logical, | public | :: | has_module | = | .false. | ||
| logical, | public | :: | has_procedure | = | .false. | ||
| character(len=max_label_len), | public | :: | level | = | ' ' | ||
| character(len=max_message_len), | public | :: | message | = | ' ' | ||
| character(len=max_name_len), | public | :: | module_name | = | ' ' | ||
| character(len=max_name_len), | public | :: | procedure_name | = | ' ' | ||
| logical, | public | :: | truncated | = | .false. |
True if the message or names exceeded their max length |
Reset the buffer to empty. Call after flushing if you want to reuse it.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(log_buffer_type), | intent(inout) | :: | buf |
Flush all buffered entries through the real logger, then clear the buffer. This is impure — call it once you are back outside the pure call chain.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(logger_type), | intent(in) | :: | logger | |||
| type(log_buffer_type), | intent(inout) | :: | buf |
Buffer a debug-level message
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(log_buffer_type), | intent(inout) | :: | buf | |||
| character(len=*), | intent(in) | :: | message | |||
| character(len=*), | intent(in), | optional | :: | module | ||
| character(len=*), | intent(in), | optional | :: | procedure |
Buffer an error-level message
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(log_buffer_type), | intent(inout) | :: | buf | |||
| character(len=*), | intent(in) | :: | message | |||
| character(len=*), | intent(in), | optional | :: | module | ||
| character(len=*), | intent(in), | optional | :: | procedure |
Buffer an info-level message
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(log_buffer_type), | intent(inout) | :: | buf | |||
| character(len=*), | intent(in) | :: | message | |||
| character(len=*), | intent(in), | optional | :: | module | ||
| character(len=*), | intent(in), | optional | :: | procedure |
Buffer a knowledge-level message
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(log_buffer_type), | intent(inout) | :: | buf | |||
| character(len=*), | intent(in) | :: | message | |||
| character(len=*), | intent(in), | optional | :: | module | ||
| character(len=*), | intent(in), | optional | :: | procedure |
Buffer a performance-level message
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(log_buffer_type), | intent(inout) | :: | buf | |||
| character(len=*), | intent(in) | :: | message | |||
| character(len=*), | intent(in), | optional | :: | module | ||
| character(len=*), | intent(in), | optional | :: | procedure |
Buffer a verbose-level message
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(log_buffer_type), | intent(inout) | :: | buf | |||
| character(len=*), | intent(in) | :: | message | |||
| character(len=*), | intent(in), | optional | :: | module | ||
| character(len=*), | intent(in), | optional | :: | procedure |
Buffer a warning-level message
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(log_buffer_type), | intent(inout) | :: | buf | |||
| character(len=*), | intent(in) | :: | message | |||
| character(len=*), | intent(in), | optional | :: | module | ||
| character(len=*), | intent(in), | optional | :: | procedure |
Core buffering routine — appends a log entry to the buffer. If the buffer is full, increments the overflow counter. If a message or name exceeds its max length, it is truncated and the entry is flagged.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(log_buffer_type), | intent(inout) | :: | buf | |||
| character(len=*), | intent(in) | :: | level | |||
| character(len=*), | intent(in) | :: | message | |||
| character(len=*), | intent(in), | optional | :: | module | ||
| character(len=*), | intent(in), | optional | :: | procedure |
Route a buffered entry to the appropriate logger method
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(logger_type), | intent(in) | :: | logger | |||
| type(log_entry_type), | intent(in) | :: | entry |