Commit 87b76c6f6d7780dfdc1c9ed4d2ef0b600e99f90e

Authored by Perry Werneck
1 parent 9e14881b

Standardizing error codes; documenting then.

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