* core.c, exec.c, solib.c: Rename target_ops sections =>
authorJohn Gilmore <gnu@cygnus>
Fri, 21 Feb 1992 01:35:32 +0000 (01:35 +0000)
committerJohn Gilmore <gnu@cygnus>
Fri, 21 Feb 1992 01:35:32 +0000 (01:35 +0000)
to_sections, etc.
* infcmd.c, inflow.c, infptrace.c, infrun.c, main.c, target.c,
target.h:  target_kill takes no args.

gdb/infcmd.c
gdb/inflow.c
gdb/infptrace.c
gdb/main.c
gdb/solib.c

index f387ba0308cbe3c668a96e27374489eaaaab52d1..7f35a2baf1149af71b1ce7d29fc5a1e6b3d983cb 100644 (file)
@@ -1,28 +1,27 @@
-/* Memory-access and commands for inferior process, for GDB.
-   Copyright (C) 1986, 1987, 1988, 1989 Free Software Foundation, Inc.
+/* Memory-access and commands for "inferior" (child) process, for GDB.
+   Copyright 1986, 1987, 1988, 1989, 1991, 1992 Free Software Foundation, Inc.
 
 This file is part of GDB.
 
-GDB is free software; you can redistribute it and/or modify
+This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 1, or (at your option)
-any later version.
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
 
-GDB is distributed in the hope that it will be useful,
+This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
-along with GDB; see the file COPYING.  If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #include <stdio.h>
 #include <signal.h>
 #include <sys/param.h>
 #include <string.h>
 #include "defs.h"
-#include "param.h"
 #include "symtab.h"
 #include "frame.h"
 #include "inferior.h"
@@ -149,7 +148,7 @@ run_command (args, from_tty)
          !query ("The program being debugged has been started already.\n\
 Start it from the beginning? "))
        error ("Program not restarted.");
-      target_kill ((char *)0, 0);
+      target_kill ();
     }
 
   exec_file = (char *) get_exec_file (0);
@@ -161,7 +160,7 @@ Start it from the beginning? "))
   if (args)
     {
       char *cmd;
-      cmd = concat ("set args ", args, "");
+      cmd = concat ("set args ", args, NULL);
       make_cleanup (free, cmd);
       execute_command (cmd, from_tty);
     }
@@ -356,8 +355,7 @@ jump_command (arg, from_tty)
   if (sal.symtab == 0 && sal.pc == 0)
     error ("No source file has been specified.");
 
-  if (sal.pc == 0)
-    sal.pc = find_line_pc (sal.symtab, sal.line);
+  resolve_sal_pc (&sal);                       /* May error out */
 
   {
     struct symbol *fn = get_frame_function (get_current_frame ());
@@ -368,13 +366,10 @@ jump_command (arg, from_tty)
       error ("Not confirmed.");
   }
 
-  if (sal.pc == 0)
-    error ("No line %d in file \"%s\".", sal.line, sal.symtab->filename);
-
   addr = ADDR_BITS_SET (sal.pc);
 
   if (from_tty)
-    printf ("Continuing at 0x%x.\n", addr);
+    printf ("Continuing at %s.\n", local_hex_string(addr));
 
   clear_proceed_status ();
   proceed (addr, 0, 0);
@@ -419,7 +414,7 @@ signal_command (signum_exp, from_tty)
    returns to its caller with that frame already gone.
    Otherwise, the caller never gets returned to.  */
 
-/* 4 => return instead of letting the stack dummy run.  */
+/* DEBUG HOOK:  4 => return instead of letting the stack dummy run.  */
 
 static int stack_dummy_testing = 0;
 
@@ -554,10 +549,12 @@ finish_command (arg, from_tty)
   fi = get_frame_info (selected_frame);
   function = find_pc_function (fi->pc);
 
+  /* Print info on the selected frame, including level number
+     but not source.  */
   if (from_tty)
     {
-      printf ("Run till exit from ");
-      print_selected_frame ();
+      printf_filtered ("Run till exit from ");
+      print_stack_frame (selected_frame, selected_frame_level, 0);
     }
 
   proceed_to_finish = 1;               /* We want stop_registers, please... */
