예제 #1
0
void SplitIntoVects(const vector <LonLatAnom> &TheMembers,
                    vector <double> &Lons, vector <double> &Lats, vector <double> &Anoms)
{
        Lons.resize(TheMembers.size());
        Lats.resize(TheMembers.size());
        Anoms.resize(TheMembers.size());

        vector<double>::iterator ALon( Lons.begin() ), ALat( Lats.begin() ), AnAnom( Anoms.begin() );

        for (vector<LonLatAnom>::const_iterator AMember( TheMembers.begin() ); AMember != TheMembers.end();
             AMember++, ALon++, ALat++, AnAnom++)
        {
                *ALon = AMember->Lon;
                *ALat = AMember->Lat;
                *AnAnom = AMember->StdAnom;
        }
}
예제 #2
0
void SplitIntoVects(const vector <LonLatAnomDate> &TheMembers,
                    vector <double> &Lons, vector <double> &Lats, vector <double> &Anoms, vector <time_t> &DateTimes)
{
        Lons.resize(TheMembers.size());
        Lats.resize(TheMembers.size());
        Anoms.resize(TheMembers.size());
        DateTimes.resize(TheMembers.size());

        vector<double>::iterator ALon( Lons.begin() ), ALat( Lats.begin() ), AnAnom( Anoms.begin() );
        vector<time_t>::iterator ADate( DateTimes.begin() );

        for (vector<LonLatAnomDate>::const_iterator AMember( TheMembers.begin() ); AMember != TheMembers.end();
             AMember++, ALon++, ALat++, AnAnom++, ADate++)
        {
                *ALon = AMember->Lon;
                *ALat = AMember->Lat;
                *AnAnom = AMember->StdAnom;
                *ADate = AMember->DateInfo;
        }
}
예제 #3
0
vector <LonLatCount> GetMemberCounts(const vector <LonLatAnom> &TheMembers)
{
        vector <LonLatCount> MemberCounts(0);

        for (vector<LonLatAnom>::const_iterator AMember( TheMembers.begin() ); AMember != TheMembers.end(); AMember++)
        {
                if (binary_search(MemberCounts.begin(), MemberCounts.end(), *AMember))
                {
                        (lower_bound(MemberCounts.begin(), MemberCounts.end(), *AMember))->Count++;
                }
                else
                {
                        LonLatCount TempCount;
                        TempCount.Lon = AMember->Lon;
                        TempCount.Lat = AMember->Lat;
                        TempCount.Count = 1;
                        MemberCounts.insert(lower_bound(MemberCounts.begin(), MemberCounts.end(), *AMember), TempCount);
		}
	}

	return(MemberCounts);
}
예제 #4
0
파일: testc_module.c 프로젝트: JukkaL/alore
/* __testc::AMember(obj, name) */
static AValue TestC_AMember(AThread *t, AValue *frame)
{
    char member[100];
    AGetStr(t, frame[1], member, 100);
    return AMember(t, frame[0], member);
}
예제 #5
0
/* Str format(...)
   Format a string based on a format string which may contain formatting
   sequences of form {...}; these correspond to the arguments of the method.
   The base string object represents the format string. */
