| 1705 | // |
| 1706 | |
| 1707 | static gpre_port* make_port( gpre_req* request, ref* reference) |
| 1708 | { |
| 1709 | gpre_port* port = (gpre_port*) MSC_alloc(POR_LEN); |
| 1710 | port->por_ident = CMP_next_ident(); |
| 1711 | port->por_msg_number = request->req_count++; |
| 1712 | port->por_next = request->req_ports; |
| 1713 | request->req_ports = port; |
| 1714 | |
| 1715 | // Hmmm -- no references. Not going to fly. |
| 1716 | // Make up a dummy reference. |
| 1717 | |
| 1718 | if (!reference) |
| 1719 | { |
| 1720 | reference = (ref*) MSC_alloc(REF_LEN); |
| 1721 | reference->ref_field = eof_field; |
| 1722 | } |
| 1723 | |
| 1724 | ref* misc = 0; |
| 1725 | ref* alignments[3]; |
| 1726 | alignments[0] = alignments[1] = alignments[2] = NULL; |
| 1727 | |
| 1728 | for (ref* temp = reference; temp; temp = reference) |
| 1729 | { |
| 1730 | reference = reference->ref_next; |
| 1731 | gpre_fld* field = temp->ref_field; |
| 1732 | if (!field) |
| 1733 | CPR_bugcheck("missing prototype field for value"); |
| 1734 | if (temp->ref_value && (temp->ref_flags & REF_array_elem)) |
| 1735 | field = field->fld_array; |
| 1736 | FLD_LENGTH len = field->fld_length; |
| 1737 | if (field->fld_dtype == dtype_varying) |
| 1738 | len += sizeof(USHORT); |
| 1739 | if ((len & 7) == 0) |
| 1740 | { |
| 1741 | temp->ref_next = alignments[2]; |
| 1742 | alignments[2] = temp; |
| 1743 | } |
| 1744 | else if ((len & 3) == 0) |
| 1745 | { |
| 1746 | temp->ref_next = alignments[1]; |
| 1747 | alignments[1] = temp; |
| 1748 | } |
| 1749 | else if ((len & 1) == 0) |
| 1750 | { |
| 1751 | temp->ref_next = alignments[0]; |
| 1752 | alignments[0] = temp; |
| 1753 | } |
| 1754 | else |
| 1755 | { |
| 1756 | temp->ref_next = misc; |
| 1757 | misc = temp; |
| 1758 | } |
| 1759 | } |
| 1760 | |
| 1761 | for (int i = 0; i <= 2; i++) |
| 1762 | while (reference = alignments[i]) |
| 1763 | { |
| 1764 | alignments[i] = reference->ref_next; |
no test coverage detected