69 int writer_put(Writer *w, const char *s, size_t len) { |
69 int writer_put(Writer *w, const char *s, size_t len) { |
70 if(w->error) { |
70 if(w->error) { |
71 return w->error; |
71 return w->error; |
72 } |
72 } |
73 |
73 |
|
74 // available bytes |
74 size_t a = w->size - w->pos; |
75 size_t a = w->size - w->pos; |
75 if(a == 0) { |
76 if(a == 0) { |
76 if(writer_flush(w)) { |
77 if(writer_flush(w)) { |
77 return 1; |
78 return 1; |
78 } |
79 } |
79 } |
80 } |
80 |
81 |
81 size_t cplen = len > a ? a : len; |
82 size_t cplen = len > a ? a : len; // number of bytes we can copy |
82 memcpy(w->buffer, s, cplen); |
83 memcpy(w->buffer+w->pos, s, cplen); |
83 w->pos += cplen; |
84 w->pos += cplen; |
84 |
85 |
85 if(cplen < len) { |
86 if(cplen < len) { |
|
87 // not all bytes copied -> call writer_put again |
|
88 // the number of available bytes is 0 then, therefore flush is called |
86 return writer_put(w, s + cplen, len - cplen); |
89 return writer_put(w, s + cplen, len - cplen); |
87 } else { |
90 } else { |
88 return 0; |
91 return 0; |
89 } |
92 } |
90 } |
93 } |