P
Peter Ammon
I invented a new (AFAIK) way of doing the O part of C's I/O that is
safer than printf() without sacrificing much convenience. It looks a
bit like C++'s formatted output, without the stupid gotchas (but with
all of the ugly syntax.)
It looks like this:
start()->i(4)->s(" score and ")->f(7)->s(" years ago...")->c('\n');
This would output
4 score and 7.000000 years ago...
Here's some sample code for it.
#include <stdio.h>
static const struct funcs *start(void), *print_string(const char*),
*print_int(int), *print_double(double), *print_char(char);
static const struct funcs {
const struct funcs * (*s)(const char*);
const struct funcs * (*i)(int);
const struct funcs * (*f)(double);
const struct funcs * (*c)(char);
} funcs_val = { print_string, print_int, print_double, print_char };
static const struct funcs* start(void) {
return &funcs_val;
}
static const struct funcs* print_string(const char* s) {
fputs(s, stdout);
return &funcs_val;
}
static const struct funcs* print_int(int s) {
printf("%d", s);
return &funcs_val;
}
static const struct funcs* print_double(double s) {
printf("%f", s);
return &funcs_val;
}
static const struct funcs* print_char(char s) {
printf("%c", s);
return &funcs_val;
}
int main(void) {
start()->i(4)->s(" score and ")->f(7)->s(" years ago...")->c('\n');
return 0;
}
Let me know if you find this useful, can improve on it, point out bugs, etc.
-Peter
safer than printf() without sacrificing much convenience. It looks a
bit like C++'s formatted output, without the stupid gotchas (but with
all of the ugly syntax.)
It looks like this:
start()->i(4)->s(" score and ")->f(7)->s(" years ago...")->c('\n');
This would output
4 score and 7.000000 years ago...
Here's some sample code for it.
#include <stdio.h>
static const struct funcs *start(void), *print_string(const char*),
*print_int(int), *print_double(double), *print_char(char);
static const struct funcs {
const struct funcs * (*s)(const char*);
const struct funcs * (*i)(int);
const struct funcs * (*f)(double);
const struct funcs * (*c)(char);
} funcs_val = { print_string, print_int, print_double, print_char };
static const struct funcs* start(void) {
return &funcs_val;
}
static const struct funcs* print_string(const char* s) {
fputs(s, stdout);
return &funcs_val;
}
static const struct funcs* print_int(int s) {
printf("%d", s);
return &funcs_val;
}
static const struct funcs* print_double(double s) {
printf("%f", s);
return &funcs_val;
}
static const struct funcs* print_char(char s) {
printf("%c", s);
return &funcs_val;
}
int main(void) {
start()->i(4)->s(" score and ")->f(7)->s(" years ago...")->c('\n');
return 0;
}
Let me know if you find this useful, can improve on it, point out bugs, etc.
-Peter