| OLD | NEW |
| 1 // Copyright (c) 2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2008 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 // Written in NSPR style to also be suitable for adding to the NSS demo suite | 4 // Written in NSPR style to also be suitable for adding to the NSS demo suite |
| 5 | 5 |
| 6 /* memio is a simple NSPR I/O layer that lets you decouple NSS from | 6 /* memio is a simple NSPR I/O layer that lets you decouple NSS from |
| 7 * the real network. It's rather like openssl's memory bio, | 7 * the real network. It's rather like openssl's memory bio, |
| 8 * and is useful when your app absolutely, positively doesn't | 8 * and is useful when your app absolutely, positively doesn't |
| 9 * want to let NSS do its own networking. | 9 * want to let NSS do its own networking. |
| 10 */ | 10 */ |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 161 /* Buffer not full */ | 161 /* Buffer not full */ |
| 162 memcpy(&mb->buf[mb->tail], buf, len); | 162 memcpy(&mb->buf[mb->tail], buf, len); |
| 163 mb->tail += len; | 163 mb->tail += len; |
| 164 if (mb->tail == mb->bufsize) | 164 if (mb->tail == mb->bufsize) |
| 165 mb->tail = 0; | 165 mb->tail = 0; |
| 166 n -= len; | 166 n -= len; |
| 167 buf += len; | 167 buf += len; |
| 168 transferred += len; | 168 transferred += len; |
| 169 | 169 |
| 170 /* Handle part after wrap */ | 170 /* Handle part after wrap */ |
| 171 » len = PR_MIN(n, memio_buffer_unused_contiguous(mb)); | 171 len = PR_MIN(n, memio_buffer_unused_contiguous(mb)); |
| 172 » if (len > 0) { | 172 if (len > 0) { |
| 173 /* Output buffer still not full, input buffer still not empty */ | 173 /* Output buffer still not full, input buffer still not empty */ |
| 174 » memcpy(&mb->buf[mb->tail], buf, len); | 174 memcpy(&mb->buf[mb->tail], buf, len); |
| 175 » mb->tail += len; | 175 mb->tail += len; |
| 176 if (mb->tail == mb->bufsize) | 176 if (mb->tail == mb->bufsize) |
| 177 mb->tail = 0; | 177 mb->tail = 0; |
| 178 » transferred += len; | 178 transferred += len; |
| 179 } | 179 } |
| 180 } | 180 } |
| 181 | 181 |
| 182 return transferred; | 182 return transferred; |
| 183 } | 183 } |
| 184 | 184 |
| 185 | 185 |
| 186 /* Read n bytes from the buffer. Returns number of bytes read. */ | 186 /* Read n bytes from the buffer. Returns number of bytes read. */ |
| 187 static int memio_buffer_get(struct memio_buffer *mb, char *buf, int n) | 187 static int memio_buffer_get(struct memio_buffer *mb, char *buf, int n) |
| 188 { | 188 { |
| 189 int len; | 189 int len; |
| 190 int transferred = 0; | 190 int transferred = 0; |
| 191 | 191 |
| 192 /* Handle part before wrap */ | 192 /* Handle part before wrap */ |
| 193 len = PR_MIN(n, memio_buffer_used_contiguous(mb)); | 193 len = PR_MIN(n, memio_buffer_used_contiguous(mb)); |
| 194 if (len) { | 194 if (len) { |
| 195 memcpy(buf, &mb->buf[mb->head], len); | 195 memcpy(buf, &mb->buf[mb->head], len); |
| 196 mb->head += len; | 196 mb->head += len; |
| 197 if (mb->head == mb->bufsize) | 197 if (mb->head == mb->bufsize) |
| 198 mb->head = 0; | 198 mb->head = 0; |
| 199 n -= len; | 199 n -= len; |
| 200 buf += len; | 200 buf += len; |
| 201 transferred += len; | 201 transferred += len; |
| 202 | 202 |
| 203 /* Handle part after wrap */ | 203 /* Handle part after wrap */ |
| 204 » len = PR_MIN(n, memio_buffer_used_contiguous(mb)); | 204 len = PR_MIN(n, memio_buffer_used_contiguous(mb)); |
| 205 » if (len) { | 205 if (len) { |
| 206 » memcpy(buf, &mb->buf[mb->head], len); | 206 memcpy(buf, &mb->buf[mb->head], len); |
| 207 » mb->head += len; | 207 mb->head += len; |
| 208 if (mb->head == mb->bufsize) | 208 if (mb->head == mb->bufsize) |
| 209 mb->head = 0; | 209 mb->head = 0; |
| 210 » transferred += len; | 210 transferred += len; |
| 211 } | 211 } |
| 212 } | 212 } |
| 213 | 213 |
| 214 return transferred; | 214 return transferred; |
| 215 } | 215 } |
| 216 | 216 |
| 217 /*--------------- private memio functions -----------------------*/ | 217 /*--------------- private memio functions -----------------------*/ |
| 218 | 218 |
| 219 static PRStatus PR_CALLBACK memio_Close(PRFileDesc *fd) | 219 static PRStatus PR_CALLBACK memio_Close(PRFileDesc *fd) |
| 220 { | 220 { |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 422 } | 422 } |
| 423 | 423 |
| 424 void memio_PutReadResult(memio_Private *secret, int bytes_read) | 424 void memio_PutReadResult(memio_Private *secret, int bytes_read) |
| 425 { | 425 { |
| 426 struct memio_buffer* mb = &((PRFilePrivate *)secret)->readbuf; | 426 struct memio_buffer* mb = &((PRFilePrivate *)secret)->readbuf; |
| 427 PR_ASSERT(mb->bufsize); | 427 PR_ASSERT(mb->bufsize); |
| 428 | 428 |
| 429 if (bytes_read > 0) { | 429 if (bytes_read > 0) { |
| 430 mb->tail += bytes_read; | 430 mb->tail += bytes_read; |
| 431 if (mb->tail == mb->bufsize) | 431 if (mb->tail == mb->bufsize) |
| 432 » mb->tail = 0; | 432 mb->tail = 0; |
| 433 } else if (bytes_read == 0) { | 433 } else if (bytes_read == 0) { |
| 434 /* Record EOF condition and report to caller when buffer runs dry */ | 434 /* Record EOF condition and report to caller when buffer runs dry */ |
| 435 ((PRFilePrivate *)secret)->eof = PR_TRUE; | 435 ((PRFilePrivate *)secret)->eof = PR_TRUE; |
| 436 } else /* if (bytes_read < 0) */ { | 436 } else /* if (bytes_read < 0) */ { |
| 437 mb->last_err = bytes_read; | 437 mb->last_err = bytes_read; |
| 438 } | 438 } |
| 439 } | 439 } |
| 440 | 440 |
| 441 int memio_GetWriteParams(memio_Private *secret, const char **buf) | 441 int memio_GetWriteParams(memio_Private *secret, const char **buf) |
| 442 { | 442 { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 465 | 465 |
| 466 /* Even a trivial unit test is very helpful when doing circular buffers. */ | 466 /* Even a trivial unit test is very helpful when doing circular buffers. */ |
| 467 /*#define TRIVIAL_SELF_TEST*/ | 467 /*#define TRIVIAL_SELF_TEST*/ |
| 468 #ifdef TRIVIAL_SELF_TEST | 468 #ifdef TRIVIAL_SELF_TEST |
| 469 #include <stdio.h> | 469 #include <stdio.h> |
| 470 | 470 |
| 471 #define TEST_BUFLEN 7 | 471 #define TEST_BUFLEN 7 |
| 472 | 472 |
| 473 #define CHECKEQ(a, b) { \ | 473 #define CHECKEQ(a, b) { \ |
| 474 if ((a) != (b)) { \ | 474 if ((a) != (b)) { \ |
| 475 » printf("%d != %d, Test failed line %d\n", a, b, __LINE__); \ | 475 printf("%d != %d, Test failed line %d\n", a, b, __LINE__); \ |
| 476 » exit(1); \ | 476 exit(1); \ |
| 477 } \ | 477 } \ |
| 478 } | 478 } |
| 479 | 479 |
| 480 int main() | 480 int main() |
| 481 { | 481 { |
| 482 struct memio_buffer mb; | 482 struct memio_buffer mb; |
| 483 char buf[100]; | 483 char buf[100]; |
| 484 int i; | 484 int i; |
| 485 | 485 |
| 486 memio_buffer_new(&mb, TEST_BUFLEN); | 486 memio_buffer_new(&mb, TEST_BUFLEN); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 538 CHECKEQ(memio_buffer_used_contiguous(&mb), 1); | 538 CHECKEQ(memio_buffer_used_contiguous(&mb), 1); |
| 539 CHECKEQ(memio_buffer_used(&mb), 6); | 539 CHECKEQ(memio_buffer_used(&mb), 6); |
| 540 | 540 |
| 541 /* TODO: add more cases */ | 541 /* TODO: add more cases */ |
| 542 | 542 |
| 543 printf("Test passed\n"); | 543 printf("Test passed\n"); |
| 544 exit(0); | 544 exit(0); |
| 545 } | 545 } |
| 546 | 546 |
| 547 #endif | 547 #endif |
| OLD | NEW |