move to cmake compile structure

This commit is contained in:
Christoph J. Scherr 2022-12-22 00:52:16 +01:00
parent e466c7b322
commit be246e7ce4
37 changed files with 732 additions and 47 deletions

View File

@ -1,47 +0,0 @@
.PHONY = all pre testfiles bigfiles
SOURCES = $(wildcard *.c)
BINARIES = $(SOURCES:%.c=%)
EXECUTABLES= $(addprefix bin/,${BINARIES})
all: pre $(EXECUTABLES) huffman/bin/huffman testfiles
big: all bigfiles
pre:
@mkdir -p bin huffman/bin huffman/testfiles
clean:
rm -rvf bin huffman/testfiles huffman/bin
huffman/bin/huffman: huffman/huffman.c
$(CC) $(CFLAGS) -o $@ $< -lm
# TODO convert this phony target into multiple smaller file targets
testfiles:
@dd if=/dev/urandom of=huffman/testfiles/1K-random.img count=1KiB
@dd if=/dev/urandom of=huffman/testfiles/10K-random.img count=10KiB
@dd if=/dev/urandom of=huffman/testfiles/100K-random.img count=100KiB
@dd if=/dev/urandom of=huffman/testfiles/1M-random.img count=1MiB
@dd if=/dev/urandom of=huffman/testfiles/10M-random.img count=10MiB
@dd if=/dev/zero of=huffman/testfiles/1K-zero.img count=1KiB
@dd if=/dev/zero of=huffman/testfiles/10K-zero.img count=10KiB
@dd if=/dev/zero of=huffman/testfiles/100K-zero.img count=100KiB
@dd if=/dev/zero of=huffman/testfiles/1M-zero.img count=1MiB
@dd if=/dev/zero of=huffman/testfiles/10M-zero.img count=10MiB
@echo -e "Wer\ndas\nliest\nist\ndoof\n" > huffman/testfiles/tiny.txt
@yes 'SAFJALJ AF OIAIFOsdp' | head -c 100KB > huffman/testfiles/small.txt
@yes 'lslfkpoipop iipfiasp' | head -c 1MB > huffman/testfiles/mid.txt
# TODO convert this phony target into multiple smaller file targets
bigfiles:
@echo "Building some bigger testfiles, this might take a while and draw some performance"
@dd if=/dev/urandom of=huffman/testfiles/100M-random.img count=100MiB
@dd if=/dev/zero of=huffman/testfiles/100M-zero.img count=100MiB
@dd if=/dev/urandom of=huffman/testfiles/1G-random.img count=1GiB
@dd if=/dev/urandom of=huffman/testfiles/10G-random.img count=10GiB
@dd if=/dev/zero of=huffman/testfiles/1G-zero.img count=1GiB
@dd if=/dev/zero of=huffman/testfiles/10G-zero.img count=10GiB
@yes 'a sla d JK J Kkl' | head -c 100MB > huffman/testfiles/big.txt
@yes ' POP OPO )()( as' | head -c 1G > huffman/testfiles/huge.txt
$(EXECUTABLES): $(SOURCES)
$(CC) $(CFLAGS) -o $@ $< -lm

27
src/abc.c Normal file
View File

@ -0,0 +1,27 @@
#include <stdio.h>
#include <math.h>
#include <complex.h>
#include <stdlib.h>
int main(int argc, char **argv){
if(argc<3){
printf("not enough args! Ex: ./abc 12 -3 5\n");
exit(EXIT_FAILURE);
}
double a = atoi(argv[1]);
double b = atoi(argv[2]);
double c = atoi(argv[3]);
printf("(%f)x²+(%f)x+(%f)=0\n", a, b, c);
double l1 = 0, l2 = 0;
double cl1 = 0, cl2 = 0;
l1=(-b + sqrt((b*b)-(4*a*c)))/(2*a);
l2=(-b - sqrt((b*b)-(4*a*c)))/(2*a);
cl1=(-b + csqrt((b*b)-(4*a*c)))/(2*a);
cl2=(-b - csqrt((b*b)-(4*a*c)))/(2*a);
printf("(-%.0f (+-) sqrt[(%.0f²)-(4*%.0f*%.0f)])/2*%.0f\n", b, b, a, c, a);
printf("x1=%f x2=%f\n", l1, l2);
printf("(complex mode)\nx1=%fi\tx2=%fi\n", cl1, cl2);
return 0;
}

9
src/adder.c Normal file
View File

@ -0,0 +1,9 @@
#include <stdio.h>
int main() {
int a, b;
printf("Please input two integers to be added.\n");
scanf("%d %d", &a, &b);
printf("%d + %d = %d\n", a, b, a+b);
return 0;
}

