Merge remote-tracking branch 'origin/6.1'
[scilab.git] / scilab / modules / output_stream / src / c / sciprint_full.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) Francois Vogel
4  * Copyright (C) 2008-2008 - INRIA - Bruno JOFRET
5  *
6  * Copyright (C) 2012 - 2016 - Scilab Enterprises
7  *
8  * This file is hereby licensed under the terms of the GNU GPL v2.0,
9  * pursuant to article 5.3.4 of the CeCILL v.2.1.
10  * This file was originally licensed under the terms of the CeCILL v2.1,
11  * and continues to be available under such terms.
12  * For more information, see the COPYING file which you should have received
13  * along with this program.
14  *
15  */
16
17 /*--------------------------------------------------------------------------*/
18 /* sciprint_full function */
19 /*--------------------------------------------------------------------------*/
20 /* sciprint geared towards long strings (>MAXPRINTF) */
21 /* the long string is splitted in elements of length equal to the number of columns  */
22 /* from lines()                                                                      */
23 /*--------------------------------------------------------------------------*/
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <string.h>
27 #include "sciprint_full.h"
28 #include "sciprint.h"
29 #include "sci_malloc.h"
30 #include "localization.h"
31 #include "scilines.h"
32 #include "configvariable_interface.h"
33 /*--------------------------------------------------------------------------*/
34 #ifdef _MSC_VER
35 #define vsnprintf _vsnprintf
36 #endif
37 /*--------------------------------------------------------------------------*/
38 /* MAXCHARSSCIPRINT_FULL is for sciprint_full - more than this gets truncated */
39 #define MAXCHARSSCIPRINT_FULL 5000
40 /*--------------------------------------------------------------------------*/
41 void sciprint_full(char *fmt, ...)
42 {
43     int lstr;
44     va_list ap;
45     char *s_buf = NULL;
46     char *split_s_buf = NULL;
47     int count = 0;
48     int p_s = 0;
49     static int colwidth;
50
51     s_buf = MALLOC(sizeof(char) * (MAXCHARSSCIPRINT_FULL + 1));
52     if (s_buf == (char *) 0)
53     {
54         sciprint(_("%s: No more memory.\n"), "sciprint_full");
55         return;
56     }
57
58     /* number of columns as set by command lines() */
59     colwidth = getConsoleWidth();
60
61     split_s_buf = MALLOC(sizeof(char) * (colwidth + 1));
62     if (split_s_buf == (char *) 0)
63     {
64         sciprint(_("%s: No more memory.\n"), "sciprint_full");
65         FREE(s_buf);
66         return;
67     }
68
69     va_start(ap, fmt);
70
71 #if defined(linux) || defined(_MSC_VER)
72     count = vsnprintf (s_buf, MAXCHARSSCIPRINT_FULL - 1, fmt, ap );
73     if (count == -1)
74     {
75         s_buf[MAXCHARSSCIPRINT_FULL - 1] = '\0';
76     }
77 #else
78     (void )vsprintf(s_buf, fmt, ap );
79 #endif
80
81     va_end(ap);
82
83     lstr = (int) strlen(s_buf);
84
85     if (lstr < colwidth)
86     {
87         sciprint("%s", s_buf);
88     }
89     else
90     {
91         strncpy(split_s_buf, s_buf + p_s, colwidth - 1);
92         split_s_buf[colwidth] = '\0';
93         p_s = p_s + colwidth - 1;
94         sciprint("%s", split_s_buf);
95         sciprint("\n");
96         while (p_s + colwidth - 1 < (int)lstr)
97         {
98             strncpy(split_s_buf, s_buf + p_s, colwidth - 1);
99             split_s_buf[colwidth] = '\0';
100             p_s = p_s + colwidth - 1;
101             sciprint(_("  (cont'd) %s\n"), split_s_buf);
102         }
103         strncpy(split_s_buf, s_buf + p_s, lstr - p_s);
104         split_s_buf[lstr - p_s] = '\0';
105         sciprint(_("     (end) %s\n"), split_s_buf);
106     }
107
108     if (s_buf)
109     {
110         FREE(s_buf);
111         s_buf = NULL;
112     }
113     if (split_s_buf)
114     {
115         FREE(split_s_buf);
116         split_s_buf = NULL;
117     }
118
119 }
120 /*--------------------------------------------------------------------------*/