Merge branch 'cairocanvas' into windows+cc
[ardour.git] / libs / evoral / src / libsmf / smf_save.c
index 95ed14b1d7ea5ae4453e24f10327a10be647b451..3b313cff5a5547d0f48eeb63a517b6d9d15cd075 100644 (file)
 #include <assert.h>
 #include <math.h>
 #include <errno.h>
+#ifdef PLATFORM_WINDOWS
+#include <winsock2.h>
+#else
 #include <arpa/inet.h>
+#endif
 #include "smf.h"
 #include "smf_private.h"
 
@@ -54,7 +58,7 @@ static void *
 smf_extend(smf_t *smf, const int length)
 {
        int i, previous_file_buffer_length = smf->file_buffer_length;
-       char *previous_file_buffer = smf->file_buffer;
+       char *previous_file_buffer = (char*)smf->file_buffer;
 
        /* XXX: Not terribly efficient. */
        smf->file_buffer_length += length;
@@ -156,8 +160,8 @@ track_append(smf_track_t *track, const void *buffer, const int buffer_length)
        return (0);
 }
 
-static int
-format_vlq(unsigned char *buf, int length, unsigned long value)
+int
+smf_format_vlq(unsigned char *buf, int length, unsigned long value)
 {
        int i;
        unsigned long buffer;
@@ -201,7 +205,7 @@ smf_event_new_textual(int type, const char *text)
 
        /* "2 +" is for leading 0xFF 0xtype. */
        event->midi_buffer_length = 2 + text_length + MAX_VLQ_LENGTH;
-       event->midi_buffer = malloc(event->midi_buffer_length);
+       event->midi_buffer = (uint8_t*)malloc(event->midi_buffer_length);
        if (event->midi_buffer == NULL) {
                g_critical("Cannot allocate MIDI buffer structure: %s", strerror(errno));
                smf_event_delete(event);
@@ -212,7 +216,7 @@ smf_event_new_textual(int type, const char *text)
        event->midi_buffer[0] = 0xFF;
        event->midi_buffer[1] = type;
 
-       vlq_length = format_vlq(event->midi_buffer + 2, MAX_VLQ_LENGTH - 2, text_length);
+       vlq_length = smf_format_vlq(event->midi_buffer + 2, MAX_VLQ_LENGTH - 2, text_length);
        copied_length = snprintf((char *)event->midi_buffer + vlq_length + 2, event->midi_buffer_length - vlq_length - 2, "%s", text);
 
        assert(copied_length == text_length);
@@ -231,7 +235,7 @@ write_vlq(smf_event_t *event, unsigned long value)
        unsigned char buf[MAX_VLQ_LENGTH];
        int vlq_length;
 
-       vlq_length = format_vlq(buf, MAX_VLQ_LENGTH, value);
+       vlq_length = smf_format_vlq(buf, MAX_VLQ_LENGTH, value);
 
        return (track_append(event->track, buf, vlq_length));
 }
@@ -391,29 +395,14 @@ write_track(smf_track_t *track)
  * Takes smf->file_buffer and saves it to the file.
  */
 static int
-write_file(smf_t *smf, const char *file_name)
+write_file(smf_t *smf, FILE* stream)
 {
-       FILE *stream;
-
-       stream = fopen(file_name, "w+");
-       if (stream == NULL) {
-               g_critical("Cannot open input file: %s", strerror(errno));
-
-               return (-1);
-       }
-
        if (fwrite(smf->file_buffer, 1, smf->file_buffer_length, stream) != smf->file_buffer_length) {
                g_critical("fwrite(3) failed: %s", strerror(errno));
 
                return (-2);
        }
 
-       if (fclose(stream)) {
-               g_critical("fclose(3) failed: %s", strerror(errno));
-
-               return (-3);
-       }
-
        return (0);
 }
 
@@ -487,7 +476,8 @@ smf_event_is_eot(const smf_event_t *event)
 static int
 smf_validate(smf_t *smf)
 {
-       int trackno, eventno, eot_found;
+       int trackno, eot_found;
+       size_t eventno;
        smf_track_t *track;
        smf_event_t *event;
 
@@ -522,7 +512,7 @@ smf_validate(smf_t *smf)
                        assert(event);
 
                        if (!smf_event_is_valid(event)) {
-                               g_critical("Event #%d on track #%d is invalid.", eventno, trackno);
+                               g_critical("Event #%zu on track #%d is invalid.", eventno, trackno);
                                return (-5);
                        }
 
@@ -555,7 +545,7 @@ assert_smf_event_is_identical(const smf_event_t *a, const smf_event_t *b)
 {
        assert(a->event_number == b->event_number);
        assert(a->delta_time_pulses == b->delta_time_pulses);
-       assert(abs(a->time_pulses - b->time_pulses) <= 2);
+       assert(abs((long)(a->time_pulses - b->time_pulses)) <= 2);
        assert(fabs(a->time_seconds - b->time_seconds) <= 0.01);
        assert(a->track_number == b->track_number);
        assert(a->midi_buffer_length == b->midi_buffer_length);
@@ -565,7 +555,7 @@ assert_smf_event_is_identical(const smf_event_t *a, const smf_event_t *b)
 static void
 assert_smf_track_is_identical(const smf_track_t *a, const smf_track_t *b)
 {
-       int i;
+       size_t i;
 
        assert(a->track_number == b->track_number);
        assert(a->number_of_events == b->number_of_events);
@@ -592,11 +582,11 @@ assert_smf_is_identical(const smf_t *a, const smf_t *b)
 }
 
 static void
-assert_smf_saved_correctly(const smf_t *smf, const char *file_name)
+assert_smf_saved_correctly(const smf_t *smf, FILE* file)
 {
        smf_t *saved;
 
-       saved = smf_load(file_name);
+       saved = smf_load (file);
        assert(saved != NULL);
 
        assert_smf_is_identical(smf, saved);
@@ -609,11 +599,11 @@ assert_smf_saved_correctly(const smf_t *smf, const char *file_name)
 /**
   * Writes the contents of SMF to the file given.
   * \param smf SMF.
-  * \param file_name Path to the file.
+  * \param file File descriptor.
   * \return 0, if saving was successfull.
   */
 int
-smf_save(smf_t *smf, const char *file_name)
+smf_save(smf_t *smf, FILE* file)
 {
        int i, error;
        smf_track_t *track;
@@ -640,7 +630,7 @@ smf_save(smf_t *smf, const char *file_name)
                }
        }
 
-       error = write_file(smf, file_name);
+       error = write_file(smf, file);
 
        free_buffer(smf);
 
@@ -648,7 +638,7 @@ smf_save(smf_t *smf, const char *file_name)
                return (error);
 
 #ifndef NDEBUG
-       assert_smf_saved_correctly(smf, file_name);
+       assert_smf_saved_correctly(smf, file);
 #endif
 
        return (0);