15
src/args.c Normal file
View File

@ -0,0 +1,15 @@
#include <stdio.h>
int main(int argc, char* argv[]){
if(argc==1){
printf("Recieved only one argument, idiot");
return 1;
}
for(int i = 0; i < argc+1; i++){
printf("%d. [%s]\n", i+1, argv[i]);
}
return 0;
}

28
src/arrToBin.c Normal file
View File

@ -0,0 +1,28 @@
#include <stdio.h>
#include <stdlib.h>
int main(){
// input as single int, output as array of ints with only 0 and 1s
char str_i[20];
int i;
fgets(str_i, 20, stdin);
i = strtol(str_i, NULL, 0);
printf("%d", i);
int bin[16] = { -1 };
int b;
printf("[CONTROL]as hex %x\n", i);
for(int j = 16; j>0; j--){
b = i%2;
i /= 2;
bin[i] = b;
}
for(int j = 0; j < 16; j++){
printf("%d", bin[j]);
}
printf("\n");
return 0;
}

8
src/ascii.c Normal file
View File

@ -0,0 +1,8 @@
#include <stdio.h>
int main(){
for(int i=0; i<256; i++){
printf("(dec)%d\t(hex)0x%02x\t(char)%c\t\n",i,i,i);
}
return 0;
}

49
src/calculator.c Normal file
View File

@ -0,0 +1,49 @@
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
double factorial(double i) {
if(i <= 1) {
return 1;
}
return i * factorial(i - 1);
}
double power(double a, double b) {
double result = a;
for(int i=0;i<b;i++){
result*=a;
}
return result;
}
int main(int argc, char **argv){
// inputs
uint32_t a, b;
char op;
while(1) {
printf("\nPlease input the first number.\n");
fflush(stdin);
scanf("%d", &a);
printf("Please input the second number.\n");
fflush(stdin);
scanf("%d", &b);
printf("Please select an operation. ( + - * / ^ ! ), e to exit.\n");
fflush(stdin);
scanf(" %c", &op); //The %c conversion specifier won't automatically skip any leading whitespace
// calculate stuff.
switch(op) {
case '+': printf("%d + %d = %d\n", a, b, a+b); break;
case '-': printf("%d - %d = %d\n", a, b, a-b); break;
case '*': printf("%d * %d = %d\n", a, b, a*b); break;
case '/': printf("%d / %d = %f\n", a, b, (double)a/(double)b); break;
case '^': printf("%d^%d = %f\n", a, b, power((double)a,(double)b)); break;
case '!': printf("%d! = %f\n", a, factorial((double)a)); break;
case 'e': printf("exiting...\n"); return 0;
//case '%': printf("%d % %d = %d\n", a, b, a%b); break; // idk weird outputs.
default: printf("no operation recognized.\n"); return 1;
}
}
}

22
src/callreference.c Normal file
View File

@ -0,0 +1,22 @@
#include <stdio.h>
int* ref(int *i, int* j, int* result){
*result = *i + *j;
return result;
}
int val(int a, int b){
return a+b;
}
int main(){
int x = 1000;
int y = 337;
int z;
printf("given: %d\n", x);
printf("reference: %d\n", *ref(&x, &y, &z));
printf("value: %d\n", val(x, y));
return 0;
}

83
src/complex.c Normal file
View File

@ -0,0 +1,83 @@
#include <stdio.h>
typedef struct
{
float real;
float imaginary;
}complex;
complex assignComplex(){
float r, i;
scanf("%f", &r);
scanf("%f", &i);
complex c;
c.real = r;
c.imaginary = i;
return c;
}
void addComplex() {
printf("First complex\n");
complex a = assignComplex();
printf("Second complex\n");
complex b = assignComplex();
complex r;
r.real = a.real + b.real;
r.imaginary = a.imaginary + b.imaginary;
printf("Result: %f+%fi\n", r.real, r.imaginary);
}
void subComplex() {
printf("First complex\n");
complex a = assignComplex();
printf("Second complex\n");
complex b = assignComplex();
complex r;
r.real = a.real - b.real;
r.imaginary = a.imaginary - b.imaginary;
printf("Result: %f+%fi\n", r.real, r.imaginary);
}
void mulComplex() {
printf("First complex\n");
complex a = assignComplex();
printf("Second complex\n");
complex b = assignComplex();
complex r;
r.real = a.real * b.real;
r.imaginary = a.imaginary * b.imaginary;
printf("Result: %f+%fi\n", r.real, r.imaginary);
}
void divComplex() {
printf("First complex\n");
complex a = assignComplex();
printf("Second complex\n");
complex b = assignComplex();
complex r;
r.real = a.real / b.real;
r.imaginary = a.imaginary / b.imaginary;
printf("Result: %f+%fi\n", r.real, r.imaginary);
}
int main() {
printf("Usage:\n\toperations: + - * /\n\tquit: q\n");
char in;
while(1){
in = getchar();
switch(in){
case 'q': return 0;
case '+': addComplex(); break;
case '-': subComplex(); break;
case '*': mulComplex(); break;
case '/': divComplex(); break;
default: printf("kaputt\n"); break;
}
}
}