AValue AFormat(AThread *t, AValue *frame)
{
    int fi;      /* Format string index */
    int ai;      /* Argument index */
    int fmtLen;  /* Format string length */
    FormatOutput output;

    AExpectStr(t, frame[0]);

    output.t = t;
    output.index = 0;
    output.len = FORMAT_BUF_SIZE;
    output.str = &frame[2];

    fmtLen = AStrLen(frame[0]);
    ai = 0;

    /* IDEA: Refactor this into multiple functions. */

    /* Iterate over the format string. Handle { sequences and copy other
       characters directly to the output buffer (} may be duplicated). */
    for (fi = 0; fi < fmtLen; fi++) {
        int ch = AStrItem(frame[0], fi);
        if (ch == '{') {
            if (fi == fmtLen - 1 || AStrItem(frame[0], fi + 1) == '{') {
                /* Literal '{'. */
                fi++;
                Append(&output, ch);
            } else {
                /* A format sequence {...}. */
                int negAlign = FALSE;
                int align = 0;
                int oldInd;
                int oldOutInd;
                AValue arg;

                fi++;
                oldInd = fi;

                /* Parse alignment */
                if (fi < fmtLen && AStrItem(frame[0], fi) == '-'
                    && AIsDigit(AStrItem(frame[0], fi + 1))) {
                    negAlign = TRUE;
                    fi++;
                }
                if (fi < fmtLen && AIsDigit(AStrItem(frame[0], fi))) {
                    do {
                        align = align * 10 + AStrItem(frame[0], fi) - '0';
                        fi++;
                    } while (fi < fmtLen && AIsDigit(AStrItem(frame[0], fi)));
                    if (AStrItem(frame[0], fi) != ':') {
                        fi = oldInd;
                        align = 0;
                    } else
                        fi++;
                }

                oldOutInd = output.index & ~WIDE_BUF_FLAG;

                if (ai >= AArrayLen(frame[1]))
                    ARaiseValueError(t, "Too few arguments");

                arg = AArrayItem(frame[1], ai);
                if (AIsInstance(arg)
                    && AStrItem(frame[0], fi) != '}'
                    && AMember(t, arg, "_format") != AError) {
                    int i;
                    oldInd = fi;
                    while (fi <= fmtLen && AStrItem(frame[0], fi) != '}')
                        fi++;
                    if (fi >= fmtLen)
                        ARaiseValueError(t, "Unterminated format");
                    frame[3] = AArrayItem(frame[1], ai);
                    frame[4] = ASubStr(t, frame[0], oldInd, fi);
                    frame[3] = ACallMethod(t, "_format", 1, frame + 3);
                    if (AIsError(frame[3]))
                        return AError;
                    AExpectStr(t, frame[3]);
                    for (i = 0; i < AStrLen(frame[3]); i++)
                        Append(&output, AStrItem(frame[3], i));
                } else {
                    /* Either format an Int/Float or use the default conversion
                       by calling std::Str. */
                    int minNumLen = 0;
                    int fractionLen = 0;
                    int optFractionLen = 0;
                    int expLen = 0;
                    int fraction = FALSE;
                    int scientific = FALSE;
                    int plusExp = FALSE;
                    int expChar = ' ';

                    while (fi < fmtLen &&
                           (ch = AStrItem(frame[0], fi)) != '}') {
                        if (ch == '0') {
                            if (scientific)
                                expLen++;
                            else if (fraction)
                                fractionLen++;
                            else
                                minNumLen++;
                        } else if (ch == '.')
                            fraction = TRUE;
                        else if (ch == 'e' || ch == 'E') {
                            scientific = TRUE;
                            expChar = ch;
                        } else if (ch == '+' && scientific)
                            plusExp = TRUE;
                        else if (ch == '#' && fraction && !scientific) {
                            fractionLen++;
                            optFractionLen++;
                        } else
                            ARaiseValueError(t, "Invalid character in format");
                        fi++;
                    }

                    if (scientific)
                        NumberToScientific(&output, arg, fractionLen, expLen,
                                           expChar, plusExp, optFractionLen);
                    else if (minNumLen > 0 || fraction)
                        NumberToStr(&output, arg, minNumLen, fractionLen,
                                    optFractionLen);
                    else {
                        /* Not a number formatting sequence. Use std::Str to
                           convert the argument. */
                        int i;

                        frame[3] = arg;
                        frame[3] = AStdStr(t, &frame[3]);
                        if (AIsError(frame[3]))
                            return AError;

                        for (i = 0; i < AStrLen(frame[3]); i++)
                            Append(&output, AStrItem(frame[3], i));
                    }
                }

                if (fi >= fmtLen)
                    ARaiseValueError(t, "Unterminated format");

                align -= (output.index & ~WIDE_BUF_FLAG) - oldOutInd;
                if (align > 0) {
                    int i;

                    for (i = 0; i < align; i++)
                        Append(&output, ' ');

                    if (!negAlign) {
                        if (output.index < FORMAT_BUF_SIZE) {
                            AMoveMem(output.buf + oldOutInd + align,
                                    output.buf + oldOutInd,
                                    output.index - oldOutInd - align);
                            for (i = 0; i < align; i++)
                                output.buf[oldOutInd + i] = ' ';
                        } else {
                            for (i = (output.index & ~WIDE_BUF_FLAG) - 1;
                                 i >= oldOutInd + align; i--)
                                ASetStrItem(frame[2], i,
                                            AStrItem(frame[2], i - align));
                            for (i = 0; i < align; i++)
                                ASetStrItem(frame[2], oldOutInd + i, ' ');
                        }
                    }
                }
                ai++;
            }
        } else if (ch == '}') {
            /* Literal '}' can be duplicated (but does not need to be). */
            if (fi < fmtLen - 1 && AStrItem(frame[0], fi + 1) == '}')
                fi++;
            Append(&output, ch);
        } else
            Append(&output, ch);
    }

    if (ai < AArrayLen(frame[1]))
        ARaiseValueError(t, "Too many arguments");

    if (output.index <= FORMAT_BUF_SIZE) {
        /* The output contains only narrow characters (since the index does not
           have the WIDE_BUF_FLAG flag) and is short enough to not require a
           heap-allocated buffer. Create a string based on the internal
           buffer. */
        AValue res = AMakeEmptyStr(t, output.index);
        ACopyMem(AGetStrElem(res), output.buf, output.index);
        return res;
    } else {
        /* The output is stored in a heap-allocated buffer (represented as a
           Str object). Return the initialized part of the buffer. */
        return ASubStr(t, frame[2], 0, output.index & ~WIDE_BUF_FLAG);
    }
}