| 866 | // |
| 867 | |
| 868 | ref* SQE_post_reference(gpre_req* request, gpre_fld* field, gpre_ctx* context, gpre_nod* node) |
| 869 | { |
| 870 | ref* reference; |
| 871 | |
| 872 | assert_IS_REQ(request); |
| 873 | assert_IS_NOD(node); |
| 874 | |
| 875 | // If the beast is already a field reference, get component parts |
| 876 | |
| 877 | if (node && node->nod_type == nod_field) |
| 878 | { |
| 879 | reference = (ref*) node->nod_arg[0]; |
| 880 | field = reference->ref_field; |
| 881 | context = reference->ref_context; |
| 882 | } |
| 883 | |
| 884 | // See if there is already a reference to this guy. If so, return it. |
| 885 | |
| 886 | for (reference = request->req_references; reference; reference = reference->ref_next) |
| 887 | { |
| 888 | if ((reference->ref_expr && compare_expr(node, reference->ref_expr)) || |
| 889 | (!reference->ref_expr && field == reference->ref_field && |
| 890 | context == reference->ref_context)) |
| 891 | { |
| 892 | return reference; |
| 893 | } |
| 894 | } |
| 895 | |
| 896 | // If there isn't a field given, make one up |
| 897 | |
| 898 | if (!field) |
| 899 | { |
| 900 | field = (gpre_fld*) MSC_alloc(FLD_LEN); |
| 901 | CME_get_dtype(node, field); |
| 902 | if (field->fld_dtype && (field->fld_dtype <= dtype_any_text)) |
| 903 | field->fld_flags |= FLD_text; |
| 904 | } |
| 905 | |
| 906 | // No reference -- make one |
| 907 | |
| 908 | reference = (ref*) MSC_alloc(REF_LEN); |
| 909 | reference->ref_context = context; |
| 910 | reference->ref_field = field; |
| 911 | reference->ref_expr = node; |
| 912 | |
| 913 | reference->ref_next = request->req_references; |
| 914 | request->req_references = reference; |
| 915 | |
| 916 | return reference; |
| 917 | } |
| 918 | |
| 919 | |
| 920 | //____________________________________________________________ |
no test coverage detected