@@ -584,9 +581,9 @@ finish_command (arg, from_tty)
                                   value_type,
                BLOCK_GCC_COMPILED (SYMBOL_BLOCK_VALUE (function))));
 
-      printf ("Value returned is $%d = ", record_latest_value (val));
+      printf_filtered ("Value returned is $%d = ", record_latest_value (val));
       value_print (val, stdout, 0, Val_no_prettyprint);
-      putchar ('\n');
+      printf_filtered ("\n");
     }
 }
 \f
@@ -606,7 +603,7 @@ program_info (args, from_tty)
     }
 
   target_files_info ();
-  printf ("Program stopped at 0x%x.\n", stop_pc);
+  printf ("Program stopped at %s.\n", local_hex_string(stop_pc));
   if (stop_step)
     printf ("It stopped after being stepped.\n");
   else if (num != 0)
@@ -787,31 +784,38 @@ write_pc (val)
 char *reg_names[] = REGISTER_NAMES;
 
 /* Print out the machine register regnum. If regnum is -1,
-   print all registers.
+   print all registers (fpregs == 1) or all non-float registers
+   (fpregs == 0).
+
    For most machines, having all_registers_info() print the
    register(s) one per line is good enough. If a different format
-   is required, (eg, for SPARC or Pyramid 90x, which both have
+   is required, (eg, for MIPS or Pyramid 90x, which both have
    lots of regs), or there is an existing convention for showing
-   all the registers, define the macro DO_REGISTERS_INFO(regnum)
+   all the registers, define the macro DO_REGISTERS_INFO(regnum, fp)
    to provide that format.  */  
+
 #if !defined (DO_REGISTERS_INFO)
-#define DO_REGISTERS_INFO(regnum) do_registers_info(regnum)
-static void do_registers_info (regnum)
+#define DO_REGISTERS_INFO(regnum, fp) do_registers_info(regnum, fp)
+static void
+do_registers_info (regnum, fpregs)
      int regnum;
+     int fpregs;
 {
   register int i;
 
-  if (regnum == -1)
-    printf_filtered (
-      "Register       Contents (relative to selected stack frame)\n\n");
-
   for (i = 0; i < NUM_REGS; i++)
     {
       char raw_buffer[MAX_REGISTER_RAW_SIZE];
       char virtual_buffer[MAX_REGISTER_VIRTUAL_SIZE];
 
-      if (regnum != -1 && i != regnum)
-       continue;
+      /* Decide between printing all regs, nonfloat regs, or specific reg.  */
+      if (regnum == -1) {
+       if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (i)) == TYPE_CODE_FLT && !fpregs)
+         continue;
+      } else {
+        if (i != regnum)
+         continue;
+      }
 
       fputs_filtered (reg_names[i], stdout);
       print_spaces_filtered (15 - strlen (reg_names[i]), stdout);
@@ -873,8 +877,9 @@ static void do_registers_info (regnum)
 #endif /* no DO_REGISTERS_INFO.  */
 
 static void
-registers_info (addr_exp)
+registers_info (addr_exp, fpregs)
      char *addr_exp;
