# HG changeset patch
# User Nadern96 <nadernabilmansour@gmail.com>
# Date 1583936643 -7200
#      Wed Mar 11 16:24:03 2020 +0200
# Node ID 14114c0d97988f2fd58911edb3de264f8c9467ac
# Parent  a04cb1364af450e105a6305a774737bbc1f8c587
Fix: strncmp(str_a, str_b, N) gives an error for N=0 (bug #57879)

diff -r a04cb1364af4 -r 14114c0d9798 .hgignore
--- a/.hgignore	Mon Mar 09 10:25:21 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,125 +0,0 @@
-syntax: regexp
-## The recurrent (^|/) idiom in the regexps below should be understood
-## to mean "at any directory" while the ^ idiom means "from the
-## project's top-level directory".
-
-## gnulib related files
-(^|/)gnulib$
-# This directory gets created by gnulib during the build.
-(^|/)libgnu$
-# gnulib makes these silly backup files.
-.~$
-
-## m4 related files
-# This directory mostly contains cruft during build time, but it does
-# contain some Octave code, so be more careful about what we ignore here.
-^m4/(?!ax_).+\.m4$
-
-## Autoconf, Automake automatically generated files
-^aclocal\.m4$
-^autom4te\.cache$
-^config\.in\.h$
-^configure$
-(^|/)config.cache$
-(^|/)config.h$
-(^|/)config.log$
-(^|/)config.status$
-
-^Makefile\.in$
-^INSTALL$
-
-## CMake associated files
-# Octave doesn't use CMake, but some IDEs use this index file to indicate
-# what files are part of a project (e.g., CLion).  Ignore it (bug #55901).
-^CMakeLists.txt$
-
-## Emacs associated files
-(^|/)TAGS$
-(^|/)semantic.cache$
-
-## Scripts associated with building Octave
-^build-aux/config\.(guess|rpath|sub)$
-(^|/)build-aux/check-subst-vars\.sh$
-^build-aux/depcomp$
-^build-aux/install-sh$
-^build-aux/ltmain\.sh$
-^build-aux/mdate-sh$
-^build-aux/missing$
-^build-aux/move-if-change$
-(^|/)build-aux/subst-config-vals\.sh$
-(^|/)build-aux/subst-cross-config-vals\.sh$
-(^|/)build-aux/subst-script-vals\.sh$
-^build-aux/texinfo\.tex$
-^build-aux/ylwrap$
-
-## Mercurial associated files
-(^|/)HG-ID$
-
-## Timestamp files used in build process
-.*/\.dirstamp$
-.*/\.octave-dirstamp$
-
-## Intermediate compilation results for libraries
-\.la$
-.*/\.libs/
-\.Plo$
-\.Po$
-
-## DLDFCN associated files
-^libinterp/dldfcn/module\.mk$
-(^|/)libinterp/dldfcn/PKG_ADD$
-(^|/)libinterp/dldfcn/.*\.oct$
-
-## liboctave/ directory associated patterns
-# E.g., liboctave/operators/smx-op-inc.mk
-^liboctave/operators/\w+-op-\w+\.mk$
-
-## scripts/ directory associated patterns
-# Package files
-(^|/)scripts/.*/PKG_ADD$
-# Java files
-(^|/)scripts/java/octave\.jar$
-(^|/)scripts/java/org/octave/.*\.class$
-
-## libgui/ directory associated patterns
-# Files generated by moc tool
-(^|/)libgui/.*/moc-.*\.(cc|h)$
-(^|/)libgui/languages/.*\.qm$
-
-## Ignore patterns associated with documentation
-# Info generated files
-# E.g., doc/faq/OctaveFAQ.info, doc/interpreter/octave.info-4
-^doc/\w+/\w+\.info(-\d+)?$
-
-# Texinfo created temporary directories
-(^|/)doc/(interpreter|liboctave)/(octave|liboctave)\.t2(d|p)/
-# Texinfo created files
-(^|/)doc/interpreter/.*\.texi$
-
-# DOCSTRINGS files built in the source tree
-(^|/)(libinterp|scripts)/DOCSTRINGS$
-
-# Generated HTML directories
-(^|/)doc/interpreter/octave\.html/
-(^|/)doc/liboctave/liboctave\.html/
-
-# Miscellaneous auto-generated files
-(^|/)doc/interpreter/octave\.dvi$
-(^|/)doc/interpreter/octave\.ps$
-(^|/)doc/interpreter/doc-cache$
-(^|/)doc/interpreter/octave_interpreter\.q(ch|hc)$
-
-# Images and scripts for documentation
-^doc/interpreter/images\.mk$
-(^|/)doc/interpreter/.*\.eps$
-(^|/)doc/interpreter/.*\.pdf$
-(^|/)doc/interpreter/.*\.png$
-(^|/)doc/interpreter/.*\.txt$
-
-# timestamps for doc directory
-^doc/\w+/stamp-(vti|\d+)$
-^doc/\w+/version-\w+\.texi$
-
-## Test associated patterns
--tst$
-
diff -r a04cb1364af4 -r 14114c0d9798 NEWS
--- a/NEWS	Mon Mar 09 10:25:21 2020 -0400
+++ b/NEWS	Wed Mar 11 16:24:03 2020 +0200
@@ -41,6 +41,11 @@
 
 ### Matlab compatibility
 
+- The `strncmp` and `strncmpi` functions now return `true` if the number of characters 
+  specified by `n` is equal 0 .  For Example:
+
+    `strncmp ("abc", "abc", 0)`
+
 
 ### Alphabetical list of new functions added in Octave 7
 
diff -r a04cb1364af4 -r 14114c0d9798 libinterp/corefcn/strfns.cc
--- a/libinterp/corefcn/strfns.cc	Mon Mar 09 10:25:21 2020 -0400
+++ b/libinterp/corefcn/strfns.cc	Wed Mar 11 16:24:03 2020 +0200
@@ -552,6 +552,8 @@
 @strong{Caution:} For compatibility with @sc{matlab}, Octave's strcmp
 function returns 1 if the character strings are equal, and 0 otherwise.
 This is just the opposite of the corresponding C library function.
+For compatibility with @sc{matlab} ,Octave's strncmp function returns 1 if N = 0
+
 @seealso{strcmpi, strncmp, strncmpi}
 @end deftypefn */)
 {
@@ -639,7 +641,9 @@
 
 @strong{Caution:} For compatibility with @sc{matlab}, Octave's strncmp
 function returns 1 if the character strings are equal, and 0 otherwise.
+For compatibility with @sc{matlab} ,Octave's strncmp function returns 1 if N = 0.
 This is just the opposite of the corresponding C library function.
+
 @seealso{strncmpi, strcmp, strcmpi}
 @end deftypefn */)
 {
@@ -648,12 +652,12 @@
 
   octave_idx_type n = args(2).idx_type_value ();
 
-  if (n > 0)
+  if (n >= 0)
     return ovl (do_strcmp_fun (args(0), args(1), n, "strncmp",
                                octave::string::strncmp,
                                octave::string::strncmp));
   else
-    error ("strncmp: N must be greater than 0");
+    error ("strncmp: N must be greater than or equal 0");
 }
 
 /*
@@ -668,6 +672,9 @@
 
 %!assert <*54373> (strncmp ("abc", "abc", 100))
 
+%!assert <*57879> (strncmp ("abc", "abc", 0),true)
+%!assert <*57879> (strncmp ("abc", "ac", 0),true)
+
 %!error strncmp ()
 %!error strncmp ("abc", "def")
 */
@@ -717,6 +724,7 @@
 
 @strong{Caution:} For compatibility with @sc{matlab}, Octave's strncmpi
 function returns 1 if the character strings are equal, and 0 otherwise.
+For compatibility with @sc{matlab} ,Octave's strncmpi function returns 1 if N = 0.
 This is just the opposite of the corresponding C library function.
 
 @strong{Caution:} National alphabets are not supported.
@@ -728,16 +736,18 @@
 
   octave_idx_type n = args(2).idx_type_value ();
 
-  if (n > 0)
+  if (n >= 0)
     return ovl (do_strcmp_fun (args(0), args(1), n, "strncmpi",
                                octave::string::strncmpi,
                                octave::string::strncmpi));
   else
-    error ("strncmpi: N must be greater than 0");
+    error ("strncmp: N must be greater than or equal 0");
 }
 
 /*
 %!assert (strncmpi ("abc123", "ABC456", 3), true)
+%!assert <*57879> (strncmpi ("abc123", "ABC456", 0), true)
+%!assert <*57879> (strncmpi ("abc123", "ABC4", 0), true)
 
 %!assert <*54373> (strncmpi ("abc", "abC", 100))
 */