27
src/dividableBy7.c Normal file
View File

@ -0,0 +1,27 @@
/*
* lower and upper end as user input
* use a for loop to output all numbers for which 7|x is true.
*/
#include <stdio.h>
int main() {
int a,b;
printf("input lower end:\n");
fflush(stdin);
scanf("%d",&a);
printf("input upper end:\n");
fflush(stdin);
scanf("%d",&b);
printf("inputs: %d %d\n", a, b);
for(int i=a; i<=b; i++){
if(i%7==0)
printf("%d ", i);
if(i==b)
printf("\n");
}
return 0;
}

17
src/echo.c Normal file
View File

@ -0,0 +1,17 @@
#include <stdio.h>
int main() {
char s[100];
//gets(s);
/*
* Never use gets(). Because it is impossible to tell without knowing the data in advance how many characters gets() will read, and be
* cause gets() will continue to store characters past the end of the buffer, it is extremely dangerous to use. It has been used to break
* computer security. Use fgets() instead.
*
* For more information, see CWE-242 (aka "Use of Inherently Dangerous Function") at http://cwe.mitre.org/data/definitions/242.html
*
*/
fgets(s, sizeof(s), stdin);
printf("%s\n", s);
return 0;
}

8
src/echochar.c Normal file
View File

@ -0,0 +1,8 @@
#include <stdio.h>
int main() {
char a = getchar();
printf("%c", a);
return 0;
}

50
src/euler.c Normal file
View File

@ -0,0 +1,50 @@
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
// range of unsigned long long is:
// 18.446.744.073.709.551.615
// maximum factorial with this is 65!
// Double goes up to 170!
double factorial(double i) {
if(i <= 1) {
return 1;
}
return i * factorial(i - 1);
}
double factorialFor(double given){
double p = 1;
// someone said i need 2 for loops. Totally wrong?
for(int j=1;j<given;j++){
p *= j;
//printf("[DEBUG]p is %f, j is %d\n", p, j);
}
return given * p;
}
double euler(int k) {
return 1/factorial(k);
}
int main(int argc, char *argv[]){
double res = 0, lres = 0;
int k = 0;
int end = 0;
while(!end){
res += euler(k);
printf("%f, %f\n", res, lres);
if(res==lres)
end = 1;
else {
lres = res;
}
k++;
}
printf("calculated eulers number as %f\n", res);
return 0;
}

39
src/factorial.c Normal file
View File

@ -0,0 +1,39 @@
#include <stdio.h>
#include <stdlib.h>
// range of unsigned long long is:
// 18.446.744.073.709.551.615
// maximum factorial with this is 65!
// Double goes up to 170!
double factorial(double i) {
if(i <= 1) {
return 1;
}
return i * factorial(i - 1);
}
double factorialFor(double given){
double p = 1;
// someone said i need 2 for loops. Totally wrong?
for(int j=1;j<given;j++){
p *= j;
//printf("[DEBUG]p is %f, j is %d\n", p, j);
}
return given * p;
}
int main(int argc, char *argv[]){
if(argc<=1) {
printf("You did not feed me arguments, I will die now :( gimme ints");
return 1;
} //otherwise continue on our merry way....
double num = atoi(argv[1]);
printf("the factorial of the given input calculated by a recursive algorithm is: %.0f\n", factorial(num));
printf("the factorial of the given input calculated by a nonrecursive algorithm is: %.0f\n", factorialFor(num));
return 0;
}

10
src/fail.c Normal file
View File

@ -0,0 +1,10 @@
#include <stdio.h>
/*
* This program has the purpose of returning a -1 value, indicating the shell that something has gone wrong
* while the program was running.
*/
int main(){
return -1;
}

24
src/fread.c Normal file
View File

@ -0,0 +1,24 @@
#include <stdio.h>
#include <string.h>
int main () {
FILE *fp;
char c[] = "this is tutorialspoint";
char buffer[100];
/* Open file for both reading and writing */
fp = fopen("file.txt", "w+");
/* Write data to the file */
fwrite(c, strlen(c) + 1, 1, fp);
/* Seek to the beginning of the file */
fseek(fp, 0, SEEK_SET);
/* Read and display data */
fread(buffer, strlen(c)+1, 1, fp);
printf("%s\n", buffer);
fclose(fp);
return(0);
}

