diff options
author | sijanec <anton@sijanec.eu> | 2021-03-27 15:56:37 +0100 |
---|---|---|
committer | sijanec <anton@sijanec.eu> | 2021-03-27 15:56:37 +0100 |
commit | 72c9a4a474afe5d7789466ce61bb50ca6220ec67 (patch) | |
tree | 8d6004ace45f9928773811881585b6a3a4a1e473 /inf/rtk/2021-državno/3/prog.c | |
parent | narejena slovenščain pretzenacija do kponca (diff) | |
download | sola-gimb-2-72c9a4a474afe5d7789466ce61bb50ca6220ec67.tar sola-gimb-2-72c9a4a474afe5d7789466ce61bb50ca6220ec67.tar.gz sola-gimb-2-72c9a4a474afe5d7789466ce61bb50ca6220ec67.tar.bz2 sola-gimb-2-72c9a4a474afe5d7789466ce61bb50ca6220ec67.tar.lz sola-gimb-2-72c9a4a474afe5d7789466ce61bb50ca6220ec67.tar.xz sola-gimb-2-72c9a4a474afe5d7789466ce61bb50ca6220ec67.tar.zst sola-gimb-2-72c9a4a474afe5d7789466ce61bb50ca6220ec67.zip |
Diffstat (limited to 'inf/rtk/2021-državno/3/prog.c')
-rw-r--r-- | inf/rtk/2021-državno/3/prog.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/inf/rtk/2021-državno/3/prog.c b/inf/rtk/2021-državno/3/prog.c new file mode 100644 index 0000000..6b9a1ff --- /dev/null +++ b/inf/rtk/2021-državno/3/prog.c @@ -0,0 +1,38 @@ +#include <stdio.h> +#include <stdlib.h> +#include <linux/limits.h> /* da bo vse skupaj bolj fancy, lahko uporabimo PATH_MAX definicijo namesto dinamičnega heap alloc */ +#include <string.h> +int main (int argc, char ** argv) { + char buf[PATH_MAX+1]; /* statično alociramo buffer, to je dokaj slabo za varnost pred buffer overruns, ampak baje nam je vseen */ + char path[PATH_MAX+1]; /* -||- za buffer za tiskanje */ + path[0] = '\0'; /* path naj bo prazen niz */ + int prejglob = 1; /* prejšna globina - 1 je koren shrambe */ + while (!feof(stdin)) { /* beremo do konca */ + fgets(buf, PATH_MAX, stdin); /* pridobimo vrstico iz standardnega vhoda */ + char * cp = strrchr(buf, ' '); /* najdemo zadnji presledek v njej. PAZI: moodle ima v primeru naloge presledke na koncu vrstic, to moraš zbrisati prej!!! */ + if (!cp) /* če strrchr ni našel presledka */ + return 0; /* končali smo */ + int glob = strtol(cp+1, NULL, 10); /* pretvorimo globino v celo */ + cp[0] = '\0'; /* buf je sedaj ime direktorija, odstranili smo presledek */ + if (glob - prejglob > 1) { /* če smo preskočili direktorij */ + fprintf(stdout, "Napaka!\n"); /* napišemo napaka */ + return 2; /* gremo iz programa */ + } + if (prejglob - glob >= 0) { /* če spremenimo trenutni direktorij ali če gremo proti korenu */ + for (int i = 0; i <= prejglob - glob; i++) { /* zbrišemo toliko iz trenutne poti, da bomo lahko pripopali direktorij */ + char * ck = strrchr(path, '/'); /* dobimo torej poševnico */ + if (!ck) /* če je ni, smo morebiti na začetku programa */ + ck = path; /* kazalec nastavimo na prvi znak poti */ + ck[0] = '\0'; /* odgriznemo stran toliko direktorijev, da bomo kasneje pripopali buf in pristali na pravilnem direktoriju */ + } + strcat(path, "/"); /* dodamo poševnico */ + strcat(path, buf); /* dodamo direktorij */ + } else { /* gremo stran od korena, vstopamo v direktorij */ + strcat(path, "/"); /* dodamo poševnico */ + strcat(path, buf); /* dodamo ime direktorija */ + } + fprintf(stdout, "%s\n", path); /* never ever zaupaj uporabniškemu vnosu kot print format */ + prejglob = glob; /* prejšnjo globino nastavimo na trenutno in gremo na začetek loopa */ + } + return 0; /* vrnemo se iz programa */ +} |