summaryrefslogtreecommitdiffstats
path: root/inf/rtk/2021-državno/3/prog.c
blob: 6b9a1ff36debd370a00ce0ea2ae47b039f25a838 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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 */
}