]> code.citadel.org Git - citadel.git/commitdiff
added a nested ungoto list, so you can ungoto 100 times.
authorStu Mark <theeverything@citadel.org>
Sun, 17 Feb 2002 22:14:25 +0000 (22:14 +0000)
committerStu Mark <theeverything@citadel.org>
Sun, 17 Feb 2002 22:14:25 +0000 (22:14 +0000)
citadel/citadel.c
citadel/citadel.h
citadel/rooms.c

index 4826c247a738d9e1bc2ad15e8ba466f9fc3d9179..4ce0f8ec13d660f2c27b5c2af1f92dadbb4b793f 100644 (file)
@@ -83,8 +83,9 @@ int screenwidth;
 int screenheight;
 unsigned room_flags;
 char room_name[ROOMNAMELEN];
-char ugname[ROOMNAMELEN];
-long uglsn;                    /* holds <u>ngoto info */
+char *uglist[UGLISTLEN]; /* size of the ungoto list */
+long uglistlsn[UGLISTLEN]; /* current read position for all the ungoto's. Not going to make any friends with this one. */
+int uglistsize = 0;
 char is_mail = 0;              /* nonzero when we're in a mail room */
 char axlevel = 0;              /* access level */
 char is_room_aide = 0;         /* boolean flag, 1 if room aide */
@@ -117,9 +118,15 @@ extern int rc_ansi_color;  /* ansi color value from citadel.rc */
  */
 void logoff(int code)
 {
+    int lp;
        if (editor_pid > 0) {   /* kill the editor if it's running */
                kill(editor_pid, SIGHUP);
        }
+
+    /* Free the ungoto list */
+    for (lp = 0; lp < uglistsize; lp++)
+      free (uglist[lp]);
+
 /* shut down the server... but not if the logoff code is 3, because
  * that means we're exiting because we already lost the server
  */
@@ -319,7 +326,7 @@ char *pop_march(int desired_floor)
 /*
  * jump directly to a room
  */
-void dotgoto(char *towhere, int display_name)
+void dotgoto(char *towhere, int display_name, int fromungoto)
 {
        char aaa[SIZ], bbb[SIZ], psearch[SIZ];
        static long ls = 0L;
@@ -327,11 +334,30 @@ void dotgoto(char *towhere, int display_name)
        static int oldmailcount = (-1);
        int partial_match, best_match;
        char from_floor;
+    int ugpos = uglistsize;
 
        /* store ungoto information */
-       strcpy(ugname, room_name);
-       uglsn = ls;
-
+    if (fromungoto == 0)
+      {
+        if (uglistsize >= (UGLISTLEN-1))
+          {  /* sloppy slide them all down, hey it's the client, who cares. :-) */
+            int lp;
+            free (uglist[0]);
+            for (lp = 0; lp < (UGLISTLEN-1); lp++)
+              {
+                uglist[lp] = uglist[lp+1];
+                uglistlsn[lp] = uglistlsn[lp+1];
+              }
+            ugpos--;
+          }
+        else
+          uglistsize++;
+        
+        uglist[ugpos] = malloc(strlen(room_name)+1);
+        strcpy(uglist[ugpos], room_name);
+        uglistlsn[ugpos] = ls;
+      }
+      
        /* first try an exact match */
        snprintf(aaa, sizeof aaa, "GOTO %s", towhere);
        serv_puts(aaa);
@@ -505,7 +531,7 @@ void gotonext(void)
                strcpy(next_room, "_BASEROOM_");
        }
        remove_march(next_room, 0);
-       dotgoto(next_room, 1);
+       dotgoto(next_room, 1, 0);
 }
 
 /*
@@ -559,14 +585,14 @@ void gf_toroom(char *towhere, int mode)
 
        if (mode == GF_GOTO) {  /* <;G>oto mode */
                updatels();
-               dotgoto(towhere, 1);
+               dotgoto(towhere, 1, 0);
        }
        if (mode == GF_SKIP) {  /* <;S>kip mode */
-               dotgoto(towhere, 1);
+               dotgoto(towhere, 1, 0);
                remove_march("_FLOOR_", floor_being_left);
        }
        if (mode == GF_ZAP) {   /* <;Z>ap mode */
-               dotgoto(towhere, 1);
+               dotgoto(towhere, 1, 0);
                remove_march("_FLOOR_", floor_being_left);
                forget_all_rooms_on(floor_being_left);
        }
@@ -1215,11 +1241,10 @@ PWOK:
 
 
        /* Enter the lobby */
-       dotgoto("_BASEROOM_", 1);
+       dotgoto("_BASEROOM_", 1, 0);
 
 /* Main loop for the system... user is logged in. */
