From bug-octave-request at bevo dot che dot wisc dot edu Thu Jun 15 11:50:12 2000 Subject: deblank From: pkienzle at kienzle dot powernet dot co dot uk (Paul Kienzle) To: bug-octave at bevo dot che dot wisc dot edu, pkienzle@kienzle.powernet.co.uk Date: Thu, 15 Jun 2000 06:50:11 +0100 (BST) To: bug-octave at bevo dot che dot wisc dot edu Cc: pkienzle Subject: deblank Bug report for Octave 2.0.13 configured for i386-pc-linux-gnu Description: ----------- deblank should trim null as well space, for compatibility and for use with functions such as glob which, as of 2.0.13, return a matrix of null-terminated strings. Repeat-By: --------- files = glob("/etc/*"); for i=1:rows(file) if strcmp(deblank_orig(file(i,:)),"/etc/passwd") disp("found"); endif; endfor Fix: --- The following patch adds null support, and incidentally is roughly twice as fast since it uses indexing operations rather than reshaping. Null support is awkward since 2.0.13 does not support "\0", and since setstr(0) returns [] rather than "\0". If/when this has been fixed, then replace t(1) with setstr(0) in the find expression. I've used s(:,1:0) rather than "" for null return values in hopes that it will eventually equal [](Rx0) rather than [](0x0) like it currently does. *** deblank.m-2.1.28 Thu Jun 15 00:19:35 2000 --- deblank.m Thu Jun 15 06:29:54 2000 *************** *** 19,25 **** ## -*- texinfo -*- ## at deftypefn {Function File} {} deblank (@var{s}) ! ## Removes the trailing blanks from the string at var{s} dot ## at end deftypefn ## Author: Kurt Hornik --- 19,27 ---- ## -*- texinfo -*- ## at deftypefn {Function File} {} deblank (@var{s}) ! ## Removes the trailing blanks and nulls from the string at var{s} dot ! ## If at var{s} is a matrix, @var{deblank} trims each row to the ! ## length of longest string. ## at end deftypefn ## Author: Kurt Hornik *************** *** 34,49 **** if (isstr (s)) [nr, nc] = size (s); - len = nr * nc; ! if (len == 0) t = s; - elseif (s == " ") - t = ""; else ! s = reshape (s, 1, len); ! k = ceil (max (find (s != " ")) / nr) * nr; ! t = reshape (s (1:k), nr, k / nr); endif else --- 36,56 ---- if (isstr (s)) [nr, nc] = size (s); ! if (nc == 0) t = s; else ! ## Need to compare s against space and null. Since "\0" is not ! ## defined, need to use setstr. Since setstr(0) is [], for 2.0.13 ! ## at least, need to store setstr([0 1]) to variable t and use ! ## t(1) as the null character. ! t = setstr([0 1]); ! k = find (s != " " & s != t (1)); ! if isempty (k) ! t = s (:, 1:0); ! else ! t = s (:, 1 : ceil (max (k) / nr)); ! endif endif else *************** *** 51,53 **** --- 58,76 ---- endif endfunction + + %!assert (deblank(""), ""); + %!assert (deblank(" "), ""); + %!assert (deblank([" ", " "]), "") + %!assert (isempty(deblank([" ", " "]))); + %!assert (deblank(" f o o "), " f o o"); + %!assert (deblank(["f "; "o "; "o "]), [ "f"; "o"; "o" ]); + %!test + %! ## Test strings containing \0 as well. Need to work a bit to + %! ## construct them, though. + %! in = ["fr "; "o0 "; "o 0"]; + %! in(2,2:3) = setstr([0 32]); + %! in(3,2:3) = setstr([32 0]); + %! out = [ "fr"; "o0"; "o " ]; + %! out(2,:) = setstr([toascii("o") 0]); + %! assert(deblank(in), out); Configuration (please do not edit this section): ----------------------------------------------- uname output: Linux kienzle 2.0.34 #3 Fri Oct 9 23:37:16 BST 1998 i586 unknown configure opts: --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --with-g77 --enable-dl --enable-shared --enable-lite-kernel --host i386-linux Fortran compiler: g77 FFLAGS: -O2 -fomit-frame-pointer F2C: F2CFLAGS: FLIBS: -L/usr/lib/gcc-lib/i486-linux/egcs-2.90.29 -lf2c -lm CPPFLAGS: INCFLAGS: -I/usr/include -I/usr/include/octave-2.0.13 C compiler: egcc, version 2.7.2.3 CFLAGS: -DHAVE_CONFIG_H -mieee-fp -O2 -fomit-frame-pointer CPICFLAG: -fPIC C++ compiler: c++, version 2.90.29 980515 (egcs-1.0.3 release) CXXFLAGS: -DHAVE_CONFIG_H -mieee-fp -fno-rtti -fno-exceptions -fno-implicit-templates -O2 -fomit-frame-pointer CXXPICFLAG: -fPIC LDFLAGS: -s LIBFLAGS: -L/usr/lib/octave-2.0.13 RLD_FLAG: -Xlinker -rpath -Xlinker /usr/lib/octave-2.0.13 TERMLIBS: -lncurses LIBS: LEXLIB: LIBPLPLOT: LIBDLFCN: DEFS: -DOCTAVE_SOURCE=1 -DSEPCHAR=':' -DSEPCHAR_STR=":" -DUSE_READLINE=1 -DCXX_NEW_FRIEND_TEMPLATE_DECL=1 -DF77_APPEND_UNDERSCORE=1 -DOCTAVE_LITE=1 -DSIZEOF_SHORT=2 -DSIZEOF_INT=4 -DSIZEOF_LONG=4 -DHAVE_ALLOCA_H=1 -DHAVE_ALLOCA=1 -DNPOS=string::npos -DSTDC_HEADERS=1 -DHAVE_DIRENT_H=1 -DTIME_WITH_SYS_TIME=1 -DHAVE_SYS_WAIT_H=1 -DHAVE_ASSERT_H=1 -DHAVE_CURSES_H=1 -DHAVE_DLFCN_H=1 -DHAVE_FCNTL_H=1 -DHAVE_FLOAT_H=1 -DHAVE_FNMATCH_H=1 -DHAVE_GLOB_H=1 -DHAVE_GRP_H=1 -DHAVE_LIMITS_H=1 -DHAVE_MEMORY_H=1 -DHAVE_NAN_H=1 -DHAVE_NCURSES_H=1 -DHAVE_PWD_H=1 -DHAVE_SGTTY_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_SYS_PARAM_H=1 -DHAVE_SYS_RESOURCE_H=1 -DHAVE_SYS_SELECT_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_SYS_TIMES_H=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_UTSNAME_H=1 -DHAVE_TERMCAP_H=1 -DHAVE_TERMIO_H=1 -DHAVE_TERMIOS_H=1 -DHAVE_UNISTD_H=1 -DHAVE_VARARGS_H=1 -DHAVE_FNMATCH=1 -DHAVE_GLOB=1 -DHAVE_ATEXIT=1 -DHAVE_BCOPY=1 -DHAVE_BZERO=1 -DHAVE_DUP2=1 -DHAVE_ENDGRENT=1 -DHAVE_ENDPWENT=1 -DHAVE_EXECVP=1 -DHAVE_FCNTL=1 -DHAVE_FORK=1 -DHAVE_GETCWD=1 -DHAVE_GETEGID=1 -DHAVE_GETEUID=1 -DHAVE_GETGID=1 -DHAVE_GETGRENT=1 -DHAVE_GETGRGID=1 -DHAVE_GETGRNAM=1 -DHAVE_GETHOSTNAME=1 -DHAVE_GETPGRP=1 -DHAVE_GETPID=1 -DHAVE_GETPPID=1 -DHAVE_GETPWENT=1 -DHAVE_GETPWNAM=1 -DHAVE_GETPWUID=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_GETUID=1 -DHAVE_GETWD=1 -DHAVE_LSTAT=1 -DHAVE_MEMMOVE=1 -DHAVE_MKDIR=1 -DHAVE_MKFIFO=1 -DHAVE_ON_EXIT=1 -DHAVE_PIPE=1 -DHAVE_PUTENV=1 -DHAVE_RENAME=1 -DHAVE_RINDEX=1 -DHAVE_RMDIR=1 -DHAVE_SETGRENT=1 -DHAVE_SETPWENT=1 -DHAVE_SETVBUF=1 -DHAVE_SIGACTION=1 -DHAVE_SIGPENDING=1 -DHAVE_SIGPROCMASK=1 -DHAVE_SIGSUSPEND=1 -DHAVE_STAT=1 -DHAVE_STRCASECMP=1 -DHAVE_STRDUP=1 -DHAVE_STRERROR=1 -DHAVE_STRNCASECMP=1 -DHAVE_TEMPNAM=1 -DHAVE_UMASK=1 -DHAVE_UNLINK=1 -DHAVE_USLEEP=1 -DHAVE_VFPRINTF=1 -DHAVE_VSPRINTF=1 -DHAVE_WAITPID=1 -DSMART_PUTENV=1 -DHAVE_PROGRAM_INVOCATION_NAME=1 -DHAVE_LIBDL=1 -DHAVE_DLOPEN=1 -DHAVE_DLSYM=1 -DHAVE_DLERROR=1 -DHAVE_DLCLOSE=1 -DWITH_DL=1 -DWITH_DYNAMIC_LINKING=1 -DHAVE_LIBM=1 -DHAVE_FINITE=1 -DHAVE_ISNAN=1 -DHAVE_ISINF=1 -DHAVE_ACOSH=1 -DHAVE_ASINH=1 -DHAVE_ATANH=1 -DHAVE_ERF=1 -DHAVE_ERFC=1 -DHAVE_ST_BLKSIZE=1 -DHAVE_ST_BLOCKS=1 -DHAVE_ST_RDEV=1 -DHAVE_TM_ZONE=1 -DHAVE_GR_PASSWD=1 -DEXCEPTION_IN_MATH=1 -DRETSIGTYPE=void -DSYS_SIGLIST_DECLARED=1 -DHAVE_SYS_SIGLIST=1 -DHAVE_POSIX_SIGNALS=1 -DHAVE_GETRUSAGE=1 -DHAVE_TIMES=1 -DGNUPLOT_HAS_MULTIPLOT=1 -DGNUPLOT_HAS_FRAMES=1 User-preferences (please do not edit this section): -------------------------------------------------- EDITOR = "vi" EXEC_PATH = "/home/pkienzle/octave/audio::/scratch/programs/audio/package/pipewave.1.3/bin:/scratch/programs/audio/pitch/POWERpv1.1G/bin:/home/pkienzle/pantome/bin:/home/pkienzle/sfs/bin:/scratch/usr/bin:/home/pkienzle/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/usr/games" IMAGEPATH = ".:/usr/share/octave/2.0.13/imagelib//" INFO_FILE = "/usr/info/octave.info" INFO_PROGRAM = "info" LOADPATH = "/home/pkienzle/octave//:/usr/local/share/octave/site-m//:" PAGER = "less" PS1 = "\\s:\\#> " PS2 = "> " PS4 = "+ " auto_unload_dot_oct_files = 1 automatic_replot = 0 beep_on_error = 0 completion_append_char = " " default_eval_print_flag = 1 # default_global_variable_value = default_return_value = [] default_save_format = "ascii" define_all_return_values = 0 do_fortran_indexing = 0 echo_executing_commands = 0 empty_list_elements_ok = "warn" fixed_point_format = 0 gnuplot_binary = "gnuplot" gnuplot_has_frames = 1 gnuplot_has_multiplot = 1 history_file = "/home/pkienzle/.octave_hist" history_size = 1024 ignore_function_time_stamp = "system" implicit_num_to_str_ok = 0 implicit_str_to_num_ok = 0 initialize_global_variables = 0 max_recursion_depth = 256 ok_to_lose_imaginary_part = "warn" output_max_field_width = 10 output_precision = 5 page_output_immediately = 0 page_screen_output = 1 prefer_column_vectors = 1 prefer_zero_one_indexing = 0 print_answer_id_name = 1 print_empty_dimensions = 1 propagate_empty_matrices = 1 resize_on_range_error = 1 return_last_computed_value = 0 save_precision = 15 saving_history = 1 silent_functions = 0 split_long_rows = 1 string_fill_char = " " struct_levels_to_print = 2 suppress_verbose_help_message = 1 treat_neg_dim_as_zero = 0 warn_assign_as_truth_value = 1 warn_comma_in_global_decl = 1 warn_divide_by_zero = 1 warn_function_name_clash = 1 warn_missing_semicolon = 0 warn_reload_forces_clear = 1 warn_variable_switch_label = 0 whitespace_in_literal_matrix = ----------------------------------------------------------------------- Octave is freely available under the terms of the GNU GPL. Octave's home on the web: http://www.che.wisc.edu/octave/octave.html How to fund new projects: http://www.che.wisc.edu/octave/funding.html Subscription information: http://www.che.wisc.edu/octave/archive.html -----------------------------------------------------------------------