#include #include #include /* da bo vse skupaj bolj fancy, lahko uporabimo PATH_MAX definicijo namesto dinamičnega heap alloc */ #include 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 */ }