summaryrefslogtreecommitdiffstats
path: root/guththila/src/guththila_reader.c
diff options
context:
space:
mode:
Diffstat (limited to 'guththila/src/guththila_reader.c')
-rw-r--r--guththila/src/guththila_reader.c115
1 files changed, 115 insertions, 0 deletions
diff --git a/guththila/src/guththila_reader.c b/guththila/src/guththila_reader.c
new file mode 100644
index 0000000..bcb0efd
--- /dev/null
+++ b/guththila/src/guththila_reader.c
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <stdlib.h>
+#include <string.h>
+#include <guththila_reader.h>
+GUTHTHILA_EXPORT guththila_reader_t * GUTHTHILA_CALL
+guththila_reader_create_for_file(
+ guththila_char_t *file_name,
+ const axutil_env_t * env)
+{
+ guththila_reader_t * reader = NULL;
+
+ FILE * f = NULL;
+ if(!file_name)
+ return NULL;
+ reader = (guththila_reader_t *)AXIS2_MALLOC(env->allocator, sizeof(guththila_reader_t));
+ if(!reader)
+ return NULL;
+ f = fopen(file_name, "r");
+ if(!f)
+ {
+ AXIS2_FREE(env->allocator, reader);
+ return NULL;
+ }
+ reader->fp = f;
+ reader->type = GUTHTHILA_FILE_READER;
+ return reader;
+}
+
+GUTHTHILA_EXPORT guththila_reader_t * GUTHTHILA_CALL
+guththila_reader_create_for_memory(
+ void *buffer,
+ int size,
+ const axutil_env_t * env)
+{
+ guththila_reader_t * reader = (guththila_reader_t *)AXIS2_MALLOC(env->allocator,
+ sizeof(guththila_reader_t));
+ if(reader)
+ {
+ reader->type = GUTHTHILA_MEMORY_READER;
+ reader->buff = buffer;
+ reader->buff_size = size;
+ reader->fp = NULL;
+ return reader;
+ }
+ return NULL;
+}
+
+GUTHTHILA_EXPORT guththila_reader_t * GUTHTHILA_CALL
+guththila_reader_create_for_io(
+ GUTHTHILA_READ_INPUT_CALLBACK input_read_callback,
+ void *ctx,
+ const axutil_env_t * env)
+{
+ guththila_reader_t * reader = (guththila_reader_t *)AXIS2_MALLOC(env->allocator,
+ sizeof(guththila_reader_t));
+ if(reader)
+ {
+ reader->input_read_callback = input_read_callback;
+ reader->context = ctx;
+ reader->type = GUTHTHILA_IO_READER;
+ return reader;
+ }
+ return NULL;
+}
+GUTHTHILA_EXPORT void GUTHTHILA_CALL
+guththila_reader_free(
+ guththila_reader_t * r,
+ const axutil_env_t * env)
+{
+ if(r->type == GUTHTHILA_FILE_READER && r->fp)
+ {
+ fclose(r->fp);
+ }
+ if(r->type == GUTHTHILA_IO_READER && r->context)
+ {
+ AXIS2_FREE(env->allocator, r->context);
+ }
+ AXIS2_FREE(env->allocator, r);
+
+}
+GUTHTHILA_EXPORT int GUTHTHILA_CALL
+guththila_reader_read(
+ guththila_reader_t * r,
+ guththila_char_t * buffer,
+ int offset,
+ int length,
+ const axutil_env_t * env)
+{
+ int rt = r->type;
+ switch(rt)
+ {
+ case GUTHTHILA_FILE_READER:
+ return (int)fread(buffer + offset, 1, length, r->fp);
+ case GUTHTHILA_IO_READER:
+ return r->input_read_callback((buffer + offset), length, r->context);
+ default:
+ return 0;
+ }
+}
+