Add new Glk Unix extension from CheapGlk
authorP. F. Chimento <philip.chimento@gmail.com>
Wed, 20 Apr 2011 15:20:47 +0000 (17:20 +0200)
committerP. F. Chimento <philip.chimento@gmail.com>
Wed, 20 Apr 2011 15:20:47 +0000 (17:20 +0200)
There is a new function glkunix_stream_open_pathname_gen() that
supersedes glkunix_stream_open_pathname().

docs/reference/chimara-sections.txt
libchimara/glkstart.h
libchimara/glkunix.c

index 5f6e31e413a30d7a66630f993dd524b5a5786d00..6952d182ef489c834569949fb2d300a0c36b8452 100644 (file)
@@ -681,6 +681,7 @@ NULL
 <SECTION>
 <FILE>glkext-unix</FILE>
 <TITLE>Unix Extensions</TITLE>
+glkunix_stream_open_pathname_gen
 glkunix_stream_open_pathname
 glkunix_set_base_file
 </SECTION>
index e6b901025c565464a7feb4afd3ba8af6483746f9..b8b7ae726c6b59b4534a2ad2006bc8b9573e4213 100644 (file)
@@ -50,6 +50,8 @@ extern glkunix_argumentlist_t glkunix_arguments[];
 extern int glkunix_startup_code(glkunix_startup_t *data);
 
 extern void glkunix_set_base_file(char *filename);
+extern strid_t glkunix_stream_open_pathname_gen(char *pathname,
+    glui32 writemode, glui32 textmode, glui32 rock);
 extern strid_t glkunix_stream_open_pathname(char *pathname, glui32 textmode, 
     glui32 rock);
 
index 83d89896e1a4179518d7f04691fcd80c9cecbc22..284fc1cd19f74f8f5df9ba622e4feaf26af68a83 100644 (file)
 extern GPrivate *glk_data_key;
 
 /**
- * glkunix_stream_open_pathname:
- * @pathname: A path to a file, in the system filename encoding. 
- * @textmode: Bitfield with one or more of the <code>fileusage_</code> constants.
+ * glkunix_stream_open_pathname_gen:
+ * @pathname: A path to a file, in the system filename encoding.
+ * @writemode: 0 for read-only mode, 1 for write mode.
+ * @textmode: 0 for binary mode, 1 for text mode.
  * @rock: The new stream's rock value.
  *
- * Opens an arbitrary file, in read-only mode. Note that this function is
+ * Opens an arbitrary file for reading or writing. (You cannot open a file for
+ * appending using this call.) Note that this function is
  * <emphasis>only</emphasis> available during glkunix_startup_code(). It is 
  * inherently non-portable; it should not and cannot be called from inside 
  * glk_main().
+ *
+ * Returns: A new stream, or %NULL if the file operation failed.
+ */
+strid_t
+glkunix_stream_open_pathname_gen(char *pathname, glui32 writemode, glui32 textmode, glui32 rock)
+{
+       ChimaraGlkPrivate *glk_data = g_private_get(glk_data_key);
+
+       if(!glk_data->in_startup)
+               ILLEGAL("glkunix_stream_open_pathname_gen() may only be called from "
+                               "glkunix_startup_code().");
+
+       g_return_val_if_fail(pathname, NULL);
+       g_return_val_if_fail(strlen(pathname) > 0, NULL);
+
+       frefid_t fileref = fileref_new(pathname, rock,
+               textmode? fileusage_TextMode : fileusage_BinaryMode,
+               writemode? filemode_Write : filemode_Read);
+       return file_stream_new(fileref, writemode? filemode_Write : filemode_Read, rock, FALSE);
+}
+
+/**
+ * glkunix_stream_open_pathname:
+ * @pathname: A path to a file, in the system filename encoding. 
+ * @textmode: 0 for binary mode, 1 for text mode.
+ * @rock: The new stream's rock value.
+ *
+ * This opens a file for reading. It is a less-general form of
+ * glkunix_stream_open_pathname_gen(), preserved for backwards compatibility.
+ *
+ * This should be used only by glkunix_startup_code().
  * 
  * Returns: A new stream, or %NULL if the file operation failed.
  */
@@ -26,15 +59,15 @@ strid_t
 glkunix_stream_open_pathname(char *pathname, glui32 textmode, glui32 rock)
 {
        ChimaraGlkPrivate *glk_data = g_private_get(glk_data_key);
-       
+
        if(!glk_data->in_startup)
                ILLEGAL("glkunix_stream_open_pathname() may only be called from "
                                "glkunix_startup_code().");
-       
+
        g_return_val_if_fail(pathname, NULL);
        g_return_val_if_fail(strlen(pathname) > 0, NULL);
-       
-       frefid_t fileref = fileref_new(pathname, rock, textmode, filemode_Read);
+
+       frefid_t fileref = fileref_new(pathname, rock, textmode? fileusage_TextMode : fileusage_BinaryMode, filemode_Read);
        return file_stream_new(fileref, filemode_Read, rock, FALSE);
 }