home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
458.lha
/
KCD
/
kcd.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-12-28
|
24KB
|
1,026 lines
/* HeaderFiles */
#include <stdio.h>
#include <exec/memory.h>
#include <libraries/dosextens.h>
#include <intuition/intuitionbase.h>
/* Macros */
#define ACTIVE_SCREEN IntuitionBase->ActiveScreen
#define ACTIVE_WINDOW IntuitionBase->ActiveWindow
#define CLASS ((Message)? Message->Class: 0 )
/* Declarations */
struct Library * OpenLibrary() ;
struct Window * OpenWindow() ;
struct IntuiMessage * GetMsg() ,
* Message = NULL ;
VOID CloseLibrary() ;
/* externe Strukturen */
struct IntuitionBase * IntuitionBase ;
struct GfxBase * GfxBase ;
/* Funktionen */
SHORT OpenLib()
{
if(!(IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",0)))
{ return (1) ; }
if(!(GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",0)))
{ return (2) ; }
return(0) ;
}
VOID CloseLib()
{
if(IntuitionBase) CloseLibrary(IntuitionBase);
if(GfxBase) CloseLibrary(GfxBase);
}
struct Window * win = NULL ;
struct RastPort * RP = NULL ;
struct Task *FindTask() ;
VOID Print() ;
VOID Block() ;
VOID Line() ;
ULONG GetMessage() ;
struct Window *GetWindow() ;
void * calloc() ;
extern long Lock(), Examine(), ExNext() ;
char * strsave() ;
struct Dir_Eintrag * sortiere_liste() ;
struct Dir_Eintrag {
struct Dir_Eintrag * next ;
struct Dir_Eintrag * prev ;
int ebene ;
char * name ;
} ;
struct anti_list {
struct anti_list * next ;
char * name ;
} ;
struct anti_list * anti_list_anf = NULL ;
struct Dir_Eintrag * Dir_Anfang = NULL ,
* Dir_Ende = NULL ,
* window_anf = NULL ,
* window_end = NULL ;
FILE * datei_zeiger,
* datei_zeiger1;
int i,
xpos = 0 ,
ypos = 0 ,
R_Rand = 8,
O_Rand = 11,
max_laenge = 0,
max_hoehe = 0,
max_window_height = 0 ,
TEXTCOL = 1 ,
MARKCOL = 3 ,
LINECOL = 2 ,
delay = 0 ,
scroll = 8 ,
new = 0 ,
list = 0 ,
sort = 0 ,
temp = 0 ,
file = 0 ;
char *prog_name,
command_string[100] ,
newdir[200] ,
newdirBCPL[200] ,
rootdir[40] ,
text1[40] ,
text2[80] ,
dirlist[50] ,
antilist[50] ,
configfile[50] ,
rootdir_list[5][40] = {
"DH0:",
"\0",
"\0",
"\0",
"\0"
} ;
/* ************************************************************************* */
main ( argc , argv )
int argc ;
char * argv[] ;
{
int zaehler = 0 ;
prog_name = "KCD" ;
sprintf( configfile, "s:%s.cfg" , prog_name ) ;
sprintf( dirlist , "s:%s.list" , prog_name ) ;
sprintf( antilist , "s:%s.antilist", prog_name ) ;
strcpy( command_string , "setenv NewPath %s" ) ;
if( datei_zeiger = fopen( configfile , "r" ) )
{
while ( lese_config_file( datei_zeiger ) )
{
if( !stricmp( text1 , "TEXTCOLOR" ) )
{ TEXTCOL = atoi(text2) ; continue ; }
if( !stricmp( text1 , "MARKCOLOR" ) )
{ MARKCOL = atoi(text2) ; continue ; }
if( !stricmp( text1 , "LINECOLOR" ) )
{ LINECOL = atoi(text2) ; continue ; }
if( !stricmp( text1 , "WINDOWX" ) )
{
xpos = atoi(text2) ;
if( xpos<0 )
xpos = 0 ;
continue ;
}
if( !stricmp( text1 , "WINDOWY" ) )
{
ypos = atoi(text2) ;
if( ypos<0 )
ypos = 0 ;
continue ;
}
if( !stricmp( text1 , "ROOTDIR" ) )
{ strcpy(rootdir_list[zaehler],text2) ; ++zaehler ; continue ; }
if( !stricmp( text1 , "DELAY" ) )
{ delay = atoi(text2) ; continue ; }
if( !stricmp( text1 , "SORT" ) )
{ sort = atoi(text2) ; continue ; }
if( !stricmp( text1 , "SCROLL" ) )
{
scroll = atoi(text2) ;
if( scroll<1 || scroll>4 )
scroll=8 ;
if( scroll == 3 )
scroll=4 ;
continue ;
}
if( !stricmp( text1 , "NOT" ) )
{ make_anti_list( text2 ) ; continue ; }
if( !stricmp( text1 , "COMMAND" ) )
{ strcpy( command_string , text2 ) ; continue ; }
printf("\n%s nicht erlaubt in Konfigurations-Datei %s.\n\n" , text1 , configfile ) ;
End(0) ;
}
}
fclose( datei_zeiger ) ;
if( argc>2 )
print_use() ;
if( argc == 2 )
{
if( argv[1][0] == '-' )
switch( argv[1][1] )
{
case 'n' :
case 'N' :
new = 1 ;
break ;
case 'l' :
case 'L' :
list = 1 ;
break ;
case '?' :
print_use() ;
break ;
case 'f' :
case 'F' :
strcpy( dirlist, argv[1]+2 ) ;
if( !fopen( dirlist ,"r") )
{
printf( "\nKann Datei `%s' nicht oeffnen !\n\n", dirlist ) ;
End(0) ;
}
file = 1 ;
break ;
default :
print_use() ;
}
else
{
int laenge ;
laenge = strlen(argv[1]) ;
temp = 1 ;
if( laenge == 1 && argv[1][0] == '?' )
print_use() ;
sprintf( dirlist, "RAM:%s.list", prog_name) ;
strcpy(rootdir_list[0],argv[1]) ;
if( (argv[1][laenge-1] != '/') &&
(argv[1][laenge-1] != ':') )
{
rootdir_list[0][laenge] = '/' ;
rootdir_list[0][laenge+1] = '\0' ;
}
rootdir_list[1][0] = '\0' ;
}
}
if(OpenLib())
printf("\nKann Library nicht oeffnen!\n\n"), exit(0) ;
if( !(datei_zeiger = fopen( dirlist ,"r")) || new || list || temp )
{
fclose( datei_zeiger ) ;
if( list )
{
if( datei_zeiger1 = fopen( antilist ,"r") )
{
printf( "\nDatei `%s' schon vorhanden.\n", antilist ) ;
printf( "-->Von Hand mit `delete %s' loeschen.\n\n", antilist ) ;
End(0) ;
}
if( !(datei_zeiger1 = fopen( antilist ,"w")) )
{
printf( "\nKann Datei `%s' nicht zum schreiben oeffnen !!\n\n", antilist ) ;
End(0) ;
}
}
else
if( !temp)
lese_anti_list() ;
if( datei_zeiger = fopen( dirlist ,"w"))
{
if( !temp )
printf("\nDirectory-Struktur wird ermittelt.\nBitte etwas Geduld.\n\n");
for( zaehler = 0 ; zaehler<6 && rootdir_list[zaehler][0]!='\0' ; ++zaehler )
{
strcpy( rootdir , rootdir_list[zaehler] ) ;
fprintf( datei_zeiger, " 0 %s\n", rootdir ) ;
if( !temp )
printf( "Untersuche %s\n", rootdir ) ;
search_dir( rootdir , 1 ) ;
if( sort )
Dir_Anfang = sortiere_liste( Dir_Anfang , 1 ) ;
for( window_anf = Dir_Anfang ; window_anf ; window_anf = window_anf->next )
fprintf( datei_zeiger , "%2d %s\n", window_anf->ebene , window_anf->name ) ;
Dir_Anfang = NULL ;
Dir_Ende = NULL ;
window_anf = NULL ;
window_end = NULL ;
}
fclose( datei_zeiger ) ;
if( !temp )
End(0) ;
else
{
max_laenge = 0 ;
max_hoehe = 0 ;
}
}
else
{
printf( "\nKann Datei `%s' nicht oeffnen !!\n\n", dirlist ) ;
End(0) ;
}
}
lese_structur() ;
if( max_hoehe == 1 )
{
printf( "Keine Unterverzeichnisse gefunden.\n") ;
End(0) ;
}
max_hoehe = 8*max_hoehe + 18 ;
if( max_hoehe > ACTIVE_SCREEN->Height )
max_hoehe = ACTIVE_SCREEN->Height ;
max_window_height = max_hoehe ;
if( max_hoehe+ypos > ACTIVE_SCREEN->Height )
max_hoehe = ACTIVE_SCREEN->Height - ypos ;
max_laenge += 20 ;
if( max_laenge < 110 )
max_laenge = 110 ;
if( max_laenge > ACTIVE_SCREEN->Width )
max_laenge = ACTIVE_SCREEN->Width ;
if( max_laenge+xpos > ACTIVE_SCREEN->Width )
xpos = ACTIVE_SCREEN->Width - max_laenge ;
if(!( win = GetWindow(xpos , ypos , max_laenge , max_hoehe , 0 ,
WINDOWCLOSE|ACTIVATE|WINDOWSIZING|WINDOWDRAG|REPORTMOUSE,
prog_name,0)))
End(0) ;
RP = win->RPort ;
strcpy( newdir , "" ) ;
zeige_structur() ;
End(0) ;
}
/* ************************************************************************* */
print_use()
{
printf( " %s 1.0 by Karsten Krauskopf, Feb 1990\n", prog_name );
printf( " USE: %s [ ? | -n | -l | -f<file> | <Directory> | <Device:> ]\n", prog_name );
printf( " ? .. dieser Text\n" );
printf( " -n .. Datei %s neu ermitteln\n", dirlist );
printf( " -l .. Datei %s neu ermitteln\n", antilist );
printf( " -f .. Struktur aus Datei <file>\n\n" );
End(0) ;
}
/* ************************************************************************* */
End( error )
int error ;
{
if ( win )
CloseWindow( win ) ;
CloseLib() ;
exit( error );
}
/* ************************************************************************* */
lese_config_file( datei )
FILE *datei ;
{
char zeile[120] ;
char *pointer, c ;
int textnummer = 0 , i ;
next_zeile:
if( !fgets(zeile,120,datei) )
return 0 ;
pointer = text1 ;
for( i=0 ; i<120 ; ++i )
{
switch( zeile[i] )
{
case '\n' :
case ';' :
i = 120 ;
break ;
case '\'' :
pointer = text2 ; ++i ;
*pointer = '\0' ;
while( zeile[i] < 120 )
{
if( zeile[i] == '\'' )
{ i = 120 ; textnummer = 4 ; break ; }
*pointer = zeile[i] ; ++pointer ; ++i ; *pointer = '\0' ;
}
break ;
case ' ' :
if( textnummer == 1 || textnummer == 3 )
{
++textnummer ;
if( textnummer == 2 )
pointer = text2 ;
}
break ;
default :
if( textnummer == 0 || textnummer == 2 )
++textnummer ;
*pointer = zeile[i] ;
++pointer ;
*pointer = '\0' ;
break ;
}
}
if( textnummer >= 3 )
return 1 ;
textnummer=0 ;
pointer=text1 ;
goto next_zeile ;
}
/* ************************************************************************* */
lese_anti_list()
{
char Directory[200] ;
struct anti_list *ptr ;
if( datei_zeiger1 = fopen( antilist ,"r") )
while ( fgets( &Directory , 200 , datei_zeiger1 ) )
if( Directory[0] == '-' )
{
Directory[strlen(Directory)-1] = '\0' ;
make_anti_list( &Directory[1] ) ;
}
fclose( datei_zeiger1 ) ;
}
/* ************************************************************************* */
make_anti_list( Dir_Name )
char *Dir_Name ;
{
static struct anti_list *new_entry = NULL ,
*ptr ;
static int new_entry_counter = 101 ;
++new_entry ;
if( (++new_entry_counter) > 100 )
{
new_entry_counter = 1 ;
if ( !(new_entry = (struct anti_list *) calloc(100,sizeof(struct anti_list))) )
platzprobleme() ;
}
new_entry->next = (struct anti_list *) NULL ;
new_entry->name = strsave( Dir_Name ) ;
if( !anti_list_anf )
{
anti_list_anf = new_entry ;
ptr = new_entry ;
return ;
}
ptr->next = new_entry ;
ptr = new_entry ;
}
/* ************************************************************************* */
suche_anti_list( Dir_Name )
char *Dir_Name ;
{
struct anti_list *ptr ;
for( ptr = anti_list_anf ; ptr ; ptr = ptr->next )
if( !stricmp( Dir_Name , ptr->name ) )
return 1 ;
return 0 ;
}
/* ************************************************************************* */
search_dir( name , ebene )
char *name ;
int ebene ;
{
struct FileInfoBlock * fib ;
BPTR lok ;
char temp[200] ;
int i ;
if(!(lok=Lock (name,ACCESS_READ)))
{
printf( "\nDirectory %s nicht gefunden.\n\n", name ) ;
End(0) ;
}
if (!(fib = (struct FileInfoBlock *) calloc(1,sizeof(struct FileInfoBlock))))
{
printf ("\nCan't allocate FileInfoBlock.\n\n") ;
End(0) ;
}
if(!Examine(lok,fib))
{
printf("\nExamine failed.\n\n") ;
End(0) ;
}
while ( ExNext( lok , fib ) )
if( fib->fib_DirEntryType > 0 )
{
strcpy( temp , name );
if (ebene == 1)
strcat(temp,fib->fib_FileName);
else
strcat(temp,"/"),strcat(temp,fib->fib_FileName);
if( list )
{
if( !suche_anti_list( temp ) )
{
fprintf( datei_zeiger1, "%s\n" , temp ) ;
make_eintrag( ebene , fib->fib_FileName ) ;
search_dir( temp , ebene+1 ) ;
}
}
else
if( !suche_anti_list( temp ) )
{
make_eintrag( ebene , fib->fib_FileName ) ;
search_dir( temp , ebene+1 ) ;
}
}
ende:
if ( lok ) UnLock( lok ) ;
}
/* ************************************************************************* */
lese_structur()
{
char Directory[35] ;
if( !( datei_zeiger = fopen( dirlist , "r" )))
{
printf("\nKann Datei `%s' nicht oeffnen !!!\n\n", dirlist ) ;
End(0) ;
}
while ( fgets( &Directory , 35 , datei_zeiger ) )
{
Directory[strlen(Directory)-1] = '\0' ;
Directory[2] = '\0' ;
make_eintrag( atoi(Directory) , &Directory[3] ) ;
}
if( max_hoehe < 1 )
{
printf("\nDatei `%s' hat keine Eintraege !!\n\n", dirlist ) ;
End(0) ;
}
}
/* ************************************************************************* */
make_eintrag( Ebene , Dir_Name )
int Ebene ;
char *Dir_Name ;
{
static struct Dir_Eintrag *new_entry = NULL ;
static int new_entry_counter = 101 ;
++max_hoehe ;
++new_entry ;
if( (++new_entry_counter) > 100 )
{
new_entry_counter = 1 ;
if ( !(new_entry = (struct Dir_Eintrag *) calloc(100,sizeof(struct Dir_Eintrag))) )
platzprobleme() ;
}
if( max_laenge < ( R_Rand + Ebene*32 + 8*strlen(Dir_Name) ) )
max_laenge = R_Rand + Ebene*32 + 8*strlen(Dir_Name) ;
if( Dir_Anfang )
{
new_entry->next = (struct Dir_Eintrag *) NULL ;
new_entry->prev = Dir_Ende ;
new_entry->ebene = Ebene ;
new_entry->name = strsave( Dir_Name ) ;
Dir_Ende->next = new_entry ;
Dir_Ende = new_entry ;
return ;
}
new_entry->next = (struct Dir_Eintrag *) NULL ;
new_entry->prev = (struct Dir_Eintrag *) NULL ;
new_entry->ebene = Ebene ;
new_entry->name = strsave( Dir_Name ) ;
Dir_Anfang = new_entry ;
Dir_Ende = new_entry ;
}
/* ************************************************************************* */
char *strsave(s)
register char *s ;
{
register char * cp = calloc( strlen(s)+1, 1 ) ;
if ( cp )
{
strcpy( cp , s ) ;
return cp ;
}
platzprobleme() ;
}
/* ************************************************************************* */
struct Dir_Eintrag * hole_eintrag( position )
int position ;
{
struct Dir_Eintrag * ptr ;
for( ptr = window_anf ; ptr ; ptr = ptr->next , --position )
if( !position ) return ptr ;
}
/* ************************************************************************* */
ermittle_dir( pointer )
struct Dir_Eintrag * pointer ;
{
struct Dir_Eintrag * ptr ;
int ebene ;
char temp[200] ;
ebene = pointer->ebene ;
strcpy( newdir , pointer->name ) ;
for( ptr = pointer ; ptr ; ptr = ptr->prev )
if( ptr->ebene < ebene )
{
ebene = ptr->ebene ;
strcpy( temp , ptr->name ) ;
if( ptr->ebene >0 )
strcat( temp , "/" ) ;
strcat( temp , newdir ) ;
strcpy( newdir , temp ) ;
}
newdirBCPL[0] = (char)strlen(newdir) ;
newdirBCPL[1] = '\0' ;
strcat( newdirBCPL , newdir ) ;
}
/* ************************************************************************* */
zeige_structur()
{
int i,
pos,
pos_alt,
x,
y,
anzahl_zeilen,
anzahl_spalten,
hoehe,
breite ,
activ = 1 ;
struct Dir_Eintrag * ptr = NULL ;
ModifyIDCMP( win , MOUSEBUTTONS|CLOSEWINDOW|REFRESHWINDOW ) ;
anfang:
anzahl_zeilen = (win->Height-13)/8 ;
anzahl_spalten = (win->Width-25)/8 ;
hoehe = win->Height ;
breite = win->Width ;
i = 0 ;
for ( ptr = Dir_Anfang ; ptr ; ptr = ptr->next )
{
if ( i == anzahl_zeilen )
break ;
zeige_eintrag( ptr , i ) ;
++i ;
}
window_anf = Dir_Anfang ;
if( ptr )
window_end = ptr->prev ;
else
window_end = Dir_Ende ;
pos_alt = -1 ;
while( 1 )
{
while(ACTIVE_WINDOW != win)
{ Delay(10) ; activ = 0 ; }
if( delay )
Delay(delay) ;
if ( win->Height != hoehe || win->Width != breite )
{
Block(RP,0,2,11,win->Width-17,win->Height-2);
goto anfang;
}
pos = ((win->MouseY)-12)/8 ;
if ( pos != pos_alt && pos>=0 && pos<anzahl_zeilen )
{
if( pos_alt >= 0 )
{
ptr = hole_eintrag( pos_alt ) ;
x = R_Rand + ptr->ebene*32 ; y = 18+pos_alt*8 ;
Print(RP, ptr->name, TEXTCOL, x, y) ;
}
ptr = hole_eintrag( pos ) ;
x = R_Rand + ptr->ebene*32 ; y = 18+pos*8 ;
Print(RP, ptr->name, MARKCOL , x, y) ;
pos_alt = pos ;
}
if ( pos <= 0 && window_anf != Dir_Anfang )
{
int z ;
window_anf = window_anf->prev ;
window_end = window_end->prev ;
++pos_alt ;
for( z=0 ; z<8 ; z+=scroll )
ScrollRaster(RP,0,-scroll,2,11,win->Width-17,O_Rand+anzahl_zeilen*8) ;
zeige_eintrag( window_anf , 0 ) ;
}
if (pos >= anzahl_zeilen-1 && window_end != Dir_Ende )
{
int z ;
window_anf = window_anf->next ;
window_end = window_end->next ;
--pos_alt ;
for( z=0 ; z<8 ; z+=scroll )
ScrollRaster(RP,0,scroll,2,11,win->Width-17,O_Rand+anzahl_zeilen*8) ;
zeige_eintrag( window_end , anzahl_zeilen-1 ) ;
}
if( GetMessage( win ) )
{
if ( (CLASS == MOUSEBUTTONS) && ptr )
{
if( activ )
{
char temp[200] ;
ermittle_dir( ptr ) ;
sprintf( temp , command_string , newdir ) ;
Execute( temp , 0 , 0 ) ;
End(0) ;
}
else
if ( Message->Code == SELECTUP )
activ = 1 ;
}
if ( CLASS == CLOSEWINDOW )
{
Execute( "setenv newpath" , 0 , 0 ) ;
break ;
}
}
}
}
/* ************************************************************************* */
zeige_eintrag( eintrag , zeile )
struct Dir_Eintrag * eintrag ;
int zeile ;
{
int x, y, j, ebene ;
struct Dir_Eintrag * ptr ;
x = R_Rand +(eintrag->ebene)*32 ; y = O_Rand+7+zeile*8 ;
Print( RP , eintrag->name , TEXTCOL , x , y ) ;
if( eintrag->ebene )
{
if( eintrag->next && ( eintrag->ebene == eintrag->next->ebene ) )
Line( RP,LINECOL,x-18,y-7,x-18,y );
else
Line( RP,LINECOL,x-18,y-7,x-18,y-3 ) ;
Line(RP,LINECOL,x-18,y-3,x-2,y-3) ;
ebene = eintrag->ebene ;
ptr = eintrag ;
while ( ptr )
{
ptr = ptr->next ;
if( ptr->ebene < ebene )
{
ebene = ptr->ebene ;
x = R_Rand+ebene*32 ; y = 18+zeile*8 ;
Line(RP,LINECOL,x-18,y-7,x-18,y);
}
}
}
}
/* ************************************************************************* */
struct Window *GetWindow(left,top,width,height,idcmp,flags,title,gad)
SHORT left,top,width,height ;
ULONG idcmp,flags ;
STRPTR title ;
struct Gadget *gad ;
{
struct NewWindow NW ;
NW.LeftEdge = left ;
NW.TopEdge = top ;
NW.Width = width ;
NW.Height = height ;
NW.DetailPen = -1 ;
NW.BlockPen = -1 ;
NW.IDCMPFlags = idcmp ;
NW.Flags = flags ;
NW.FirstGadget = gad ;
NW.CheckMark = NULL ;
NW.Title = title ;
NW.Screen = ACTIVE_SCREEN ;
NW.BitMap = NULL ;
NW.MinWidth = width ;
NW.MinHeight = 34 ;
NW.MaxWidth = width ;
NW.MaxHeight = max_window_height ;
NW.Type = WBENCHSCREEN ;
return(OpenWindow(&NW)) ;
}
/* ************************************************************************* */
ULONG GetMessage(MW) /* Intuition-Message lesen */
struct Window *MW ;
{
ULONG class = 0 ;
if ( Message = GetMsg(MW->UserPort))
{
class = Message->Class ;
ReplyMsg(Message) ;
}
return class ;
}
/* ************************************************************************* */
VOID Line(RP, col, x1, y1, x2, y2)
struct RastPort *RP ;
SHORT col, x1, y1, x2, y2 ;
{
SetDrMd(RP, JAM1) ;
SetAPen(RP, col) ;
Move(RP, x1, y1) ;
Draw(RP, x2, y2) ;
}
/* ************************************************************************* */
VOID Block(RP, col, x1, y1, x2, y2)
struct RastPort *RP ;
SHORT col, x1, y1, x2, y2 ;
{
if ( (x1>x2)||(y1>y2)) return ;
SetDrMd(RP, JAM1) ;
SetAPen(RP, col) ;
RectFill(RP, x1, y1, x2, y2) ;
}
/* ************************************************************************* */
VOID Print(RP, text, col, xpos, ypos)
struct RastPort *RP ;
STRPTR text ;
SHORT col, xpos, ypos ;
{
SetDrMd(RP, JAM1) ;
SetAPen(RP, col) ;
Move(RP, xpos, ypos);
Text(RP, text, strlen(text));
}
/* ************************************************************************* */
platzprobleme()
{
printf( "\nKein Platz mehr fuer weiter Eintraege.\n\n") ;
End(0) ;
}
/* ************************************************************************* */
int stricmp(str1,str2)
register char *str1,*str2;
{
register int index = 0;
while ( str1[index] && str2[index] && tolower(str1[index]) == tolower(str2[index]) )
++index;
return( (tolower(str1[index]) < tolower(str2[index])) ? -1 :
( (tolower(str1[index]) > tolower(str2[index])) ? 1 : 0) );
}
/* ************************************************************************* */
struct Dir_Eintrag * sortiere_liste( anfang , ebene )
struct Dir_Eintrag * anfang ;
int ebene ;
{
struct Dir_Eintrag * ptr1 , * ptr2 ;
ptr1 = anfang ;
ptr2 = ptr1 ;
while( ptr2 && (ptr2->ebene >= ebene) )
{
if( ptr2->ebene > ebene )
{
ptr2 = sortiere_liste( ptr2 , ebene+1 ) ;
while( ptr2 && (ptr2->ebene > ebene) )
ptr2 = ptr2->next ;
continue ;
}
ptr2 = ptr2->next ;
}
while( 1 )
{
while( ptr1 && (ptr1->ebene != ebene) )
ptr1 = ptr1->next ;
if( !ptr1 || (ptr1->ebene < ebene ) )
break ;
ptr2 = ptr1->next ;
while(1)
{
while( ptr2 && (ptr2->ebene > ebene) )
ptr2 = ptr2->next ;
if( !ptr2 || (ptr2->ebene < ebene ) )
break ;
if( ( sort > 0 && stricmp( ptr1->name , ptr2->name ) > 0 ) ||
( sort < 0 && stricmp( ptr1->name , ptr2->name ) < 0 ) )
{
struct Dir_Eintrag * hilf1 , *hilf2 , *hilf3 ;
hilf1 = ptr1 ;
while( hilf1->next && (hilf1->next->ebene > ebene ))
hilf1 = hilf1->next ;
hilf2 = ptr2 ;
while( hilf2->next && (hilf2->next->ebene > ebene ))
hilf2 = hilf2->next ;
if( ptr1 == anfang )
anfang = ptr2 ;
ptr1->prev->next = ptr2 ;
ptr2->prev->next = ptr1 ;
hilf3 = hilf1->next ;
hilf1->next = hilf2->next ;
hilf2->next = hilf3 ;
hilf3 = ptr1->prev ;
ptr1->prev = ptr2->prev ;
ptr2->prev = hilf3 ;
if( hilf2->next )
hilf2->next->prev = hilf2 ;
if( hilf1->next )
hilf1->next->prev = hilf1 ;
hilf3 = ptr1 ;
ptr1 = ptr2 ;
ptr2 = hilf3 ;
}
ptr2 = ptr2->next ;
}
ptr1 = ptr1->next ;
}
return anfang ;
}