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
src/core/ctlr.c
| ... | ... | @@ -451,7 +451,7 @@ LIB3270_EXPORT int lib3270_get_field_start(H3270 *hSession, int baddr) |
| 451 | 451 | return - errno; |
| 452 | 452 | |
| 453 | 453 | if (!hSession->formatted) |
| 454 | - return - (errno = ENOTCONN); | |
| 454 | + return - (errno = ENOTSUP); | |
| 455 | 455 | |
| 456 | 456 | if(baddr < 0) |
| 457 | 457 | baddr = hSession->cursor_addr; |
| ... | ... | @@ -474,18 +474,18 @@ LIB3270_EXPORT int lib3270_get_field_len(H3270 *hSession, int baddr) |
| 474 | 474 | int addr; |
| 475 | 475 | int width = 0; |
| 476 | 476 | |
| 477 | - CHECK_SESSION_HANDLE(hSession); | |
| 477 | + if(check_online_session(hSession)) | |
| 478 | + return - errno; | |
| 478 | 479 | |
| 479 | 480 | if (!hSession->formatted) |
| 480 | - return errno = ENOTCONN; | |
| 481 | + return - (errno = ENOTSUP); | |
| 481 | 482 | |
| 482 | 483 | if(baddr < 0) |
| 483 | 484 | baddr = hSession->cursor_addr; |
| 484 | 485 | |
| 485 | 486 | addr = lib3270_field_addr(hSession,baddr); |
| 486 | - | |
| 487 | 487 | if(addr < 0) |
| 488 | - return -1; | |
| 488 | + return addr; | |
| 489 | 489 | |
| 490 | 490 | saddr = addr; |
| 491 | 491 | INC_BA(addr); |
| ... | ... | @@ -497,26 +497,24 @@ LIB3270_EXPORT int lib3270_get_field_len(H3270 *hSession, int baddr) |
| 497 | 497 | width++; |
| 498 | 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 | 503 | LIB3270_EXPORT int lib3270_field_addr(H3270 *hSession, int baddr) |
| 513 | 504 | { |
| 514 | 505 | int sbaddr; |
| 515 | 506 | |
| 516 | - FAIL_IF_NOT_ONLINE(hSession); | |
| 507 | + if(!lib3270_is_connected(hSession)) | |
| 508 | + return -(errno = ENOTCONN); | |
| 517 | 509 | |
| 518 | 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 | 519 | sbaddr = baddr; |
| 522 | 520 | do |
| ... | ... | @@ -526,8 +524,7 @@ LIB3270_EXPORT int lib3270_field_addr(H3270 *hSession, int baddr) |
| 526 | 524 | DEC_BA(baddr); |
| 527 | 525 | } while (baddr != sbaddr); |
| 528 | 526 | |
| 529 | - errno = EINVAL; | |
| 530 | - return -1; | |
| 527 | + return -(errno = ENODATA); | |
| 531 | 528 | } |
| 532 | 529 | |
| 533 | 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 | 562 | * @param hSession Session handle. |
| 566 | 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 | 568 | int lib3270_field_length(H3270 *hSession, int baddr) |
| ... | ... | @@ -575,9 +572,8 @@ int lib3270_field_length(H3270 *hSession, int baddr) |
| 575 | 572 | int width = 0; |
| 576 | 573 | |
| 577 | 574 | addr = lib3270_field_addr(hSession,baddr); |
| 578 | - | |
| 579 | 575 | if(addr < 0) |
| 580 | - return -1; | |
| 576 | + return addr; | |
| 581 | 577 | |
| 582 | 578 | saddr = addr; |
| 583 | 579 | INC_BA(addr); |
| ... | ... | @@ -589,17 +585,22 @@ int lib3270_field_length(H3270 *hSession, int baddr) |
| 589 | 585 | width++; |
| 590 | 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 | 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 | 609 | * @param hSession Session handle. |
| 609 | 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 | 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 | 619 | FAIL_IF_NOT_ONLINE(hSession); |
| 619 | 620 | |
| 620 | 621 | if(!hSession->formatted) |
| 621 | - return errno = ENOTCONN; | |
| 622 | + return -(errno = ENOTSUP); | |
| 622 | 623 | |
| 623 | 624 | if(baddr0 < 0) |
| 624 | 625 | baddr0 = hSession->cursor_addr; | ... | ... |
src/include/lib3270.h
| ... | ... | @@ -1094,11 +1094,14 @@ |
| 1094 | 1094 | * @brief Get all text inside the terminal. |
| 1095 | 1095 | * |
| 1096 | 1096 | * @param h Session Handle. |
| 1097 | - * @param offset Start position. | |
| 1097 | + * @param offset Start position (-1 to current cursor position). | |
| 1098 | 1098 | * @param len Text length or -1 to all text. |
| 1099 | 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 | 1107 | LIB3270_EXPORT char * lib3270_get_string_at_address(H3270 *h, int offset, int len, char lf); |
| ... | ... | @@ -1109,13 +1112,16 @@ |
| 1109 | 1112 | * @param h Session Handle. |
| 1110 | 1113 | * @param row Desired row. |
| 1111 | 1114 | * @param col Desired col. |
| 1112 | - * @param length Text length | |
| 1115 | + * @param len Text length or -1 to all text. | |
| 1113 | 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 | 1127 | * @brief Check for text at requested position |
| ... | ... | @@ -1129,7 +1135,7 @@ |
| 1129 | 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 | 1144 | * @param h Session Handle. |
| 1139 | 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 | 1153 | LIB3270_EXPORT char * lib3270_get_field_text_at(H3270 *h, int baddr); |
| ... | ... | @@ -1206,7 +1215,12 @@ |
| 1206 | 1215 | * @param hSession Session handle. |
| 1207 | 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 | 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 | 288 | return NULL; |
| 289 | 289 | } |
| 290 | 290 | |
| 291 | + if(offset < 0) | |
| 292 | + offset = lib3270_get_cursor_address(h); | |
| 293 | + | |
| 291 | 294 | maxlen = (h->rows * (h->cols+ (lf ? 1 : 0) )) - offset; |
| 292 | 295 | if(maxlen <= 0 || offset < 0) |
| 293 | 296 | { |
| 294 | - errno = EINVAL; | |
| 297 | + errno = EOVERFLOW; | |
| 295 | 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 | 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 | 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 | 350 | int rc; |
| 343 | 351 | size_t sz = strlen(text); |
| 344 | 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 | 359 | if(!contents) |
| 348 | 360 | return -1; |
| 349 | 361 | ... | ... |