PROGRAM Mohsen01(Input, Output);

    {---------------------------------------------------------------------------
    Example ch01-01 of the book: A Collection of Pascal Programs

    Raise integer to a positive power. Repeat reading pairs of integers,
    until you encounter a 0. Indicate invariant loop.

    programmer: Mohsen Safari
    ---------------------------------------------------------------------------}

    VAR
        Base, Power, Result: Integer;
        Stop: Boolean;

    FUNCTION Raise(Base, Power: Integer): Integer;
        VAR
            Temp: Integer;
    BEGIN
        Temp := 1;

        IF (Base <= 0) OR (Power < 0) THEN
            Raise := -1         { error }
        ELSE IF Power = 0 THEN
            Raise := 1
        ELSE BEGIN
            WHILE Power > 1 DO
                IF Odd(Power) THEN BEGIN
                    Power := Power - 1;
                    Temp := Temp * Base
                END ELSE BEGIN
                    Power := Round(Power / 2);
                    Base := Base * Base
                END;
            Raise := Temp * Base
        END
    END;

BEGIN
    Stop := False;
    WHILE NOT Stop DO BEGIN
        Write('Enter Base and Power with space between them: ');
        Read(Input, Base, Power);

        Result := Raise(Base, Power);
        IF Result = -1 THEN BEGIN
            WriteLn(Base:1, '^', Power:1, ' NOT IMPLEMENTED IN CODE');
            Stop := True
        END ELSE
            WriteLn(Base:1, '^', Power:1, '=', Result:1)
    END
END.