-       strcpy(ugname, "");
-       uglsn = 0L;
+    uglistsize = 0;
 
        if (newnow == 1)
                readmsgs(3, 1, 5);
@@ -1270,20 +1295,20 @@ PWOK:
                        case 90:
                                if (!rc_alt_semantics)
                                        updatelsa();
-                               dotgoto(argbuf, 0);
+                               dotgoto(argbuf, 0, 0);
                                break;
                        case 58:
                                updatelsa();
-                               dotgoto("_MAIL_", 1);
+                               dotgoto("_MAIL_", 1, 0);
                                break;
                        case 20:
                                updatels();
-                               dotgoto(argbuf, 0);
+                               dotgoto(argbuf, 0, 0);
                                break;
                        case 52:
                                if (rc_alt_semantics)
                                        updatelsa();
-                               dotgoto(argbuf, 0);
+                               dotgoto(argbuf, 0, 0);
                                break;
                        case 10:
                                readmsgs(0, 1, 0);
index 357df0e21f32a2637e0fd7e1b73ac007ebce1ad2..39f2b17568b89a1803dc7a1e4be88d8d153764fd 100644 (file)
@@ -55,6 +55,7 @@ typedef unsigned char CIT_UBYTE;
 
 /* Various length constants */
 
+#define UGLISTLEN   100   /* you get a ungoto list of this size */
 #define ROOMNAMELEN    128             /* The size of a roomname string */
 #define NONCE_SIZE     128             /* Added by <bc> to allow for APOP auth 
                                         * it is BIG becuase there is a hostname
index 7940bb2c2a1638a1557a6137d3ae52777db44472..66395de4cdc93853c1103ad1521acce2d1c1a1f2 100644 (file)
@@ -37,7 +37,7 @@ void hit_any_key(void);
 int yesno(void);
 void strprompt(char *prompt, char *str, int len);
 void newprompt(char *prompt, char *str, int len);
-void dotgoto(char *towhere, int display_name);
+void dotgoto(char *towhere, int display_name, int fromungoto);
 void serv_read(char *buf, int bytes);
 void formout(char *name);
 int inkey(void);
@@ -63,7 +63,9 @@ extern char curr_floor;
 
 extern int ugnum;
 extern long uglsn;
-extern char ugname[];
+extern char *uglist[];
+extern long uglistlsn[];
+extern int uglistsize;
 
 extern char floorlist[128][SIZ];
 
@@ -561,7 +563,7 @@ void editthisroom(void)
                serv_gets(buf);
                scr_printf("%s\n", &buf[4]);
                if (buf[0] == '2')
-                       dotgoto(rname, 2);
+                       dotgoto(rname, 2, 0);
        }
 }
 
@@ -572,25 +574,25 @@ void editthisroom(void)
 void ungoto(void)
 {
        char buf[SIZ];
-
-       if (!strcmp(ugname, ""))
-               return;
-       snprintf(buf, sizeof buf, "GOTO %s", ugname);
+    if (uglistsize == 0)
+      return;
+       snprintf(buf, sizeof buf, "GOTO %s", uglist[uglistsize-1]); 
        serv_puts(buf);
        serv_gets(buf);
        if (buf[0] != '2') {
                scr_printf("%s\n", &buf[4]);
                return;
        }
-       sprintf(buf, "SLRP %ld", uglsn);
+       sprintf(buf, "SLRP %ld", uglistlsn[uglistsize-1]); 
        serv_puts(buf);
        serv_gets(buf);
        if (buf[0] != '2') {
                scr_printf("%s\n", &buf[4]);
        }
-       safestrncpy(buf, ugname, sizeof buf);
-       strcpy(ugname, "");
-       dotgoto(buf, 0);
+    safestrncpy (buf, uglist[uglistsize-1], sizeof(buf));
+    uglistsize--;
+    free(uglist[uglistsize]);
+       dotgoto(buf, 0, 1); /* Don't queue ungoto info or we end up in a loop */
 }
 
 
@@ -869,7 +871,7 @@ void killroom(void)
        scr_printf("%s\n", &aaa[4]);
        if (aaa[0] != '2')
                return;
-       dotgoto("_BASEROOM_", 0);
+       dotgoto("_BASEROOM_", 0, 0);
 }
 
 void forget(void)
@@ -888,7 +890,7 @@ void forget(void)
        }
 
        /* now return to the lobby */
-       dotgoto("_BASEROOM_", 0);
+       dotgoto("_BASEROOM_", 0, 0);
 }
 
 
@@ -976,7 +978,7 @@ void entroom(void)
        }
 
        /* command succeeded... now GO to the new room! */
-       dotgoto(new_room_name, 0);
+       dotgoto(new_room_name, 0, 0);
 }