+     int fpregs;
 {
   int regnum;
 
@@ -900,7 +905,21 @@ registers_info (addr_exp)
   else
     regnum = -1;
 
-  DO_REGISTERS_INFO(regnum);
+  DO_REGISTERS_INFO(regnum, fpregs);
+}
+
+static void
+all_registers_info (addr_exp)
+     char *addr_exp;
+{
+  registers_info (addr_exp, 1);
+}
+
+static void
+nofp_registers_info (addr_exp)
+     char *addr_exp;
+{
+  registers_info (addr_exp, 0);
 }
 \f
 /*
@@ -1022,12 +1041,13 @@ This path is equivalent to the $PATH shell variable.  It is a list of\n\
 directories, separated by colons.  These directories are searched to find\n\
 fully linked executable files and separately compiled object files as needed.");
 
-  add_info ("path", path_info,
+  c = add_cmd ("paths", no_class, path_info,
            "Current search path for finding object files.\n\
 $cwd in the path means the current working directory.\n\
 This path is equivalent to the $PATH shell variable.  It is a list of\n\
 directories, separated by colons.  These directories are searched to find\n\
-fully linked executable files and separately compiled object files as needed.");
+fully linked executable files and separately compiled object files as needed.", &showlist);
+  c->completer = noop_completer;
 
  add_com ("attach", class_run, attach_command,
           "Attach to a process or file outside of GDB.\n\
@@ -1100,8 +1120,12 @@ To cancel previous arguments and run with no arguments,\n\
 use \"set args\" without arguments.");
   add_com_alias ("r", "run", class_run, 1);
 
-  add_info ("registers", registers_info,
-           "List of registers and their contents, for selected stack frame.\n\
+  add_info ("registers", nofp_registers_info,
+    "List of integer registers and their contents, for selected stack frame.\n\
+Register name as argument means describe only that register.");
+
+  add_info ("all-registers", all_registers_info,
+"List of all registers and their contents, for selected stack frame.\n\
 Register name as argument means describe only that register.");
 
   add_info ("program", program_info,
index 332584c926774f08b4196668f7560c793dd4bfa2..22b4968c573be675bf22185f5c28a50f700e4ade 100644 (file)
@@ -1,5 +1,5 @@
 /* Low level interface to ptrace, for GDB when running under Unix.
-   Copyright (C) 1986, 1987, 1989, 1991 Free Software Foundation, Inc.
+   Copyright 1986, 1987, 1989, 1991, 1992 Free Software Foundation, Inc.
 
 This file is part of GDB.
 
@@ -35,7 +35,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include <fcntl.h>
 
 #include <sys/param.h>
-#include <sys/dir.h>
 #include <signal.h>
 
 extern char *strerror();               /* strings corresponding to errno */
@@ -418,7 +417,7 @@ kill_command (arg, from_tty)
     error ("The program is not being run.");
   if (!query ("Kill the inferior process? "))
     error ("Not confirmed.");
-  target_kill (arg, from_tty);
+  target_kill ();
 
   /* Killing off the inferior can leave us with a core file.  If so,
      print the state we are left in.  */
index f7f1f4fb49683c62d41891d011c289b064f4c718..3c26c870955f10bfe50fe85b6d4774bb68edd73c 100644 (file)
@@ -1,5 +1,5 @@
 /* Low level Unix child interface to ptrace, for GDB when running under Unix.
-   Copyright (C) 1988, 1989, 1990, 1991 Free Software Foundation, Inc.
+   Copyright 1988, 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
 
 This file is part of GDB.
 
@@ -55,7 +55,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #endif
 
 #include "gdbcore.h"
+#ifndef        NO_SYS_FILE
 #include <sys/file.h>
+#endif
 #include <sys/stat.h>
 
 #if !defined (FETCH_INFERIOR_REGISTERS)
@@ -93,9 +95,7 @@ kill_inferior_fast ()
 }
 
 void
-kill_inferior (args, from_tty)
-     char *args;
-     int from_tty;
+kill_inferior ()
 {
   kill_inferior_fast ();
   target_mourn_inferior ();
@@ -166,7 +166,6 @@ detach (signal)
 #if defined (KERNEL_U_ADDR_BSD)
 /* Get kernel_u_addr using BSD-style nlist().  */
 CORE_ADDR kernel_u_addr;
-#include <a.out.h>             /* For struct nlist */
 
 void
 _initialize_kernel_u_addr ()
@@ -357,7 +356,7 @@ child_xfer_memory (memaddr, myaddr, len, write, target)
      char *myaddr;
      int len;
      int write;
