#### A.1.3 Character Strings in Oct-Files

In Octave a character string is just a special `Array` class. Consider the example

         /*

         Copyright (C) 2006, 2007 John W. Eaton

         This file is part of Octave.

         Octave 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 3  of the License, or (at your option) any later
         version.

         Octave 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 Octave; see the file COPYING.  If not,
         see <http://www.gnu.org/licenses/>.

         */

         #include <octave/oct.h>

         DEFUN_DLD (stringdemo, args, , "String Demo")
         {
           int nargin = args.length();
           octave_value_list retval;

           if (nargin != 1)
             print_usage ();
           else
             {
               charMatrix ch = args(0).char_matrix_value ();

               if (! error_state)
                 {
                   if (args(0).is_sq_string ())
                     retval(1) = octave_value (ch, true);
                   else
                     retval(1) = octave_value (ch, true, '\'');

                   octave_idx_type nr = ch.rows();
                   for (octave_idx_type i = 0; i < nr / 2; i++)
                     {
                       std::string tmp = ch.row_as_string (i);
                       ch.insert (ch.row_as_string(nr-i-1).c_str(),
         			 i, 0);
                       ch.insert (tmp.c_str(), nr-i-1, 0);
                     }
                   retval(0) = octave_value (ch, true);
                 }
             }
           return retval;
         }

An example of the of the use of this function is

         s0 = ["First String"; "Second String"];
         [s1,s2] = stringdemo (s0)
         => s1 = Second String
                 First String

         => s2 = First String
                 Second String

         typeinfo (s2)
         => sq_string
         typeinfo (s1)
         => string

One additional complication of strings in Octave is the difference between single quoted and double quoted strings. To find out if an `octave_value` contains a single or double quoted string an example is

             if (args(0).is_sq_string ())
               octave_stdout <<
                 "First argument is a singularly quoted string\n";
             else if (args(0).is_dq_string ())
               octave_stdout <<
                 "First argument is a doubly quoted string\n";

Note however, that both types of strings are represented by the `charNDArray` type, and so when assigning to an `octave_value`, the type of string should be specified. For example

         octave_value_list retval;
         charNDArray c;
         ...
         // Create single quoted string
         retval(1) = octave_value (ch, true, '\'');

         // Create a double quoted string
         retval(0) = octave_value (ch, true);