6
src/hello-world.c Normal file
View File

@ -0,0 +1,6 @@
#include <stdio.h>
int main() {
printf("Hello world!\n");
return 0;
}

26
src/options.c Normal file
View File

@ -0,0 +1,26 @@
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
bool isCaseInsensitive = false;
int opt;
enum { CHARACTER_MODE, WORD_MODE, LINE_MODE } mode = CHARACTER_MODE;
while ((opt = getopt(argc, argv, "ilw")) != -1) {
switch (opt) {
case 'i': isCaseInsensitive = true; break;
case 'l': mode = LINE_MODE; break;
case 'w': mode = WORD_MODE; break;
default:
fprintf(stderr, "Usage: %s [-ilw] [file...]\n", argv[0]);
exit(EXIT_FAILURE);
}
}
// Now optind (declared extern int by <unistd.h>) is the index of the first non-option argument.
// If it is >= argc, there were no non-option arguments.
}

9
src/pointer-arithmetic.c Normal file
View File

@ -0,0 +1,9 @@
#include <stdio.h>
int main() {
int a[5] = {22, 33, 44, 55, 66};
int *ptr = NULL;
ptr = a; /* point to the first array element */
for(int i = 0; i < 50; i++) {
printf(" value:0x%-10x\tor 0d%-16d\tAdress:%-8x\n", *(ptr+i), *(ptr+i), ptr+i); /* 33 */
}}

19
src/pointermagic.c Normal file
View File

@ -0,0 +1,19 @@
#include <stdio.h>
void printLoc(int y) {
printf("Address of y is %x\n", &y);
}
void printPointerLoc(int *x) {
printf("Adress of x is %x\n", &x);
printf("Adress the x pointer points to is %x\n", x);
printf("Adress of whatever *x is is %x\n", *x);
}
int main() {
int a = 0xAAAA;
printf("Address of a is %x\n", &a);
printLoc(a);
printPointerLoc(&a);
return 0;
}

43
src/primenumbers.c Normal file
View File

@ -0,0 +1,43 @@
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
int maxPrime = atoi(argv[1]);
int *arr1 = malloc(sizeof(int)*maxPrime);
if(arr1==NULL)
return -1;
for(int i=0; i<maxPrime; i++) {
arr1[i]=i+2;
}
int p = 2;
for(int i=1; i<maxPrime; i++) {
for(int j=1; j<maxPrime; j++) {
if((arr1[j]%p==0)&&(arr1[j]>0)&&(arr1[j]!=p))
arr1[j]=-1;
}
// get next prime in arr
// FIXME
p = arr1[i];
for(int l=0;l<512;l++){
if(p>0)
break;
else {
p = arr1[i+l];
}
}
for(int l=0;l<maxPrime;l++){
}
}
printf("\n");
printf("\n");
for(int i=0;i<maxPrime;i++){
if(arr1[i]>0)
printf("%d ", arr1[i]);
}
free(arr1);
printf("\n");
return 0;
}

30
src/quersumme.c Normal file
View File

@ -0,0 +1,30 @@
#include <stdio.h>
int main() {
int a, digits = 0, b = 0;
printf("input a number for calculation\n");
fflush(stdin);
scanf("%d",&a);
int digit[128];
// look out for wrong order
for(int i=0; i<128; i++) {
digit[i] = a % 10;
if(a>0)
a = a / 10;
else {
if(digits==-1)
digits = i;
digit[i] = -1;
}
//printf("%d. digit is: %d\n", i, digit[i]);
}
// array is in wrong order, but who cares for the quersumme
for(int i=0; i<128; i++){
if(digit[i]>0)
b += digit[i];
}
printf("quersumme is: %d\n", b);
return 0;
}

23
src/readfile.c Normal file
View File

@ -0,0 +1,23 @@
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
char filename[] = "file.txt";
char buf[2];
FILE *fp;
if ((fp = fopen(filename, "rb")) == NULL)
{
printf("Unable to open file: %s\n", filename);
return EXIT_FAILURE;
}
if (fread(buf, 1, 2, fp) == 2)
{
printf("%02x %02x\n", (int) buf[0], (int) buf[1]);
}
fclose(fp);
return 0;
}

8
src/redefinition-if.c Normal file
View File

@ -0,0 +1,8 @@
#include <stdio.h>
int main() {
int a;
if(1){
int a; // works, this a is only in scope of the if statement.
}
return 0;
}

7
src/redefinition.c Normal file
View File