-     struct target_ops target;         /* ignored */
+     struct target_ops *target;                /* ignored */
 {
   register int i;
   /* Round starting address down to longword boundary.  */
index 0c186278b41a8e94a92eafd9579a71a149133927..179de5f3968ae90d701550ad9ad0f9d93f9293ca 100644 (file)
@@ -1,5 +1,5 @@
 /* Top level `main' program for GDB, the GNU debugger.
-   Copyright 1986, 1987, 1988, 1989, 1990, 1991 Free Software Foundation, Inc.
+   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
 
 This file is part of GDB.
 
@@ -43,7 +43,9 @@ int fclose ();
 #endif
 
 #include <string.h>
+#ifndef        NO_SYS_FILE
 #include <sys/file.h>
+#endif
 #include <setjmp.h>
 #include <sys/param.h>
 #include <sys/stat.h>
@@ -82,6 +84,10 @@ extern char *error_pre_print;
 
 extern char lang_frame_mismatch_warn[];                /* language.c */
 
+/* Whether GDB's stdin is on a terminal.  */
+
+extern int gdb_has_a_terminal;                 /* inflow.c */
+
 /* Flag for whether we want all the "from_tty" gubbish printed.  */
 
 int caution = 1;                       /* Default is yes, sigh. */
@@ -383,33 +389,40 @@ main (argc, argv)
        with no equivalent).  */
     static struct option long_options[] =
       {
-       {"quiet", 0, &quiet, 1},
-       {"nx", 0, &inhibit_gdbinit, 1},
-       {"batch", 0, &batch, 1},
-       {"epoch", 0, &epoch_interface, 1},
-       {"fullname", 0, &frame_file_full_name, 1},
-       {"help", 0, &print_help, 1},
-       {"se", 1, 0, 10},
-       {"symbols", 1, 0, 's'},
-       {"s", 1, 0, 's'},
-       {"exec", 1, 0, 'e'},
-       {"core", 1, 0, 'c'},
-       {"c", 1, 0, 'c'},
-       {"command", 1, 0, 'x'},
-       {"x", 1, 0, 'x'},
-       {"directory", 1, 0, 'd'},
-       {"cd", 1, 0, 11},
-       {"tty", 1, 0, 't'},
-       {"b", 1, 0, 'b'},
+       {"quiet", no_argument, &quiet, 1},
+       {"q", no_argument, &quiet, 1},
+       {"nx", no_argument, &inhibit_gdbinit, 1},
+       {"n", no_argument, &inhibit_gdbinit, 1},
+       {"batch", no_argument, &batch, 1},
+       {"epoch", no_argument, &epoch_interface, 1},
+       {"fullname", no_argument, &frame_file_full_name, 1},
+       {"f", no_argument, &frame_file_full_name, 1},
+       {"help", no_argument, &print_help, 1},
+       {"se", required_argument, 0, 10},
+       {"symbols", required_argument, 0, 's'},
+       {"s", required_argument, 0, 's'},
+       {"exec", required_argument, 0, 'e'},
+       {"e", required_argument, 0, 'e'},
+       {"core", required_argument, 0, 'c'},
+       {"c", required_argument, 0, 'c'},
+       {"command", required_argument, 0, 'x'},
+       {"x", required_argument, 0, 'x'},
+       {"directory", required_argument, 0, 'd'},
+       {"cd", required_argument, 0, 11},
+       {"tty", required_argument, 0, 't'},
+       {"baud", required_argument, 0, 'b'},
+       {"b", required_argument, 0, 'b'},
 /* Allow machine descriptions to add more options... */
 #ifdef ADDITIONAL_OPTIONS
        ADDITIONAL_OPTIONS
 #endif
-       {0, 0, 0, 0},
+       {0, no_argument, 0, 0},
       };
 
     while (1)
       {
+       int option_index;
+
        c = getopt_long_only (argc, argv, "",
                              long_options, &option_index);
        if (c == EOF)
@@ -739,7 +752,7 @@ execute_command (p, from_tty)
   register struct cmd_list_element *c;
   register struct command_line *cmdlines;
   register enum language flang;
-  static struct language_defn *saved_language = 0;
+  static const struct language_defn *saved_language = 0;
   static int warned = 0;
 
   free_all_values ();
@@ -791,7 +804,7 @@ execute_command (p, from_tty)
   {
     if (language_mode == language_mode_auto) {
       if (saved_language)
-       language_info ();
+       language_info (1);      /* Print what changed.  */
     }
     saved_language = current_language;
     warned = 0;
@@ -1613,7 +1626,7 @@ static void
 print_gdb_version ()
 {
   printf_filtered ("\
-GDB %s, Copyright 1991 Free Software Foundation, Inc.",
+GDB %s, Copyright 1992 Free Software Foundation, Inc.",
          version);
 }
 
@@ -1648,7 +1661,7 @@ quit_command (args, from_tty)
     {
       if (query ("The program is running.  Quit anyway? "))
        {
-         target_kill (args, from_tty);
+         target_kill ();
        }
       else
        error ("Not confirmed.");
@@ -1659,10 +1672,13 @@ quit_command (args, from_tty)
   exit (0);
 }
 
+/* Returns whether GDB is running on a terminal and whether the user
+   desires that questions be asked of them on that terminal.  */
+
 int
 input_from_terminal_p ()
 {
-  return (instream == stdin) & caution;
+  return gdb_has_a_terminal && (instream == stdin) & caution;
 }
 \f
 /* ARGSUSED */
@@ -1699,6 +1715,9 @@ cd_command (dir, from_tty)
   dir = tilde_expand (dir);
   make_cleanup (free, dir);
 
+  if (chdir (dir) < 0)
+    perror_with_name (dir);
+
   len = strlen (dir);
   dir = savestring (dir, len - (len > 1 && dir[len-1] == '/'));
   if (dir[0] == '/')
@@ -1738,9 +1757,6 @@ cd_command (dir, from_tty)
        }
     }
 
