|
487 | 487 | return TRUE;
|
488 | 488 | }
|
489 | 489 |
|
| 490 | +/*********************************************************************** |
| 491 | +** |
| 492 | +*/ static REBOOL Query_Date_Field(REBVAL *data, REBVAL *select, REBVAL *ret) |
| 493 | +/* |
| 494 | +** Set a value with date data according specified mode |
| 495 | +** |
| 496 | +***********************************************************************/ |
| 497 | +{ |
| 498 | + REBPVS pvs; |
| 499 | + pvs.value = data; |
| 500 | + pvs.select = select; |
| 501 | + pvs.setval = 0; |
| 502 | + pvs.store = ret; |
| 503 | + |
| 504 | + return (PE_USE == PD_Date(&pvs)); |
| 505 | +} |
490 | 506 |
|
491 | 507 | /***********************************************************************
|
492 | 508 | **
|
|
509 | 525 |
|
510 | 526 | // !zone! - adjust date by zone (unless /utc given)
|
511 | 527 |
|
512 |
| - if (IS_WORD(arg)) { |
| 528 | + if (IS_WORD(arg) || IS_SET_WORD(arg)) { |
513 | 529 | //!!! change this to an array!?
|
514 | 530 | switch (VAL_WORD_CANON(arg)) {
|
515 | 531 | case SYM_YEAR: i = 0; break;
|
|
718 | 734 | REBVAL *val;
|
719 | 735 | REBVAL *arg = NULL;
|
720 | 736 | REBINT num;
|
| 737 | + REBVAL *spec; |
721 | 738 |
|
722 | 739 | val = D_ARG(1);
|
723 | 740 | if (IS_DATE(val)) {
|
|
829 | 846 |
|
830 | 847 | case A_ABSOLUTE:
|
831 | 848 | goto setDate;
|
| 849 | + |
| 850 | + case A_REFLECT: |
| 851 | + if (SYM_SPEC == VAL_WORD_SYM(D_ARG(2))) { |
| 852 | + return R_ARG1; |
| 853 | + } |
| 854 | + if(!Query_Date_Field(val, D_ARG(2), D_RET)) { |
| 855 | + Trap_Reflect(VAL_TYPE(val), D_ARG(2)); |
| 856 | + } |
| 857 | + return R_RET; |
| 858 | + case A_QUERY: |
| 859 | + spec = Get_System(SYS_STANDARD, STD_DATE_INFO); |
| 860 | + if (!IS_OBJECT(spec)) Trap_Arg(spec); |
| 861 | + if (D_REF(2)) { // query/mode refinement |
| 862 | + REBVAL *field = D_ARG(3); |
| 863 | + if(IS_WORD(field)) { |
| 864 | + if (SYM_SPEC == VAL_WORD_CANON(field)) { |
| 865 | + return R_ARG1; |
| 866 | + } |
| 867 | + if (!Query_Date_Field(val, field, D_RET)) |
| 868 | + Trap_Reflect(VAL_TYPE(val), field); // better error? |
| 869 | + } |
| 870 | + else if (IS_BLOCK(field)) { |
| 871 | + REBVAL *out = D_RET; |
| 872 | + REBSER *values = Make_Block(2 * BLK_LEN(VAL_SERIES(field))); |
| 873 | + REBVAL *word = VAL_BLK_DATA(field); |
| 874 | + for (; NOT_END(word); word++) { |
| 875 | + if (ANY_WORD(word)) { |
| 876 | + if (IS_SET_WORD(word)) { |
| 877 | + // keep the set-word in result |
| 878 | + out = Append_Value(values); |
| 879 | + *out = *word; |
| 880 | + VAL_SET_LINE(out); |
| 881 | + } |
| 882 | + out = Append_Value(values); |
| 883 | + if (!Query_Date_Field(val, word, out)) |
| 884 | + Trap1(RE_INVALID_ARG, word); |
| 885 | + } |
| 886 | + else Trap1(RE_INVALID_ARG, word); |
| 887 | + } |
| 888 | + Set_Series(REB_BLOCK, D_RET, values); |
| 889 | + } |
| 890 | + else { |
| 891 | + Set_Block(D_RET, Get_Object_Words(spec)); |
| 892 | + } |
| 893 | + } else { |
| 894 | + REBSER *obj = CLONE_OBJECT(VAL_OBJ_FRAME(spec)); |
| 895 | + REBSER *words = VAL_OBJ_WORDS(spec); |
| 896 | + REBVAL *word = BLK_HEAD(words); |
| 897 | + for (num=0; NOT_END(word); word++,num++) { |
| 898 | + Query_Date_Field(val, word, OFV(obj, num)); |
| 899 | + } |
| 900 | + SET_OBJECT(D_RET, obj); |
| 901 | + } |
| 902 | + return R_RET; |
832 | 903 | }
|
833 | 904 | }
|
834 | 905 | Trap_Action(REB_DATE, action);
|
|
0 commit comments