Here is an example of a non-null terminated list:
```c
#include <stdio.h>
#include <stddef.h>

typedef struct buffer (buffer);

struct buffer {
    void *start_address;
    void *end_address;
};

static inline void print(buffer *__buffer) {
    // preprocessing automata -- Input Validation
    if (NULL == __buffer) {
        return ;
    } 
    
    void *_address = __buffer->start_address;
    for (int i = 0; NULL != _address; _address = (__buffer->start_address + i)) {
        
        // processing
        const char c = *((const char *)_address);
        printf("%c\n", c);
        
        // post-processing 
        if (__buffer->end_address == _address) {
            return ;
        }
        i++;
    }
}

int main() {
    char test[] = {'H', 'e', 'l', 'l', 'o'};
    buffer _buf = {
        .start_address = &test[0],
        .end_address = &test[4]
    };
    print(&_buf);

    return 0;
}
```