Commit 87b76c6f6d7780dfdc1c9ed4d2ef0b600e99f90e
1 parent
9e14881b
Exists in
master
and in
3 other branches
Standardizing error codes; documenting then.
Showing
4 changed files
with
70 additions
and
43 deletions
Show diff stats
src/core/bounds.c
| @@ -52,7 +52,7 @@ LIB3270_EXPORT int lib3270_get_field_bounds(H3270 *hSession, int baddr, int *sta | @@ -52,7 +52,7 @@ LIB3270_EXPORT int lib3270_get_field_bounds(H3270 *hSession, int baddr, int *sta | ||
| 52 | first = lib3270_field_addr(hSession,baddr); | 52 | first = lib3270_field_addr(hSession,baddr); |
| 53 | 53 | ||
| 54 | if(first < 0) | 54 | if(first < 0) |
| 55 | - return errno = (errno == 0 ? EINVAL : errno); | 55 | + return -first; |
| 56 | 56 | ||
| 57 | first++; | 57 | first++; |
| 58 | 58 |
src/core/ctlr.c
| @@ -451,7 +451,7 @@ LIB3270_EXPORT int lib3270_get_field_start(H3270 *hSession, int baddr) | @@ -451,7 +451,7 @@ LIB3270_EXPORT int lib3270_get_field_start(H3270 *hSession, int baddr) | ||
| 451 | return - errno; | 451 | return - errno; |
| 452 | 452 | ||
| 453 | if (!hSession->formatted) | 453 | if (!hSession->formatted) |
| 454 | - return - (errno = ENOTCONN); | 454 | + return - (errno = ENOTSUP); |
| 455 | 455 | ||
| 456 | if(baddr < 0) | 456 | if(baddr < 0) |
| 457 | baddr = hSession->cursor_addr; | 457 | baddr = hSession->cursor_addr; |
| @@ -474,18 +474,18 @@ LIB3270_EXPORT int lib3270_get_field_len(H3270 *hSession, int baddr) | @@ -474,18 +474,18 @@ LIB3270_EXPORT int lib3270_get_field_len(H3270 *hSession, int baddr) | ||
| 474 | int addr; | 474 | int addr; |
| 475 | int width = 0; | 475 | int width = 0; |
| 476 | 476 | ||
| 477 | - CHECK_SESSION_HANDLE(hSession); | 477 | + if(check_online_session(hSession)) |
| 478 | + return - errno; | ||
| 478 | 479 | ||
| 479 | if (!hSession->formatted) | 480 | if (!hSession->formatted) |
| 480 | - return errno = ENOTCONN; | 481 | + return - (errno = ENOTSUP); |
| 481 | 482 | ||
| 482 | if(baddr < 0) | 483 | if(baddr < 0) |
| 483 | baddr = hSession->cursor_addr; | 484 | baddr = hSession->cursor_addr; |
| 484 | 485 | ||
| 485 | addr = lib3270_field_addr(hSession,baddr); | 486 | addr = lib3270_field_addr(hSession,baddr); |
| 486 | - | ||
| 487 | if(addr < 0) | 487 | if(addr < 0) |
| 488 | - return -1; | 488 | + return addr; |
| 489 | 489 | ||
| 490 | saddr = addr; | 490 | saddr = addr; |
| 491 | INC_BA(addr); | 491 | INC_BA(addr); |
| @@ -497,26 +497,24 @@ LIB3270_EXPORT int lib3270_get_field_len(H3270 *hSession, int baddr) | @@ -497,26 +497,24 @@ LIB3270_EXPORT int lib3270_get_field_len(H3270 *hSession, int baddr) | ||
| 497 | width++; | 497 | width++; |
| 498 | } while (addr != saddr); | 498 | } while (addr != saddr); |
| 499 | 499 | ||
| 500 | - return -1; | 500 | + return -(errno = ENODATA); |
| 501 | } | 501 | } |
| 502 | 502 | ||
| 503 | -/** | ||
| 504 | - * @brief Find the buffer address of the field attribute for a given buffer address. | ||
| 505 | - * | ||
| 506 | - * @param hSession Session handle. | ||
| 507 | - * @param addr Buffer address of the field. | ||
| 508 | - * | ||
| 509 | - * @return field address or -1 if the screen isn't formatted (sets errno). | ||
| 510 | - * | ||
| 511 | - */ | ||
| 512 | LIB3270_EXPORT int lib3270_field_addr(H3270 *hSession, int baddr) | 503 | LIB3270_EXPORT int lib3270_field_addr(H3270 *hSession, int baddr) |
| 513 | { | 504 | { |
| 514 | int sbaddr; | 505 | int sbaddr; |
| 515 | 506 | ||
| 516 | - FAIL_IF_NOT_ONLINE(hSession); | 507 | + if(!lib3270_is_connected(hSession)) |
| 508 | + return -(errno = ENOTCONN); | ||
| 517 | 509 | ||
| 518 | if(!hSession->formatted) | 510 | if(!hSession->formatted) |
| 519 | - return errno = ENOTCONN; | 511 | + return -(errno = ENOTSUP); |
| 512 | + | ||
| 513 | + if(baddr < 0) | ||
| 514 | + baddr = lib3270_get_cursor_address(hSession); | ||
| 515 | + | ||
| 516 | + if(baddr > lib3270_get_length(hSession)) | ||
| 517 | + return -(errno = EOVERFLOW); | ||
| 520 | 518 | ||
| 521 | sbaddr = baddr; | 519 | sbaddr = baddr; |
| 522 | do | 520 | do |
| @@ -526,8 +524,7 @@ LIB3270_EXPORT int lib3270_field_addr(H3270 *hSession, int baddr) | @@ -526,8 +524,7 @@ LIB3270_EXPORT int lib3270_field_addr(H3270 *hSession, int baddr) | ||
| 526 | DEC_BA(baddr); | 524 | DEC_BA(baddr); |
| 527 | } while (baddr != sbaddr); | 525 | } while (baddr != sbaddr); |
| 528 | 526 | ||
| 529 | - errno = EINVAL; | ||
| 530 | - return -1; | 527 | + return -(errno = ENODATA); |
| 531 | } | 528 | } |
| 532 | 529 | ||
| 533 | LIB3270_EXPORT LIB3270_FIELD_ATTRIBUTE lib3270_get_field_attribute(H3270 *hSession, int baddr) | 530 | LIB3270_EXPORT LIB3270_FIELD_ATTRIBUTE lib3270_get_field_attribute(H3270 *hSession, int baddr) |
| @@ -565,7 +562,7 @@ LIB3270_EXPORT LIB3270_FIELD_ATTRIBUTE lib3270_get_field_attribute(H3270 *hSessi | @@ -565,7 +562,7 @@ LIB3270_EXPORT LIB3270_FIELD_ATTRIBUTE lib3270_get_field_attribute(H3270 *hSessi | ||
| 565 | * @param hSession Session handle. | 562 | * @param hSession Session handle. |
| 566 | * @param addr Buffer address of the field. | 563 | * @param addr Buffer address of the field. |
| 567 | * | 564 | * |
| 568 | - * @return field length or -1 if invalid or not connected (sets errno). | 565 | + * @return field length or negative if invalid or not connected (sets errno). |
| 569 | * | 566 | * |
| 570 | */ | 567 | */ |
| 571 | int lib3270_field_length(H3270 *hSession, int baddr) | 568 | int lib3270_field_length(H3270 *hSession, int baddr) |
| @@ -575,9 +572,8 @@ int lib3270_field_length(H3270 *hSession, int baddr) | @@ -575,9 +572,8 @@ int lib3270_field_length(H3270 *hSession, int baddr) | ||
| 575 | int width = 0; | 572 | int width = 0; |
| 576 | 573 | ||
| 577 | addr = lib3270_field_addr(hSession,baddr); | 574 | addr = lib3270_field_addr(hSession,baddr); |
| 578 | - | ||
| 579 | if(addr < 0) | 575 | if(addr < 0) |
| 580 | - return -1; | 576 | + return addr; |
| 581 | 577 | ||
| 582 | saddr = addr; | 578 | saddr = addr; |
| 583 | INC_BA(addr); | 579 | INC_BA(addr); |
| @@ -589,17 +585,22 @@ int lib3270_field_length(H3270 *hSession, int baddr) | @@ -589,17 +585,22 @@ int lib3270_field_length(H3270 *hSession, int baddr) | ||
| 589 | width++; | 585 | width++; |
| 590 | } while (addr != saddr); | 586 | } while (addr != saddr); |
| 591 | 587 | ||
| 592 | - return errno = EINVAL; | 588 | + return -(errno = EINVAL); |
| 593 | 589 | ||
| 594 | } | 590 | } |
| 595 | 591 | ||
| 596 | -/* | ||
| 597 | - * Find the field attribute for the given buffer address. Return its address | ||
| 598 | - * rather than its value. | 592 | +/** |
| 593 | + * @brief Find the field attribute for the given buffer address. | ||
| 594 | + * | ||
| 595 | + * @return Field attribute. | ||
| 596 | + * | ||
| 599 | */ | 597 | */ |
| 600 | unsigned char get_field_attribute(H3270 *hSession, int baddr) | 598 | unsigned char get_field_attribute(H3270 *hSession, int baddr) |
| 601 | { | 599 | { |
| 602 | - return hSession->ea_buf[lib3270_field_addr(hSession,baddr)].fa; | 600 | + baddr = lib3270_field_addr(hSession,baddr); |
| 601 | + if(baddr < 0) | ||
| 602 | + return 0; | ||
| 603 | + return hSession->ea_buf[baddr].fa; | ||
| 603 | } | 604 | } |
| 604 | 605 | ||
| 605 | /** | 606 | /** |
| @@ -608,7 +609,7 @@ unsigned char get_field_attribute(H3270 *hSession, int baddr) | @@ -608,7 +609,7 @@ unsigned char get_field_attribute(H3270 *hSession, int baddr) | ||
| 608 | * @param hSession Session handle. | 609 | * @param hSession Session handle. |
| 609 | * @param baddr0 Search start addr (-1 to use current cursor position). | 610 | * @param baddr0 Search start addr (-1 to use current cursor position). |
| 610 | * | 611 | * |
| 611 | - * @return address following the unprotected attribute byte, or 0 if no nonzero-width unprotected field can be found, -1 if not connected. | 612 | + * @return address following the unprotected attribute byte, or 0 if no nonzero-width unprotected field can be found, negative if failed. |
| 612 | * | 613 | * |
| 613 | */ | 614 | */ |
| 614 | LIB3270_EXPORT int lib3270_get_next_unprotected(H3270 *hSession, int baddr0) | 615 | LIB3270_EXPORT int lib3270_get_next_unprotected(H3270 *hSession, int baddr0) |
| @@ -618,7 +619,7 @@ LIB3270_EXPORT int lib3270_get_next_unprotected(H3270 *hSession, int baddr0) | @@ -618,7 +619,7 @@ LIB3270_EXPORT int lib3270_get_next_unprotected(H3270 *hSession, int baddr0) | ||
| 618 | FAIL_IF_NOT_ONLINE(hSession); | 619 | FAIL_IF_NOT_ONLINE(hSession); |
| 619 | 620 | ||
| 620 | if(!hSession->formatted) | 621 | if(!hSession->formatted) |
| 621 | - return errno = ENOTCONN; | 622 | + return -(errno = ENOTSUP); |
| 622 | 623 | ||
| 623 | if(baddr0 < 0) | 624 | if(baddr0 < 0) |
| 624 | baddr0 = hSession->cursor_addr; | 625 | baddr0 = hSession->cursor_addr; |
src/include/lib3270.h
| @@ -1094,11 +1094,14 @@ | @@ -1094,11 +1094,14 @@ | ||
| 1094 | * @brief Get all text inside the terminal. | 1094 | * @brief Get all text inside the terminal. |
| 1095 | * | 1095 | * |
| 1096 | * @param h Session Handle. | 1096 | * @param h Session Handle. |
| 1097 | - * @param offset Start position. | 1097 | + * @param offset Start position (-1 to current cursor position). |
| 1098 | * @param len Text length or -1 to all text. | 1098 | * @param len Text length or -1 to all text. |
| 1099 | * @param lf Line break char (0 to disable line breaks). | 1099 | * @param lf Line break char (0 to disable line breaks). |
| 1100 | * | 1100 | * |
| 1101 | - * @return Contents at position if available, or NULL. Release it with lib3270_free() | 1101 | + * @return Contents at position if available, or NULL if error (sets errno). Release it with lib3270_free() |
| 1102 | + * | ||
| 1103 | + * @exception ENOTCONN Not connected to host. | ||
| 1104 | + * @exception EOVERFLOW Invalid offset. | ||
| 1102 | * | 1105 | * |
| 1103 | */ | 1106 | */ |
| 1104 | LIB3270_EXPORT char * lib3270_get_string_at_address(H3270 *h, int offset, int len, char lf); | 1107 | LIB3270_EXPORT char * lib3270_get_string_at_address(H3270 *h, int offset, int len, char lf); |
| @@ -1109,13 +1112,16 @@ | @@ -1109,13 +1112,16 @@ | ||
| 1109 | * @param h Session Handle. | 1112 | * @param h Session Handle. |
| 1110 | * @param row Desired row. | 1113 | * @param row Desired row. |
| 1111 | * @param col Desired col. | 1114 | * @param col Desired col. |
| 1112 | - * @param length Text length | 1115 | + * @param len Text length or -1 to all text. |
| 1113 | * @param lf Line break char (0 to disable line breaks). | 1116 | * @param lf Line break char (0 to disable line breaks). |
| 1114 | * | 1117 | * |
| 1115 | - * @return Contents at position if available, or NULL. Release it with lib3270_free() | 1118 | + * @return Contents at position if available, or NULL if error (sets errno). Release it with lib3270_free() |
| 1119 | + * | ||
| 1120 | + * @exception ENOTCONN Not connected to host. | ||
| 1121 | + * @exception EOVERFLOW Invalid position. | ||
| 1116 | * | 1122 | * |
| 1117 | */ | 1123 | */ |
| 1118 | - LIB3270_EXPORT char * lib3270_get_string_at(H3270 *h, int row, int col, int len, char lf); | 1124 | + LIB3270_EXPORT char * lib3270_get_string_at(H3270 *h, unsigned int row, unsigned int col, int len, char lf); |
| 1119 | 1125 | ||
| 1120 | /** | 1126 | /** |
| 1121 | * @brief Check for text at requested position | 1127 | * @brief Check for text at requested position |
| @@ -1129,7 +1135,7 @@ | @@ -1129,7 +1135,7 @@ | ||
| 1129 | * @return Test result from strcmp | 1135 | * @return Test result from strcmp |
| 1130 | * | 1136 | * |
| 1131 | */ | 1137 | */ |
| 1132 | - LIB3270_EXPORT int lib3270_cmp_text_at(H3270 *h, int row, int col, const char *text, char lf); | 1138 | + LIB3270_EXPORT int lib3270_cmp_text_at(H3270 *h, unsigned int row, unsigned int col, const char *text, char lf); |
| 1133 | 1139 | ||
| 1134 | 1140 | ||
| 1135 | /** | 1141 | /** |
| @@ -1138,7 +1144,10 @@ | @@ -1138,7 +1144,10 @@ | ||
| 1138 | * @param h Session Handle. | 1144 | * @param h Session Handle. |
| 1139 | * @param baddr Reference position. | 1145 | * @param baddr Reference position. |
| 1140 | * | 1146 | * |
| 1141 | - * @return NULL if failed, contents of the entire field if suceeds (release it with lib3270_free()). | 1147 | + * @return NULL if failed (sets errno), contents of the entire field if suceeds (release it with lib3270_free()). |
| 1148 | + * | ||
| 1149 | + * @exception ENOTCONN Not connected to host. | ||
| 1150 | + * @exception EOVERFLOW Invalid position. | ||
| 1142 | * | 1151 | * |
| 1143 | */ | 1152 | */ |
| 1144 | LIB3270_EXPORT char * lib3270_get_field_text_at(H3270 *h, int baddr); | 1153 | LIB3270_EXPORT char * lib3270_get_field_text_at(H3270 *h, int baddr); |
| @@ -1206,7 +1215,12 @@ | @@ -1206,7 +1215,12 @@ | ||
| 1206 | * @param hSession Session handle. | 1215 | * @param hSession Session handle. |
| 1207 | * @param addr Buffer address of the field. | 1216 | * @param addr Buffer address of the field. |
| 1208 | * | 1217 | * |
| 1209 | - * @return field address or -1 if the screen isn't formatted (sets errno). | 1218 | + * @return field address or negative if the screen isn't formatted (sets errno). |
| 1219 | + * | ||
| 1220 | + * @exception -ENOTCONN Not connected to host. | ||
| 1221 | + * @exception -EOVERFLOW Invalid position. | ||
| 1222 | + * @exception -ENOTSUP Screen is not formatted. | ||
| 1223 | + * @exception -ENODATA No field at the address. | ||
| 1210 | * | 1224 | * |
| 1211 | */ | 1225 | */ |
| 1212 | LIB3270_EXPORT int lib3270_field_addr(H3270 *hSession, int baddr); | 1226 | LIB3270_EXPORT int lib3270_field_addr(H3270 *hSession, int baddr); |
src/selection/selection.c
| @@ -288,10 +288,13 @@ LIB3270_EXPORT char * lib3270_get_string_at_address(H3270 *h, int offset, int le | @@ -288,10 +288,13 @@ LIB3270_EXPORT char * lib3270_get_string_at_address(H3270 *h, int offset, int le | ||
| 288 | return NULL; | 288 | return NULL; |
| 289 | } | 289 | } |
| 290 | 290 | ||
| 291 | + if(offset < 0) | ||
| 292 | + offset = lib3270_get_cursor_address(h); | ||
| 293 | + | ||
| 291 | maxlen = (h->rows * (h->cols+ (lf ? 1 : 0) )) - offset; | 294 | maxlen = (h->rows * (h->cols+ (lf ? 1 : 0) )) - offset; |
| 292 | if(maxlen <= 0 || offset < 0) | 295 | if(maxlen <= 0 || offset < 0) |
| 293 | { | 296 | { |
| 294 | - errno = EINVAL; | 297 | + errno = EOVERFLOW; |
| 295 | return NULL; | 298 | return NULL; |
| 296 | } | 299 | } |
| 297 | 300 | ||
| @@ -331,19 +334,28 @@ LIB3270_EXPORT char * lib3270_get_string_at_address(H3270 *h, int offset, int le | @@ -331,19 +334,28 @@ LIB3270_EXPORT char * lib3270_get_string_at_address(H3270 *h, int offset, int le | ||
| 331 | return buffer; | 334 | return buffer; |
| 332 | } | 335 | } |
| 333 | 336 | ||
| 334 | -LIB3270_EXPORT char * lib3270_get_string_at(H3270 *h, int row, int col, int len, char lf) | 337 | +LIB3270_EXPORT char * lib3270_get_string_at(H3270 *h, unsigned int row, unsigned int col, int len, char lf) |
| 335 | { | 338 | { |
| 336 | CHECK_SESSION_HANDLE(h); | 339 | CHECK_SESSION_HANDLE(h); |
| 337 | - return lib3270_get_string_at_address(h, ((row-1) * h->cols) + (col-1), len, lf); | 340 | + |
| 341 | + int baddr = lib3270_translate_to_address(h,row,col); | ||
| 342 | + if(baddr < 0) | ||
| 343 | + return NULL; | ||
| 344 | + | ||
| 345 | + return lib3270_get_string_at_address(h, baddr, len, lf); | ||
| 338 | } | 346 | } |
| 339 | 347 | ||
| 340 | -LIB3270_EXPORT int lib3270_cmp_text_at(H3270 *h, int row, int col, const char *text, char lf) | 348 | +LIB3270_EXPORT int lib3270_cmp_text_at(H3270 *h, unsigned int row, unsigned int col, const char *text, char lf) |
| 341 | { | 349 | { |
| 342 | int rc; | 350 | int rc; |
| 343 | size_t sz = strlen(text); | 351 | size_t sz = strlen(text); |
| 344 | char * contents; | 352 | char * contents; |
| 345 | 353 | ||
| 346 | - contents = lib3270_get_string_at(h,row,col,sz,lf); | 354 | + int baddr = lib3270_translate_to_address(h,row,col); |
| 355 | + if(baddr < 0) | ||
| 356 | + return -1; | ||
| 357 | + | ||
| 358 | + contents = lib3270_get_string_at_address(h,baddr,sz,lf); | ||
| 347 | if(!contents) | 359 | if(!contents) |
| 348 | return -1; | 360 | return -1; |
| 349 | 361 |