Changeset 4557
- Timestamp:
- 02/09/07 20:30:04 (2 years ago)
- Files:
-
- libwired/trunk/libwired/data/wi-data.c (modified) (2 diffs)
- libwired/trunk/libwired/data/wi-data.h (modified) (1 diff)
- libwired/trunk/libwired/data/wi-string.c (modified) (7 diffs)
- libwired/trunk/libwired/data/wi-string.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
libwired/trunk/libwired/data/wi-data.c
r4511 r4557 38 38 39 39 #include <wired/wi-data.h> 40 #include <wired/wi-file.h> 40 41 #include <wired/wi-private.h> 41 42 #include <wired/wi-runtime.h> … … 216 217 217 218 219 wi_data_t * wi_data_init_with_contents_of_file(wi_data_t *data, wi_string_t *path) { 220 wi_file_t *file; 221 struct stat sb; 222 char buffer[WI_FILE_BUFFER_SIZE]; 223 wi_integer_t bytes; 224 225 if(!wi_file_stat(path, &sb)) { 226 wi_release(data); 227 228 return NULL; 229 } 230 231 file = wi_file_for_reading(path); 232 233 if(!file) { 234 wi_release(data); 235 236 return NULL; 237 } 238 239 data = wi_data_init_with_capacity(data, sb.st_size); 240 241 while((bytes = wi_file_read_buffer(file, buffer, sizeof(buffer)))) 242 wi_data_append_bytes(data, buffer, bytes); 243 244 return data; 245 } 246 247 248 218 249 static void _wi_data_dealloc(wi_runtime_instance_t *instance) { 219 250 wi_data_t *data = instance; libwired/trunk/libwired/data/wi-data.h
r4437 r4557 46 46 WI_EXPORT wi_data_t * wi_data_init_with_random_bytes(wi_data_t *, wi_uinteger_t); 47 47 WI_EXPORT wi_data_t * wi_data_init_with_base64(wi_data_t *, wi_string_t *); 48 WI_EXPORT wi_data_t * wi_data_init_with_contents_of_file(wi_data_t *, wi_string_t *); 48 49 49 50 WI_EXPORT const void * wi_data_bytes(wi_data_t *); libwired/trunk/libwired/data/wi-string.c
r4556 r4557 310 310 311 311 312 wi_string_t * wi_string_init_with_base64(wi_string_t *string, wi_string_t *base64) { 313 wi_data_t *data; 314 315 data = wi_data_init_with_base64(wi_data_alloc(), base64); 316 string = wi_string_init_with_bytes(string, wi_data_bytes(data), wi_data_length(data)); 317 wi_release(data); 318 319 return string; 320 } 321 322 323 312 324 wi_string_t * wi_string_init_with_contents_of_file(wi_string_t *string, wi_string_t *path) { 313 struct stat sb; 314 FILE *fp; 315 const char *cstring; 316 char buffer[BUFSIZ]; 317 size_t bytes; 318 319 cstring = wi_string_cstring(path); 320 321 if(stat(cstring, &sb) < 0) { 322 wi_error_set_errno(errno); 323 325 wi_file_t *file; 326 327 file = wi_file_for_reading(path); 328 329 if(!file) { 324 330 wi_release(string); 325 331 326 332 return NULL; 327 333 } 328 329 fp = fopen(cstring, "r"); 330 331 if(!fp) { 332 wi_error_set_errno(errno); 333 334 wi_release(string); 335 336 return NULL; 337 } 338 339 string = wi_string_init_with_capacity(string, sb.st_size); 340 341 while((bytes = fread(buffer, 1, sizeof(buffer), fp)) > 0) 342 wi_string_append_bytes(string, buffer, bytes); 343 344 fclose(fp); 345 346 return string; 334 335 return wi_file_read_to_end_of_file(file); 347 336 } 348 337 … … 394 383 wi_string_t *string1 = instance1; 395 384 wi_string_t *string2 = instance2; 385 386 if(string1 == string2) 387 return true; 396 388 397 389 return strcmp(string1->string, string2->string); … … 403 395 wi_string_t *string1 = instance1; 404 396 wi_string_t *string2 = instance2; 397 398 if(string1 == string2) 399 return true; 405 400 406 401 return strcasecmp(string1->string, string2->string); … … 1568 1563 1569 1564 wi_data_t * wi_string_data(wi_string_t *string) { 1570 return wi_ data_init_with_bytes(wi_data_alloc(), string->string, string->length);1565 return wi_autorelease(wi_data_init_with_bytes(wi_data_alloc(), string->string, string->length)); 1571 1566 } 1572 1567 … … 1576 1571 1577 1572 wi_string_t * wi_string_md5(wi_string_t *string) { 1578 static unsigned char hex[] = "0123456789abcdef"; 1579 MD5_CTX c; 1580 unsigned char md5[MD5_DIGEST_LENGTH]; 1581 char md5_hex[sizeof(md5) * 2 + 1]; 1582 wi_uinteger_t i; 1583 1584 MD5_Init(&c); 1585 MD5_Update(&c, (unsigned char *) string->string, string->length); 1586 MD5_Final(md5, &c); 1587 1588 for(i = 0; i < MD5_DIGEST_LENGTH; i++) { 1589 md5_hex[i+i] = hex[md5[i] >> 4]; 1590 md5_hex[i+i+1] = hex[md5[i] & 0x0F]; 1591 } 1592 1593 md5_hex[i+i] = '\0'; 1594 1595 return wi_string_with_cstring(md5_hex); 1573 return wi_data_md5(wi_string_data(string)); 1596 1574 } 1597 1575 … … 1599 1577 1600 1578 wi_string_t * wi_string_sha1(wi_string_t *string) { 1601 static unsigned char hex[] = "0123456789abcdef"; 1602 SHA_CTX c; 1603 unsigned char sha1[SHA_DIGEST_LENGTH]; 1604 char sha1_hex[sizeof(sha1) * 2 + 1]; 1605 wi_uinteger_t i; 1606 1607 SHA1_Init(&c); 1608 SHA1_Update(&c, (unsigned char *) string->string, string->length); 1609 SHA1_Final(sha1, &c); 1610 1611 for(i = 0; i < SHA_DIGEST_LENGTH; i++) { 1612 sha1_hex[i+i] = hex[sha1[i] >> 4]; 1613 sha1_hex[i+i+1] = hex[sha1[i] & 0x0F]; 1614 } 1615 1616 sha1_hex[i+i] = '\0'; 1617 1618 return wi_string_with_cstring(sha1_hex); 1579 return wi_data_sha1(wi_string_data(string)); 1619 1580 } 1620 1581 … … 1624 1585 1625 1586 wi_string_t * wi_string_base64(wi_string_t *string) { 1626 static char base64_table[] = 1627 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 1628 wi_string_t *base64_string; 1629 unsigned char inbuffer[3], outbuffer[4]; 1630 wi_uinteger_t i, count, position, offset, remaining; 1631 size_t size; 1632 1633 position = offset = 0; 1634 size = string->length * (4.0f / 3.0f) + 4; 1635 base64_string = wi_string_init_with_capacity(wi_string_alloc(), size); 1636 1637 while(position < string->length) { 1638 for(i = 0; i < 3; i++) { 1639 if(position + i < string->length) 1640 inbuffer[i] = string->string[position + i]; 1641 else 1642 inbuffer[i] = '\0'; 1643 } 1644 1645 outbuffer[0] = (inbuffer[0] & 0xFC) >> 2; 1646 outbuffer[1] = ((inbuffer[0] & 0x03) << 4) | ((inbuffer[1] & 0xF0) >> 4); 1647 outbuffer[2] = ((inbuffer[1] & 0x0F) << 2) | ((inbuffer[2] & 0xC0) >> 6); 1648 outbuffer[3] = inbuffer[2] & 0x3F; 1649 1650 remaining = string->length - position; 1651 1652 if(remaining == 1) 1653 count = 2; 1654 else if(remaining == 2) 1655 count = 3; 1656 else 1657 count = 4; 1658 1659 for(i = 0; i < count; i++) 1660 base64_string->string[offset++] = base64_table[outbuffer[i]]; 1661 1662 for(i = count; i < 4; i++) 1663 base64_string->string[offset++] = '='; 1664 1665 position += 3; 1666 } 1667 1668 base64_string->string[offset] = '\0'; 1669 1670 return wi_autorelease(base64_string); 1587 return wi_data_base64(wi_string_data(string)); 1671 1588 } 1672 1589 libwired/trunk/libwired/data/wi-string.h
r4540 r4557 66 66 WI_EXPORT wi_string_t * wi_string_init_with_format(wi_string_t *, wi_string_t *, ...); 67 67 WI_EXPORT wi_string_t * wi_string_init_with_format_and_arguments(wi_string_t *, wi_string_t *, va_list); 68 WI_EXPORT wi_string_t * wi_string_init_with_base64(wi_string_t *, wi_string_t *); 68 69 WI_EXPORT wi_string_t * wi_string_init_with_contents_of_file(wi_string_t *, wi_string_t *); 69 70