-  if (chdir (dir) < 0)
-    perror_with_name (dir);
-
   forget_cached_source_info ();
 
   if (from_tty)
@@ -1843,21 +1859,6 @@ show_commands (args, from_tty)
   struct _hist_entry *history_get();
   extern int history_base;
 
-#if 0
-  /* This is all reported by individual "show" commands.  */
-  printf_filtered ("Interactive command editing is %s.\n",
-         command_editing_p ? "on" : "off");
-
-  printf_filtered ("History expansion of command input is %s.\n",
-         history_expansion_p ? "on" : "off");
-  printf_filtered ("Writing of a history record upon exit is %s.\n",
-         write_history_p ? "enabled" : "disabled");
-  printf_filtered ("The size of the history list (number of stored commands) is %d.\n",
-         history_size);
-  printf_filtered ("The name of the history record is \"%s\".\n\n",
-         history_filename ? history_filename : "");
-#endif /* 0 */
-
   /* Print out some of the commands from the command history.  */
   /* First determine the length of the history list.  */
   hist_len = history_size;
@@ -1879,7 +1880,7 @@ show_commands (args, from_tty)
        /* "info editing <exp>" should print around command number <exp>.  */
        num = (parse_and_eval_address (args) - history_base) - Hist_print / 2;
     }
-  /* "info editing" means print the last Hist_print commands.  */
+  /* "show commands" means print the last Hist_print commands.  */
   else
     {
       num = hist_len - Hist_print;
@@ -1897,14 +1898,6 @@ show_commands (args, from_tty)
        num = 0;
     }
 
