Too many more things about ModernC
This commit is contained in:
parent
8424a6836a
commit
f6ac67a6a6
11
.editorconfig
Normal file
11
.editorconfig
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
max_line_length = 90
|
||||||
|
|
||||||
|
[{*.c,*.go}]
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 4
|
1
modernc/03/.gitignore
vendored
Normal file
1
modernc/03/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
challenge-1
|
90
modernc/03/array.c
Normal file
90
modernc/03/array.c
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
#include <stdlib.h>
|
||||||
|
#include "array.h"
|
||||||
|
|
||||||
|
void IntArray_new(IntArray* a, size_t size) {
|
||||||
|
a->arr = malloc(size * sizeof(int));
|
||||||
|
a->used = 0;
|
||||||
|
a->size = size;
|
||||||
|
}
|
||||||
|
|
||||||
|
int IntArray_append(IntArray* a, int el) {
|
||||||
|
if (a->used == a->size) {
|
||||||
|
a->size *= 2;
|
||||||
|
a->arr = realloc(a->arr, a->size * sizeof(int));
|
||||||
|
}
|
||||||
|
|
||||||
|
a->used++;
|
||||||
|
|
||||||
|
a->arr[a->used] = el;
|
||||||
|
return a->used;
|
||||||
|
}
|
||||||
|
|
||||||
|
int IntArray_get(IntArray* a, int idx, int dflt) {
|
||||||
|
if (idx > a->used) {
|
||||||
|
return dflt;
|
||||||
|
}
|
||||||
|
|
||||||
|
return a->arr[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
int IntArray_length(IntArray* a) {
|
||||||
|
return a->used;
|
||||||
|
}
|
||||||
|
|
||||||
|
void IntArray_mergesort(IntArray* a) {
|
||||||
|
IntArray left_side;
|
||||||
|
IntArray right_side;
|
||||||
|
|
||||||
|
size_t split = a->used / 2;
|
||||||
|
|
||||||
|
IntArray_new(&left_side, split);
|
||||||
|
IntArray_new(&right_side, split);
|
||||||
|
|
||||||
|
for (int i = 0; i < split; ++i) {
|
||||||
|
IntArray_append(&left_side, IntArray_get(a, i, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = split; i < a->used; ++i) {
|
||||||
|
IntArray_append(&right_side, IntArray_get(a, i, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
IntArray_mergesort(&left_side);
|
||||||
|
IntArray_mergesort(&right_side);
|
||||||
|
|
||||||
|
IntArray_mergesort_merge(a, &left_side, &right_side);
|
||||||
|
}
|
||||||
|
|
||||||
|
void IntArray_mergesort_merge(IntArray* a, IntArray* left_side, IntArray* right_side) {
|
||||||
|
IntArray_free(a);
|
||||||
|
|
||||||
|
size_t i = 0;
|
||||||
|
size_t j = 0;
|
||||||
|
|
||||||
|
while (i < left_side->used && j < right_side->used) {
|
||||||
|
if (left_side->arr[i] <= right_side->arr[j]) {
|
||||||
|
IntArray_append(a, left_side->arr[i]);
|
||||||
|
i++;
|
||||||
|
} else {
|
||||||
|
IntArray_append(a, right_side->arr[j]);
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t li = 0; li < left_side->used; ++li) {
|
||||||
|
IntArray_append(a, left_side->arr[li]);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t ri = 0; ri < right_side->used; ++ri) {
|
||||||
|
IntArray_append(a, right_side->arr[ri]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void IntArray_quicksort(IntArray* a) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void IntArray_free(IntArray* a) {
|
||||||
|
free(a->arr);
|
||||||
|
a->arr = NULL;
|
||||||
|
a->used = a->size = 0;
|
||||||
|
}
|
22
modernc/03/array.h
Normal file
22
modernc/03/array.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#ifndef INCLUDED_ARRAY_H
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int *arr;
|
||||||
|
size_t used;
|
||||||
|
size_t size;
|
||||||
|
} IntArray;
|
||||||
|
|
||||||
|
void IntArray_new(IntArray*, size_t);
|
||||||
|
|
||||||
|
int IntArray_append(IntArray*, int);
|
||||||
|
int IntArray_get(IntArray*, int, int);
|
||||||
|
int IntArray_length(IntArray*);
|
||||||
|
void IntArray_mergesort(IntArray*);
|
||||||
|
void IntArray_mergesort_merge(IntArray*, IntArray*, IntArray*);
|
||||||
|
void IntArray_quicksort(IntArray*);
|
||||||
|
|
||||||
|
void IntArray_free(IntArray*);
|
||||||
|
|
||||||
|
#define INCLUDED_ARRAY_H 1
|
||||||
|
#endif
|
114
modernc/03/challenge-1.c
Normal file
114
modernc/03/challenge-1.c
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <getopt.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "array.h"
|
||||||
|
|
||||||
|
#define IODASH "-"
|
||||||
|
|
||||||
|
void usage(char* prog) {
|
||||||
|
fprintf(stderr, "Usage: %s [-f|--input-file <input-file>] [-o|--output-file <output-file>]\n", prog);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
char* input_file = IODASH;
|
||||||
|
char* output_file = IODASH;
|
||||||
|
|
||||||
|
int c = 0;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
static struct option long_options[] = {
|
||||||
|
{"input-file", required_argument, 0, 'f'},
|
||||||
|
{"output-file", required_argument, 0, 'o'},
|
||||||
|
};
|
||||||
|
|
||||||
|
int option_index = 0;
|
||||||
|
|
||||||
|
c = getopt_long(argc, argv, "f:o:", long_options, &option_index);
|
||||||
|
|
||||||
|
if (c == -1) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (c) {
|
||||||
|
case 'f':
|
||||||
|
input_file = optarg;
|
||||||
|
break;
|
||||||
|
case 'o':
|
||||||
|
output_file = optarg;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
usage(argv[0]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(input_file, IODASH) == 0) {
|
||||||
|
fprintf(stderr, "(reading from stdin)\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(output_file, IODASH) == 0) {
|
||||||
|
fprintf(stderr, "(writing to stdout)\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("input_file='%s' output_file='%s'\n", input_file, output_file);
|
||||||
|
|
||||||
|
FILE* instream;
|
||||||
|
|
||||||
|
instream = stdin;
|
||||||
|
if (strcmp(input_file, IODASH) != 0) {
|
||||||
|
instream = fopen(input_file, "r");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (instream == NULL) {
|
||||||
|
perror("opening input file");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
FILE* outstream;
|
||||||
|
|
||||||
|
outstream = stdout;
|
||||||
|
if (strcmp(output_file, IODASH) != 0) {
|
||||||
|
outstream = fopen(output_file, "r");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (outstream == NULL) {
|
||||||
|
perror("opening output file");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int line_int;
|
||||||
|
ssize_t nread;
|
||||||
|
|
||||||
|
char* endptr = NULL;
|
||||||
|
char* line = NULL;
|
||||||
|
size_t len = 0;
|
||||||
|
|
||||||
|
IntArray accum;
|
||||||
|
IntArray_new(&accum, 100);
|
||||||
|
|
||||||
|
while ((nread = getline(&line, &len, instream)) != -1) {
|
||||||
|
IntArray_append(&accum, atoi(line));
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Accumulated %i ints\n", IntArray_length(&accum));
|
||||||
|
|
||||||
|
IntArray_mergesort(&accum);
|
||||||
|
|
||||||
|
printf("Merge sorted:\n");
|
||||||
|
|
||||||
|
for (int i = 0; i < accum.used; ++i) {
|
||||||
|
printf("%i: %i\n", i, IntArray_get(&accum, i, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(input_file, IODASH) != 0) {
|
||||||
|
fclose(instream);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(output_file, IODASH) != 0) {
|
||||||
|
fclose(outstream);
|
||||||
|
}
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user