struct stat st; char *s; int code; if( !*path) return 0; /* "/" */ if( stat(path, &st) >= 0 ){ /* */ if((st.st_mode & S_IFMT) == S_IFDIR) return 0; /* OK */ printf( "%s - \n", path ); return 1; /* FAIL */ } if( s = strrchr(path, '/')){ *s = '\0'; code = md(path); *s = '/'; if( code ) return code; /* */ } sprintf(command, "mkdir \"%s\"", path ); return system(command); /* 0 OK */ } /* UNIX. * MS DOS - */ void mkname( res, n, e ) char *res, *n, *e; { /* res - , n - , e - */ register i; char *start = res; if( n[0] == 0x05 ) n[0] = 0xE5; /* */ for(i=0; i < 8 && n[i] && n[i] != ' ' ; i++) *res++ = n[i]; if( e[0] != ' ') *res++ = '.'; for(i=0; i < 3 && e[i] && e[i] != ' ' ; i++) *res++ = e[i]; *res = '\0'; while( *start ){ if( isalpha(*start) && isupper(*start)) *start = tolower(*start); start++; } } /* ------------------------------------------------------- */ /* FAT clu */ ushort numCluster(clu) ushort clu; { ushort n; if( clu >= MAXCLU ) printf( " %03X >= %03X\n", clu, MAXCLU ); if( bit16 ){ /* 16 */ n = INT( &FAT1[ 2*clu ]); n &= 0xFFFF; return n; } /* 12 */ n = clu + clu/2 ; n = INT( &FAT1[n] ); if( clu % 2 ){ /* */ n >>= 4; } n &= 0xFFF; return n; } /* . 0 */ ushort nextCluster(clu) ushort clu; { clu = numCluster(clu); if( clu >= (bit16 ? 0xFFF8 : 0xFF8 )) return 0; /* EOF */ return clu; } /* */ getCluster(clu, fp, size, buffer) ushort clu; /* (2..) */ FILE *fp; /* */ long size; /* */ char *buffer; /* */ { long offset; int rd, howmuchtoread; if( size <= 0L ){ printf( "CLUSTER %03X \n", clu ); exit(3); } /* . #2 */ offset = (clu - 2 + DATACLU) * (long) CLU; Lseek(fd, offset, 0); /* ? */ howmuchtoread = (size > CLU) ? CLU : size; rd = Read(fd, buffer, howmuchtoread); if( fp != NULL ) fwrite(buffer, 1, rd, fp); return ( rd < 0 ) ? 0 : rd; } /* ------------------------------------------------------------------ * dosfs -rPATH PATH, /tmp * dosfs ... "" * , : * dosfs 1.2 "/*.c" *.c * dosfs 1.2 "/dir1/*.c" *.c /dir1 * dosfs 1.2 "*.c" *.c * dosfs -d , * : dosfs -qr. 360 */ void main(argc, argv) char *argv[]; { if( argc < 2 ) goto usage; if( *argv[1] == '-' ){ /* */ char *keys = &argv[1][1]; while(*keys){ switch(*keys){ case 't': /* */ trace++; if((mapfp = fopen( ".Map", "w" )) == NULL ) trace = 0; break; case 'q': /* (quiet) */ ask = 0; break; case 'r': /* root */ root = keys+1; goto breakwhile; case 'd': /* dosfs -d == dir */ dironly++; break; } keys++; } breakwhile: argc--; argv++; } if( argc < 2 ) goto usage; if( pattern = argv[2] ){ /* NULL */ char *s = strrchr(pattern, '/'); if(s){ /* PATH/PATTERN */ dirpattern = pattern; /* PATH */ *s = '\0'; pattern = s+1; /* PATTERN */ }else{ /* PATTERN */ dirpattern = NULL; } } setbuf(stdout, NULL); /* */ readBoot(drive(argv[1])); readFAT(); countFree(); readRootDir(); exit(0); usage: printf( ": dosfs [-dqtrDIR] [\"\"]\n" ); exit(4); } /* boot-sector, */ void readBoot(dsk) char *dsk; { char BOOT[SECTOR]; int skips, sides; if((fd = open( dsk, O_RDONLY)) < 0 ){ fprintf(stderr, " %s\n", dsk); exit(5); } /* - boot */ Read(fd, BOOT, SECTOR); boot = (struct boot *) BOOT; line('-'); printf( " \"%8.8s\"\n", boot->label ); printf( " boot- %d \n", INT(boot->bfs)); printf( " %d \n", SPC = boot->sectorsPerCluster ); printf( " %d ", SECT = INT(boot->sectors)); capacity = SECT * (long) SECTOR; printf( "(%ld KB)\n", capacity / 1024L ); printf( " %d \n", INT(boot->sectorsPerTrack)); sides = INT(boot->sides); printf( " %d %c\n\n", sides, sides==1? '':''); printf( " FAT %d \n", skips = INT(boot->fatoff)); printf( " %d FAT\n", NFAT = boot->copies ); printf( "FAT %d \n\n", SPF = INT(boot->FATsize)); printf( " %d \n\n", NDIR = INT(boot->dirsize)); printf( " = %02X\t(", DESC = boot->desc ); switch( DESC ){ case 0xFF: printf( "double sided, 8 sectors per track" ); break; case 0xFE: printf( "single sided, 8 sectors per track" ); break; case 0xFD: printf( "double sided, 9 sectors per track" ); break; case 0xFC: printf( "single sided, 9 sectors per track" ); break; case 0xF9: printf( "double sided, 15 sectors per track"); break; case 0xF8: printf( "Winchester" ); bit16++; break; default: printf( " " ); break; } printf( ")\n"); printf( " %d \n", INT(boot->hidden)); /* */ CLU = SECTOR * SPC; /* */ FATSIZE = SECTOR * SPF; /* FAT */ FATSTART = SECTOR * skips; /* FAT */ /* */ DIRSIZE = NDIR * sizeof(struct dir); /* */ DATACLU = ((long) FATSTART + (long) FATSIZE * NFAT + (long) DIRSIZE ) / CLU; printf( " (.) = %d\n", DATACLU ); /* */ ENTRperCLUSTER = CLU / sizeof(struct dir); /* */ MAXCLU = (SECT - DATACLU * SPC); /* */ MAXCLU = MAXCLU / SPC; /* #2 */ MAXCLU += 2; } /* File Allocation Table ( ) */ void readFAT(){ register int i; FAT1 = Malloc(FATSIZE); Lseek(fd, (long) FATSTART, 0); Read(fd, FAT1, FATSIZE); if(NFAT > 1){ FAT2 = Malloc(FATSIZE); Read(fd, FAT2, FATSIZE); /* FAT */ for(i=0; i < FATSIZE; i++ ) if(FAT1[i] != FAT2[i]){ printf( " FAT %d/%d\n", i, FATSIZE ); break; } free( FAT2 ); } if( DESC != FAT1[0] ) printf( " FAT : %02X\n", FAT1[0] & 0xFF ); } /* . * FAT */ void readRootDir(){ if( DIRSIZE % SECTOR ) printf( " \n" ); Lseek(fd, (long)FATSTART + (long)FATSIZE * NFAT, 0); droot = (struct dir *) Malloc(DIRSIZE); Read(fd, droot, DIRSIZE ); /* NDIR 112 360K 720K * 224 1.2 Mb */ if( !dironly ) mkdir( root, 0755 ); line('-'); doDirectory(0, NDIR, droot); } /* (, , ) */ #define PRINT \ for(j=0; j < level; j++ ) printf( " " ); /* */ \ printf( "%02d\t%s/%-14s %12ld %s\n", \ strt + i, \ cwd, \ basename, \ size, \ isdir(dd[i].attrib) ? "<DIR>" : \ islabel(dd[i].attrib) ? "<LAB>" : "" ) void doDirectory(strt, entries, dd) struct dir dd[]; { register i, j; char basename[40]; static int level = 0; int need_to_get; /* */ /* line('-'); */ for(i=0; i < entries; i++ ){ uchar c; long size; if((c = *dd[i].name) == 0xE5 || !c) continue; /* () */ mkname(basename, dd[i].name, dd[i].ext); size = LONG(dd[i].size); /* */ /* , */ if( !pattern || /* pattern */ ( (!dirpattern || eq(cwd, dirpattern)) && match(basename, pattern) ) ){ PRINT; need_to_get = !dironly; } else need_to_get = 0; if(isdir(dd[i].attrib)){ /* */ if( eq(basename, "." ) || eq(basename, "..")) continue; level++; /* - size == 0 */ enterDir( basename, INT(dd[i].firstCluster), need_to_get); level--; } else if( islabel(dd[i].attrib)){ printf( "Volume label:%11.11s\n", dd[i].name ); } else if( need_to_get ) getFile ( basename, INT(dd[i].firstCluster), size); } /* line('#'); */ } /* UNIX- */ void getFile(name, clu, size) char *name; /* */ ushort clu; /* */ long size; /* */ { FILE *fp; /* */ struct stat st; ushort nclu = 0;/* */ sprintf(newname, "%s%s/%s", root, cwd, name ); if( ask && stat(newname, &st) >= 0 ){ char answer[30]; fprintf(stderr, "%s , ? ", newname); gets(answer); if( *answer != 'y' ) return; fprintf( stderr, "\tOK\n" ); } if((fp = fmdopen( newname, "w" )) == NULL){ printf( " %s\n", newname ); return; } if( trace ) fprintf( mapfp, "\n%s/%s:", cwd, name ); while( clu ){ if( trace ) traceclu(nclu++, clu); size -= getCluster(clu, fp, size, cluster); clu = nextCluster(clu); } fclose(fp); } /* */ void enterDir(name, clu, create) char *name; /* */ ushort clu; /* */ { char *tail, *myCluster; struct dir *dsub; ushort nclu; int nentries; /* */ /* cwd */ tail = cwd + strlen(cwd); *tail = '/'; strcpy(tail+1, name); if( create ){ /* */ sprintf( newname, "%s%s", root, cwd ); mkdir ( newname, 0755); } if( trace ) fprintf( mapfp, "\nDIR %s:", cwd); myCluster = Malloc( sizeof cluster ); dsub = (struct dir *) myCluster; nentries = nclu = 0; while( clu ){ if( trace ) traceclu(nclu++, clu); /* */ getCluster(clu, NULL,(long) CLU, myCluster); /* */ doDirectory(nentries, ENTRperCLUSTER, dsub); nentries += ENTRperCLUSTER; /* */ clu = nextCluster(clu); } *tail = '\0'; free(myCluster); } /* . */ void countFree(){ int isFree = 0; /* */ int isBad = 0; /* */ int isReserved = 0; /* */ register ushort n = 0; register ushort clu; /* */ int nline = 300; if( trace ) fprintf(mapfp, "\t\tFAT chart\n"); for(clu=0; clu < MAXCLU; clu++){ if( clu >= 2 ){ n = numCluster(clu); if( n == 0 ) isFree++; if( n == (bit16 ? 0xFFF7 : 0xFF7)) isBad++; if( n >= (bit16 ? 0xFFF0 : 0xFF0 ) && n < (bit16 ? 0xFFF7 : 0xFF7 )) isReserved++; } if( trace ){ if( nline >= 8){ nline = 0; fprintf( mapfp, "\n%03X:\t", clu ); } else nline++; fprintf( mapfp, "%03X ", n ); } } line('='); printf( " %ld, %ld, %d \n", (long)isFree * CLU, /* */ (long)isBad * CLU, isReserved ); } void traceclu(nclu, clu) ushort nclu, clu; { if( nclu % 16 == 0 ) fprintf( mapfp, "\n\t" ); fprintf( mapfp, "%03X ", clu ); } #ifdef LOCAL_MALLOC /* , malloc() free() (LIFO). malloc() free(), ! ( , , ). */ static char allocArena[32 * 1024]; static char *top = allocArena; char *malloc(n){ char *ptr; /* */ /* */ /* int-: */ n = (n + (sizeof(int)-1)) / sizeof(int); /* char-:*/ n *= sizeof(int); ptr = top; top += n; return ptr; } free(ptr) char *ptr; { top = ptr; } #endif /*LOCAL_MALLOC*/ /* 31 */ /* : */ #include <stdio.h> char *text[] = { "#include <stdio.h>", "char *text[] = {", " NULL};", "/* , */", "main(){ int i;", " puts(text[0]); puts(text[1]);", " for(i=0; text[i]; i++) putq(text[i]);", " for(i=2; text[i]; i++) puts(text[i]);", "}", "putq(s) char *s; {", " printf(\"\\t\\\"\");", " while(*s){", " if(*s == '\"') printf(\"\\\\\\\"\");", " else if(*s == '\\\\') printf(\"\\\\\\\\\");", " else putchar(*s);", " s++;", " }", " printf(\"\\\",\\n\");", "}", NULL}; /* , */ main(){ int i; puts(text[0]); puts(text[1]); for(i=0; text[i]; i++) putq(text[i]); for(i=2; text[i]; i++) puts(text[i]); } putq(s) char *s; { printf("\t\""); while(*s){ if(*s == '"') printf("\\\""); else if(*s == '\\') printf("\\\\"); else putchar(*s); s++; } printf("\",\n"); } /* 32 */ /* C beautify: cb.c, * . UNIX */ #include <stdio.h> #include <stdlib.h> #define gets getlex #define puts putlex /* */ void main(int argc, char *argv[]); void ptabs( void ); int getch( void ); void puts( void ); int lookup( char *tab[] ); int gets( void ); void gotelse( void ); int getnl( void ); void comment( void ); int slevel[10]; int clevel = 0; int spflg[20][10]; int sind [20][10]; int siflev[10]; int sifflg[10]; int iflev = 0; int ifflg = -1; int level = 0; int ind[10] = { 0,0,0,0,0,0,0,0,0,0 }; int eflg = 0; int paren = 0; int pflg[10] = { 0,0,0,0,0,0,0,0,0,0 }; char lchar; char pchar; int aflg = 0; int ct; int stabs[20][10]; int qflg = 0; char *wif[] = { "if",NULL}; char *welse[] = { "else", NULL}; char *wfor[] = { "for" , NULL}; char *wds[] = { "case","default", NULL}; int j = 0; char string[200]; char cc; int sflg = 1; int peek = -1; int tabs = 0; int lastchar; int c; void main(int argc, char *argv[]) { if( argc > 1 ){ if( freopen( argv[1], "r", stdin ) == NULL ){ fprintf(stderr, "Can't open %s\n", argv[1] ); exit(1); } } if( argc > 2 ){ if( freopen( argv[2], "w", stdout ) == NULL ){ fprintf(stderr, "Can't create %s\n", argv[2] ); exit(1); } } while((c = getch()) != EOF){ switch(c){ case ' ': case '\t': if(lookup(welse) == 1){ gotelse(); if(sflg == 0 || j > 0) string[j++] = c; puts(); sflg = 0; if(getnl() == 1){ puts(); printf("\n"); sflg = 1; pflg[level]++; tabs++; } continue; } if(sflg == 0 || j > 0) string[j++] = c; continue; case '\n': if((eflg = lookup(welse)) == 1) gotelse(); puts(); printf("\n"); sflg = 1; if(eflg == 1){ pflg[level]++; tabs++; } else if(pchar == lchar) aflg = 1; continue; case '{': if(lookup(welse) == 1) gotelse(); siflev[clevel] = iflev; sifflg[clevel] = ifflg; iflev = ifflg = 0; clevel++; if(sflg == 1 && pflg[level] != 0){ pflg[level]--; tabs--; } string[j++] = c; puts(); getnl(); puts(); printf("\n"); tabs++; sflg = 1; if(pflg[level] > 0){ ind[level] = 1; level++; slevel[level] = clevel; } continue; case '}': clevel--; if((iflev = siflev[clevel]-1) < 0) iflev = 0; ifflg = sifflg[clevel]; if(pflg[level] >0 && ind[level] == 0){ tabs -= pflg[level]; pflg[level] = 0; } puts(); tabs--; ptabs(); if((peek = getch()) == ';'){ printf("%c;", c); peek = -1; } else printf("%c", c); getnl(); puts(); printf("\n"); sflg = 1; if(clevel < slevel[level])if(level > 0) level--; if(ind[level] != 0){ tabs -= pflg[level]; pflg[level] = 0; ind[level] = 0; } continue; case '"': case '\'': string[j++] = c; while((cc = getch()) != c){ string[j++] = cc; if(cc == '\\'){ string[j++] = getch(); } if(cc == '\n'){ puts(); sflg = 1; } } string[j++] = cc; if(getnl() == 1){ lchar = cc; peek = '\n'; } continue; case ';': string[j++] = c; puts(); if(pflg[level] > 0 && ind[level] == 0){ tabs -= pflg[level]; pflg[level] = 0; } getnl(); puts(); printf("\n"); sflg = 1; if(iflev > 0) if(ifflg == 1){ iflev--; ifflg = 0; } else iflev = 0; continue; case '\\': string[j++] = c; string[j++] = getch(); continue; case '?': qflg = 1; string[j++] = c; continue; case ':': string[j++] = c; if(qflg == 1){ qflg = 0; continue; } if(lookup(wds) == 0){ sflg = 0; puts(); } else{ tabs--; puts(); tabs++; } if((peek = getch()) == ';'){ printf(";"); peek = -1; } getnl(); puts(); printf("\n"); sflg = 1; continue; case '/': string[j++] = c; if((peek = getch()) != '*') continue; string[j++] = peek; peek = -1; comment(); continue; case ')': paren--; string[j++] = c; puts(); if(getnl() == 1){ peek = '\n'; if(paren != 0) aflg = 1; else if(tabs > 0){ pflg[level]++; tabs++; ind[level] = 0; } } continue; case '#': string[j++] = c; while((cc = getch()) != '\n') string[j++] = cc; string[j++] = cc; sflg = 0; puts(); sflg = 1; continue; case '(': string[j++] = c; paren++; if(lookup(wfor) == 1){ while((c = gets()) != ';'); ct=0; cont: while((c = gets()) != ')'){ if(c == '(') ct++; } if(ct != 0){ ct--; goto cont; } paren--; puts(); if(getnl() == 1){ peek = '\n'; pflg[level]++; tabs++; ind[level] = 0; } continue; } if(lookup(wif) == 1){ puts(); stabs[clevel][iflev] = tabs; spflg[clevel][iflev] = pflg[level]; sind[clevel][iflev] = ind[level]; iflev++; ifflg = 1; } continue; default: string[j++] = c; if(c != ',') lchar = c; } } } void ptabs( void ){ int i; for(i=0; i < tabs; i++) printf("\t"); } int getch( void ){ if(peek < 0 && lastchar != ' ' && lastchar != '\t') pchar = lastchar; lastchar = (peek<0) ? getc(stdin) : peek; peek = -1; return(lastchar); } void puts( void ){ if(j > 0){ if(sflg != 0){ ptabs(); sflg = 0; if(aflg == 1){ aflg = 0; if(tabs > 0) printf(" "); } } string[j] = '\0'; printf("%s",string); j = 0; } else{ if(sflg != 0){ sflg = 0; aflg = 0; } } } int lookup( char *tab[] ) { char r; int l,kk,k,i; if(j < 1) return(0); kk=0; while(string[kk] == ' ') kk++; for(i=0; tab[i] != 0; i++){ l=0; for(k=kk;(r = tab[i][l++]) == string[k] && r != '\0';k++); if(r == '\0' && (string[k] < 'a' || string[k] > 'z' || k >= j)) return(1); } return(0); } int gets( void ){ char ch; beg: if((ch = string[j++] = getch()) == '\\'){ string[j++] = getch(); goto beg; } if(ch == '\'' || ch == '"'){ while((cc = string[j++] = getch()) != ch) if(cc == '\\') string[j++] = getch(); goto beg; } if(ch == '\n'){ puts(); aflg = 1; goto beg; } else return(ch); } void gotelse( void ){ tabs = stabs[clevel][iflev]; pflg[level] = spflg[clevel][iflev]; ind[level] = sind [clevel][iflev]; ifflg = 1; } int getnl( void ){ while((peek = getch()) == '\t' || peek == ' '){ string[j++] = peek; peek = -1; } if((peek = getch()) == '/'){ peek = -1; if((peek = getch()) == '*'){ string[j++] = '/'; string[j++] = '*'; peek = -1; comment(); } else string[j++] = '/'; } if((peek = getch()) == '\n'){ peek = -1; return(1); } return(0); } void comment( void ){ rep: while((c = string[j++] = getch()) != '*') if(c == '\n'){ puts(); sflg = 1; } gotstar: if((c = string[j++] = getch()) != '/'){ if(c == '*') goto gotstar; goto rep; } }