MCPcopy Create free account
hub / github.com/FirebirdSQL/firebird / make_port

Function make_port

src/gpre/cmp.cpp:1707–1789  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1705//
1706
1707static 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;

Callers 3

CMP_compile_requestFunction · 0.70
cmp_blobFunction · 0.70
cmp_procedureFunction · 0.70

Calls 3

MSC_allocFunction · 0.85
CMP_next_identFunction · 0.85
CPR_bugcheckFunction · 0.85

Tested by

no test coverage detected