@ -0,0 +1,7 @@
#include <stdio.h>
int a = 1;
int main() {
int a = 2;
printf("%d\n", a); // local overrides global
return 0;
}

15
src/return-specified.c Normal file
View File

@ -0,0 +1,15 @@
#include <stdio.h>
#include <stdlib.h>
/*
* This program takes the given argument and returns it as an integer.
* It might be useful to test a shell.
*/
int main(int argc, char** argv){
if(argc<2){
printf("No argument given.\n");
return -1;
}
return atoi(argv[1]);
}

11
src/scanf-test.c Normal file
View File

@ -0,0 +1,11 @@
#include <stdio.h>
int main() {
int a;
float f;
char s[20];
printf("input an integer, a float, then a string.\n");
scanf("%d %f %s", &a, &f, s);
printf("%d %f %s\n", a, f, s);
return 0;
}

8
src/scnaf-hex-test.c Normal file
View File

@ -0,0 +1,8 @@
#include <stdio.h>
int main() {
int a;
scanf("%x", &a);
printf("hex: %x dec: %d\n", a, a);
return 0;
}

6
src/signed-to-unsigned.c Normal file
View File

@ -0,0 +1,6 @@
#include <stdio.h>
int main() {
signed int a = -1;
printf("%u\n",a); // no need to type cast. %u interprets given bytes of type unsigned int regardless of the datatype. truly low level
}

10
src/sizeofs.c Normal file
View File

@ -0,0 +1,10 @@
#include <stdio.h>
int main() {
printf("int: %ld \n", sizeof(int));
printf("float: %ld \n", sizeof(float));
printf("double: %ld \n", sizeof(double));
printf("char: %ld \n", sizeof(char));
return 0;
}

42
src/structdump.c Normal file
View File

@ -0,0 +1,42 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct a {
int a;
char str[30];
};
/*
* give an argument to keep the file /tmp/structdump
* like this: bin/dump aaa
*/
int main(int argc, char** argv){
struct a* mystruct = malloc(sizeof(struct a));
if(mystruct == NULL){
printf("malloc for 1st struct failed!\n");
return 1;
}
mystruct->a = 12;
char s[30] = "Wer das liest ist doof";
strcpy(mystruct->str, s);
FILE* fptr = fopen("/tmp/structdump", "wb");
fwrite(mystruct, sizeof(struct a), 1, fptr);
fclose(fptr);
free(mystruct);
fptr = fopen("/tmp/structdump", "rb");
mystruct = malloc(sizeof(struct a));
if(mystruct == NULL){
printf("malloc for 2nd struct failed!\n");
return 1;
}
fread(mystruct, sizeof(struct a), 1, fptr);
printf("mystruct->a: %d\nmystruct->str: \"%s\"\n", mystruct->a, mystruct->str); // SIGSEV
free(mystruct);
fclose(fptr);
if(argc<2)
remove("/tmp/structdump");
return 0;
}

10
src/success.c Normal file
View File

@ -0,0 +1,10 @@
#include <stdio.h>
/*
* This program has the purpose of returning a 0 value, indicating to the shell that the program was
* executed successfully.
*/
int main(){
return 0;
}

11
src/sum.c Normal file
View File

@ -0,0 +1,11 @@
#include <stdio.h>
int main(){
int result = 0;
for (int i = 1; i < 101; i++){
result+=i;
}
printf("sum of 1 up to 100 is: %d\n", result);
return 0;
}

8
src/tabtest.c Normal file
View File

@ -0,0 +1,8 @@
#include <stdio.h>
int main() {
printf("horizontal\ttab\n");
printf("vertical%ctab\n", 11);
printf("reference line\n");
return 0;
}

3
src/umlaut.c Normal file
View File

@ -0,0 +1,3 @@
#include <stdio.h>
int main() { return 0; }
int zähler() { return 0; } // umlaute is an unknown char for gcc

6
src/unary-double-not.c Normal file
View File

@ -0,0 +1,6 @@
#include <stdio.h>
int main(){
printf("%d\n",!!42);
return 0;
}

15
src/warning.c Normal file
View File

@ -0,0 +1,15 @@
#include <stdio.h>
int main(){
char s[2];
/*
* The following line of code is unsafe. It writes up to 10 bytes into the char array 's', which is only
* 2 Bytes big. A Buffer Overflow can happen. I have chosen to keep that line, because i wanted a source
* file that produces a compiler warning when it is compiled. That is the true purpose of this file.
*
* a safe alternative would be: fgets(s, 2, stdin);
*/
fgets(s, 10, stdin); // UNSAFE
printf("%s\n",s);
return 0;
}