| name | C Ecosystem |
| description | This skill should be used when working with C projects, "C11", "C17", "C23", "Makefile", "gcc", "clang", "valgrind", "getopt", or C language patterns. Provides comprehensive Modern C (C11-C23) patterns, memory management, and CLI development best practices. |
uint32_t compute_hash(const uint8_t *data, size_t len);
draw((struct point){.x = 10, .y = 20});
int *arr = (int[]){1, 2, 3, 4, 5};
struct config cfg = { .name = "myapp", .timeout = 30, .verbose = true, };
_Atomic int counter = 0;
void increment(void) { atomic_fetch_add(&counter, 1); }
int get_count(void) { return atomic_load(&counter); }
_Thread_local int errno_local;
char *duplicate_string(const char *src) { if (!src) return NULL;
size_t len = strlen(src) + 1;
char *dst = malloc(len);
if (!dst) return NULL;
memcpy(dst, src, len);
return dst;
}
Arena arena_create(size_t size) { Arena a = {0}; a.base = malloc(size); if (a.base) a.size = size; return a; }
void *arena_alloc(Arena *a, size_t bytes) { size_t aligned = (bytes + 7) & ~7; // 8-byte alignment if (a->offset + aligned > a->size) return NULL; void *ptr = a->base + a->offset; a->offset += aligned; return ptr; }
void arena_reset(Arena *a) { a->offset = 0; }
void arena_destroy(Arena *a) { free(a->base); *a = (Arena){0}; }
typedef struct { PoolBlock *free_list; char *memory; size_t object_size; size_t capacity; } Pool;
Pool pool_create(size_t object_size, size_t count) { Pool p = {0}; size_t size = object_size > sizeof(PoolBlock) ? object_size : sizeof(PoolBlock); p.memory = malloc(size * count); if (!p.memory) return p;
p.object_size = size;
p.capacity = count;
// Build free list
for (size_t i = 0; i < count; i++) {
PoolBlock *block = (PoolBlock *)(p.memory + i * size);
block->next = p.free_list;
p.free_list = block;
}
return p;
}
void *pool_alloc(Pool *p) { if (!p->free_list) return NULL; PoolBlock *block = p->free_list; p->free_list = block->next; return block; }
void pool_free(Pool *p, void *ptr) { PoolBlock *block = ptr; block->next = p->free_list; p->free_list = block; }
void pool_destroy(Pool *p) { free(p->memory); *p = (Pool){0}; }
fp = fopen(path, "r");
if (!fp) goto cleanup;
buffer = malloc(BUFFER_SIZE);
if (!buffer) goto cleanup;
// ... process file ...
result = 0; // Success
cleanup: free(buffer); if (fp) fclose(fp); return result; }
int main(int argc, char *argv[]) { int verbose = 0; const char *output = NULL; int opt;
while ((opt = getopt(argc, argv, "vo:h")) != -1) {
switch (opt) {
case 'v':
verbose = 1;
break;
case 'o':
output = optarg;
break;
case 'h':
printf("Usage: %s [-v] [-o output] [file...]\n", argv[0]);
return 0;
default:
fprintf(stderr, "Usage: %s [-v] [-o output] [file...]\n", argv[0]);
return 1;
}
}
// Remaining arguments: argv[optind] to argv[argc-1]
for (int i = optind; i < argc; i++) {
printf("Processing: %s\n", argv[i]);
}
return 0;
}
static struct option long_options[] = { {"verbose", no_argument, NULL, 'v'}, {"output", required_argument, NULL, 'o'}, {"help", no_argument, NULL, 'h'}, {NULL, 0, NULL, 0 } };
int main(int argc, char *argv[]) { int verbose = 0; const char *output = NULL; int opt;
while ((opt = getopt_long(argc, argv, "vo:h", long_options, NULL)) != -1) {
switch (opt) {
case 'v': verbose = 1; break;
case 'o': output = optarg; break;
case 'h':
printf("Usage: %s [--verbose] [--output FILE] [file...]\n", argv[0]);
return 0;
default:
return 1;
}
}
return 0;
}
Successful execution
General error
Command line usage error
Command found but not executable
Command not found
Terminated by signal N
int main(int argc, char *argv[]) { if (argc < 2) { fprintf(stderr, "Usage: %s <file>\n", argv[0]); return EX_USAGE; // 64 }
FILE *fp = fopen(argv[1], "r");
if (!fp) {
perror(argv[1]);
return EX_NOINPUT; // 66
}
// ...
return EXIT_SUCCESS;
}
static atomic_int running = 1;
static void handle_signal(int sig) { (void)sig; running = 0; }
int main(void) { struct sigaction sa = {0}; sa.sa_handler = handle_signal; sigemptyset(&sa.sa_mask); sa.sa_flags = 0;
sigaction(SIGINT, &sa, NULL);
sigaction(SIGTERM, &sa, NULL);
while (running) {
// Main loop work
}
printf("Shutting down gracefully...\n");
return 0;
}
static const char *progname = "myapp";
void set_progname(const char *argv0) { const char *p = strrchr(argv0, '/'); progname = p ? p + 1 : argv0; }
void error(const char *fmt, ...) { fprintf(stderr, "%s: ", progname); va_list ap; va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); fprintf(stderr, "\n"); }
void error_errno(const char *fmt, ...) { int saved_errno = errno; fprintf(stderr, "%s: ", progname); va_list ap; va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); fprintf(stderr, ": %s\n", strerror(saved_errno)); }
<staticanalysis>
WarningsAsErrors: '*'
START_TEST(test_addition) { ck_assert_int_eq(1 + 1, 2); } END_TEST
Suite *math_suite(void) { Suite *s = suite_create("Math"); TCase *tc = tcase_create("Core"); tcase_add_test(tc, test_addition); suite_add_tcase(s, tc); return s; }
int main(void) { Suite *s = math_suite(); SRunner *sr = srunner_create(s); srunner_run_all(sr, CK_NORMAL); int failed = srunner_ntests_failed(sr); srunner_free(sr); return failed ? EXIT_FAILURE : EXIT_SUCCESS; }
SRCS := $(wildcard src/*.c) OBJS := $(SRCS:.c=.o) TARGET := myapp
.PHONY: all clean
all: $(TARGET)
$(TARGET): $(OBJS) $(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
%.o: %.c $(CC) $(CFLAGS) -c -o $@ $<
clean: rm -f $(OBJS) $(TARGET)
set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_C_EXTENSIONS OFF)
add_executable(myapp src/main.c src/utils.c) target_include_directories(myapp PRIVATE include)
target_compile_options(myapp PRIVATE $<$<C_COMPILER_ID:GNU,Clang>: -Wall -Wextra -Wpedantic -Werror > )
src = files('src/main.c', 'src/utils.c') inc = include_directories('include')
executable('myapp', src, include_directories: inc)