/* * dopopd - pop a directory out of the directory stack * with a numeric argument just discard it. */ void /*ARGSUSED*/ dopopd(Char **v, struct command *t) { struct directory *dp, *p = NULL; skipargs(&v, " [+<n>]"); printd = 1; if (*v == NULL) dp = dcwd; else if (v[1] != NULL) stderror(ERR_NAME | ERR_TOOMANY); else if ((dp = dfind(*v)) == 0) stderror(ERR_NAME | ERR_BADDIR); if (dp->di_prev == &dhead && dp->di_next == &dhead) stderror(ERR_NAME | ERR_EMPTY); if (dp == dcwd) { char *tmp; if ((p = dp->di_prev) == &dhead) p = dhead.di_prev; if (chdir(tmp = short2str(p->di_name)) < 0) stderror(ERR_SYSTEM, tmp, strerror(errno)); } dp->di_prev->di_next = dp->di_next; dp->di_next->di_prev = dp->di_prev; if (dp == dcwd) dnewcwd(p); else { printdirs(); } dfree(dp); }
int main(){ #ifndef TESTING #include "uart.h" #include "mmc.h" // Initializam modulele hardware uart_init(); SPI_init(); MMC_init(); BTN_init(); LCD_init(); #endif /* Gaseste prima partitie FAT32 de pe card*/ init_partition(buffer); /** * Gaseste datele despre sistemul de fisiere : * nr de tabele FAT, cluster-ul directorului Root, etc. */ initFAT32(buffer); print_volid(buffer); LCD_str( " ", 0); LCD_str( " ", 0); LCD_str( " Welcome to", 0); LCD_str( " MMC Explorer", 0); _delay_ms(2500); LCD_clear(); printdirs(openroot()); return EXIT_SUCCESS; }
/*ARGSUSED*/ void dodirs(Char **v, struct command *c) { static const char flags[] = "plvnSLc"; int dflag = skipargs(&v, flags, ""); USE(c); if ((dflag & DIR_CLEAR) != 0) { struct directory *dp, *fdp; for (dp = dcwd->di_next; dp != dcwd; ) { fdp = dp; dp = dp->di_next; if (fdp != &dhead) dfree(fdp); } dhead.di_next = dhead.di_prev = dp; dp->di_next = dp->di_prev = &dhead; } if ((dflag & DIR_LOAD) != 0) loaddirs(*v); else if ((dflag & DIR_SAVE) != 0) recdirs(*v, 1); if (*v && (dflag & (DIR_SAVE|DIR_LOAD))) v++; if (*v != NULL || (dflag & DIR_OLD)) stderror(ERR_DIRUS, "dirs", flags, ""); if ((dflag & (DIR_CLEAR|DIR_LOAD|DIR_SAVE)) == 0 || (dflag & DIR_PRINT)) printdirs(dflag); }
/* * dnewcwd - make a new directory in the loop the current one */ static void dnewcwd(struct directory *dp, int dflag) { int print; if (adrof(STRdunique)) { struct directory *dn; for (dn = dhead.di_prev; dn != &dhead; dn = dn->di_prev) if (dn != dp && Strcmp(dn->di_name, dp->di_name) == 0) { dn->di_next->di_prev = dn->di_prev; dn->di_prev->di_next = dn->di_next; dfree(dn); break; } } dcwd = dp; dset(dcwd->di_name); dgetstack(); print = printd; /* if printd is set, print dirstack... */ if (adrof(STRpushdsilent)) /* but pushdsilent overrides printd... */ print = 0; if (dflag & DIR_PRINT) /* but DIR_PRINT overrides pushdsilent... */ print = 1; if (bequiet) /* and bequiet overrides everything */ print = 0; if (print) printdirs(dflag); cwd_cmd(); /* PWP: run the defined cwd command */ }
/* * dnewcwd - make a new directory in the loop the current one */ static void dnewcwd(struct directory *dp) { dcwd = dp; dset(dcwd->di_name); if (printd && !(adrof(STRpushdsilent))) printdirs(); }
/* * dodirs - list all directories in directory loop */ void /*ARGSUSED*/ dodirs(Char **v, struct command *t) { skipargs(&v, ""); if (*v != NULL) stderror(ERR_DIRUS, "dirs", ""); printdirs(); }
/*ARGSUSED*/ void dopopd(Char **v, struct command *c) { Char *cp; struct directory *dp, *p = NULL; int dflag = skipargs(&v, "plvn", " [-|+<n>]"); USE(c); printd = 1; cp = (dflag & DIR_OLD) ? varval(STRowd) : *v; if (cp == NULL) dp = dcwd; else if ((dflag & DIR_OLD) == 0 && v[1] != NULL) { stderror(ERR_NAME | ERR_TOOMANY); /* NOTREACHED */ return; } else if ((dp = dfind(cp)) == 0) stderror(ERR_NAME | ERR_BADDIR); if (dp->di_prev == &dhead && dp->di_next == &dhead) stderror(ERR_NAME | ERR_EMPTY); if (dp == dcwd) { char *tmp; if ((p = dp->di_prev) == &dhead) p = dhead.di_prev; if (chdir(tmp = short2str(p->di_name)) < 0) stderror(ERR_SYSTEM, tmp, strerror(errno)); } dp->di_prev->di_next = dp->di_next; dp->di_next->di_prev = dp->di_prev; dfree(dp); if (dp == dcwd) { dnewcwd(p, dflag); } else { printdirs(dflag); } }