summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Deutschmann <whissi@gentoo.org>2019-10-15 12:24:12 +0200
committerThomas Deutschmann <whissi@gentoo.org>2020-08-13 11:26:55 +0200
commite088156d5b620e5e639580dacf85c6dc13823c74 (patch)
tree57f5c025e203279944da512166c20bc0521d8ccd /psi/zfile1.c
downloadghostscript-gpl-patches-e088156d5b620e5e639580dacf85c6dc13823c74.tar.gz
ghostscript-gpl-patches-e088156d5b620e5e639580dacf85c6dc13823c74.tar.bz2
ghostscript-gpl-patches-e088156d5b620e5e639580dacf85c6dc13823c74.zip
Import Ghostscript 9.50ghostscript-9.50
Signed-off-by: Thomas Deutschmann <whissi@gentoo.org>
Diffstat (limited to 'psi/zfile1.c')
-rw-r--r--psi/zfile1.c128
1 files changed, 128 insertions, 0 deletions
diff --git a/psi/zfile1.c b/psi/zfile1.c
new file mode 100644
index 00000000..2ac1d6ff
--- /dev/null
+++ b/psi/zfile1.c
@@ -0,0 +1,128 @@
+/* Copyright (C) 2001-2019 Artifex Software, Inc.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied,
+ modified or distributed except as expressly authorized under the terms
+ of the license contained in the file LICENSE in this distribution.
+
+ Refer to licensing information at http://www.artifex.com or contact
+ Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+ CA 94945, U.S.A., +1(415)492-9861, for further information.
+*/
+
+
+/* Special file operators */
+
+#include "memory_.h"
+#include "string_.h"
+#include "ghost.h"
+#include "gp.h"
+#include "ierrors.h"
+#include "oper.h"
+#include "ialloc.h"
+#include "opdef.h"
+#include "opcheck.h"
+#include "store.h"
+#include "gpmisc.h"
+
+/* <string> <string> <bool> .file_name_combine <string> true */
+/* <string> <string> <bool> .file_name_combine <string> <string> false */
+static int
+zfile_name_combine(i_ctx_t *i_ctx_p)
+{
+ uint plen, flen, blen, blen0;
+ const byte *prefix, *fname;
+ byte *buffer;
+ os_ptr op = osp;
+ bool no_sibling;
+
+ check_type(op[ 0], t_boolean);
+ check_type(op[-1], t_string);
+ check_type(op[-2], t_string);
+ plen = r_size(op - 2);
+ flen = r_size(op - 1);
+ blen = blen0 = plen + flen + 2; /* Inserts separator and ending zero byte. */
+ buffer = ialloc_string(blen, "zfile_name_combine");
+ if (buffer == 0)
+ return_error(gs_error_VMerror);
+ prefix = op[-2].value.const_bytes;
+ fname = op[-1].value.const_bytes;
+ no_sibling = op[0].value.boolval;
+ if (gp_file_name_combine((const char *)prefix, plen,
+ (const char *)fname, flen, no_sibling,
+ (char *)buffer, &blen) != gp_combine_success) {
+ make_bool(op, false);
+ } else {
+ buffer = iresize_string(buffer, blen0, blen, "zfile_name_combine");
+ if (buffer == 0)
+ return_error(gs_error_VMerror);
+ make_string(op - 2, a_all | icurrent_space, blen, buffer);
+ make_bool(op - 1, true);
+ pop(1);
+ }
+ return 0;
+}
+
+/* This is compiled conditionally to let PS library to know
+ * whether it works with the new gp_combine_file_name.
+ */
+
+/* <string> .file_name_is_absolute <bool> */
+static int
+zfile_name_is_absolute(i_ctx_t *i_ctx_p)
+{ os_ptr op = osp;
+
+ check_type(op[0], t_string);
+ make_bool(op, gp_file_name_is_absolute((const char *)op->value.const_bytes,
+ r_size(op)));
+ return 0;
+}
+
+static int
+push_string(i_ctx_t *i_ctx_p, const char *v)
+{ os_ptr op = osp;
+ int len = strlen(v);
+
+ push(1);
+ make_const_string(op, avm_foreign | a_readonly,
+ len, (const byte *)v);
+ return 0;
+}
+
+/* - .file_name_separator <string> */
+static int
+zfile_name_separator(i_ctx_t *i_ctx_p)
+{ return push_string(i_ctx_p, gp_file_name_separator());
+}
+
+/* - .file_name_directory_separator <string> */
+static int
+zfile_name_directory_separator(i_ctx_t *i_ctx_p)
+{ return push_string(i_ctx_p, gp_file_name_directory_separator());
+}
+
+/* - .file_name_current <string> */
+static int
+zfile_name_current(i_ctx_t *i_ctx_p)
+{ return push_string(i_ctx_p, gp_file_name_current());
+}
+
+/* - .file_name_parent <string> */
+static int
+zfile_name_parent(i_ctx_t *i_ctx_p)
+{ return push_string(i_ctx_p, gp_file_name_parent());
+}
+
+const op_def zfile1_op_defs[] =
+{
+ {"3.file_name_combine", zfile_name_combine},
+ {"1.file_name_is_absolute", zfile_name_is_absolute},
+ {"0.file_name_separator", zfile_name_separator},
+ {"0.file_name_directory_separator", zfile_name_directory_separator},
+ {"0.file_name_current", zfile_name_current},
+ {"0.file_name_parent", zfile_name_parent},
+ op_def_end(0)
+};