#include <time.h> #include <stdio.h> #include <rmsdef.h> #include <descrip.h> #include "LPMUD_DIR:[secure]security.h" void get_list (char *); void sort_list (void); void print_list (void); struct player_struct { char name [40]; char level_title [80]; int level; int experience; int age; }; /*** Because this is a virtual memory machine, and this won't ***/ /*** normally be run when the mud is running, this array is o.k. ***/ /*** large, but o.k. ***/ struct player_struct players [5000]; static int player_number; main () { get_list ("LPMUD_DIR:[mudlib.players]*.o"); sort_list (); print_list (); } void get_list (char * path) { /* Declare storage for the input file name, and the output file name */ /* The VAX will want these in stupid descriptor form, hence the strange */ /* declarations. */ static $DESCRIPTOR (filespec, "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"); static $DESCRIPTOR (new_files, "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"); /* The context for the find_file call, so I can get multiple files using */ /* wild card stuff. */ unsigned long context = 0; /* The returned value from the call. */ long status; /* number of files found */ int file_count = 0; /* So we can re-initialize the length of the new_files descriptor */ int old_length; /* Your basic dummy variables. */ int i, j; strcpy (filespec.dsc$a_pointer, path); filespec.dsc$w_length = strlen (filespec.dsc$a_pointer); old_length = new_files . dsc$w_length; again: new_files . dsc$w_length = old_length; /* Go get me a file that matches that filespec */ status = lib$find_file (&filespec, &new_files, &context, 0, 0, 0, 0); if (status & 1) { get_info (new_files . dsc$a_pointer); file_count ++; goto again; } else if (status == RMS$_FNF) printf ("File not found!\n"); else if (status == RMS$_DNF) printf ("Directory not found!\n"); else if (status == RMS$_NMF) ; /* Do nothing. We go to the end of the list. */ else if (! (status & 1)) { printf ("Status = %X\n", status); lib$signal (status); } /*** Free up file_find context memory. ***/ lib$find_file_end (&context); } get_info (char * filename) { FILE * f; char line [250]; int level; char cap_name [40]; char level_title [80]; int age; int exp; f = fopen (filename, "r"); while (! feof (f)) { fgets (line, 249, f); if (sscanf (line, "level %d", &level) == 1) players [player_number] . level = level; if (sscanf (line, "age %d", &age) == 1) players [player_number] . age = age; if (sscanf (line, "experience %d", &exp) == 1) players [player_number] . experience = exp; if (sscanf (line, "cap_name %s", cap_name) == 1) strcpy (players [player_number] . name, cap_name); if (sscanf (line, "title %s", level_title) == 1) strcpy (players [player_number] . level_title, level_title); } if (level < EXPLORE) player_number ++; fclose (f); } void sort_list () { int i, j; struct player_struct temp; for (i = 0; i < player_number; i ++) for (j = i + 1; j < player_number; j ++) { if (players [i] . experience < players [j] . experience) { temp . experience = players [i] . experience; temp . level = players [i] . level; temp . age = players [i] . age; strcpy (temp . name, players [i] . name); strcpy (temp . level_title, players [i] . level_title); players [i] . experience = players [j] . experience; players [i] . level = players [j] . level; players [i] . age = players [j] . age; strcpy (players [i] . name, players [j] . name); strcpy (players [i] . level_title, players [j] . level_title); players [j] . experience = temp . experience; players [j] . level = temp . level; players [j] . age = temp . age; strcpy (players [j] . name, temp . name); strcpy (players [j] . level_title, temp . level_title); } } } void print_list () { FILE * f; int i; int t; f = fopen ("LPMUD_DIR:[mudlib]top.players", "w"); t = time ("EST"); fprintf (f, "Top Players list at %s\n", ctime (& t)); fprintf (f, "Rank\t\t\tName\t\t\tLevel\n"); if (player_number > 10) player_number = 10; for (i = 0; i < player_number; i++) fprintf (f, "<%2d>\t%20s\t\t\t%3d\n", i + 1, players [i] . name, players [i] . level); fclose (f); }