-#if 0
-  /* No need for a header now that "info editing" only prints one thing.  */
-  if (num == hist_len - Hist_print)
-    printf_filtered ("The list of the last %d commands is:\n\n", Hist_print);
-  else
-    printf_filtered ("Some of the stored commands are:\n\n");
-#endif /* 0 */
-
   for (offset = num; offset < num + Hist_print && offset < hist_len; offset++)
     {
       printf_filtered ("%5d  %s\n", history_base + offset,
@@ -1916,8 +1909,8 @@ show_commands (args, from_tty)
   num += Hist_print;
   
   /* If the user repeats this command with return, it should do what
-     "info editing +" does.  This is unnecessary if arg is null,
-     because "info editing +" is not useful after "info editing".  */
+     "show commands +" does.  This is unnecessary if arg is null,
+     because "show commands +" is not useful after "show commands".  */
   if (from_tty && args)
     {
       args[0] = '+';
@@ -2153,9 +2146,10 @@ when gdb is started.");
 
   add_show_from_set
     (add_set_cmd ("editing", class_support, var_boolean, (char *)&command_editing_p,
-          "Set command line editing.\n\
+          "Set editing of command lines as they are typed.\n\
 Use \"on\" to enable to enable the editing, and \"off\" to disable it.\n\
-Without an argument, command line editing is enabled.", &setlist),
+Without an argument, command line editing is enabled.  To edit, use\n\
+EMACS-like or VI-like commands like control-P or ESC.", &setlist),
      &showlist);
 
   add_prefix_cmd ("history", class_support, set_history,
@@ -2198,19 +2192,22 @@ ie. the number of previous commands to keep a record of.", &sethistlist);
      &showlist);
 
   add_prefix_cmd ("info", class_info, info_command,
-                 "Generic command for printing status.",
+        "Generic command for showing things about the program being debugged.",
                  &infolist, "info ", 0, &cmdlist);
   add_com_alias ("i", "info", class_info, 1);
 
   add_prefix_cmd ("show", class_info, show_command,
-                 "Generic command for showing things set with \"set\".",
+                 "Generic command for showing things about the debugger.",
                  &showlist, "show ", 0, &cmdlist);
   /* Another way to get at the same thing.  */
   add_info ("set", show_command, "Show all GDB settings.");
 
-  add_cmd ("commands", no_class, show_commands, "Status of command editor.",
+  add_cmd ("commands", no_class, show_commands,
+          "Show the the history of commands you typed.\n\
+You can supply a command number to start with, or a `+' to start after\n\
+the previous command number shown.",
           &showlist);
 
   add_cmd ("version", no_class, show_version,
-          "Report what version of GDB this is.", &showlist);
+          "Show what version of GDB this is.", &showlist);
 }
index 276a5b8992b34a245bd3bb7bb3987c83aa675ac5..e9bd549f84c1ce612f7e3471782e0382b937cccc 100644 (file)
@@ -1,5 +1,5 @@
 /* Handle SunOS and SVR4 shared libraries for GDB, the GNU Debugger.
-   Copyright 1990, 1991 Free Software Foundation, Inc.
+   Copyright 1990, 1991, 1992 Free Software Foundation, Inc.
    
 This file is part of GDB.
 
@@ -573,8 +573,9 @@ find_solib (so_list_ptr)
         (for the inferior executable) since it is not a shared object. */
       if (LM_NAME (new) != 0)
        {
-         (void) target_read_string((CORE_ADDR) LM_NAME (new), new -> so_name,
-                     MAX_PATH_SIZE - 1);
+         if (!target_read_string((CORE_ADDR) LM_NAME (new), new -> so_name,
+                     MAX_PATH_SIZE - 1))
+             error ("find_solib: Can't read pathname for load map\n");
          new -> so_name[MAX_PATH_SIZE - 1] = 0;
          solib_map_sections (new);
        }      
@@ -669,20 +670,20 @@ solib_add (arg_string, from_tty, target)
       if (count)
        {
          /* Reallocate the target's section table including the new size.  */
-         if (target -> sections)
+         if (target -> to_sections)
            {
-             old = target -> sections_end - target -> sections;
-             target -> sections = (struct section_table *)
-               realloc ((char *)target -> sections,
+             old = target -> to_sections_end - target -> to_sections;
+             target -> to_sections = (struct section_table *)
+               realloc ((char *)target -> to_sections,
                         (sizeof (struct section_table)) * (count + old));
            }
          else
            {
              old = 0;
-             target -> sections = (struct section_table *)
+             target -> to_sections = (struct section_table *)
                malloc ((sizeof (struct section_table)) * count);
            }
-         target -> sections_end = target -> sections + (count + old);
+         target -> to_sections_end = target -> to_sections + (count + old);
          
          /* Add these section table entries to the target's table.  */
          while ((so = find_solib (so)) != NULL)
@@ -690,7 +691,7 @@ solib_add (arg_string, from_tty, target)
              if (so -> so_name[0])
                {
                  count = so -> sections_end - so -> sections;
-                 bcopy (so -> sections, (char *)(target -> sections + old), 
+                 bcopy (so -> sections, (char *)(target -> to_sections + old), 
                         (sizeof (struct section_table)) * count);
                  old += count;
                }