From ce5aac737dad622e45ba73c1a4fa3d569949c2c0 Mon Sep 17 00:00:00 2001 From: ratkosrb Date: Fri, 21 Jun 2024 12:39:12 +0300 Subject: [PATCH 01/34] Fix some false positives with mind control. --- .../MovementAnticheat/MovementAnticheat.cpp | 10 +- src/game/CMakeLists.txt | 1 + src/game/Chat/Chat.cpp | 1 + src/game/Chat/Chat.h | 1 + src/game/Commands/UnitCommands.cpp | 44 +++ src/game/Handlers/MovementHandler.cpp | 1 + src/game/Objects/MovementInfo.h | 265 ++++++++++++++++++ src/game/Objects/Object.h | 236 +--------------- src/game/Objects/Player.cpp | 2 +- src/game/SharedDefines.h | 10 + src/game/Transports/Transport.cpp | 5 +- 11 files changed, 331 insertions(+), 245 deletions(-) create mode 100644 src/game/Objects/MovementInfo.h diff --git a/src/game/Anticheat/MovementAnticheat/MovementAnticheat.cpp b/src/game/Anticheat/MovementAnticheat/MovementAnticheat.cpp index 11cae071f3c..b4f1ff40760 100644 --- a/src/game/Anticheat/MovementAnticheat/MovementAnticheat.cpp +++ b/src/game/Anticheat/MovementAnticheat/MovementAnticheat.cpp @@ -874,7 +874,7 @@ bool MovementAnticheat::CheckNoFallTime(MovementInfo const& movementInfo, uint16 return false; } - if (!GetLastMovementInfo().ctime || + if (!GetLastMovementInfo().WasSentBySession(m_session->GetGUID()) || !GetLastMovementInfo().HasMovementFlag(MOVEFLAG_JUMPING | MOVEFLAG_FALLINGFAR)) { m_jumpFlagCount = 0; @@ -916,7 +916,7 @@ bool MovementAnticheat::CheckFallReset(MovementInfo const& movementInfo) const if (movementInfo.HasMovementFlag(MOVEFLAG_FIXED_Z)) return false; - if (GetLastMovementInfo().ctime) + if (GetLastMovementInfo().WasSentBySession(m_session->GetGUID())) { if (!GetLastMovementInfo().HasMovementFlag(MOVEFLAG_JUMPING | MOVEFLAG_FALLINGFAR)) return true; @@ -930,7 +930,7 @@ bool MovementAnticheat::CheckFallStop(MovementInfo const& movementInfo, uint16 o if (!sWorld.getConfig(CONFIG_BOOL_AC_MOVEMENT_CHEAT_BAD_FALL_STOP_ENABLED)) return false; - if (!GetLastMovementInfo().ctime) + if (!GetLastMovementInfo().WasSentBySession(m_session->GetGUID())) return false; if (IsFallEndOpcode(opcode)) @@ -957,7 +957,7 @@ bool MovementAnticheat::CheckMoveStart(MovementInfo const& movementInfo, uint16 if (!sWorld.getConfig(CONFIG_BOOL_AC_MOVEMENT_CHEAT_BAD_MOVE_START_ENABLED)) return false; - if (!GetLastMovementInfo().ctime) + if (!GetLastMovementInfo().WasSentBySession(m_session->GetGUID())) return false; if (IsFallEndOpcode(opcode)) @@ -1082,7 +1082,7 @@ uint32 MovementAnticheat::CheckTimeDesync(MovementInfo const& movementInfo) uint32 cheatFlags = 0x0; #define APPEND_CHEAT(t) cheatFlags |= (1 << t) - if (GetLastMovementInfo().ctime) + if (GetLastMovementInfo().WasSentBySession(m_session->GetGUID())) { if (GetLastMovementInfo().moveFlags & MOVEFLAG_MASK_MOVING) { diff --git a/src/game/CMakeLists.txt b/src/game/CMakeLists.txt index 3b14bea93f7..e5e251363d1 100644 --- a/src/game/CMakeLists.txt +++ b/src/game/CMakeLists.txt @@ -370,6 +370,7 @@ set (game_SRCS Objects/GameObjectDefines.h Objects/Item.h Objects/ItemPrototype.h + Objects/MovementInfo.h Objects/Object.h Objects/ObjectDefines.h Objects/Pet.h diff --git a/src/game/Chat/Chat.cpp b/src/game/Chat/Chat.cpp index 21497e1e633..590736cf340 100644 --- a/src/game/Chat/Chat.cpp +++ b/src/game/Chat/Chat.cpp @@ -729,6 +729,7 @@ ChatCommand * ChatHandler::getCommandTable() { { "aiinfo", SEC_MODERATOR, false, &ChatHandler::HandleUnitAIInfoCommand, "", nullptr }, { "info", SEC_MODERATOR, false, &ChatHandler::HandleUnitInfoCommand, "", nullptr }, + { "moveinfo", SEC_MODERATOR, false, &ChatHandler::HandleUnitMoveInfoCommand, "", nullptr }, { "speedinfo", SEC_MODERATOR, false, &ChatHandler::HandleUnitSpeedInfoCommand, "", nullptr }, { "statinfo", SEC_MODERATOR, false, &ChatHandler::HandleUnitStatInfoCommand, "", nullptr }, { "ufinfo", SEC_DEVELOPER, false, &ChatHandler::HandleUnitUpdateFieldsInfoCommand,"", nullptr }, diff --git a/src/game/Chat/Chat.h b/src/game/Chat/Chat.h index b535265f167..dac4939513f 100644 --- a/src/game/Chat/Chat.h +++ b/src/game/Chat/Chat.h @@ -739,6 +739,7 @@ class ChatHandler bool HandleUnitAIInfoCommand(char* args); bool HandleUnitInfoCommand(char* args); + bool HandleUnitMoveInfoCommand(char* args); bool HandleUnitSpeedInfoCommand(char* args); bool HandleUnitStatInfoCommand(char* args); bool HandleUnitUpdateFieldsInfoCommand(char* args); diff --git a/src/game/Commands/UnitCommands.cpp b/src/game/Commands/UnitCommands.cpp index eb87ec767d9..3cd6cd74f82 100644 --- a/src/game/Commands/UnitCommands.cpp +++ b/src/game/Commands/UnitCommands.cpp @@ -318,6 +318,50 @@ bool ChatHandler::HandleUnitInfoCommand(char* args) return true; } +bool ChatHandler::HandleUnitMoveInfoCommand(char* args) +{ + Unit* pTarget = GetSelectedUnit(); + + if (!pTarget) + { + SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); + SetSentErrorMessage(true); + return false; + } + + PSendSysMessage("Move info for %s", pTarget->GetObjectGuid().GetString().c_str()); + PSendSysMessage("Server Time: %u", pTarget->m_movementInfo.stime); + PSendSysMessage("Client Time: %u", pTarget->m_movementInfo.ctime); + PSendSysMessage("Move Flags: %u (%s)", pTarget->m_movementInfo.moveFlags, FlagsToString(pTarget->m_movementInfo.moveFlags, MoveFlagToString).c_str()); + PSendSysMessage("Position: %g %g %g %g", pTarget->m_movementInfo.pos.x, pTarget->m_movementInfo.pos.y, pTarget->m_movementInfo.pos.z, pTarget->m_movementInfo.pos.o); + if (!pTarget->m_movementInfo.t_guid.IsEmpty() || !pTarget->m_movementInfo.t_pos.IsEmpty()) + { + PSendSysMessage("Transport Guid: %s", pTarget->m_movementInfo.t_guid.GetString().c_str()); + PSendSysMessage("Transport Position: %g %g %g %g", pTarget->m_movementInfo.t_pos.x, pTarget->m_movementInfo.t_pos.y, pTarget->m_movementInfo.t_pos.z, pTarget->m_movementInfo.t_pos.o); + } + if (pTarget->m_movementInfo.s_pitch) + PSendSysMessage("Swim Pitch: %g", pTarget->m_movementInfo.s_pitch); + if (pTarget->m_movementInfo.fallTime) + PSendSysMessage("Fall Time: %u", pTarget->m_movementInfo.fallTime); + if (pTarget->m_movementInfo.HasMovementFlag(MOVEFLAG_JUMPING)) + { + PSendSysMessage("Jump Z Speed: %g", pTarget->m_movementInfo.jump.zspeed); + PSendSysMessage("Jump Cos Angle: %g", pTarget->m_movementInfo.jump.cosAngle); + PSendSysMessage("Jump Sin Angle: %g", pTarget->m_movementInfo.jump.sinAngle); + PSendSysMessage("Jump XY Speed: %g", pTarget->m_movementInfo.jump.xyspeed); + PSendSysMessage("Jump Start Time: %g", pTarget->m_movementInfo.jump.startClientTime); + + } + if (pTarget->m_movementInfo.splineElevation) + PSendSysMessage("Spline Elevation: %g", pTarget->m_movementInfo.splineElevation); + if (pTarget->m_movementInfo.sourceSessionGuid) + PSendSysMessage("Source: Session %u", pTarget->m_movementInfo.sourceSessionGuid); + else + SendSysMessage("Source: Server"); + + return true; +} + bool ChatHandler::HandleUnitSpeedInfoCommand(char* args) { Unit* pTarget = GetSelectedUnit(); diff --git a/src/game/Handlers/MovementHandler.cpp b/src/game/Handlers/MovementHandler.cpp index 12b403c6116..f5a4ac5efa4 100644 --- a/src/game/Handlers/MovementHandler.cpp +++ b/src/game/Handlers/MovementHandler.cpp @@ -1097,6 +1097,7 @@ void WorldSession::HandleMoverRelocation(Unit* pMover, MovementInfo& movementInf { Player* const pPlayerMover = pMover->ToPlayer(); + movementInfo.sourceSessionGuid = GetGUID(); movementInfo.CorrectData(pMover); // Prevent client from removing root flag. diff --git a/src/game/Objects/MovementInfo.h b/src/game/Objects/MovementInfo.h new file mode 100644 index 00000000000..90b15bd9c1c --- /dev/null +++ b/src/game/Objects/MovementInfo.h @@ -0,0 +1,265 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __MOVEMENT_INFO_H +#define __MOVEMENT_INFO_H + +#include "Common.h" +#include "ByteBuffer.h" +#include "ObjectGuid.h" +#include "Timer.h" + +class Unit; + +// [-ZERO] Need check and update +// used in most movement packets (send and received) +enum MovementFlags +{ + MOVEFLAG_NONE = 0x00000000, // 0 + MOVEFLAG_FORWARD = 0x00000001, // 1 + MOVEFLAG_BACKWARD = 0x00000002, // 2 + MOVEFLAG_STRAFE_LEFT = 0x00000004, // 3 + MOVEFLAG_STRAFE_RIGHT = 0x00000008, // 4 + MOVEFLAG_TURN_LEFT = 0x00000010, // 5 + MOVEFLAG_TURN_RIGHT = 0x00000020, // 6 + MOVEFLAG_PITCH_UP = 0x00000040, // 7 + MOVEFLAG_PITCH_DOWN = 0x00000080, // 8 + MOVEFLAG_WALK_MODE = 0x00000100, // 9 Walking + MOVEFLAG_UNUSED10 = 0x00000200, // 10 ?? + MOVEFLAG_LEVITATING = 0x00000400, // 11 ?? Seems not to work + MOVEFLAG_FIXED_Z = 0x00000800, // 12 Fixed height. Jump => Glide across the entire map + MOVEFLAG_ROOT = 0x00001000, // 13 + MOVEFLAG_JUMPING = 0x00002000, // 14 + MOVEFLAG_FALLINGFAR = 0x00004000, // 15 + MOVEFLAG_PENDING_STOP = 0x00008000, // 16 Only used in older client versions + MOVEFLAG_PENDING_UNSTRAFE = 0x00010000, // 17 Only used in older client versions + MOVEFLAG_PENDING_FORWARD = 0x00020000, // 18 Only used in older client versions + MOVEFLAG_PENDING_BACKWARD = 0x00040000, // 19 Only used in older client versions + MOVEFLAG_PENDING_STR_LEFT = 0x00080000, // 20 Only used in older client versions + MOVEFLAG_PENDING_STR_RGHT = 0x00100000, // 21 Only used in older client versions + MOVEFLAG_SWIMMING = 0x00200000, // 22 Ok + MOVEFLAG_SPLINE_ENABLED = 0x00400000, // 23 Ok + MOVEFLAG_MOVED = 0x00800000, // 24 Only used in older client versions + MOVEFLAG_FLYING = 0x01000000, // 25 [-ZERO] is it really need and correct value + MOVEFLAG_ONTRANSPORT = 0x02000000, // 26 Used for flying on some creatures + MOVEFLAG_SPLINE_ELEVATION = 0x04000000, // 27 Used for flight paths + MOVEFLAG_UNUSED28 = 0x08000000, // 28 + MOVEFLAG_WATERWALKING = 0x10000000, // 29 Prevent unit from falling through water + MOVEFLAG_SAFE_FALL = 0x20000000, // 30 Active rogue safe fall spell (passive) + MOVEFLAG_HOVER = 0x40000000, // 31 + MOVEFLAG_UNUSED32 = 0x80000000, // 32 + + // Can not be present with MOVEFLAG_ROOT (otherwise client freeze) + MOVEFLAG_MASK_MOVING = + MOVEFLAG_FORWARD | MOVEFLAG_BACKWARD | MOVEFLAG_STRAFE_LEFT | MOVEFLAG_STRAFE_RIGHT | + MOVEFLAG_PITCH_UP | MOVEFLAG_PITCH_DOWN | MOVEFLAG_JUMPING | MOVEFLAG_FALLINGFAR | + MOVEFLAG_SPLINE_ELEVATION, + MOVEFLAG_MASK_MOVING_OR_TURN= MOVEFLAG_MASK_MOVING | MOVEFLAG_TURN_LEFT | MOVEFLAG_TURN_RIGHT, + + // MovementFlags mask that only contains flags for x/z translations + // this is to avoid that a jumping character that stands still triggers melee-leeway + MOVEFLAG_MASK_XZ = MOVEFLAG_FORWARD | MOVEFLAG_BACKWARD | MOVEFLAG_STRAFE_LEFT | MOVEFLAG_STRAFE_RIGHT +}; + +static char const* MoveFlagToString(uint32 flag) +{ + switch (flag) + { + case MOVEFLAG_NONE: + return "None"; + case MOVEFLAG_FORWARD: + return "Forward"; + case MOVEFLAG_BACKWARD: + return "Backward"; + case MOVEFLAG_STRAFE_LEFT: + return "Strafe Left"; + case MOVEFLAG_STRAFE_RIGHT: + return "Strafe Right"; + case MOVEFLAG_TURN_LEFT: + return "Turn Left"; + case MOVEFLAG_TURN_RIGHT: + return "Turn Right"; + case MOVEFLAG_PITCH_UP: + return "Pitch Up"; + case MOVEFLAG_PITCH_DOWN: + return "Pitch Down"; + case MOVEFLAG_WALK_MODE: + return "Walk Mode"; + case MOVEFLAG_UNUSED10: + return "Unused10"; + case MOVEFLAG_LEVITATING: + return "Levitating"; + case MOVEFLAG_FIXED_Z: + return "Fixed Z"; + case MOVEFLAG_ROOT: + return "Root"; + case MOVEFLAG_JUMPING: + return "Jumping"; + case MOVEFLAG_FALLINGFAR: + return "Falling Far"; + case MOVEFLAG_PENDING_STOP: + return "Pending Stop"; + case MOVEFLAG_PENDING_UNSTRAFE: + return "Pending Unstrafe"; + case MOVEFLAG_PENDING_FORWARD: + return "Pending Forward"; + case MOVEFLAG_PENDING_BACKWARD: + return "Pending Backward"; + case MOVEFLAG_PENDING_STR_LEFT: + return "Pending Strafe Left"; + case MOVEFLAG_PENDING_STR_RGHT: + return "Pending Strafe Right"; + case MOVEFLAG_SWIMMING: + return "Swimming"; + case MOVEFLAG_SPLINE_ENABLED: + return "Spline Enabled"; + case MOVEFLAG_MOVED: + return "Moved"; + case MOVEFLAG_FLYING: + return "Flying"; + case MOVEFLAG_ONTRANSPORT: + return "On Transport"; + case MOVEFLAG_SPLINE_ELEVATION: + return "Spline Elevation"; + case MOVEFLAG_UNUSED28: + return "Unused28"; + case MOVEFLAG_WATERWALKING: + return "Water Walking"; + case MOVEFLAG_SAFE_FALL: + return "Safe Fall"; + case MOVEFLAG_HOVER: + return "Hover"; + case MOVEFLAG_UNUSED32: + return "Unused32"; + } + return "UNKNOWN"; +} + +// used in SMSG_MONSTER_MOVE +enum SplineFlags +{ + // Valeurs correctes et testees pour la 1.12.1 + SPLINEFLAG_NONE = 0x00000000, + SPLINEFLAG_WALKMODE = 0x00000100, + SPLINEFLAG_FLYING = 0x00000200, + + SPLINEFLAG_SPLINE = 0x00002000, // spline n*(float x,y,z) +}; + +class MovementInfo +{ + public: + MovementInfo() : moveFlags(MOVEFLAG_NONE), stime(0), ctime(0), + s_pitch(0.0f), fallTime(0), splineElevation(0.0f), sourceSessionGuid(0) {} + + // Read/Write methods + void Read(ByteBuffer &data); + void Write(ByteBuffer &data) const; + void CorrectData(Unit* mover = nullptr); + + // Movement flags manipulations + void AddMovementFlag(int f) { moveFlags |= f; } + void RemoveMovementFlag(int f) { moveFlags &= ~f; } + bool HasMovementFlag(int f) const { return moveFlags & f; } + MovementFlags GetMovementFlags() const { return MovementFlags(moveFlags); } + void SetMovementFlags(MovementFlags f) { moveFlags = f; } + + // Position manipulations + Position const& GetPos() const { return pos; } + void SetTransportData(ObjectGuid guid, float x, float y, float z, float o) + { + t_guid = guid; + t_pos.x = x; + t_pos.y = y; + t_pos.z = z; + t_pos.o = o; + } + void ClearTransportData() + { + t_guid = ObjectGuid(); + t_pos.x = 0.0f; + t_pos.y = 0.0f; + t_pos.z = 0.0f; + t_pos.o = 0.0f; + } + ObjectGuid const& GetTransportGuid() const { return t_guid; } + Position const& GetTransportPos() const { return t_pos; } + Position& GetTransportPos() { return t_pos; } + uint32 GetFallTime() const { return fallTime; } + void ChangeOrientation(float o) { pos.o = o; } + void ChangePosition(float x, float y, float z, float o) { pos.x = x; pos.y = y; pos.z = z; pos.o = o; } + void UpdateTime(uint32 _time) { stime = _time; } + void SetAsServerSide() + { + uint32 const oldTime = stime; + stime = WorldTimer::getMSTime(); + + // Preserve order of server side packets. + if (oldTime >= stime) + stime = oldTime + 1; + + ctime = 0; // Not a client packet. Pauses extrapolation. + sourceSessionGuid = 0; + } + bool WasSentBySession(uint32 sessionGuid) const + { + return ctime != 0 && sourceSessionGuid == sessionGuid; + } + + struct JumpInfo + { + JumpInfo() : zspeed(0.f), sinAngle(0.f), cosAngle(0.f), xyspeed(0.f), startClientTime(0) {} + float zspeed, sinAngle, cosAngle, xyspeed; + Position start; + uint32 startClientTime; + }; + + JumpInfo const& GetJumpInfo() const { return jump; } + //private: + // common + uint32 moveFlags; // see enum MovementFlags + uint32 stime; // Server time + uint32 ctime; // Client time + Position pos; + // transport + ObjectGuid t_guid; + Position t_pos; + // swimming and unknown + float s_pitch; + // last fall time + uint32 fallTime; + // jumping + JumpInfo jump; + // spline + float splineElevation; + // client from which position came + uint32 sourceSessionGuid; +}; + +inline ByteBuffer& operator<< (ByteBuffer& buf, MovementInfo const& mi) +{ + mi.Write(buf); + return buf; +} + +inline ByteBuffer& operator>> (ByteBuffer& buf, MovementInfo& mi) +{ + mi.Read(buf); + return buf; +} + + +#endif diff --git a/src/game/Objects/Object.h b/src/game/Objects/Object.h index bfa0a777923..cbdb2810461 100644 --- a/src/game/Objects/Object.h +++ b/src/game/Objects/Object.h @@ -30,6 +30,7 @@ #include "ObjectGuid.h" #include "SharedDefines.h" #include "ObjectDefines.h" +#include "MovementInfo.h" #include "DBCEnums.h" #include "Util.h" #include "Timer.h" @@ -84,240 +85,6 @@ class WorldUpdateCounter uint32 m_tmStart; }; -// [-ZERO] Need check and update -// used in most movement packets (send and received) -enum MovementFlags -{ - MOVEFLAG_NONE = 0x00000000, - MOVEFLAG_FORWARD = 0x00000001, - MOVEFLAG_BACKWARD = 0x00000002, - MOVEFLAG_STRAFE_LEFT = 0x00000004, - MOVEFLAG_STRAFE_RIGHT = 0x00000008, - MOVEFLAG_TURN_LEFT = 0x00000010, - MOVEFLAG_TURN_RIGHT = 0x00000020, - MOVEFLAG_PITCH_UP = 0x00000040, - MOVEFLAG_PITCH_DOWN = 0x00000080, - MOVEFLAG_WALK_MODE = 0x00000100, // Walking - MOVEFLAG_UNUSED1 = 0x00000200, // ?? - MOVEFLAG_LEVITATING = 0x00000400, // ?? Seems not to work - MOVEFLAG_FIXED_Z = 0x00000800, // Fixed height. Jump => Glide across the entire map - MOVEFLAG_ROOT = 0x00001000, // Fix Nostalrius - MOVEFLAG_JUMPING = 0x00002000, - MOVEFLAG_FALLINGFAR = 0x00004000, - MOVEFLAG_PENDING_STOP = 0x00008000, // Only used in older client versions - MOVEFLAG_PENDING_UNSTRAFE = 0x00010000, // Only used in older client versions - MOVEFLAG_PENDING_FORWARD = 0x00020000, // Only used in older client versions - MOVEFLAG_PENDING_BACKWARD = 0x00040000, // Only used in older client versions - MOVEFLAG_PENDING_STR_LEFT = 0x00080000, // Only used in older client versions - MOVEFLAG_PENDING_STR_RGHT = 0x00100000, // Only used in older client versions - MOVEFLAG_SWIMMING = 0x00200000, // Ok - MOVEFLAG_SPLINE_ENABLED = 0x00400000, // Ok - MOVEFLAG_MOVED = 0x00800000, // Only used in older client versions - MOVEFLAG_FLYING = 0x01000000, // [-ZERO] is it really need and correct value - MOVEFLAG_ONTRANSPORT = 0x02000000, // Used for flying on some creatures - MOVEFLAG_SPLINE_ELEVATION = 0x04000000, // Used for flight paths - MOVEFLAG_UNUSED8 = 0x08000000, - MOVEFLAG_WATERWALKING = 0x10000000, // Prevent unit from falling through water - MOVEFLAG_SAFE_FALL = 0x20000000, // Active rogue safe fall spell (passive) - MOVEFLAG_HOVER = 0x40000000, - MOVEFLAG_INTERNAL = 0x80000000, - - // Can not be present with MOVEFLAG_ROOT (otherwise client freeze) - MOVEFLAG_MASK_MOVING = - MOVEFLAG_FORWARD | MOVEFLAG_BACKWARD | MOVEFLAG_STRAFE_LEFT | MOVEFLAG_STRAFE_RIGHT | - MOVEFLAG_PITCH_UP | MOVEFLAG_PITCH_DOWN | MOVEFLAG_JUMPING | MOVEFLAG_FALLINGFAR | - MOVEFLAG_SPLINE_ELEVATION, - MOVEFLAG_MASK_MOVING_OR_TURN= MOVEFLAG_MASK_MOVING | MOVEFLAG_TURN_LEFT | MOVEFLAG_TURN_RIGHT, - - // MovementFlags mask that only contains flags for x/z translations - // this is to avoid that a jumping character that stands still triggers melee-leeway - MOVEFLAG_MASK_XZ = MOVEFLAG_FORWARD | MOVEFLAG_BACKWARD | MOVEFLAG_STRAFE_LEFT | MOVEFLAG_STRAFE_RIGHT -}; - -static char const* MoveFlagToString(uint32 flag) -{ - switch (flag) - { - case MOVEFLAG_NONE: - return "None"; - case MOVEFLAG_FORWARD: - return "Forward"; - case MOVEFLAG_BACKWARD: - return "Backward"; - case MOVEFLAG_STRAFE_LEFT: - return "Strafe Left"; - case MOVEFLAG_STRAFE_RIGHT: - return "Strafe Right"; - case MOVEFLAG_TURN_LEFT: - return "Turn Left"; - case MOVEFLAG_TURN_RIGHT: - return "Turn Right"; - case MOVEFLAG_PITCH_UP: - return "Pitch Up"; - case MOVEFLAG_PITCH_DOWN: - return "Pitch Down"; - case MOVEFLAG_WALK_MODE: - return "Walk Mode"; - case MOVEFLAG_UNUSED1: - return "Unused1"; - case MOVEFLAG_LEVITATING: - return "Levitating"; - case MOVEFLAG_FIXED_Z: - return "Fixed Z"; - case MOVEFLAG_ROOT: - return "Root"; - case MOVEFLAG_JUMPING: - return "Jumping"; - case MOVEFLAG_FALLINGFAR: - return "Falling Far"; - case MOVEFLAG_PENDING_STOP: - return "Pending Stop"; - case MOVEFLAG_PENDING_UNSTRAFE: - return "Pending Unstrafe"; - case MOVEFLAG_PENDING_FORWARD: - return "Pending Forward"; - case MOVEFLAG_PENDING_BACKWARD: - return "Pending Backward"; - case MOVEFLAG_PENDING_STR_LEFT: - return "Pending Strafe Left"; - case MOVEFLAG_PENDING_STR_RGHT: - return "Pending Strafe Right"; - case MOVEFLAG_SWIMMING: - return "Swimming"; - case MOVEFLAG_SPLINE_ENABLED: - return "Spline Enabled"; - case MOVEFLAG_MOVED: - return "Moved"; - case MOVEFLAG_FLYING: - return "Flying"; - case MOVEFLAG_ONTRANSPORT: - return "On Transport"; - case MOVEFLAG_SPLINE_ELEVATION: - return "Spline Elevation"; - case MOVEFLAG_UNUSED8: - return "Unused8"; - case MOVEFLAG_WATERWALKING: - return "Water Walking"; - case MOVEFLAG_SAFE_FALL: - return "Safe Fall"; - case MOVEFLAG_HOVER: - return "Hover"; - case MOVEFLAG_INTERNAL: - return "Internal"; - } - return "UNKNOWN"; -} - -// used in SMSG_MONSTER_MOVE -enum SplineFlags -{ - // Valeurs correctes et testees pour la 1.12.1 - SPLINEFLAG_NONE = 0x00000000, - SPLINEFLAG_WALKMODE = 0x00000100, - SPLINEFLAG_FLYING = 0x00000200, - - SPLINEFLAG_SPLINE = 0x00002000, // spline n*(float x,y,z) -}; - -class MovementInfo -{ - public: - MovementInfo() : moveFlags(MOVEFLAG_NONE), stime(0), ctime(0), - t_time(0), s_pitch(0.0f), fallTime(0), splineElevation(0.0f) {} - - // Read/Write methods - void Read(ByteBuffer &data); - void Write(ByteBuffer &data) const; - void CorrectData(Unit* mover = nullptr); - - // Movement flags manipulations - void AddMovementFlag(int f) { moveFlags |= f; } - void RemoveMovementFlag(int f) { moveFlags &= ~f; } - bool HasMovementFlag(int f) const { return moveFlags & f; } - MovementFlags GetMovementFlags() const { return MovementFlags(moveFlags); } - void SetMovementFlags(MovementFlags f) { moveFlags = f; } - - // Position manipulations - Position const& GetPos() const { return pos; } - void SetTransportData(ObjectGuid guid, float x, float y, float z, float o, uint32 time) - { - t_guid = guid; - t_pos.x = x; - t_pos.y = y; - t_pos.z = z; - t_pos.o = o; - t_time = time; - } - void ClearTransportData() - { - t_guid = ObjectGuid(); - t_pos.x = 0.0f; - t_pos.y = 0.0f; - t_pos.z = 0.0f; - t_pos.o = 0.0f; - t_time = 0; - } - ObjectGuid const& GetTransportGuid() const { return t_guid; } - Position const& GetTransportPos() const { return t_pos; } - Position& GetTransportPos() { return t_pos; } - uint32 GetTransportTime() const { return t_time; } - uint32 GetFallTime() const { return fallTime; } - void ChangeOrientation(float o) { pos.o = o; } - void ChangePosition(float x, float y, float z, float o) { pos.x = x; pos.y = y; pos.z = z; pos.o = o; } - void UpdateTime(uint32 _time) { stime = _time; } - void SetAsServerSide() - { - uint32 const oldTime = stime; - stime = WorldTimer::getMSTime(); - - // Preserve order of server side packets. - if (oldTime >= stime) - stime = oldTime + 1; - - ctime = 0; // Not a client packet. Pauses extrapolation. - } - - struct JumpInfo - { - JumpInfo() : zspeed(0.f), sinAngle(0.f), cosAngle(0.f), xyspeed(0.f), startClientTime(0) {} - float zspeed, sinAngle, cosAngle, xyspeed; - Position start; - uint32 startClientTime; - }; - - JumpInfo const& GetJumpInfo() const { return jump; } - //private: - // common - uint32 moveFlags; // see enum MovementFlags - uint32 stime; // Server time - uint32 ctime; // Client time - Position pos; - // transport - ObjectGuid t_guid; - Position t_pos; - uint32 t_time; - // swimming and unknown - float s_pitch; - // last fall time - uint32 fallTime; - // jumping - JumpInfo jump; - // spline - float splineElevation; -}; - -inline ByteBuffer& operator<< (ByteBuffer& buf, MovementInfo const& mi) -{ - mi.Write(buf); - return buf; -} - -inline ByteBuffer& operator>> (ByteBuffer& buf, MovementInfo& mi) -{ - mi.Read(buf); - return buf; -} - enum ObjectDelayedAction { OBJECT_DELAYED_MARK_CLIENT_UPDATE = 0x1, @@ -859,7 +626,6 @@ class WorldObject : public Object float GetTransOffsetY() const { return m_movementInfo.GetTransportPos().y; } float GetTransOffsetZ() const { return m_movementInfo.GetTransportPos().z; } float GetTransOffsetO() const { return m_movementInfo.GetTransportPos().o; } - uint32 GetTransTime() const { return m_movementInfo.GetTransportTime(); } void AddUnitMovementFlag(uint32 f) { m_movementInfo.moveFlags |= f; } void RemoveUnitMovementFlag(uint32 f) { m_movementInfo.moveFlags &= ~f; } diff --git a/src/game/Objects/Player.cpp b/src/game/Objects/Player.cpp index abd678abe17..dddb2095ea1 100644 --- a/src/game/Objects/Player.cpp +++ b/src/game/Objects/Player.cpp @@ -15241,7 +15241,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SqlQueryHolder* holder) if (GenericTransport* transport = GetMap()->GetTransport(guid)) { float x = fields[30].GetFloat(), y = fields[31].GetFloat(), z = fields[32].GetFloat(), o = fields[33].GetFloat(); - m_movementInfo.SetTransportData(guid, x, y, z, o, 0); + m_movementInfo.SetTransportData(guid, x, y, z, o); transport->CalculatePassengerPosition(x, y, z, &o); if (!MaNGOS::IsValidMapCoord(x, y, z, o) || diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h index 3f9a2d8c63a..2151a9e3f09 100644 --- a/src/game/SharedDefines.h +++ b/src/game/SharedDefines.h @@ -1752,6 +1752,11 @@ struct Position float y = 0.0f; float z = 0.0f; float o = 0.0f; + + bool IsEmpty() const + { + return !x && !y && !z && !o; + } }; struct WorldLocation @@ -1765,6 +1770,11 @@ struct WorldLocation : mapId(_mapid), x(_x), y(_y), z(_z), o(_o) {} WorldLocation(WorldLocation const& loc) : mapId(loc.mapId), x(loc.x), y(loc.y), z(loc.z), o(loc.o) {} + + bool IsEmpty() const + { + return !mapId && !x && !y && !z && !o; + } }; #endif diff --git a/src/game/Transports/Transport.cpp b/src/game/Transports/Transport.cpp index fbf29a7d071..8588506ba51 100644 --- a/src/game/Transports/Transport.cpp +++ b/src/game/Transports/Transport.cpp @@ -210,7 +210,6 @@ void GenericTransport::AddPassenger(Unit* passenger, bool adjustCoords) passenger->m_movementInfo.AddMovementFlag(MOVEFLAG_ONTRANSPORT); bool changedTransports = passenger->m_movementInfo.t_guid != GetObjectGuid(); passenger->m_movementInfo.t_guid = GetObjectGuid(); - passenger->m_movementInfo.t_time = GetPathProgress(); if (changedTransports && adjustCoords) { passenger->m_movementInfo.t_pos.x = passenger->GetPositionX(); @@ -253,7 +252,7 @@ void GenericTransport::RemovePassenger(Unit* passenger) void GenericTransport::AddFollowerToTransport(Unit* passenger, Unit* follower) { AddPassenger(follower); - follower->m_movementInfo.SetTransportData(GetObjectGuid(), passenger->m_movementInfo.t_pos.x, passenger->m_movementInfo.t_pos.y, passenger->m_movementInfo.t_pos.z, passenger->m_movementInfo.t_pos.o, GetPathProgress()); + follower->m_movementInfo.SetTransportData(GetObjectGuid(), passenger->m_movementInfo.t_pos.x, passenger->m_movementInfo.t_pos.y, passenger->m_movementInfo.t_pos.z, passenger->m_movementInfo.t_pos.o); if (follower->IsCreature()) follower->NearTeleportTo(passenger->m_movementInfo.pos.x, passenger->m_movementInfo.pos.y, passenger->m_movementInfo.pos.z, passenger->m_movementInfo.pos.o); else @@ -470,7 +469,6 @@ void GenericTransport::UpdatePassengerPosition(Unit* passenger) GetMap()->CreatureRelocation(creature, x, y, z, o); else passenger->Relocate(x, y, z, o); - creature->m_movementInfo.t_time = GetPathProgress(); passenger->m_movementInfo.ctime = 0; break; } @@ -483,7 +481,6 @@ void GenericTransport::UpdatePassengerPosition(Unit* passenger) passenger->Relocate(x, y, z, o); static_cast(passenger)->m_movementInfo.t_guid = GetObjectGuid(); } - static_cast(passenger)->m_movementInfo.t_time = GetPathProgress(); passenger->m_movementInfo.ctime = 0; break; default: From aca9f5df983b29bf85e72a95b15a2b656a84cfab Mon Sep 17 00:00:00 2001 From: ratkosrb Date: Fri, 21 Jun 2024 12:52:48 +0300 Subject: [PATCH 02/34] Remove unused Unit parameter from CorrectData. --- .../Anticheat/MovementAnticheat/MovementAnticheat.cpp | 2 +- src/game/Handlers/MovementHandler.cpp | 8 ++++---- src/game/Objects/MovementInfo.h | 7 ++----- src/game/Objects/Object.cpp | 2 +- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/game/Anticheat/MovementAnticheat/MovementAnticheat.cpp b/src/game/Anticheat/MovementAnticheat/MovementAnticheat.cpp index b4f1ff40760..d93d74ec0d9 100644 --- a/src/game/Anticheat/MovementAnticheat/MovementAnticheat.cpp +++ b/src/game/Anticheat/MovementAnticheat/MovementAnticheat.cpp @@ -686,7 +686,7 @@ uint32 MovementAnticheat::HandlePositionTests(Player* pPlayer, MovementInfo& mov if (IsFlagAckOpcode(opcode)) { me->m_movementInfo.moveFlags = movementInfo.moveFlags; - me->m_movementInfo.CorrectData(me); + me->m_movementInfo.CorrectData(); } if (HAS_CHEAT(CHEAT_TYPE_OVERSPEED_JUMP) && diff --git a/src/game/Handlers/MovementHandler.cpp b/src/game/Handlers/MovementHandler.cpp index f5a4ac5efa4..4065ffeab7a 100644 --- a/src/game/Handlers/MovementHandler.cpp +++ b/src/game/Handlers/MovementHandler.cpp @@ -520,7 +520,7 @@ void WorldSession::HandleForceSpeedChangeAckOpcodes(WorldPacket& recvData) { // Can only change flags and speed for not current active mover. pMover->m_movementInfo.moveFlags = movementInfo.moveFlags; - pMover->m_movementInfo.CorrectData(pMover); + pMover->m_movementInfo.CorrectData(); } } @@ -629,7 +629,7 @@ void WorldSession::HandleMovementFlagChangeToggleAck(WorldPacket& recvData) { // Can only change flags and speed for not current active mover. pMover->m_movementInfo.moveFlags = movementInfo.moveFlags; - pMover->m_movementInfo.CorrectData(pMover); + pMover->m_movementInfo.CorrectData(); } } while (false); @@ -730,7 +730,7 @@ void WorldSession::HandleMoveRootAck(WorldPacket& recvData) { // Can only change flags and speed for not current active mover. pMover->m_movementInfo.moveFlags = movementInfo.moveFlags; - pMover->m_movementInfo.CorrectData(pMover); + pMover->m_movementInfo.CorrectData(); } } while (false); @@ -1098,7 +1098,7 @@ void WorldSession::HandleMoverRelocation(Unit* pMover, MovementInfo& movementInf Player* const pPlayerMover = pMover->ToPlayer(); movementInfo.sourceSessionGuid = GetGUID(); - movementInfo.CorrectData(pMover); + movementInfo.CorrectData(); // Prevent client from removing root flag. if (pMover->HasUnitMovementFlag(MOVEFLAG_ROOT) && !movementInfo.HasMovementFlag(MOVEFLAG_ROOT)) diff --git a/src/game/Objects/MovementInfo.h b/src/game/Objects/MovementInfo.h index 90b15bd9c1c..38b98702427 100644 --- a/src/game/Objects/MovementInfo.h +++ b/src/game/Objects/MovementInfo.h @@ -22,10 +22,8 @@ #include "ObjectGuid.h" #include "Timer.h" -class Unit; - // [-ZERO] Need check and update -// used in most movement packets (send and received) +// used in most movement packets (sent and received) enum MovementFlags { MOVEFLAG_NONE = 0x00000000, // 0 @@ -168,7 +166,7 @@ class MovementInfo // Read/Write methods void Read(ByteBuffer &data); void Write(ByteBuffer &data) const; - void CorrectData(Unit* mover = nullptr); + void CorrectData(); // Movement flags manipulations void AddMovementFlag(int f) { moveFlags |= f; } @@ -261,5 +259,4 @@ inline ByteBuffer& operator>> (ByteBuffer& buf, MovementInfo& mi) return buf; } - #endif diff --git a/src/game/Objects/Object.cpp b/src/game/Objects/Object.cpp index 79eb89bc95a..a5d053b9fac 100644 --- a/src/game/Objects/Object.cpp +++ b/src/game/Objects/Object.cpp @@ -103,7 +103,7 @@ void MovementInfo::Read(ByteBuffer &data) } } -void MovementInfo::CorrectData(Unit* mover) +void MovementInfo::CorrectData() { // Nostalrius: remove incompatible flags, causing client freezes for example #define REMOVE_VIOLATING_FLAGS(check, maskToRemove) \ From 6bbb1dffaad46f0e5a25db28a2547c5a97c7e63c Mon Sep 17 00:00:00 2001 From: ratkosrb Date: Fri, 21 Jun 2024 13:41:02 +0300 Subject: [PATCH 03/34] Revert "Try to fix linking to readline on MacOS." This reverts commit e3cb5998cc284595e063d7969a085e2bd2fbf136. --- src/mangosd/CMakeLists.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/mangosd/CMakeLists.txt b/src/mangosd/CMakeLists.txt index d959210f451..c33fe47a7e6 100644 --- a/src/mangosd/CMakeLists.txt +++ b/src/mangosd/CMakeLists.txt @@ -159,8 +159,6 @@ if(UNIX) endif() if(APPLE) - include_directories(/usr/local/opt/readline/include) - link_directories(/usr/local/opt/readline/lib) set(EXECUTABLE_LINK_FLAGS "-framework Carbon ${EXECUTABLE_LINK_FLAGS}") endif() From 17cc7bca7669c1d7a860aa2dac29b0330fc869c7 Mon Sep 17 00:00:00 2001 From: ratkosrb Date: Fri, 21 Jun 2024 13:41:45 +0300 Subject: [PATCH 04/34] Revert "Fix nesting of free. (#2601)" This reverts commit 50b8a5851f9317080b6858d5227310042dbb4166. --- src/mangosd/CliRunnable.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/mangosd/CliRunnable.cpp b/src/mangosd/CliRunnable.cpp index 4d035994cd0..012033acdb5 100644 --- a/src/mangosd/CliRunnable.cpp +++ b/src/mangosd/CliRunnable.cpp @@ -123,7 +123,9 @@ void CliRunnable::operator()() s_canReadLine = false; sWorld.QueueCliCommand(new CliCommandHolder(0, SEC_CONSOLE, nullptr, command.c_str(), &utf8print, &commandFinished)); } - free(command_str); } + #ifndef WIN32 + free(command_str); + #endif } } From 76eaa9f89348403ee7a7d1776b97b72702d40241 Mon Sep 17 00:00:00 2001 From: ratkosrb Date: Fri, 21 Jun 2024 13:41:57 +0300 Subject: [PATCH 05/34] Revert "Fix linux daemon issue (#2572)" This reverts commit 657d4f5fa3da5a05295214772431d3ee140c44cf. --- src/mangosd/CliRunnable.cpp | 3 --- src/mangosd/Main.cpp | 2 +- src/mangosd/Master.cpp | 4 ++-- src/mangosd/Master.h | 2 +- src/shared/PosixDaemon.cpp | 6 ++++++ 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/mangosd/CliRunnable.cpp b/src/mangosd/CliRunnable.cpp index 012033acdb5..eea255d932d 100644 --- a/src/mangosd/CliRunnable.cpp +++ b/src/mangosd/CliRunnable.cpp @@ -124,8 +124,5 @@ void CliRunnable::operator()() sWorld.QueueCliCommand(new CliCommandHolder(0, SEC_CONSOLE, nullptr, command.c_str(), &utf8print, &commandFinished)); } } - #ifndef WIN32 - free(command_str); - #endif } } diff --git a/src/mangosd/Main.cpp b/src/mangosd/Main.cpp index 1b2ab6cbb28..fd0a2153739 100644 --- a/src/mangosd/Main.cpp +++ b/src/mangosd/Main.cpp @@ -216,7 +216,7 @@ extern int main(int argc, char **argv) // and run the 'Master' // TODO: Why do we need this 'Master'? Can't all of this be in the Main as for Realmd? - return sMaster.Run(serviceDaemonMode); + return sMaster.Run(); // at sMaster return function exist with codes // 0 - normal shutdown diff --git a/src/mangosd/Master.cpp b/src/mangosd/Master.cpp index ecd1938e8cb..054672bce54 100644 --- a/src/mangosd/Master.cpp +++ b/src/mangosd/Master.cpp @@ -153,7 +153,7 @@ Master::~Master() } // Main function -int Master::Run(char serviceDaemonMode = '\0') +int Master::Run() { // worldd PID file creation std::string pidfile = sConfig.GetStringDefault("PidFile", ""); @@ -210,7 +210,7 @@ int Master::Run(char serviceDaemonMode = '\0') #ifdef WIN32 if (sConfig.GetBoolDefault("Console.Enable", true) && (m_ServiceStatus == -1)/* need disable console in service mode*/) #else - if (sConfig.GetBoolDefault("Console.Enable", true) && !serviceDaemonMode) + if (sConfig.GetBoolDefault("Console.Enable", true)) #endif { // Launch CliRunnable thread diff --git a/src/mangosd/Master.h b/src/mangosd/Master.h index 36c03c74394..c2f29b82cfe 100644 --- a/src/mangosd/Master.h +++ b/src/mangosd/Master.h @@ -35,7 +35,7 @@ class Master public: Master(); ~Master(); - int Run(char serviceDaemonMode); + int Run(); static volatile uint32 m_masterLoopCounter; static volatile bool m_handleSigvSignals; static void SigvSignalHandler(); diff --git a/src/shared/PosixDaemon.cpp b/src/shared/PosixDaemon.cpp index a8008330202..15eb8f1034c 100644 --- a/src/shared/PosixDaemon.cpp +++ b/src/shared/PosixDaemon.cpp @@ -84,9 +84,15 @@ void startDaemon(uint32_t timeout) exit(EXIT_FAILURE); } + if ((chdir("/")) < 0) + { + exit(EXIT_FAILURE); + } + close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); + } void stopDaemon() From 7ee429e2f1a225fe89ad4c509b3776683ca724b8 Mon Sep 17 00:00:00 2001 From: ratkosrb Date: Fri, 21 Jun 2024 13:42:10 +0300 Subject: [PATCH 06/34] Revert "What changes didnt it save?" This reverts commit ae1a317374dbf020693ae396f135a42436ef8a3f. --- src/mangosd/CliRunnable.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mangosd/CliRunnable.cpp b/src/mangosd/CliRunnable.cpp index eea255d932d..5bf49b6e73b 100644 --- a/src/mangosd/CliRunnable.cpp +++ b/src/mangosd/CliRunnable.cpp @@ -82,11 +82,11 @@ int checkStopped() void CliRunnable::operator()() { // Init new SQL thread for the world database (one connection call enough) - WorldDatabase.ThreadStart(); // let thread do safe mySQL requests + WorldDatabase.ThreadStart(); // let thread do safe mySQL requests // Display the list of available CLI functions then beep if (sConfig.GetBoolDefault("BeepAtStart", true)) - printf("\a"); // \a = Alert + printf("\a"); // \a = Alert rl_event_hook = &checkStopped; // TODO: tab completion From 7d1d93fd9b885b286cea13b7d2e62658fe07c10f Mon Sep 17 00:00:00 2001 From: ratkosrb Date: Fri, 21 Jun 2024 13:42:18 +0300 Subject: [PATCH 07/34] Revert "Use readline on windows too." This reverts commit 79c5f503df39cd92eccc399443f8502eb8f9c248. --- dep/src/CMakeLists.txt | 1 - dep/src/readline/.gitignore | 10 - dep/src/readline/CHANGELOG | 810 -- dep/src/readline/CHANGES | 792 -- dep/src/readline/CMakeLists.txt | 62 - dep/src/readline/COPYING | 339 - dep/src/readline/INSTALL | 273 - dep/src/readline/MANIFEST | 134 - dep/src/readline/MANIFEST.doc | 16 - dep/src/readline/NEWS | 55 - dep/src/readline/README | 172 - dep/src/readline/README.md | 24 - dep/src/readline/STANDALONE | 31 - dep/src/readline/USAGE | 37 - dep/src/readline/src/Makefile.in | 534 -- dep/src/readline/src/aclocal.m4 | 3913 --------- dep/src/readline/src/ansi_stdlib.h | 54 - dep/src/readline/src/bind.c | 2237 ----- dep/src/readline/src/callback.c | 156 - dep/src/readline/src/compat.c | 113 - dep/src/readline/src/complete.c | 2255 ----- dep/src/readline/src/config.h.in | 217 - dep/src/readline/src/configure | 8176 ------------------- dep/src/readline/src/configure.in | 215 - dep/src/readline/src/display.c | 2379 ------ dep/src/readline/src/doc/Makefile.in | 252 - dep/src/readline/src/doc/fdl.texi | 452 - dep/src/readline/src/doc/history.0 | 488 -- dep/src/readline/src/doc/history.3 | 663 -- dep/src/readline/src/doc/history.dvi | Bin 79856 -> 0 bytes dep/src/readline/src/doc/history.html | 2270 ----- dep/src/readline/src/doc/history.info | 1317 --- dep/src/readline/src/doc/history.pdf | Bin 166940 -> 0 bytes dep/src/readline/src/doc/history.ps | Bin 220512 -> 0 bytes dep/src/readline/src/doc/history.texi | 104 - dep/src/readline/src/doc/history_3.ps | Bin 44584 -> 0 bytes dep/src/readline/src/doc/hstech.texi | 573 -- dep/src/readline/src/doc/hsuser.texi | 457 -- dep/src/readline/src/doc/readline.0 | 914 --- dep/src/readline/src/doc/readline.3 | 1287 --- dep/src/readline/src/doc/readline.dvi | Bin 274068 -> 0 bytes dep/src/readline/src/doc/readline.html | 6656 --------------- dep/src/readline/src/doc/readline.info | 4209 ---------- dep/src/readline/src/doc/readline.pdf | Bin 311657 -> 0 bytes dep/src/readline/src/doc/readline.ps | Bin 473717 -> 0 bytes dep/src/readline/src/doc/readline_3.ps | Bin 75755 -> 0 bytes dep/src/readline/src/doc/rlman.texi | 101 - dep/src/readline/src/doc/rltech.texi | 2259 ----- dep/src/readline/src/doc/rluser.texi | 1824 ----- dep/src/readline/src/doc/rluserman.dvi | Bin 91852 -> 0 bytes dep/src/readline/src/doc/rluserman.html | 2778 ------- dep/src/readline/src/doc/rluserman.info | 1731 ---- dep/src/readline/src/doc/rluserman.pdf | Bin 172521 -> 0 bytes dep/src/readline/src/doc/rluserman.ps | Bin 236177 -> 0 bytes dep/src/readline/src/doc/rluserman.texi | 88 - dep/src/readline/src/doc/texi2dvi | 660 -- dep/src/readline/src/doc/texi2html | 5429 ------------ dep/src/readline/src/doc/texinfo.tex | 6688 --------------- dep/src/readline/src/doc/version.texi | 10 - dep/src/readline/src/emacs_keymap.c | 873 -- dep/src/readline/src/examples/Inputrc | 81 - dep/src/readline/src/examples/Makefile.in | 104 - dep/src/readline/src/examples/excallback.c | 188 - dep/src/readline/src/examples/fileman.c | 485 -- dep/src/readline/src/examples/histexamp.c | 122 - dep/src/readline/src/examples/manexamp.c | 112 - dep/src/readline/src/examples/readlinebuf.h | 139 - dep/src/readline/src/examples/rl-fgets.c | 374 - dep/src/readline/src/examples/rl.c | 151 - dep/src/readline/src/examples/rlcat.c | 174 - dep/src/readline/src/examples/rlfe.c | 1042 --- dep/src/readline/src/examples/rltest.c | 87 - dep/src/readline/src/examples/rlversion.c | 43 - dep/src/readline/src/funmap.c | 256 - dep/src/readline/src/histexpand.c | 1591 ---- dep/src/readline/src/histfile.c | 556 -- dep/src/readline/src/histlib.h | 82 - dep/src/readline/src/history.c | 443 - dep/src/readline/src/histsearch.c | 195 - dep/src/readline/src/input.c | 788 -- dep/src/readline/src/isearch.c | 560 -- dep/src/readline/src/keymaps.c | 149 - dep/src/readline/src/kill.c | 693 -- dep/src/readline/src/macro.c | 262 - dep/src/readline/src/mbutil.c | 348 - dep/src/readline/src/misc.c | 508 -- dep/src/readline/src/msvc/config.h | 218 - dep/src/readline/src/nls.c | 254 - dep/src/readline/src/parens.c | 205 - dep/src/readline/src/posixdir.h | 71 - dep/src/readline/src/posixjmp.h | 40 - dep/src/readline/src/posixstat.h | 142 - dep/src/readline/src/readline.c | 1001 --- dep/src/readline/src/rlconf.h | 60 - dep/src/readline/src/rldefs.h | 183 - dep/src/readline/src/rlmbutil.h | 121 - dep/src/readline/src/rlprivate.h | 288 - dep/src/readline/src/rlshell.h | 34 - dep/src/readline/src/rltty.c | 1095 --- dep/src/readline/src/rltty.h | 82 - dep/src/readline/src/rlwinsize.h | 57 - dep/src/readline/src/savestring.c | 37 - dep/src/readline/src/search.c | 475 -- dep/src/readline/src/shell.c | 237 - dep/src/readline/src/shlib/Makefile.in | 447 - dep/src/readline/src/signals.c | 456 -- dep/src/readline/src/support/config.guess | 1403 ---- dep/src/readline/src/support/config.rpath | 548 -- dep/src/readline/src/support/config.sub | 1470 ---- dep/src/readline/src/support/install.sh | 247 - dep/src/readline/src/support/mkdirs | 48 - dep/src/readline/src/support/mkdist | 120 - dep/src/readline/src/support/mkinstalldirs | 111 - dep/src/readline/src/support/shlib-install | 169 - dep/src/readline/src/support/shobj-conf | 466 -- dep/src/readline/src/support/wcwidth.c | 236 - dep/src/readline/src/tcap.h | 60 - dep/src/readline/src/terminal.c | 840 -- dep/src/readline/src/text.c | 1547 ---- dep/src/readline/src/tilde.c | 479 -- dep/src/readline/src/undo.c | 263 - dep/src/readline/src/util.c | 338 - dep/src/readline/src/vi_keymap.c | 877 -- dep/src/readline/src/vi_mode.c | 1505 ---- dep/src/readline/src/xmalloc.c | 88 - dep/src/readline/src/xmalloc.h | 46 - dep/windows/include/readline/chardefs.h | 168 - dep/windows/include/readline/history.h | 266 - dep/windows/include/readline/keymaps.h | 103 - dep/windows/include/readline/readline.h | 836 -- dep/windows/include/readline/rlstdc.h | 69 - dep/windows/include/readline/rltypedefs.h | 94 - dep/windows/include/readline/tilde.h | 84 - src/mangosd/CMakeLists.txt | 5 +- src/mangosd/CliRunnable.cpp | 77 +- 135 files changed, 50 insertions(+), 92637 deletions(-) delete mode 100644 dep/src/readline/.gitignore delete mode 100644 dep/src/readline/CHANGELOG delete mode 100644 dep/src/readline/CHANGES delete mode 100644 dep/src/readline/CMakeLists.txt delete mode 100644 dep/src/readline/COPYING delete mode 100644 dep/src/readline/INSTALL delete mode 100644 dep/src/readline/MANIFEST delete mode 100644 dep/src/readline/MANIFEST.doc delete mode 100644 dep/src/readline/NEWS delete mode 100644 dep/src/readline/README delete mode 100644 dep/src/readline/README.md delete mode 100644 dep/src/readline/STANDALONE delete mode 100644 dep/src/readline/USAGE delete mode 100644 dep/src/readline/src/Makefile.in delete mode 100644 dep/src/readline/src/aclocal.m4 delete mode 100644 dep/src/readline/src/ansi_stdlib.h delete mode 100644 dep/src/readline/src/bind.c delete mode 100644 dep/src/readline/src/callback.c delete mode 100644 dep/src/readline/src/compat.c delete mode 100644 dep/src/readline/src/complete.c delete mode 100644 dep/src/readline/src/config.h.in delete mode 100644 dep/src/readline/src/configure delete mode 100644 dep/src/readline/src/configure.in delete mode 100644 dep/src/readline/src/display.c delete mode 100644 dep/src/readline/src/doc/Makefile.in delete mode 100644 dep/src/readline/src/doc/fdl.texi delete mode 100644 dep/src/readline/src/doc/history.0 delete mode 100644 dep/src/readline/src/doc/history.3 delete mode 100644 dep/src/readline/src/doc/history.dvi delete mode 100644 dep/src/readline/src/doc/history.html delete mode 100644 dep/src/readline/src/doc/history.info delete mode 100644 dep/src/readline/src/doc/history.pdf delete mode 100644 dep/src/readline/src/doc/history.ps delete mode 100644 dep/src/readline/src/doc/history.texi delete mode 100644 dep/src/readline/src/doc/history_3.ps delete mode 100644 dep/src/readline/src/doc/hstech.texi delete mode 100644 dep/src/readline/src/doc/hsuser.texi delete mode 100644 dep/src/readline/src/doc/readline.0 delete mode 100644 dep/src/readline/src/doc/readline.3 delete mode 100644 dep/src/readline/src/doc/readline.dvi delete mode 100644 dep/src/readline/src/doc/readline.html delete mode 100644 dep/src/readline/src/doc/readline.info delete mode 100644 dep/src/readline/src/doc/readline.pdf delete mode 100644 dep/src/readline/src/doc/readline.ps delete mode 100644 dep/src/readline/src/doc/readline_3.ps delete mode 100644 dep/src/readline/src/doc/rlman.texi delete mode 100644 dep/src/readline/src/doc/rltech.texi delete mode 100644 dep/src/readline/src/doc/rluser.texi delete mode 100644 dep/src/readline/src/doc/rluserman.dvi delete mode 100644 dep/src/readline/src/doc/rluserman.html delete mode 100644 dep/src/readline/src/doc/rluserman.info delete mode 100644 dep/src/readline/src/doc/rluserman.pdf delete mode 100644 dep/src/readline/src/doc/rluserman.ps delete mode 100644 dep/src/readline/src/doc/rluserman.texi delete mode 100644 dep/src/readline/src/doc/texi2dvi delete mode 100644 dep/src/readline/src/doc/texi2html delete mode 100644 dep/src/readline/src/doc/texinfo.tex delete mode 100644 dep/src/readline/src/doc/version.texi delete mode 100644 dep/src/readline/src/emacs_keymap.c delete mode 100644 dep/src/readline/src/examples/Inputrc delete mode 100644 dep/src/readline/src/examples/Makefile.in delete mode 100644 dep/src/readline/src/examples/excallback.c delete mode 100644 dep/src/readline/src/examples/fileman.c delete mode 100644 dep/src/readline/src/examples/histexamp.c delete mode 100644 dep/src/readline/src/examples/manexamp.c delete mode 100644 dep/src/readline/src/examples/readlinebuf.h delete mode 100644 dep/src/readline/src/examples/rl-fgets.c delete mode 100644 dep/src/readline/src/examples/rl.c delete mode 100644 dep/src/readline/src/examples/rlcat.c delete mode 100644 dep/src/readline/src/examples/rlfe.c delete mode 100644 dep/src/readline/src/examples/rltest.c delete mode 100644 dep/src/readline/src/examples/rlversion.c delete mode 100644 dep/src/readline/src/funmap.c delete mode 100644 dep/src/readline/src/histexpand.c delete mode 100644 dep/src/readline/src/histfile.c delete mode 100644 dep/src/readline/src/histlib.h delete mode 100644 dep/src/readline/src/history.c delete mode 100644 dep/src/readline/src/histsearch.c delete mode 100644 dep/src/readline/src/input.c delete mode 100644 dep/src/readline/src/isearch.c delete mode 100644 dep/src/readline/src/keymaps.c delete mode 100644 dep/src/readline/src/kill.c delete mode 100644 dep/src/readline/src/macro.c delete mode 100644 dep/src/readline/src/mbutil.c delete mode 100644 dep/src/readline/src/misc.c delete mode 100644 dep/src/readline/src/msvc/config.h delete mode 100644 dep/src/readline/src/nls.c delete mode 100644 dep/src/readline/src/parens.c delete mode 100644 dep/src/readline/src/posixdir.h delete mode 100644 dep/src/readline/src/posixjmp.h delete mode 100644 dep/src/readline/src/posixstat.h delete mode 100644 dep/src/readline/src/readline.c delete mode 100644 dep/src/readline/src/rlconf.h delete mode 100644 dep/src/readline/src/rldefs.h delete mode 100644 dep/src/readline/src/rlmbutil.h delete mode 100644 dep/src/readline/src/rlprivate.h delete mode 100644 dep/src/readline/src/rlshell.h delete mode 100644 dep/src/readline/src/rltty.c delete mode 100644 dep/src/readline/src/rltty.h delete mode 100644 dep/src/readline/src/rlwinsize.h delete mode 100644 dep/src/readline/src/savestring.c delete mode 100644 dep/src/readline/src/search.c delete mode 100644 dep/src/readline/src/shell.c delete mode 100644 dep/src/readline/src/shlib/Makefile.in delete mode 100644 dep/src/readline/src/signals.c delete mode 100644 dep/src/readline/src/support/config.guess delete mode 100644 dep/src/readline/src/support/config.rpath delete mode 100644 dep/src/readline/src/support/config.sub delete mode 100644 dep/src/readline/src/support/install.sh delete mode 100644 dep/src/readline/src/support/mkdirs delete mode 100644 dep/src/readline/src/support/mkdist delete mode 100644 dep/src/readline/src/support/mkinstalldirs delete mode 100644 dep/src/readline/src/support/shlib-install delete mode 100644 dep/src/readline/src/support/shobj-conf delete mode 100644 dep/src/readline/src/support/wcwidth.c delete mode 100644 dep/src/readline/src/tcap.h delete mode 100644 dep/src/readline/src/terminal.c delete mode 100644 dep/src/readline/src/text.c delete mode 100644 dep/src/readline/src/tilde.c delete mode 100644 dep/src/readline/src/undo.c delete mode 100644 dep/src/readline/src/util.c delete mode 100644 dep/src/readline/src/vi_keymap.c delete mode 100644 dep/src/readline/src/vi_mode.c delete mode 100644 dep/src/readline/src/xmalloc.c delete mode 100644 dep/src/readline/src/xmalloc.h delete mode 100644 dep/windows/include/readline/chardefs.h delete mode 100644 dep/windows/include/readline/history.h delete mode 100644 dep/windows/include/readline/keymaps.h delete mode 100644 dep/windows/include/readline/readline.h delete mode 100644 dep/windows/include/readline/rlstdc.h delete mode 100644 dep/windows/include/readline/rltypedefs.h delete mode 100644 dep/windows/include/readline/tilde.h diff --git a/dep/src/CMakeLists.txt b/dep/src/CMakeLists.txt index 57b3fbcab6f..7d525f79ac6 100644 --- a/dep/src/CMakeLists.txt +++ b/dep/src/CMakeLists.txt @@ -22,6 +22,5 @@ endif() add_subdirectory(g3dlite) add_subdirectory(gsoap) if(WIN32) - add_subdirectory(readline) add_subdirectory(zlib) endif() \ No newline at end of file diff --git a/dep/src/readline/.gitignore b/dep/src/readline/.gitignore deleted file mode 100644 index c74f5b75a2c..00000000000 --- a/dep/src/readline/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -# CMake -out/ -build/ -build_*/ - -# Visual Studio -.vs/ - -# Visual Studio Code -.vscode/ diff --git a/dep/src/readline/CHANGELOG b/dep/src/readline/CHANGELOG deleted file mode 100644 index 0fc31fa6969..00000000000 --- a/dep/src/readline/CHANGELOG +++ /dev/null @@ -1,810 +0,0 @@ -[Readline-specific changelog. Descriptions of changes to the source are - found in the bash changelog.] - - 6/9 - --- -Makefile.in - - quote value of ${INSTALL_DATA} when passing it to makes in - subdirectories - - 7/1 - --- -Makefile.in - - don't pass INSTALL_DATA to a make in the `doc' subdirectory; let - autoconf set the value itself in the Makefile - - removed a stray `-' before $(RANLIB) in the `install' recipe - -doc/Makefile.in - - add a VPATH assignment so the documentation is not remade if it's - already up-to-date in the distribution - -configure.in - - call AC_SUBST(LOCAL_LDFLAGS), since Makefile.in contains - @LOCAL_LDFLAGS@ - - 7/9 - --- - -config.h.in - - add define lines for STRUCT_WINSIZE_IN_SYS_IOCTL and - STRUCT_WINSIZE_IN_TERMIOS - -configure.in - - call BASH_STRUCT_WINSIZE to look for the definition of - `struct winsize' - - 7/17 - ---- -configure.in - - call AC_MINIX - -config.h.in - - add define line for AC_MINIX - - 7/18 - ---- -Makefile.in - - add `install-shared' and `uninstall-shared' targets - - 8/4 - --- -Makefile.in - - install and uninstall libhistory.a in the `install' and - `uninstall' targets - - 9/4 - --- -configure.in - - bumped LIBVERSION up to 2.1.1, indicating that this is patch - level 1 to release 2.1 - - - 9/16 - ---- -Makefile.in - - `make distclean' now descends into the `examples' subdir - -doc/Makefile.in - - the `distclean' and `maintainer-clean' targets should remove - Makefile - -examples/Makefile.in - - added the various clean targets - - 4/2 - --- -configure.in - - bumped LIBVERSION up to 2.2 - - 4/18 - ---- -[readline-2.2 released] - - 4/20 - ---- -Makefile.in - - make `libhistory.a' a dependency of `install' - - fixed a typo in the recipe for `install' that copied libreadline.a - to libhistory.old right after installing it - - 4/27 - ---- -doc/Makefile.in - - install {readline,history}.info out of the source directory if - they are not found in the current (build) directory -- only an - issue if the libraries are built in a different directory than - the source directory - - 5/1 - --- -support/shobj-conf - - script from the bash distribution to do shared object and library - configuration - -shlib/Makefile.in - - new directory and makefile to handle building shared versions of - libreadline and libhistory, controlled by support/shobj-conf - - 5/7 - --- -doc/Makefile.in - - set SHELL to /bin/sh, rather than relying on make to be correct - - 5/14 - ---- -savestring.c - - new file, moved from shell.c, for backwards compatibility - -Makefile.in, shlib/Makefile.in - - make sure savestring.c is compiled and added to libreadline and - libhistory - -[THERE ARE NO MORE #ifdef SHELL LINES IN THE C SOURCE FILES.] - - 5/15 - ---- -README - - updated description of shared library creation for the new scheme - -[THERE ARE NO MORE #ifdef SHELL LINES IN ANY OF THE SOURCE FILES.] - -Makefile.in - - bumped SHLIB_MAJOR up to 4 since we've augmented the library - API - - rlconf.h is now one of the installed headers, so applications can - find out whether things like vi-mode are available in the installed - libreadline - - 5/20 - ---- -configure.in - - changed RL_LIBRARY_VERSION to 4.0 to match the version of the - installed shared libraries - - 6/5 - --- -rlstdc.h - - new file - -Makefile.in - - rlstdc.h is now one of the installed headers - - 8/3 - --- -shlib/Makefile.in - - made the suffix rule that creates xx.so from xx.c write the - compiler output to `a.o', which is then mv'd to xx.so, because - some compilers (Sun WSpro 4.2, for example) don't allow any - suffixes other than `.o' for `cc -c' (not even `a.out') - - 9/15 - ---- - -Makefile.in - - AR and ARFLAGS are now substituted by configure, used in recipes - that build the libraries - -configure.in - - use AC_CHECK_PROG to check for ar - - set ARFLAGS if it has not already been set in the environment - - 10/5 - ---- -Makefile.in - - removed savestring.o from object file list - - 10/28 - ----- -shlib/Makefile.in - - don't use a fixed filename in the .c.so suffix rule to avoid - problems with parallel makes - - 12/21 - ----- -support/shlib-install - - new script to install shared readline and history libraries - -shlib/Makefile.in - - changed to call shlib-install for install and uninstall targets - -[readline-4.0-beta1 frozen] - - 12/22 - ----- -configure.in - - call AC_SUBST for SHOBJ_XLDFLAGS and SHLIB_LIBS - -shlib/Makefile.in - - SHOBJ_XLDFLAGS and SHLIB_LIBS are now substituted by configure - - add $(SHLIB_LIBS) at end of command line that builds the shared - libraries (currently needed only by AIX 4.2) - - 12/31 - ----- -MANIFEST, MANIFEST.doc - - the TOC html files are no longer generated and no longer part of - the distribution - - 2/18/1999 - --------- -configure.in - - set MAKE_SHELL to /bin/sh and substitute into the Makefiles - -Makefile.in,{doc,examples,shlib}/Makefile.in - - set SHELL from @MAKE_SHELL@ - -[readline-4.0 released] - - 3/11 - ---- -doc/Makefile.in - - removed references to HTMLTOC, since separate HTML table-of-contents - files are no longer created - -examples/Makefile.in - - remove `*.exe' in clean target for MS-DOS - -Makefile.in - - make `readline' target depend on ./libreadline.a - - configure now substitutes TERMCAP_LIB into Makefile.in - - use ${TERMCAP_LIB} instead of -ltermcap in recipe for `readline' - - clean target now removes readline and readline.exe in case they - get built - -configure.in - - use `pwd.exe' to set BUILD_DIR on MS-DOS DJGPP - - 3/15 - ---- -support/shlib-install - - Irix 5.x and Irix 6.x should install shared libraries like Solaris 2 - - changes for installing on hp-ux 1[01].x - - 3/23 - ---- -configure.in - - make sure that the $CC argument to shobj-conf is quoted - - 4/8 - --- - -xmalloc.h, rlprivate.h, rlshell.h - - new files - -Makefile.in,shlib/Makefile.in - - add dependencies on xmalloc.h, rlshell.h - - add xmalloc.h, rlprivate.h, rlshell.h to list of header files - -MANIFEST - - add xmalloc.h, rlprivate.h, rlshell.h - - 4/9 - --- -Makefile.in,shlib/Makefile.in - - add dependencies on rlprivate.h - - 4/13 - ---- -doc/Makefile.in - - add variable, PSDVI, which is the desired resolution of the - generated postscript files. Set to 300 because I don't have - any 600-dpi printers - - set LANGUAGE= before calling makeinfo, so messages are in English - - add rluserman.{info,dvi,ps,html} to appropriate variables - - add rules to create rluserman.{info,dvi,ps,html} - - install and uninstall rluserman.info, but don't update the directory - file in $(infodir) yet - -MANIFEST - - add doc/rluserman.{texinfo,info,dvi,ps,html} - - 4/30 - ---- -configure.in - - updated library version to 4.1 - - 5/3 - --- -configure.in - - SHLIB_MAJOR and SHLIB_MINOR shared library version numbers are - constructed from $LIBRARY_VERSION and substituted into Makefiles - - 5/5 - --- -support/shlib-install - - OSF/1 installs shared libraries like Solaris - -Makefile.in - - broke the header file install and uninstall into two new targets: - install-headers and uninstall-headers - - install and uninstall depend on install-headers and uninstall-headers - respectively - - changed install-shared and uninstall-shared targets to depend on - install-headers and uninstall-headers, respectively, so users may - choose to install only the shared libraries. I'm not sure about - the uninstall one yet -- maybe it should check whether or not - the static libraries are installed and not remove the header files - if they are - - 9/3 - --- -configure.in, config.h.in - - added test for memmove (for later use) - - changed version to 4.1-beta1 - - 9/13 - ---- -examples/rlfe.c - - Per Bothner's `rlfe' readline front-end program - -examples/Makefile.in - - added rules to build rlfe - - 9/21 - ---- -support/shlib-install - - changes to handle FreeBSD-3.x elf or a.out shared libraries, which - have different semantics and need different naming conventions - - 1/24/2000 - --------- -doc/Makefile.in - - remove *.bt and *.bts on `make clean' - - 2/4 - --- - - -configure.in - - changed LIBVERSION to 4.1-beta5 - - 3/17/2000 - --------- -[readline-4.1 released] - - 3/23 - ---- -Makefile.in - - remove the `-t' argument to ranlib in the install recipe; some - ranlibs don't have it and attempt to create a file named `-t' - - 3/27 - ---- -support/shlib-install - - install shared libraries unwritable by anyone on HP-UX - - changed symlinks to relative pathnames on all platforms - -shlib/Makefile.in - - added missing `includedir' assignment, substituted by configure - -Makefile.in - - added missing @SET_MAKE@ so configure can set $MAKE appropriately - -configure.in - - add call to AC_PROG_MAKE_SET - - 8/30 - ---- -shlib/Makefile.in - - change the soname bound into the shared libraries, so it includes - only the major version number. If it includes the minor version, - programs depending on it must be rebuilt (which may or may not be - a bad thing) - - 9/6 - --- -examples/rlfe.c - - add -l option to log input and output (-a option appends to logfile) - - add -n option to set readline application name - - add -v, -h options for version and help information - - change a few things because getopt() is now used to parse arguments - - 9/12 - ---- -support/shlib-install - - fix up the libname on HPUX 11 - - 10/18 - ----- -configure.in - - changed library version to 4.2-alpha - - 10/30 - ----- -configure.in - - add -fsigned-char to LOCAL_CFLAGS for Linux running on the IBM - S/390 - -Makefile.in - - added new file, rltypedefs.h, installed by default with `make install' - - 11/2 - ---- -compat.c - - new file, with backwards-compatibility function definitions - -Makefile.in,shlib/Makefile.in - - make sure that compat.o/compat.so are built and linked apppropriately - -support/shobj-conf - - picked up bash version, which means that shared libs built on - linux and BSD/OS 4.x will have an soname that does not include - the minor version number - - 11/13 - ----- -examples/rlfe.c - - rlfe can perform filename completion for relative pathnames in the - inferior process's context if the OS supports /proc/PID/cwd (linux - does it OK, Solaris is slightly warped, none of the BSDs have it) - - 11/17/2000 - ---------- -[readline-4.2-alpha released] - - 11/27 - ----- -Makefile.in,shlib/Makefile.in - - added dependencies for rltypedefs.h - -shlib/Makefile.in - - changed dependencies on histlib.h to $(topdir)/histlib.h - - 1/22 - ---- -configure.in - - changed release version to 4.2-beta - - 2/2 - --- -examples/Makefile.in - - build histexamp as part of the examples - - 2/5 - --- -doc/Makefile.in - - don't remove the dvi, postscript, html, info, and text `objects' - on a `make distclean', only on a `make maintainer-clean' - - 3/6 - --- -doc/history.{0,3}, doc/history_3.ps - - new manual page for history library - -doc/Makefile.in - - rules to install and uninstall history.3 in ${man3dir} - - rules to build history.0 and history_3.ps - - 4/2 - --- -configure.in - - changed LIBVERSION to `4.2' - - 4/5 - --- -[readline-4.2 frozen] - - 4/9 - --- -[readline-4.2 released] - - 5/2 - --- -Makefile.in,{doc,examples,shlib}/Makefile.in - - added support for DESTDIR installation root prefix, to support - building packages - -doc/Makefile.in - - add an info `dir' file entry for rluserman.info on `make install' - - change man1ext to `.1' and man3ext to `.3' - - install man pages with a $(man3ext) extension in the target directory - - add support for installing html documentation if `htmldir' has a - value - -Makefile.in - - on `make install', install from the `shlib' directory, too - - on `make uninstall', uninstall in the `doc' and `shlib' - subdirectories, too - -support/shlib-install - - add `freebsdelf*', `freebsdaout*', Hurd, `sysv4*', `sysv5*', `dgux*' - targets for symlink creation - - 5/7 - --- -configure.in, config.h.in - - check for , define HAVE_LIMITS_H if found - - 5/8 - --- -aclocal.m4 - - pick up change to BASH_CHECK_LIB_TERMCAP that adds check for - libtinfo (termcap-specific portion of ncurses-5.2) - - 5/9 - --- -configure.in - - call AC_C_CONST to find out whether or not the compiler supports - `const' - -config.h.in - - placeholder for `const' define, if any - - 5/10 - ---- -configure.in - - fix AC_CHECK_PROG(ar, ...) test to specify right value for the - case where ar is not found; should produce a better error message - - 5/14 - ---- -configure.in,config.h.in - - check for vsnprintf, define HAVE_VSNPRINTF if found - - 5/21 - ---- -configure.in, config.h.in - - add checks for size_t, ssize_t - - 5/30 - ---- -configure.in - - update autoconf to version 2.50, use in AC_PREREQ - - changed AC_INIT to new flavor - - added AC_CONFIG_SRCDIR - - AC_CONFIG_HEADER -> AC_CONFIG_HEADERS - - call AC_C_PROTOTYPES - - AC_RETSIGTYPE -> AC_TYPE_SIGNAL - - 8/22 - ---- -configure.in - - updated the version number to 4.2a - -Makefile.in,shlib/Makefile.in - - make sure tilde.o is built -DREADLINE_LIBRARY when being built as - part of the standalone library, so it picks up the right include - files - - 8/23 - ---- -support/shlib-install - - support for Darwin/MacOS X shared library installation - - 9/24 - ---- -examples/readlinebuf.h - - a new file, a C++ streambuf interface that uses readline for I/O. - Donated by Dimitris Vyzovitis - - 10/9 - ---- -configure.in - - replaced call to BASH_HAVE_TIOCGWINSZ with AC_HEADER_TIOCGWINSZ - -[readline-4.2a-beta1 frozen] - - 10/15 - ----- -configure.in, config.h.in - - check for , define HAVE_MEMORY_H if found - - check for , define HAVE_STRINGS_H if found - - 10/18 - ----- -configure.in, config.h.in - - check for isascii, define HAVE_ISASCII if found - -configure.in - - changed the macro names from bash as appropriate: - BASH_SIGNAL_CHECK -> BASH_SYS_SIGNAL_VINTAGE - BASH_REINSTALL_SIGHANDLERS -> BASH_SYS_REINSTALL_SIGHANDLERS - BASH_MISC_SPEED_T -> BASH_CHECK_SPEED_T - - 10/22 - ----- -configure.in - - check for isxdigit with AC_CHECK_FUNCS - -config.h.in - - new define for HAVE_ISXDIGIT - - 10/29 - ----- -configure.in, config.h.in - - check for strpbrk with AC_CHECK_FUNCS, define HAVE_STRPBRK if found - - 11/1 - ---- -Makefile.in - - make sure DESTDIR is passed to install and uninstall makes in - subdirectories - - when saving old copies of installed libraries, make sure we use - DESTDIR for the old installation tree - -[readline-4.2a-rc1 frozen] - - 11/2 - ---- -Makefile.in, shlib/Makefile.in - - don't put -I$(includedir) into CFLAGS - - 11/15 - ----- -[readline-4.2a released] - - 11/20 - ----- -examples/rlcat.c - - new file - -examples/Makefile.in - - changes for rlcat - - 11/28 - ----- -configure.in - - default TERMCAP_LIB to -lcurses if $prefer_curses == yes (as when - --with-curses is supplied) - -examples/Makefile.in - - substitute @LDFLAGS@ in LDFLAGS assignment - - 11/29 - ----- -config.h.in - - add necessary defines for multibyte include files and functions - - add code to define HANDLE_MULTIBYTE if prerequisites are met - -configure.in - - call BASH_CHECK_MULTIBYTE - - 12/14 - ----- -config.h.in - - add #undef PROTOTYPES, filled in by AC_C_PROTOTYPES - - 12/17 - ----- -config.h.in - - moved HANDLE_MULTIBYTE code to rlmbutil.h - -rlmbutil.h, mbutil.c - - new files - -Makefile.in, shlib/Makefile.in - - added rules for mbutil.c - - 12/20 - ----- -configure.in - - added --enable-shared, --enable-static options to configure to - say which libraries are built by default (both default to yes) - - if SHLIB_STATUS == 'unsupported', turn off default shared library - building - - substitute new STATIC_TARGET, SHARED_TARGET, STATIC_INSTALL_TARGET, - and SHARED_INSTALL_TARGET - -Makefile.in - - `all' target now depends on (substituted) @STATIC_TARGET@ and - @SHARED_TARGET@ - - `install' target now depends on (substituted) @STATIC_INSTALL_TARGET@ - and @SHARED_INSTALL_TARGET@ - -INSTALL, README - - updated with new info about --enable-shared and --enable-static - - 1/10/2002 - --------- -configure.in - - bumped the library version number to 4.3 - - 1/24 - ---- -Makefile.in,shlib/Makefile.in - - changes for new file, text.c, with character and text handling - functions from readline.c - - 2/20 - ---- -{configure.config.h}.in - - call AC_C_CHAR_UNSIGNED, define __CHAR_UNSIGNED__ if chars are - unsigned by default - - 5/20 - ---- -doc/Makefile.in - - new maybe-clean target that removes the generated documentation if - the build directory differs from the source directory - - distclean target now depends on maybe-clean - - 7/17 - ---- -[readline-4.3 released] - - 7/18 - ---- -shlib/Makefile.in - - fix bad dependency: text.so: terminal.c, make it depend on text.c - - 8/7 - --- -support/shlib-install - - break `linux' out into its own stanza: it seems that linux - distributions are all moving to the following scheme: - - libreadline.so.4.3 installed version - libreadline.so.4 -> libreadline.so.4.3 symlink - libreadline.so -> libreadline.so.4 symlink - - 10/29 - ----- -support/shlib-install - - change INSTALL_LINK[12] to use `&&' instead of `;' so it only - tries the link if the cd succeeds; put ${echo} in there, too - - use $LN instead of `ln -s' so it works on machines without symlinks - - change special linux stanza to use cd before ln also - - change to use $INSTALL_LINK1 and $INSTALL_LINK2 appropriately - instead of explicit commands in various stanzas - - 2/1 - --- -config.h.in - - add HAVE_MBRTOWC and HAVE_MBRLEN - - add NO_MULTIBYTE_SUPPORT for new configure argument - - add STDC_HEADERS - -configure.in - - new argument --enable-multibyte (enabled by default), allows - multibyte support to be turned off even on systems that support it - - add check for ansi stdc headers with call to AC_HEADER_STDC - - 2/3 - --- -configure.in - - add call to BASH_FUNC_CTYPE_NONASCII - -config.h.in - - add CTYPE_NON_ASCII - - 2/20 - ---- - -doc/manvers.texinfo - - renamed to version.texi to match other GNU software - - UPDATE-MONTH variable is now `UPDATED-MONTH' - -doc/{hist,rlman,rluserman}.texinfo - - include version.texi - -doc/{rltech,rluser,hstech,hsuser}.texi - - changed the suffix from `texinfo' to `texi' - -doc/Makefile.in - - made appropriate changes for {{rl,hs}tech,{rl,hs}user}.texi - -doc/{rlman,rluserman}.texinfo - - changed the suffix from `texinfo' to `texi' - -doc/hist.texinfo - - renamed to history.texi to be more consistent - - 6/11 - ---- -shlib/Makefile.in - - have configure substitute value of `@LDFLAGS@' into the assignment - to SHLIB_XLDFLAGS - - 6/16 - ---- -configure.in - - readline and history libraries are now at version 5.0 - - 8/18 - ---- -support/shlib-install - - support for FreeBSD-gnu (from Robert Millan) - - 12/4 - ---- -Makefile.in - - add variables for localedir and the PACKAGE_* variables, auto-set - by configure - - 12/9 - ---- -Makefile.in - - use mkinstalldirs instead of mkdirs - - 4/22 - ---- -Makefile.in - - separate doc install/uninstall out into two new targets: - install-doc and uninstall-doc - - make install-doc and uninstall-doc prerequisites of appropriate - install and uninstall targets - -examples/rl-fgets.c - - new example from Harold Levy that wraps fgets replacement functions - that call readline in a shared library that can be interposed with - LD_PRELOAD diff --git a/dep/src/readline/CHANGES b/dep/src/readline/CHANGES deleted file mode 100644 index 0c8450da47f..00000000000 --- a/dep/src/readline/CHANGES +++ /dev/null @@ -1,792 +0,0 @@ -This document details the changes between this version, readline-5.0, -and the previous version, readline-4.3. - -1. Changes to Readline - -a. Fixes to avoid core dumps because of null pointer references in the - multibyte character code. - -b. Fix to avoid infinite recursion caused by certain key combinations. - -c. Fixed a bug that caused the vi-mode `last command' to be set incorrectly. - -d. Readline no longer tries to read ahead more than one line of input, even - when more is available. - -e. Fixed the code that adjusts the point to not mishandle null wide - characters. - -f. Fixed a bug in the history expansion `g' modifier that caused it to skip - every other match. - -g. Fixed a bug that caused the prompt to overwrite previous output when the - output doesn't contain a newline and the locale supports multibyte - characters. This same change fixes the problem of readline redisplay - slowing down dramatically as the line gets longer in multibyte locales. - -h. History traversal with arrow keys in vi insertion mode causes the cursor - to be placed at the end of the new line, like in emacs mode. - -i. The locale initialization code does a better job of using the right - precedence and defaulting when checking the appropriate environment - variables. - -j. Fixed the history word tokenizer to handle <( and >( better when used as - part of bash. - -k. The overwrite mode code received several bug fixes to improve undo. - -l. Many speedups to the multibyte character redisplay code. - -m. The callback character reading interface should not hang waiting to read - keyboard input. - -n. Fixed a bug with redoing vi-mode `s' command. - -o. The code that initializes the terminal tracks changes made to the terminal - special characters with stty(1) (or equivalent), so that these changes - are reflected in the readline bindings. New application-callable function - to make it work: rl_tty_unset_default_bindings(). - -p. Fixed a bug that could cause garbage to be inserted in the buffer when - changing character case in vi mode when using a multibyte locale. - -q. Fixed a bug in the redisplay code that caused problems on systems - supporting multibyte characters when moving between history lines when the - new line has more glyphs but fewer bytes. - -r. Undo and redo now work better after exiting vi insertion mode. - -s. Make sure system calls are restarted after a SIGWINCH is received using - SA_RESTART. - -t. Improvements to the code that displays possible completions when using - multibyte characters. - -u. Fixed a problem when parsing nested if statements in inputrc files. - -v. The completer now takes multibyte characters into account when looking for - quoted substrings on which to perform completion. - -w. The history search functions now perform better bounds checking on the - history list. - -x. Change to history expansion functions to treat `^' as equivalent to word - one, as the documention states. - -y. Some changes to the display code to improve display and redisplay of - multibyte characters. - -z. Changes to speed up the multibyte character redisplay code. - -aa. Fixed a bug in the vi-mode `E' command that caused it to skip over the - last character of a word if invoked while point was on the word's - next-to-last character. - -bb. Fixed a bug that could cause incorrect filename quoting when - case-insensitive completion was enabled and the word being completed - contained backslashes quoting word break characters. - -cc. Fixed a bug in redisplay triggered when the prompt string contains - invisible characters. - -dd. Fixed some display (and other) bugs encountered in multibyte locales - when a non-ascii character was the last character on a line. - -ee. Fixed some display bugs caused by multibyte characters in prompt strings. - -ff. Fixed a problem with history expansion caused by non-whitespace characters - used as history word delimiters. - -gg. Fixed a problem that could cause readline to refer to freed memory when - moving between history lines while doing searches. - -hh. Improvements to the code that expands and displays prompt strings - containing multibyte characters. - -ii. Fixed a problem with vi-mode not correctly remembering the numeric argument - to the last `c'hange command for later use with `.'. - -jj. Fixed a bug in vi-mode that caused multi-digit count arguments to work - incorrectly. - -kk. Fixed a problem in vi-mode that caused the last text modification command - to not be remembered across different command lines. - -ll. Fixed problems with changing characters and changing case at the end of - the line. - -mm. Fixed a problem with readline saving the contents of the current line - before beginning a non-interactive search. - -nn. Fixed a problem with EOF detection when using rl_event_hook. - -oo. Fixed a problem with the vi mode `p' and `P' commands ignoring numeric - arguments. - -2. New Features in Readline - -a. History expansion has a new `a' modifier equivalent to the `g' modifier - for compatibility with the BSD csh. - -b. History expansion has a new `G' modifier equivalent to the BSD csh `g' - modifier, which performs a substitution once per word. - -c. All non-incremental search operations may now undo the operation of - replacing the current line with the history line. - -d. The text inserted by an `a' command in vi mode can be reinserted with - `.'. - -e. New bindable variable, `show-all-if-unmodified'. If set, the readline - completer will list possible completions immediately if there is more - than one completion and partial completion cannot be performed. - -f. There is a new application-callable `free_history_entry()' function. - -g. History list entries now contain timestamp information; the history file - functions know how to read and write timestamp information associated - with each entry. - -h. Four new key binding functions have been added: - - rl_bind_key_if_unbound() - rl_bind_key_if_unbound_in_map() - rl_bind_keyseq_if_unbound() - rl_bind_keyseq_if_unbound_in_map() - -i. New application variable, rl_completion_quote_character, set to any - quote character readline finds before it calls the application completion - function. - -j. New application variable, rl_completion_suppress_quote, settable by an - application completion function. If set to non-zero, readline does not - attempt to append a closing quote to a completed word. - -k. New application variable, rl_completion_found_quote, set to a non-zero - value if readline determines that the word to be completed is quoted. - Set before readline calls any application completion function. - -l. New function hook, rl_completion_word_break_hook, called when readline - needs to break a line into words when completion is attempted. Allows - the word break characters to vary based on position in the line. - -m. New bindable command: unix-filename-rubout. Does the same thing as - unix-word-rubout, but adds `/' to the set of word delimiters. - -n. When listing completions, directories have a `/' appended if the - `mark-directories' option has been enabled. - -------------------------------------------------------------------------------- -This document details the changes between this version, readline-4.3, -and the previous version, readline-4.2a. - -1. Changes to Readline - -a. Fixed output of comment-begin character when listing variable values. - -b. Added some default key bindings for common escape sequences produced by - HOME and END keys. - -c. Fixed the mark handling code to be more emacs-compatible. - -d. A bug was fixed in the code that prints possible completions to keep it - from printing empty strings in certain circumstances. - -e. Change the key sequence printing code to print ESC as M\- if ESC is a - meta-prefix character -- it's easier for users to understand than \e. - -f. Fixed unstifle_history() to return values that match the documentation. - -g. Fixed the event loop (rl_event_hook) to handle the case where the input - file descriptor is invalidated. - -h. Fixed the prompt display code to work better when the application has a - custom redisplay function. - -i. Changes to make reading and writing the history file a little faster, and - to cope with huge history files without calling abort(3) from xmalloc. - -j. The vi-mode `S' and `s' commands are now undone correctly. - -k. Fixed a problem which caused the display to be messed up when the last - line of a multi-line prompt (possibly containing invisible characters) - was longer than the screen width. - -2. New Features in Readline - -a. Support for key `subsequences': allows, e.g., ESC and ESC-a to both - be bound to readline functions. Now the arrow keys may be used in vi - insert mode. - -b. When listing completions, and the number of lines displayed is more than - the screen length, readline uses an internal pager to display the results. - This is controlled by the `page-completions' variable (default on). - -c. New code to handle editing and displaying multibyte characters. - -d. The behavior introduced in bash-2.05a of deciding whether or not to - append a slash to a completed name that is a symlink to a directory has - been made optional, controlled by the `mark-symlinked-directories' - variable (default is the 2.05a behavior). - -e. The `insert-comment' command now acts as a toggle if given a numeric - argument: if the first characters on the line don't specify a - comment, insert one; if they do, delete the comment text - -f. New application-settable completion variable: - rl_completion_mark_symlink_dirs, allows an application's completion - function to temporarily override the user's preference for appending - slashes to names which are symlinks to directories. - -g. New function available to application completion functions: - rl_completion_mode, to tell how the completion function was invoked - and decide which argument to supply to rl_complete_internal (to list - completions, etc.). - -h. Readline now has an overwrite mode, toggled by the `overwrite-mode' - bindable command, which could be bound to `Insert'. - -i. New application-settable completion variable: - rl_completion_suppress_append, inhibits appending of - rl_completion_append_character to completed words. - -j. New key bindings when reading an incremental search string: ^W yanks - the currently-matched word out of the current line into the search - string; ^Y yanks the rest of the current line into the search string, - DEL or ^H deletes characters from the search string. - -------------------------------------------------------------------------------- -This document details the changes between this version, readline-4.2a, -and the previous version, readline-4.2. - -1. Changes to Readline - -a. More `const' and type casting fixes. - -b. Changed rl_message() to use vsnprintf(3) (if available) to fix buffer - overflow problems. - -c. The completion code no longer appends a `/' or ` ' to a match when - completing a symbolic link that resolves to a directory name, unless - the match does not add anything to the word being completed. This - means that a tab will complete the word up to the full name, but not - add anything, and a subsequent tab will add a slash. - -d. Fixed a trivial typo that made the vi-mode `dT' command not work. - -e. Fixed the tty code so that ^S and ^Q can be inserted with rl_quoted_insert. - -f. Fixed the tty code so that ^V works more than once. - -g. Changed the use of __P((...)) for function prototypes to PARAMS((...)) - because the use of __P in typedefs conflicted g++ and glibc. - -h. The completion code now attempts to do a better job of preserving the - case of the word the user typed if ignoring case in completions. - -i. Readline defaults to not echoing the input and lets the terminal - initialization code enable echoing if there is a controlling terminal. - -j. The key binding code now processes only two hex digits after a `\x' - escape sequence, and the documentation was changed to note that the - octal and hex escape sequences result in an eight-bit value rather - than strict ASCII. - -k. Fixed a few places where negative array subscripts could have occurred. - -l. Fixed the vi-mode code to use a better method to determine the bounds of - the array used to hold the marks, and to avoid out-of-bounds references. - -m. Fixed the defines in chardefs.h to work better when chars are signed. - -n. Fixed configure.in to use the new names for bash autoconf macros. - -o. Readline no longer attempts to define its own versions of some ctype - macros if they are implemented as functions in libc but not as macros in - . - -p. Fixed a problem where rl_backward could possibly set point to before - the beginning of the line. - -q. Fixed Makefile to not put -I/usr/include into CFLAGS, since it can cause - include file problems. - -2. New Features in Readline - -a. Added extern declaration for rl_get_termcap to readline.h, making it a - public function (it was always there, just not in readline.h). - -b. New #defines in readline.h: RL_READLINE_VERSION, currently 0x0402, - RL_VERSION_MAJOR, currently 4, and RL_VERSION_MINOR, currently 2. - -c. New readline variable: rl_readline_version, mirrors RL_READLINE_VERSION. - -d. New bindable boolean readline variable: match-hidden-files. Controls - completion of files beginning with a `.' (on Unix). Enabled by default. - -e. The history expansion code now allows any character to terminate a - `:first-' modifier, like csh. - -f. The incremental search code remembers the last search string and uses - it if ^R^R is typed without a search string. - -h. New bindable variable `history-preserve-point'. If set, the history - code attempts to place the user at the same location on each history - line retrived with previous-history or next-history. - -------------------------------------------------------------------------------- -This document details the changes between this version, readline-4.2, -and the previous version, readline-4.1. - -1. Changes to Readline - -a. When setting the terminal attributes on systems using `struct termio', - readline waits for output to drain before changing the attributes. - -b. A fix was made to the history word tokenization code to avoid attempts to - dereference a null pointer. - -c. Readline now defaults rl_terminal_name to $TERM if the calling application - has left it unset, and tries to initialize with the resultant value. - -d. Instead of calling (*rl_getc_function)() directly to get input in certain - places, readline now calls rl_read_key() consistently. - -e. Fixed a bug in the completion code that allowed a backslash to quote a - single quote inside a single-quoted string. - -f. rl_prompt is no longer assigned directly from the argument to readline(), - but uses memory allocated by readline. This allows constant strings to - be passed to readline without problems arising when the prompt processing - code wants to modify the string. - -g. Fixed a bug that caused non-interactive history searches to return the - wrong line when performing multiple searches backward for the same string. - -h. Many variables, function arguments, and function return values are now - declared `const' where appropriate, to improve behavior when linking with - C++ code. - -i. The control character detection code now works better on systems where - `char' is unsigned by default. - -j. The vi-mode numeric argument is now capped at 999999, just like emacs mode. - -k. The Function, CPFunction, CPPFunction, and VFunction typedefs have been - replaced with a set of specific prototyped typedefs, though they are - still in the readline header files for backwards compatibility. - -m. Nearly all of the (undocumented) internal global variables in the library - now have an _rl_ prefix -- there were a number that did not, like - screenheight, screenwidth, alphabetic, etc. - -n. The ding() convenience function has been renamed to rl_ding(), though the - old function is still defined for backwards compatibility. - -o. The completion convenience functions filename_completion_function, - username_completion_function, and completion_matches now have an rl_ - prefix, though the old names are still defined for backwards compatibility. - -p. The functions shared by readline and bash (linkage is satisfied from bash - when compiling with bash, and internally otherwise) now have an sh_ prefix. - -q. Changed the shared library creation procedure on Linux and BSD/OS 4.x so - that the `soname' contains only the major version number rather than the - major and minor numbers. - -r. Fixed a redisplay bug that occurred when the prompt spanned more than one - physical line and contained invisible characters. - -s. Added a missing `includedir' variable to the Makefile. - -t. When installing the shared libraries, make sure symbolic links are relative. - -u. Added configure test so that it can set `${MAKE}' appropriately. - -v. Fixed a bug in rl_forward that could cause the point to be set to before - the beginning of the line in vi mode. - -w. Fixed a bug in the callback read-char interface to make it work when a - readline function pushes some input onto the input stream with - rl_execute_next (like the incremental search functions). - -x. Fixed a file descriptor leak in the history file manipulation code that - was tripped when attempting to truncate a non-regular file (like - /dev/null). - -y. Changes to make all of the exported readline functions declared in - readline.h have an rl_ prefix (rltty_set_default_bindings is now - rl_tty_set_default_bindings, crlf is now rl_crlf, etc.) - -z. The formatted documentation included in the base readline distribution - is no longer removed on a `make distclean'. - -aa. Some changes were made to avoid gcc warnings with -Wall. - -bb. rl_get_keymap_by_name now finds keymaps case-insensitively, so - `set keymap EMACS' works. - -cc. The history file writing and truncation functions now return a useful - status on error. - -dd. Fixed a bug that could cause applications to dereference a NULL pointer - if a NULL second argument was passed to history_expand(). - -ee. If a hook function assigned to rl_event_hook sets rl_done to a non-zero - value, rl_read_key() now immediately returns '\n' (which is assumed to - be bound to accept-line). - -2. New Features in Readline - -a. The blink timeout for paren matching is now settable by applications, - via the rl_set_paren_blink_timeout() function. - -b. _rl_executing_macro has been renamed to rl_executing_macro, which means - it's now part of the public interface. - -c. Readline has a new variable, rl_readline_state, which is a bitmap that - encapsulates the current state of the library; intended for use by - callbacks and hook functions. - -d. rlfe has a new -l option to log input and output (-a appends to logfile), - a new -n option to set the readline application name, and -v and -h - options for version and help information. - -e. rlfe can now perform filename completion for the inferior process if the - OS has a /proc//cwd that can be read with readlink(2) to get the - inferior's current working directory. - -f. A new file, rltypedefs.h, contains the new typedefs for function pointers - and is installed by `make install'. - -g. New application-callable function rl_set_prompt(const char *prompt): - expands its prompt string argument and sets rl_prompt to the result. - -h. New application-callable function rl_set_screen_size(int rows, int cols): - public method for applications to set readline's idea of the screen - dimensions. - -i. The history example program (examples/histexamp.c) is now built as one - of the examples. - -j. The documentation has been updated to cover nearly all of the public - functions and variables declared in readline.h. - -k. New function, rl_get_screen_size (int *rows, int *columns), returns - readline's idea of the screen dimensions. - -l. The timeout in rl_gather_tyi (readline keyboard input polling function) - is now settable via a function (rl_set_keyboard_input_timeout()). - -m. Renamed the max_input_history variable to history_max_entries; the old - variable is maintained for backwards compatibility. - -n. The list of characters that separate words for the history tokenizer is - now settable with a variable: history_word_delimiters. The default - value is as before. - -o. There is a new history.3 manual page documenting the history library. - -------------------------------------------------------------------------------- -This document details the changes between this version, readline-4.1, -and the previous version, readline-4.0. - -1. Changes to Readline - -a. Changed the HTML documents so that the table-of-contents is no longer - a separate file. - -b. Changes to the shared object configuration for: Irix 5.x, Irix 6.x, - OSF/1. - -c. The shared library major and minor versions are now constructed - automatically by configure and substituted into the makefiles. - -d. It's now possible to install the shared libraries separately from the - static libraries. - -e. The history library tries to truncate the history file only if it is a - regular file. - -f. A bug that caused _rl_dispatch to address negative array indices on - systems with signed chars was fixed. - -g. rl-yank-nth-arg now leaves the history position the same as when it was - called. - -h. Changes to the completion code to handle MS-DOS drive-letter:pathname - filenames. - -i. Completion is now case-insensitive by default on MS-DOS. - -j. Fixes to the history file manipulation code for MS-DOS. - -k. Readline attempts to bind the arrow keys to appropriate defaults on MS-DOS. - -l. Some fixes were made to the redisplay code for better operation on MS-DOS. - -m. The quoted-insert code will now insert tty special chars like ^C. - -n. A bug was fixed that caused the display code to reference memory before - the start of the prompt string. - -o. More support for __EMX__ (OS/2). - -p. A bug was fixed in readline's signal handling that could cause infinite - recursion in signal handlers. - -q. A bug was fixed that caused the point to be less than zero when rl_forward - was given a very large numeric argument. - -r. The vi-mode code now gets characters via the application-settable value - of rl_getc_function rather than calling rl_getc directly. - -s. The history file code now uses O_BINARY mode when reading and writing - the history file on cygwin32. - -t. Fixed a bug in the redisplay code for lines with more than 256 line - breaks. - -u. A bug was fixed which caused invisible character markers to not be - stripped from the prompt string if the terminal was in no-echo mode. - -v. Readline no longer tries to get the variables it needs for redisplay - from the termcap entry if the calling application has specified its - own redisplay function. Readline treats the terminal as `dumb' in - this case. - -w. Fixes to the SIGWINCH code so that a multiple-line prompt with escape - sequences is redrawn correctly. - -x. Changes to the install and install-shared targets so that the libraries - and header files are installed separately. - -2. New Features in Readline - -a. A new Readline `user manual' is in doc/rluserman.texinfo. - -b. Parentheses matching is now always compiled into readline, and enabled - or disabled when the value of the `blink-matching-paren' variable is - changed. - -c. MS-DOS systems now use ~/_inputrc as the last-ditch inputrc filename. - -d. MS-DOS systems now use ~/_history as the default history file. - -e. history-search-{forward,backward} now leave the point at the end of the - line when the string to search for is empty, like - {reverse,forward}-search-history. - -f. history-search-{forward,backward} now leave the last history line found - in the readline buffer if the second or subsequent search fails. - -g. New function for use by applications: rl_on_new_line_with_prompt, used - when an application displays the prompt itself before calling readline(). - -h. New variable for use by applications: rl_already_prompted. An application - that displays the prompt itself before calling readline() must set this to - a non-zero value. - -i. A new variable, rl_gnu_readline_p, always 1. The intent is that an - application can verify whether or not it is linked with the `real' - readline library or some substitute. - -j. Per Bothner's `rlfe' (pronounced `Ralphie') readline front-end program - is included in the examples subdirectory, though it is not built - by default. - -------------------------------------------------------------------------------- -This document details the changes between this version, readline-4.0, -and the previous version, readline-2.2. - -1. Changes to Readline - -a. The version number is now 4.0, to match the major and minor version - numbers on the shared readline and history libraries. Future - releases will maintain the identical numbering. - -b. Fixed a typo in the `make install' recipe that copied libreadline.a - to libhistory.old right after installing it. - -c. The readline and history info files are now installed out of the source - directory if they are not found in the build directory. - -d. The library no longer exports a function named `savestring' -- backwards - compatibility be damned. - -e. There is no longer any #ifdef SHELL code in the source files. - -f. Some changes were made to the key binding code to fix memory leaks and - better support Win32 systems. - -g. Fixed a silly typo in the paren matching code -- it's microseconds, not - milliseconds. - -h. The readline library should be compilable by C++ compilers. - -i. The readline.h public header file now includes function prototypes for - all readline functions, and some changes were made to fix errors in the - source files uncovered by the use of prototypes. - -j. The maximum numeric argument is now clamped at 1000000. - -k. Fixes to rl_yank_last_arg to make it behave better. - -l. Fixed a bug in the display code that caused core dumps if the prompt - string length exceeded 1024 characters. - -m. The menu completion code was fixed to properly insert a single completion - if there is only one match. - -n. A bug was fixed that caused the display code to improperly display tabs - after newlines. - -o. A fix was made to the completion code in which a typo caused the wrong - value to be passed to the function that computed the longest common - prefix of the list of matches. - -p. The completion code now checks the value of rl_filename_completion_desired, - which is set by application-supplied completion functions to indicate - that filename completion is being performed, to decide whether or not to - call an application-supplied `ignore completions' function. - -q. Code was added to the history library to catch history substitutions - using `&' without a previous history substitution or search having been - performed. - - -2. New Features in Readline - -a. There is a new script, support/shobj-conf, to do system-specific shared - object and library configuration. It generates variables for configure - to substitute into makefiles. The README file provides a detailed - explanation of the shared library creation process. - -b. Shared libraries and objects are now built in the `shlib' subdirectory. - There is a shlib/Makefile.in to control the build process. `make shared' - from the top-level directory is still the right way to build shared - versions of the libraries. - -c. rlconf.h is now installed, so applications can find out which features - have been compiled into the installed readline and history libraries. - -d. rlstdc.h is now an installed header file. - -e. Many changes to the signal handling: - o Readline now catches SIGQUIT and cleans up the tty before returning; - o A new variable, rl_catch_signals, is available to application writers - to indicate to readline whether or not it should install its own - signal handlers for SIGINT, SIGTERM, SIGQUIT, SIGALRM, SIGTSTP, - SIGTTIN, and SIGTTOU; - o A new variable, rl_catch_sigwinch, is available to application - writers to indicate to readline whether or not it should install its - own signal handler for SIGWINCH, which will chain to the calling - applications's SIGWINCH handler, if one is installed; - o There is a new function, rl_free_line_state, for application signal - handlers to call to free up the state associated with the current - line after receiving a signal; - o There is a new function, rl_cleanup_after_signal, to clean up the - display and terminal state after receiving a signal; - o There is a new function, rl_reset_after_signal, to reinitialize the - terminal and display state after an application signal handler - returns and readline continues - -f. There is a new function, rl_resize_terminal, to reset readline's idea of - the screen size after a SIGWINCH. - -g. New public functions: rl_save_prompt and rl_restore_prompt. These were - previously private functions with a `_' prefix. These functions are - used when an application wants to write a message to the `message area' - with rl_message and have the prompt restored correctly when the message - is erased. - -h. New function hook: rl_pre_input_hook, called just before readline starts - reading input, after initialization. - -i. New function hook: rl_display_matches_hook, called when readline would - display the list of completion matches. The new function - rl_display_match_list is what readline uses internally, and is available - for use by application functions called via this hook. - -j. New bindable function, delete-char-or-list, like tcsh. - -k. A new variable, rl_erase_empty_line, which, if set by an application using - readline, will cause readline to erase, prompt and all, lines on which the - only thing typed was a newline. - -l. There is a new script, support/shlib-install, to install and uninstall - the shared readline and history libraries. - -m. A new bindable variable, `isearch-terminators', which is a string - containing the set of characters that should terminate an incremental - search without being executed as a command. - -n. A new bindable function, forward-backward-delete-char. - -------------------------------------------------------------------------------- -This document details the changes between this version, readline-2.2, -and the previous version, readline-2.1. - -1. Changes to Readline - -a. Added a missing `extern' to a declaration in readline.h that kept - readline from compiling cleanly on some systems. - -b. The history file is now opened with mode 0600 when it is written for - better security. - -c. Changes were made to the SIGWINCH handling code so that prompt redisplay - is done better. - -d. ^G now interrupts incremental searches correctly. - -e. A bug that caused a core dump when the set of characters to be quoted - when completing words was empty was fixed. - -f. Fixed a problem in the readline test program rltest.c that caused a core - dump. - -g. The code that handles parser directives in inputrc files now displays - more error messages. - -h. The history expansion code was fixed so that the appearance of the - history comment character at the beginning of a word inhibits history - expansion for that word and the rest of the input line. - -i. The code that prints completion listings now behaves better if one or - more of the filenames contains non-printable characters. - -j. The time delay when showing matching parentheses is now 0.5 seconds. - - -2. New Features in Readline - -a. There is now an option for `iterative' yank-last-arg handline, so a user - can keep entering `M-.', yanking the last argument of successive history - lines. - -b. New variable, `print-completions-horizontally', which causes completion - matches to be displayed across the screen (like `ls -x') rather than up - and down the screen (like `ls'). - -c. New variable, `completion-ignore-case', which causes filename completion - and matching to be performed case-insensitively. - -d. There is a new bindable command, `magic-space', which causes history - expansion to be performed on the current readline buffer and a space to - be inserted into the result. - -e. There is a new bindable command, `menu-complete', which enables tcsh-like - menu completion (successive executions of menu-complete insert a single - completion match, cycling through the list of possible completions). - -f. There is a new bindable command, `paste-from-clipboard', for use on Win32 - systems, to insert the text from the Win32 clipboard into the editing - buffer. - -g. The key sequence translation code now understands printf-style backslash - escape sequences, including \NNN octal escapes. These escape sequences - may be used in key sequence definitions or macro values. - -h. An `$include' inputrc file parser directive has been added. diff --git a/dep/src/readline/CMakeLists.txt b/dep/src/readline/CMakeLists.txt deleted file mode 100644 index fee2a7bb9c9..00000000000 --- a/dep/src/readline/CMakeLists.txt +++ /dev/null @@ -1,62 +0,0 @@ -# -# CMakeLists.txt -# Copyright (C) 2023 Marius Greuel -# - -cmake_minimum_required(VERSION 3.12) -project(readline) - -add_library(readline STATIC - src/bind.c - src/bind.c - src/display.c - src/histfile.c - src/isearch.c - src/mbutil.c - src/readline.c - src/shell.c - src/tilde.c - src/vi_mode.c - src/callback.c - src/history.c - src/keymaps.c - src/misc.c - src/rltty.c - src/signals.c - src/undo.c - src/xmalloc.c - src/compat.c - src/funmap.c - src/histsearch.c - src/kill.c - src/nls.c - src/savestring.c - src/terminal.c - src/util.c - src/complete.c - src/histexpand.c - src/input.c - src/macro.c - src/parens.c - src/search.c - src/text.c - ) - -target_include_directories(readline - PUBLIC - ${CMAKE_SOURCE_DIR}/dep/windows/include - PRIVATE - ${CMAKE_SOURCE_DIR}/dep/windows/include/readline - ) - -target_compile_definitions(readline PRIVATE - HAVE_CONFIG_H=1 - READLINE_STATIC=1 - ) - -if(MSVC) - target_compile_definitions(readline PRIVATE _CRT_NONSTDC_NO_WARNINGS=1 _CRT_SECURE_NO_WARNINGS=1) - target_include_directories(readline PRIVATE src/msvc) -endif() - -SET_TARGET_PROPERTIES (readline PROPERTIES FOLDER "3rd Party") diff --git a/dep/src/readline/COPYING b/dep/src/readline/COPYING deleted file mode 100644 index 1bf15263878..00000000000 --- a/dep/src/readline/COPYING +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - Appendix: How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) 19yy - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/dep/src/readline/INSTALL b/dep/src/readline/INSTALL deleted file mode 100644 index cb4a06fb701..00000000000 --- a/dep/src/readline/INSTALL +++ /dev/null @@ -1,273 +0,0 @@ -Basic Installation -================== - -These are installation instructions for Readline-5.0. - -The simplest way to compile readline is: - - 1. `cd' to the directory containing the readline source code and type - `./configure' to configure readline for your system. If you're - using `csh' on an old version of System V, you might need to type - `sh ./configure' instead to prevent `csh' from trying to execute - `configure' itself. - - Running `configure' takes some time. While running, it prints some - messages telling which features it is checking for. - - 2. Type `make' to compile readline and build the static readline - and history libraries. If supported, the shared readline and history - libraries will be built also. See below for instructions on compiling - the other parts of the distribution. Typing `make everything' will - cause the static and shared libraries (if supported) and the example - programs to be built. - - 3. Type `make install' to install the static readline and history - libraries, the readline include files, the documentation, and, if - supported, the shared readline and history libraries. - - 4. You can remove the created libraries and object files from the - build directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile readline for - a different kind of computer), type `make distclean'. There is - also a `make maintainer-clean' target, but that is intended mainly - for the readline developers, and should be used with care. - -The `configure' shell script attempts to guess correct values for -various system-dependent variables used during compilation. It -uses those values to create a `Makefile' in the build directory, -and Makefiles in the `doc', `shlib', and `examples' -subdirectories. It also creates a `config.h' file containing -system-dependent definitions. Finally, it creates a shell script -`config.status' that you can run in the future to recreate the -current configuration, a file `config.cache' that saves the -results of its tests to speed up reconfiguring, and a file -`config.log' containing compiler output (useful mainly for -debugging `configure'). - -If you need to do unusual things to compile readline, please try -to figure out how `configure' could check whether to do them, and -mail diffs or instructions to so they can -be considered for the next release. If at some point -`config.cache' contains results you don't want to keep, you may -remove or edit it. - -The file `configure.in' is used to create `configure' by a -program called `autoconf'. You only need `configure.in' if you -want to change it or regenerate `configure' using a newer version -of `autoconf'. The readline `configure.in' requires autoconf -version 2.50 or newer. - -Compilers and Options -===================== - -Some systems require unusual options for compilation or linking that -the `configure' script does not know about. You can give `configure' -initial values for variables by setting them in the environment. Using -a Bourne-compatible shell, you can do that on the command line like -this: - - CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure - -Or on systems that have the `env' program, you can do it like this: - - env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure - -Compiling For Multiple Architectures -==================================== - -You can compile readline for more than one kind of computer at the -same time, by placing the object files for each architecture in their -own directory. To do this, you must use a version of `make' that -supports the `VPATH' variable, such as GNU `make'. `cd' to the -directory where you want the object files and executables to go and run -the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. - -If you have to use a `make' that does not supports the `VPATH' -variable, you have to compile readline for one architecture at a -time in the source code directory. After you have installed -readline for one architecture, use `make distclean' before -reconfiguring for another architecture. - -Installation Names -================== - -By default, `make install' will install the readline libraries in -`/usr/local/lib', the include files in -`/usr/local/include/readline', the man pages in `/usr/local/man', -and the info files in `/usr/local/info'. You can specify an -installation prefix other than `/usr/local' by giving `configure' -the option `--prefix=PATH' or by supplying a value for the -DESTDIR variable when running `make install'. - -You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. -If you give `configure' the option `--exec-prefix=PATH', the -readline Makefiles will use PATH as the prefix for installing the -libraries. Documentation and other data files will still use the -regular prefix. - -Specifying the System Type -========================== - -There may be some features `configure' can not figure out -automatically, but need to determine by the type of host readline -will run on. Usually `configure' can figure that out, but if it -prints a message saying it can not guess the host type, give it -the `--host=TYPE' option. TYPE can either be a short name for -the system type, such as `sun4', or a canonical name with three -fields: CPU-COMPANY-SYSTEM (e.g., i386-unknown-freebsd4.2). - -See the file `config.sub' for the possible values of each field. - -Sharing Defaults -================ - -If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. -`configure' looks for `PREFIX/share/config.site' if it exists, then -`PREFIX/etc/config.site' if it exists. Or, you can set the -`CONFIG_SITE' environment variable to the location of the site script. -A warning: the readline `configure' looks for a site script, but not -all `configure' scripts do. - -Operation Controls -================== - -`configure' recognizes the following options to control how it -operates. - -`--cache-file=FILE' - Use and save the results of the tests in FILE instead of - `./config.cache'. Set FILE to `/dev/null' to disable caching, for - debugging `configure'. - -`--help' - Print a summary of the options to `configure', and exit. - -`--quiet' -`--silent' -`-q' - Do not print messages saying which checks are being made. - -`--srcdir=DIR' - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. - -`--version' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`configure' also accepts some other, not widely useful, options. - -Optional Features -================= - -The readline `configure' recognizes a single `--with-PACKAGE' option: - -`--with-curses' - This tells readline that it can find the termcap library functions - (tgetent, et al.) in the curses library, rather than a separate - termcap library. Readline uses the termcap functions, but does not - link with the termcap or curses library itself, allowing applications - which link with readline the to choose an appropriate library. - This option tells readline to link the example programs with the - curses library rather than libtermcap. - -`configure' also recognizes two `--enable-FEATURE' options: - -`--enable-shared' - Build the shared libraries by default on supported platforms. The - default is `yes'. - -`--enable-static' - Build the static libraries by default. The default is `yes'. - -Shared Libraries -================ - -There is support for building shared versions of the readline and -history libraries. The configure script creates a Makefile in -the `shlib' subdirectory, and typing `make shared' will cause -shared versions of the readline and history libraries to be built -on supported platforms. - -If `configure' is given the `--enable-shared' option, it will attempt -to build the shared libraries by default on supported platforms. - -Configure calls the script support/shobj-conf to test whether or -not shared library creation is supported and to generate the values -of variables that are substituted into shlib/Makefile. If you -try to build shared libraries on an unsupported platform, `make' -will display a message asking you to update support/shobj-conf for -your platform. - -If you need to update support/shobj-conf, you will need to create -a `stanza' for your operating system and compiler. The script uses -the value of host_os and ${CC} as determined by configure. For -instance, FreeBSD 4.2 with any version of gcc is identified as -`freebsd4.2-gcc*'. - -In the stanza for your operating system-compiler pair, you will need to -define several variables. They are: - -SHOBJ_CC The C compiler used to compile source files into shareable - object files. This is normally set to the value of ${CC} - by configure, and should not need to be changed. - -SHOBJ_CFLAGS Flags to pass to the C compiler ($SHOBJ_CC) to create - position-independent code. If you are using gcc, this - should probably be set to `-fpic'. - -SHOBJ_LD The link editor to be used to create the shared library from - the object files created by $SHOBJ_CC. If you are using - gcc, a value of `gcc' will probably work. - -SHOBJ_LDFLAGS Flags to pass to SHOBJ_LD to enable shared object creation. - If you are using gcc, `-shared' may be all that is necessary. - These should be the flags needed for generic shared object - creation. - -SHLIB_XLDFLAGS Additional flags to pass to SHOBJ_LD for shared library - creation. Many systems use the -R option to the link - editor to embed a path within the library for run-time - library searches. A reasonable value for such systems would - be `-R$(libdir)'. - -SHLIB_LIBS Any additional libraries that shared libraries should be - linked against when they are created. - -SHLIB_LIBSUFF The suffix to add to `libreadline' and `libhistory' when - generating the filename of the shared library. Many systems - use `so'; HP-UX uses `sl'. - -SHLIB_LIBVERSION The string to append to the filename to indicate the version - of the shared library. It should begin with $(SHLIB_LIBSUFF), - and possibly include version information that allows the - run-time loader to load the version of the shared library - appropriate for a particular program. Systems using shared - libraries similar to SunOS 4.x use major and minor library - version numbers; for those systems a value of - `$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' is appropriate. - Systems based on System V Release 4 don't use minor version - numbers; use `$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' on those systems. - Other Unix versions use different schemes. - -SHLIB_STATUS Set this to `supported' when you have defined the other - necessary variables. Make uses this to determine whether - or not shared library creation should be attempted. If - shared libraries are not supported, this will be set to - `unsupported'. - -You should look at the existing stanzas in support/shobj-conf for ideas. - -Once you have updated support/shobj-conf, re-run configure and type -`make shared' or `make'. The shared libraries will be created in the -shlib subdirectory. - -If shared libraries are created, `make install' will install them. -You may install only the shared libraries by running `make -install-shared' from the top-level build directory. Running `make -install' in the shlib subdirectory will also work. If you don't want -to install any created shared libraries, run `make install-static'. diff --git a/dep/src/readline/MANIFEST b/dep/src/readline/MANIFEST deleted file mode 100644 index 5b02340540b..00000000000 --- a/dep/src/readline/MANIFEST +++ /dev/null @@ -1,134 +0,0 @@ -# -# Master distribution manifest for the standalone readline distribution -# -doc d -examples d -support d -shlib d -COPYING f -README f -MANIFEST f -INSTALL f -CHANGELOG f -CHANGES f -NEWS f -USAGE f -aclocal.m4 f -config.h.in f -configure f -configure.in f -Makefile.in f -ansi_stdlib.h f -chardefs.h f -history.h f -histlib.h f -keymaps.h f -posixdir.h f -posixjmp.h f -posixstat.h f -readline.h f -rlconf.h f -rldefs.h f -rlmbutil.h f -rlprivate.h f -rlshell.h f -rlstdc.h f -rltty.h f -rltypedefs.h f -rlwinsize.h f -tcap.h f -tilde.h f -xmalloc.h f -bind.c f -callback.c f -compat.c f -complete.c f -display.c f -emacs_keymap.c f -funmap.c f -input.c f -isearch.c f -keymaps.c f -kill.c f -macro.c f -mbutil.c f -misc.c f -nls.c f -parens.c f -readline.c f -rltty.c f -savestring.c f -search.c f -shell.c f -signals.c f -terminal.c f -text.c f -tilde.c f -undo.c f -util.c f -vi_keymap.c f -vi_mode.c f -xmalloc.c f -history.c f -histexpand.c f -histfile.c f -histsearch.c f -shlib/Makefile.in f -support/config.guess f -support/config.rpath f -support/config.sub f -support/install.sh f -support/mkdirs f -support/mkdist f -support/mkinstalldirs f -support/shobj-conf f -support/shlib-install f -support/wcwidth.c f -doc/Makefile.in f -doc/texinfo.tex f -doc/version.texi f -doc/fdl.texi f -doc/rlman.texi f -doc/rltech.texi f -doc/rluser.texi f -doc/rluserman.texi f -doc/history.texi f -doc/hstech.texi f -doc/hsuser.texi f -doc/readline.3 f -doc/history.3 f -doc/texi2dvi f -doc/texi2html f -examples/Makefile.in f -examples/excallback.c f -examples/fileman.c f -examples/manexamp.c f -examples/readlinebuf.h f -examples/rl-fgets.c f -examples/rlcat.c f -examples/rlfe.c f -examples/rltest.c f -examples/rl.c f -examples/rlversion.c f -examples/histexamp.c f -examples/Inputrc f -# formatted documentation, from MANIFEST.doc -doc/readline.ps f -doc/history.ps f -doc/rluserman.ps f -doc/readline.dvi f -doc/history.dvi f -doc/rluserman.dvi f -doc/readline.info f -doc/history.info f -doc/rluserman.info f -doc/readline.html f -doc/history.html f -doc/rluserman.html f -doc/readline.0 f -doc/history.0 f -doc/readline_3.ps f -doc/history_3.ps f -doc/history.pdf f -doc/readline.pdf f -doc/rluserman.pdf f diff --git a/dep/src/readline/MANIFEST.doc b/dep/src/readline/MANIFEST.doc deleted file mode 100644 index ed27cb39107..00000000000 --- a/dep/src/readline/MANIFEST.doc +++ /dev/null @@ -1,16 +0,0 @@ -# -# Master Manifest file for documentation-only distribution -# -doc d -MANIFEST.doc f -doc/readline.ps f -doc/history.ps f -doc/readline.dvi f -doc/history.dvi f -doc/readline.info f -doc/history.info f -doc/readline.html f -doc/readline_toc.html f -doc/history.html f -doc/history_toc.html f -doc/readline.0 f diff --git a/dep/src/readline/NEWS b/dep/src/readline/NEWS deleted file mode 100644 index 754154b818c..00000000000 --- a/dep/src/readline/NEWS +++ /dev/null @@ -1,55 +0,0 @@ -This is a terse description of the new features added to readline-5.0 since -the release of readline-4.3. - -1. New Features in Readline - -a. History expansion has a new `a' modifier equivalent to the `g' modifier - for compatibility with the BSD csh. - -b. History expansion has a new `G' modifier equivalent to the BSD csh `g' - modifier, which performs a substitution once per word. - -c. All non-incremental search operations may now undo the operation of - replacing the current line with the history line. - -d. The text inserted by an `a' command in vi mode can be reinserted with - `.'. - -e. New bindable variable, `show-all-if-unmodified'. If set, the readline - completer will list possible completions immediately if there is more - than one completion and partial completion cannot be performed. - -f. There is a new application-callable `free_history_entry()' function. - -g. History list entries now contain timestamp information; the history file - functions know how to read and write timestamp information associated - with each entry. - -h. Four new key binding functions have been added: - - rl_bind_key_if_unbound() - rl_bind_key_if_unbound_in_map() - rl_bind_keyseq_if_unbound() - rl_bind_keyseq_if_unbound_in_map() - -i. New application variable, rl_completion_quote_character, set to any - quote character readline finds before it calls the application completion - function. - -j. New application variable, rl_completion_suppress_quote, settable by an - application completion function. If set to non-zero, readline does not - attempt to append a closing quote to a completed word. - -k. New application variable, rl_completion_found_quote, set to a non-zero - value if readline determines that the word to be completed is quoted. - Set before readline calls any application completion function. - -l. New function hook, rl_completion_word_break_hook, called when readline - needs to break a line into words when completion is attempted. Allows - the word break characters to vary based on position in the line. - -m. New bindable command: unix-filename-rubout. Does the same thing as - unix-word-rubout, but adds `/' to the set of word delimiters. - -n. When listing completions, directories have a `/' appended if the - `mark-directories' option has been enabled. diff --git a/dep/src/readline/README b/dep/src/readline/README deleted file mode 100644 index ac4e3a767f9..00000000000 --- a/dep/src/readline/README +++ /dev/null @@ -1,172 +0,0 @@ -Introduction -============ - -This is the Gnu Readline library, version 5.0. - -The Readline library provides a set of functions for use by applications -that allow users to edit command lines as they are typed in. Both -Emacs and vi editing modes are available. The Readline library includes -additional functions to maintain a list of previously-entered command -lines, to recall and perhaps reedit those lines, and perform csh-like -history expansion on previous commands. - -The history facilites are also placed into a separate library, the -History library, as part of the build process. The History library -may be used without Readline in applications which desire its -capabilities. - -The Readline library is free software, distributed under the terms of -the [GNU] General Public License, version 2. For more information, see -the file COPYING. - -To build the library, try typing `./configure', then `make'. The -configuration process is automated, so no further intervention should -be necessary. Readline builds with `gcc' by default if it is -available. If you want to use `cc' instead, type - - CC=cc ./configure - -if you are using a Bourne-style shell. If you are not, the following -may work: - - env CC=cc ./configure - -Read the file INSTALL in this directory for more information about how -to customize and control the build process. - -The file rlconf.h contains C preprocessor defines that enable and disable -certain Readline features. - -The special make target `everything' will build the static and shared -libraries (if the target platform supports them) and the examples. - -Examples -======== - -There are several example programs that use Readline features in the -examples directory. The `rl' program is of particular interest. It -is a command-line interface to Readline, suitable for use in shell -scripts in place of `read'. - -Shared Libraries -================ - -There is skeletal support for building shared versions of the -Readline and History libraries. The configure script creates -a Makefile in the `shlib' subdirectory, and typing `make shared' -will cause shared versions of the Readline and History libraries -to be built on supported platforms. - -If `configure' is given the `--enable-shared' option, it will attempt -to build the shared libraries by default on supported platforms. - -Configure calls the script support/shobj-conf to test whether or -not shared library creation is supported and to generate the values -of variables that are substituted into shlib/Makefile. If you -try to build shared libraries on an unsupported platform, `make' -will display a message asking you to update support/shobj-conf for -your platform. - -If you need to update support/shobj-conf, you will need to create -a `stanza' for your operating system and compiler. The script uses -the value of host_os and ${CC} as determined by configure. For -instance, FreeBSD 4.2 with any version of gcc is identified as -`freebsd4.2-gcc*'. - -In the stanza for your operating system-compiler pair, you will need to -define several variables. They are: - -SHOBJ_CC The C compiler used to compile source files into shareable - object files. This is normally set to the value of ${CC} - by configure, and should not need to be changed. - -SHOBJ_CFLAGS Flags to pass to the C compiler ($SHOBJ_CC) to create - position-independent code. If you are using gcc, this - should probably be set to `-fpic'. - -SHOBJ_LD The link editor to be used to create the shared library from - the object files created by $SHOBJ_CC. If you are using - gcc, a value of `gcc' will probably work. - -SHOBJ_LDFLAGS Flags to pass to SHOBJ_LD to enable shared object creation. - If you are using gcc, `-shared' may be all that is necessary. - These should be the flags needed for generic shared object - creation. - -SHLIB_XLDFLAGS Additional flags to pass to SHOBJ_LD for shared library - creation. Many systems use the -R option to the link - editor to embed a path within the library for run-time - library searches. A reasonable value for such systems would - be `-R$(libdir)'. - -SHLIB_LIBS Any additional libraries that shared libraries should be - linked against when they are created. - -SHLIB_LIBSUFF The suffix to add to `libreadline' and `libhistory' when - generating the filename of the shared library. Many systems - use `so'; HP-UX uses `sl'. - -SHLIB_LIBVERSION The string to append to the filename to indicate the version - of the shared library. It should begin with $(SHLIB_LIBSUFF), - and possibly include version information that allows the - run-time loader to load the version of the shared library - appropriate for a particular program. Systems using shared - libraries similar to SunOS 4.x use major and minor library - version numbers; for those systems a value of - `$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' is appropriate. - Systems based on System V Release 4 don't use minor version - numbers; use `$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' on those systems. - Other Unix versions use different schemes. - -SHLIB_STATUS Set this to `supported' when you have defined the other - necessary variables. Make uses this to determine whether - or not shared library creation should be attempted. - -You should look at the existing stanzas in support/shobj-conf for ideas. - -Once you have updated support/shobj-conf, re-run configure and type -`make shared'. The shared libraries will be created in the shlib -subdirectory. - -If shared libraries are created, `make install' will install them. -You may install only the shared libraries by running `make -install-shared' from the top-level build directory. Running `make -install' in the shlib subdirectory will also work. If you don't want -to install any created shared libraries, run `make install-static'. - -Documentation -============= - -The documentation for the Readline and History libraries appears in -the `doc' subdirectory. There are three texinfo files and a -Unix-style manual page describing the facilities available in the -Readline library. The texinfo files include both user and -programmer's manuals. HTML versions of the manuals appear in the -`doc' subdirectory as well. - -Reporting Bugs -============== - -Bug reports for Readline should be sent to: - - bug-readline@gnu.org - -When reporting a bug, please include the following information: - - * the version number and release status of Readline (e.g., 4.2-release) - * the machine and OS that it is running on - * a list of the compilation flags or the contents of `config.h', if - appropriate - * a description of the bug - * a recipe for recreating the bug reliably - * a fix for the bug if you have one! - -If you would like to contact the Readline maintainer directly, send mail -to bash-maintainers@gnu.org. - -Since Readline is developed along with bash, the bug-bash@gnu.org mailing -list (mirrored to the Usenet newsgroup gnu.bash.bug) often contains -Readline bug reports and fixes. - -Chet Ramey -chet@po.cwru.edu diff --git a/dep/src/readline/README.md b/dep/src/readline/README.md deleted file mode 100644 index 1a24c7d76e0..00000000000 --- a/dep/src/readline/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# GNU readline for Windows - -This library is a fork of [GNU readline library](https://savannah.gnu.org/projects/readline/). - -The design objective of this library is to provide a better -out-of-the-box experience for [AVRDUDE](https://github.com/avrdudes/avrdude) Windows users. - -This library only supports a subset of the original implementation. -The intend is not to provide a general purpose implementation, -but to satisfy the usage scenarios of AVRDUDE. - -This library supports only **Microsoft Visual C/C++**, -as used in the **msvc** job of the [AVRDUDE build action](https://github.com/avrdudes/avrdude/blob/main/.github/workflows/build.yml). - -The latest version of **GNU readline for Windows** can be found here:\ - - -The original README of libreadline can be found here: [README](./README). - -## Notable Changes - -- Add CMake support -- Fix Windows related compilation issues -- Fix EOF detection on piped input diff --git a/dep/src/readline/STANDALONE b/dep/src/readline/STANDALONE deleted file mode 100644 index c1387f34d2f..00000000000 --- a/dep/src/readline/STANDALONE +++ /dev/null @@ -1,31 +0,0 @@ -This is a description of C preprocessor defines that readline accepts. -Most are passed in from the parent `make'; e.g. from the bash source -directory. - -NO_SYS_FILE is not present -HAVE_UNISTD_H exists -HAVE_STDLIB_H exists -HAVE_VARARGS_H exists and is usable -HAVE_STRING_H exists -HAVE_ALLOCA_H exists and is needed for alloca() -HAVE_ALLOCA alloca(3) or a define for it exists -PRAGMA_ALLOCA use of alloca() requires a #pragma, as in AIX 3.x -VOID_SIGHANDLER signal handlers are void functions -HAVE_DIRENT_H exists and is usable -HAVE_SYS_PTEM_H exists -HAVE_SYS_PTE_H exists -HAVE_SYS_STREAM_H exists - -System-specific options: - -GWINSZ_IN_SYS_IOCTL need to include for TIOCGWINSZ -HAVE_GETPW_DECLS the getpw* functions are declared in and cannot - be redeclared without compiler errors -HAVE_STRCASECMP the strcasecmp and strncasecmp functions are available - -USG Running a variant of System V -USGr3 Running System V.3 -XENIX_22 Xenix 2.2 -Linux Linux -CRAY running a recent version of Cray UNICOS -SunOS4 Running SunOS 4.x diff --git a/dep/src/readline/USAGE b/dep/src/readline/USAGE deleted file mode 100644 index edc9f5417d4..00000000000 --- a/dep/src/readline/USAGE +++ /dev/null @@ -1,37 +0,0 @@ -From rms@gnu.org Thu Jul 22 20:37:55 1999 -Flags: 10 -Return-Path: rms@gnu.org -Received: from arthur.INS.CWRU.Edu (root@arthur.INS.CWRU.Edu [129.22.8.215]) by odin.INS.CWRU.Edu with ESMTP (8.8.6+cwru/CWRU-2.4-ins) - id UAA25349; Thu, 22 Jul 1999 20:37:54 -0400 (EDT) (from rms@gnu.org for ) -Received: from nike.ins.cwru.edu (root@nike.INS.CWRU.Edu [129.22.8.219]) by arthur.INS.CWRU.Edu with ESMTP (8.8.8+cwru/CWRU-3.6) - id UAA05311; Thu, 22 Jul 1999 20:37:51 -0400 (EDT) (from rms@gnu.org for ) -Received: from pele.santafe.edu (pele.santafe.edu [192.12.12.119]) by nike.ins.cwru.edu with ESMTP (8.8.7/CWRU-2.5-bsdi) - id UAA13350; Thu, 22 Jul 1999 20:37:50 -0400 (EDT) (from rms@gnu.org for ) -Received: from wijiji.santafe.edu (wijiji [192.12.12.5]) - by pele.santafe.edu (8.9.1/8.9.1) with ESMTP id SAA10831 - for ; Thu, 22 Jul 1999 18:37:47 -0600 (MDT) -Received: (from rms@localhost) - by wijiji.santafe.edu (8.9.1b+Sun/8.9.1) id SAA01089; - Thu, 22 Jul 1999 18:37:46 -0600 (MDT) -Date: Thu, 22 Jul 1999 18:37:46 -0600 (MDT) -Message-Id: <199907230037.SAA01089@wijiji.santafe.edu> -X-Authentication-Warning: wijiji.santafe.edu: rms set sender to rms@gnu.org using -f -From: Richard Stallman -To: chet@nike.ins.cwru.edu -Subject: Use of Readline -Reply-to: rms@gnu.org - -I think Allbery's suggestion is a good one. So please add this text -in a suitable place. Please don't put it in the GPL itself; that -should be the same as the GPL everywhere else. Putting it in the -README and/or the documentation would be a good idea. - - -====================================================================== -Our position on the use of Readline through a shared-library linking -mechanism is that there is no legal difference between shared-library -linking and static linking--either kind of linking combines various -modules into a single larger work. The conditions for using Readline -in a larger work are stated in section 3 of the GNU GPL. - - diff --git a/dep/src/readline/src/Makefile.in b/dep/src/readline/src/Makefile.in deleted file mode 100644 index 1578bcb1442..00000000000 --- a/dep/src/readline/src/Makefile.in +++ /dev/null @@ -1,534 +0,0 @@ -## -*- text -*- ## -# Master Makefile for the GNU readline library. -# Copyright (C) 1994-2004 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. -RL_LIBRARY_VERSION = @LIBVERSION@ -RL_LIBRARY_NAME = readline - -PACKAGE = @PACKAGE_NAME@ -VERSION = @PACKAGE_VERSION@ - -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_VERSION = @PACKAGE_VERSION@ - -srcdir = @srcdir@ -VPATH = .:@srcdir@ -top_srcdir = @top_srcdir@ -BUILD_DIR = @BUILD_DIR@ - -INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ - -CC = @CC@ -RANLIB = @RANLIB@ -AR = @AR@ -ARFLAGS = @ARFLAGS@ -RM = rm -f -CP = cp -MV = mv - -@SET_MAKE@ -SHELL = @MAKE_SHELL@ - -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -libdir = @libdir@ -mandir = @mandir@ -includedir = @includedir@ -datadir = @datadir@ -localedir = $(datadir)/locale - -infodir = @infodir@ - -man3dir = $(mandir)/man3 - -# Support an alternate destination root directory for package building -DESTDIR = - -# Programs to make tags files. -ETAGS = etags -tw -CTAGS = ctags -tw - -CFLAGS = @CFLAGS@ -LOCAL_CFLAGS = @LOCAL_CFLAGS@ -DRL_LIBRARY_VERSION='"$(RL_LIBRARY_VERSION)"' -CPPFLAGS = @CPPFLAGS@ - -DEFS = @DEFS@ -LOCAL_DEFS = @LOCAL_DEFS@ - -TERMCAP_LIB = @TERMCAP_LIB@ - -# For libraries which include headers from other libraries. -INCLUDES = -I. -I$(srcdir) - -XCCFLAGS = $(DEFS) $(LOCAL_DEFS) $(CPPFLAGS) $(INCLUDES) -CCFLAGS = $(XCCFLAGS) $(LOCAL_CFLAGS) $(CFLAGS) - -# could add -Werror here -GCC_LINT_FLAGS = -ansi -Wall -Wshadow -Wpointer-arith -Wcast-qual \ - -Wwrite-strings -Wstrict-prototypes \ - -Wmissing-prototypes -Wno-implicit -pedantic -GCC_LINT_CFLAGS = $(XCCFLAGS) $(GCC_LINT_FLAGS) @CFLAGS@ @LOCAL_CFLAGS@ - -.c.o: - ${RM} $@ - $(CC) -c $(CCFLAGS) $< - -# The name of the main library target. -LIBRARY_NAME = libreadline.a -STATIC_LIBS = libreadline.a libhistory.a - -# The C code source files for this library. -CSOURCES = $(srcdir)/readline.c $(srcdir)/funmap.c $(srcdir)/keymaps.c \ - $(srcdir)/vi_mode.c $(srcdir)/parens.c $(srcdir)/rltty.c \ - $(srcdir)/complete.c $(srcdir)/bind.c $(srcdir)/isearch.c \ - $(srcdir)/display.c $(srcdir)/signals.c $(srcdir)/emacs_keymap.c \ - $(srcdir)/vi_keymap.c $(srcdir)/util.c $(srcdir)/kill.c \ - $(srcdir)/undo.c $(srcdir)/macro.c $(srcdir)/input.c \ - $(srcdir)/callback.c $(srcdir)/terminal.c $(srcdir)/xmalloc.c \ - $(srcdir)/history.c $(srcdir)/histsearch.c $(srcdir)/histexpand.c \ - $(srcdir)/histfile.c $(srcdir)/nls.c $(srcdir)/search.c \ - $(srcdir)/shell.c $(srcdir)/savestring.c $(srcdir)/tilde.c \ - $(srcdir)/text.c $(srcdir)/misc.c $(srcdir)/compat.c \ - $(srcdir)/mbutil.c - -# The header files for this library. -HSOURCES = readline.h rldefs.h chardefs.h keymaps.h history.h histlib.h \ - posixstat.h posixdir.h posixjmp.h tilde.h rlconf.h rltty.h \ - ansi_stdlib.h tcap.h rlstdc.h xmalloc.h rlprivate.h rlshell.h \ - rltypedefs.h rlmbutil.h - -HISTOBJ = history.o histexpand.o histfile.o histsearch.o shell.o mbutil.o -TILDEOBJ = tilde.o -OBJECTS = readline.o vi_mode.o funmap.o keymaps.o parens.o search.o \ - rltty.o complete.o bind.o isearch.o display.o signals.o \ - util.o kill.o undo.o macro.o input.o callback.o terminal.o \ - text.o nls.o misc.o compat.o xmalloc.o $(HISTOBJ) $(TILDEOBJ) - -# The texinfo files which document this library. -DOCSOURCE = doc/rlman.texinfo doc/rltech.texinfo doc/rluser.texinfo -DOCOBJECT = doc/readline.dvi -DOCSUPPORT = doc/Makefile -DOCUMENTATION = $(DOCSOURCE) $(DOCOBJECT) $(DOCSUPPORT) - -CREATED_MAKEFILES = Makefile doc/Makefile examples/Makefile shlib/Makefile -CREATED_CONFIGURE = config.status config.h config.cache config.log \ - stamp-config stamp-h -CREATED_TAGS = TAGS tags - -INSTALLED_HEADERS = readline.h chardefs.h keymaps.h history.h tilde.h \ - rlstdc.h rlconf.h rltypedefs.h - -########################################################################## -TARGETS = @STATIC_TARGET@ @SHARED_TARGET@ -INSTALL_TARGETS = @STATIC_INSTALL_TARGET@ @SHARED_INSTALL_TARGET@ - -all: $(TARGETS) - -everything: all examples - -static: $(STATIC_LIBS) - -libreadline.a: $(OBJECTS) - $(RM) $@ - $(AR) $(ARFLAGS) $@ $(OBJECTS) - -test -n "$(RANLIB)" && $(RANLIB) $@ - -libhistory.a: $(HISTOBJ) xmalloc.o - $(RM) $@ - $(AR) $(ARFLAGS) $@ $(HISTOBJ) xmalloc.o - -test -n "$(RANLIB)" && $(RANLIB) $@ - -# Since tilde.c is shared between readline and bash, make sure we compile -# it with the right flags when it's built as part of readline -tilde.o: tilde.c - rm -f $@ - $(CC) $(CCFLAGS) -DREADLINE_LIBRARY -c $(srcdir)/tilde.c - -readline: $(OBJECTS) readline.h rldefs.h chardefs.h ./libreadline.a - $(CC) $(CCFLAGS) -o $@ ./examples/rl.c ./libreadline.a ${TERMCAP_LIB} - -lint: force - $(MAKE) $(MFLAGS) CCFLAGS='$(GCC_LINT_CFLAGS)' static - -Makefile makefile: config.status $(srcdir)/Makefile.in - CONFIG_FILES=Makefile CONFIG_HEADERS= $(SHELL) ./config.status - -Makefiles makefiles: config.status $(srcdir)/Makefile.in - @for mf in $(CREATED_MAKEFILES); do \ - CONFIG_FILES=$$mf CONFIG_HEADERS= $(SHELL) ./config.status ; \ - done - -config.status: configure - $(SHELL) ./config.status --recheck - -config.h: stamp-h - -stamp-h: config.status $(srcdir)/config.h.in - CONFIG_FILES= CONFIG_HEADERS=config.h ./config.status - echo > $@ - -#$(srcdir)/configure: $(srcdir)/configure.in ## Comment-me-out in distribution -# cd $(srcdir) && autoconf ## Comment-me-out in distribution - - -shared: force - -test -d shlib || mkdir shlib - -( cd shlib ; ${MAKE} ${MFLAGS} all ) - -documentation: force - -test -d doc || mkdir doc - -( cd doc && $(MAKE) $(MFLAGS) ) - -examples: force - -test -d examples || mkdir examples - -(cd examples && ${MAKE} ${MFLAGS} all ) - -force: - -install-headers: installdirs ${INSTALLED_HEADERS} - for f in ${INSTALLED_HEADERS}; do \ - $(INSTALL_DATA) $(srcdir)/$$f $(DESTDIR)$(includedir)/readline ; \ - done - -uninstall-headers: - -test -n "$(includedir)" && cd $(DESTDIR)$(includedir)/readline && \ - ${RM} ${INSTALLED_HEADERS} - -maybe-uninstall-headers: uninstall-headers - -install: $(INSTALL_TARGETS) - -install-static: installdirs $(STATIC_LIBS) install-headers install-doc - -$(MV) $(DESTDIR)$(libdir)/libreadline.a $(DESTDIR)$(libdir)/libreadline.old - $(INSTALL_DATA) libreadline.a $(DESTDIR)$(libdir)/libreadline.a - -test -n "$(RANLIB)" && $(RANLIB) $(DESTDIR)$(libdir)/libreadline.a - -$(MV) $(DESTDIR)$(libdir)/libhistory.a $(DESTDIR)$(libdir)/libhistory.old - $(INSTALL_DATA) libhistory.a $(DESTDIR)$(libdir)/libhistory.a - -test -n "$(RANLIB)" && $(RANLIB) $(DESTDIR)$(libdir)/libhistory.a - -installdirs: $(srcdir)/support/mkinstalldirs - -$(SHELL) $(srcdir)/support/mkinstalldirs $(DESTDIR)$(includedir) \ - $(DESTDIR)$(includedir)/readline $(DESTDIR)$(libdir) \ - $(DESTDIR)$(infodir) $(DESTDIR)$(man3dir) - -uninstall: uninstall-headers uninstall-doc - -test -n "$(DESTDIR)$(libdir)" && cd $(DESTDIR)$(libdir) && \ - ${RM} libreadline.a libreadline.old libhistory.a libhistory.old $(SHARED_LIBS) - -( cd shlib; ${MAKE} ${MFLAGS} DESTDIR=${DESTDIR} uninstall ) - -install-shared: installdirs install-headers shared install-doc - -( cd shlib ; ${MAKE} ${MFLAGS} DESTDIR=${DESTDIR} install ) - -uninstall-shared: maybe-uninstall-headers - -( cd shlib; ${MAKE} ${MFLAGS} DESTDIR=${DESTDIR} uninstall ) - -install-doc: installdirs - -( if test -d doc ; then \ - cd doc && \ - ${MAKE} ${MFLAGS} infodir=$(infodir) DESTDIR=${DESTDIR} install; \ - fi ) - -uninstall-doc: - -( if test -d doc ; then \ - cd doc && \ - ${MAKE} ${MFLAGS} infodir=$(infodir) DESTDIR=${DESTDIR} uninstall; \ - fi ) - -TAGS: force - $(ETAGS) $(CSOURCES) $(HSOURCES) - -tags: force - $(CTAGS) $(CSOURCES) $(HSOURCES) - -clean: force - $(RM) $(OBJECTS) $(STATIC_LIBS) - $(RM) readline readline.exe - -( cd shlib && $(MAKE) $(MFLAGS) $@ ) - -( cd doc && $(MAKE) $(MFLAGS) $@ ) - -( cd examples && $(MAKE) $(MFLAGS) $@ ) - -mostlyclean: clean - -( cd shlib && $(MAKE) $(MFLAGS) $@ ) - -( cd doc && $(MAKE) $(MFLAGS) $@ ) - -( cd examples && $(MAKE) $(MFLAGS) $@ ) - -distclean maintainer-clean: clean - -( cd shlib && $(MAKE) $(MFLAGS) $@ ) - -( cd doc && $(MAKE) $(MFLAGS) $@ ) - -( cd examples && $(MAKE) $(MFLAGS) $@ ) - $(RM) Makefile - $(RM) $(CREATED_CONFIGURE) - $(RM) $(CREATED_TAGS) - -info dvi: - -( cd doc && $(MAKE) $(MFLAGS) $@ ) - -install-info: -check: -installcheck: - -dist: force - @echo Readline distributions are created using $(srcdir)/support/mkdist. - @echo Here is a sample of the necessary commands: - @echo bash $(srcdir)/support/mkdist -m $(srcdir)/MANIFEST -s $(srcdir) -r $(RL_LIBRARY_NAME) $(RL_LIBRARY_VERSION) - @echo tar cf $(RL_LIBRARY_NAME)-${RL_LIBRARY_VERSION}.tar ${RL_LIBRARY_NAME}-$(RL_LIBRARY_VERSION) - @echo gzip $(RL_LIBRARY_NAME)-$(RL_LIBRARY_VERSION).tar - -# Tell versions [3.59,3.63) of GNU make not to export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: - -# Dependencies -bind.o: ansi_stdlib.h posixstat.h -bind.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h -bind.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h -bind.o: history.h -callback.o: rlconf.h -callback.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h -callback.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h -compat.o: rlstdc.h -complete.o: ansi_stdlib.h posixdir.h posixstat.h -complete.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h -complete.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h -display.o: ansi_stdlib.h posixstat.h -display.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h -display.o: tcap.h -display.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h -display.o: history.h rlstdc.h -funmap.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h -funmap.o: rlconf.h ansi_stdlib.h rlstdc.h -funmap.o: ${BUILD_DIR}/config.h -histexpand.o: ansi_stdlib.h -histexpand.o: history.h histlib.h rlstdc.h rltypedefs.h -histexpand.o: ${BUILD_DIR}/config.h -histfile.o: ansi_stdlib.h -histfile.o: history.h histlib.h rlstdc.h rltypedefs.h -histfile.o: ${BUILD_DIR}/config.h -history.o: ansi_stdlib.h -history.o: history.h histlib.h rlstdc.h rltypedefs.h -history.o: ${BUILD_DIR}/config.h -histsearch.o: ansi_stdlib.h -histsearch.o: history.h histlib.h rlstdc.h rltypedefs.h -histsearch.o: ${BUILD_DIR}/config.h -input.o: ansi_stdlib.h -input.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h -input.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h -isearch.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h -isearch.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h -isearch.o: ansi_stdlib.h history.h rlstdc.h -keymaps.o: emacs_keymap.c vi_keymap.c -keymaps.o: keymaps.h rltypedefs.h chardefs.h rlconf.h ansi_stdlib.h -keymaps.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h -keymaps.o: ${BUILD_DIR}/config.h rlstdc.h -kill.o: ansi_stdlib.h -kill.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h -kill.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h -kill.o: history.h rlstdc.h -macro.o: ansi_stdlib.h -macro.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h -macro.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h -macro.o: history.h rlstdc.h -mbutil.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h -mbutil.o: readline.h keymaps.h rltypedefs.h chardefs.h rlstdc.h -misc.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h -misc.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h -misc.o: history.h rlstdc.h ansi_stdlib.h -nls.o: ansi_stdlib.h -nls.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h -nls.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h -nls.o: history.h rlstdc.h -parens.o: rlconf.h -parens.o: ${BUILD_DIR}/config.h -parens.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h -readline.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h -readline.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h -readline.o: history.h rlstdc.h -readline.o: posixstat.h ansi_stdlib.h posixjmp.h -rltty.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h -rltty.o: rltty.h -rltty.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h -search.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h -search.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h -search.o: ansi_stdlib.h history.h rlstdc.h -shell.o: ${BUILD_DIR}/config.h -shell.o: ansi_stdlib.h -signals.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h -signals.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h -signals.o: history.h rlstdc.h -terminal.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h -terminal.o: tcap.h -terminal.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h -terminal.o: history.h rlstdc.h -text.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h -text.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h -text.o: history.h rlstdc.h ansi_stdlib.h -tilde.o: ansi_stdlib.h -tilde.o: ${BUILD_DIR}/config.h -tilde.o: tilde.h -undo.o: ansi_stdlib.h -undo.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h -undo.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h -undo.o: history.h rlstdc.h -util.o: posixjmp.h ansi_stdlib.h -util.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h -util.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h -vi_mode.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h -vi_mode.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h -vi_mode.o: history.h ansi_stdlib.h rlstdc.h -xmalloc.o: ${BUILD_DIR}/config.h -xmalloc.o: ansi_stdlib.h - -bind.o: rlshell.h -histfile.o: rlshell.h -nls.o: rlshell.h -readline.o: rlshell.h -shell.o: rlshell.h -terminal.o: rlshell.h -histexpand.o: rlshell.h - -bind.o: rlprivate.h -callback.o: rlprivate.h -complete.o: rlprivate.h -display.o: rlprivate.h -input.o: rlprivate.h -isearch.o: rlprivate.h -kill.o: rlprivate.h -macro.o: rlprivate.h -mbutil.o: rlprivate.h -misc.o: rlprivate.h -nls.o: rlprivate.h -parens.o: rlprivate.h -readline.o: rlprivate.h -rltty.o: rlprivate.h -search.o: rlprivate.h -signals.o: rlprivate.h -terminal.o: rlprivate.h -text.o: rlprivate.h -undo.o: rlprivate.h -util.o: rlprivate.h -vi_mode.o: rlprivate.h - -bind.o: xmalloc.h -complete.o: xmalloc.h -display.o: xmalloc.h -funmap.o: xmalloc.h -histexpand.o: xmalloc.h -histfile.o: xmalloc.h -history.o: xmalloc.h -input.o: xmalloc.h -isearch.o: xmalloc.h -keymaps.o: xmalloc.h -kill.o: xmalloc.h -macro.o: xmalloc.h -mbutil.o: xmalloc.h -misc.o: xmalloc.h -readline.o: xmalloc.h -savestring.o: xmalloc.h -search.o: xmalloc.h -shell.o: xmalloc.h -terminal.o: xmalloc.h -text.o: xmalloc.h -tilde.o: xmalloc.h -undo.o: xmalloc.h -util.o: xmalloc.h -vi_mode.o: xmalloc.h -xmalloc.o: xmalloc.h - -complete.o: rlmbutil.h -display.o: rlmbutil.h -histexpand.o: rlmbutil.h -input.o: rlmbutil.h -isearch.o: rlmbutil.h -mbutil.o: rlmbutil.h -misc.o: rlmbutil.h -readline.o: rlmbutil.h -search.o: rlmbutil.h -text.o: rlmbutil.h -vi_mode.o: rlmbutil.h - -bind.o: $(srcdir)/bind.c -callback.o: $(srcdir)/callback.c -compat.o: $(srcdir)/compat.c -complete.o: $(srcdir)/complete.c -display.o: $(srcdir)/display.c -funmap.o: $(srcdir)/funmap.c -input.o: $(srcdir)/input.c -isearch.o: $(srcdir)/isearch.c -keymaps.o: $(srcdir)/keymaps.c $(srcdir)/emacs_keymap.c $(srcdir)/vi_keymap.c -kill.o: $(srcdir)/kill.c -macro.o: $(srcdir)/macro.c -mbutil.o: $(srcdir)/mbutil.c -misc.o: $(srcdir)/misc.c -nls.o: $(srcdir)/nls.c -parens.o: $(srcdir)/parens.c -readline.o: $(srcdir)/readline.c -rltty.o: $(srcdir)/rltty.c -savestring.o: $(srcdir)/savestring.c -search.o: $(srcdir)/search.c -shell.o: $(srcdir)/shell.c -signals.o: $(srcdir)/signals.c -terminal.o: $(srcdir)/terminal.c -text.o: $(srcdir)/text.c -tilde.o: $(srcdir)/tilde.c -undo.o: $(srcdir)/undo.c -util.o: $(srcdir)/util.c -vi_mode.o: $(srcdir)/vi_mode.c -xmalloc.o: $(srcdir)/xmalloc.c - -histexpand.o: $(srcdir)/histexpand.c -histfile.o: $(srcdir)/histfile.c -history.o: $(srcdir)/history.c -histsearch.o: $(srcdir)/histsearch.c - -bind.o: bind.c -callback.o: callback.c -compat.o: compat.c -complete.o: complete.c -display.o: display.c -funmap.o: funmap.c -input.o: input.c -isearch.o: isearch.c -keymaps.o: keymaps.c emacs_keymap.c vi_keymap.c -kill.o: kill.c -macro.o: macro.c -mbutil.o: mbutil.c -misc.o: misc.c -nls.o: nls.c -parens.o: parens.c -readline.o: readline.c -rltty.o: rltty.c -savestring.o: savestring.c -search.o: search.c -shell.o: shell.c -signals.o: signals.c -terminal.o: terminal.c -text.o: text.c -tilde.o: tilde.c -undo.o: undo.c -util.o: util.c -vi_mode.o: vi_mode.c -xmalloc.o: xmalloc.c - -histexpand.o: histexpand.c -histfile.o: histfile.c -history.o: history.c -histsearch.o: histsearch.c diff --git a/dep/src/readline/src/aclocal.m4 b/dep/src/readline/src/aclocal.m4 deleted file mode 100644 index 9d2ed54420c..00000000000 --- a/dep/src/readline/src/aclocal.m4 +++ /dev/null @@ -1,3913 +0,0 @@ -dnl -dnl Bash specific tests -dnl -dnl Some derived from PDKSH 5.1.3 autoconf tests -dnl - -AC_DEFUN(BASH_C_LONG_LONG, -[AC_CACHE_CHECK(for long long, ac_cv_c_long_long, -[if test "$GCC" = yes; then - ac_cv_c_long_long=yes -else -AC_TRY_RUN([ -int -main() -{ -long long foo = 0; -exit(sizeof(long long) < sizeof(long)); -} -], ac_cv_c_long_long=yes, ac_cv_c_long_long=no) -fi]) -if test $ac_cv_c_long_long = yes; then - AC_DEFINE(HAVE_LONG_LONG, 1, [Define if the `long long' type works.]) -fi -]) - -dnl -dnl This is very similar to AC_C_LONG_DOUBLE, with the fix for IRIX -dnl (< changed to <=) added. -dnl -AC_DEFUN(BASH_C_LONG_DOUBLE, -[AC_CACHE_CHECK(for long double, ac_cv_c_long_double, -[if test "$GCC" = yes; then - ac_cv_c_long_double=yes -else -AC_TRY_RUN([ -int -main() -{ - /* The Stardent Vistra knows sizeof(long double), but does not - support it. */ - long double foo = 0.0; - /* On Ultrix 4.3 cc, long double is 4 and double is 8. */ - /* On IRIX 5.3, the compiler converts long double to double with a warning, - but compiles this successfully. */ - exit(sizeof(long double) <= sizeof(double)); -} -], ac_cv_c_long_double=yes, ac_cv_c_long_double=no) -fi]) -if test $ac_cv_c_long_double = yes; then - AC_DEFINE(HAVE_LONG_DOUBLE, 1, [Define if the `long double' type works.]) -fi -]) - -dnl -dnl Check for . This is separated out so that it can be -dnl AC_REQUIREd. -dnl -dnl BASH_HEADER_INTTYPES -AC_DEFUN(BASH_HEADER_INTTYPES, -[ - AC_CHECK_HEADERS(inttypes.h) -]) - -dnl -dnl check for typedef'd symbols in header files, but allow the caller to -dnl specify the include files to be checked in addition to the default -dnl -dnl BASH_CHECK_TYPE(TYPE, HEADERS, DEFAULT[, VALUE-IF-FOUND]) -AC_DEFUN(BASH_CHECK_TYPE, -[ -AC_REQUIRE([AC_HEADER_STDC])dnl -AC_REQUIRE([BASH_HEADER_INTTYPES]) -AC_MSG_CHECKING(for $1) -AC_CACHE_VAL(bash_cv_type_$1, -[AC_EGREP_CPP($1, [#include -#if STDC_HEADERS -#include -#include -#endif -#if HAVE_INTTYPES_H -#include -#endif -$2 -], bash_cv_type_$1=yes, bash_cv_type_$1=no)]) -AC_MSG_RESULT($bash_cv_type_$1) -ifelse($#, 4, [if test $bash_cv_type_$1 = yes; then - AC_DEFINE($4) - fi]) -if test $bash_cv_type_$1 = no; then - AC_DEFINE_UNQUOTED($1, $3) -fi -]) - -dnl -dnl BASH_CHECK_DECL(FUNC) -dnl -dnl Check for a declaration of FUNC in stdlib.h and inttypes.h like -dnl AC_CHECK_DECL -dnl -AC_DEFUN(BASH_CHECK_DECL, -[ -AC_REQUIRE([AC_HEADER_STDC]) -AC_REQUIRE([BASH_HEADER_INTTYPES]) -AC_CACHE_CHECK([for declaration of $1], bash_cv_decl_$1, -[AC_TRY_LINK( -[ -#if STDC_HEADERS -# include -#endif -#if HAVE_INTTYPES_H -# include -#endif -], -[return !$1;], -bash_cv_decl_$1=yes, bash_cv_decl_$1=no)]) -bash_tr_func=HAVE_DECL_`echo $1 | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` -if test $bash_cv_decl_$1 = yes; then - AC_DEFINE_UNQUOTED($bash_tr_func, 1) -else - AC_DEFINE_UNQUOTED($bash_tr_func, 0) -fi -]) - -AC_DEFUN(BASH_DECL_PRINTF, -[AC_MSG_CHECKING(for declaration of printf in ) -AC_CACHE_VAL(bash_cv_printf_declared, -[AC_TRY_RUN([ -#include -#ifdef __STDC__ -typedef int (*_bashfunc)(const char *, ...); -#else -typedef int (*_bashfunc)(); -#endif -main() -{ -_bashfunc pf; -pf = (_bashfunc) printf; -exit(pf == 0); -} -], bash_cv_printf_declared=yes, bash_cv_printf_declared=no, - [AC_MSG_WARN(cannot check printf declaration if cross compiling -- defaulting to yes) - bash_cv_printf_declared=yes] -)]) -AC_MSG_RESULT($bash_cv_printf_declared) -if test $bash_cv_printf_declared = yes; then -AC_DEFINE(PRINTF_DECLARED) -fi -]) - -AC_DEFUN(BASH_DECL_SBRK, -[AC_MSG_CHECKING(for declaration of sbrk in ) -AC_CACHE_VAL(bash_cv_sbrk_declared, -[AC_EGREP_HEADER(sbrk, unistd.h, - bash_cv_sbrk_declared=yes, bash_cv_sbrk_declared=no)]) -AC_MSG_RESULT($bash_cv_sbrk_declared) -if test $bash_cv_sbrk_declared = yes; then -AC_DEFINE(SBRK_DECLARED) -fi -]) - -dnl -dnl Check for sys_siglist[] or _sys_siglist[] -dnl -AC_DEFUN(BASH_DECL_UNDER_SYS_SIGLIST, -[AC_MSG_CHECKING([for _sys_siglist in signal.h or unistd.h]) -AC_CACHE_VAL(bash_cv_decl_under_sys_siglist, -[AC_TRY_COMPILE([ -#include -#include -#ifdef HAVE_UNISTD_H -#include -#endif], [ char *msg = _sys_siglist[2]; ], - bash_cv_decl_under_sys_siglist=yes, bash_cv_decl_under_sys_siglist=no, - [AC_MSG_WARN(cannot check for _sys_siglist[] if cross compiling -- defaulting to no)])])dnl -AC_MSG_RESULT($bash_cv_decl_under_sys_siglist) -if test $bash_cv_decl_under_sys_siglist = yes; then -AC_DEFINE(UNDER_SYS_SIGLIST_DECLARED) -fi -]) - -AC_DEFUN(BASH_UNDER_SYS_SIGLIST, -[AC_REQUIRE([BASH_DECL_UNDER_SYS_SIGLIST]) -AC_MSG_CHECKING([for _sys_siglist in system C library]) -AC_CACHE_VAL(bash_cv_under_sys_siglist, -[AC_TRY_RUN([ -#include -#include -#ifdef HAVE_UNISTD_H -#include -#endif -#ifndef UNDER_SYS_SIGLIST_DECLARED -extern char *_sys_siglist[]; -#endif -main() -{ -char *msg = (char *)_sys_siglist[2]; -exit(msg == 0); -}], - bash_cv_under_sys_siglist=yes, bash_cv_under_sys_siglist=no, - [AC_MSG_WARN(cannot check for _sys_siglist[] if cross compiling -- defaulting to no) - bash_cv_under_sys_siglist=no])]) -AC_MSG_RESULT($bash_cv_under_sys_siglist) -if test $bash_cv_under_sys_siglist = yes; then -AC_DEFINE(HAVE_UNDER_SYS_SIGLIST) -fi -]) - -AC_DEFUN(BASH_SYS_SIGLIST, -[AC_REQUIRE([AC_DECL_SYS_SIGLIST]) -AC_MSG_CHECKING([for sys_siglist in system C library]) -AC_CACHE_VAL(bash_cv_sys_siglist, -[AC_TRY_RUN([ -#include -#include -#ifdef HAVE_UNISTD_H -#include -#endif -#ifndef SYS_SIGLIST_DECLARED -extern char *sys_siglist[]; -#endif -main() -{ -char *msg = sys_siglist[2]; -exit(msg == 0); -}], - bash_cv_sys_siglist=yes, bash_cv_sys_siglist=no, - [AC_MSG_WARN(cannot check for sys_siglist if cross compiling -- defaulting to no) - bash_cv_sys_siglist=no])]) -AC_MSG_RESULT($bash_cv_sys_siglist) -if test $bash_cv_sys_siglist = yes; then -AC_DEFINE(HAVE_SYS_SIGLIST) -fi -]) - -dnl Check for the various permutations of sys_siglist and make sure we -dnl compile in siglist.o if they're not defined -AC_DEFUN(BASH_CHECK_SYS_SIGLIST, [ -AC_REQUIRE([BASH_SYS_SIGLIST]) -AC_REQUIRE([BASH_DECL_UNDER_SYS_SIGLIST]) -AC_REQUIRE([BASH_FUNC_STRSIGNAL]) -if test "$bash_cv_sys_siglist" = no && test "$bash_cv_under_sys_siglist" = no && test "$bash_cv_have_strsignal" = no; then - SIGLIST_O=siglist.o -else - SIGLIST_O= -fi -AC_SUBST([SIGLIST_O]) -]) - -dnl Check for sys_errlist[] and sys_nerr, check for declaration -AC_DEFUN(BASH_SYS_ERRLIST, -[AC_MSG_CHECKING([for sys_errlist and sys_nerr]) -AC_CACHE_VAL(bash_cv_sys_errlist, -[AC_TRY_LINK([#include ], -[extern char *sys_errlist[]; - extern int sys_nerr; - char *msg = sys_errlist[sys_nerr - 1];], - bash_cv_sys_errlist=yes, bash_cv_sys_errlist=no)])dnl -AC_MSG_RESULT($bash_cv_sys_errlist) -if test $bash_cv_sys_errlist = yes; then -AC_DEFINE(HAVE_SYS_ERRLIST) -fi -]) - -dnl -dnl Check if dup2() does not clear the close on exec flag -dnl -AC_DEFUN(BASH_FUNC_DUP2_CLOEXEC_CHECK, -[AC_MSG_CHECKING(if dup2 fails to clear the close-on-exec flag) -AC_CACHE_VAL(bash_cv_dup2_broken, -[AC_TRY_RUN([ -#include -#include -main() -{ - int fd1, fd2, fl; - fd1 = open("/dev/null", 2); - if (fcntl(fd1, 2, 1) < 0) - exit(1); - fd2 = dup2(fd1, 1); - if (fd2 < 0) - exit(2); - fl = fcntl(fd2, 1, 0); - /* fl will be 1 if dup2 did not reset the close-on-exec flag. */ - exit(fl != 1); -} -], bash_cv_dup2_broken=yes, bash_cv_dup2_broken=no, - [AC_MSG_WARN(cannot check dup2 if cross compiling -- defaulting to no) - bash_cv_dup2_broken=no]) -]) -AC_MSG_RESULT($bash_cv_dup2_broken) -if test $bash_cv_dup2_broken = yes; then -AC_DEFINE(DUP2_BROKEN) -fi -]) - -AC_DEFUN(BASH_FUNC_STRSIGNAL, -[AC_MSG_CHECKING([for the existence of strsignal]) -AC_CACHE_VAL(bash_cv_have_strsignal, -[AC_TRY_LINK([#include -#include ], -[char *s = (char *)strsignal(2);], - bash_cv_have_strsignal=yes, bash_cv_have_strsignal=no)]) -AC_MSG_RESULT($bash_cv_have_strsignal) -if test $bash_cv_have_strsignal = yes; then -AC_DEFINE(HAVE_STRSIGNAL) -fi -]) - -dnl Check to see if opendir will open non-directories (not a nice thing) -AC_DEFUN(BASH_FUNC_OPENDIR_CHECK, -[AC_REQUIRE([AC_HEADER_DIRENT])dnl -AC_MSG_CHECKING(if opendir() opens non-directories) -AC_CACHE_VAL(bash_cv_opendir_not_robust, -[AC_TRY_RUN([ -#include -#include -#include -#ifdef HAVE_UNISTD_H -# include -#endif /* HAVE_UNISTD_H */ -#if defined(HAVE_DIRENT_H) -# include -#else -# define dirent direct -# ifdef HAVE_SYS_NDIR_H -# include -# endif /* SYSNDIR */ -# ifdef HAVE_SYS_DIR_H -# include -# endif /* SYSDIR */ -# ifdef HAVE_NDIR_H -# include -# endif -#endif /* HAVE_DIRENT_H */ -main() -{ -DIR *dir; -int fd, err; -err = mkdir("/tmp/bash-aclocal", 0700); -if (err < 0) { - perror("mkdir"); - exit(1); -} -unlink("/tmp/bash-aclocal/not_a_directory"); -fd = open("/tmp/bash-aclocal/not_a_directory", O_WRONLY|O_CREAT|O_EXCL, 0666); -write(fd, "\n", 1); -close(fd); -dir = opendir("/tmp/bash-aclocal/not_a_directory"); -unlink("/tmp/bash-aclocal/not_a_directory"); -rmdir("/tmp/bash-aclocal"); -exit (dir == 0); -}], bash_cv_opendir_not_robust=yes,bash_cv_opendir_not_robust=no, - [AC_MSG_WARN(cannot check opendir if cross compiling -- defaulting to no) - bash_cv_opendir_not_robust=no] -)]) -AC_MSG_RESULT($bash_cv_opendir_not_robust) -if test $bash_cv_opendir_not_robust = yes; then -AC_DEFINE(OPENDIR_NOT_ROBUST) -fi -]) - -dnl -AC_DEFUN(BASH_TYPE_SIGHANDLER, -[AC_MSG_CHECKING([whether signal handlers are of type void]) -AC_CACHE_VAL(bash_cv_void_sighandler, -[AC_TRY_COMPILE([#include -#include -#ifdef signal -#undef signal -#endif -#ifdef __cplusplus -extern "C" -#endif -void (*signal ()) ();], -[int i;], bash_cv_void_sighandler=yes, bash_cv_void_sighandler=no)])dnl -AC_MSG_RESULT($bash_cv_void_sighandler) -if test $bash_cv_void_sighandler = yes; then -AC_DEFINE(VOID_SIGHANDLER) -fi -]) - -dnl -dnl A signed 16-bit integer quantity -dnl -AC_DEFUN(BASH_TYPE_BITS16_T, -[ -if test "$ac_cv_sizeof_short" = 2; then - AC_CHECK_TYPE(bits16_t, short) -elif test "$ac_cv_sizeof_char" = 2; then - AC_CHECK_TYPE(bits16_t, char) -else - AC_CHECK_TYPE(bits16_t, short) -fi -]) - -dnl -dnl An unsigned 16-bit integer quantity -dnl -AC_DEFUN(BASH_TYPE_U_BITS16_T, -[ -if test "$ac_cv_sizeof_short" = 2; then - AC_CHECK_TYPE(u_bits16_t, unsigned short) -elif test "$ac_cv_sizeof_char" = 2; then - AC_CHECK_TYPE(u_bits16_t, unsigned char) -else - AC_CHECK_TYPE(u_bits16_t, unsigned short) -fi -]) - -dnl -dnl A signed 32-bit integer quantity -dnl -AC_DEFUN(BASH_TYPE_BITS32_T, -[ -if test "$ac_cv_sizeof_int" = 4; then - AC_CHECK_TYPE(bits32_t, int) -elif test "$ac_cv_sizeof_long" = 4; then - AC_CHECK_TYPE(bits32_t, long) -else - AC_CHECK_TYPE(bits32_t, int) -fi -]) - -dnl -dnl An unsigned 32-bit integer quantity -dnl -AC_DEFUN(BASH_TYPE_U_BITS32_T, -[ -if test "$ac_cv_sizeof_int" = 4; then - AC_CHECK_TYPE(u_bits32_t, unsigned int) -elif test "$ac_cv_sizeof_long" = 4; then - AC_CHECK_TYPE(u_bits32_t, unsigned long) -else - AC_CHECK_TYPE(u_bits32_t, unsigned int) -fi -]) - -AC_DEFUN(BASH_TYPE_PTRDIFF_T, -[ -if test "$ac_cv_sizeof_int" = "$ac_cv_sizeof_char_p"; then - AC_CHECK_TYPE(ptrdiff_t, int) -elif test "$ac_cv_sizeof_long" = "$ac_cv_sizeof_char_p"; then - AC_CHECK_TYPE(ptrdiff_t, long) -elif test "$ac_cv_type_long_long" = yes && test "$ac_cv_sizeof_long_long" = "$ac_cv_sizeof_char_p"; then - AC_CHECK_TYPE(ptrdiff_t, [long long]) -else - AC_CHECK_TYPE(ptrdiff_t, int) -fi -]) - -dnl -dnl A signed 64-bit quantity -dnl -AC_DEFUN(BASH_TYPE_BITS64_T, -[ -if test "$ac_cv_sizeof_char_p" = 8; then - AC_CHECK_TYPE(bits64_t, char *) -elif test "$ac_cv_sizeof_double" = 8; then - AC_CHECK_TYPE(bits64_t, double) -elif test -n "$ac_cv_type_long_long" && test "$ac_cv_sizeof_long_long" = 8; then - AC_CHECK_TYPE(bits64_t, [long long]) -elif test "$ac_cv_sizeof_long" = 8; then - AC_CHECK_TYPE(bits64_t, long) -else - AC_CHECK_TYPE(bits64_t, double) -fi -]) - -AC_DEFUN(BASH_TYPE_LONG_LONG, -[ -AC_CACHE_CHECK([for long long], bash_cv_type_long_long, -[AC_TRY_LINK([ -long long ll = 1; int i = 63;], -[ -long long llm = (long long) -1; -return ll << i | ll >> i | llm / ll | llm % ll; -], bash_cv_type_long_long='long long', bash_cv_type_long_long='long')]) -if test "$bash_cv_type_long_long" = 'long long'; then - AC_DEFINE(HAVE_LONG_LONG, 1) -fi -]) - -AC_DEFUN(BASH_TYPE_UNSIGNED_LONG_LONG, -[ -AC_CACHE_CHECK([for unsigned long long], bash_cv_type_unsigned_long_long, -[AC_TRY_LINK([ -unsigned long long ull = 1; int i = 63;], -[ -unsigned long long ullmax = (unsigned long long) -1; -return ull << i | ull >> i | ullmax / ull | ullmax % ull; -], bash_cv_type_unsigned_long_long='unsigned long long', - bash_cv_type_unsigned_long_long='unsigned long')]) -if test "$bash_cv_type_unsigned_long_long" = 'unsigned long long'; then - AC_DEFINE(HAVE_UNSIGNED_LONG_LONG, 1) -fi -]) - -dnl -dnl Type of struct rlimit fields: some systems (OSF/1, NetBSD, RISC/os 5.0) -dnl have a rlim_t, others (4.4BSD based systems) use quad_t, others use -dnl long and still others use int (HP-UX 9.01, SunOS 4.1.3). To simplify -dnl matters, this just checks for rlim_t, quad_t, or long. -dnl -AC_DEFUN(BASH_TYPE_RLIMIT, -[AC_MSG_CHECKING(for size and type of struct rlimit fields) -AC_CACHE_VAL(bash_cv_type_rlimit, -[AC_TRY_COMPILE([#include -#include ], -[rlim_t xxx;], bash_cv_type_rlimit=rlim_t,[ -AC_TRY_RUN([ -#include -#include -#include -main() -{ -#ifdef HAVE_QUAD_T - struct rlimit rl; - if (sizeof(rl.rlim_cur) == sizeof(quad_t)) - exit(0); -#endif - exit(1); -}], bash_cv_type_rlimit=quad_t, bash_cv_type_rlimit=long, - [AC_MSG_WARN(cannot check quad_t if cross compiling -- defaulting to long) - bash_cv_type_rlimit=long])]) -]) -AC_MSG_RESULT($bash_cv_type_rlimit) -if test $bash_cv_type_rlimit = quad_t; then -AC_DEFINE(RLIMTYPE, quad_t) -elif test $bash_cv_type_rlimit = rlim_t; then -AC_DEFINE(RLIMTYPE, rlim_t) -fi -]) - -AC_DEFUN(BASH_FUNC_LSTAT, -[dnl Cannot use AC_CHECK_FUNCS(lstat) because Linux defines lstat() as an -dnl inline function in . -AC_CACHE_CHECK([for lstat], bash_cv_func_lstat, -[AC_TRY_LINK([ -#include -#include -],[ lstat(".",(struct stat *)0); ], -bash_cv_func_lstat=yes, bash_cv_func_lstat=no)]) -if test $bash_cv_func_lstat = yes; then - AC_DEFINE(HAVE_LSTAT) -fi -]) - -AC_DEFUN(BASH_FUNC_INET_ATON, -[ -AC_CACHE_CHECK([for inet_aton], bash_cv_func_inet_aton, -[AC_TRY_LINK([ -#include -#include -#include -struct in_addr ap;], [ inet_aton("127.0.0.1", &ap); ], -bash_cv_func_inet_aton=yes, bash_cv_func_inet_aton=no)]) -if test $bash_cv_func_inet_aton = yes; then - AC_DEFINE(HAVE_INET_ATON) -else - AC_LIBOBJ(inet_aton) -fi -]) - -AC_DEFUN(BASH_FUNC_GETENV, -[AC_MSG_CHECKING(to see if getenv can be redefined) -AC_CACHE_VAL(bash_cv_getenv_redef, -[AC_TRY_RUN([ -#ifdef HAVE_UNISTD_H -# include -#endif -#ifndef __STDC__ -# ifndef const -# define const -# endif -#endif -char * -getenv (name) -#if defined (__linux__) || defined (__bsdi__) || defined (convex) - const char *name; -#else - char const *name; -#endif /* !__linux__ && !__bsdi__ && !convex */ -{ -return "42"; -} -main() -{ -char *s; -/* The next allows this program to run, but does not allow bash to link - when it redefines getenv. I'm not really interested in figuring out - why not. */ -#if defined (NeXT) -exit(1); -#endif -s = getenv("ABCDE"); -exit(s == 0); /* force optimizer to leave getenv in */ -} -], bash_cv_getenv_redef=yes, bash_cv_getenv_redef=no, - [AC_MSG_WARN(cannot check getenv redefinition if cross compiling -- defaulting to yes) - bash_cv_getenv_redef=yes] -)]) -AC_MSG_RESULT($bash_cv_getenv_redef) -if test $bash_cv_getenv_redef = yes; then -AC_DEFINE(CAN_REDEFINE_GETENV) -fi -]) - -# We should check for putenv before calling this -AC_DEFUN(BASH_FUNC_STD_PUTENV, -[ -AC_REQUIRE([AC_HEADER_STDC]) -AC_REQUIRE([AC_C_PROTOTYPES]) -AC_CACHE_CHECK([for standard-conformant putenv declaration], bash_cv_std_putenv, -[AC_TRY_LINK([ -#if STDC_HEADERS -#include -#include -#endif -#ifndef __STDC__ -# ifndef const -# define const -# endif -#endif -#ifdef PROTOTYPES -extern int putenv (char *); -#else -extern int putenv (); -#endif -], -[return (putenv == 0);], -bash_cv_std_putenv=yes, bash_cv_std_putenv=no -)]) -if test $bash_cv_std_putenv = yes; then -AC_DEFINE(HAVE_STD_PUTENV) -fi -]) - -# We should check for unsetenv before calling this -AC_DEFUN(BASH_FUNC_STD_UNSETENV, -[ -AC_REQUIRE([AC_HEADER_STDC]) -AC_REQUIRE([AC_C_PROTOTYPES]) -AC_CACHE_CHECK([for standard-conformant unsetenv declaration], bash_cv_std_unsetenv, -[AC_TRY_LINK([ -#if STDC_HEADERS -#include -#include -#endif -#ifndef __STDC__ -# ifndef const -# define const -# endif -#endif -#ifdef PROTOTYPES -extern int unsetenv (const char *); -#else -extern int unsetenv (); -#endif -], -[return (unsetenv == 0);], -bash_cv_std_unsetenv=yes, bash_cv_std_unsetenv=no -)]) -if test $bash_cv_std_unsetenv = yes; then -AC_DEFINE(HAVE_STD_UNSETENV) -fi -]) - -AC_DEFUN(BASH_FUNC_ULIMIT_MAXFDS, -[AC_MSG_CHECKING(whether ulimit can substitute for getdtablesize) -AC_CACHE_VAL(bash_cv_ulimit_maxfds, -[AC_TRY_RUN([ -main() -{ -long maxfds = ulimit(4, 0L); -exit (maxfds == -1L); -} -], bash_cv_ulimit_maxfds=yes, bash_cv_ulimit_maxfds=no, - [AC_MSG_WARN(cannot check ulimit if cross compiling -- defaulting to no) - bash_cv_ulimit_maxfds=no] -)]) -AC_MSG_RESULT($bash_cv_ulimit_maxfds) -if test $bash_cv_ulimit_maxfds = yes; then -AC_DEFINE(ULIMIT_MAXFDS) -fi -]) - -AC_DEFUN(BASH_FUNC_GETCWD, -[AC_MSG_CHECKING([if getcwd() will dynamically allocate memory]) -AC_CACHE_VAL(bash_cv_getcwd_malloc, -[AC_TRY_RUN([ -#include -#ifdef HAVE_UNISTD_H -#include -#endif - -main() -{ - char *xpwd; - xpwd = getcwd(0, 0); - exit (xpwd == 0); -} -], bash_cv_getcwd_malloc=yes, bash_cv_getcwd_malloc=no, - [AC_MSG_WARN(cannot check whether getcwd allocates memory when cross-compiling -- defaulting to no) - bash_cv_getcwd_malloc=no] -)]) -AC_MSG_RESULT($bash_cv_getcwd_malloc) -if test $bash_cv_getcwd_malloc = no; then -AC_DEFINE(GETCWD_BROKEN) -AC_LIBOBJ(getcwd) -fi -]) - -dnl -dnl This needs BASH_CHECK_SOCKLIB, but since that's not called on every -dnl system, we can't use AC_PREREQ -dnl -AC_DEFUN(BASH_FUNC_GETHOSTBYNAME, -[if test "X$bash_cv_have_gethostbyname" = "X"; then -_bash_needmsg=yes -else -AC_MSG_CHECKING(for gethostbyname in socket library) -_bash_needmsg= -fi -AC_CACHE_VAL(bash_cv_have_gethostbyname, -[AC_TRY_LINK([#include ], -[ struct hostent *hp; - hp = gethostbyname("localhost"); -], bash_cv_have_gethostbyname=yes, bash_cv_have_gethostbyname=no)] -) -if test "X$_bash_needmsg" = Xyes; then - AC_MSG_CHECKING(for gethostbyname in socket library) -fi -AC_MSG_RESULT($bash_cv_have_gethostbyname) -if test "$bash_cv_have_gethostbyname" = yes; then -AC_DEFINE(HAVE_GETHOSTBYNAME) -fi -]) - -AC_DEFUN(BASH_FUNC_FNMATCH_EXTMATCH, -[AC_MSG_CHECKING(if fnmatch does extended pattern matching with FNM_EXTMATCH) -AC_CACHE_VAL(bash_cv_fnm_extmatch, -[AC_TRY_RUN([ -#include - -main() -{ -#ifdef FNM_EXTMATCH - exit (0); -#else - exit (1); -#endif -} -], bash_cv_fnm_extmatch=yes, bash_cv_fnm_extmatch=no, - [AC_MSG_WARN(cannot check FNM_EXTMATCH if cross compiling -- defaulting to no) - bash_cv_fnm_extmatch=no]) -]) -AC_MSG_RESULT($bash_cv_fnm_extmatch) -if test $bash_cv_fnm_extmatch = yes; then -AC_DEFINE(HAVE_LIBC_FNM_EXTMATCH) -fi -]) - -AC_DEFUN(BASH_FUNC_POSIX_SETJMP, -[AC_REQUIRE([BASH_SYS_SIGNAL_VINTAGE]) -AC_MSG_CHECKING(for presence of POSIX-style sigsetjmp/siglongjmp) -AC_CACHE_VAL(bash_cv_func_sigsetjmp, -[AC_TRY_RUN([ -#ifdef HAVE_UNISTD_H -#include -#endif -#include -#include -#include - -main() -{ -#if !defined (_POSIX_VERSION) || !defined (HAVE_POSIX_SIGNALS) -exit (1); -#else - -int code; -sigset_t set, oset; -sigjmp_buf xx; - -/* get the mask */ -sigemptyset(&set); -sigemptyset(&oset); -sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &set); -sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &oset); - -/* save it */ -code = sigsetjmp(xx, 1); -if (code) - exit(0); /* could get sigmask and compare to oset here. */ - -/* change it */ -sigaddset(&set, SIGINT); -sigprocmask(SIG_BLOCK, &set, (sigset_t *)NULL); - -/* and siglongjmp */ -siglongjmp(xx, 10); -exit(1); -#endif -}], bash_cv_func_sigsetjmp=present, bash_cv_func_sigsetjmp=missing, - [AC_MSG_WARN(cannot check for sigsetjmp/siglongjmp if cross-compiling -- defaulting to missing) - bash_cv_func_sigsetjmp=missing] -)]) -AC_MSG_RESULT($bash_cv_func_sigsetjmp) -if test $bash_cv_func_sigsetjmp = present; then -AC_DEFINE(HAVE_POSIX_SIGSETJMP) -fi -]) - -AC_DEFUN(BASH_FUNC_STRCOLL, -[ -AC_MSG_CHECKING(whether or not strcoll and strcmp differ) -AC_CACHE_VAL(bash_cv_func_strcoll_broken, -[AC_TRY_RUN([ -#include -#if defined (HAVE_LOCALE_H) -#include -#endif - -main(c, v) -int c; -char *v[]; -{ - int r1, r2; - char *deflocale, *defcoll; - -#ifdef HAVE_SETLOCALE - deflocale = setlocale(LC_ALL, ""); - defcoll = setlocale(LC_COLLATE, ""); -#endif - -#ifdef HAVE_STRCOLL - /* These two values are taken from tests/glob-test. */ - r1 = strcoll("abd", "aXd"); -#else - r1 = 0; -#endif - r2 = strcmp("abd", "aXd"); - - /* These two should both be greater than 0. It is permissible for - a system to return different values, as long as the sign is the - same. */ - - /* Exit with 1 (failure) if these two values are both > 0, since - this tests whether strcoll(3) is broken with respect to strcmp(3) - in the default locale. */ - exit (r1 > 0 && r2 > 0); -} -], bash_cv_func_strcoll_broken=yes, bash_cv_func_strcoll_broken=no, - [AC_MSG_WARN(cannot check strcoll if cross compiling -- defaulting to no) - bash_cv_func_strcoll_broken=no] -)]) -AC_MSG_RESULT($bash_cv_func_strcoll_broken) -if test $bash_cv_func_strcoll_broken = yes; then -AC_DEFINE(STRCOLL_BROKEN) -fi -]) - -AC_DEFUN(BASH_FUNC_PRINTF_A_FORMAT, -[AC_MSG_CHECKING([for printf floating point output in hex notation]) -AC_CACHE_VAL(bash_cv_printf_a_format, -[AC_TRY_RUN([ -#include -#include - -int -main() -{ - double y = 0.0; - char abuf[1024]; - - sprintf(abuf, "%A", y); - exit(strchr(abuf, 'P') == (char *)0); -} -], bash_cv_printf_a_format=yes, bash_cv_printf_a_format=no, - [AC_MSG_WARN(cannot check printf if cross compiling -- defaulting to no) - bash_cv_printf_a_format=no] -)]) -AC_MSG_RESULT($bash_cv_printf_a_format) -if test $bash_cv_printf_a_format = yes; then -AC_DEFINE(HAVE_PRINTF_A_FORMAT) -fi -]) - -AC_DEFUN(BASH_STRUCT_TERMIOS_LDISC, -[ -AC_CHECK_MEMBER(struct termios.c_line, AC_DEFINE(TERMIOS_LDISC), ,[ -#include -#include -]) -]) - -AC_DEFUN(BASH_STRUCT_TERMIO_LDISC, -[ -AC_CHECK_MEMBER(struct termio.c_line, AC_DEFINE(TERMIO_LDISC), ,[ -#include -#include -]) -]) - -dnl -dnl Like AC_STRUCT_ST_BLOCKS, but doesn't muck with LIBOBJS -dnl -dnl sets bash_cv_struct_stat_st_blocks -dnl -dnl unused for now; we'll see how AC_CHECK_MEMBERS works -dnl -AC_DEFUN(BASH_STRUCT_ST_BLOCKS, -[ -AC_MSG_CHECKING([for struct stat.st_blocks]) -AC_CACHE_VAL(bash_cv_struct_stat_st_blocks, -[AC_TRY_COMPILE( -[ -#include -#include -], -[ -main() -{ -static struct stat a; -if (a.st_blocks) return 0; -return 0; -} -], bash_cv_struct_stat_st_blocks=yes, bash_cv_struct_stat_st_blocks=no) -]) -AC_MSG_RESULT($bash_cv_struct_stat_st_blocks) -if test "$bash_cv_struct_stat_st_blocks" = "yes"; then -AC_DEFINE(HAVE_STRUCT_STAT_ST_BLOCKS) -fi -]) - -AC_DEFUN(BASH_CHECK_LIB_TERMCAP, -[ -if test "X$bash_cv_termcap_lib" = "X"; then -_bash_needmsg=yes -else -AC_MSG_CHECKING(which library has the termcap functions) -_bash_needmsg= -fi -AC_CACHE_VAL(bash_cv_termcap_lib, -[AC_CHECK_FUNC(tgetent, bash_cv_termcap_lib=libc, - [AC_CHECK_LIB(termcap, tgetent, bash_cv_termcap_lib=libtermcap, - [AC_CHECK_LIB(tinfo, tgetent, bash_cv_termcap_lib=libtinfo, - [AC_CHECK_LIB(curses, tgetent, bash_cv_termcap_lib=libcurses, - [AC_CHECK_LIB(ncurses, tgetent, bash_cv_termcap_lib=libncurses, - bash_cv_termcap_lib=gnutermcap)])])])])]) -if test "X$_bash_needmsg" = "Xyes"; then -AC_MSG_CHECKING(which library has the termcap functions) -fi -AC_MSG_RESULT(using $bash_cv_termcap_lib) -if test $bash_cv_termcap_lib = gnutermcap && test -z "$prefer_curses"; then -LDFLAGS="$LDFLAGS -L./lib/termcap" -TERMCAP_LIB="./lib/termcap/libtermcap.a" -TERMCAP_DEP="./lib/termcap/libtermcap.a" -elif test $bash_cv_termcap_lib = libtermcap && test -z "$prefer_curses"; then -TERMCAP_LIB=-ltermcap -TERMCAP_DEP= -elif test $bash_cv_termcap_lib = libtinfo; then -TERMCAP_LIB=-ltinfo -TERMCAP_DEP= -elif test $bash_cv_termcap_lib = libncurses; then -TERMCAP_LIB=-lncurses -TERMCAP_DEP= -elif test $bash_cv_termcap_lib = libc; then -TERMCAP_LIB= -TERMCAP_DEP= -else -TERMCAP_LIB=-lcurses -TERMCAP_DEP= -fi -]) - -dnl -dnl Check for the presence of getpeername in libsocket. -dnl If libsocket is present, check for libnsl and add it to LIBS if -dnl it's there, since most systems with libsocket require linking -dnl with libnsl as well. This should only be called if getpeername -dnl was not found in libc. -dnl -dnl NOTE: IF WE FIND GETPEERNAME, WE ASSUME THAT WE HAVE BIND/CONNECT -dnl AS WELL -dnl -AC_DEFUN(BASH_CHECK_LIB_SOCKET, -[ -if test "X$bash_cv_have_socklib" = "X"; then -_bash_needmsg= -else -AC_MSG_CHECKING(for socket library) -_bash_needmsg=yes -fi -AC_CACHE_VAL(bash_cv_have_socklib, -[AC_CHECK_LIB(socket, getpeername, - bash_cv_have_socklib=yes, bash_cv_have_socklib=no, -lnsl)]) -if test "X$_bash_needmsg" = Xyes; then - AC_MSG_RESULT($bash_cv_have_socklib) - _bash_needmsg= -fi -if test $bash_cv_have_socklib = yes; then - # check for libnsl, add it to LIBS if present - if test "X$bash_cv_have_libnsl" = "X"; then - _bash_needmsg= - else - AC_MSG_CHECKING(for libnsl) - _bash_needmsg=yes - fi - AC_CACHE_VAL(bash_cv_have_libnsl, - [AC_CHECK_LIB(nsl, t_open, - bash_cv_have_libnsl=yes, bash_cv_have_libnsl=no)]) - if test "X$_bash_needmsg" = Xyes; then - AC_MSG_RESULT($bash_cv_have_libnsl) - _bash_needmsg= - fi - if test $bash_cv_have_libnsl = yes; then - LIBS="-lsocket -lnsl $LIBS" - else - LIBS="-lsocket $LIBS" - fi - AC_DEFINE(HAVE_LIBSOCKET) - AC_DEFINE(HAVE_GETPEERNAME) -fi -]) - -AC_DEFUN(BASH_STRUCT_DIRENT_D_INO, -[AC_REQUIRE([AC_HEADER_DIRENT]) -AC_MSG_CHECKING(for struct dirent.d_ino) -AC_CACHE_VAL(bash_cv_dirent_has_dino, -[AC_TRY_COMPILE([ -#include -#include -#ifdef HAVE_UNISTD_H -# include -#endif /* HAVE_UNISTD_H */ -#if defined(HAVE_DIRENT_H) -# include -#else -# define dirent direct -# ifdef HAVE_SYS_NDIR_H -# include -# endif /* SYSNDIR */ -# ifdef HAVE_SYS_DIR_H -# include -# endif /* SYSDIR */ -# ifdef HAVE_NDIR_H -# include -# endif -#endif /* HAVE_DIRENT_H */ -],[ -struct dirent d; int z; z = d.d_ino; -], bash_cv_dirent_has_dino=yes, bash_cv_dirent_has_dino=no)]) -AC_MSG_RESULT($bash_cv_dirent_has_dino) -if test $bash_cv_dirent_has_dino = yes; then -AC_DEFINE(HAVE_STRUCT_DIRENT_D_INO) -fi -]) - -AC_DEFUN(BASH_STRUCT_DIRENT_D_FILENO, -[AC_REQUIRE([AC_HEADER_DIRENT]) -AC_MSG_CHECKING(for struct dirent.d_fileno) -AC_CACHE_VAL(bash_cv_dirent_has_d_fileno, -[AC_TRY_COMPILE([ -#include -#include -#ifdef HAVE_UNISTD_H -# include -#endif /* HAVE_UNISTD_H */ -#if defined(HAVE_DIRENT_H) -# include -#else -# define dirent direct -# ifdef HAVE_SYS_NDIR_H -# include -# endif /* SYSNDIR */ -# ifdef HAVE_SYS_DIR_H -# include -# endif /* SYSDIR */ -# ifdef HAVE_NDIR_H -# include -# endif -#endif /* HAVE_DIRENT_H */ -],[ -struct dirent d; int z; z = d.d_fileno; -], bash_cv_dirent_has_d_fileno=yes, bash_cv_dirent_has_d_fileno=no)]) -AC_MSG_RESULT($bash_cv_dirent_has_d_fileno) -if test $bash_cv_dirent_has_d_fileno = yes; then -AC_DEFINE(HAVE_STRUCT_DIRENT_D_FILENO) -fi -]) - -AC_DEFUN(BASH_STRUCT_DIRENT_D_NAMLEN, -[AC_REQUIRE([AC_HEADER_DIRENT]) -AC_MSG_CHECKING(for struct dirent.d_namlen) -AC_CACHE_VAL(bash_cv_dirent_has_d_namlen, -[AC_TRY_COMPILE([ -#include -#include -#ifdef HAVE_UNISTD_H -# include -#endif /* HAVE_UNISTD_H */ -#if defined(HAVE_DIRENT_H) -# include -#else -# define dirent direct -# ifdef HAVE_SYS_NDIR_H -# include -# endif /* SYSNDIR */ -# ifdef HAVE_SYS_DIR_H -# include -# endif /* SYSDIR */ -# ifdef HAVE_NDIR_H -# include -# endif -#endif /* HAVE_DIRENT_H */ -],[ -struct dirent d; int z; z = d.d_namlen; -], bash_cv_dirent_has_d_namlen=yes, bash_cv_dirent_has_d_namlen=no)]) -AC_MSG_RESULT($bash_cv_dirent_has_d_namlen) -if test $bash_cv_dirent_has_d_namlen = yes; then -AC_DEFINE(HAVE_STRUCT_DIRENT_D_NAMLEN) -fi -]) - -AC_DEFUN(BASH_STRUCT_TIMEVAL, -[AC_MSG_CHECKING(for struct timeval in sys/time.h and time.h) -AC_CACHE_VAL(bash_cv_struct_timeval, -[ -AC_EGREP_HEADER(struct timeval, sys/time.h, - bash_cv_struct_timeval=yes, - AC_EGREP_HEADER(struct timeval, time.h, - bash_cv_struct_timeval=yes, - bash_cv_struct_timeval=no)) -]) -AC_MSG_RESULT($bash_cv_struct_timeval) -if test $bash_cv_struct_timeval = yes; then - AC_DEFINE(HAVE_TIMEVAL) -fi -]) - -AC_DEFUN(BASH_STRUCT_TIMEZONE, -[AC_MSG_CHECKING(for struct timezone in sys/time.h and time.h) -AC_CACHE_VAL(bash_cv_struct_timezone, -[ -AC_EGREP_HEADER(struct timezone, sys/time.h, - bash_cv_struct_timezone=yes, - AC_EGREP_HEADER(struct timezone, time.h, - bash_cv_struct_timezone=yes, - bash_cv_struct_timezone=no)) -]) -AC_MSG_RESULT($bash_cv_struct_timezone) -if test $bash_cv_struct_timezone = yes; then - AC_DEFINE(HAVE_STRUCT_TIMEZONE) -fi -]) - -AC_DEFUN(BASH_STRUCT_WINSIZE, -[AC_MSG_CHECKING(for struct winsize in sys/ioctl.h and termios.h) -AC_CACHE_VAL(bash_cv_struct_winsize_header, -[AC_TRY_COMPILE([#include -#include ], [struct winsize x;], - bash_cv_struct_winsize_header=ioctl_h, - [AC_TRY_COMPILE([#include -#include ], [struct winsize x;], - bash_cv_struct_winsize_header=termios_h, bash_cv_struct_winsize_header=other) -])]) -if test $bash_cv_struct_winsize_header = ioctl_h; then - AC_MSG_RESULT(sys/ioctl.h) - AC_DEFINE(STRUCT_WINSIZE_IN_SYS_IOCTL) -elif test $bash_cv_struct_winsize_header = termios_h; then - AC_MSG_RESULT(termios.h) - AC_DEFINE(STRUCT_WINSIZE_IN_TERMIOS) -else - AC_MSG_RESULT(not found) -fi -]) - -dnl Check type of signal routines (posix, 4.2bsd, 4.1bsd or v7) -AC_DEFUN(BASH_SYS_SIGNAL_VINTAGE, -[AC_REQUIRE([AC_TYPE_SIGNAL]) -AC_MSG_CHECKING(for type of signal functions) -AC_CACHE_VAL(bash_cv_signal_vintage, -[ - AC_TRY_LINK([#include ],[ - sigset_t ss; - struct sigaction sa; - sigemptyset(&ss); sigsuspend(&ss); - sigaction(SIGINT, &sa, (struct sigaction *) 0); - sigprocmask(SIG_BLOCK, &ss, (sigset_t *) 0); - ], bash_cv_signal_vintage=posix, - [ - AC_TRY_LINK([#include ], [ - int mask = sigmask(SIGINT); - sigsetmask(mask); sigblock(mask); sigpause(mask); - ], bash_cv_signal_vintage=4.2bsd, - [ - AC_TRY_LINK([ - #include - RETSIGTYPE foo() { }], [ - int mask = sigmask(SIGINT); - sigset(SIGINT, foo); sigrelse(SIGINT); - sighold(SIGINT); sigpause(SIGINT); - ], bash_cv_signal_vintage=svr3, bash_cv_signal_vintage=v7 - )] - )] -) -]) -AC_MSG_RESULT($bash_cv_signal_vintage) -if test "$bash_cv_signal_vintage" = posix; then -AC_DEFINE(HAVE_POSIX_SIGNALS) -elif test "$bash_cv_signal_vintage" = "4.2bsd"; then -AC_DEFINE(HAVE_BSD_SIGNALS) -elif test "$bash_cv_signal_vintage" = svr3; then -AC_DEFINE(HAVE_USG_SIGHOLD) -fi -]) - -dnl Check if the pgrp of setpgrp() can't be the pid of a zombie process. -AC_DEFUN(BASH_SYS_PGRP_SYNC, -[AC_REQUIRE([AC_FUNC_GETPGRP]) -AC_MSG_CHECKING(whether pgrps need synchronization) -AC_CACHE_VAL(bash_cv_pgrp_pipe, -[AC_TRY_RUN([ -#ifdef HAVE_UNISTD_H -# include -#endif -main() -{ -# ifdef GETPGRP_VOID -# define getpgID() getpgrp() -# else -# define getpgID() getpgrp(0) -# define setpgid(x,y) setpgrp(x,y) -# endif - int pid1, pid2, fds[2]; - int status; - char ok; - - switch (pid1 = fork()) { - case -1: - exit(1); - case 0: - setpgid(0, getpid()); - exit(0); - } - setpgid(pid1, pid1); - - sleep(2); /* let first child die */ - - if (pipe(fds) < 0) - exit(2); - - switch (pid2 = fork()) { - case -1: - exit(3); - case 0: - setpgid(0, pid1); - ok = getpgID() == pid1; - write(fds[1], &ok, 1); - exit(0); - } - setpgid(pid2, pid1); - - close(fds[1]); - if (read(fds[0], &ok, 1) != 1) - exit(4); - wait(&status); - wait(&status); - exit(ok ? 0 : 5); -} -], bash_cv_pgrp_pipe=no,bash_cv_pgrp_pipe=yes, - [AC_MSG_WARN(cannot check pgrp synchronization if cross compiling -- defaulting to no) - bash_cv_pgrp_pipe=no]) -]) -AC_MSG_RESULT($bash_cv_pgrp_pipe) -if test $bash_cv_pgrp_pipe = yes; then -AC_DEFINE(PGRP_PIPE) -fi -]) - -AC_DEFUN(BASH_SYS_REINSTALL_SIGHANDLERS, -[AC_REQUIRE([AC_TYPE_SIGNAL]) -AC_REQUIRE([BASH_SYS_SIGNAL_VINTAGE]) -AC_MSG_CHECKING([if signal handlers must be reinstalled when invoked]) -AC_CACHE_VAL(bash_cv_must_reinstall_sighandlers, -[AC_TRY_RUN([ -#include -#ifdef HAVE_UNISTD_H -#include -#endif - -typedef RETSIGTYPE sigfunc(); - -int nsigint; - -#ifdef HAVE_POSIX_SIGNALS -sigfunc * -set_signal_handler(sig, handler) - int sig; - sigfunc *handler; -{ - struct sigaction act, oact; - act.sa_handler = handler; - act.sa_flags = 0; - sigemptyset (&act.sa_mask); - sigemptyset (&oact.sa_mask); - sigaction (sig, &act, &oact); - return (oact.sa_handler); -} -#else -#define set_signal_handler(s, h) signal(s, h) -#endif - -RETSIGTYPE -sigint(s) -int s; -{ - nsigint++; -} - -main() -{ - nsigint = 0; - set_signal_handler(SIGINT, sigint); - kill((int)getpid(), SIGINT); - kill((int)getpid(), SIGINT); - exit(nsigint != 2); -} -], bash_cv_must_reinstall_sighandlers=no, bash_cv_must_reinstall_sighandlers=yes, - [AC_MSG_WARN(cannot check signal handling if cross compiling -- defaulting to no) - bash_cv_must_reinstall_sighandlers=no] -)]) -AC_MSG_RESULT($bash_cv_must_reinstall_sighandlers) -if test $bash_cv_must_reinstall_sighandlers = yes; then -AC_DEFINE(MUST_REINSTALL_SIGHANDLERS) -fi -]) - -dnl check that some necessary job control definitions are present -AC_DEFUN(BASH_SYS_JOB_CONTROL_MISSING, -[AC_REQUIRE([BASH_SYS_SIGNAL_VINTAGE]) -AC_MSG_CHECKING(for presence of necessary job control definitions) -AC_CACHE_VAL(bash_cv_job_control_missing, -[AC_TRY_RUN([ -#include -#ifdef HAVE_SYS_WAIT_H -#include -#endif -#ifdef HAVE_UNISTD_H -#include -#endif -#include - -/* Add more tests in here as appropriate. */ -main() -{ -/* signal type */ -#if !defined (HAVE_POSIX_SIGNALS) && !defined (HAVE_BSD_SIGNALS) -exit(1); -#endif - -/* signals and tty control. */ -#if !defined (SIGTSTP) || !defined (SIGSTOP) || !defined (SIGCONT) -exit (1); -#endif - -/* process control */ -#if !defined (WNOHANG) || !defined (WUNTRACED) -exit(1); -#endif - -/* Posix systems have tcgetpgrp and waitpid. */ -#if defined (_POSIX_VERSION) && !defined (HAVE_TCGETPGRP) -exit(1); -#endif - -#if defined (_POSIX_VERSION) && !defined (HAVE_WAITPID) -exit(1); -#endif - -/* Other systems have TIOCSPGRP/TIOCGPRGP and wait3. */ -#if !defined (_POSIX_VERSION) && !defined (HAVE_WAIT3) -exit(1); -#endif - -exit(0); -}], bash_cv_job_control_missing=present, bash_cv_job_control_missing=missing, - [AC_MSG_WARN(cannot check job control if cross-compiling -- defaulting to missing) - bash_cv_job_control_missing=missing] -)]) -AC_MSG_RESULT($bash_cv_job_control_missing) -if test $bash_cv_job_control_missing = missing; then -AC_DEFINE(JOB_CONTROL_MISSING) -fi -]) - -dnl check whether named pipes are present -dnl this requires a previous check for mkfifo, but that is awkward to specify -AC_DEFUN(BASH_SYS_NAMED_PIPES, -[AC_MSG_CHECKING(for presence of named pipes) -AC_CACHE_VAL(bash_cv_sys_named_pipes, -[AC_TRY_RUN([ -#include -#include -#ifdef HAVE_UNISTD_H -#include -#endif - -/* Add more tests in here as appropriate. */ -main() -{ -int fd, err; - -#if defined (HAVE_MKFIFO) -exit (0); -#endif - -#if !defined (S_IFIFO) && (defined (_POSIX_VERSION) && !defined (S_ISFIFO)) -exit (1); -#endif - -#if defined (NeXT) -exit (1); -#endif -err = mkdir("/tmp/bash-aclocal", 0700); -if (err < 0) { - perror ("mkdir"); - exit(1); -} -fd = mknod ("/tmp/bash-aclocal/sh-np-autoconf", 0666 | S_IFIFO, 0); -if (fd == -1) { - rmdir ("/tmp/bash-aclocal"); - exit (1); -} -close(fd); -unlink ("/tmp/bash-aclocal/sh-np-autoconf"); -rmdir ("/tmp/bash-aclocal"); -exit(0); -}], bash_cv_sys_named_pipes=present, bash_cv_sys_named_pipes=missing, - [AC_MSG_WARN(cannot check for named pipes if cross-compiling -- defaulting to missing) - bash_cv_sys_named_pipes=missing] -)]) -AC_MSG_RESULT($bash_cv_sys_named_pipes) -if test $bash_cv_sys_named_pipes = missing; then -AC_DEFINE(NAMED_PIPES_MISSING) -fi -]) - -AC_DEFUN(BASH_SYS_DEFAULT_MAIL_DIR, -[AC_MSG_CHECKING(for default mail directory) -AC_CACHE_VAL(bash_cv_mail_dir, -[if test -d /var/mail; then - bash_cv_mail_dir=/var/mail - elif test -d /var/spool/mail; then - bash_cv_mail_dir=/var/spool/mail - elif test -d /usr/mail; then - bash_cv_mail_dir=/usr/mail - elif test -d /usr/spool/mail; then - bash_cv_mail_dir=/usr/spool/mail - else - bash_cv_mail_dir=unknown - fi -]) -AC_MSG_RESULT($bash_cv_mail_dir) -AC_DEFINE_UNQUOTED(DEFAULT_MAIL_DIRECTORY, "$bash_cv_mail_dir") -]) - -AC_DEFUN(BASH_HAVE_TIOCGWINSZ, -[AC_MSG_CHECKING(for TIOCGWINSZ in sys/ioctl.h) -AC_CACHE_VAL(bash_cv_tiocgwinsz_in_ioctl, -[AC_TRY_COMPILE([#include -#include ], [int x = TIOCGWINSZ;], - bash_cv_tiocgwinsz_in_ioctl=yes,bash_cv_tiocgwinsz_in_ioctl=no)]) -AC_MSG_RESULT($bash_cv_tiocgwinsz_in_ioctl) -if test $bash_cv_tiocgwinsz_in_ioctl = yes; then -AC_DEFINE(GWINSZ_IN_SYS_IOCTL) -fi -]) - -AC_DEFUN(BASH_HAVE_TIOCSTAT, -[AC_MSG_CHECKING(for TIOCSTAT in sys/ioctl.h) -AC_CACHE_VAL(bash_cv_tiocstat_in_ioctl, -[AC_TRY_COMPILE([#include -#include ], [int x = TIOCSTAT;], - bash_cv_tiocstat_in_ioctl=yes,bash_cv_tiocstat_in_ioctl=no)]) -AC_MSG_RESULT($bash_cv_tiocstat_in_ioctl) -if test $bash_cv_tiocstat_in_ioctl = yes; then -AC_DEFINE(TIOCSTAT_IN_SYS_IOCTL) -fi -]) - -AC_DEFUN(BASH_HAVE_FIONREAD, -[AC_MSG_CHECKING(for FIONREAD in sys/ioctl.h) -AC_CACHE_VAL(bash_cv_fionread_in_ioctl, -[AC_TRY_COMPILE([#include -#include ], [int x = FIONREAD;], - bash_cv_fionread_in_ioctl=yes,bash_cv_fionread_in_ioctl=no)]) -AC_MSG_RESULT($bash_cv_fionread_in_ioctl) -if test $bash_cv_fionread_in_ioctl = yes; then -AC_DEFINE(FIONREAD_IN_SYS_IOCTL) -fi -]) - -dnl -dnl See if speed_t is declared in . Some versions of linux -dnl require a definition of speed_t each time is included, -dnl but you can only get speed_t if you include (on some -dnl versions) or (on others). -dnl -AC_DEFUN(BASH_CHECK_SPEED_T, -[AC_MSG_CHECKING(for speed_t in sys/types.h) -AC_CACHE_VAL(bash_cv_speed_t_in_sys_types, -[AC_TRY_COMPILE([#include ], [speed_t x;], - bash_cv_speed_t_in_sys_types=yes,bash_cv_speed_t_in_sys_types=no)]) -AC_MSG_RESULT($bash_cv_speed_t_in_sys_types) -if test $bash_cv_speed_t_in_sys_types = yes; then -AC_DEFINE(SPEED_T_IN_SYS_TYPES) -fi -]) - -AC_DEFUN(BASH_CHECK_GETPW_FUNCS, -[AC_MSG_CHECKING(whether getpw functions are declared in pwd.h) -AC_CACHE_VAL(bash_cv_getpw_declared, -[AC_EGREP_CPP(getpwuid, -[ -#include -#ifdef HAVE_UNISTD_H -# include -#endif -#include -], -bash_cv_getpw_declared=yes,bash_cv_getpw_declared=no)]) -AC_MSG_RESULT($bash_cv_getpw_declared) -if test $bash_cv_getpw_declared = yes; then -AC_DEFINE(HAVE_GETPW_DECLS) -fi -]) - -AC_DEFUN(BASH_CHECK_DEV_FD, -[AC_MSG_CHECKING(whether /dev/fd is available) -AC_CACHE_VAL(bash_cv_dev_fd, -[if test -d /dev/fd && test -r /dev/fd/0 < /dev/null; then - bash_cv_dev_fd=standard - elif test -d /proc/self/fd && test -r /proc/self/fd/0 < /dev/null; then - bash_cv_dev_fd=whacky - else - bash_cv_dev_fd=absent - fi -]) -AC_MSG_RESULT($bash_cv_dev_fd) -if test $bash_cv_dev_fd = "standard"; then - AC_DEFINE(HAVE_DEV_FD) - AC_DEFINE(DEV_FD_PREFIX, "/dev/fd/") -elif test $bash_cv_dev_fd = "whacky"; then - AC_DEFINE(HAVE_DEV_FD) - AC_DEFINE(DEV_FD_PREFIX, "/proc/self/fd/") -fi -]) - -AC_DEFUN(BASH_CHECK_DEV_STDIN, -[AC_MSG_CHECKING(whether /dev/stdin stdout stderr are available) -AC_CACHE_VAL(bash_cv_dev_stdin, -[if test -d /dev/fd && test -r /dev/stdin < /dev/null; then - bash_cv_dev_stdin=present - elif test -d /proc/self/fd && test -r /dev/stdin < /dev/null; then - bash_cv_dev_stdin=present - else - bash_cv_dev_stdin=absent - fi -]) -AC_MSG_RESULT($bash_cv_dev_stdin) -if test $bash_cv_dev_stdin = "present"; then - AC_DEFINE(HAVE_DEV_STDIN) -fi -]) - -dnl -dnl Check if HPUX needs _KERNEL defined for RLIMIT_* definitions -dnl -AC_DEFUN(BASH_CHECK_KERNEL_RLIMIT, -[AC_MSG_CHECKING([whether $host_os needs _KERNEL for RLIMIT defines]) -AC_CACHE_VAL(bash_cv_kernel_rlimit, -[AC_TRY_COMPILE([ -#include -#include -], -[ - int f; - f = RLIMIT_DATA; -], bash_cv_kernel_rlimit=no, -[AC_TRY_COMPILE([ -#include -#define _KERNEL -#include -#undef _KERNEL -], -[ - int f; - f = RLIMIT_DATA; -], bash_cv_kernel_rlimit=yes, bash_cv_kernel_rlimit=no)] -)]) -AC_MSG_RESULT($bash_cv_kernel_rlimit) -if test $bash_cv_kernel_rlimit = yes; then -AC_DEFINE(RLIMIT_NEEDS_KERNEL) -fi -]) - -dnl -dnl Check for 64-bit off_t -- used for malloc alignment -dnl -dnl C does not allow duplicate case labels, so the compile will fail if -dnl sizeof(off_t) is > 4. -dnl -AC_DEFUN(BASH_CHECK_OFF_T_64, -[AC_CACHE_CHECK(for 64-bit off_t, bash_cv_off_t_64, -AC_TRY_COMPILE([ -#ifdef HAVE_UNISTD_H -#include -#endif -#include -],[ -switch (0) case 0: case (sizeof (off_t) <= 4):; -], bash_cv_off_t_64=no, bash_cv_off_t_64=yes)) -if test $bash_cv_off_t_64 = yes; then - AC_DEFINE(HAVE_OFF_T_64) -fi]) - -AC_DEFUN(BASH_CHECK_RTSIGS, -[AC_MSG_CHECKING(for unusable real-time signals due to large values) -AC_CACHE_VAL(bash_cv_unusable_rtsigs, -[AC_TRY_RUN([ -#include -#include - -#ifndef NSIG -# define NSIG 64 -#endif - -main () -{ - int n_sigs = 2 * NSIG; -#ifdef SIGRTMIN - int rtmin = SIGRTMIN; -#else - int rtmin = 0; -#endif - - exit(rtmin < n_sigs); -}], bash_cv_unusable_rtsigs=yes, bash_cv_unusable_rtsigs=no, - [AC_MSG_WARN(cannot check real-time signals if cross compiling -- defaulting to yes) - bash_cv_unusable_rtsigs=yes] -)]) -AC_MSG_RESULT($bash_cv_unusable_rtsigs) -if test $bash_cv_unusable_rtsigs = yes; then -AC_DEFINE(UNUSABLE_RT_SIGNALS) -fi -]) - -dnl -dnl check for availability of multibyte characters and functions -dnl -AC_DEFUN(BASH_CHECK_MULTIBYTE, -[ -AC_CHECK_HEADERS(wctype.h) -AC_CHECK_HEADERS(wchar.h) -AC_CHECK_HEADERS(langinfo.h) - -AC_CHECK_FUNC(mbsrtowcs, AC_DEFINE(HAVE_MBSRTOWCS)) -AC_CHECK_FUNC(mbrtowc, AC_DEFINE(HAVE_MBRTOWC)) -AC_CHECK_FUNC(mbrlen, AC_DEFINE(HAVE_MBRLEN)) -AC_CHECK_FUNC(wctomb, AC_DEFINE(HAVE_WCTOMB)) -AC_CHECK_FUNC(wcwidth, AC_DEFINE(HAVE_WCWIDTH)) -AC_CHECK_FUNC(wcsdup, AC_DEFINE(HAVE_WCSDUP)) - -AC_CACHE_CHECK([for mbstate_t], bash_cv_have_mbstate_t, -[AC_TRY_COMPILE([ -#include ], [ - mbstate_t ps; - mbstate_t *psp; - psp = (mbstate_t *)0; -], bash_cv_have_mbstate_t=yes, bash_cv_have_mbstate_t=no)]) -if test $bash_cv_have_mbstate_t = yes; then - AC_DEFINE(HAVE_MBSTATE_T) -fi - -AC_CACHE_CHECK([for nl_langinfo and CODESET], bash_cv_langinfo_codeset, -[AC_TRY_LINK( -[#include ], -[char* cs = nl_langinfo(CODESET);], -bash_cv_langinfo_codeset=yes, bash_cv_langinfo_codeset=no)]) -if test $bash_cv_langinfo_codeset = yes; then - AC_DEFINE(HAVE_LANGINFO_CODESET) -fi - -]) - -dnl need: prefix exec_prefix libdir includedir CC TERMCAP_LIB -dnl require: -dnl AC_PROG_CC -dnl BASH_CHECK_LIB_TERMCAP - -AC_DEFUN(RL_LIB_READLINE_VERSION, -[ -AC_REQUIRE([BASH_CHECK_LIB_TERMCAP]) - -AC_MSG_CHECKING([version of installed readline library]) - -# What a pain in the ass this is. - -# save cpp and ld options -_save_CFLAGS="$CFLAGS" -_save_LDFLAGS="$LDFLAGS" -_save_LIBS="$LIBS" - -# Don't set ac_cv_rl_prefix if the caller has already assigned a value. This -# allows the caller to do something like $_rl_prefix=$withval if the user -# specifies --with-installed-readline=PREFIX as an argument to configure - -if test -z "$ac_cv_rl_prefix"; then -test "x$prefix" = xNONE && ac_cv_rl_prefix=$ac_default_prefix || ac_cv_rl_prefix=${prefix} -fi - -eval ac_cv_rl_includedir=${ac_cv_rl_prefix}/include -eval ac_cv_rl_libdir=${ac_cv_rl_prefix}/lib - -LIBS="$LIBS -lreadline ${TERMCAP_LIB}" -CFLAGS="$CFLAGS -I${ac_cv_rl_includedir}" -LDFLAGS="$LDFLAGS -L${ac_cv_rl_libdir}" - -AC_CACHE_VAL(ac_cv_rl_version, -[AC_TRY_RUN([ -#include -#include - -main() -{ - FILE *fp; - fp = fopen("conftest.rlv", "w"); - if (fp == 0) exit(1); - fprintf(fp, "%s\n", rl_library_version ? rl_library_version : "0.0"); - fclose(fp); - exit(0); -} -], -ac_cv_rl_version=`cat conftest.rlv`, -ac_cv_rl_version='0.0', -ac_cv_rl_version='4.2')]) - -CFLAGS="$_save_CFLAGS" -LDFLAGS="$_save_LDFLAGS" -LIBS="$_save_LIBS" - -RL_MAJOR=0 -RL_MINOR=0 - -# ( -case "$ac_cv_rl_version" in -2*|3*|4*|5*|6*|7*|8*|9*) - RL_MAJOR=`echo $ac_cv_rl_version | sed 's:\..*$::'` - RL_MINOR=`echo $ac_cv_rl_version | sed -e 's:^.*\.::' -e 's:[[a-zA-Z]]*$::'` - ;; -esac - -# ((( -case $RL_MAJOR in -[[0-9][0-9]]) _RL_MAJOR=$RL_MAJOR ;; -[[0-9]]) _RL_MAJOR=0$RL_MAJOR ;; -*) _RL_MAJOR=00 ;; -esac - -# ((( -case $RL_MINOR in -[[0-9][0-9]]) _RL_MINOR=$RL_MINOR ;; -[[0-9]]) _RL_MINOR=0$RL_MINOR ;; -*) _RL_MINOR=00 ;; -esac - -RL_VERSION="0x${_RL_MAJOR}${_RL_MINOR}" - -# Readline versions greater than 4.2 have these defines in readline.h - -if test $ac_cv_rl_version = '0.0' ; then - AC_MSG_WARN([Could not test version of installed readline library.]) -elif test $RL_MAJOR -gt 4 || { test $RL_MAJOR = 4 && test $RL_MINOR -gt 2 ; } ; then - # set these for use by the caller - RL_PREFIX=$ac_cv_rl_prefix - RL_LIBDIR=$ac_cv_rl_libdir - RL_INCLUDEDIR=$ac_cv_rl_includedir - AC_MSG_RESULT($ac_cv_rl_version) -else - -AC_DEFINE_UNQUOTED(RL_READLINE_VERSION, $RL_VERSION, [encoded version of the installed readline library]) -AC_DEFINE_UNQUOTED(RL_VERSION_MAJOR, $RL_MAJOR, [major version of installed readline library]) -AC_DEFINE_UNQUOTED(RL_VERSION_MINOR, $RL_MINOR, [minor version of installed readline library]) - -AC_SUBST(RL_VERSION) -AC_SUBST(RL_MAJOR) -AC_SUBST(RL_MINOR) - -# set these for use by the caller -RL_PREFIX=$ac_cv_rl_prefix -RL_LIBDIR=$ac_cv_rl_libdir -RL_INCLUDEDIR=$ac_cv_rl_includedir - -AC_MSG_RESULT($ac_cv_rl_version) - -fi -]) - -AC_DEFUN(BASH_FUNC_CTYPE_NONASCII, -[ -AC_MSG_CHECKING(whether the ctype macros accept non-ascii characters) -AC_CACHE_VAL(bash_cv_func_ctype_nonascii, -[AC_TRY_RUN([ -#ifdef HAVE_LOCALE_H -#include -#endif -#include -#include - -main(c, v) -int c; -char *v[]; -{ - char *deflocale; - unsigned char x; - int r1, r2; - -#ifdef HAVE_SETLOCALE - /* We take a shot here. If that locale is not known, try the - system default. We try this one because '\342' (226) is - known to be a printable character in that locale. */ - deflocale = setlocale(LC_ALL, "en_US.ISO8859-1"); - if (deflocale == 0) - deflocale = setlocale(LC_ALL, ""); -#endif - - x = '\342'; - r1 = isprint(x); - x -= 128; - r2 = isprint(x); - exit (r1 == 0 || r2 == 0); -} -], bash_cv_func_ctype_nonascii=yes, bash_cv_func_ctype_nonascii=no, - [AC_MSG_WARN(cannot check ctype macros if cross compiling -- defaulting to no) - bash_cv_func_ctype_nonascii=no] -)]) -AC_MSG_RESULT($bash_cv_func_ctype_nonascii) -if test $bash_cv_func_ctype_nonascii = yes; then -AC_DEFINE(CTYPE_NON_ASCII) -fi -]) - -dnl -dnl tests added for bashdb -dnl - - -AC_DEFUN([AM_PATH_LISPDIR], - [AC_ARG_WITH(lispdir, AC_HELP_STRING([--with-lispdir], [override the default lisp directory]), - [ lispdir="$withval" - AC_MSG_CHECKING([where .elc files should go]) - AC_MSG_RESULT([$lispdir])], - [ - # If set to t, that means we are running in a shell under Emacs. - # If you have an Emacs named "t", then use the full path. - test x"$EMACS" = xt && EMACS= - AC_CHECK_PROGS(EMACS, emacs xemacs, no) - if test $EMACS != "no"; then - if test x${lispdir+set} != xset; then - AC_CACHE_CHECK([where .elc files should go], [am_cv_lispdir], [dnl - am_cv_lispdir=`$EMACS -batch -q -eval '(while load-path (princ (concat (car load-path) "\n")) (setq load-path (cdr load-path)))' | sed -n -e 's,/$,,' -e '/.*\/lib\/\(x\?emacs\/site-lisp\)$/{s,,${libdir}/\1,;p;q;}' -e '/.*\/share\/\(x\?emacs\/site-lisp\)$/{s,,${datadir}/\1,;p;q;}'` - if test -z "$am_cv_lispdir"; then - am_cv_lispdir='${datadir}/emacs/site-lisp' - fi - ]) - lispdir="$am_cv_lispdir" - fi - fi - ]) - AC_SUBST(lispdir) -]) - -dnl -dnl tests added for gettext -dnl -# codeset.m4 serial AM1 (gettext-0.10.40) -dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. -dnl This file is free software, distributed under the terms of the GNU -dnl General Public License. As a special exception to the GNU General -dnl Public License, this file may be distributed as part of a program -dnl that contains a configuration script generated by Autoconf, under -dnl the same distribution terms as the rest of that program. - -dnl From Bruno Haible. - -AC_DEFUN([AM_LANGINFO_CODESET], -[ - AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset, - [AC_TRY_LINK([#include ], - [char* cs = nl_langinfo(CODESET);], - am_cv_langinfo_codeset=yes, - am_cv_langinfo_codeset=no) - ]) - if test $am_cv_langinfo_codeset = yes; then - AC_DEFINE(HAVE_LANGINFO_CODESET, 1, - [Define if you have and nl_langinfo(CODESET).]) - fi -]) -# gettext.m4 serial 20 (gettext-0.12) -dnl Copyright (C) 1995-2003 Free Software Foundation, Inc. -dnl This file is free software, distributed under the terms of the GNU -dnl General Public License. As a special exception to the GNU General -dnl Public License, this file may be distributed as part of a program -dnl that contains a configuration script generated by Autoconf, under -dnl the same distribution terms as the rest of that program. -dnl -dnl This file can can be used in projects which are not available under -dnl the GNU General Public License or the GNU Library General Public -dnl License but which still want to provide support for the GNU gettext -dnl functionality. -dnl Please note that the actual code of the GNU gettext library is covered -dnl by the GNU Library General Public License, and the rest of the GNU -dnl gettext package package is covered by the GNU General Public License. -dnl They are *not* in the public domain. - -dnl Authors: -dnl Ulrich Drepper , 1995-2000. -dnl Bruno Haible , 2000-2003. - -dnl Macro to add for using GNU gettext. - -dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). -dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The -dnl default (if it is not specified or empty) is 'no-libtool'. -dnl INTLSYMBOL should be 'external' for packages with no intl directory, -dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. -dnl If INTLSYMBOL is 'use-libtool', then a libtool library -dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, -dnl depending on --{enable,disable}-{shared,static} and on the presence of -dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library -dnl $(top_builddir)/intl/libintl.a will be created. -dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext -dnl implementations (in libc or libintl) without the ngettext() function -dnl will be ignored. If NEEDSYMBOL is specified and is -dnl 'need-formatstring-macros', then GNU gettext implementations that don't -dnl support the ISO C 99 formatstring macros will be ignored. -dnl INTLDIR is used to find the intl libraries. If empty, -dnl the value `$(top_builddir)/intl/' is used. -dnl -dnl The result of the configuration is one of three cases: -dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled -dnl and used. -dnl Catalog format: GNU --> install in $(datadir) -dnl Catalog extension: .mo after installation, .gmo in source tree -dnl 2) GNU gettext has been found in the system's C library. -dnl Catalog format: GNU --> install in $(datadir) -dnl Catalog extension: .mo after installation, .gmo in source tree -dnl 3) No internationalization, always use English msgid. -dnl Catalog format: none -dnl Catalog extension: none -dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. -dnl The use of .gmo is historical (it was needed to avoid overwriting the -dnl GNU format catalogs when building on a platform with an X/Open gettext), -dnl but we keep it in order not to force irrelevant filename changes on the -dnl maintainers. -dnl -AC_DEFUN([AM_GNU_GETTEXT], -[ - dnl Argument checking. - ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , - [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT -])])])])]) - ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , - [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT -])])])]) - define(gt_included_intl, ifelse([$1], [external], [no], [yes])) - define(gt_libtool_suffix_prefix, ifelse([$1], [use-libtool], [l], [])) - - AC_REQUIRE([AM_PO_SUBDIRS])dnl - ifelse(gt_included_intl, yes, [ - AC_REQUIRE([AM_INTL_SUBDIR])dnl - ]) - - dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. - AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) - AC_REQUIRE([AC_LIB_RPATH]) - - dnl Sometimes libintl requires libiconv, so first search for libiconv. - dnl Ideally we would do this search only after the - dnl if test "$USE_NLS" = "yes"; then - dnl if test "$gt_cv_func_gnugettext_libc" != "yes"; then - dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT - dnl the configure script would need to contain the same shell code - dnl again, outside any 'if'. There are two solutions: - dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. - dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. - dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not - dnl documented, we avoid it. - ifelse(gt_included_intl, yes, , [ - AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) - ]) - - dnl Set USE_NLS. - AM_NLS - - ifelse(gt_included_intl, yes, [ - BUILD_INCLUDED_LIBINTL=no - USE_INCLUDED_LIBINTL=no - ]) - LIBINTL= - LTLIBINTL= - POSUB= - - dnl If we use NLS figure out what method - if test "$USE_NLS" = "yes"; then - gt_use_preinstalled_gnugettext=no - ifelse(gt_included_intl, yes, [ - AC_MSG_CHECKING([whether included gettext is requested]) - AC_ARG_WITH(included-gettext, - [ --with-included-gettext use the GNU gettext library included here], - nls_cv_force_use_gnu_gettext=$withval, - nls_cv_force_use_gnu_gettext=no) - AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) - - nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" - if test "$nls_cv_force_use_gnu_gettext" != "yes"; then - ]) - dnl User does not insist on using GNU NLS library. Figure out what - dnl to use. If GNU gettext is available we use this. Else we have - dnl to fall back to GNU NLS library. - - dnl Add a version number to the cache macros. - define([gt_api_version], ifelse([$2], [need-formatstring-macros], 3, ifelse([$2], [need-ngettext], 2, 1))) - define([gt_cv_func_gnugettext_libc], [gt_cv_func_gnugettext]gt_api_version[_libc]) - define([gt_cv_func_gnugettext_libintl], [gt_cv_func_gnugettext]gt_api_version[_libintl]) - - AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc, - [AC_TRY_LINK([#include -]ifelse([$2], [need-formatstring-macros], -[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION -#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) -#endif -changequote(,)dnl -typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; -changequote([,])dnl -], [])[extern int _nl_msg_cat_cntr; -extern int *_nl_domain_bindings;], - [bindtextdomain ("", ""); -return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings], - gt_cv_func_gnugettext_libc=yes, - gt_cv_func_gnugettext_libc=no)]) - - if test "$gt_cv_func_gnugettext_libc" != "yes"; then - dnl Sometimes libintl requires libiconv, so first search for libiconv. - ifelse(gt_included_intl, yes, , [ - AM_ICONV_LINK - ]) - dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL - dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) - dnl because that would add "-liconv" to LIBINTL and LTLIBINTL - dnl even if libiconv doesn't exist. - AC_LIB_LINKFLAGS_BODY([intl]) - AC_CACHE_CHECK([for GNU gettext in libintl], - gt_cv_func_gnugettext_libintl, - [gt_save_CPPFLAGS="$CPPFLAGS" - CPPFLAGS="$CPPFLAGS $INCINTL" - gt_save_LIBS="$LIBS" - LIBS="$LIBS $LIBINTL" - dnl Now see whether libintl exists and does not depend on libiconv. - AC_TRY_LINK([#include -]ifelse([$2], [need-formatstring-macros], -[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION -#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) -#endif -changequote(,)dnl -typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; -changequote([,])dnl -], [])[extern int _nl_msg_cat_cntr; -extern -#ifdef __cplusplus -"C" -#endif -const char *_nl_expand_alias ();], - [bindtextdomain ("", ""); -return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)], - gt_cv_func_gnugettext_libintl=yes, - gt_cv_func_gnugettext_libintl=no) - dnl Now see whether libintl exists and depends on libiconv. - if test "$gt_cv_func_gnugettext_libintl" != yes && test -n "$LIBICONV"; then - LIBS="$LIBS $LIBICONV" - AC_TRY_LINK([#include -]ifelse([$2], [need-formatstring-macros], -[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION -#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) -#endif -changequote(,)dnl -typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; -changequote([,])dnl -], [])[extern int _nl_msg_cat_cntr; -extern -#ifdef __cplusplus -"C" -#endif -const char *_nl_expand_alias ();], - [bindtextdomain ("", ""); -return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)], - [LIBINTL="$LIBINTL $LIBICONV" - LTLIBINTL="$LTLIBINTL $LTLIBICONV" - gt_cv_func_gnugettext_libintl=yes - ]) - fi - CPPFLAGS="$gt_save_CPPFLAGS" - LIBS="$gt_save_LIBS"]) - fi - - dnl If an already present or preinstalled GNU gettext() is found, - dnl use it. But if this macro is used in GNU gettext, and GNU - dnl gettext is already preinstalled in libintl, we update this - dnl libintl. (Cf. the install rule in intl/Makefile.in.) - if test "$gt_cv_func_gnugettext_libc" = "yes" \ - || { test "$gt_cv_func_gnugettext_libintl" = "yes" \ - && test "$PACKAGE" != gettext-runtime \ - && test "$PACKAGE" != gettext-tools; }; then - gt_use_preinstalled_gnugettext=yes - else - dnl Reset the values set by searching for libintl. - LIBINTL= - LTLIBINTL= - INCINTL= - fi - - ifelse(gt_included_intl, yes, [ - if test "$gt_use_preinstalled_gnugettext" != "yes"; then - dnl GNU gettext is not found in the C library. - dnl Fall back on included GNU gettext library. - nls_cv_use_gnu_gettext=yes - fi - fi - - if test "$nls_cv_use_gnu_gettext" = "yes"; then - dnl Mark actions used to generate GNU NLS library. - BUILD_INCLUDED_LIBINTL=yes - USE_INCLUDED_LIBINTL=yes - LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV" - LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV" - LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` - fi - - if test "$gt_use_preinstalled_gnugettext" = "yes" \ - || test "$nls_cv_use_gnu_gettext" = "yes"; then - dnl Mark actions to use GNU gettext tools. - CATOBJEXT=.gmo - fi - ]) - - if test "$gt_use_preinstalled_gnugettext" = "yes" \ - || test "$nls_cv_use_gnu_gettext" = "yes"; then - AC_DEFINE(ENABLE_NLS, 1, - [Define to 1 if translation of program messages to the user's native language - is requested.]) - else - USE_NLS=no - fi - fi - - AC_MSG_CHECKING([whether to use NLS]) - AC_MSG_RESULT([$USE_NLS]) - if test "$USE_NLS" = "yes"; then - AC_MSG_CHECKING([where the gettext function comes from]) - if test "$gt_use_preinstalled_gnugettext" = "yes"; then - if test "$gt_cv_func_gnugettext_libintl" = "yes"; then - gt_source="external libintl" - else - gt_source="libc" - fi - else - gt_source="included intl directory" - fi - AC_MSG_RESULT([$gt_source]) - fi - - if test "$USE_NLS" = "yes"; then - - if test "$gt_use_preinstalled_gnugettext" = "yes"; then - if test "$gt_cv_func_gnugettext_libintl" = "yes"; then - AC_MSG_CHECKING([how to link with libintl]) - AC_MSG_RESULT([$LIBINTL]) - AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) - fi - - dnl For backward compatibility. Some packages may be using this. - AC_DEFINE(HAVE_GETTEXT, 1, - [Define if the GNU gettext() function is already present or preinstalled.]) - AC_DEFINE(HAVE_DCGETTEXT, 1, - [Define if the GNU dcgettext() function is already present or preinstalled.]) - fi - - dnl We need to process the po/ directory. - POSUB=po - fi - - ifelse(gt_included_intl, yes, [ - dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL - dnl to 'yes' because some of the testsuite requires it. - if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then - BUILD_INCLUDED_LIBINTL=yes - fi - - dnl Make all variables we use known to autoconf. - AC_SUBST(BUILD_INCLUDED_LIBINTL) - AC_SUBST(USE_INCLUDED_LIBINTL) - AC_SUBST(CATOBJEXT) - - dnl For backward compatibility. Some configure.ins may be using this. - nls_cv_header_intl= - nls_cv_header_libgt= - - dnl For backward compatibility. Some Makefiles may be using this. - DATADIRNAME=share - AC_SUBST(DATADIRNAME) - - dnl For backward compatibility. Some Makefiles may be using this. - INSTOBJEXT=.mo - AC_SUBST(INSTOBJEXT) - - dnl For backward compatibility. Some Makefiles may be using this. - GENCAT=gencat - AC_SUBST(GENCAT) - - dnl For backward compatibility. Some Makefiles may be using this. - if test "$USE_INCLUDED_LIBINTL" = yes; then - INTLOBJS="\$(GETTOBJS)" - fi - AC_SUBST(INTLOBJS) - - dnl Enable libtool support if the surrounding package wishes it. - INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix - AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX) - ]) - - dnl For backward compatibility. Some Makefiles may be using this. - INTLLIBS="$LIBINTL" - AC_SUBST(INTLLIBS) - - dnl Make all documented variables known to autoconf. - AC_SUBST(LIBINTL) - AC_SUBST(LTLIBINTL) - AC_SUBST(POSUB) -]) - - -dnl Checks for all prerequisites of the intl subdirectory, -dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS, -dnl USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL. -AC_DEFUN([AM_INTL_SUBDIR], -[ - AC_REQUIRE([AC_PROG_INSTALL])dnl - AC_REQUIRE([AM_MKINSTALLDIRS])dnl - AC_REQUIRE([AC_PROG_CC])dnl - AC_REQUIRE([AC_CANONICAL_HOST])dnl - AC_REQUIRE([AC_PROG_RANLIB])dnl - AC_REQUIRE([AC_ISC_POSIX])dnl - AC_REQUIRE([AC_HEADER_STDC])dnl - AC_REQUIRE([AC_C_CONST])dnl - AC_REQUIRE([AC_C_INLINE])dnl - AC_REQUIRE([AC_TYPE_OFF_T])dnl - AC_REQUIRE([AC_TYPE_SIZE_T])dnl - AC_REQUIRE([AC_FUNC_ALLOCA])dnl - AC_REQUIRE([AC_FUNC_MMAP])dnl - AC_REQUIRE([jm_GLIBC21])dnl - AC_REQUIRE([gt_INTDIV0])dnl - AC_REQUIRE([jm_AC_TYPE_UINTMAX_T])dnl - AC_REQUIRE([gt_HEADER_INTTYPES_H])dnl - AC_REQUIRE([gt_INTTYPES_PRI])dnl - - AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \ -stdlib.h string.h unistd.h sys/param.h]) - AC_CHECK_FUNCS([feof_unlocked fgets_unlocked getc_unlocked getcwd getegid \ -geteuid getgid getuid mempcpy munmap putenv setenv setlocale stpcpy \ -strcasecmp strdup strtoul tsearch __argz_count __argz_stringify __argz_next \ -__fsetlocking]) - - AM_ICONV - AM_LANGINFO_CODESET - if test $ac_cv_header_locale_h = yes; then - AM_LC_MESSAGES - fi - - dnl intl/plural.c is generated from intl/plural.y. It requires bison, - dnl because plural.y uses bison specific features. It requires at least - dnl bison-1.26 because earlier versions generate a plural.c that doesn't - dnl compile. - dnl bison is only needed for the maintainer (who touches plural.y). But in - dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put - dnl the rule in general Makefile. Now, some people carelessly touch the - dnl files or have a broken "make" program, hence the plural.c rule will - dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not - dnl present or too old. - AC_CHECK_PROGS([INTLBISON], [bison]) - if test -z "$INTLBISON"; then - ac_verc_fail=yes - else - dnl Found it, now check the version. - AC_MSG_CHECKING([version of bison]) -changequote(<<,>>)dnl - ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'` - case $ac_prog_version in - '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; - 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*) -changequote([,])dnl - ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; - *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; - esac - AC_MSG_RESULT([$ac_prog_version]) - fi - if test $ac_verc_fail = yes; then - INTLBISON=: - fi -]) - - -dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) -AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) -# glibc21.m4 serial 2 (fileutils-4.1.3, gettext-0.10.40) -dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. -dnl This file is free software, distributed under the terms of the GNU -dnl General Public License. As a special exception to the GNU General -dnl Public License, this file may be distributed as part of a program -dnl that contains a configuration script generated by Autoconf, under -dnl the same distribution terms as the rest of that program. - -# Test for the GNU C Library, version 2.1 or newer. -# From Bruno Haible. - -AC_DEFUN([jm_GLIBC21], - [ - AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer, - ac_cv_gnu_library_2_1, - [AC_EGREP_CPP([Lucky GNU user], - [ -#include -#ifdef __GNU_LIBRARY__ - #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) - Lucky GNU user - #endif -#endif - ], - ac_cv_gnu_library_2_1=yes, - ac_cv_gnu_library_2_1=no) - ] - ) - AC_SUBST(GLIBC21) - GLIBC21="$ac_cv_gnu_library_2_1" - ] -) -# iconv.m4 serial AM4 (gettext-0.11.3) -dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. -dnl This file is free software, distributed under the terms of the GNU -dnl General Public License. As a special exception to the GNU General -dnl Public License, this file may be distributed as part of a program -dnl that contains a configuration script generated by Autoconf, under -dnl the same distribution terms as the rest of that program. - -dnl From Bruno Haible. - -AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], -[ - dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. - AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) - AC_REQUIRE([AC_LIB_RPATH]) - - dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV - dnl accordingly. - AC_LIB_LINKFLAGS_BODY([iconv]) -]) - -AC_DEFUN([AM_ICONV_LINK], -[ - dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and - dnl those with the standalone portable GNU libiconv installed). - - dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV - dnl accordingly. - AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) - - dnl Add $INCICONV to CPPFLAGS before performing the following checks, - dnl because if the user has installed libiconv and not disabled its use - dnl via --without-libiconv-prefix, he wants to use it. The first - dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. - am_save_CPPFLAGS="$CPPFLAGS" - AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) - - AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [ - am_cv_func_iconv="no, consider installing GNU libiconv" - am_cv_lib_iconv=no - AC_TRY_LINK([#include -#include ], - [iconv_t cd = iconv_open("",""); - iconv(cd,NULL,NULL,NULL,NULL); - iconv_close(cd);], - am_cv_func_iconv=yes) - if test "$am_cv_func_iconv" != yes; then - am_save_LIBS="$LIBS" - LIBS="$LIBS $LIBICONV" - AC_TRY_LINK([#include -#include ], - [iconv_t cd = iconv_open("",""); - iconv(cd,NULL,NULL,NULL,NULL); - iconv_close(cd);], - am_cv_lib_iconv=yes - am_cv_func_iconv=yes) - LIBS="$am_save_LIBS" - fi - ]) - if test "$am_cv_func_iconv" = yes; then - AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.]) - fi - if test "$am_cv_lib_iconv" = yes; then - AC_MSG_CHECKING([how to link with libiconv]) - AC_MSG_RESULT([$LIBICONV]) - else - dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV - dnl either. - CPPFLAGS="$am_save_CPPFLAGS" - LIBICONV= - LTLIBICONV= - fi - AC_SUBST(LIBICONV) - AC_SUBST(LTLIBICONV) -]) - -AC_DEFUN([AM_ICONV], -[ - AM_ICONV_LINK - if test "$am_cv_func_iconv" = yes; then - AC_MSG_CHECKING([for iconv declaration]) - AC_CACHE_VAL(am_cv_proto_iconv, [ - AC_TRY_COMPILE([ -#include -#include -extern -#ifdef __cplusplus -"C" -#endif -#if defined(__STDC__) || defined(__cplusplus) -size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); -#else -size_t iconv(); -#endif -], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") - am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) - am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` - AC_MSG_RESULT([$]{ac_t:- - }[$]am_cv_proto_iconv) - AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, - [Define as const if the declaration of iconv() needs const.]) - fi -]) -# intdiv0.m4 serial 1 (gettext-0.11.3) -dnl Copyright (C) 2002 Free Software Foundation, Inc. -dnl This file is free software, distributed under the terms of the GNU -dnl General Public License. As a special exception to the GNU General -dnl Public License, this file may be distributed as part of a program -dnl that contains a configuration script generated by Autoconf, under -dnl the same distribution terms as the rest of that program. - -dnl From Bruno Haible. - -AC_DEFUN([gt_INTDIV0], -[ - AC_REQUIRE([AC_PROG_CC])dnl - AC_REQUIRE([AC_CANONICAL_HOST])dnl - - AC_CACHE_CHECK([whether integer division by zero raises SIGFPE], - gt_cv_int_divbyzero_sigfpe, - [ - AC_TRY_RUN([ -#include -#include - -static void -#ifdef __cplusplus -sigfpe_handler (int sig) -#else -sigfpe_handler (sig) int sig; -#endif -{ - /* Exit with code 0 if SIGFPE, with code 1 if any other signal. */ - exit (sig != SIGFPE); -} - -int x = 1; -int y = 0; -int z; -int nan; - -int main () -{ - signal (SIGFPE, sigfpe_handler); -/* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP. */ -#if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP) - signal (SIGTRAP, sigfpe_handler); -#endif -/* Linux/SPARC yields signal SIGILL. */ -#if defined (__sparc__) && defined (__linux__) - signal (SIGILL, sigfpe_handler); -#endif - - z = x / y; - nan = y / y; - exit (1); -} -], gt_cv_int_divbyzero_sigfpe=yes, gt_cv_int_divbyzero_sigfpe=no, - [ - # Guess based on the CPU. - case "$host_cpu" in - alpha* | i[34567]86 | m68k | s390*) - gt_cv_int_divbyzero_sigfpe="guessing yes";; - *) - gt_cv_int_divbyzero_sigfpe="guessing no";; - esac - ]) - ]) - case "$gt_cv_int_divbyzero_sigfpe" in - *yes) value=1;; - *) value=0;; - esac - AC_DEFINE_UNQUOTED(INTDIV0_RAISES_SIGFPE, $value, - [Define if integer division by zero raises signal SIGFPE.]) -]) -# inttypes.m4 serial 1 (gettext-0.11.4) -dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. -dnl This file is free software, distributed under the terms of the GNU -dnl General Public License. As a special exception to the GNU General -dnl Public License, this file may be distributed as part of a program -dnl that contains a configuration script generated by Autoconf, under -dnl the same distribution terms as the rest of that program. - -dnl From Paul Eggert. - -# Define HAVE_INTTYPES_H if exists and doesn't clash with -# . - -AC_DEFUN([gt_HEADER_INTTYPES_H], -[ - AC_CACHE_CHECK([for inttypes.h], gt_cv_header_inttypes_h, - [ - AC_TRY_COMPILE( - [#include -#include ], - [], gt_cv_header_inttypes_h=yes, gt_cv_header_inttypes_h=no) - ]) - if test $gt_cv_header_inttypes_h = yes; then - AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H, 1, - [Define if exists and doesn't clash with .]) - fi -]) -# inttypes_h.m4 serial 5 (gettext-0.12) -dnl Copyright (C) 1997-2003 Free Software Foundation, Inc. -dnl This file is free software, distributed under the terms of the GNU -dnl General Public License. As a special exception to the GNU General -dnl Public License, this file may be distributed as part of a program -dnl that contains a configuration script generated by Autoconf, under -dnl the same distribution terms as the rest of that program. - -dnl From Paul Eggert. - -# Define HAVE_INTTYPES_H_WITH_UINTMAX if exists, -# doesn't clash with , and declares uintmax_t. - -AC_DEFUN([jm_AC_HEADER_INTTYPES_H], -[ - AC_CACHE_CHECK([for inttypes.h], jm_ac_cv_header_inttypes_h, - [AC_TRY_COMPILE( - [#include -#include ], - [uintmax_t i = (uintmax_t) -1;], - jm_ac_cv_header_inttypes_h=yes, - jm_ac_cv_header_inttypes_h=no)]) - if test $jm_ac_cv_header_inttypes_h = yes; then - AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H_WITH_UINTMAX, 1, - [Define if exists, doesn't clash with , - and declares uintmax_t. ]) - fi -]) -# inttypes-pri.m4 serial 1 (gettext-0.11.4) -dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. -dnl This file is free software, distributed under the terms of the GNU -dnl General Public License. As a special exception to the GNU General -dnl Public License, this file may be distributed as part of a program -dnl that contains a configuration script generated by Autoconf, under -dnl the same distribution terms as the rest of that program. - -dnl From Bruno Haible. - -# Define PRI_MACROS_BROKEN if exists and defines the PRI* -# macros to non-string values. This is the case on AIX 4.3.3. - -AC_DEFUN([gt_INTTYPES_PRI], -[ - AC_REQUIRE([gt_HEADER_INTTYPES_H]) - if test $gt_cv_header_inttypes_h = yes; then - AC_CACHE_CHECK([whether the inttypes.h PRIxNN macros are broken], - gt_cv_inttypes_pri_broken, - [ - AC_TRY_COMPILE([#include -#ifdef PRId32 -char *p = PRId32; -#endif -], [], gt_cv_inttypes_pri_broken=no, gt_cv_inttypes_pri_broken=yes) - ]) - fi - if test "$gt_cv_inttypes_pri_broken" = yes; then - AC_DEFINE_UNQUOTED(PRI_MACROS_BROKEN, 1, - [Define if exists and defines unusable PRI* macros.]) - fi -]) -# isc-posix.m4 serial 2 (gettext-0.11.2) -dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. -dnl This file is free software, distributed under the terms of the GNU -dnl General Public License. As a special exception to the GNU General -dnl Public License, this file may be distributed as part of a program -dnl that contains a configuration script generated by Autoconf, under -dnl the same distribution terms as the rest of that program. - -# This file is not needed with autoconf-2.53 and newer. Remove it in 2005. - -# This test replaces the one in autoconf. -# Currently this macro should have the same name as the autoconf macro -# because gettext's gettext.m4 (distributed in the automake package) -# still uses it. Otherwise, the use in gettext.m4 makes autoheader -# give these diagnostics: -# configure.in:556: AC_TRY_COMPILE was called before AC_ISC_POSIX -# configure.in:556: AC_TRY_RUN was called before AC_ISC_POSIX - -undefine([AC_ISC_POSIX]) - -AC_DEFUN([AC_ISC_POSIX], - [ - dnl This test replaces the obsolescent AC_ISC_POSIX kludge. - AC_CHECK_LIB(cposix, strerror, [LIBS="$LIBS -lcposix"]) - ] -) -# lcmessage.m4 serial 3 (gettext-0.11.3) -dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. -dnl This file is free software, distributed under the terms of the GNU -dnl General Public License. As a special exception to the GNU General -dnl Public License, this file may be distributed as part of a program -dnl that contains a configuration script generated by Autoconf, under -dnl the same distribution terms as the rest of that program. -dnl -dnl This file can can be used in projects which are not available under -dnl the GNU General Public License or the GNU Library General Public -dnl License but which still want to provide support for the GNU gettext -dnl functionality. -dnl Please note that the actual code of the GNU gettext library is covered -dnl by the GNU Library General Public License, and the rest of the GNU -dnl gettext package package is covered by the GNU General Public License. -dnl They are *not* in the public domain. - -dnl Authors: -dnl Ulrich Drepper , 1995. - -# Check whether LC_MESSAGES is available in . - -AC_DEFUN([AM_LC_MESSAGES], -[ - AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, - [AC_TRY_LINK([#include ], [return LC_MESSAGES], - am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) - if test $am_cv_val_LC_MESSAGES = yes; then - AC_DEFINE(HAVE_LC_MESSAGES, 1, - [Define if your file defines LC_MESSAGES.]) - fi -]) -# lib-ld.m4 serial 2 (gettext-0.12) -dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. -dnl This file is free software, distributed under the terms of the GNU -dnl General Public License. As a special exception to the GNU General -dnl Public License, this file may be distributed as part of a program -dnl that contains a configuration script generated by Autoconf, under -dnl the same distribution terms as the rest of that program. - -dnl Subroutines of libtool.m4, -dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision -dnl with libtool.m4. - -dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. -AC_DEFUN([AC_LIB_PROG_LD_GNU], -[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, -[# I'd rather use --version here, but apparently some GNU ld's only accept -v. -if $LD -v 2>&1 &5; then - acl_cv_prog_gnu_ld=yes -else - acl_cv_prog_gnu_ld=no -fi]) -with_gnu_ld=$acl_cv_prog_gnu_ld -]) - -dnl From libtool-1.4. Sets the variable LD. -AC_DEFUN([AC_LIB_PROG_LD], -[AC_ARG_WITH(gnu-ld, -[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], -test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -# Prepare PATH_SEPARATOR. -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conf$$.sh -fi -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - AC_MSG_CHECKING([for ld used by GCC]) - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [[\\/]* | [A-Za-z]:[\\/]*)] - [re_direlt='/[^/][^/]*/\.\./'] - # Canonicalize the path of ld - ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` - while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do - ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - AC_MSG_CHECKING([for GNU ld]) -else - AC_MSG_CHECKING([for non-GNU ld]) -fi -AC_CACHE_VAL(acl_cv_path_LD, -[if test -z "$LD"; then - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - acl_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some GNU ld's only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - if "$acl_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then - test "$with_gnu_ld" != no && break - else - test "$with_gnu_ld" != yes && break - fi - fi - done - IFS="$ac_save_ifs" -else - acl_cv_path_LD="$LD" # Let the user override the test with a path. -fi]) -LD="$acl_cv_path_LD" -if test -n "$LD"; then - AC_MSG_RESULT($LD) -else - AC_MSG_RESULT(no) -fi -test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) -AC_LIB_PROG_LD_GNU -]) -# lib-link.m4 serial 4 (gettext-0.12) -dnl Copyright (C) 2001-2003 Free Software Foundation, Inc. -dnl This file is free software, distributed under the terms of the GNU -dnl General Public License. As a special exception to the GNU General -dnl Public License, this file may be distributed as part of a program -dnl that contains a configuration script generated by Autoconf, under -dnl the same distribution terms as the rest of that program. - -dnl From Bruno Haible. - -dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and -dnl the libraries corresponding to explicit and implicit dependencies. -dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and -dnl augments the CPPFLAGS variable. -AC_DEFUN([AC_LIB_LINKFLAGS], -[ - AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) - AC_REQUIRE([AC_LIB_RPATH]) - define([Name],[translit([$1],[./-], [___])]) - define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], - [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) - AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ - AC_LIB_LINKFLAGS_BODY([$1], [$2]) - ac_cv_lib[]Name[]_libs="$LIB[]NAME" - ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" - ac_cv_lib[]Name[]_cppflags="$INC[]NAME" - ]) - LIB[]NAME="$ac_cv_lib[]Name[]_libs" - LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" - INC[]NAME="$ac_cv_lib[]Name[]_cppflags" - AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) - AC_SUBST([LIB]NAME) - AC_SUBST([LTLIB]NAME) - dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the - dnl results of this search when this library appears as a dependency. - HAVE_LIB[]NAME=yes - undefine([Name]) - undefine([NAME]) -]) - -dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) -dnl searches for libname and the libraries corresponding to explicit and -dnl implicit dependencies, together with the specified include files and -dnl the ability to compile and link the specified testcode. If found, it -dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and -dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and -dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs -dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. -AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], -[ - AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) - AC_REQUIRE([AC_LIB_RPATH]) - define([Name],[translit([$1],[./-], [___])]) - define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], - [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) - - dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME - dnl accordingly. - AC_LIB_LINKFLAGS_BODY([$1], [$2]) - - dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, - dnl because if the user has installed lib[]Name and not disabled its use - dnl via --without-lib[]Name-prefix, he wants to use it. - ac_save_CPPFLAGS="$CPPFLAGS" - AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) - - AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ - ac_save_LIBS="$LIBS" - LIBS="$LIBS $LIB[]NAME" - AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) - LIBS="$ac_save_LIBS" - ]) - if test "$ac_cv_lib[]Name" = yes; then - HAVE_LIB[]NAME=yes - AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.]) - AC_MSG_CHECKING([how to link with lib[]$1]) - AC_MSG_RESULT([$LIB[]NAME]) - else - HAVE_LIB[]NAME=no - dnl If $LIB[]NAME didn't lead to a usable library, we don't need - dnl $INC[]NAME either. - CPPFLAGS="$ac_save_CPPFLAGS" - LIB[]NAME= - LTLIB[]NAME= - fi - AC_SUBST([HAVE_LIB]NAME) - AC_SUBST([LIB]NAME) - AC_SUBST([LTLIB]NAME) - undefine([Name]) - undefine([NAME]) -]) - -dnl Determine the platform dependent parameters needed to use rpath: -dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator, -dnl hardcode_direct, hardcode_minus_L. -AC_DEFUN([AC_LIB_RPATH], -[ - AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS - AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld - AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host - AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir - AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [ - CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ - ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh - . ./conftest.sh - rm -f ./conftest.sh - acl_cv_rpath=done - ]) - wl="$acl_cv_wl" - libext="$acl_cv_libext" - shlibext="$acl_cv_shlibext" - hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" - hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" - hardcode_direct="$acl_cv_hardcode_direct" - hardcode_minus_L="$acl_cv_hardcode_minus_L" - dnl Determine whether the user wants rpath handling at all. - AC_ARG_ENABLE(rpath, - [ --disable-rpath do not hardcode runtime library paths], - :, enable_rpath=yes) -]) - -dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and -dnl the libraries corresponding to explicit and implicit dependencies. -dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. -AC_DEFUN([AC_LIB_LINKFLAGS_BODY], -[ - define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], - [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) - dnl By default, look in $includedir and $libdir. - use_additional=yes - AC_LIB_WITH_FINAL_PREFIX([ - eval additional_includedir=\"$includedir\" - eval additional_libdir=\"$libdir\" - ]) - AC_LIB_ARG_WITH([lib$1-prefix], -[ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib - --without-lib$1-prefix don't search for lib$1 in includedir and libdir], -[ - if test "X$withval" = "Xno"; then - use_additional=no - else - if test "X$withval" = "X"; then - AC_LIB_WITH_FINAL_PREFIX([ - eval additional_includedir=\"$includedir\" - eval additional_libdir=\"$libdir\" - ]) - else - additional_includedir="$withval/include" - additional_libdir="$withval/lib" - fi - fi -]) - dnl Search the library and its dependencies in $additional_libdir and - dnl $LDFLAGS. Using breadth-first-seach. - LIB[]NAME= - LTLIB[]NAME= - INC[]NAME= - rpathdirs= - ltrpathdirs= - names_already_handled= - names_next_round='$1 $2' - while test -n "$names_next_round"; do - names_this_round="$names_next_round" - names_next_round= - for name in $names_this_round; do - already_handled= - for n in $names_already_handled; do - if test "$n" = "$name"; then - already_handled=yes - break - fi - done - if test -z "$already_handled"; then - names_already_handled="$names_already_handled $name" - dnl See if it was already located by an earlier AC_LIB_LINKFLAGS - dnl or AC_LIB_HAVE_LINKFLAGS call. - uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` - eval value=\"\$HAVE_LIB$uppername\" - if test -n "$value"; then - if test "$value" = yes; then - eval value=\"\$LIB$uppername\" - test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" - eval value=\"\$LTLIB$uppername\" - test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" - else - dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined - dnl that this library doesn't exist. So just drop it. - : - fi - else - dnl Search the library lib$name in $additional_libdir and $LDFLAGS - dnl and the already constructed $LIBNAME/$LTLIBNAME. - found_dir= - found_la= - found_so= - found_a= - if test $use_additional = yes; then - if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then - found_dir="$additional_libdir" - found_so="$additional_libdir/lib$name.$shlibext" - if test -f "$additional_libdir/lib$name.la"; then - found_la="$additional_libdir/lib$name.la" - fi - else - if test -f "$additional_libdir/lib$name.$libext"; then - found_dir="$additional_libdir" - found_a="$additional_libdir/lib$name.$libext" - if test -f "$additional_libdir/lib$name.la"; then - found_la="$additional_libdir/lib$name.la" - fi - fi - fi - fi - if test "X$found_dir" = "X"; then - for x in $LDFLAGS $LTLIB[]NAME; do - AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) - case "$x" in - -L*) - dir=`echo "X$x" | sed -e 's/^X-L//'` - if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then - found_dir="$dir" - found_so="$dir/lib$name.$shlibext" - if test -f "$dir/lib$name.la"; then - found_la="$dir/lib$name.la" - fi - else - if test -f "$dir/lib$name.$libext"; then - found_dir="$dir" - found_a="$dir/lib$name.$libext" - if test -f "$dir/lib$name.la"; then - found_la="$dir/lib$name.la" - fi - fi - fi - ;; - esac - if test "X$found_dir" != "X"; then - break - fi - done - fi - if test "X$found_dir" != "X"; then - dnl Found the library. - LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" - if test "X$found_so" != "X"; then - dnl Linking with a shared library. We attempt to hardcode its - dnl directory into the executable's runpath, unless it's the - dnl standard /usr/lib. - if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then - dnl No hardcoding is needed. - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" - else - dnl Use an explicit option to hardcode DIR into the resulting - dnl binary. - dnl Potentially add DIR to ltrpathdirs. - dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. - haveit= - for x in $ltrpathdirs; do - if test "X$x" = "X$found_dir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - ltrpathdirs="$ltrpathdirs $found_dir" - fi - dnl The hardcoding into $LIBNAME is system dependent. - if test "$hardcode_direct" = yes; then - dnl Using DIR/libNAME.so during linking hardcodes DIR into the - dnl resulting binary. - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" - else - if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then - dnl Use an explicit option to hardcode DIR into the resulting - dnl binary. - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" - dnl Potentially add DIR to rpathdirs. - dnl The rpathdirs will be appended to $LIBNAME at the end. - haveit= - for x in $rpathdirs; do - if test "X$x" = "X$found_dir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - rpathdirs="$rpathdirs $found_dir" - fi - else - dnl Rely on "-L$found_dir". - dnl But don't add it if it's already contained in the LDFLAGS - dnl or the already constructed $LIBNAME - haveit= - for x in $LDFLAGS $LIB[]NAME; do - AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) - if test "X$x" = "X-L$found_dir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" - fi - if test "$hardcode_minus_L" != no; then - dnl FIXME: Not sure whether we should use - dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" - dnl here. - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" - else - dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH - dnl here, because this doesn't fit in flags passed to the - dnl compiler. So give up. No hardcoding. This affects only - dnl very old systems. - dnl FIXME: Not sure whether we should use - dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" - dnl here. - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" - fi - fi - fi - fi - else - if test "X$found_a" != "X"; then - dnl Linking with a static library. - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" - else - dnl We shouldn't come here, but anyway it's good to have a - dnl fallback. - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" - fi - fi - dnl Assume the include files are nearby. - additional_includedir= - case "$found_dir" in - */lib | */lib/) - basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` - additional_includedir="$basedir/include" - ;; - esac - if test "X$additional_includedir" != "X"; then - dnl Potentially add $additional_includedir to $INCNAME. - dnl But don't add it - dnl 1. if it's the standard /usr/include, - dnl 2. if it's /usr/local/include and we are using GCC on Linux, - dnl 3. if it's already present in $CPPFLAGS or the already - dnl constructed $INCNAME, - dnl 4. if it doesn't exist as a directory. - if test "X$additional_includedir" != "X/usr/include"; then - haveit= - if test "X$additional_includedir" = "X/usr/local/include"; then - if test -n "$GCC"; then - case $host_os in - linux*) haveit=yes;; - esac - fi - fi - if test -z "$haveit"; then - for x in $CPPFLAGS $INC[]NAME; do - AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) - if test "X$x" = "X-I$additional_includedir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - if test -d "$additional_includedir"; then - dnl Really add $additional_includedir to $INCNAME. - INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" - fi - fi - fi - fi - fi - dnl Look for dependencies. - if test -n "$found_la"; then - dnl Read the .la file. It defines the variables - dnl dlname, library_names, old_library, dependency_libs, current, - dnl age, revision, installed, dlopen, dlpreopen, libdir. - save_libdir="$libdir" - case "$found_la" in - */* | *\\*) . "$found_la" ;; - *) . "./$found_la" ;; - esac - libdir="$save_libdir" - dnl We use only dependency_libs. - for dep in $dependency_libs; do - case "$dep" in - -L*) - additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` - dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. - dnl But don't add it - dnl 1. if it's the standard /usr/lib, - dnl 2. if it's /usr/local/lib and we are using GCC on Linux, - dnl 3. if it's already present in $LDFLAGS or the already - dnl constructed $LIBNAME, - dnl 4. if it doesn't exist as a directory. - if test "X$additional_libdir" != "X/usr/lib"; then - haveit= - if test "X$additional_libdir" = "X/usr/local/lib"; then - if test -n "$GCC"; then - case $host_os in - linux*) haveit=yes;; - esac - fi - fi - if test -z "$haveit"; then - haveit= - for x in $LDFLAGS $LIB[]NAME; do - AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) - if test "X$x" = "X-L$additional_libdir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - if test -d "$additional_libdir"; then - dnl Really add $additional_libdir to $LIBNAME. - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" - fi - fi - haveit= - for x in $LDFLAGS $LTLIB[]NAME; do - AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) - if test "X$x" = "X-L$additional_libdir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - if test -d "$additional_libdir"; then - dnl Really add $additional_libdir to $LTLIBNAME. - LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" - fi - fi - fi - fi - ;; - -R*) - dir=`echo "X$dep" | sed -e 's/^X-R//'` - if test "$enable_rpath" != no; then - dnl Potentially add DIR to rpathdirs. - dnl The rpathdirs will be appended to $LIBNAME at the end. - haveit= - for x in $rpathdirs; do - if test "X$x" = "X$dir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - rpathdirs="$rpathdirs $dir" - fi - dnl Potentially add DIR to ltrpathdirs. - dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. - haveit= - for x in $ltrpathdirs; do - if test "X$x" = "X$dir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - ltrpathdirs="$ltrpathdirs $dir" - fi - fi - ;; - -l*) - dnl Handle this in the next round. - names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` - ;; - *.la) - dnl Handle this in the next round. Throw away the .la's - dnl directory; it is already contained in a preceding -L - dnl option. - names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` - ;; - *) - dnl Most likely an immediate library name. - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" - LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" - ;; - esac - done - fi - else - dnl Didn't find the library; assume it is in the system directories - dnl known to the linker and runtime loader. (All the system - dnl directories known to the linker should also be known to the - dnl runtime loader, otherwise the system is severely misconfigured.) - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" - LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" - fi - fi - fi - done - done - if test "X$rpathdirs" != "X"; then - if test -n "$hardcode_libdir_separator"; then - dnl Weird platform: only the last -rpath option counts, the user must - dnl pass all path elements in one option. We can arrange that for a - dnl single library, but not when more than one $LIBNAMEs are used. - alldirs= - for found_dir in $rpathdirs; do - alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" - done - dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl. - acl_save_libdir="$libdir" - libdir="$alldirs" - eval flag=\"$hardcode_libdir_flag_spec\" - libdir="$acl_save_libdir" - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" - else - dnl The -rpath options are cumulative. - for found_dir in $rpathdirs; do - acl_save_libdir="$libdir" - libdir="$found_dir" - eval flag=\"$hardcode_libdir_flag_spec\" - libdir="$acl_save_libdir" - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" - done - fi - fi - if test "X$ltrpathdirs" != "X"; then - dnl When using libtool, the option that works for both libraries and - dnl executables is -R. The -R options are cumulative. - for found_dir in $ltrpathdirs; do - LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" - done - fi -]) - -dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, -dnl unless already present in VAR. -dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes -dnl contains two or three consecutive elements that belong together. -AC_DEFUN([AC_LIB_APPENDTOVAR], -[ - for element in [$2]; do - haveit= - for x in $[$1]; do - AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) - if test "X$x" = "X$element"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - [$1]="${[$1]}${[$1]:+ }$element" - fi - done -]) -# lib-prefix.m4 serial 2 (gettext-0.12) -dnl Copyright (C) 2001-2003 Free Software Foundation, Inc. -dnl This file is free software, distributed under the terms of the GNU -dnl General Public License. As a special exception to the GNU General -dnl Public License, this file may be distributed as part of a program -dnl that contains a configuration script generated by Autoconf, under -dnl the same distribution terms as the rest of that program. - -dnl From Bruno Haible. - -dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and -dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't -dnl require excessive bracketing. -ifdef([AC_HELP_STRING], -[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], -[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) - -dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed -dnl to access previously installed libraries. The basic assumption is that -dnl a user will want packages to use other packages he previously installed -dnl with the same --prefix option. -dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate -dnl libraries, but is otherwise very convenient. -AC_DEFUN([AC_LIB_PREFIX], -[ - AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) - AC_REQUIRE([AC_PROG_CC]) - AC_REQUIRE([AC_CANONICAL_HOST]) - AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) - dnl By default, look in $includedir and $libdir. - use_additional=yes - AC_LIB_WITH_FINAL_PREFIX([ - eval additional_includedir=\"$includedir\" - eval additional_libdir=\"$libdir\" - ]) - AC_LIB_ARG_WITH([lib-prefix], -[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib - --without-lib-prefix don't search for libraries in includedir and libdir], -[ - if test "X$withval" = "Xno"; then - use_additional=no - else - if test "X$withval" = "X"; then - AC_LIB_WITH_FINAL_PREFIX([ - eval additional_includedir=\"$includedir\" - eval additional_libdir=\"$libdir\" - ]) - else - additional_includedir="$withval/include" - additional_libdir="$withval/lib" - fi - fi -]) - if test $use_additional = yes; then - dnl Potentially add $additional_includedir to $CPPFLAGS. - dnl But don't add it - dnl 1. if it's the standard /usr/include, - dnl 2. if it's already present in $CPPFLAGS, - dnl 3. if it's /usr/local/include and we are using GCC on Linux, - dnl 4. if it doesn't exist as a directory. - if test "X$additional_includedir" != "X/usr/include"; then - haveit= - for x in $CPPFLAGS; do - AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) - if test "X$x" = "X-I$additional_includedir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - if test "X$additional_includedir" = "X/usr/local/include"; then - if test -n "$GCC"; then - case $host_os in - linux*) haveit=yes;; - esac - fi - fi - if test -z "$haveit"; then - if test -d "$additional_includedir"; then - dnl Really add $additional_includedir to $CPPFLAGS. - CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" - fi - fi - fi - fi - dnl Potentially add $additional_libdir to $LDFLAGS. - dnl But don't add it - dnl 1. if it's the standard /usr/lib, - dnl 2. if it's already present in $LDFLAGS, - dnl 3. if it's /usr/local/lib and we are using GCC on Linux, - dnl 4. if it doesn't exist as a directory. - if test "X$additional_libdir" != "X/usr/lib"; then - haveit= - for x in $LDFLAGS; do - AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) - if test "X$x" = "X-L$additional_libdir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - if test "X$additional_libdir" = "X/usr/local/lib"; then - if test -n "$GCC"; then - case $host_os in - linux*) haveit=yes;; - esac - fi - fi - if test -z "$haveit"; then - if test -d "$additional_libdir"; then - dnl Really add $additional_libdir to $LDFLAGS. - LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" - fi - fi - fi - fi - fi -]) - -dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, -dnl acl_final_exec_prefix, containing the values to which $prefix and -dnl $exec_prefix will expand at the end of the configure script. -AC_DEFUN([AC_LIB_PREPARE_PREFIX], -[ - dnl Unfortunately, prefix and exec_prefix get only finally determined - dnl at the end of configure. - if test "X$prefix" = "XNONE"; then - acl_final_prefix="$ac_default_prefix" - else - acl_final_prefix="$prefix" - fi - if test "X$exec_prefix" = "XNONE"; then - acl_final_exec_prefix='${prefix}' - else - acl_final_exec_prefix="$exec_prefix" - fi - acl_save_prefix="$prefix" - prefix="$acl_final_prefix" - eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" - prefix="$acl_save_prefix" -]) - -dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the -dnl variables prefix and exec_prefix bound to the values they will have -dnl at the end of the configure script. -AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], -[ - acl_save_prefix="$prefix" - prefix="$acl_final_prefix" - acl_save_exec_prefix="$exec_prefix" - exec_prefix="$acl_final_exec_prefix" - $1 - exec_prefix="$acl_save_exec_prefix" - prefix="$acl_save_prefix" -]) -# nls.m4 serial 1 (gettext-0.12) -dnl Copyright (C) 1995-2003 Free Software Foundation, Inc. -dnl This file is free software, distributed under the terms of the GNU -dnl General Public License. As a special exception to the GNU General -dnl Public License, this file may be distributed as part of a program -dnl that contains a configuration script generated by Autoconf, under -dnl the same distribution terms as the rest of that program. -dnl -dnl This file can can be used in projects which are not available under -dnl the GNU General Public License or the GNU Library General Public -dnl License but which still want to provide support for the GNU gettext -dnl functionality. -dnl Please note that the actual code of the GNU gettext library is covered -dnl by the GNU Library General Public License, and the rest of the GNU -dnl gettext package package is covered by the GNU General Public License. -dnl They are *not* in the public domain. - -dnl Authors: -dnl Ulrich Drepper , 1995-2000. -dnl Bruno Haible , 2000-2003. - -AC_DEFUN([AM_NLS], -[ - AC_MSG_CHECKING([whether NLS is requested]) - dnl Default is enabled NLS - AC_ARG_ENABLE(nls, - [ --disable-nls do not use Native Language Support], - USE_NLS=$enableval, USE_NLS=yes) - AC_MSG_RESULT($USE_NLS) - AC_SUBST(USE_NLS) -]) - -AC_DEFUN([AM_MKINSTALLDIRS], -[ - dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly - dnl find the mkinstalldirs script in another subdir but $(top_srcdir). - dnl Try to locate it. - MKINSTALLDIRS= - if test -n "$ac_aux_dir"; then - case "$ac_aux_dir" in - /*) MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" ;; - *) MKINSTALLDIRS="\$(top_builddir)/$ac_aux_dir/mkinstalldirs" ;; - esac - fi - if test -z "$MKINSTALLDIRS"; then - MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" - fi - AC_SUBST(MKINSTALLDIRS) -]) -# po.m4 serial 1 (gettext-0.12) -dnl Copyright (C) 1995-2003 Free Software Foundation, Inc. -dnl This file is free software, distributed under the terms of the GNU -dnl General Public License. As a special exception to the GNU General -dnl Public License, this file may be distributed as part of a program -dnl that contains a configuration script generated by Autoconf, under -dnl the same distribution terms as the rest of that program. -dnl -dnl This file can can be used in projects which are not available under -dnl the GNU General Public License or the GNU Library General Public -dnl License but which still want to provide support for the GNU gettext -dnl functionality. -dnl Please note that the actual code of the GNU gettext library is covered -dnl by the GNU Library General Public License, and the rest of the GNU -dnl gettext package package is covered by the GNU General Public License. -dnl They are *not* in the public domain. - -dnl Authors: -dnl Ulrich Drepper , 1995-2000. -dnl Bruno Haible , 2000-2003. - -dnl Checks for all prerequisites of the po subdirectory. -AC_DEFUN([AM_PO_SUBDIRS], -[ - AC_REQUIRE([AC_PROG_MAKE_SET])dnl - AC_REQUIRE([AC_PROG_INSTALL])dnl - AC_REQUIRE([AM_MKINSTALLDIRS])dnl - AC_REQUIRE([AM_NLS])dnl - - dnl Perform the following tests also if --disable-nls has been given, - dnl because they are needed for "make dist" to work. - - dnl Search for GNU msgfmt in the PATH. - dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. - dnl The second test excludes FreeBSD msgfmt. - AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, - [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 && - (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], - :) - AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) - - dnl Search for GNU xgettext 0.12 or newer in the PATH. - dnl The first test excludes Solaris xgettext and early GNU xgettext versions. - dnl The second test excludes FreeBSD xgettext. - AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, - [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 && - (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], - :) - dnl Remove leftover from FreeBSD xgettext call. - rm -f messages.po - - dnl Search for GNU msgmerge 0.11 or newer in the PATH. - AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, - [$ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1], :) - - dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. - dnl Test whether we really found GNU msgfmt. - if test "$GMSGFMT" != ":"; then - dnl If it is no GNU msgfmt we define it as : so that the - dnl Makefiles still can work. - if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 && - (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then - : ; - else - GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'` - AC_MSG_RESULT( - [found $GMSGFMT program is not GNU msgfmt; ignore it]) - GMSGFMT=":" - fi - fi - - dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. - dnl Test whether we really found GNU xgettext. - if test "$XGETTEXT" != ":"; then - dnl If it is no GNU xgettext we define it as : so that the - dnl Makefiles still can work. - if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 && - (if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then - : ; - else - AC_MSG_RESULT( - [found xgettext program is not GNU xgettext; ignore it]) - XGETTEXT=":" - fi - dnl Remove leftover from FreeBSD xgettext call. - rm -f messages.po - fi - - AC_OUTPUT_COMMANDS([ - for ac_file in $CONFIG_FILES; do - # Support "outfile[:infile[:infile...]]" - case "$ac_file" in - *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - esac - # PO directories have a Makefile.in generated from Makefile.in.in. - case "$ac_file" in */Makefile.in) - # Adjust a relative srcdir. - ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` - ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" - ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` - # In autoconf-2.13 it is called $ac_given_srcdir. - # In autoconf-2.50 it is called $srcdir. - test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" - case "$ac_given_srcdir" in - .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; - /*) top_srcdir="$ac_given_srcdir" ;; - *) top_srcdir="$ac_dots$ac_given_srcdir" ;; - esac - if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then - rm -f "$ac_dir/POTFILES" - test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" - cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" - POMAKEFILEDEPS="POTFILES.in" - # ALL_LINGUAS, POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES depend - # on $ac_dir but don't depend on user-specified configuration - # parameters. - if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then - # The LINGUAS file contains the set of available languages. - if test -n "$OBSOLETE_ALL_LINGUAS"; then - test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" - fi - ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"` - # Hide the ALL_LINGUAS assigment from automake. - eval 'ALL_LINGUAS''=$ALL_LINGUAS_' - POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" - else - # The set of available languages was given in configure.in. - eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' - fi - case "$ac_given_srcdir" in - .) srcdirpre= ;; - *) srcdirpre='$(srcdir)/' ;; - esac - POFILES= - GMOFILES= - UPDATEPOFILES= - DUMMYPOFILES= - for lang in $ALL_LINGUAS; do - POFILES="$POFILES $srcdirpre$lang.po" - GMOFILES="$GMOFILES $srcdirpre$lang.gmo" - UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" - DUMMYPOFILES="$DUMMYPOFILES $lang.nop" - done - # CATALOGS depends on both $ac_dir and the user's LINGUAS - # environment variable. - INST_LINGUAS= - if test -n "$ALL_LINGUAS"; then - for presentlang in $ALL_LINGUAS; do - useit=no - if test "%UNSET%" != "$LINGUAS"; then - desiredlanguages="$LINGUAS" - else - desiredlanguages="$ALL_LINGUAS" - fi - for desiredlang in $desiredlanguages; do - # Use the presentlang catalog if desiredlang is - # a. equal to presentlang, or - # b. a variant of presentlang (because in this case, - # presentlang can be used as a fallback for messages - # which are not translated in the desiredlang catalog). - case "$desiredlang" in - "$presentlang"*) useit=yes;; - esac - done - if test $useit = yes; then - INST_LINGUAS="$INST_LINGUAS $presentlang" - fi - done - fi - CATALOGS= - if test -n "$INST_LINGUAS"; then - for lang in $INST_LINGUAS; do - CATALOGS="$CATALOGS $lang.gmo" - done - fi - test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" - sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" - for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do - if test -f "$f"; then - case "$f" in - *.orig | *.bak | *~) ;; - *) cat "$f" >> "$ac_dir/Makefile" ;; - esac - fi - done - fi - ;; - esac - done], - [# Capture the value of obsolete ALL_LINGUAS because we need it to compute - # POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES, CATALOGS. But hide it - # from automake. - eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' - # Capture the value of LINGUAS because we need it to compute CATALOGS. - LINGUAS="${LINGUAS-%UNSET%}" - ]) -]) -# progtest.m4 serial 3 (gettext-0.12) -dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. -dnl This file is free software, distributed under the terms of the GNU -dnl General Public License. As a special exception to the GNU General -dnl Public License, this file may be distributed as part of a program -dnl that contains a configuration script generated by Autoconf, under -dnl the same distribution terms as the rest of that program. -dnl -dnl This file can can be used in projects which are not available under -dnl the GNU General Public License or the GNU Library General Public -dnl License but which still want to provide support for the GNU gettext -dnl functionality. -dnl Please note that the actual code of the GNU gettext library is covered -dnl by the GNU Library General Public License, and the rest of the GNU -dnl gettext package package is covered by the GNU General Public License. -dnl They are *not* in the public domain. - -dnl Authors: -dnl Ulrich Drepper , 1996. - -# Search path for a program which passes the given test. - -dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, -dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) -AC_DEFUN([AM_PATH_PROG_WITH_TEST], -[ -# Prepare PATH_SEPARATOR. -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conf$$.sh -fi - -# Find out how to test for executable files. Don't use a zero-byte file, -# as systems may use methods other than mode bits to determine executability. -cat >conf$$.file <<_ASEOF -#! /bin/sh -exit 0 -_ASEOF -chmod +x conf$$.file -if test -x conf$$.file >/dev/null 2>&1; then - ac_executable_p="test -x" -else - ac_executable_p="test -f" -fi -rm -f conf$$.file - -# Extract the first word of "$2", so it can be a program name with args. -set dummy $2; ac_word=[$]2 -AC_MSG_CHECKING([for $ac_word]) -AC_CACHE_VAL(ac_cv_path_$1, -[case "[$]$1" in - [[\\/]]* | ?:[[\\/]]*) - ac_cv_path_$1="[$]$1" # Let the user override the test with a path. - ;; - *) - ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in ifelse([$5], , $PATH, [$5]); do - IFS="$ac_save_IFS" - test -z "$ac_dir" && ac_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then - if [$3]; then - ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" - break 2 - fi - fi - done - done - IFS="$ac_save_IFS" -dnl If no 4th arg is given, leave the cache variable unset, -dnl so AC_PATH_PROGS will keep looking. -ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" -])dnl - ;; -esac])dnl -$1="$ac_cv_path_$1" -if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then - AC_MSG_RESULT([$]$1) -else - AC_MSG_RESULT(no) -fi -AC_SUBST($1)dnl -]) -# stdint_h.m4 serial 3 (gettext-0.12) -dnl Copyright (C) 1997-2003 Free Software Foundation, Inc. -dnl This file is free software, distributed under the terms of the GNU -dnl General Public License. As a special exception to the GNU General -dnl Public License, this file may be distributed as part of a program -dnl that contains a configuration script generated by Autoconf, under -dnl the same distribution terms as the rest of that program. - -dnl From Paul Eggert. - -# Define HAVE_STDINT_H_WITH_UINTMAX if exists, -# doesn't clash with , and declares uintmax_t. - -AC_DEFUN([jm_AC_HEADER_STDINT_H], -[ - AC_CACHE_CHECK([for stdint.h], jm_ac_cv_header_stdint_h, - [AC_TRY_COMPILE( - [#include -#include ], - [uintmax_t i = (uintmax_t) -1;], - jm_ac_cv_header_stdint_h=yes, - jm_ac_cv_header_stdint_h=no)]) - if test $jm_ac_cv_header_stdint_h = yes; then - AC_DEFINE_UNQUOTED(HAVE_STDINT_H_WITH_UINTMAX, 1, - [Define if exists, doesn't clash with , - and declares uintmax_t. ]) - fi -]) -# uintmax_t.m4 serial 7 (gettext-0.12) -dnl Copyright (C) 1997-2003 Free Software Foundation, Inc. -dnl This file is free software, distributed under the terms of the GNU -dnl General Public License. As a special exception to the GNU General -dnl Public License, this file may be distributed as part of a program -dnl that contains a configuration script generated by Autoconf, under -dnl the same distribution terms as the rest of that program. - -dnl From Paul Eggert. - -AC_PREREQ(2.13) - -# Define uintmax_t to 'unsigned long' or 'unsigned long long' -# if it is not already defined in or . - -AC_DEFUN([jm_AC_TYPE_UINTMAX_T], -[ - AC_REQUIRE([jm_AC_HEADER_INTTYPES_H]) - AC_REQUIRE([jm_AC_HEADER_STDINT_H]) - if test $jm_ac_cv_header_inttypes_h = no && test $jm_ac_cv_header_stdint_h = no; then - AC_REQUIRE([jm_AC_TYPE_UNSIGNED_LONG_LONG]) - test $ac_cv_type_unsigned_long_long = yes \ - && ac_type='unsigned long long' \ - || ac_type='unsigned long' - AC_DEFINE_UNQUOTED(uintmax_t, $ac_type, - [Define to unsigned long or unsigned long long - if and don't define.]) - else - AC_DEFINE(HAVE_UINTMAX_T, 1, - [Define if you have the 'uintmax_t' type in or .]) - fi -]) -# ulonglong.m4 serial 2 (fileutils-4.0.32, gettext-0.10.40) -dnl Copyright (C) 1999-2002 Free Software Foundation, Inc. -dnl This file is free software, distributed under the terms of the GNU -dnl General Public License. As a special exception to the GNU General -dnl Public License, this file may be distributed as part of a program -dnl that contains a configuration script generated by Autoconf, under -dnl the same distribution terms as the rest of that program. - -dnl From Paul Eggert. - -AC_DEFUN([jm_AC_TYPE_UNSIGNED_LONG_LONG], -[ - AC_CACHE_CHECK([for unsigned long long], ac_cv_type_unsigned_long_long, - [AC_TRY_LINK([unsigned long long ull = 1; int i = 63;], - [unsigned long long ullmax = (unsigned long long) -1; - return ull << i | ull >> i | ullmax / ull | ullmax % ull;], - ac_cv_type_unsigned_long_long=yes, - ac_cv_type_unsigned_long_long=no)]) - if test $ac_cv_type_unsigned_long_long = yes; then - AC_DEFINE(HAVE_UNSIGNED_LONG_LONG, 1, - [Define if you have the unsigned long long type.]) - fi -]) diff --git a/dep/src/readline/src/ansi_stdlib.h b/dep/src/readline/src/ansi_stdlib.h deleted file mode 100644 index db13cd234bd..00000000000 --- a/dep/src/readline/src/ansi_stdlib.h +++ /dev/null @@ -1,54 +0,0 @@ -/* ansi_stdlib.h -- An ANSI Standard stdlib.h. */ -/* A minimal stdlib.h containing extern declarations for those functions - that bash uses. */ - -/* Copyright (C) 1993 Free Software Foundation, Inc. - - This file is part of GNU Bash, the Bourne Again SHell. - - Bash is free software; you can redistribute it and/or modify it under - the terms of the GNU General Public License as published by the Free - Software Foundation; either version 2, or (at your option) any later - version. - - Bash is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - for more details. - - You should have received a copy of the GNU General Public License along - with Bash; see the file COPYING. If not, write to the Free Software - Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#if !defined (_STDLIB_H_) -#define _STDLIB_H_ 1 - -/* String conversion functions. */ -extern int atoi (); - -extern double atof (); -extern double strtod (); - -/* Memory allocation functions. */ -/* Generic pointer type. */ -#ifndef PTR_T - -#if defined (__STDC__) -# define PTR_T void * -#else -# define PTR_T char * -#endif - -#endif /* PTR_T */ - -extern PTR_T malloc (); -extern PTR_T realloc (); -extern void free (); - -/* Other miscellaneous functions. */ -extern void abort (); -extern void exit (); -extern char *getenv (); -extern void qsort (); - -#endif /* _STDLIB_H */ diff --git a/dep/src/readline/src/bind.c b/dep/src/readline/src/bind.c deleted file mode 100644 index 50b1257352b..00000000000 --- a/dep/src/readline/src/bind.c +++ /dev/null @@ -1,2237 +0,0 @@ -/* bind.c -- key binding and startup file support for the readline library. */ - -/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#define READLINE_LIBRARY - -#if defined (__TANDEM) -# include -#endif - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#include -#include -#include -#if defined (HAVE_SYS_FILE_H) -# include -#endif /* HAVE_SYS_FILE_H */ - -#if defined (HAVE_UNISTD_H) -# include -#endif /* HAVE_UNISTD_H */ - -#if defined (HAVE_STDLIB_H) -# include -#else -# include "ansi_stdlib.h" -#endif /* HAVE_STDLIB_H */ - -#include - -#if !defined (errno) -extern int errno; -#endif /* !errno */ - -#ifdef _WIN32 -#include -#include -#endif - -#include "posixstat.h" - -/* System-specific feature definitions and include files. */ -#include "rldefs.h" - -/* Some standard library routines. */ -#include "readline.h" -#include "history.h" - -#include "rlprivate.h" -#include "rlshell.h" -#include "xmalloc.h" - -#if !defined (strchr) && !defined (__STDC__) && !defined (_WIN32) -extern char *strchr (), *strrchr (); -#endif /* !strchr && !__STDC__ */ - -/* Variables exported by this file. */ -Keymap rl_binding_keymap; - -static char *_rl_read_file PARAMS((char *, size_t *)); -static void _rl_init_file_error PARAMS((const char *)); -static int _rl_read_init_file PARAMS((const char *, int)); -static int glean_key_from_name PARAMS((char *)); -static int substring_member_of_array PARAMS((char *, const char **)); - -static int currently_reading_init_file; - -/* used only in this file */ -static int _rl_prefer_visible_bell = 1; - -/* **************************************************************** */ -/* */ -/* Binding keys */ -/* */ -/* **************************************************************** */ - -/* rl_add_defun (char *name, rl_command_func_t *function, int key) - Add NAME to the list of named functions. Make FUNCTION be the function - that gets called. If KEY is not -1, then bind it. */ -int -rl_add_defun (name, function, key) - const char *name; - rl_command_func_t *function; - int key; -{ - if (key != -1) - rl_bind_key (key, function); - rl_add_funmap_entry (name, function); - return 0; -} - -/* Bind KEY to FUNCTION. Returns non-zero if KEY is out of range. */ -int -rl_bind_key (key, function) - int key; - rl_command_func_t *function; -{ - if (key < 0) - return (key); - - if (META_CHAR (key) && _rl_convert_meta_chars_to_ascii) - { - if (_rl_keymap[ESC].type == ISKMAP) - { - Keymap escmap; - - escmap = FUNCTION_TO_KEYMAP (_rl_keymap, ESC); - key = UNMETA (key); - escmap[key].type = ISFUNC; - escmap[key].function = function; - return (0); - } - return (key); - } - - _rl_keymap[key].type = ISFUNC; - _rl_keymap[key].function = function; - rl_binding_keymap = _rl_keymap; - return (0); -} - -/* Bind KEY to FUNCTION in MAP. Returns non-zero in case of invalid - KEY. */ -int -rl_bind_key_in_map (key, function, map) - int key; - rl_command_func_t *function; - Keymap map; -{ - int result; - Keymap oldmap; - - oldmap = _rl_keymap; - _rl_keymap = map; - result = rl_bind_key (key, function); - _rl_keymap = oldmap; - return (result); -} - -/* Bind key sequence KEYSEQ to DEFAULT_FUNC if KEYSEQ is unbound. Right - now, this is always used to attempt to bind the arrow keys, hence the - check for rl_vi_movement_mode. */ -int -rl_bind_key_if_unbound_in_map (key, default_func, kmap) - int key; - rl_command_func_t *default_func; - Keymap kmap; -{ - char keyseq[2]; - - keyseq[0] = (unsigned char)key; - keyseq[1] = '\0'; - return (rl_bind_keyseq_if_unbound_in_map (keyseq, default_func, kmap)); -} - -int -rl_bind_key_if_unbound (key, default_func) - int key; - rl_command_func_t *default_func; -{ - char keyseq[2]; - - keyseq[0] = (unsigned char)key; - keyseq[1] = '\0'; - return (rl_bind_keyseq_if_unbound_in_map (keyseq, default_func, _rl_keymap)); -} - -/* Make KEY do nothing in the currently selected keymap. - Returns non-zero in case of error. */ -int -rl_unbind_key (key) - int key; -{ - return (rl_bind_key (key, (rl_command_func_t *)NULL)); -} - -/* Make KEY do nothing in MAP. - Returns non-zero in case of error. */ -int -rl_unbind_key_in_map (key, map) - int key; - Keymap map; -{ - return (rl_bind_key_in_map (key, (rl_command_func_t *)NULL, map)); -} - -/* Unbind all keys bound to FUNCTION in MAP. */ -int -rl_unbind_function_in_map (func, map) - rl_command_func_t *func; - Keymap map; -{ - register int i, rval; - - for (i = rval = 0; i < KEYMAP_SIZE; i++) - { - if (map[i].type == ISFUNC && map[i].function == func) - { - map[i].function = (rl_command_func_t *)NULL; - rval = 1; - } - } - return rval; -} - -int -rl_unbind_command_in_map (command, map) - const char *command; - Keymap map; -{ - rl_command_func_t *func; - - func = rl_named_function (command); - if (func == 0) - return 0; - return (rl_unbind_function_in_map (func, map)); -} - -/* Bind the key sequence represented by the string KEYSEQ to - FUNCTION, starting in the current keymap. This makes new - keymaps as necessary. */ -int -rl_bind_keyseq (keyseq, function) - const char *keyseq; - rl_command_func_t *function; -{ - return (rl_generic_bind (ISFUNC, keyseq, (char *)function, _rl_keymap)); -} - -/* Bind the key sequence represented by the string KEYSEQ to - FUNCTION. This makes new keymaps as necessary. The initial - place to do bindings is in MAP. */ -int -rl_bind_keyseq_in_map (keyseq, function, map) - const char *keyseq; - rl_command_func_t *function; - Keymap map; -{ - return (rl_generic_bind (ISFUNC, keyseq, (char *)function, map)); -} - -/* Backwards compatibility; equivalent to rl_bind_keyseq_in_map() */ -int -rl_set_key (keyseq, function, map) - const char *keyseq; - rl_command_func_t *function; - Keymap map; -{ - return (rl_generic_bind (ISFUNC, keyseq, (char *)function, map)); -} - -/* Bind key sequence KEYSEQ to DEFAULT_FUNC if KEYSEQ is unbound. Right - now, this is always used to attempt to bind the arrow keys, hence the - check for rl_vi_movement_mode. */ -int -rl_bind_keyseq_if_unbound_in_map (keyseq, default_func, kmap) - const char *keyseq; - rl_command_func_t *default_func; - Keymap kmap; -{ - rl_command_func_t *func; - - if (keyseq) - { - func = rl_function_of_keyseq (keyseq, kmap, (int *)NULL); -#if defined (VI_MODE) - if (!func || func == rl_do_lowercase_version || func == rl_vi_movement_mode) -#else - if (!func || func == rl_do_lowercase_version) -#endif - return (rl_bind_keyseq_in_map (keyseq, default_func, kmap)); - else - return 1; - } - return 0; -} - -int -rl_bind_keyseq_if_unbound (keyseq, default_func) - const char *keyseq; - rl_command_func_t *default_func; -{ - return (rl_bind_keyseq_if_unbound_in_map (keyseq, default_func, _rl_keymap)); -} - -/* Bind the key sequence represented by the string KEYSEQ to - the string of characters MACRO. This makes new keymaps as - necessary. The initial place to do bindings is in MAP. */ -int -rl_macro_bind (keyseq, macro, map) - const char *keyseq, *macro; - Keymap map; -{ - char *macro_keys; - int macro_keys_len; - - macro_keys = (char *)xmalloc ((2 * strlen (macro)) + 1); - - if (rl_translate_keyseq (macro, macro_keys, ¯o_keys_len)) - { - free (macro_keys); - return -1; - } - rl_generic_bind (ISMACR, keyseq, macro_keys, map); - return 0; -} - -/* Bind the key sequence represented by the string KEYSEQ to - the arbitrary pointer DATA. TYPE says what kind of data is - pointed to by DATA, right now this can be a function (ISFUNC), - a macro (ISMACR), or a keymap (ISKMAP). This makes new keymaps - as necessary. The initial place to do bindings is in MAP. */ -int -rl_generic_bind (type, keyseq, data, map) - int type; - const char *keyseq; - char *data; - Keymap map; -{ - char *keys; - int keys_len; - register int i; - KEYMAP_ENTRY k; - - k.function = 0; - - /* If no keys to bind to, exit right away. */ - if (!keyseq || !*keyseq) - { - if (type == ISMACR) - free (data); - return -1; - } - - keys = (char *)xmalloc (1 + (2 * strlen (keyseq))); - - /* Translate the ASCII representation of KEYSEQ into an array of - characters. Stuff the characters into KEYS, and the length of - KEYS into KEYS_LEN. */ - if (rl_translate_keyseq (keyseq, keys, &keys_len)) - { - free (keys); - return -1; - } - - /* Bind keys, making new keymaps as necessary. */ - for (i = 0; i < keys_len; i++) - { - unsigned char uc = keys[i]; - int ic; - - ic = uc; - if (ic < 0 || ic >= KEYMAP_SIZE) - return -1; - - if (_rl_convert_meta_chars_to_ascii && META_CHAR (ic)) - { - ic = UNMETA (ic); - if (map[ESC].type == ISKMAP) - map = FUNCTION_TO_KEYMAP (map, ESC); - } - - if ((i + 1) < keys_len) - { - if (map[ic].type != ISKMAP) - { - /* We allow subsequences of keys. If a keymap is being - created that will `shadow' an existing function or macro - key binding, we save that keybinding into the ANYOTHERKEY - index in the new map. The dispatch code will look there - to find the function to execute if the subsequence is not - matched. ANYOTHERKEY was chosen to be greater than - UCHAR_MAX. */ - k = map[ic]; - - map[ic].type = ISKMAP; - map[ic].function = KEYMAP_TO_FUNCTION (rl_make_bare_keymap()); - } - map = FUNCTION_TO_KEYMAP (map, ic); - /* The dispatch code will return this function if no matching - key sequence is found in the keymap. This (with a little - help from the dispatch code in readline.c) allows `a' to be - mapped to something, `abc' to be mapped to something else, - and the function bound to `a' to be executed when the user - types `abx', leaving `bx' in the input queue. */ - if (k.function && ((k.type == ISFUNC && k.function != rl_do_lowercase_version) || k.type == ISMACR)) - { - map[ANYOTHERKEY] = k; - k.function = 0; - } - } - else - { - if (map[ic].type == ISMACR) - free ((char *)map[ic].function); - else if (map[ic].type == ISKMAP) - { - map = FUNCTION_TO_KEYMAP (map, ic); - ic = ANYOTHERKEY; - } - - map[ic].function = KEYMAP_TO_FUNCTION (data); - map[ic].type = type; - } - - rl_binding_keymap = map; - } - free (keys); - return 0; -} - -/* Translate the ASCII representation of SEQ, stuffing the values into ARRAY, - an array of characters. LEN gets the final length of ARRAY. Return - non-zero if there was an error parsing SEQ. */ -int -rl_translate_keyseq (seq, array, len) - const char *seq; - char *array; - int *len; -{ - register int i, c, l, temp; - - for (i = l = 0; c = seq[i]; i++) - { - if (c == '\\') - { - c = seq[++i]; - - if (c == 0) - break; - - /* Handle \C- and \M- prefixes. */ - if ((c == 'C' || c == 'M') && seq[i + 1] == '-') - { - /* Handle special case of backwards define. */ - if (strncmp (&seq[i], "C-\\M-", 5) == 0) - { - array[l++] = ESC; /* ESC is meta-prefix */ - i += 5; - array[l++] = CTRL (_rl_to_upper (seq[i])); - if (seq[i] == '\0') - i--; - } - else if (c == 'M') - { - i++; - array[l++] = ESC; /* ESC is meta-prefix */ - } - else if (c == 'C') - { - i += 2; - /* Special hack for C-?... */ - array[l++] = (seq[i] == '?') ? RUBOUT : CTRL (_rl_to_upper (seq[i])); - } - continue; - } - - /* Translate other backslash-escaped characters. These are the - same escape sequences that bash's `echo' and `printf' builtins - handle, with the addition of \d -> RUBOUT. A backslash - preceding a character that is not special is stripped. */ - switch (c) - { - case 'a': - array[l++] = '\007'; - break; - case 'b': - array[l++] = '\b'; - break; - case 'd': - array[l++] = RUBOUT; /* readline-specific */ - break; - case 'e': - array[l++] = ESC; - break; - case 'f': - array[l++] = '\f'; - break; - case 'n': - array[l++] = NEWLINE; - break; - case 'r': - array[l++] = RETURN; - break; - case 't': - array[l++] = TAB; - break; - case 'v': - array[l++] = 0x0B; - break; - case '\\': - array[l++] = '\\'; - break; - case '0': case '1': case '2': case '3': - case '4': case '5': case '6': case '7': - i++; - for (temp = 2, c -= '0'; ISOCTAL (seq[i]) && temp--; i++) - c = (c * 8) + OCTVALUE (seq[i]); - i--; /* auto-increment in for loop */ - array[l++] = c & largest_char; - break; - case 'x': - i++; - for (temp = 2, c = 0; ISXDIGIT ((unsigned char)seq[i]) && temp--; i++) - c = (c * 16) + HEXVALUE (seq[i]); - if (temp == 2) - c = 'x'; - i--; /* auto-increment in for loop */ - array[l++] = c & largest_char; - break; - default: /* backslashes before non-special chars just add the char */ - array[l++] = c; - break; /* the backslash is stripped */ - } - continue; - } - - array[l++] = c; - } - - *len = l; - array[l] = '\0'; - return (0); -} - -char * -rl_untranslate_keyseq (seq) - int seq; -{ - static char kseq[16]; - int i, c; - - i = 0; - c = seq; - if (META_CHAR (c)) - { - kseq[i++] = '\\'; - kseq[i++] = 'M'; - kseq[i++] = '-'; - c = UNMETA (c); - } - else if (CTRL_CHAR (c)) - { - kseq[i++] = '\\'; - kseq[i++] = 'C'; - kseq[i++] = '-'; - c = _rl_to_lower (UNCTRL (c)); - } - else if (c == RUBOUT) - { - kseq[i++] = '\\'; - kseq[i++] = 'C'; - kseq[i++] = '-'; - c = '?'; - } - - if (c == ESC) - { - kseq[i++] = '\\'; - c = 'e'; - } - else if (c == '\\' || c == '"') - { - kseq[i++] = '\\'; - } - - kseq[i++] = (unsigned char) c; - kseq[i] = '\0'; - return kseq; -} - -static char * -_rl_untranslate_macro_value (seq) - char *seq; -{ - char *ret, *r, *s; - int c; - - r = ret = (char *)xmalloc (7 * strlen (seq) + 1); - for (s = seq; *s; s++) - { - c = *s; - if (META_CHAR (c)) - { - *r++ = '\\'; - *r++ = 'M'; - *r++ = '-'; - c = UNMETA (c); - } - else if (CTRL_CHAR (c) && c != ESC) - { - *r++ = '\\'; - *r++ = 'C'; - *r++ = '-'; - c = _rl_to_lower (UNCTRL (c)); - } - else if (c == RUBOUT) - { - *r++ = '\\'; - *r++ = 'C'; - *r++ = '-'; - c = '?'; - } - - if (c == ESC) - { - *r++ = '\\'; - c = 'e'; - } - else if (c == '\\' || c == '"') - *r++ = '\\'; - - *r++ = (unsigned char)c; - } - *r = '\0'; - return ret; -} - -/* Return a pointer to the function that STRING represents. - If STRING doesn't have a matching function, then a NULL pointer - is returned. */ -rl_command_func_t * -rl_named_function (string) - const char *string; -{ - register int i; - - rl_initialize_funmap (); - - for (i = 0; funmap[i]; i++) - if (_rl_stricmp (funmap[i]->name, string) == 0) - return (funmap[i]->function); - return ((rl_command_func_t *)NULL); -} - -/* Return the function (or macro) definition which would be invoked via - KEYSEQ if executed in MAP. If MAP is NULL, then the current keymap is - used. TYPE, if non-NULL, is a pointer to an int which will receive the - type of the object pointed to. One of ISFUNC (function), ISKMAP (keymap), - or ISMACR (macro). */ -rl_command_func_t * -rl_function_of_keyseq (keyseq, map, type) - const char *keyseq; - Keymap map; - int *type; -{ - register int i; - - if (!map) - map = _rl_keymap; - - for (i = 0; keyseq && keyseq[i]; i++) - { - unsigned char ic = keyseq[i]; - - if (META_CHAR (ic) && _rl_convert_meta_chars_to_ascii) - { - if (map[ESC].type != ISKMAP) - { - if (type) - *type = map[ESC].type; - - return (map[ESC].function); - } - else - { - map = FUNCTION_TO_KEYMAP (map, ESC); - ic = UNMETA (ic); - } - } - - if (map[ic].type == ISKMAP) - { - /* If this is the last key in the key sequence, return the - map. */ - if (!keyseq[i + 1]) - { - if (type) - *type = ISKMAP; - - return (map[ic].function); - } - else - map = FUNCTION_TO_KEYMAP (map, ic); - } - else - { - if (type) - *type = map[ic].type; - - return (map[ic].function); - } - } - return ((rl_command_func_t *) NULL); -} - -/* The last key bindings file read. */ -static char *last_readline_init_file = (char *)NULL; - -/* The file we're currently reading key bindings from. */ -static const char *current_readline_init_file; -static int current_readline_init_include_level; -static int current_readline_init_lineno; - -/* Read FILENAME into a locally-allocated buffer and return the buffer. - The size of the buffer is returned in *SIZEP. Returns NULL if any - errors were encountered. */ -static char * -_rl_read_file (filename, sizep) - char *filename; - size_t *sizep; -{ - struct stat finfo; - size_t file_size; - char *buffer; - int i, file; - - if ((stat (filename, &finfo) < 0) || (file = open (filename, O_RDONLY, 0666)) < 0) - return ((char *)NULL); - - file_size = (size_t)finfo.st_size; - - /* check for overflow on very large files */ - if (file_size != finfo.st_size || file_size + 1 < file_size) - { - if (file >= 0) - close (file); -#if defined (EFBIG) - errno = EFBIG; -#endif - return ((char *)NULL); - } - - /* Read the file into BUFFER. */ - buffer = (char *)xmalloc (file_size + 1); - i = read (file, buffer, (int)file_size); - close (file); - - if (i < 0) - { - free (buffer); - return ((char *)NULL); - } - - buffer[i] = '\0'; - if (sizep) - *sizep = i; - - return (buffer); -} - -/* Re-read the current keybindings file. */ -int -rl_re_read_init_file (count, ignore) - int count, ignore; -{ - int r; - r = rl_read_init_file ((const char *)NULL); - rl_set_keymap_from_edit_mode (); - return r; -} - -/* Do key bindings from a file. If FILENAME is NULL it defaults - to the first non-null filename from this list: - 1. the filename used for the previous call - 2. the value of the shell variable `INPUTRC' - 3. ~/.inputrc - If the file existed and could be opened and read, 0 is returned, - otherwise errno is returned. */ -int -rl_read_init_file (filename) - const char *filename; -{ - /* Default the filename. */ - if (filename == 0) - { - filename = last_readline_init_file; - if (filename == 0) - filename = sh_get_env_value ("INPUTRC"); - if (filename == 0) - filename = DEFAULT_INPUTRC; - } - - if (*filename == 0) - filename = DEFAULT_INPUTRC; - -#if defined (__MSDOS__) - if (_rl_read_init_file (filename, 0) == 0) - return 0; - filename = "~/_inputrc"; -#endif - return (_rl_read_init_file (filename, 0)); -} - -static int -_rl_read_init_file (filename, include_level) - const char *filename; - int include_level; -{ - register int i; - char *buffer, *openname, *line, *end; - size_t file_size; - - current_readline_init_file = filename; - current_readline_init_include_level = include_level; - - openname = tilde_expand (filename); - buffer = _rl_read_file (openname, &file_size); - free (openname); - -#if defined (_WIN32) && defined (INITFILES_IN_REGISTRY) - if (buffer == 0) - { - openname = _rl_get_user_registry_string(READLINE_REGKEY, - INPUTRC_REGVAL); - if (openname) - { - buffer = _rl_read_file (openname, &file_size); - free (openname); - } - } -#endif /* _WIN32 */ - - if (buffer == 0) - return (errno); - - if (include_level == 0 && filename != last_readline_init_file) - { - FREE (last_readline_init_file); - last_readline_init_file = savestring (filename); - } - - currently_reading_init_file = 1; - - /* Loop over the lines in the file. Lines that start with `#' are - comments; all other lines are commands for readline initialization. */ - current_readline_init_lineno = 1; - line = buffer; - end = buffer + file_size; - while (line < end) - { - /* Find the end of this line. */ - for (i = 0; line + i != end && line[i] != '\n'; i++); - -#if defined (__CYGWIN__) - /* ``Be liberal in what you accept.'' */ - if (line[i] == '\n' && line[i-1] == '\r') - line[i - 1] = '\0'; -#endif - - /* Mark end of line. */ - line[i] = '\0'; - - /* Skip leading whitespace. */ - while (*line && whitespace (*line)) - { - line++; - i--; - } - - /* If the line is not a comment, then parse it. */ - if (*line && *line != '#') - rl_parse_and_bind (line); - - /* Move to the next line. */ - line += i + 1; - current_readline_init_lineno++; - } - - free (buffer); - currently_reading_init_file = 0; - return (0); -} - -static void -_rl_init_file_error (msg) - const char *msg; -{ - if (currently_reading_init_file) - fprintf (stderr, "readline: %s: line %d: %s\n", current_readline_init_file, - current_readline_init_lineno, msg); - else - fprintf (stderr, "readline: %s\n", msg); -} - -/* **************************************************************** */ -/* */ -/* Parser Directives */ -/* */ -/* **************************************************************** */ - -typedef int _rl_parser_func_t(char *); - -/* Things that mean `Control'. */ -const char *_rl_possible_control_prefixes[] = { - "Control-", "C-", "CTRL-", (const char *)NULL -}; - -const char *_rl_possible_meta_prefixes[] = { - "Meta", "M-", (const char *)NULL -}; - -/* Conditionals. */ - -/* Calling programs set this to have their argv[0]. */ -const char *rl_readline_name = "other"; - -/* Stack of previous values of parsing_conditionalized_out. */ -static unsigned char *if_stack = (unsigned char *)NULL; -static int if_stack_depth; -static int if_stack_size; - -/* Push _rl_parsing_conditionalized_out, and set parser state based - on ARGS. */ -static int -parser_if (char* args) -{ - register int i; - - /* Push parser state. */ - if (if_stack_depth + 1 >= if_stack_size) - { - if (!if_stack) - if_stack = (unsigned char *)xmalloc (if_stack_size = 20); - else - if_stack = (unsigned char *)xrealloc (if_stack, if_stack_size += 20); - } - if_stack[if_stack_depth++] = _rl_parsing_conditionalized_out; - - /* If parsing is turned off, then nothing can turn it back on except - for finding the matching endif. In that case, return right now. */ - if (_rl_parsing_conditionalized_out) - return 0; - - /* Isolate first argument. */ - for (i = 0; args[i] && !whitespace (args[i]); i++); - - if (args[i]) - args[i++] = '\0'; - - /* Handle "$if term=foo" and "$if mode=emacs" constructs. If this - isn't term=foo, or mode=emacs, then check to see if the first - word in ARGS is the same as the value stored in rl_readline_name. */ - if (rl_terminal_name && _rl_strnicmp (args, "term=", 5) == 0) - { - char *tem, *tname; - - /* Terminals like "aaa-60" are equivalent to "aaa". */ - tname = savestring (rl_terminal_name); - tem = strchr (tname, '-'); - if (tem) - *tem = '\0'; - - /* Test the `long' and `short' forms of the terminal name so that - if someone has a `sun-cmd' and does not want to have bindings - that will be executed if the terminal is a `sun', they can put - `$if term=sun-cmd' into their .inputrc. */ - _rl_parsing_conditionalized_out = _rl_stricmp (args + 5, tname) && - _rl_stricmp (args + 5, rl_terminal_name); - free (tname); - } -#if defined (VI_MODE) - else if (_rl_strnicmp (args, "mode=", 5) == 0) - { - int mode; - - if (_rl_stricmp (args + 5, "emacs") == 0) - mode = emacs_mode; - else if (_rl_stricmp (args + 5, "vi") == 0) - mode = vi_mode; - else - mode = no_mode; - - _rl_parsing_conditionalized_out = mode != rl_editing_mode; - } -#endif /* VI_MODE */ - /* Check to see if the first word in ARGS is the same as the - value stored in rl_readline_name. */ - else if (_rl_stricmp (args, rl_readline_name) == 0) - _rl_parsing_conditionalized_out = 0; - else - _rl_parsing_conditionalized_out = 1; - return 0; -} - -/* Invert the current parser state if there is anything on the stack. */ -static int -parser_else (char* args) -{ - register int i; - - if (if_stack_depth == 0) - { - _rl_init_file_error ("$else found without matching $if"); - return 0; - } - -#if 0 - /* Check the previous (n - 1) levels of the stack to make sure that - we haven't previously turned off parsing. */ - for (i = 0; i < if_stack_depth - 1; i++) -#else - /* Check the previous (n) levels of the stack to make sure that - we haven't previously turned off parsing. */ - for (i = 0; i < if_stack_depth; i++) -#endif - if (if_stack[i] == 1) - return 0; - - /* Invert the state of parsing if at top level. */ - _rl_parsing_conditionalized_out = !_rl_parsing_conditionalized_out; - return 0; -} - -/* Terminate a conditional, popping the value of - _rl_parsing_conditionalized_out from the stack. */ -static int -parser_endif (char* args) -{ - if (if_stack_depth) - _rl_parsing_conditionalized_out = if_stack[--if_stack_depth]; - else - _rl_init_file_error ("$endif without matching $if"); - return 0; -} - -static int -parser_include (char* args) -{ - const char *old_init_file; - char *e; - int old_line_number, old_include_level, r; - - if (_rl_parsing_conditionalized_out) - return (0); - - old_init_file = current_readline_init_file; - old_line_number = current_readline_init_lineno; - old_include_level = current_readline_init_include_level; - - e = strchr (args, '\n'); - if (e) - *e = '\0'; - r = _rl_read_init_file ((const char *)args, old_include_level + 1); - - current_readline_init_file = old_init_file; - current_readline_init_lineno = old_line_number; - current_readline_init_include_level = old_include_level; - - return r; -} - -/* Associate textual names with actual functions. */ -static struct { - const char *name; - _rl_parser_func_t *function; -} parser_directives [] = { - { "if", parser_if }, - { "endif", parser_endif }, - { "else", parser_else }, - { "include", parser_include }, - { (char *)0x0, (_rl_parser_func_t *)0x0 } -}; - -/* Handle a parser directive. STATEMENT is the line of the directive - without any leading `$'. */ -static int -handle_parser_directive (statement) - char *statement; -{ - register int i; - char *directive, *args; - - /* Isolate the actual directive. */ - - /* Skip whitespace. */ - for (i = 0; whitespace (statement[i]); i++); - - directive = &statement[i]; - - for (; statement[i] && !whitespace (statement[i]); i++); - - if (statement[i]) - statement[i++] = '\0'; - - for (; statement[i] && whitespace (statement[i]); i++); - - args = &statement[i]; - - /* Lookup the command, and act on it. */ - for (i = 0; parser_directives[i].name; i++) - if (_rl_stricmp (directive, parser_directives[i].name) == 0) - { - (*parser_directives[i].function) (args); - return (0); - } - - /* display an error message about the unknown parser directive */ - _rl_init_file_error ("unknown parser directive"); - return (1); -} - -/* Read the binding command from STRING and perform it. - A key binding command looks like: Keyname: function-name\0, - a variable binding command looks like: set variable value. - A new-style keybinding looks like "\C-x\C-x": exchange-point-and-mark. */ -int -rl_parse_and_bind (string) - char *string; -{ - char *funname, *kname; - register int c, i; - int key, equivalency; - - while (string && whitespace (*string)) - string++; - - if (!string || !*string || *string == '#') - return 0; - - /* If this is a parser directive, act on it. */ - if (*string == '$') - { - handle_parser_directive (&string[1]); - return 0; - } - - /* If we aren't supposed to be parsing right now, then we're done. */ - if (_rl_parsing_conditionalized_out) - return 0; - - i = 0; - /* If this keyname is a complex key expression surrounded by quotes, - advance to after the matching close quote. This code allows the - backslash to quote characters in the key expression. */ - if (*string == '"') - { - int passc = 0; - - for (i = 1; c = string[i]; i++) - { - if (passc) - { - passc = 0; - continue; - } - - if (c == '\\') - { - passc++; - continue; - } - - if (c == '"') - break; - } - /* If we didn't find a closing quote, abort the line. */ - if (string[i] == '\0') - { - _rl_init_file_error ("no closing `\"' in key binding"); - return 1; - } - } - - /* Advance to the colon (:) or whitespace which separates the two objects. */ - for (; (c = string[i]) && c != ':' && c != ' ' && c != '\t'; i++ ); - - equivalency = (c == ':' && string[i + 1] == '='); - - /* Mark the end of the command (or keyname). */ - if (string[i]) - string[i++] = '\0'; - - /* If doing assignment, skip the '=' sign as well. */ - if (equivalency) - string[i++] = '\0'; - - /* If this is a command to set a variable, then do that. */ - if (_rl_stricmp (string, "set") == 0) - { - char *var = string + i; - char *value; - - /* Make VAR point to start of variable name. */ - while (*var && whitespace (*var)) var++; - - /* Make VALUE point to start of value string. */ - value = var; - while (*value && !whitespace (*value)) value++; - if (*value) - *value++ = '\0'; - while (*value && whitespace (*value)) value++; - - rl_variable_bind (var, value); - return 0; - } - - /* Skip any whitespace between keyname and funname. */ - for (; string[i] && whitespace (string[i]); i++); - funname = &string[i]; - - /* Now isolate funname. - For straight function names just look for whitespace, since - that will signify the end of the string. But this could be a - macro definition. In that case, the string is quoted, so skip - to the matching delimiter. We allow the backslash to quote the - delimiter characters in the macro body. */ - /* This code exists to allow whitespace in macro expansions, which - would otherwise be gobbled up by the next `for' loop.*/ - /* XXX - it may be desirable to allow backslash quoting only if " is - the quoted string delimiter, like the shell. */ - if (*funname == '\'' || *funname == '"') - { - int delimiter = string[i++], passc; - - for (passc = 0; c = string[i]; i++) - { - if (passc) - { - passc = 0; - continue; - } - - if (c == '\\') - { - passc = 1; - continue; - } - - if (c == delimiter) - break; - } - if (c) - i++; - } - - /* Advance to the end of the string. */ - for (; string[i] && !whitespace (string[i]); i++); - - /* No extra whitespace at the end of the string. */ - string[i] = '\0'; - - /* Handle equivalency bindings here. Make the left-hand side be exactly - whatever the right-hand evaluates to, including keymaps. */ - if (equivalency) - { - return 0; - } - - /* If this is a new-style key-binding, then do the binding with - rl_bind_keyseq (). Otherwise, let the older code deal with it. */ - if (*string == '"') - { - char *seq; - register int j, k, passc; - - seq = (char *)xmalloc (1 + strlen (string)); - for (j = 1, k = passc = 0; string[j]; j++) - { - /* Allow backslash to quote characters, but leave them in place. - This allows a string to end with a backslash quoting another - backslash, or with a backslash quoting a double quote. The - backslashes are left in place for rl_translate_keyseq (). */ - if (passc || (string[j] == '\\')) - { - seq[k++] = string[j]; - passc = !passc; - continue; - } - - if (string[j] == '"') - break; - - seq[k++] = string[j]; - } - seq[k] = '\0'; - - /* Binding macro? */ - if (*funname == '\'' || *funname == '"') - { - j = (int)strlen (funname); - - /* Remove the delimiting quotes from each end of FUNNAME. */ - if (j && funname[j - 1] == *funname) - funname[j - 1] = '\0'; - - rl_macro_bind (seq, &funname[1], _rl_keymap); - } - else - rl_bind_keyseq (seq, rl_named_function (funname)); - - free (seq); - return 0; - } - - /* Get the actual character we want to deal with. */ - kname = strrchr (string, '-'); - if (!kname) - kname = string; - else - kname++; - - key = glean_key_from_name (kname); - - /* Add in control and meta bits. */ - if (substring_member_of_array (string, _rl_possible_control_prefixes)) - key = CTRL (_rl_to_upper (key)); - - if (substring_member_of_array (string, _rl_possible_meta_prefixes)) - key = META (key); - - /* Temporary. Handle old-style keyname with macro-binding. */ - if (*funname == '\'' || *funname == '"') - { - char useq[2]; - size_t fl = strlen (funname); - - useq[0] = key; useq[1] = '\0'; - if (fl && funname[fl - 1] == *funname) - funname[fl - 1] = '\0'; - - rl_macro_bind (useq, &funname[1], _rl_keymap); - } -#if defined (PREFIX_META_HACK) - /* Ugly, but working hack to keep prefix-meta around. */ - else if (_rl_stricmp (funname, "prefix-meta") == 0) - { - char seq[2]; - - seq[0] = key; - seq[1] = '\0'; - rl_generic_bind (ISKMAP, seq, (char *)emacs_meta_keymap, _rl_keymap); - } -#endif /* PREFIX_META_HACK */ - else - rl_bind_key (key, rl_named_function (funname)); - return 0; -} - -/* Simple structure for boolean readline variables (i.e., those that can - have one of two values; either "On" or 1 for truth, or "Off" or 0 for - false. */ - -#define V_SPECIAL 0x1 - -static struct { - const char *name; - int *value; - int flags; -} boolean_varlist [] = { - { "blink-matching-paren", &rl_blink_matching_paren, V_SPECIAL }, - { "byte-oriented", &rl_byte_oriented, 0 }, - { "completion-ignore-case", &_rl_completion_case_fold, 0 }, - { "convert-meta", &_rl_convert_meta_chars_to_ascii, 0 }, - { "disable-completion", &rl_inhibit_completion, 0 }, - { "enable-keypad", &_rl_enable_keypad, 0 }, - { "expand-tilde", &rl_complete_with_tilde_expansion, 0 }, - { "history-preserve-point", &_rl_history_preserve_point, 0 }, - { "horizontal-scroll-mode", &_rl_horizontal_scroll_mode, 0 }, - { "input-meta", &_rl_meta_flag, 0 }, - { "mark-directories", &_rl_complete_mark_directories, 0 }, - { "mark-modified-lines", &_rl_mark_modified_lines, 0 }, - { "mark-symlinked-directories", &_rl_complete_mark_symlink_dirs, 0 }, - { "match-hidden-files", &_rl_match_hidden_files, 0 }, - { "meta-flag", &_rl_meta_flag, 0 }, - { "output-meta", &_rl_output_meta_chars, 0 }, - { "page-completions", &_rl_page_completions, 0 }, - { "prefer-visible-bell", &_rl_prefer_visible_bell, V_SPECIAL }, - { "print-completions-horizontally", &_rl_print_completions_horizontally, 0 }, - { "show-all-if-ambiguous", &_rl_complete_show_all, 0 }, - { "show-all-if-unmodified", &_rl_complete_show_unmodified, 0 }, -#if defined (VISIBLE_STATS) - { "visible-stats", &rl_visible_stats, 0 }, -#endif /* VISIBLE_STATS */ - { (char *)NULL, (int *)NULL } -}; - -static int -find_boolean_var (name) - const char *name; -{ - register int i; - - for (i = 0; boolean_varlist[i].name; i++) - if (_rl_stricmp (name, boolean_varlist[i].name) == 0) - return i; - return -1; -} - -/* Hooks for handling special boolean variables, where a - function needs to be called or another variable needs - to be changed when they're changed. */ -static void -hack_special_boolean_var (i) - int i; -{ - const char *name; - - name = boolean_varlist[i].name; - - if (_rl_stricmp (name, "blink-matching-paren") == 0) - _rl_enable_paren_matching (rl_blink_matching_paren); - else if (_rl_stricmp (name, "prefer-visible-bell") == 0) - { - if (_rl_prefer_visible_bell) - _rl_bell_preference = VISIBLE_BELL; - else - _rl_bell_preference = AUDIBLE_BELL; - } -} - -typedef int _rl_sv_func_t PARAMS((const char *)); - -/* These *must* correspond to the array indices for the appropriate - string variable. (Though they're not used right now.) */ -#define V_BELLSTYLE 0 -#define V_COMBEGIN 1 -#define V_EDITMODE 2 -#define V_ISRCHTERM 3 -#define V_KEYMAP 4 - -#define V_STRING 1 -#define V_INT 2 - -/* Forward declarations */ -static int sv_bell_style PARAMS((const char *)); -static int sv_combegin PARAMS((const char *)); -static int sv_compquery PARAMS((const char *)); -static int sv_editmode PARAMS((const char *)); -static int sv_isrchterm PARAMS((const char *)); -static int sv_keymap PARAMS((const char *)); - -static struct { - const char *name; - int flags; - _rl_sv_func_t *set_func; -} string_varlist[] = { - { "bell-style", V_STRING, sv_bell_style }, - { "comment-begin", V_STRING, sv_combegin }, - { "completion-query-items", V_INT, sv_compquery }, - { "editing-mode", V_STRING, sv_editmode }, - { "isearch-terminators", V_STRING, sv_isrchterm }, - { "keymap", V_STRING, sv_keymap }, - { (char *)NULL, 0 } -}; - -static int -find_string_var (name) - const char *name; -{ - register int i; - - for (i = 0; string_varlist[i].name; i++) - if (_rl_stricmp (name, string_varlist[i].name) == 0) - return i; - return -1; -} - -/* A boolean value that can appear in a `set variable' command is true if - the value is null or empty, `on' (case-insenstive), or "1". Any other - values result in 0 (false). */ -static int -bool_to_int (value) - char *value; -{ - return (value == 0 || *value == '\0' || - (_rl_stricmp (value, "on") == 0) || - (value[0] == '1' && value[1] == '\0')); -} - -int -rl_variable_bind (name, value) - const char *name, *value; -{ - register int i; - int v; - - /* Check for simple variables first. */ - i = find_boolean_var (name); - if (i >= 0) - { - *boolean_varlist[i].value = bool_to_int (value); - if (boolean_varlist[i].flags & V_SPECIAL) - hack_special_boolean_var (i); - return 0; - } - - i = find_string_var (name); - - /* For the time being, unknown variable names or string names without a - handler function are simply ignored. */ - if (i < 0 || string_varlist[i].set_func == 0) - return 0; - - v = (*string_varlist[i].set_func) (value); - return v; -} - -static int -sv_editmode (value) - const char *value; -{ - if (_rl_strnicmp (value, "vi", 2) == 0) - { -#if defined (VI_MODE) - _rl_keymap = vi_insertion_keymap; - rl_editing_mode = vi_mode; -#endif /* VI_MODE */ - return 0; - } - else if (_rl_strnicmp (value, "emacs", 5) == 0) - { - _rl_keymap = emacs_standard_keymap; - rl_editing_mode = emacs_mode; - return 0; - } - return 1; -} - -static int -sv_combegin (value) - const char *value; -{ - if (value && *value) - { - FREE (_rl_comment_begin); - _rl_comment_begin = savestring (value); - return 0; - } - return 1; -} - -static int -sv_compquery (value) - const char *value; -{ - int nval = 100; - - if (value && *value) - { - nval = atoi (value); - if (nval < 0) - nval = 0; - } - rl_completion_query_items = nval; - return 0; -} - -static int -sv_keymap (value) - const char *value; -{ - Keymap kmap; - - kmap = rl_get_keymap_by_name (value); - if (kmap) - { - rl_set_keymap (kmap); - return 0; - } - return 1; -} - -static int -sv_bell_style (value) - const char *value; -{ - if (value == 0 || *value == '\0') - _rl_bell_preference = AUDIBLE_BELL; - else if (_rl_stricmp (value, "none") == 0 || _rl_stricmp (value, "off") == 0) - _rl_bell_preference = NO_BELL; - else if (_rl_stricmp (value, "audible") == 0 || _rl_stricmp (value, "on") == 0) - _rl_bell_preference = AUDIBLE_BELL; - else if (_rl_stricmp (value, "visible") == 0) - _rl_bell_preference = VISIBLE_BELL; - else - return 1; - return 0; -} - -static int -sv_isrchterm (value) - const char *value; -{ - int beg, end, delim; - char *v; - - if (value == 0) - return 1; - - /* Isolate the value and translate it into a character string. */ - v = savestring (value); - FREE (_rl_isearch_terminators); - if (v[0] == '"' || v[0] == '\'') - { - delim = v[0]; - for (beg = end = 1; v[end] && v[end] != delim; end++) - ; - } - else - { - for (beg = end = 0; whitespace (v[end]) == 0; end++) - ; - } - - v[end] = '\0'; - - /* The value starts at v + beg. Translate it into a character string. */ - _rl_isearch_terminators = (char *)xmalloc (2 * strlen (v) + 1); - rl_translate_keyseq (v + beg, _rl_isearch_terminators, &end); - _rl_isearch_terminators[end] = '\0'; - - free (v); - return 0; -} - -/* Return the character which matches NAME. - For example, `Space' returns ' '. */ - -typedef struct { - const char *name; - int value; -} assoc_list; - -static assoc_list name_key_alist[] = { - { "DEL", 0x7f }, - { "ESC", '\033' }, - { "Escape", '\033' }, - { "LFD", '\n' }, - { "Newline", '\n' }, - { "RET", '\r' }, - { "Return", '\r' }, - { "Rubout", 0x7f }, - { "SPC", ' ' }, - { "Space", ' ' }, - { "Tab", 0x09 }, - { (char *)0x0, 0 } -}; - -static int -glean_key_from_name (name) - char *name; -{ - register int i; - - for (i = 0; name_key_alist[i].name; i++) - if (_rl_stricmp (name, name_key_alist[i].name) == 0) - return (name_key_alist[i].value); - - return (*(unsigned char *)name); /* XXX was return (*name) */ -} - -/* Auxiliary functions to manage keymaps. */ -static struct { - const char *name; - Keymap map; -} keymap_names[] = { - { "emacs", emacs_standard_keymap }, - { "emacs-standard", emacs_standard_keymap }, - { "emacs-meta", emacs_meta_keymap }, - { "emacs-ctlx", emacs_ctlx_keymap }, -#if defined (VI_MODE) - { "vi", vi_movement_keymap }, - { "vi-move", vi_movement_keymap }, - { "vi-command", vi_movement_keymap }, - { "vi-insert", vi_insertion_keymap }, -#endif /* VI_MODE */ - { (char *)0x0, (Keymap)0x0 } -}; - -Keymap -rl_get_keymap_by_name (name) - const char *name; -{ - register int i; - - for (i = 0; keymap_names[i].name; i++) - if (_rl_stricmp (name, keymap_names[i].name) == 0) - return (keymap_names[i].map); - return ((Keymap) NULL); -} - -char * -rl_get_keymap_name (map) - Keymap map; -{ - register int i; - for (i = 0; keymap_names[i].name; i++) - if (map == keymap_names[i].map) - return ((char *)keymap_names[i].name); - return ((char *)NULL); -} - -void -rl_set_keymap (map) - Keymap map; -{ - if (map) - _rl_keymap = map; -} - -Keymap -rl_get_keymap () -{ - return (_rl_keymap); -} - -void -rl_set_keymap_from_edit_mode () -{ - if (rl_editing_mode == emacs_mode) - _rl_keymap = emacs_standard_keymap; -#if defined (VI_MODE) - else if (rl_editing_mode == vi_mode) - _rl_keymap = vi_insertion_keymap; -#endif /* VI_MODE */ -} - -char * -rl_get_keymap_name_from_edit_mode () -{ - if (rl_editing_mode == emacs_mode) - return "emacs"; -#if defined (VI_MODE) - else if (rl_editing_mode == vi_mode) - return "vi"; -#endif /* VI_MODE */ - else - return "none"; -} - -/* **************************************************************** */ -/* */ -/* Key Binding and Function Information */ -/* */ -/* **************************************************************** */ - -/* Each of the following functions produces information about the - state of keybindings and functions known to Readline. The info - is always printed to rl_outstream, and in such a way that it can - be read back in (i.e., passed to rl_parse_and_bind ()). */ - -/* Print the names of functions known to Readline. */ -void -rl_list_funmap_names () -{ - register int i; - const char **funmap_names; - - funmap_names = rl_funmap_names (); - - if (!funmap_names) - return; - - for (i = 0; funmap_names[i]; i++) - fprintf (rl_outstream, "%s\n", funmap_names[i]); - - free (funmap_names); -} - -static char * -_rl_get_keyname (key) - int key; -{ - char *keyname; - int i, c; - - keyname = (char *)xmalloc (8); - - c = key; - /* Since this is going to be used to write out keysequence-function - pairs for possible inclusion in an inputrc file, we don't want to - do any special meta processing on KEY. */ - -#if 1 - /* XXX - Experimental */ - /* We might want to do this, but the old version of the code did not. */ - - /* If this is an escape character, we don't want to do any more processing. - Just add the special ESC key sequence and return. */ - if (c == ESC) - { - keyname[0] = '\\'; - keyname[1] = 'e'; - keyname[2] = '\0'; - return keyname; - } -#endif - - /* RUBOUT is translated directly into \C-? */ - if (key == RUBOUT) - { - keyname[0] = '\\'; - keyname[1] = 'C'; - keyname[2] = '-'; - keyname[3] = '?'; - keyname[4] = '\0'; - return keyname; - } - - i = 0; - /* Now add special prefixes needed for control characters. This can - potentially change C. */ - if (CTRL_CHAR (c)) - { - keyname[i++] = '\\'; - keyname[i++] = 'C'; - keyname[i++] = '-'; - c = _rl_to_lower (UNCTRL (c)); - } - - /* XXX experimental code. Turn the characters that are not ASCII or - ISO Latin 1 (128 - 159) into octal escape sequences (\200 - \237). - This changes C. */ - if (c >= 128 && c <= 159) - { - keyname[i++] = '\\'; - keyname[i++] = '2'; - c -= 128; - keyname[i++] = (c / 8) + '0'; - c = (c % 8) + '0'; - } - - /* Now, if the character needs to be quoted with a backslash, do that. */ - if (c == '\\' || c == '"') - keyname[i++] = '\\'; - - /* Now add the key, terminate the string, and return it. */ - keyname[i++] = (char) c; - keyname[i] = '\0'; - - return keyname; -} - -/* Return a NULL terminated array of strings which represent the key - sequences that are used to invoke FUNCTION in MAP. */ -char ** -rl_invoking_keyseqs_in_map (function, map) - rl_command_func_t *function; - Keymap map; -{ - register int key; - char **result; - int result_index, result_size; - - result = (char **)NULL; - result_index = result_size = 0; - - for (key = 0; key < KEYMAP_SIZE; key++) - { - switch (map[key].type) - { - case ISMACR: - /* Macros match, if, and only if, the pointers are identical. - Thus, they are treated exactly like functions in here. */ - case ISFUNC: - /* If the function in the keymap is the one we are looking for, - then add the current KEY to the list of invoking keys. */ - if (map[key].function == function) - { - char *keyname; - - keyname = _rl_get_keyname (key); - - if (result_index + 2 > result_size) - { - result_size += 10; - result = (char **)xrealloc (result, result_size * sizeof (char *)); - } - - result[result_index++] = keyname; - result[result_index] = (char *)NULL; - } - break; - - case ISKMAP: - { - char **seqs; - register int i; - - /* Find the list of keyseqs in this map which have FUNCTION as - their target. Add the key sequences found to RESULT. */ - if (map[key].function) - seqs = - rl_invoking_keyseqs_in_map (function, FUNCTION_TO_KEYMAP (map, key)); - else - break; - - if (seqs == 0) - break; - - for (i = 0; seqs[i]; i++) - { - char *keyname = (char *)xmalloc (6 + strlen (seqs[i])); - - if (key == ESC) -#if 0 - sprintf (keyname, "\\e"); -#else - /* XXX - experimental */ - sprintf (keyname, "\\M-"); -#endif - else if (CTRL_CHAR (key)) - sprintf (keyname, "\\C-%c", _rl_to_lower (UNCTRL (key))); - else if (key == RUBOUT) - sprintf (keyname, "\\C-?"); - else if (key == '\\' || key == '"') - { - keyname[0] = '\\'; - keyname[1] = (char) key; - keyname[2] = '\0'; - } - else - { - keyname[0] = (char) key; - keyname[1] = '\0'; - } - - strcat (keyname, seqs[i]); - free (seqs[i]); - - if (result_index + 2 > result_size) - { - result_size += 10; - result = (char **)xrealloc (result, result_size * sizeof (char *)); - } - - result[result_index++] = keyname; - result[result_index] = (char *)NULL; - } - - free (seqs); - } - break; - } - } - return (result); -} - -/* Return a NULL terminated array of strings which represent the key - sequences that can be used to invoke FUNCTION using the current keymap. */ -char ** -rl_invoking_keyseqs (function) - rl_command_func_t *function; -{ - return (rl_invoking_keyseqs_in_map (function, _rl_keymap)); -} - -/* Print all of the functions and their bindings to rl_outstream. If - PRINT_READABLY is non-zero, then print the output in such a way - that it can be read back in. */ -void -rl_function_dumper (print_readably) - int print_readably; -{ - register int i; - const char **names; - const char *name; - - names = rl_funmap_names (); - - fprintf (rl_outstream, "\n"); - - for (i = 0; name = names[i]; i++) - { - rl_command_func_t *function; - char **invokers; - - function = rl_named_function (name); - invokers = rl_invoking_keyseqs_in_map (function, _rl_keymap); - - if (print_readably) - { - if (!invokers) - fprintf (rl_outstream, "# %s (not bound)\n", name); - else - { - register int j; - - for (j = 0; invokers[j]; j++) - { - fprintf (rl_outstream, "\"%s\": %s\n", - invokers[j], name); - free (invokers[j]); - } - - free (invokers); - } - } - else - { - if (!invokers) - fprintf (rl_outstream, "%s is not bound to any keys\n", - name); - else - { - register int j; - - fprintf (rl_outstream, "%s can be found on ", name); - - for (j = 0; invokers[j] && j < 5; j++) - { - fprintf (rl_outstream, "\"%s\"%s", invokers[j], - invokers[j + 1] ? ", " : ".\n"); - } - - if (j == 5 && invokers[j]) - fprintf (rl_outstream, "...\n"); - - for (j = 0; invokers[j]; j++) - free (invokers[j]); - - free (invokers); - } - } - } -} - -/* Print all of the current functions and their bindings to - rl_outstream. If an explicit argument is given, then print - the output in such a way that it can be read back in. */ -int -rl_dump_functions (count, key) - int count, key; -{ - if (rl_dispatching) - fprintf (rl_outstream, "\r\n"); - rl_function_dumper (rl_explicit_arg); - rl_on_new_line (); - return (0); -} - -static void -_rl_macro_dumper_internal (print_readably, map, prefix) - int print_readably; - Keymap map; - char *prefix; -{ - register int key; - char *keyname, *out; - size_t prefix_len; - - for (key = 0; key < KEYMAP_SIZE; key++) - { - switch (map[key].type) - { - case ISMACR: - keyname = _rl_get_keyname (key); - out = _rl_untranslate_macro_value ((char *)map[key].function); - - if (print_readably) - fprintf (rl_outstream, "\"%s%s\": \"%s\"\n", prefix ? prefix : "", - keyname, - out ? out : ""); - else - fprintf (rl_outstream, "%s%s outputs %s\n", prefix ? prefix : "", - keyname, - out ? out : ""); - free (keyname); - free (out); - break; - case ISFUNC: - break; - case ISKMAP: - prefix_len = prefix ? strlen (prefix) : 0; - if (key == ESC) - { - keyname = (char *)xmalloc (3 + prefix_len); - if (prefix) - strcpy (keyname, prefix); - keyname[prefix_len] = '\\'; - keyname[prefix_len + 1] = 'e'; - keyname[prefix_len + 2] = '\0'; - } - else - { - keyname = _rl_get_keyname (key); - if (prefix) - { - out = (char *)xmalloc (strlen (keyname) + prefix_len + 1); - strcpy (out, prefix); - strcpy (out + prefix_len, keyname); - free (keyname); - keyname = out; - } - } - - _rl_macro_dumper_internal (print_readably, FUNCTION_TO_KEYMAP (map, key), keyname); - free (keyname); - break; - } - } -} - -void -rl_macro_dumper (print_readably) - int print_readably; -{ - _rl_macro_dumper_internal (print_readably, _rl_keymap, (char *)NULL); -} - -int -rl_dump_macros (count, key) - int count, key; -{ - if (rl_dispatching) - fprintf (rl_outstream, "\r\n"); - rl_macro_dumper (rl_explicit_arg); - rl_on_new_line (); - return (0); -} - -void -rl_variable_dumper (print_readably) - int print_readably; -{ - int i; - const char *kname; - - for (i = 0; boolean_varlist[i].name; i++) - { - if (print_readably) - fprintf (rl_outstream, "set %s %s\n", boolean_varlist[i].name, - *boolean_varlist[i].value ? "on" : "off"); - else - fprintf (rl_outstream, "%s is set to `%s'\n", boolean_varlist[i].name, - *boolean_varlist[i].value ? "on" : "off"); - } - - /* bell-style */ - switch (_rl_bell_preference) - { - case NO_BELL: - kname = "none"; break; - case VISIBLE_BELL: - kname = "visible"; break; - case AUDIBLE_BELL: - default: - kname = "audible"; break; - } - if (print_readably) - fprintf (rl_outstream, "set bell-style %s\n", kname); - else - fprintf (rl_outstream, "bell-style is set to `%s'\n", kname); - - /* comment-begin */ - if (print_readably) - fprintf (rl_outstream, "set comment-begin %s\n", _rl_comment_begin ? _rl_comment_begin : RL_COMMENT_BEGIN_DEFAULT); - else - fprintf (rl_outstream, "comment-begin is set to `%s'\n", _rl_comment_begin ? _rl_comment_begin : RL_COMMENT_BEGIN_DEFAULT); - - /* completion-query-items */ - if (print_readably) - fprintf (rl_outstream, "set completion-query-items %d\n", rl_completion_query_items); - else - fprintf (rl_outstream, "completion-query-items is set to `%d'\n", rl_completion_query_items); - - /* editing-mode */ - if (print_readably) - fprintf (rl_outstream, "set editing-mode %s\n", (rl_editing_mode == emacs_mode) ? "emacs" : "vi"); - else - fprintf (rl_outstream, "editing-mode is set to `%s'\n", (rl_editing_mode == emacs_mode) ? "emacs" : "vi"); - - /* isearch-terminators */ - if (_rl_isearch_terminators) - { - char *disp; - - disp = _rl_untranslate_macro_value (_rl_isearch_terminators); - - if (print_readably) - fprintf (rl_outstream, "set isearch-terminators \"%s\"\n", disp); - else - fprintf (rl_outstream, "isearch-terminators is set to \"%s\"\n", disp); - - free (disp); - } - - /* keymap */ - kname = rl_get_keymap_name (_rl_keymap); - if (kname == 0) - kname = rl_get_keymap_name_from_edit_mode (); - if (print_readably) - fprintf (rl_outstream, "set keymap %s\n", kname ? kname : "none"); - else - fprintf (rl_outstream, "keymap is set to `%s'\n", kname ? kname : "none"); -} - -/* Print all of the current variables and their values to - rl_outstream. If an explicit argument is given, then print - the output in such a way that it can be read back in. */ -int -rl_dump_variables (count, key) - int count, key; -{ - if (rl_dispatching) - fprintf (rl_outstream, "\r\n"); - rl_variable_dumper (rl_explicit_arg); - rl_on_new_line (); - return (0); -} - -/* Return non-zero if any members of ARRAY are a substring in STRING. */ -static int -substring_member_of_array (string, array) - char *string; - const char **array; -{ - while (*array) - { - if (_rl_strindex (string, *array)) - return (1); - array++; - } - return (0); -} diff --git a/dep/src/readline/src/callback.c b/dep/src/readline/src/callback.c deleted file mode 100644 index 5b05ea5c5b7..00000000000 --- a/dep/src/readline/src/callback.c +++ /dev/null @@ -1,156 +0,0 @@ -/* callback.c -- functions to use readline as an X `callback' mechanism. */ - -/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ -#define READLINE_LIBRARY - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#include "rlconf.h" - -#if defined (READLINE_CALLBACKS) - -#include - -#ifdef HAVE_STDLIB_H -# include -#else -# include "ansi_stdlib.h" -#endif - -#include - -/* System-specific feature definitions and include files. */ -#include "rldefs.h" -#include "readline.h" -#include "rlprivate.h" - -/* **************************************************************** */ -/* */ -/* Callback Readline Functions */ -/* */ -/* **************************************************************** */ - -/* Allow using readline in situations where a program may have multiple - things to handle at once, and dispatches them via select(). Call - rl_callback_handler_install() with the prompt and a function to call - whenever a complete line of input is ready. The user must then - call rl_callback_read_char() every time some input is available, and - rl_callback_read_char() will call the user's function with the complete - text read in at each end of line. The terminal is kept prepped and - signals handled all the time, except during calls to the user's function. */ - -rl_vcpfunc_t *rl_linefunc; /* user callback function */ -static int in_handler; /* terminal_prepped and signals set? */ - -/* Make sure the terminal is set up, initialize readline, and prompt. */ -static void -_rl_callback_newline () -{ - rl_initialize (); - - if (in_handler == 0) - { - in_handler = 1; - - (*rl_prep_term_function) (_rl_meta_flag); - -#if defined (HANDLE_SIGNALS) - rl_set_signals (); -#endif - } - - readline_internal_setup (); -} - -/* Install a readline handler, set up the terminal, and issue the prompt. */ -void -rl_callback_handler_install (prompt, linefunc) - const char *prompt; - rl_vcpfunc_t *linefunc; -{ - rl_set_prompt (prompt); - rl_linefunc = linefunc; - _rl_callback_newline (); -} - -/* Read one character, and dispatch to the handler if it ends the line. */ -void -rl_callback_read_char () -{ - char *line; - int eof; - - if (rl_linefunc == NULL) - { - fprintf (stderr, "readline: readline_callback_read_char() called with no handler!\r\n"); - abort (); - } - - eof = readline_internal_char (); - - /* We loop in case some function has pushed input back with rl_execute_next. */ - for (;;) - { - if (rl_done) - { - line = readline_internal_teardown (eof); - - (*rl_deprep_term_function) (); -#if defined (HANDLE_SIGNALS) - rl_clear_signals (); -#endif - in_handler = 0; - (*rl_linefunc) (line); - - /* If the user did not clear out the line, do it for him. */ - if (rl_line_buffer[0]) - _rl_init_line_state (); - - /* Redisplay the prompt if readline_handler_{install,remove} - not called. */ - if (in_handler == 0 && rl_linefunc) - _rl_callback_newline (); - } - if (rl_pending_input || _rl_pushed_input_available ()) - eof = readline_internal_char (); - else - break; - } -} - -/* Remove the handler, and make sure the terminal is in its normal state. */ -void -rl_callback_handler_remove () -{ - rl_linefunc = NULL; - if (in_handler) - { - in_handler = 0; - (*rl_deprep_term_function) (); -#if defined (HANDLE_SIGNALS) - rl_clear_signals (); -#endif - } -} - -#endif diff --git a/dep/src/readline/src/compat.c b/dep/src/readline/src/compat.c deleted file mode 100644 index a66d210fd2e..00000000000 --- a/dep/src/readline/src/compat.c +++ /dev/null @@ -1,113 +0,0 @@ -/* compat.c -- backwards compatibility functions. */ - -/* Copyright (C) 2000 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ -#define READLINE_LIBRARY - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#include - -#include "rlstdc.h" -#include "rltypedefs.h" - -extern void rl_free_undo_list PARAMS((void)); -extern int rl_maybe_save_line PARAMS((void)); -extern int rl_maybe_unsave_line PARAMS((void)); -extern int rl_maybe_replace_line PARAMS((void)); - -extern int rl_crlf PARAMS((void)); -extern int rl_ding PARAMS((void)); -extern int rl_alphabetic PARAMS((int)); - -extern char **rl_completion_matches PARAMS((const char *, rl_compentry_func_t *)); -extern char *rl_username_completion_function PARAMS((const char *, int)); -extern char *rl_filename_completion_function PARAMS((const char *, int)); - -/* Provide backwards-compatible entry points for old function names. */ - -void -free_undo_list () -{ - rl_free_undo_list (); -} - -int -maybe_replace_line () -{ - return rl_maybe_replace_line (); -} - -int -maybe_save_line () -{ - return rl_maybe_save_line (); -} - -int -maybe_unsave_line () -{ - return rl_maybe_unsave_line (); -} - -int -ding () -{ - return rl_ding (); -} - -int -crlf () -{ - return rl_crlf (); -} - -int -alphabetic (c) - int c; -{ - return rl_alphabetic (c); -} - -char ** -completion_matches (s, f) - const char *s; - rl_compentry_func_t *f; -{ - return rl_completion_matches (s, f); -} - -char * -username_completion_function (s, i) - const char *s; - int i; -{ - return rl_username_completion_function (s, i); -} - -char * -filename_completion_function (s, i) - const char *s; - int i; -{ - return rl_filename_completion_function (s, i); -} diff --git a/dep/src/readline/src/complete.c b/dep/src/readline/src/complete.c deleted file mode 100644 index 4529539f5a5..00000000000 --- a/dep/src/readline/src/complete.c +++ /dev/null @@ -1,2255 +0,0 @@ -/* complete.c -- filename completion for readline. */ - -/* Copyright (C) 1987-2004 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ -#define READLINE_LIBRARY - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#include -#include -#if defined (HAVE_SYS_FILE_H) -# include -#endif - -#if defined (HAVE_UNISTD_H) -# include -#endif /* HAVE_UNISTD_H */ - -#if defined (HAVE_STDLIB_H) -# include -#else -# include "ansi_stdlib.h" -#endif /* HAVE_STDLIB_H */ - -#include - -#ifdef _WIN32 -# define WIN32_LEAN_AND_MEAN 1 -# include -# include -#endif - -#include -#if !defined (errno) -extern int errno; -#endif /* !errno */ - -#ifndef _WIN32 -#include -#endif - -#include "posixdir.h" -#include "posixstat.h" - -/* System-specific feature definitions and include files. */ -#include "rldefs.h" -#include "rlmbutil.h" - -/* Some standard library routines. */ -#include "readline.h" -#include "xmalloc.h" -#include "rlprivate.h" - -#if defined (__STDC__) || defined (_WIN32) -typedef int QSFUNC (const void *, const void *); -#else -typedef int QSFUNC (); -#endif - -#ifdef HAVE_LSTAT -# define LSTAT lstat -#else -# define LSTAT stat -#endif - -/* Unix version of a hidden file. Could be different on other systems. */ -#define HIDDEN_FILE(fname) ((fname)[0] == '.') - -/* Most systems don't declare getpwent in if _POSIX_SOURCE is - defined. */ -#if !defined (HAVE_GETPW_DECLS) || defined (_POSIX_SOURCE) -extern struct passwd *getpwent PARAMS((void)); -#endif /* !HAVE_GETPW_DECLS || _POSIX_SOURCE */ - -/* If non-zero, then this is the address of a function to call when - completing a word would normally display the list of possible matches. - This function is called instead of actually doing the display. - It takes three arguments: (char **matches, int num_matches, int max_length) - where MATCHES is the array of strings that matched, NUM_MATCHES is the - number of strings in that array, and MAX_LENGTH is the length of the - longest string in that array. */ -rl_compdisp_func_t *rl_completion_display_matches_hook = (rl_compdisp_func_t *)NULL; - -#if defined (VISIBLE_STATS) -# if !defined (X_OK) -# define X_OK 1 -# endif -static int stat_char PARAMS((char *)); -#endif - -static int path_isdir PARAMS((const char *)); - -static char *rl_quote_filename PARAMS((char *, int, char *)); - -static void set_completion_defaults PARAMS((int)); -static int get_y_or_n PARAMS((int)); -static int _rl_internal_pager PARAMS((int)); -static char *printable_part PARAMS((char *)); -static int fnwidth PARAMS((const char *)); -static int fnprint PARAMS((const char *)); -static int print_filename PARAMS((char *, char *)); - -static char **gen_completion_matches PARAMS((char *, int, int, rl_compentry_func_t *, int, int)); - -static char **remove_duplicate_matches PARAMS((char **)); -static void insert_match PARAMS((char *, int, int, char *)); -static int append_to_match PARAMS((char *, int, int, int)); -static void insert_all_matches PARAMS((char **, int, char *)); -static void display_matches PARAMS((char **)); -static int compute_lcd_of_matches PARAMS((char **, int, const char *)); -static int postprocess_matches PARAMS((char ***, int)); - -static char *make_quoted_replacement PARAMS((char *, int, char *)); - -/* **************************************************************** */ -/* */ -/* Completion matching, from readline's point of view. */ -/* */ -/* **************************************************************** */ - -/* Variables known only to the readline library. */ - -/* If non-zero, non-unique completions always show the list of matches. */ -int _rl_complete_show_all = 0; - -/* If non-zero, non-unique completions show the list of matches, unless it - is not possible to do partial completion and modify the line. */ -int _rl_complete_show_unmodified = 0; - -/* If non-zero, completed directory names have a slash appended. */ -int _rl_complete_mark_directories = 1; - -/* If non-zero, the symlinked directory completion behavior introduced in - readline-4.2a is disabled, and symlinks that point to directories have - a slash appended (subject to the value of _rl_complete_mark_directories). - This is user-settable via the mark-symlinked-directories variable. */ -int _rl_complete_mark_symlink_dirs = 0; - -/* If non-zero, completions are printed horizontally in alphabetical order, - like `ls -x'. */ -int _rl_print_completions_horizontally; - -/* Non-zero means that case is not significant in filename completion. */ -#if defined (__MSDOS__) && !defined (__DJGPP__) -int _rl_completion_case_fold = 1; -#else -int _rl_completion_case_fold; -#endif - -/* If non-zero, don't match hidden files (filenames beginning with a `.' on - Unix) when doing filename completion. */ -int _rl_match_hidden_files = 1; - -/* Global variables available to applications using readline. */ - -#if defined (VISIBLE_STATS) -/* Non-zero means add an additional character to each filename displayed - during listing completion iff rl_filename_completion_desired which helps - to indicate the type of file being listed. */ -int rl_visible_stats = 0; -#endif /* VISIBLE_STATS */ - -/* If non-zero, then this is the address of a function to call when - completing on a directory name. The function is called with - the address of a string (the current directory name) as an arg. */ -rl_icppfunc_t *rl_directory_completion_hook = (rl_icppfunc_t *)NULL; - -rl_icppfunc_t *rl_directory_rewrite_hook = (rl_icppfunc_t *)NULL; - -/* Non-zero means readline completion functions perform tilde expansion. */ -int rl_complete_with_tilde_expansion = 0; - -/* Pointer to the generator function for completion_matches (). - NULL means to use rl_filename_completion_function (), the default filename - completer. */ -rl_compentry_func_t *rl_completion_entry_function = (rl_compentry_func_t *)NULL; - -/* Pointer to alternative function to create matches. - Function is called with TEXT, START, and END. - START and END are indices in RL_LINE_BUFFER saying what the boundaries - of TEXT are. - If this function exists and returns NULL then call the value of - rl_completion_entry_function to try to match, otherwise use the - array of strings returned. */ -rl_completion_func_t *rl_attempted_completion_function = (rl_completion_func_t *)NULL; - -/* Non-zero means to suppress normal filename completion after the - user-specified completion function has been called. */ -int rl_attempted_completion_over = 0; - -/* Set to a character indicating the type of completion being performed - by rl_complete_internal, available for use by application completion - functions. */ -int rl_completion_type = 0; - -/* Up to this many items will be displayed in response to a - possible-completions call. After that, we ask the user if - she is sure she wants to see them all. */ -int rl_completion_query_items = 100; - -int _rl_page_completions = 1; - -/* The basic list of characters that signal a break between words for the - completer routine. The contents of this variable is what breaks words - in the shell, i.e. " \t\n\"\\'`@$><=" */ -const char *rl_basic_word_break_characters = " \t\n\"\\'`@$><=;|&{("; /* }) */ - -/* List of basic quoting characters. */ -const char *rl_basic_quote_characters = "\"'"; - -/* The list of characters that signal a break between words for - rl_complete_internal. The default list is the contents of - rl_basic_word_break_characters. */ -/*const*/ char *rl_completer_word_break_characters = (/*const*/ char *)NULL; - -/* Hook function to allow an application to set the completion word - break characters before readline breaks up the line. Allows - position-dependent word break characters. */ -rl_cpvfunc_t *rl_completion_word_break_hook = (rl_cpvfunc_t *)NULL; - -/* List of characters which can be used to quote a substring of the line. - Completion occurs on the entire substring, and within the substring - rl_completer_word_break_characters are treated as any other character, - unless they also appear within this list. */ -const char *rl_completer_quote_characters = (const char *)NULL; - -/* List of characters that should be quoted in filenames by the completer. */ -const char *rl_filename_quote_characters = (const char *)NULL; - -/* List of characters that are word break characters, but should be left - in TEXT when it is passed to the completion function. The shell uses - this to help determine what kind of completing to do. */ -const char *rl_special_prefixes = (const char *)NULL; - -/* If non-zero, then disallow duplicates in the matches. */ -int rl_ignore_completion_duplicates = 1; - -/* Non-zero means that the results of the matches are to be treated - as filenames. This is ALWAYS zero on entry, and can only be changed - within a completion entry finder function. */ -int rl_filename_completion_desired = 0; - -/* Non-zero means that the results of the matches are to be quoted using - double quotes (or an application-specific quoting mechanism) if the - filename contains any characters in rl_filename_quote_chars. This is - ALWAYS non-zero on entry, and can only be changed within a completion - entry finder function. */ -int rl_filename_quoting_desired = 1; - -/* This function, if defined, is called by the completer when real - filename completion is done, after all the matching names have been - generated. It is passed a (char**) known as matches in the code below. - It consists of a NULL-terminated array of pointers to potential - matching strings. The 1st element (matches[0]) is the maximal - substring that is common to all matches. This function can re-arrange - the list of matches as required, but all elements of the array must be - free()'d if they are deleted. The main intent of this function is - to implement FIGNORE a la SunOS csh. */ -rl_compignore_func_t *rl_ignore_some_completions_function = (rl_compignore_func_t *)NULL; - -/* Set to a function to quote a filename in an application-specific fashion. - Called with the text to quote, the type of match found (single or multiple) - and a pointer to the quoting character to be used, which the function can - reset if desired. */ -rl_quote_func_t *rl_filename_quoting_function = rl_quote_filename; - -/* Function to call to remove quoting characters from a filename. Called - before completion is attempted, so the embedded quotes do not interfere - with matching names in the file system. Readline doesn't do anything - with this; it's set only by applications. */ -rl_dequote_func_t *rl_filename_dequoting_function = (rl_dequote_func_t *)NULL; - -/* Function to call to decide whether or not a word break character is - quoted. If a character is quoted, it does not break words for the - completer. */ -rl_linebuf_func_t *rl_char_is_quoted_p = (rl_linebuf_func_t *)NULL; - -/* If non-zero, the completion functions don't append anything except a - possible closing quote. This is set to 0 by rl_complete_internal and - may be changed by an application-specific completion function. */ -int rl_completion_suppress_append = 0; - -/* Character appended to completed words when at the end of the line. The - default is a space. */ -int rl_completion_append_character = ' '; - -/* If non-zero, the completion functions don't append any closing quote. - This is set to 0 by rl_complete_internal and may be changed by an - application-specific completion function. */ -int rl_completion_suppress_quote = 0; - -/* Set to any quote character readline thinks it finds before any application - completion function is called. */ -int rl_completion_quote_character; - -/* Set to a non-zero value if readline found quoting anywhere in the word to - be completed; set before any application completion function is called. */ -int rl_completion_found_quote; - -/* If non-zero, a slash will be appended to completed filenames that are - symbolic links to directory names, subject to the value of the - mark-directories variable (which is user-settable). This exists so - that application completion functions can override the user's preference - (set via the mark-symlinked-directories variable) if appropriate. - It's set to the value of _rl_complete_mark_symlink_dirs in - rl_complete_internal before any application-specific completion - function is called, so without that function doing anything, the user's - preferences are honored. */ -int rl_completion_mark_symlink_dirs; - -/* If non-zero, inhibit completion (temporarily). */ -int rl_inhibit_completion; - -/* Variables local to this file. */ - -/* Local variable states what happened during the last completion attempt. */ -static int completion_changed_buffer; - -/*************************************/ -/* */ -/* Bindable completion functions */ -/* */ -/*************************************/ - -/* Complete the word at or before point. You have supplied the function - that does the initial simple matching selection algorithm (see - rl_completion_matches ()). The default is to do filename completion. */ -int -rl_complete (ignore, invoking_key) - int ignore, invoking_key; -{ - if (rl_inhibit_completion) - return (_rl_insert_char (ignore, invoking_key)); - else if (rl_last_func == rl_complete && !completion_changed_buffer) - return (rl_complete_internal ('?')); - else if (_rl_complete_show_all) - return (rl_complete_internal ('!')); - else if (_rl_complete_show_unmodified) - return (rl_complete_internal ('@')); - else - return (rl_complete_internal (TAB)); -} - -/* List the possible completions. See description of rl_complete (). */ -int -rl_possible_completions (ignore, invoking_key) - int ignore, invoking_key; -{ - return (rl_complete_internal ('?')); -} - -int -rl_insert_completions (ignore, invoking_key) - int ignore, invoking_key; -{ - return (rl_complete_internal ('*')); -} - -/* Return the correct value to pass to rl_complete_internal performing - the same tests as rl_complete. This allows consecutive calls to an - application's completion function to list possible completions and for - an application-specific completion function to honor the - show-all-if-ambiguous readline variable. */ -int -rl_completion_mode (cfunc) - rl_command_func_t *cfunc; -{ - if (rl_last_func == cfunc && !completion_changed_buffer) - return '?'; - else if (_rl_complete_show_all) - return '!'; - else if (_rl_complete_show_unmodified) - return '@'; - else - return TAB; -} - -/************************************/ -/* */ -/* Completion utility functions */ -/* */ -/************************************/ - -/* Set default values for readline word completion. These are the variables - that application completion functions can change or inspect. */ -static void -set_completion_defaults (what_to_do) - int what_to_do; -{ - /* Only the completion entry function can change these. */ - rl_filename_completion_desired = 0; - rl_filename_quoting_desired = 1; - rl_completion_type = what_to_do; - rl_completion_suppress_append = rl_completion_suppress_quote = 0; - - /* The completion entry function may optionally change this. */ - rl_completion_mark_symlink_dirs = _rl_complete_mark_symlink_dirs; -} - -/* The user must press "y" or "n". Non-zero return means "y" pressed. */ -static int -get_y_or_n (for_pager) - int for_pager; -{ - int c; - - for (;;) - { - RL_SETSTATE(RL_STATE_MOREINPUT); - c = rl_read_key (); - RL_UNSETSTATE(RL_STATE_MOREINPUT); - - if (c == 'y' || c == 'Y' || c == ' ') - return (1); - if (c == 'n' || c == 'N' || c == RUBOUT) - return (0); - if (c == ABORT_CHAR) - _rl_abort_internal (); - if (for_pager && (c == NEWLINE || c == RETURN)) - return (2); - if (for_pager && (c == 'q' || c == 'Q')) - return (0); - rl_ding (); - } -} - -static int -_rl_internal_pager (lines) - int lines; -{ - int i; - - fprintf (rl_outstream, "--More--"); - fflush (rl_outstream); - i = get_y_or_n (1); - _rl_erase_entire_line (); - if (i == 0) - return -1; - else if (i == 2) - return (lines - 1); - else - return 0; -} - -static int -path_isdir (filename) - const char *filename; -{ - struct stat finfo; - - return (stat (filename, &finfo) == 0 && S_ISDIR (finfo.st_mode)); -} - -#if defined (VISIBLE_STATS) -/* Return the character which best describes FILENAME. - `@' for symbolic links - `/' for directories - `*' for executables - `=' for sockets - `|' for FIFOs - `%' for character special devices - `#' for block special devices */ -static int -stat_char (filename) - char *filename; -{ - struct stat finfo; - int character, r; - -#if defined (HAVE_LSTAT) && defined (S_ISLNK) - r = lstat (filename, &finfo); -#else - r = stat (filename, &finfo); -#endif - - if (r == -1) - return (0); - - character = 0; - if (S_ISDIR (finfo.st_mode)) - character = '/'; -#if defined (S_ISCHR) - else if (S_ISCHR (finfo.st_mode)) - character = '%'; -#endif /* S_ISCHR */ -#if defined (S_ISBLK) - else if (S_ISBLK (finfo.st_mode)) - character = '#'; -#endif /* S_ISBLK */ -#if defined (S_ISLNK) - else if (S_ISLNK (finfo.st_mode)) - character = '@'; -#endif /* S_ISLNK */ -#if defined (S_ISSOCK) - else if (S_ISSOCK (finfo.st_mode)) - character = '='; -#endif /* S_ISSOCK */ -#if defined (S_ISFIFO) - else if (S_ISFIFO (finfo.st_mode)) - character = '|'; -#endif - else if (S_ISREG (finfo.st_mode)) - { - if (access (filename, X_OK) == 0) - character = '*'; - } - return (character); -} -#endif /* VISIBLE_STATS */ - -/* Return the portion of PATHNAME that should be output when listing - possible completions. If we are hacking filename completion, we - are only interested in the basename, the portion following the - final slash. Otherwise, we return what we were passed. Since - printing empty strings is not very informative, if we're doing - filename completion, and the basename is the empty string, we look - for the previous slash and return the portion following that. If - there's no previous slash, we just return what we were passed. */ -static char * -printable_part (pathname) - char *pathname; -{ - char *temp, *x; - - if (rl_filename_completion_desired == 0) /* don't need to do anything */ - return (pathname); - - temp = strrchr (pathname, '/'); -#if defined (__MSDOS__) - if (temp == 0 && ISALPHA ((unsigned char)pathname[0]) && pathname[1] == ':') - temp = pathname + 1; -#endif - - if (temp == 0 || *temp == '\0') - return (pathname); - /* If the basename is NULL, we might have a pathname like '/usr/src/'. - Look for a previous slash and, if one is found, return the portion - following that slash. If there's no previous slash, just return the - pathname we were passed. */ - else if (temp[1] == '\0') - { - for (x = temp - 1; x > pathname; x--) - if (*x == '/') - break; - return ((*x == '/') ? x + 1 : pathname); - } - else - return ++temp; -} - -/* Compute width of STRING when displayed on screen by print_filename */ -static int -fnwidth (string) - const char *string; -{ - int width, pos; -#if defined (HANDLE_MULTIBYTE) - mbstate_t ps; - int left, w; - size_t clen; - wchar_t wc; - - left = strlen (string) + 1; - memset (&ps, 0, sizeof (mbstate_t)); -#endif - - width = pos = 0; - while (string[pos]) - { - if (CTRL_CHAR (*string) || *string == RUBOUT) - { - width += 2; - pos++; - } - else - { -#if defined (HANDLE_MULTIBYTE) - clen = mbrtowc (&wc, string + pos, left - pos, &ps); - if (MB_INVALIDCH (clen)) - { - width++; - pos++; - memset (&ps, 0, sizeof (mbstate_t)); - } - else if (MB_NULLWCH (clen)) - break; - else - { - pos += clen; - w = wcwidth (wc); - width += (w >= 0) ? w : 1; - } -#else - width++; - pos++; -#endif - } - } - - return width; -} - -static int -fnprint (to_print) - const char *to_print; -{ - int printed_len; - const char *s; -#if defined (HANDLE_MULTIBYTE) - mbstate_t ps; - const char *end; - size_t tlen; - - end = to_print + strlen (to_print) + 1; - memset (&ps, 0, sizeof (mbstate_t)); -#endif - - printed_len = 0; - s = to_print; - while (*s) - { - if (CTRL_CHAR (*s)) - { - putc ('^', rl_outstream); - putc (UNCTRL (*s), rl_outstream); - printed_len += 2; - s++; -#if defined (HANDLE_MULTIBYTE) - memset (&ps, 0, sizeof (mbstate_t)); -#endif - } - else if (*s == RUBOUT) - { - putc ('^', rl_outstream); - putc ('?', rl_outstream); - printed_len += 2; - s++; -#if defined (HANDLE_MULTIBYTE) - memset (&ps, 0, sizeof (mbstate_t)); -#endif - } - else - { -#if defined (HANDLE_MULTIBYTE) - tlen = mbrlen (s, end - s, &ps); - if (MB_INVALIDCH (tlen)) - { - tlen = 1; - memset (&ps, 0, sizeof (mbstate_t)); - } - else if (MB_NULLWCH (tlen)) - break; - fwrite (s, 1, tlen, rl_outstream); - s += tlen; -#else - putc (*s, rl_outstream); - s++; -#endif - printed_len++; - } - } - - return printed_len; -} - -/* Output TO_PRINT to rl_outstream. If VISIBLE_STATS is defined and we - are using it, check for and output a single character for `special' - filenames. Return the number of characters we output. */ - -static int -print_filename (to_print, full_pathname) - char *to_print, *full_pathname; -{ - int printed_len, extension_char; - size_t slen, tlen; - char *s, c, *new_full_pathname; - - extension_char = 0; - printed_len = fnprint (to_print); - -#if defined (VISIBLE_STATS) - if (rl_filename_completion_desired && (rl_visible_stats || _rl_complete_mark_directories)) -#else - if (rl_filename_completion_desired && _rl_complete_mark_directories) -#endif - { - /* If to_print != full_pathname, to_print is the basename of the - path passed. In this case, we try to expand the directory - name before checking for the stat character. */ - if (to_print != full_pathname) - { - /* Terminate the directory name. */ - c = to_print[-1]; - to_print[-1] = '\0'; - - /* If setting the last slash in full_pathname to a NUL results in - full_pathname being the empty string, we are trying to complete - files in the root directory. If we pass a null string to the - bash directory completion hook, for example, it will expand it - to the current directory. We just want the `/'. */ - s = tilde_expand (full_pathname && *full_pathname ? full_pathname : "/"); - if (rl_directory_completion_hook) - (*rl_directory_completion_hook) (&s); - - slen = strlen (s); - tlen = strlen (to_print); - new_full_pathname = (char *)xmalloc (slen + tlen + 2); - strcpy (new_full_pathname, s); - new_full_pathname[slen] = '/'; - strcpy (new_full_pathname + slen + 1, to_print); - -#if defined (VISIBLE_STATS) - if (rl_visible_stats) - extension_char = stat_char (new_full_pathname); - else -#endif - if (path_isdir (new_full_pathname)) - extension_char = '/'; - - free (new_full_pathname); - to_print[-1] = c; - } - else - { - s = tilde_expand (full_pathname); -#if defined (VISIBLE_STATS) - if (rl_visible_stats) - extension_char = stat_char (s); - else -#endif - if (path_isdir (s)) - extension_char = '/'; - } - - free (s); - if (extension_char) - { - putc (extension_char, rl_outstream); - printed_len++; - } - } - - return printed_len; -} - -static char * -rl_quote_filename (s, rtype, qcp) - char *s; - int rtype; - char *qcp; -{ - char *r; - - r = (char *)xmalloc (strlen (s) + 2); - *r = *rl_completer_quote_characters; - strcpy (r + 1, s); - if (qcp) - *qcp = *rl_completer_quote_characters; - return r; -} - -/* Find the bounds of the current word for completion purposes, and leave - rl_point set to the end of the word. This function skips quoted - substrings (characters between matched pairs of characters in - rl_completer_quote_characters). First we try to find an unclosed - quoted substring on which to do matching. If one is not found, we use - the word break characters to find the boundaries of the current word. - We call an application-specific function to decide whether or not a - particular word break character is quoted; if that function returns a - non-zero result, the character does not break a word. This function - returns the opening quote character if we found an unclosed quoted - substring, '\0' otherwise. FP, if non-null, is set to a value saying - which (shell-like) quote characters we found (single quote, double - quote, or backslash) anywhere in the string. DP, if non-null, is set to - the value of the delimiter character that caused a word break. */ - -char -_rl_find_completion_word (fp, dp) - int *fp, *dp; -{ - int scan, end, found_quote, delimiter, pass_next, isbrk; - char quote_char, *brkchars; - - end = rl_point; - found_quote = delimiter = 0; - quote_char = '\0'; - - brkchars = 0; - if (rl_completion_word_break_hook) - brkchars = (*rl_completion_word_break_hook) (); - if (brkchars == 0) - brkchars = rl_completer_word_break_characters; - - if (rl_completer_quote_characters) - { - /* We have a list of characters which can be used in pairs to - quote substrings for the completer. Try to find the start - of an unclosed quoted substring. */ - /* FOUND_QUOTE is set so we know what kind of quotes we found. */ -#if defined (HANDLE_MULTIBYTE) - for (scan = pass_next = 0; scan < end; - scan = ((MB_CUR_MAX == 1 || rl_byte_oriented) - ? (scan + 1) - : _rl_find_next_mbchar (rl_line_buffer, scan, 1, MB_FIND_ANY))) -#else - for (scan = pass_next = 0; scan < end; scan++) -#endif - { - if (pass_next) - { - pass_next = 0; - continue; - } - - /* Shell-like semantics for single quotes -- don't allow backslash - to quote anything in single quotes, especially not the closing - quote. If you don't like this, take out the check on the value - of quote_char. */ - if (quote_char != '\'' && rl_line_buffer[scan] == '\\') - { - pass_next = 1; - found_quote |= RL_QF_BACKSLASH; - continue; - } - - if (quote_char != '\0') - { - /* Ignore everything until the matching close quote char. */ - if (rl_line_buffer[scan] == quote_char) - { - /* Found matching close. Abandon this substring. */ - quote_char = '\0'; - rl_point = end; - } - } - else if (strchr (rl_completer_quote_characters, rl_line_buffer[scan])) - { - /* Found start of a quoted substring. */ - quote_char = rl_line_buffer[scan]; - rl_point = scan + 1; - /* Shell-like quoting conventions. */ - if (quote_char == '\'') - found_quote |= RL_QF_SINGLE_QUOTE; - else if (quote_char == '"') - found_quote |= RL_QF_DOUBLE_QUOTE; - else - found_quote |= RL_QF_OTHER_QUOTE; - } - } - } - - if (rl_point == end && quote_char == '\0') - { - /* We didn't find an unclosed quoted substring upon which to do - completion, so use the word break characters to find the - substring on which to complete. */ -#if defined (HANDLE_MULTIBYTE) - while (rl_point = _rl_find_prev_mbchar (rl_line_buffer, rl_point, MB_FIND_ANY)) -#else - while (--rl_point) -#endif - { - scan = rl_line_buffer[rl_point]; - - if (strchr (brkchars, scan) == 0) - continue; - - /* Call the application-specific function to tell us whether - this word break character is quoted and should be skipped. */ - if (rl_char_is_quoted_p && found_quote && - (*rl_char_is_quoted_p) (rl_line_buffer, rl_point)) - continue; - - /* Convoluted code, but it avoids an n^2 algorithm with calls - to char_is_quoted. */ - break; - } - } - - /* If we are at an unquoted word break, then advance past it. */ - scan = rl_line_buffer[rl_point]; - - /* If there is an application-specific function to say whether or not - a character is quoted and we found a quote character, let that - function decide whether or not a character is a word break, even - if it is found in rl_completer_word_break_characters. Don't bother - if we're at the end of the line, though. */ - if (scan) - { - if (rl_char_is_quoted_p) - isbrk = (found_quote == 0 || - (*rl_char_is_quoted_p) (rl_line_buffer, rl_point) == 0) && - strchr (brkchars, scan) != 0; - else - isbrk = strchr (brkchars, scan) != 0; - - if (isbrk) - { - /* If the character that caused the word break was a quoting - character, then remember it as the delimiter. */ - if (rl_basic_quote_characters && - strchr (rl_basic_quote_characters, scan) && - (end - rl_point) > 1) - delimiter = scan; - - /* If the character isn't needed to determine something special - about what kind of completion to perform, then advance past it. */ - if (rl_special_prefixes == 0 || strchr (rl_special_prefixes, scan) == 0) - rl_point++; - } - } - - if (fp) - *fp = found_quote; - if (dp) - *dp = delimiter; - - return (quote_char); -} - -static char ** -gen_completion_matches (text, start, end, our_func, found_quote, quote_char) - char *text; - int start, end; - rl_compentry_func_t *our_func; - int found_quote, quote_char; -{ - char **matches, *temp; - - rl_completion_found_quote = found_quote; - rl_completion_quote_character = quote_char; - - /* If the user wants to TRY to complete, but then wants to give - up and use the default completion function, they set the - variable rl_attempted_completion_function. */ - if (rl_attempted_completion_function) - { - matches = (*rl_attempted_completion_function) (text, start, end); - - if (matches || rl_attempted_completion_over) - { - rl_attempted_completion_over = 0; - return (matches); - } - } - - /* Beware -- we're stripping the quotes here. Do this only if we know - we are doing filename completion and the application has defined a - filename dequoting function. */ - temp = (char *)NULL; - - if (found_quote && our_func == rl_filename_completion_function && - rl_filename_dequoting_function) - { - /* delete single and double quotes */ - temp = (*rl_filename_dequoting_function) (text, quote_char); - text = temp; /* not freeing text is not a memory leak */ - } - - matches = rl_completion_matches (text, our_func); - FREE (temp); - return matches; -} - -/* Filter out duplicates in MATCHES. This frees up the strings in - MATCHES. */ -static char ** -remove_duplicate_matches (matches) - char **matches; -{ - char *lowest_common; - int i, j, newlen; - char dead_slot; - char **temp_array; - - /* Sort the items. */ - for (i = 0; matches[i]; i++) - ; - - /* Sort the array without matches[0], since we need it to - stay in place no matter what. */ - if (i) - qsort (matches+1, i-1, sizeof (char *), (QSFUNC *)_rl_qsort_string_compare); - - /* Remember the lowest common denominator for it may be unique. */ - lowest_common = savestring (matches[0]); - - for (i = newlen = 0; matches[i + 1]; i++) - { - if (strcmp (matches[i], matches[i + 1]) == 0) - { - free (matches[i]); - matches[i] = (char *)&dead_slot; - } - else - newlen++; - } - - /* We have marked all the dead slots with (char *)&dead_slot. - Copy all the non-dead entries into a new array. */ - temp_array = (char **)xmalloc ((3 + newlen) * sizeof (char *)); - for (i = j = 1; matches[i]; i++) - { - if (matches[i] != (char *)&dead_slot) - temp_array[j++] = matches[i]; - } - temp_array[j] = (char *)NULL; - - if (matches[0] != (char *)&dead_slot) - free (matches[0]); - - /* Place the lowest common denominator back in [0]. */ - temp_array[0] = lowest_common; - - /* If there is one string left, and it is identical to the - lowest common denominator, then the LCD is the string to - insert. */ - if (j == 2 && strcmp (temp_array[0], temp_array[1]) == 0) - { - free (temp_array[1]); - temp_array[1] = (char *)NULL; - } - return (temp_array); -} - -/* Find the common prefix of the list of matches, and put it into - matches[0]. */ -static int -compute_lcd_of_matches (match_list, matches, text) - char **match_list; - int matches; - const char *text; -{ - register int i, c1, c2, si; - int low; /* Count of max-matched characters. */ - char *dtext; /* dequoted TEXT, if needed */ -#if defined (HANDLE_MULTIBYTE) - int v; - mbstate_t ps1, ps2; - wchar_t wc1, wc2; -#endif - - /* If only one match, just use that. Otherwise, compare each - member of the list with the next, finding out where they - stop matching. */ - if (matches == 1) - { - match_list[0] = match_list[1]; - match_list[1] = (char *)NULL; - return 1; - } - - for (i = 1, low = 100000; i < matches; i++) - { -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - { - memset (&ps1, 0, sizeof (mbstate_t)); - memset (&ps2, 0, sizeof (mbstate_t)); - } -#endif - if (_rl_completion_case_fold) - { - for (si = 0; - (c1 = _rl_to_lower(match_list[i][si])) && - (c2 = _rl_to_lower(match_list[i + 1][si])); - si++) -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - { - v = mbrtowc (&wc1, match_list[i]+si, strlen (match_list[i]+si), &ps1); - mbrtowc (&wc2, match_list[i+1]+si, strlen (match_list[i+1]+si), &ps2); - wc1 = towlower (wc1); - wc2 = towlower (wc2); - if (wc1 != wc2) - break; - else if (v > 1) - si += v - 1; - } - else -#endif - if (c1 != c2) - break; - } - else - { - for (si = 0; - (c1 = match_list[i][si]) && - (c2 = match_list[i + 1][si]); - si++) -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - { - mbstate_t ps_back = ps1; - if (!_rl_compare_chars (match_list[i], si, &ps1, match_list[i+1], si, &ps2)) - break; - else if ((v = _rl_get_char_len (&match_list[i][si], &ps_back)) > 1) - si += v - 1; - } - else -#endif - if (c1 != c2) - break; - } - - if (low > si) - low = si; - } - - /* If there were multiple matches, but none matched up to even the - first character, and the user typed something, use that as the - value of matches[0]. */ - if (low == 0 && text && *text) - { - match_list[0] = (char *)xmalloc (strlen (text) + 1); - strcpy (match_list[0], text); - } - else - { - match_list[0] = (char *)xmalloc (low + 1); - - /* XXX - this might need changes in the presence of multibyte chars */ - - /* If we are ignoring case, try to preserve the case of the string - the user typed in the face of multiple matches differing in case. */ - if (_rl_completion_case_fold) - { - /* We're making an assumption here: - IF we're completing filenames AND - the application has defined a filename dequoting function AND - we found a quote character AND - the application has requested filename quoting - THEN - we assume that TEXT was dequoted before checking against - the file system and needs to be dequoted here before we - check against the list of matches - FI */ - dtext = (char *)NULL; - if (rl_filename_completion_desired && - rl_filename_dequoting_function && - rl_completion_found_quote && - rl_filename_quoting_desired) - { - dtext = (*rl_filename_dequoting_function) ((char*)text, rl_completion_quote_character); - text = dtext; - } - - /* sort the list to get consistent answers. */ - qsort (match_list+1, matches, sizeof(char *), (QSFUNC *)_rl_qsort_string_compare); - - si = (int)strlen (text); - if (si <= low) - { - for (i = 1; i <= matches; i++) - if (strncmp (match_list[i], text, si) == 0) - { - strncpy (match_list[0], match_list[i], low); - break; - } - /* no casematch, use first entry */ - if (i > matches) - strncpy (match_list[0], match_list[1], low); - } - else - /* otherwise, just use the text the user typed. */ - strncpy (match_list[0], text, low); - - FREE (dtext); - } - else - strncpy (match_list[0], match_list[1], low); - - match_list[0][low] = '\0'; - } - - return matches; -} - -static int -postprocess_matches (matchesp, matching_filenames) - char ***matchesp; - int matching_filenames; -{ - char *t, **matches, **temp_matches; - int nmatch, i; - - matches = *matchesp; - - if (matches == 0) - return 0; - - /* It seems to me that in all the cases we handle we would like - to ignore duplicate possiblilities. Scan for the text to - insert being identical to the other completions. */ - if (rl_ignore_completion_duplicates) - { - temp_matches = remove_duplicate_matches (matches); - free (matches); - matches = temp_matches; - } - - /* If we are matching filenames, then here is our chance to - do clever processing by re-examining the list. Call the - ignore function with the array as a parameter. It can - munge the array, deleting matches as it desires. */ - if (rl_ignore_some_completions_function && matching_filenames) - { - for (nmatch = 1; matches[nmatch]; nmatch++) - ; - (void)(*rl_ignore_some_completions_function) (matches); - if (matches == 0 || matches[0] == 0) - { - FREE (matches); - *matchesp = (char **)0; - return 0; - } - else - { - /* If we removed some matches, recompute the common prefix. */ - for (i = 1; matches[i]; i++) - ; - if (i > 1 && i < nmatch) - { - t = matches[0]; - compute_lcd_of_matches (matches, i - 1, t); - FREE (t); - } - } - } - - *matchesp = matches; - return (1); -} - -/* A convenience function for displaying a list of strings in - columnar format on readline's output stream. MATCHES is the list - of strings, in argv format, LEN is the number of strings in MATCHES, - and MAX is the length of the longest string in MATCHES. */ -void -rl_display_match_list (matches, len, max) - char **matches; - int len, max; -{ - int count, limit, printed_len, lines; - int i, j, k, l; - char *temp; - - /* How many items of MAX length can we fit in the screen window? */ - max += 2; - limit = _rl_screenwidth / max; - if (limit != 1 && (limit * max == _rl_screenwidth)) - limit--; - - /* Avoid a possible floating exception. If max > _rl_screenwidth, - limit will be 0 and a divide-by-zero fault will result. */ - if (limit == 0) - limit = 1; - - /* How many iterations of the printing loop? */ - count = (len + (limit - 1)) / limit; - - /* Watch out for special case. If LEN is less than LIMIT, then - just do the inner printing loop. - 0 < len <= limit implies count = 1. */ - - /* Sort the items if they are not already sorted. */ - if (rl_ignore_completion_duplicates == 0) - qsort (matches + 1, len, sizeof (char *), (QSFUNC *)_rl_qsort_string_compare); - - rl_crlf (); - - lines = 0; - if (_rl_print_completions_horizontally == 0) - { - /* Print the sorted items, up-and-down alphabetically, like ls. */ - for (i = 1; i <= count; i++) - { - for (j = 0, l = i; j < limit; j++) - { - if (l > len || matches[l] == 0) - break; - else - { - temp = printable_part (matches[l]); - printed_len = print_filename (temp, matches[l]); - - if (j + 1 < limit) - for (k = 0; k < max - printed_len; k++) - putc (' ', rl_outstream); - } - l += count; - } - rl_crlf (); - lines++; - if (_rl_page_completions && lines >= (_rl_screenheight - 1) && i < count) - { - lines = _rl_internal_pager (lines); - if (lines < 0) - return; - } - } - } - else - { - /* Print the sorted items, across alphabetically, like ls -x. */ - for (i = 1; matches[i]; i++) - { - temp = printable_part (matches[i]); - printed_len = print_filename (temp, matches[i]); - /* Have we reached the end of this line? */ - if (matches[i+1]) - { - if (i && (limit > 1) && (i % limit) == 0) - { - rl_crlf (); - lines++; - if (_rl_page_completions && lines >= _rl_screenheight - 1) - { - lines = _rl_internal_pager (lines); - if (lines < 0) - return; - } - } - else - for (k = 0; k < max - printed_len; k++) - putc (' ', rl_outstream); - } - } - rl_crlf (); - } -} - -/* Display MATCHES, a list of matching filenames in argv format. This - handles the simple case -- a single match -- first. If there is more - than one match, we compute the number of strings in the list and the - length of the longest string, which will be needed by the display - function. If the application wants to handle displaying the list of - matches itself, it sets RL_COMPLETION_DISPLAY_MATCHES_HOOK to the - address of a function, and we just call it. If we're handling the - display ourselves, we just call rl_display_match_list. We also check - that the list of matches doesn't exceed the user-settable threshold, - and ask the user if he wants to see the list if there are more matches - than RL_COMPLETION_QUERY_ITEMS. */ -static void -display_matches (matches) - char **matches; -{ - int len, max, i; - char *temp; - - /* Move to the last visible line of a possibly-multiple-line command. */ - _rl_move_vert (_rl_vis_botlin); - - /* Handle simple case first. What if there is only one answer? */ - if (matches[1] == 0) - { - temp = printable_part (matches[0]); - rl_crlf (); - print_filename (temp, matches[0]); - rl_crlf (); - - rl_forced_update_display (); - rl_display_fixed = 1; - - return; - } - - /* There is more than one answer. Find out how many there are, - and find the maximum printed length of a single entry. */ - for (max = 0, i = 1; matches[i]; i++) - { - temp = printable_part (matches[i]); - len = fnwidth (temp); - - if (len > max) - max = len; - } - - len = i - 1; - - /* If the caller has defined a display hook, then call that now. */ - if (rl_completion_display_matches_hook) - { - (*rl_completion_display_matches_hook) (matches, len, max); - return; - } - - /* If there are many items, then ask the user if she really wants to - see them all. */ - if (len >= rl_completion_query_items) - { - rl_crlf (); - fprintf (rl_outstream, "Display all %d possibilities? (y or n)", len); - fflush (rl_outstream); - if (get_y_or_n (0) == 0) - { - rl_crlf (); - - rl_forced_update_display (); - rl_display_fixed = 1; - - return; - } - } - - rl_display_match_list (matches, len, max); - - rl_forced_update_display (); - rl_display_fixed = 1; -} - -static char * -make_quoted_replacement (match, mtype, qc) - char *match; - int mtype; - char *qc; /* Pointer to quoting character, if any */ -{ - int should_quote, do_replace; - char *replacement; - - /* If we are doing completion on quoted substrings, and any matches - contain any of the completer_word_break_characters, then auto- - matically prepend the substring with a quote character (just pick - the first one from the list of such) if it does not already begin - with a quote string. FIXME: Need to remove any such automatically - inserted quote character when it no longer is necessary, such as - if we change the string we are completing on and the new set of - matches don't require a quoted substring. */ - replacement = match; - - should_quote = match && rl_completer_quote_characters && - rl_filename_completion_desired && - rl_filename_quoting_desired; - - if (should_quote) - should_quote = should_quote && (!qc || !*qc || - (rl_completer_quote_characters && strchr (rl_completer_quote_characters, *qc))); - - if (should_quote) - { - /* If there is a single match, see if we need to quote it. - This also checks whether the common prefix of several - matches needs to be quoted. */ - should_quote = rl_filename_quote_characters - ? (_rl_strpbrk (match, rl_filename_quote_characters) != 0) - : 0; - - do_replace = should_quote ? mtype : NO_MATCH; - /* Quote the replacement, since we found an embedded - word break character in a potential match. */ - if (do_replace != NO_MATCH && rl_filename_quoting_function) - replacement = (*rl_filename_quoting_function) (match, do_replace, qc); - } - return (replacement); -} - -static void -insert_match (match, start, mtype, qc) - char *match; - int start, mtype; - char *qc; -{ - char *replacement; - char oqc; - - oqc = qc ? *qc : '\0'; - replacement = make_quoted_replacement (match, mtype, qc); - - /* Now insert the match. */ - if (replacement) - { - /* Don't double an opening quote character. */ - if (qc && *qc && start && rl_line_buffer[start - 1] == *qc && - replacement[0] == *qc) - start--; - /* If make_quoted_replacement changed the quoting character, remove - the opening quote and insert the (fully-quoted) replacement. */ - else if (qc && (*qc != oqc) && start && rl_line_buffer[start - 1] == oqc && - replacement[0] != oqc) - start--; - _rl_replace_text (replacement, start, rl_point - 1); - if (replacement != match) - free (replacement); - } -} - -/* Append any necessary closing quote and a separator character to the - just-inserted match. If the user has specified that directories - should be marked by a trailing `/', append one of those instead. The - default trailing character is a space. Returns the number of characters - appended. If NONTRIVIAL_MATCH is set, we test for a symlink (if the OS - has them) and don't add a suffix for a symlink to a directory. A - nontrivial match is one that actually adds to the word being completed. - The variable rl_completion_mark_symlink_dirs controls this behavior - (it's initially set to the what the user has chosen, indicated by the - value of _rl_complete_mark_symlink_dirs, but may be modified by an - application's completion function). */ -static int -append_to_match (text, delimiter, quote_char, nontrivial_match) - char *text; - int delimiter, quote_char, nontrivial_match; -{ - char temp_string[4], *filename; - int temp_string_index, s; - struct stat finfo; - - temp_string_index = 0; - if (quote_char && rl_point && rl_completion_suppress_quote == 0 && - rl_line_buffer[rl_point - 1] != quote_char) - temp_string[temp_string_index++] = quote_char; - - if (delimiter) - temp_string[temp_string_index++] = delimiter; - else if (rl_completion_suppress_append == 0 && rl_completion_append_character) - temp_string[temp_string_index++] = rl_completion_append_character; - - temp_string[temp_string_index++] = '\0'; - - if (rl_filename_completion_desired) - { - filename = tilde_expand (text); - s = (nontrivial_match && rl_completion_mark_symlink_dirs == 0) - ? LSTAT (filename, &finfo) - : stat (filename, &finfo); - if (s == 0 && S_ISDIR (finfo.st_mode)) - { - if (_rl_complete_mark_directories) - { - /* This is clumsy. Avoid putting in a double slash if point - is at the end of the line and the previous character is a - slash. */ - if (rl_point && rl_line_buffer[rl_point] == '\0' && rl_line_buffer[rl_point - 1] == '/') - ; - else if (rl_line_buffer[rl_point] != '/') - rl_insert_text ("/"); - } - } -#ifdef S_ISLNK - /* Don't add anything if the filename is a symlink and resolves to a - directory. */ - else if (s == 0 && S_ISLNK (finfo.st_mode) && - stat (filename, &finfo) == 0 && S_ISDIR (finfo.st_mode)) - ; -#endif - else - { - if (rl_point == rl_end && temp_string_index) - rl_insert_text (temp_string); - } - free (filename); - } - else - { - if (rl_point == rl_end && temp_string_index) - rl_insert_text (temp_string); - } - - return (temp_string_index); -} - -static void -insert_all_matches (matches, point, qc) - char **matches; - int point; - char *qc; -{ - int i; - char *rp; - - rl_begin_undo_group (); - /* remove any opening quote character; make_quoted_replacement will add - it back. */ - if (qc && *qc && point && rl_line_buffer[point - 1] == *qc) - point--; - rl_delete_text (point, rl_point); - rl_point = point; - - if (matches[1]) - { - for (i = 1; matches[i]; i++) - { - rp = make_quoted_replacement (matches[i], SINGLE_MATCH, qc); - rl_insert_text (rp); - rl_insert_text (" "); - if (rp != matches[i]) - free (rp); - } - } - else - { - rp = make_quoted_replacement (matches[0], SINGLE_MATCH, qc); - rl_insert_text (rp); - rl_insert_text (" "); - if (rp != matches[0]) - free (rp); - } - rl_end_undo_group (); -} - -void -_rl_free_match_list (matches) - char **matches; -{ - register int i; - - if (matches == 0) - return; - - for (i = 0; matches[i]; i++) - free (matches[i]); - free (matches); -} - -/* Complete the word at or before point. - WHAT_TO_DO says what to do with the completion. - `?' means list the possible completions. - TAB means do standard completion. - `*' means insert all of the possible completions. - `!' means to do standard completion, and list all possible completions if - there is more than one. - `@' means to do standard completion, and list all possible completions if - there is more than one and partial completion is not possible. */ -int -rl_complete_internal (what_to_do) - int what_to_do; -{ - char **matches; - rl_compentry_func_t *our_func; - int start, end, delimiter, found_quote, i, nontrivial_lcd; - char *text, *saved_line_buffer; - char quote_char; - - RL_SETSTATE(RL_STATE_COMPLETING); - - set_completion_defaults (what_to_do); - - saved_line_buffer = rl_line_buffer ? savestring (rl_line_buffer) : (char *)NULL; - our_func = rl_completion_entry_function - ? rl_completion_entry_function - : rl_filename_completion_function; - /* We now look backwards for the start of a filename/variable word. */ - end = rl_point; - found_quote = delimiter = 0; - quote_char = '\0'; - - if (rl_point) - /* This (possibly) changes rl_point. If it returns a non-zero char, - we know we have an open quote. */ - quote_char = _rl_find_completion_word (&found_quote, &delimiter); - - start = rl_point; - rl_point = end; - - text = rl_copy_text (start, end); - matches = gen_completion_matches (text, start, end, our_func, found_quote, quote_char); - /* nontrivial_lcd is set if the common prefix adds something to the word - being completed. */ - nontrivial_lcd = matches && strcmp (text, matches[0]) != 0; - free (text); - - if (matches == 0) - { - rl_ding (); - FREE (saved_line_buffer); - completion_changed_buffer = 0; - RL_UNSETSTATE(RL_STATE_COMPLETING); - return (0); - } - - /* If we are matching filenames, the attempted completion function will - have set rl_filename_completion_desired to a non-zero value. The basic - rl_filename_completion_function does this. */ - i = rl_filename_completion_desired; - - if (postprocess_matches (&matches, i) == 0) - { - rl_ding (); - FREE (saved_line_buffer); - completion_changed_buffer = 0; - RL_UNSETSTATE(RL_STATE_COMPLETING); - return (0); - } - - switch (what_to_do) - { - case TAB: - case '!': - case '@': - /* Insert the first match with proper quoting. */ - if (*matches[0]) - insert_match (matches[0], start, matches[1] ? MULT_MATCH : SINGLE_MATCH, "e_char); - - /* If there are more matches, ring the bell to indicate. - If we are in vi mode, Posix.2 says to not ring the bell. - If the `show-all-if-ambiguous' variable is set, display - all the matches immediately. Otherwise, if this was the - only match, and we are hacking files, check the file to - see if it was a directory. If so, and the `mark-directories' - variable is set, add a '/' to the name. If not, and we - are at the end of the line, then add a space. */ - if (matches[1]) - { - if (what_to_do == '!') - { - display_matches (matches); - break; - } - else if (what_to_do == '@') - { - if (nontrivial_lcd == 0) - display_matches (matches); - break; - } - else if (rl_editing_mode != vi_mode) - rl_ding (); /* There are other matches remaining. */ - } - else - append_to_match (matches[0], delimiter, quote_char, nontrivial_lcd); - - break; - - case '*': - insert_all_matches (matches, start, "e_char); - break; - - case '?': - display_matches (matches); - break; - - default: - fprintf (stderr, "\r\nreadline: bad value %d for what_to_do in rl_complete\n", what_to_do); - rl_ding (); - FREE (saved_line_buffer); - RL_UNSETSTATE(RL_STATE_COMPLETING); - return 1; - } - - _rl_free_match_list (matches); - - /* Check to see if the line has changed through all of this manipulation. */ - if (saved_line_buffer) - { - completion_changed_buffer = strcmp (rl_line_buffer, saved_line_buffer) != 0; - free (saved_line_buffer); - } - - RL_UNSETSTATE(RL_STATE_COMPLETING); - return 0; -} - -/***************************************************************/ -/* */ -/* Application-callable completion match generator functions */ -/* */ -/***************************************************************/ - -/* Return an array of (char *) which is a list of completions for TEXT. - If there are no completions, return a NULL pointer. - The first entry in the returned array is the substitution for TEXT. - The remaining entries are the possible completions. - The array is terminated with a NULL pointer. - - ENTRY_FUNCTION is a function of two args, and returns a (char *). - The first argument is TEXT. - The second is a state argument; it should be zero on the first call, and - non-zero on subsequent calls. It returns a NULL pointer to the caller - when there are no more matches. - */ -char ** -rl_completion_matches (text, entry_function) - const char *text; - rl_compentry_func_t *entry_function; -{ - /* Number of slots in match_list. */ - int match_list_size; - - /* The list of matches. */ - char **match_list; - - /* Number of matches actually found. */ - int matches; - - /* Temporary string binder. */ - char *string; - - matches = 0; - match_list_size = 10; - match_list = (char **)xmalloc ((match_list_size + 1) * sizeof (char *)); - match_list[1] = (char *)NULL; - - while (string = (*entry_function) (text, matches)) - { - if (matches + 1 == match_list_size) - match_list = (char **)xrealloc - (match_list, ((match_list_size += 10) + 1) * sizeof (char *)); - - match_list[++matches] = string; - match_list[matches + 1] = (char *)NULL; - } - - /* If there were any matches, then look through them finding out the - lowest common denominator. That then becomes match_list[0]. */ - if (matches) - compute_lcd_of_matches (match_list, matches, text); - else /* There were no matches. */ - { - free (match_list); - match_list = (char **)NULL; - } - return (match_list); -} - -/* A completion function for usernames. - TEXT contains a partial username preceded by a random - character (usually `~'). */ -char * -rl_username_completion_function (text, state) - const char *text; - int state; -{ -#if defined (__WIN32__) || defined (__OPENNT) - return (char *)NULL; -#else /* !__WIN32__ && !__OPENNT) */ - static char *username = (char *)NULL; -#ifndef _WIN32 - static struct passwd *entry; -#else - char user_name[128]; - unsigned user_len; -#endif - static size_t namelen; - static int first_char, first_char_loc; - char *value; - - if (state == 0) - { - FREE (username); - - first_char = *text; - first_char_loc = first_char == '~'; - - username = savestring (&text[first_char_loc]); - namelen = strlen (username); -#ifndef _WIN32 - setpwent (); -#endif - } - -#ifndef _WIN32 - while (entry = getpwent ()) - { - /* Null usernames should result in all users as possible completions. */ - if (namelen == 0 || (STREQN (username, entry->pw_name, namelen))) - break; - } - - if (entry == 0) - { - endpwent (); - return ((char *)NULL); - } - else - { - value = (char *)xmalloc (2 + strlen (entry->pw_name)); - - *value = *text; - - strcpy (value + first_char_loc, entry->pw_name); - - if (first_char == '~') - rl_filename_completion_desired = 1; - - return (value); - } -#else /* _WIN32 */ - if (GetUserName (user_name, &user_len)) - { - if (namelen == 0 || (!strnicmp (username, user_name, namelen))) - { - value = (char *)xmalloc (2 + strlen (user_name)); - *value = *text; - strcpy (value + first_char_loc, user_name); - if (first_char == '~') - rl_filename_completion_desired = 1; - return (value); - } - } - return ((char *)NULL); -#endif /* _WIN32 */ -#endif /* !__WIN32__ && !__OPENNT */ -} - -/* Okay, now we write the entry_function for filename completion. In the - general case. Note that completion in the shell is a little different - because of all the pathnames that must be followed when looking up the - completion for a command. */ -char * -rl_filename_completion_function (text, state) - const char *text; - int state; -{ -#ifdef _WIN32 - static WIN32_FIND_DATA entry; - static HANDLE directory = NULL; - static BOOL found = 0; - char tmp[MAX_PATH]; -# define DIR void -#else - struct dirent *entry; - static DIR *directory = (DIR *)NULL; -#endif - static char *filename = (char *)NULL; - static char *dirname = (char *)NULL; - static char *users_dirname = (char *)NULL; - static size_t filename_len; - char *temp; - size_t dirlen; - - /* If we don't have any state, then do some initialization. */ - if (state == 0) - { - /* If we were interrupted before closing the directory or reading - all of its contents, close it. */ - if (directory) - { - closedir (directory); - directory = (DIR *)NULL; - } - FREE (dirname); - FREE (filename); - FREE (users_dirname); - - filename = savestring (text); - if (*text == 0) - text = "."; - dirname = savestring (text); - - temp = strrchr (dirname, '/'); - -#if defined (__MSDOS__) - /* special hack for //X/... */ - if (dirname[0] == '/' && dirname[1] == '/' && ISALPHA ((unsigned char)dirname[2]) && dirname[3] == '/') - temp = strrchr (dirname + 3, '/'); -#endif - - if (temp) - { - strcpy (filename, ++temp); - *temp = '\0'; - } -#if defined (__MSDOS__) - /* searches from current directory on the drive */ - else if (ISALPHA ((unsigned char)dirname[0]) && dirname[1] == ':') - { - strcpy (filename, dirname + 2); - dirname[2] = '\0'; - } -#endif - else - { - dirname[0] = '.'; - dirname[1] = '\0'; - } - - /* We aren't done yet. We also support the "~user" syntax. */ - - /* Save the version of the directory that the user typed. */ - users_dirname = savestring (dirname); - - if (*dirname == '~') - { - temp = tilde_expand (dirname); - free (dirname); - dirname = temp; - } - - if (rl_directory_rewrite_hook) - (*rl_directory_rewrite_hook) (&dirname); - - if (rl_directory_completion_hook && (*rl_directory_completion_hook) (&dirname)) - { - free (users_dirname); - users_dirname = savestring (dirname); - } - -#ifdef _WIN32 - strcpy (tmp, dirname); - if (tmp[strlen (tmp) - 1] == '/') - strcat (tmp, "*"); - else - strcat (tmp, "/*"); - - directory = FindFirstFile (tmp, &entry); - found = 1; -#else - directory = opendir (dirname); -#endif - filename_len = strlen (filename); - - rl_filename_completion_desired = 1; - } - - /* At this point we should entertain the possibility of hacking wildcarded - filenames, like /usr/man/man/te. If the directory name - contains globbing characters, then build an array of directories, and - then map over that list while completing. */ - /* *** UNIMPLEMENTED *** */ - - /* Now that we have some state, we can read the directory. */ -#ifndef _WIN32 - entry = (struct dirent *)NULL; - while (directory && (entry = readdir (directory))) -#else - while (directory != INVALID_HANDLE_VALUE && directory && found) -#endif - { - /* Special case for no filename. If the user has disabled the - `match-hidden-files' variable, skip filenames beginning with `.'. - All other entries except "." and ".." match. */ - if (filename_len == 0) - { - if (_rl_match_hidden_files == 0 && HIDDEN_FILE (FILENAME (entry))) - continue; - - if (FILENAME (entry)[0] != '.' || - (FILENAME (entry)[1] && - (FILENAME (entry)[1] != '.' || FILENAME (entry)[2]))) - break; - } - else - { - /* Otherwise, if these match up to the length of filename, then - it is a match. */ - if (_rl_completion_case_fold) - { - if ((_rl_to_lower (FILENAME (entry)[0]) == _rl_to_lower (filename[0])) && - (((int)D_NAMLEN (entry)) >= filename_len) && - (_rl_strnicmp (filename, FILENAME (entry), filename_len) == 0)) - break; - } - else - { - if ((FILENAME (entry)[0] == filename[0]) && - (((int)D_NAMLEN (entry)) >= filename_len) && - (strncmp (filename, FILENAME (entry), filename_len) == 0)) - break; - } - } -#ifdef _WIN32 - found = FindNextFile (directory, &entry); -#endif - } - -#ifdef _WIN32 - if (!found) -#else - if (entry == 0) -#endif - { - if (directory) - { - closedir (directory); - directory = (DIR *)NULL; - } - if (dirname) - { - free (dirname); - dirname = (char *)NULL; - } - if (filename) - { - free (filename); - filename = (char *)NULL; - } - if (users_dirname) - { - free (users_dirname); - users_dirname = (char *)NULL; - } - - return (char *)NULL; - } - else - { - /* dirname && (strcmp (dirname, ".") != 0) */ - if (dirname && (dirname[0] != '.' || dirname[1])) - { - if (rl_complete_with_tilde_expansion && *users_dirname == '~') - { - dirlen = strlen (dirname); - temp = (char *)xmalloc (2 + dirlen + D_NAMLEN (entry)); - strcpy (temp, dirname); - /* Canonicalization cuts off any final slash present. We - may need to add it back. */ - if (dirname[dirlen - 1] != '/') - { - temp[dirlen++] = '/'; - temp[dirlen] = '\0'; - } - } - else - { - dirlen = strlen (users_dirname); - temp = (char *)xmalloc (2 + dirlen + D_NAMLEN (entry)); - strcpy (temp, users_dirname); - /* Make sure that temp has a trailing slash here. */ - if (users_dirname[dirlen - 1] != '/') - temp[dirlen++] = '/'; - } - - strcpy (temp + dirlen, FILENAME (entry)); - } - else - temp = savestring (FILENAME (entry)); - -#ifdef _WIN32 - found = FindNextFile (directory, &entry); -#endif - return (temp); - } -} - -/* An initial implementation of a menu completion function a la tcsh. The - first time (if the last readline command was not rl_menu_complete), we - generate the list of matches. This code is very similar to the code in - rl_complete_internal -- there should be a way to combine the two. Then, - for each item in the list of matches, we insert the match in an undoable - fashion, with the appropriate character appended (this happens on the - second and subsequent consecutive calls to rl_menu_complete). When we - hit the end of the match list, we restore the original unmatched text, - ring the bell, and reset the counter to zero. */ -int -rl_menu_complete (count, ignore) - int count, ignore; -{ - rl_compentry_func_t *our_func; - int matching_filenames, found_quote; - - static char *orig_text; - static char **matches = (char **)0; - static int match_list_index = 0; - static int match_list_size = 0; - static int orig_start, orig_end; - static char quote_char; - static int delimiter; - - /* The first time through, we generate the list of matches and set things - up to insert them. */ - if (rl_last_func != rl_menu_complete) - { - /* Clean up from previous call, if any. */ - FREE (orig_text); - if (matches) - _rl_free_match_list (matches); - - match_list_index = match_list_size = 0; - matches = (char **)NULL; - - /* Only the completion entry function can change these. */ - set_completion_defaults ('%'); - - our_func = rl_completion_entry_function - ? rl_completion_entry_function - : rl_filename_completion_function; - - /* We now look backwards for the start of a filename/variable word. */ - orig_end = rl_point; - found_quote = delimiter = 0; - quote_char = '\0'; - - if (rl_point) - /* This (possibly) changes rl_point. If it returns a non-zero char, - we know we have an open quote. */ - quote_char = _rl_find_completion_word (&found_quote, &delimiter); - - orig_start = rl_point; - rl_point = orig_end; - - orig_text = rl_copy_text (orig_start, orig_end); - matches = gen_completion_matches (orig_text, orig_start, orig_end, - our_func, found_quote, quote_char); - - /* If we are matching filenames, the attempted completion function will - have set rl_filename_completion_desired to a non-zero value. The basic - rl_filename_completion_function does this. */ - matching_filenames = rl_filename_completion_desired; - - if (matches == 0 || postprocess_matches (&matches, matching_filenames) == 0) - { - rl_ding (); - FREE (matches); - matches = (char **)0; - FREE (orig_text); - orig_text = (char *)0; - completion_changed_buffer = 0; - return (0); - } - - for (match_list_size = 0; matches[match_list_size]; match_list_size++) - ; - /* matches[0] is lcd if match_list_size > 1, but the circular buffer - code below should take care of it. */ - } - - /* Now we have the list of matches. Replace the text between - rl_line_buffer[orig_start] and rl_line_buffer[rl_point] with - matches[match_list_index], and add any necessary closing char. */ - - if (matches == 0 || match_list_size == 0) - { - rl_ding (); - FREE (matches); - matches = (char **)0; - completion_changed_buffer = 0; - return (0); - } - - match_list_index = (match_list_index + count) % match_list_size; - if (match_list_index < 0) - match_list_index += match_list_size; - - if (match_list_index == 0 && match_list_size > 1) - { - rl_ding (); - insert_match (orig_text, orig_start, MULT_MATCH, "e_char); - } - else - { - insert_match (matches[match_list_index], orig_start, SINGLE_MATCH, "e_char); - append_to_match (matches[match_list_index], delimiter, quote_char, - strcmp (orig_text, matches[match_list_index])); - } - - completion_changed_buffer = 1; - return (0); -} diff --git a/dep/src/readline/src/config.h.in b/dep/src/readline/src/config.h.in deleted file mode 100644 index 8b4f0d0330d..00000000000 --- a/dep/src/readline/src/config.h.in +++ /dev/null @@ -1,217 +0,0 @@ -/* config.h.in. Maintained by hand. */ - -/* Define NO_MULTIBYTE_SUPPORT to not compile in support for multibyte - characters, even if the OS supports them. */ -#undef NO_MULTIBYTE_SUPPORT - -/* Define if on MINIX. */ -#undef _MINIX - -/* Define as the return type of signal handlers (int or void). */ -#undef RETSIGTYPE - -#undef VOID_SIGHANDLER - -/* Characteristics of the compiler. */ -#undef const - -#undef size_t - -#undef ssize_t - -#undef PROTOTYPES - -#undef __CHAR_UNSIGNED__ - -/* Define if the `S_IS*' macros in do not work properly. */ -#undef STAT_MACROS_BROKEN - -/* Define if you have the isascii function. */ -#undef HAVE_ISASCII - -/* Define if you have the isxdigit function. */ -#undef HAVE_ISXDIGIT - -/* Define if you have the lstat function. */ -#undef HAVE_LSTAT - -/* Define if you have the mbrlen function. */ -#undef HAVE_MBRLEN - -/* Define if you have the mbrtowc function. */ -#undef HAVE_MBRTOWC - -/* Define if you have the mbsrtowcs function. */ -#undef HAVE_MBSRTOWCS - -/* Define if you have the memmove function. */ -#undef HAVE_MEMMOVE - -/* Define if you have the putenv function. */ -#undef HAVE_PUTENV - -/* Define if you have the select function. */ -#undef HAVE_SELECT - -/* Define if you have the setenv function. */ -#undef HAVE_SETENV - -/* Define if you have the setlocale function. */ -#undef HAVE_SETLOCALE - -/* Define if you have the strcasecmp function. */ -#undef HAVE_STRCASECMP - -/* Define if you have the strcoll function. */ -#undef HAVE_STRCOLL - -#undef STRCOLL_BROKEN - -/* Define if you have the strpbrk function. */ -#undef HAVE_STRPBRK - -/* Define if you have the tcgetattr function. */ -#undef HAVE_TCGETATTR - -/* Define if you have the vsnprintf function. */ -#undef HAVE_VSNPRINTF - -/* Define if you have the wctomb function. */ -#undef HAVE_WCTOMB - -/* Define if you have the wcwidth function. */ -#undef HAVE_WCWIDTH - -#undef STDC_HEADERS - -/* Define if you have the header file. */ -#undef HAVE_DIRENT_H - -/* Define if you have the header file. */ -#undef HAVE_LANGINFO_H - -/* Define if you have the header file. */ -#undef HAVE_LIMITS_H - -/* Define if you have the header file. */ -#undef HAVE_LOCALE_H - -/* Define if you have the header file. */ -#undef HAVE_MEMORY_H - -/* Define if you have the header file. */ -#undef HAVE_NDIR_H - -/* Define if you have the header file. */ -#undef HAVE_STDARG_H - -/* Define if you have the header file. */ -#undef HAVE_STDLIB_H - -/* Define if you have the header file. */ -#undef HAVE_STRING_H - -/* Define if you have the header file. */ -#undef HAVE_STRINGS_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_DIR_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_FILE_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_NDIR_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_PTE_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_PTEM_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_SELECT_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_STREAM_H - -/* Define if you have the header file. */ -#undef HAVE_TERMCAP_H - -/* Define if you have the header file. */ -#undef HAVE_TERMIO_H - -/* Define if you have the header file. */ -#undef HAVE_TERMIOS_H - -/* Define if you have the header file. */ -#undef HAVE_UNISTD_H - -/* Define if you have the header file. */ -#undef HAVE_VARARGS_H - -/* Define if you have the header file. */ -#undef HAVE_WCHAR_H - -/* Define if you have the header file. */ -#undef HAVE_WCTYPE_H - -#undef HAVE_MBSTATE_T - -/* Define if you have and nl_langinfo(CODESET). */ -#undef HAVE_LANGINFO_CODESET - -/* Definitions pulled in from aclocal.m4. */ -#undef VOID_SIGHANDLER - -#undef GWINSZ_IN_SYS_IOCTL - -#undef STRUCT_WINSIZE_IN_SYS_IOCTL - -#undef STRUCT_WINSIZE_IN_TERMIOS - -#undef TIOCSTAT_IN_SYS_IOCTL - -#undef FIONREAD_IN_SYS_IOCTL - -#undef SPEED_T_IN_SYS_TYPES - -#undef HAVE_GETPW_DECLS - -#undef STRUCT_DIRENT_HAS_D_INO - -#undef STRUCT_DIRENT_HAS_D_FILENO - -#undef HAVE_BSD_SIGNALS - -#undef HAVE_POSIX_SIGNALS - -#undef HAVE_USG_SIGHOLD - -#undef MUST_REINSTALL_SIGHANDLERS - -#undef HAVE_POSIX_SIGSETJMP - -#undef CTYPE_NON_ASCII - -/* modify settings or make new ones based on what autoconf tells us. */ - -/* Ultrix botches type-ahead when switching from canonical to - non-canonical mode, at least through version 4.3 */ -#if !defined (HAVE_TERMIOS_H) || !defined (HAVE_TCGETATTR) || defined (ultrix) -# define TERMIOS_MISSING -#endif - -#if defined (STRCOLL_BROKEN) -# undef HAVE_STRCOLL -#endif - -#if defined (__STDC__) && defined (HAVE_STDARG_H) -# define PREFER_STDARG -# define USE_VARARGS -#else -# if defined (HAVE_VARARGS_H) -# define PREFER_VARARGS -# define USE_VARARGS -# endif -#endif diff --git a/dep/src/readline/src/configure b/dep/src/readline/src/configure deleted file mode 100644 index 5eedea3b6ac..00000000000 --- a/dep/src/readline/src/configure +++ /dev/null @@ -1,8176 +0,0 @@ -#! /bin/sh -# From configure.in for Readline 5.0, version 2.52, from autoconf version AC_ACVERSION. -# Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.57 for readline 5.0-rc1. -# -# Report bugs to . -# -# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 -# Free Software Foundation, Inc. -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## - -# Be Bourne compatible -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' -elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then - set -o posix -fi - -# Support unset when possible. -if (FOO=FOO; unset FOO) >/dev/null 2>&1; then - as_unset=unset -else - as_unset=false -fi - - -# Work around bugs in pre-3.0 UWIN ksh. -$as_unset ENV MAIL MAILPATH -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -for as_var in \ - LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ - LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ - LC_TELEPHONE LC_TIME -do - if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then - eval $as_var=C; export $as_var - else - $as_unset $as_var - fi -done - -# Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1; then - as_expr=expr -else - as_expr=false -fi - -if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - - -# Name of the executable. -as_me=`$as_basename "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)$' \| \ - . : '\(.\)' 2>/dev/null || -echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } - /^X\/\(\/\/\)$/{ s//\1/; q; } - /^X\/\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - - -# PATH needs CR, and LINENO needs CR and PATH. -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conf$$.sh -fi - - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" || { - # Find who we are. Look in the path if we contain no path at all - # relative or not. - case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done - - ;; - esac - # We did not find ourselves, most probably we were run as `sh COMMAND' - # in which case we are not to be found in the path. - if test "x$as_myself" = x; then - as_myself=$0 - fi - if test ! -f "$as_myself"; then - { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 - { (exit 1); exit 1; }; } - fi - case $CONFIG_SHELL in - '') - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for as_base in sh bash ksh sh5; do - case $as_dir in - /*) - if ("$as_dir/$as_base" -c ' - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then - $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } - $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } - CONFIG_SHELL=$as_dir/$as_base - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$0" ${1+"$@"} - fi;; - esac - done -done -;; - esac - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line before each line; the second 'sed' does the real - # work. The second script uses 'N' to pair each line-number line - # with the numbered line, and appends trailing '-' during - # substitution so that $LINENO is not a special case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) - sed '=' <$as_myself | - sed ' - N - s,$,-, - : loop - s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, - t loop - s,-$,, - s,^['$as_cr_digits']*\n,, - ' >$as_me.lineno && - chmod +x $as_me.lineno || - { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 - { (exit 1); exit 1; }; } - - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensible to this). - . ./$as_me.lineno - # Exit status is that of the last command. - exit -} - - -case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in - *c*,-n*) ECHO_N= ECHO_C=' -' ECHO_T=' ' ;; - *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; - *) ECHO_N= ECHO_C='\c' ECHO_T= ;; -esac - -if expr a : '\(a\)' >/dev/null 2>&1; then - as_expr=expr -else - as_expr=false -fi - -rm -f conf$$ conf$$.exe conf$$.file -echo >conf$$.file -if ln -s conf$$.file conf$$ 2>/dev/null; then - # We could just check for DJGPP; but this test a) works b) is more generic - # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). - if test -f conf$$.exe; then - # Don't use ln at all; we don't have any links - as_ln_s='cp -p' - else - as_ln_s='ln -s' - fi -elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.file - -if mkdir -p . 2>/dev/null; then - as_mkdir_p=: -else - as_mkdir_p=false -fi - -as_executable_p="test -f" - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" - - -# IFS -# We need space, tab and new line, in precisely that order. -as_nl=' -' -IFS=" $as_nl" - -# CDPATH. -$as_unset CDPATH - - -# Name of the host. -# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, -# so uname gets run too. -ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` - -exec 6>&1 - -# -# Initializations. -# -ac_default_prefix=/usr/local -ac_config_libobj_dir=. -cross_compiling=no -subdirs= -MFLAGS= -MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} - -# Maximum number of lines to put in a shell here document. -# This variable seems obsolete. It should probably be removed, and -# only ac_max_sed_lines should be used. -: ${ac_max_here_lines=38} - -# Identity of this package. -PACKAGE_NAME='readline' -PACKAGE_TARNAME='readline' -PACKAGE_VERSION='5.0-rc1' -PACKAGE_STRING='readline 5.0-rc1' -PACKAGE_BUGREPORT='bug-readline@gnu.org' - -ac_unique_file="readline.h" -# Factoring default headers for most tests. -ac_includes_default="\ -#include -#if HAVE_SYS_TYPES_H -# include -#endif -#if HAVE_SYS_STAT_H -# include -#endif -#if STDC_HEADERS -# include -# include -#else -# if HAVE_STDLIB_H -# include -# endif -#endif -#if HAVE_STRING_H -# if !STDC_HEADERS && HAVE_MEMORY_H -# include -# endif -# include -#endif -#if HAVE_STRINGS_H -# include -#endif -#if HAVE_INTTYPES_H -# include -#else -# if HAVE_STDINT_H -# include -# endif -#endif -#if HAVE_UNISTD_H -# include -#endif" - -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os SET_MAKE CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA AR RANLIB ac_ct_RANLIB MAKE_SHELL SHOBJ_CC SHOBJ_CFLAGS SHOBJ_LD SHOBJ_LDFLAGS SHOBJ_XLDFLAGS SHOBJ_LIBS SHOBJ_STATUS SHLIB_STATUS SHLIB_XLDFLAGS SHLIB_LIBSUFF SHLIB_LIBVERSION SHLIB_LIBS SHLIB_MAJOR SHLIB_MINOR STATIC_TARGET SHARED_TARGET STATIC_INSTALL_TARGET SHARED_INSTALL_TARGET BUILD_DIR LOCAL_CFLAGS LOCAL_LDFLAGS LOCAL_DEFS ARFLAGS LIBVERSION TERMCAP_LIB LIBOBJS LTLIBOBJS' -ac_subst_files='' - -# Initialize some variables set by options. -ac_init_help= -ac_init_version=false -# The variables have the same names as the options, with -# dashes changed to underlines. -cache_file=/dev/null -exec_prefix=NONE -no_create= -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -verbose= -x_includes=NONE -x_libraries=NONE - -# Installation directory options. -# These are left unexpanded so users can "make install exec_prefix=/foo" -# and all the variables that are supposed to be based on exec_prefix -# by default will actually change. -# Use braces instead of parens because sh, perl, etc. also accept them. -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datadir='${prefix}/share' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' -includedir='${prefix}/include' -oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' - -ac_prev= -for ac_option -do - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval "$ac_prev=\$ac_option" - ac_prev= - continue - fi - - ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case $ac_option in - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir=$ac_optarg ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build_alias ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build_alias=$ac_optarg ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file=$ac_optarg ;; - - --config-cache | -C) - cache_file=config.cache ;; - - -datadir | --datadir | --datadi | --datad | --data | --dat | --da) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) - datadir=$ac_optarg ;; - - -disable-* | --disable-*) - ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid feature name: $ac_feature" >&2 - { (exit 1); exit 1; }; } - ac_feature=`echo $ac_feature | sed 's/-/_/g'` - eval "enable_$ac_feature=no" ;; - - -enable-* | --enable-*) - ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid feature name: $ac_feature" >&2 - { (exit 1); exit 1; }; } - ac_feature=`echo $ac_feature | sed 's/-/_/g'` - case $ac_option in - *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; - *) ac_optarg=yes ;; - esac - eval "enable_$ac_feature='$ac_optarg'" ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix=$ac_optarg ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he | -h) - ac_init_help=long ;; - -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) - ac_init_help=recursive ;; - -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) - ac_init_help=short ;; - - -host | --host | --hos | --ho) - ac_prev=host_alias ;; - -host=* | --host=* | --hos=* | --ho=*) - host_alias=$ac_optarg ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir=$ac_optarg ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir=$ac_optarg ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir=$ac_optarg ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir=$ac_optarg ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst \ - | --locals | --local | --loca | --loc | --lo) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) - localstatedir=$ac_optarg ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir=$ac_optarg ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c | -n) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir=$ac_optarg ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix=$ac_optarg ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix=$ac_optarg ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix=$ac_optarg ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name=$ac_optarg ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir=$ac_optarg ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir=$ac_optarg ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site=$ac_optarg ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir=$ac_optarg ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir=$ac_optarg ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target_alias ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target_alias=$ac_optarg ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers | -V) - ac_init_version=: ;; - - -with-* | --with-*) - ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid package name: $ac_package" >&2 - { (exit 1); exit 1; }; } - ac_package=`echo $ac_package| sed 's/-/_/g'` - case $ac_option in - *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; - *) ac_optarg=yes ;; - esac - eval "with_$ac_package='$ac_optarg'" ;; - - -without-* | --without-*) - ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid package name: $ac_package" >&2 - { (exit 1); exit 1; }; } - ac_package=`echo $ac_package | sed 's/-/_/g'` - eval "with_$ac_package=no" ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes=$ac_optarg ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries=$ac_optarg ;; - - -*) { echo "$as_me: error: unrecognized option: $ac_option -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; } - ;; - - *=*) - ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` - # Reject names that are not valid shell variable names. - expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 - { (exit 1); exit 1; }; } - ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` - eval "$ac_envvar='$ac_optarg'" - export $ac_envvar ;; - - *) - # FIXME: should be removed in autoconf 3.0. - echo "$as_me: WARNING: you should use --build, --host, --target" >&2 - expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} - ;; - - esac -done - -if test -n "$ac_prev"; then - ac_option=--`echo $ac_prev | sed 's/_/-/g'` - { echo "$as_me: error: missing argument to $ac_option" >&2 - { (exit 1); exit 1; }; } -fi - -# Be sure to have absolute paths. -for ac_var in exec_prefix prefix -do - eval ac_val=$`echo $ac_var` - case $ac_val in - [\\/$]* | ?:[\\/]* | NONE | '' ) ;; - *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; };; - esac -done - -# Be sure to have absolute paths. -for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ - localstatedir libdir includedir oldincludedir infodir mandir -do - eval ac_val=$`echo $ac_var` - case $ac_val in - [\\/$]* | ?:[\\/]* ) ;; - *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; };; - esac -done - -# There might be people who depend on the old broken behavior: `$host' -# used to hold the argument of --host etc. -# FIXME: To remove some day. -build=$build_alias -host=$host_alias -target=$target_alias - -# FIXME: To remove some day. -if test "x$host_alias" != x; then - if test "x$build_alias" = x; then - cross_compiling=maybe - echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. - If a cross compiler is detected then cross compile mode will be used." >&2 - elif test "x$build_alias" != "x$host_alias"; then - cross_compiling=yes - fi -fi - -ac_tool_prefix= -test -n "$host_alias" && ac_tool_prefix=$host_alias- - -test "$silent" = yes && exec 6>/dev/null - - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_confdir=`(dirname "$0") 2>/dev/null || -$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$0" : 'X\(//\)[^/]' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$0" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 - { (exit 1); exit 1; }; } - else - { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 - { (exit 1); exit 1; }; } - fi -fi -(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || - { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 - { (exit 1); exit 1; }; } -srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` -ac_env_build_alias_set=${build_alias+set} -ac_env_build_alias_value=$build_alias -ac_cv_env_build_alias_set=${build_alias+set} -ac_cv_env_build_alias_value=$build_alias -ac_env_host_alias_set=${host_alias+set} -ac_env_host_alias_value=$host_alias -ac_cv_env_host_alias_set=${host_alias+set} -ac_cv_env_host_alias_value=$host_alias -ac_env_target_alias_set=${target_alias+set} -ac_env_target_alias_value=$target_alias -ac_cv_env_target_alias_set=${target_alias+set} -ac_cv_env_target_alias_value=$target_alias -ac_env_CC_set=${CC+set} -ac_env_CC_value=$CC -ac_cv_env_CC_set=${CC+set} -ac_cv_env_CC_value=$CC -ac_env_CFLAGS_set=${CFLAGS+set} -ac_env_CFLAGS_value=$CFLAGS -ac_cv_env_CFLAGS_set=${CFLAGS+set} -ac_cv_env_CFLAGS_value=$CFLAGS -ac_env_LDFLAGS_set=${LDFLAGS+set} -ac_env_LDFLAGS_value=$LDFLAGS -ac_cv_env_LDFLAGS_set=${LDFLAGS+set} -ac_cv_env_LDFLAGS_value=$LDFLAGS -ac_env_CPPFLAGS_set=${CPPFLAGS+set} -ac_env_CPPFLAGS_value=$CPPFLAGS -ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} -ac_cv_env_CPPFLAGS_value=$CPPFLAGS -ac_env_CPP_set=${CPP+set} -ac_env_CPP_value=$CPP -ac_cv_env_CPP_set=${CPP+set} -ac_cv_env_CPP_value=$CPP - -# -# Report the --help message. -# -if test "$ac_init_help" = "long"; then - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat <<_ACEOF -\`configure' configures readline 5.0-rc1 to adapt to many kinds of systems. - -Usage: $0 [OPTION]... [VAR=VALUE]... - -To assign environment variables (e.g., CC, CFLAGS...), specify them as -VAR=VALUE. See below for descriptions of some of the useful variables. - -Defaults for the options are specified in brackets. - -Configuration: - -h, --help display this help and exit - --help=short display options specific to this package - --help=recursive display the short help of all the included packages - -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking...' messages - --cache-file=FILE cache test results in FILE [disabled] - -C, --config-cache alias for \`--cache-file=config.cache' - -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or \`..'] - -_ACEOF - - cat <<_ACEOF -Installation directories: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [PREFIX] - -By default, \`make install' will install all the files in -\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -an installation prefix other than \`$ac_default_prefix' using \`--prefix', -for instance \`--prefix=\$HOME'. - -For better control, use the options below. - -Fine tuning of the installation directories: - --bindir=DIR user executables [EPREFIX/bin] - --sbindir=DIR system admin executables [EPREFIX/sbin] - --libexecdir=DIR program executables [EPREFIX/libexec] - --datadir=DIR read-only architecture-independent data [PREFIX/share] - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] - --infodir=DIR info documentation [PREFIX/info] - --mandir=DIR man documentation [PREFIX/man] -_ACEOF - - cat <<\_ACEOF - -System types: - --build=BUILD configure for building on BUILD [guessed] - --host=HOST cross-compile to build programs to run on HOST [BUILD] -_ACEOF -fi - -if test -n "$ac_init_help"; then - case $ac_init_help in - short | recursive ) echo "Configuration of readline 5.0-rc1:";; - esac - cat <<\_ACEOF - -Optional Features: - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --enable-multibyte enable multibyte characters if OS supports them - --enable-shared build shared libraries [default=YES] - --enable-static build static libraries [default=YES] - -Optional Packages: - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-curses use the curses library instead of the termcap - library - -Some influential environment variables: - CC C compiler command - CFLAGS C compiler flags - LDFLAGS linker flags, e.g. -L if you have libraries in a - nonstandard directory - CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have - headers in a nonstandard directory - CPP C preprocessor - -Use these variables to override the choices made by `configure' or to help -it to find libraries and programs with nonstandard names/locations. - -Report bugs to . -_ACEOF -fi - -if test "$ac_init_help" = "recursive"; then - # If there are subdirs, report their specific --help. - ac_popdir=`pwd` - for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d $ac_dir || continue - ac_builddir=. - -if test "$ac_dir" != .; then - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi - -case $srcdir in - .) # No --srcdir option. We are building in place. - ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; -esac -# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be -# absolute. -ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` -ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` -ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` -ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` - - cd $ac_dir - # Check for guested configure; otherwise get Cygnus style configure. - if test -f $ac_srcdir/configure.gnu; then - echo - $SHELL $ac_srcdir/configure.gnu --help=recursive - elif test -f $ac_srcdir/configure; then - echo - $SHELL $ac_srcdir/configure --help=recursive - elif test -f $ac_srcdir/configure.ac || - test -f $ac_srcdir/configure.in; then - echo - $ac_configure --help - else - echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi - cd $ac_popdir - done -fi - -test -n "$ac_init_help" && exit 0 -if $ac_init_version; then - cat <<\_ACEOF -readline configure 5.0-rc1 -generated by GNU Autoconf 2.57 - -Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 -Free Software Foundation, Inc. -This configure script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it. -_ACEOF - exit 0 -fi -exec 5>config.log -cat >&5 <<_ACEOF -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. - -It was created by readline $as_me 5.0-rc1, which was -generated by GNU Autoconf 2.57. Invocation command line was - - $ $0 $@ - -_ACEOF -{ -cat <<_ASUNAME -## --------- ## -## Platform. ## -## --------- ## - -hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` - -/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -hostinfo = `(hostinfo) 2>/dev/null || echo unknown` -/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` -/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` - -_ASUNAME - -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - echo "PATH: $as_dir" -done - -} >&5 - -cat >&5 <<_ACEOF - - -## ----------- ## -## Core tests. ## -## ----------- ## - -_ACEOF - - -# Keep a trace of the command line. -# Strip out --no-create and --no-recursion so they do not pile up. -# Strip out --silent because we don't want to record it for future runs. -# Also quote any args containing shell meta-characters. -# Make two passes to allow for proper duplicate-argument suppression. -ac_configure_args= -ac_configure_args0= -ac_configure_args1= -ac_sep= -ac_must_keep_next=false -for ac_pass in 1 2 -do - for ac_arg - do - case $ac_arg in - -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - continue ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) - ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case $ac_pass in - 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; - 2) - ac_configure_args1="$ac_configure_args1 '$ac_arg'" - if test $ac_must_keep_next = true; then - ac_must_keep_next=false # Got value, back to normal. - else - case $ac_arg in - *=* | --config-cache | -C | -disable-* | --disable-* \ - | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ - | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ - | -with-* | --with-* | -without-* | --without-* | --x) - case "$ac_configure_args0 " in - "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; - esac - ;; - -* ) ac_must_keep_next=true ;; - esac - fi - ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" - # Get rid of the leading space. - ac_sep=" " - ;; - esac - done -done -$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } -$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } - -# When interrupted or exit'd, cleanup temporary files, and complete -# config.log. We remove comments because anyway the quotes in there -# would cause problems or look ugly. -# WARNING: Be sure not to use single quotes in there, as some shells, -# such as our DU 5.0 friend, will then `close' the trap. -trap 'exit_status=$? - # Save into config.log some information that might help in debugging. - { - echo - - cat <<\_ASBOX -## ---------------- ## -## Cache variables. ## -## ---------------- ## -_ASBOX - echo - # The following way of writing the cache mishandles newlines in values, -{ - (set) 2>&1 | - case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in - *ac_space=\ *) - sed -n \ - "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" - ;; - *) - sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" - ;; - esac; -} - echo - - cat <<\_ASBOX -## ----------------- ## -## Output variables. ## -## ----------------- ## -_ASBOX - echo - for ac_var in $ac_subst_vars - do - eval ac_val=$`echo $ac_var` - echo "$ac_var='"'"'$ac_val'"'"'" - done | sort - echo - - if test -n "$ac_subst_files"; then - cat <<\_ASBOX -## ------------- ## -## Output files. ## -## ------------- ## -_ASBOX - echo - for ac_var in $ac_subst_files - do - eval ac_val=$`echo $ac_var` - echo "$ac_var='"'"'$ac_val'"'"'" - done | sort - echo - fi - - if test -s confdefs.h; then - cat <<\_ASBOX -## ----------- ## -## confdefs.h. ## -## ----------- ## -_ASBOX - echo - sed "/^$/d" confdefs.h | sort - echo - fi - test "$ac_signal" != 0 && - echo "$as_me: caught signal $ac_signal" - echo "$as_me: exit $exit_status" - } >&5 - rm -f core core.* *.core && - rm -rf conftest* confdefs* conf$$* $ac_clean_files && - exit $exit_status - ' 0 -for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal -done -ac_signal=0 - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo >confdefs.h - -# Predefined preprocessor variables. - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF - - -# Let the site file select an alternate cache file if it wants to. -# Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi -fi -for ac_site_file in $CONFIG_SITE; do - if test -r "$ac_site_file"; then - { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 -echo "$as_me: loading site script $ac_site_file" >&6;} - sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special - # files actually), so we avoid doing that. - if test -f "$cache_file"; then - { echo "$as_me:$LINENO: loading cache $cache_file" >&5 -echo "$as_me: loading cache $cache_file" >&6;} - case $cache_file in - [\\/]* | ?:[\\/]* ) . $cache_file;; - *) . ./$cache_file;; - esac - fi -else - { echo "$as_me:$LINENO: creating cache $cache_file" >&5 -echo "$as_me: creating cache $cache_file" >&6;} - >$cache_file -fi - -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in `(set) 2>&1 | - sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val="\$ac_cv_env_${ac_var}_value" - eval ac_new_val="\$ac_env_${ac_var}_value" - case $ac_old_set,$ac_new_set in - set,) - { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 -echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 -echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 -echo "$as_me: former value: $ac_old_val" >&2;} - { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 -echo "$as_me: current value: $ac_new_val" >&2;} - ac_cache_corrupted=: - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) - ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 -echo "$as_me: error: changes in the environment can compromise the build" >&2;} - { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 -echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} - { (exit 1); exit 1; }; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -ac_aux_dir= -for ac_dir in ./support $srcdir/./support; do - if test -f $ac_dir/install-sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f $ac_dir/install.sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f $ac_dir/shtool; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in ./support $srcdir/./support" >&5 -echo "$as_me: error: cannot find install-sh or install.sh in ./support $srcdir/./support" >&2;} - { (exit 1); exit 1; }; } -fi -ac_config_guess="$SHELL $ac_aux_dir/config.guess" -ac_config_sub="$SHELL $ac_aux_dir/config.sub" -ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. - - ac_config_headers="$ac_config_headers config.h" - - -LIBVERSION=5.0 - -# Make sure we can run config.sub. -$ac_config_sub sun4 >/dev/null 2>&1 || - { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 -echo "$as_me: error: cannot run $ac_config_sub" >&2;} - { (exit 1); exit 1; }; } - -echo "$as_me:$LINENO: checking build system type" >&5 -echo $ECHO_N "checking build system type... $ECHO_C" >&6 -if test "${ac_cv_build+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_cv_build_alias=$build_alias -test -z "$ac_cv_build_alias" && - ac_cv_build_alias=`$ac_config_guess` -test -z "$ac_cv_build_alias" && - { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 -echo "$as_me: error: cannot guess build type; you must specify one" >&2;} - { (exit 1); exit 1; }; } -ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || - { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 -echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} - { (exit 1); exit 1; }; } - -fi -echo "$as_me:$LINENO: result: $ac_cv_build" >&5 -echo "${ECHO_T}$ac_cv_build" >&6 -build=$ac_cv_build -build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` - - -echo "$as_me:$LINENO: checking host system type" >&5 -echo $ECHO_N "checking host system type... $ECHO_C" >&6 -if test "${ac_cv_host+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_cv_host_alias=$host_alias -test -z "$ac_cv_host_alias" && - ac_cv_host_alias=$ac_cv_build_alias -ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || - { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 -echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} - { (exit 1); exit 1; }; } - -fi -echo "$as_me:$LINENO: result: $ac_cv_host" >&5 -echo "${ECHO_T}$ac_cv_host" >&6 -host=$ac_cv_host -host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` - - - -opt_curses=no - - -# Check whether --with-curses or --without-curses was given. -if test "${with_curses+set}" = set; then - withval="$with_curses" - opt_curses=$withval -fi; - -if test "$opt_curses" = "yes"; then - prefer_curses=yes -fi - -opt_multibyte=yes -opt_static_libs=yes -opt_shared_libs=yes - -# Check whether --enable-multibyte or --disable-multibyte was given. -if test "${enable_multibyte+set}" = set; then - enableval="$enable_multibyte" - opt_multibyte=$enableval -fi; -# Check whether --enable-shared or --disable-shared was given. -if test "${enable_shared+set}" = set; then - enableval="$enable_shared" - opt_shared_libs=$enableval -fi; -# Check whether --enable-static or --disable-static was given. -if test "${enable_static+set}" = set; then - enableval="$enable_static" - opt_static_libs=$enableval -fi; - -if test $opt_multibyte = no; then -cat >>confdefs.h <<\_ACEOF -#define NO_MULTIBYTE_SUPPORT 1 -_ACEOF - -fi - -echo "" -echo "Beginning configuration for readline-$LIBVERSION for ${host_cpu}-${host_vendor}-${host_os}" -echo "" - -# We want these before the checks, so the checks can modify their values. -test -z "$CFLAGS" && CFLAGS=-g auto_cflags=1 - -echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 -set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'` -if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.make <<\_ACEOF -all: - @echo 'ac_maketemp="$(MAKE)"' -_ACEOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. -eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` -if test -n "$ac_maketemp"; then - eval ac_cv_prog_make_${ac_make}_set=yes -else - eval ac_cv_prog_make_${ac_make}_set=no -fi -rm -f conftest.make -fi -if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - SET_MAKE= -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 - SET_MAKE="MAKE=${MAKE-make}" -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="gcc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - CC=$ac_ct_CC -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - CC=$ac_ct_CC -else - CC="$ac_cv_prog_CC" -fi - -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - test -n "$ac_ct_CC" && break -done - - CC=$ac_ct_CC -fi - -fi - - -test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&5 -echo "$as_me: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } - -# Provide some information about the compiler. -echo "$as_me:$LINENO:" \ - "checking for C compiler version" >&5 -ac_compiler=`set X $ac_compile; echo $2` -{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 - (eval $ac_compiler --version &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 - (eval $ac_compiler -v &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 - (eval $ac_compiler -V &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - -cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.exe b.out" -# Try to create an executable without -o first, disregard a.out. -# It will help us diagnose broken compilers, and finding out an intuition -# of exeext. -echo "$as_me:$LINENO: checking for C compiler default output" >&5 -echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6 -ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` -if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 - (eval $ac_link_default) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - # Find the output, starting from the most likely. This scheme is -# not robust to junk in `.', hence go to wildcards (a.*) only as a last -# resort. - -# Be careful to initialize this variable, since it used to be cached. -# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. -ac_cv_exeext= -# b.out is created by i960 compilers. -for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) - ;; - conftest.$ac_ext ) - # This is the source file. - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - # FIXME: I believe we export ac_cv_exeext for Libtool, - # but it would be cool to find out if it's true. Does anybody - # maintain Libtool? --akim. - export ac_cv_exeext - break;; - * ) - break;; - esac -done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { echo "$as_me:$LINENO: error: C compiler cannot create executables -See \`config.log' for more details." >&5 -echo "$as_me: error: C compiler cannot create executables -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } -fi - -ac_exeext=$ac_cv_exeext -echo "$as_me:$LINENO: result: $ac_file" >&5 -echo "${ECHO_T}$ac_file" >&6 - -# Check the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -echo "$as_me:$LINENO: checking whether the C compiler works" >&5 -echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 -# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 -# If not cross compiling, check that we can run a simple program. -if test "$cross_compiling" != yes; then - if { ac_try='./$ac_file' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { echo "$as_me:$LINENO: error: cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } - fi - fi -fi -echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - -rm -f a.out a.exe conftest$ac_cv_exeext b.out -ac_clean_files=$ac_clean_files_save -# Check the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 -echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 -echo "$as_me:$LINENO: result: $cross_compiling" >&5 -echo "${ECHO_T}$cross_compiling" >&6 - -echo "$as_me:$LINENO: checking for suffix of executables" >&5 -echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. -for ac_file in conftest.exe conftest conftest.*; do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - export ac_cv_exeext - break;; - * ) break;; - esac -done -else - { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi - -rm -f conftest$ac_cv_exeext -echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 -echo "${ECHO_T}$ac_cv_exeext" >&6 - -rm -f conftest.$ac_ext -EXEEXT=$ac_cv_exeext -ac_exeext=$EXEEXT -echo "$as_me:$LINENO: checking for suffix of object files" >&5 -echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 -if test "${ac_cv_objext+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.o conftest.obj -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac -done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi - -rm -f conftest.$ac_cv_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 -echo "${ECHO_T}$ac_cv_objext" >&6 -OBJEXT=$ac_cv_objext -ac_objext=$OBJEXT -echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 -echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 -if test "${ac_cv_c_compiler_gnu+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_compiler_gnu=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_compiler_gnu=no -fi -rm -f conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 -echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 -GCC=`test $ac_compiler_gnu = yes && echo yes` -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -CFLAGS="-g" -echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 -echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 -if test "${ac_cv_prog_cc_g+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_prog_cc_g=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_prog_cc_g=no -fi -rm -f conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 -echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 -echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 -if test "${ac_cv_prog_cc_stdc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_cv_prog_cc_stdc=no -ac_save_CC=$CC -cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#include -#include -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -# Don't try gcc -ansi; that turns off useful extensions and -# breaks some systems' header files. -# AIX -qlanglvl=ansi -# Ultrix and OSF/1 -std1 -# HP-UX 10.20 and later -Ae -# HP-UX older versions -Aa -D_HPUX_SOURCE -# SVR4 -Xc -D__EXTENSIONS__ -for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_prog_cc_stdc=$ac_arg -break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.$ac_objext -done -rm -f conftest.$ac_ext conftest.$ac_objext -CC=$ac_save_CC - -fi - -case "x$ac_cv_prog_cc_stdc" in - x|xno) - echo "$as_me:$LINENO: result: none needed" >&5 -echo "${ECHO_T}none needed" >&6 ;; - *) - echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 -echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 - CC="$CC $ac_cv_prog_cc_stdc" ;; -esac - -# Some people use a C++ compiler to compile C. Since we use `exit', -# in C++ we need to declare it. In case someone uses the same compiler -# for both compiling C and C++ we need to have the C++ compiler decide -# the declaration of exit, since it's the most demanding environment. -cat >conftest.$ac_ext <<_ACEOF -#ifndef __cplusplus - choke me -#endif -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - for ac_declaration in \ - ''\ - '#include ' \ - 'extern "C" void std::exit (int) throw (); using std::exit;' \ - 'extern "C" void std::exit (int); using std::exit;' \ - 'extern "C" void exit (int) throw ();' \ - 'extern "C" void exit (int);' \ - 'void exit (int);' -do - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -$ac_declaration -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -continue -fi -rm -f conftest.$ac_objext conftest.$ac_ext - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.$ac_objext conftest.$ac_ext -done -rm -f conftest* -if test -n "$ac_declaration"; then - echo '#ifdef __cplusplus' >>confdefs.h - echo $ac_declaration >>confdefs.h - echo '#endif' >>confdefs.h -fi - -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.$ac_objext conftest.$ac_ext -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 -echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if test "${ac_cv_prog_CPP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.$ac_ext - - # OK, works on sane cases. Now check whether non-existent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - # Broken: success on invalid input. -continue -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - break -fi - - done - ac_cv_prog_CPP=$CPP - -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -echo "$as_me:$LINENO: result: $CPP" >&5 -echo "${ECHO_T}$CPP" >&6 -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.$ac_ext - - # OK, works on sane cases. Now check whether non-existent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - # Broken: success on invalid input. -continue -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - : -else - { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&5 -echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -echo "$as_me:$LINENO: checking for egrep" >&5 -echo $ECHO_N "checking for egrep... $ECHO_C" >&6 -if test "${ac_cv_prog_egrep+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if echo a | (grep -E '(a|b)') >/dev/null 2>&1 - then ac_cv_prog_egrep='grep -E' - else ac_cv_prog_egrep='egrep' - fi -fi -echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 -echo "${ECHO_T}$ac_cv_prog_egrep" >&6 - EGREP=$ac_cv_prog_egrep - - -echo "$as_me:$LINENO: checking for ANSI C header files" >&5 -echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 -if test "${ac_cv_header_stdc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_header_stdc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_header_stdc=no -fi -rm -f conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then - : -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then - : -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then - : -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - exit(2); - exit (0); -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -ac_cv_header_stdc=no -fi -rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -fi -echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 -echo "${ECHO_T}$ac_cv_header_stdc" >&6 -if test $ac_cv_header_stdc = yes; then - -cat >>confdefs.h <<\_ACEOF -#define STDC_HEADERS 1 -_ACEOF - -fi - -# On IRIX 5.3, sys/types and inttypes.h are conflicting. - - - - - - - - - -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_Header=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_Header=no" -fi -rm -f conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -if test `eval echo '${'$as_ac_Header'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -if test "${ac_cv_header_minix_config_h+set}" = set; then - echo "$as_me:$LINENO: checking for minix/config.h" >&5 -echo $ECHO_N "checking for minix/config.h... $ECHO_C" >&6 -if test "${ac_cv_header_minix_config_h+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5 -echo "${ECHO_T}$ac_cv_header_minix_config_h" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking minix/config.h usability" >&5 -echo $ECHO_N "checking minix/config.h usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking minix/config.h presence" >&5 -echo $ECHO_N "checking minix/config.h presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc in - yes:no ) - { echo "$as_me:$LINENO: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: minix/config.h: proceeding with the preprocessor's result" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------ ## -## Report this to bug-autoconf@gnu.org. ## -## ------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; - no:yes ) - { echo "$as_me:$LINENO: WARNING: minix/config.h: present but cannot be compiled" >&5 -echo "$as_me: WARNING: minix/config.h: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: minix/config.h: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: minix/config.h: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: minix/config.h: proceeding with the preprocessor's result" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------ ## -## Report this to bug-autoconf@gnu.org. ## -## ------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for minix/config.h" >&5 -echo $ECHO_N "checking for minix/config.h... $ECHO_C" >&6 -if test "${ac_cv_header_minix_config_h+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_cv_header_minix_config_h=$ac_header_preproc -fi -echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5 -echo "${ECHO_T}$ac_cv_header_minix_config_h" >&6 - -fi -if test $ac_cv_header_minix_config_h = yes; then - MINIX=yes -else - MINIX= -fi - - -if test "$MINIX" = yes; then - -cat >>confdefs.h <<\_ACEOF -#define _POSIX_SOURCE 1 -_ACEOF - - -cat >>confdefs.h <<\_ACEOF -#define _POSIX_1_SOURCE 2 -_ACEOF - - -cat >>confdefs.h <<\_ACEOF -#define _MINIX 1 -_ACEOF - -fi - - -# If we're using gcc and the user hasn't specified CFLAGS, add -O to CFLAGS. -test -n "$GCC" && test -n "$auto_cflags" && CFLAGS="$CFLAGS -O" - -if test $ac_cv_c_compiler_gnu = yes; then - echo "$as_me:$LINENO: checking whether $CC needs -traditional" >&5 -echo $ECHO_N "checking whether $CC needs -traditional... $ECHO_C" >&6 -if test "${ac_cv_prog_gcc_traditional+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_pattern="Autoconf.*'x'" - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -Autoconf TIOCGETP -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "$ac_pattern" >/dev/null 2>&1; then - ac_cv_prog_gcc_traditional=yes -else - ac_cv_prog_gcc_traditional=no -fi -rm -f conftest* - - - if test $ac_cv_prog_gcc_traditional = no; then - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -Autoconf TCGETA -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "$ac_pattern" >/dev/null 2>&1; then - ac_cv_prog_gcc_traditional=yes -fi -rm -f conftest* - - fi -fi -echo "$as_me:$LINENO: result: $ac_cv_prog_gcc_traditional" >&5 -echo "${ECHO_T}$ac_cv_prog_gcc_traditional" >&6 - if test $ac_cv_prog_gcc_traditional = yes; then - CC="$CC -traditional" - fi -fi - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# ./install, which can be erroneously created by make from ./install.sh. -echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 -echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 -if test -z "$INSTALL"; then -if test "${ac_cv_path_install+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in - ./ | .// | /cC/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - done - done - ;; -esac -done - - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the path is relative. - INSTALL=$ac_install_sh - fi -fi -echo "$as_me:$LINENO: result: $INSTALL" >&5 -echo "${ECHO_T}$INSTALL" >&6 - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -# Extract the first word of "ar", so it can be a program name with args. -set dummy ar; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_AR+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$AR"; then - ac_cv_prog_AR="$AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AR="" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - - test -z "$ac_cv_prog_AR" && ac_cv_prog_AR="ar" -fi -fi -AR=$ac_cv_prog_AR -if test -n "$AR"; then - echo "$as_me:$LINENO: result: $AR" >&5 -echo "${ECHO_T}$AR" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -test -n "$ARFLAGS" || ARFLAGS="cr" -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_RANLIB+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - echo "$as_me:$LINENO: result: $RANLIB" >&5 -echo "${ECHO_T}$RANLIB" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - - test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" -fi -fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 -echo "${ECHO_T}$ac_ct_RANLIB" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - RANLIB=$ac_ct_RANLIB -else - RANLIB="$ac_cv_prog_RANLIB" -fi - - -MAKE_SHELL=/bin/sh - - -echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 -echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6 -if test "${ac_cv_c_const+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ -/* FIXME: Include the comments suggested by Paul. */ -#ifndef __cplusplus - /* Ultrix mips cc rejects this. */ - typedef int charset[2]; - const charset x; - /* SunOS 4.1.1 cc rejects this. */ - char const *const *ccp; - char **p; - /* NEC SVR4.0.2 mips cc rejects this. */ - struct point {int x, y;}; - static struct point const zero = {0,0}; - /* AIX XL C 1.02.0.0 rejects this. - It does not let you subtract one const X* pointer from another in - an arm of an if-expression whose if-part is not a constant - expression */ - const char *g = "string"; - ccp = &g + (g ? g-g : 0); - /* HPUX 7.0 cc rejects these. */ - ++ccp; - p = (char**) ccp; - ccp = (char const *const *) p; - { /* SCO 3.2v4 cc rejects this. */ - char *t; - char const *s = 0 ? (char *) 0 : (char const *) 0; - - *t++ = 0; - } - { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ - int x[] = {25, 17}; - const int *foo = &x[0]; - ++foo; - } - { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ - typedef const int *iptr; - iptr p = 0; - ++p; - } - { /* AIX XL C 1.02.0.0 rejects this saying - "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ - struct s { int j; const int *ap[3]; }; - struct s *b; b->j = 5; - } - { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ - const int foo = 10; - } -#endif - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_c_const=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_c_const=no -fi -rm -f conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 -echo "${ECHO_T}$ac_cv_c_const" >&6 -if test $ac_cv_c_const = no; then - -cat >>confdefs.h <<\_ACEOF -#define const -_ACEOF - -fi - -echo "$as_me:$LINENO: checking for function prototypes" >&5 -echo $ECHO_N "checking for function prototypes... $ECHO_C" >&6 -if test "$ac_cv_prog_cc_stdc" != no; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - -cat >>confdefs.h <<\_ACEOF -#define PROTOTYPES 1 -_ACEOF - - -cat >>confdefs.h <<\_ACEOF -#define __PROTOTYPES 1 -_ACEOF - -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - -echo "$as_me:$LINENO: checking whether char is unsigned" >&5 -echo $ECHO_N "checking whether char is unsigned... $ECHO_C" >&6 -if test "${ac_cv_c_char_unsigned+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((char) -1) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_c_char_unsigned=no -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_c_char_unsigned=yes -fi -rm -f conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_c_char_unsigned" >&5 -echo "${ECHO_T}$ac_cv_c_char_unsigned" >&6 -if test $ac_cv_c_char_unsigned = yes && test "$GCC" != yes; then - cat >>confdefs.h <<\_ACEOF -#define __CHAR_UNSIGNED__ 1 -_ACEOF - -fi - - -echo "$as_me:$LINENO: checking return type of signal handlers" >&5 -echo $ECHO_N "checking return type of signal handlers... $ECHO_C" >&6 -if test "${ac_cv_type_signal+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#ifdef signal -# undef signal -#endif -#ifdef __cplusplus -extern "C" void (*signal (int, void (*)(int)))(int); -#else -void (*signal ()) (); -#endif - -int -main () -{ -int i; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_signal=void -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_signal=int -fi -rm -f conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_signal" >&5 -echo "${ECHO_T}$ac_cv_type_signal" >&6 - -cat >>confdefs.h <<_ACEOF -#define RETSIGTYPE $ac_cv_type_signal -_ACEOF - - - -echo "$as_me:$LINENO: checking for size_t" >&5 -echo $ECHO_N "checking for size_t... $ECHO_C" >&6 -if test "${ac_cv_type_size_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((size_t *) 0) - return 0; -if (sizeof (size_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_size_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_size_t=no -fi -rm -f conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 -echo "${ECHO_T}$ac_cv_type_size_t" >&6 -if test $ac_cv_type_size_t = yes; then - : -else - -cat >>confdefs.h <<_ACEOF -#define size_t unsigned -_ACEOF - -fi - -echo "$as_me:$LINENO: checking for ssize_t" >&5 -echo $ECHO_N "checking for ssize_t... $ECHO_C" >&6 -if test "${ac_cv_type_ssize_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((ssize_t *) 0) - return 0; -if (sizeof (ssize_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_ssize_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_ssize_t=no -fi -rm -f conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_ssize_t" >&5 -echo "${ECHO_T}$ac_cv_type_ssize_t" >&6 -if test $ac_cv_type_ssize_t = yes; then - : -else - -cat >>confdefs.h <<_ACEOF -#define ssize_t int -_ACEOF - -fi - - -echo "$as_me:$LINENO: checking for ANSI C header files" >&5 -echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 -if test "${ac_cv_header_stdc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_header_stdc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_header_stdc=no -fi -rm -f conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then - : -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then - : -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then - : -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - exit(2); - exit (0); -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -ac_cv_header_stdc=no -fi -rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -fi -echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 -echo "${ECHO_T}$ac_cv_header_stdc" >&6 -if test $ac_cv_header_stdc = yes; then - -cat >>confdefs.h <<\_ACEOF -#define STDC_HEADERS 1 -_ACEOF - -fi - - -echo "$as_me:$LINENO: checking whether stat file-mode macros are broken" >&5 -echo $ECHO_N "checking whether stat file-mode macros are broken... $ECHO_C" >&6 -if test "${ac_cv_header_stat_broken+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include - -#if defined(S_ISBLK) && defined(S_IFDIR) -# if S_ISBLK (S_IFDIR) -You lose. -# endif -#endif - -#if defined(S_ISBLK) && defined(S_IFCHR) -# if S_ISBLK (S_IFCHR) -You lose. -# endif -#endif - -#if defined(S_ISLNK) && defined(S_IFREG) -# if S_ISLNK (S_IFREG) -You lose. -# endif -#endif - -#if defined(S_ISSOCK) && defined(S_IFREG) -# if S_ISSOCK (S_IFREG) -You lose. -# endif -#endif - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "You lose" >/dev/null 2>&1; then - ac_cv_header_stat_broken=yes -else - ac_cv_header_stat_broken=no -fi -rm -f conftest* - -fi -echo "$as_me:$LINENO: result: $ac_cv_header_stat_broken" >&5 -echo "${ECHO_T}$ac_cv_header_stat_broken" >&6 -if test $ac_cv_header_stat_broken = yes; then - -cat >>confdefs.h <<\_ACEOF -#define STAT_MACROS_BROKEN 1 -_ACEOF - -fi - - - - - - -ac_header_dirent=no -for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do - as_ac_Header=`echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_hdr that defines DIR" >&5 -echo $ECHO_N "checking for $ac_hdr that defines DIR... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include <$ac_hdr> - -int -main () -{ -if ((DIR *) 0) -return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_Header=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_Header=no" -fi -rm -f conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -if test `eval echo '${'$as_ac_Header'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 -_ACEOF - -ac_header_dirent=$ac_hdr; break -fi - -done -# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. -if test $ac_header_dirent = dirent.h; then - echo "$as_me:$LINENO: checking for library containing opendir" >&5 -echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6 -if test "${ac_cv_search_opendir+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_func_search_save_LIBS=$LIBS -ac_cv_search_opendir=no -cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char opendir (); -int -main () -{ -opendir (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_search_opendir="none required" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext -if test "$ac_cv_search_opendir" = no; then - for ac_lib in dir; do - LIBS="-l$ac_lib $ac_func_search_save_LIBS" - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char opendir (); -int -main () -{ -opendir (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_search_opendir="-l$ac_lib" -break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext - done -fi -LIBS=$ac_func_search_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 -echo "${ECHO_T}$ac_cv_search_opendir" >&6 -if test "$ac_cv_search_opendir" != no; then - test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS" - -fi - -else - echo "$as_me:$LINENO: checking for library containing opendir" >&5 -echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6 -if test "${ac_cv_search_opendir+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_func_search_save_LIBS=$LIBS -ac_cv_search_opendir=no -cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char opendir (); -int -main () -{ -opendir (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_search_opendir="none required" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext -if test "$ac_cv_search_opendir" = no; then - for ac_lib in x; do - LIBS="-l$ac_lib $ac_func_search_save_LIBS" - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char opendir (); -int -main () -{ -opendir (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_search_opendir="-l$ac_lib" -break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext - done -fi -LIBS=$ac_func_search_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 -echo "${ECHO_T}$ac_cv_search_opendir" >&6 -if test "$ac_cv_search_opendir" != no; then - test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS" - -fi - -fi - - - - - - - - - - - - - - -for ac_func in lstat memmove putenv select setenv setlocale \ - strcasecmp strpbrk tcgetattr vsnprintf isascii isxdigit -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ -#ifdef __STDC__ -# include -#else -# include -#endif -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - -echo "$as_me:$LINENO: checking for working strcoll" >&5 -echo $ECHO_N "checking for working strcoll... $ECHO_C" >&6 -if test "${ac_cv_func_strcoll_works+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then - ac_cv_func_strcoll_works=no -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -exit (strcoll ("abc", "def") >= 0 || - strcoll ("ABC", "DEF") >= 0 || - strcoll ("123", "456") >= 0) - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_strcoll_works=yes -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -ac_cv_func_strcoll_works=no -fi -rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -echo "$as_me:$LINENO: result: $ac_cv_func_strcoll_works" >&5 -echo "${ECHO_T}$ac_cv_func_strcoll_works" >&6 -if test $ac_cv_func_strcoll_works = yes; then - -cat >>confdefs.h <<\_ACEOF -#define HAVE_STRCOLL 1 -_ACEOF - -fi - - - - - - - - - - - - - - - - - - - -for ac_header in unistd.h stdlib.h varargs.h stdarg.h string.h strings.h \ - limits.h sys/ptem.h sys/pte.h sys/stream.h sys/select.h \ - termcap.h termios.h termio.h sys/file.h locale.h memory.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc in - yes:no ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------ ## -## Report this to bug-autoconf@gnu.org. ## -## ------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; - no:yes ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------ ## -## Report this to bug-autoconf@gnu.org. ## -## ------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - - -echo "$as_me:$LINENO: checking for type of signal functions" >&5 -echo $ECHO_N "checking for type of signal functions... $ECHO_C" >&6 -if test "${bash_cv_signal_vintage+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -int -main () -{ - - sigset_t ss; - struct sigaction sa; - sigemptyset(&ss); sigsuspend(&ss); - sigaction(SIGINT, &sa, (struct sigaction *) 0); - sigprocmask(SIG_BLOCK, &ss, (sigset_t *) 0); - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - bash_cv_signal_vintage=posix -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -int -main () -{ - - int mask = sigmask(SIGINT); - sigsetmask(mask); sigblock(mask); sigpause(mask); - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - bash_cv_signal_vintage=4.2bsd -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - - #include - RETSIGTYPE foo() { } -int -main () -{ - - int mask = sigmask(SIGINT); - sigset(SIGINT, foo); sigrelse(SIGINT); - sighold(SIGINT); sigpause(SIGINT); - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - bash_cv_signal_vintage=svr3 -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -bash_cv_signal_vintage=v7 - -fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext - -fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext - -fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext - -fi - -echo "$as_me:$LINENO: result: $bash_cv_signal_vintage" >&5 -echo "${ECHO_T}$bash_cv_signal_vintage" >&6 -if test "$bash_cv_signal_vintage" = posix; then -cat >>confdefs.h <<\_ACEOF -#define HAVE_POSIX_SIGNALS 1 -_ACEOF - -elif test "$bash_cv_signal_vintage" = "4.2bsd"; then -cat >>confdefs.h <<\_ACEOF -#define HAVE_BSD_SIGNALS 1 -_ACEOF - -elif test "$bash_cv_signal_vintage" = svr3; then -cat >>confdefs.h <<\_ACEOF -#define HAVE_USG_SIGHOLD 1 -_ACEOF - -fi - - - -echo "$as_me:$LINENO: checking if signal handlers must be reinstalled when invoked" >&5 -echo $ECHO_N "checking if signal handlers must be reinstalled when invoked... $ECHO_C" >&6 -if test "${bash_cv_must_reinstall_sighandlers+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then - { echo "$as_me:$LINENO: WARNING: cannot check signal handling if cross compiling -- defaulting to no" >&5 -echo "$as_me: WARNING: cannot check signal handling if cross compiling -- defaulting to no" >&2;} - bash_cv_must_reinstall_sighandlers=no - -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -#include -#ifdef HAVE_UNISTD_H -#include -#endif - -typedef RETSIGTYPE sigfunc(); - -int nsigint; - -#ifdef HAVE_POSIX_SIGNALS -sigfunc * -set_signal_handler(sig, handler) - int sig; - sigfunc *handler; -{ - struct sigaction act, oact; - act.sa_handler = handler; - act.sa_flags = 0; - sigemptyset (&act.sa_mask); - sigemptyset (&oact.sa_mask); - sigaction (sig, &act, &oact); - return (oact.sa_handler); -} -#else -#define set_signal_handler(s, h) signal(s, h) -#endif - -RETSIGTYPE -sigint(s) -int s; -{ - nsigint++; -} - -main() -{ - nsigint = 0; - set_signal_handler(SIGINT, sigint); - kill((int)getpid(), SIGINT); - kill((int)getpid(), SIGINT); - exit(nsigint != 2); -} - -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - bash_cv_must_reinstall_sighandlers=no -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -bash_cv_must_reinstall_sighandlers=yes -fi -rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi - -echo "$as_me:$LINENO: result: $bash_cv_must_reinstall_sighandlers" >&5 -echo "${ECHO_T}$bash_cv_must_reinstall_sighandlers" >&6 -if test $bash_cv_must_reinstall_sighandlers = yes; then -cat >>confdefs.h <<\_ACEOF -#define MUST_REINSTALL_SIGHANDLERS 1 -_ACEOF - -fi - - - -echo "$as_me:$LINENO: checking for presence of POSIX-style sigsetjmp/siglongjmp" >&5 -echo $ECHO_N "checking for presence of POSIX-style sigsetjmp/siglongjmp... $ECHO_C" >&6 -if test "${bash_cv_func_sigsetjmp+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then - { echo "$as_me:$LINENO: WARNING: cannot check for sigsetjmp/siglongjmp if cross-compiling -- defaulting to missing" >&5 -echo "$as_me: WARNING: cannot check for sigsetjmp/siglongjmp if cross-compiling -- defaulting to missing" >&2;} - bash_cv_func_sigsetjmp=missing - -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -#ifdef HAVE_UNISTD_H -#include -#endif -#include -#include -#include - -main() -{ -#if !defined (_POSIX_VERSION) || !defined (HAVE_POSIX_SIGNALS) -exit (1); -#else - -int code; -sigset_t set, oset; -sigjmp_buf xx; - -/* get the mask */ -sigemptyset(&set); -sigemptyset(&oset); -sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &set); -sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &oset); - -/* save it */ -code = sigsetjmp(xx, 1); -if (code) - exit(0); /* could get sigmask and compare to oset here. */ - -/* change it */ -sigaddset(&set, SIGINT); -sigprocmask(SIG_BLOCK, &set, (sigset_t *)NULL); - -/* and siglongjmp */ -siglongjmp(xx, 10); -exit(1); -#endif -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - bash_cv_func_sigsetjmp=present -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -bash_cv_func_sigsetjmp=missing -fi -rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi - -echo "$as_me:$LINENO: result: $bash_cv_func_sigsetjmp" >&5 -echo "${ECHO_T}$bash_cv_func_sigsetjmp" >&6 -if test $bash_cv_func_sigsetjmp = present; then -cat >>confdefs.h <<\_ACEOF -#define HAVE_POSIX_SIGSETJMP 1 -_ACEOF - -fi - -echo "$as_me:$LINENO: checking for lstat" >&5 -echo $ECHO_N "checking for lstat... $ECHO_C" >&6 -if test "${bash_cv_func_lstat+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -#include -#include - -int -main () -{ - lstat(".",(struct stat *)0); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - bash_cv_func_lstat=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -bash_cv_func_lstat=no -fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $bash_cv_func_lstat" >&5 -echo "${ECHO_T}$bash_cv_func_lstat" >&6 -if test $bash_cv_func_lstat = yes; then - cat >>confdefs.h <<\_ACEOF -#define HAVE_LSTAT 1 -_ACEOF - -fi - - -echo "$as_me:$LINENO: checking whether or not strcoll and strcmp differ" >&5 -echo $ECHO_N "checking whether or not strcoll and strcmp differ... $ECHO_C" >&6 -if test "${bash_cv_func_strcoll_broken+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then - { echo "$as_me:$LINENO: WARNING: cannot check strcoll if cross compiling -- defaulting to no" >&5 -echo "$as_me: WARNING: cannot check strcoll if cross compiling -- defaulting to no" >&2;} - bash_cv_func_strcoll_broken=no - -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -#include -#if defined (HAVE_LOCALE_H) -#include -#endif - -main(c, v) -int c; -char *v[]; -{ - int r1, r2; - char *deflocale, *defcoll; - -#ifdef HAVE_SETLOCALE - deflocale = setlocale(LC_ALL, ""); - defcoll = setlocale(LC_COLLATE, ""); -#endif - -#ifdef HAVE_STRCOLL - /* These two values are taken from tests/glob-test. */ - r1 = strcoll("abd", "aXd"); -#else - r1 = 0; -#endif - r2 = strcmp("abd", "aXd"); - - /* These two should both be greater than 0. It is permissible for - a system to return different values, as long as the sign is the - same. */ - - /* Exit with 1 (failure) if these two values are both > 0, since - this tests whether strcoll(3) is broken with respect to strcmp(3) - in the default locale. */ - exit (r1 > 0 && r2 > 0); -} - -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - bash_cv_func_strcoll_broken=yes -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -bash_cv_func_strcoll_broken=no -fi -rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi - -echo "$as_me:$LINENO: result: $bash_cv_func_strcoll_broken" >&5 -echo "${ECHO_T}$bash_cv_func_strcoll_broken" >&6 -if test $bash_cv_func_strcoll_broken = yes; then -cat >>confdefs.h <<\_ACEOF -#define STRCOLL_BROKEN 1 -_ACEOF - -fi - - -echo "$as_me:$LINENO: checking whether the ctype macros accept non-ascii characters" >&5 -echo $ECHO_N "checking whether the ctype macros accept non-ascii characters... $ECHO_C" >&6 -if test "${bash_cv_func_ctype_nonascii+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then - { echo "$as_me:$LINENO: WARNING: cannot check ctype macros if cross compiling -- defaulting to no" >&5 -echo "$as_me: WARNING: cannot check ctype macros if cross compiling -- defaulting to no" >&2;} - bash_cv_func_ctype_nonascii=no - -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -#ifdef HAVE_LOCALE_H -#include -#endif -#include -#include - -main(c, v) -int c; -char *v[]; -{ - char *deflocale; - unsigned char x; - int r1, r2; - -#ifdef HAVE_SETLOCALE - /* We take a shot here. If that locale is not known, try the - system default. We try this one because '\342' (226) is - known to be a printable character in that locale. */ - deflocale = setlocale(LC_ALL, "en_US.ISO8859-1"); - if (deflocale == 0) - deflocale = setlocale(LC_ALL, ""); -#endif - - x = '\342'; - r1 = isprint(x); - x -= 128; - r2 = isprint(x); - exit (r1 == 0 || r2 == 0); -} - -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - bash_cv_func_ctype_nonascii=yes -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -bash_cv_func_ctype_nonascii=no -fi -rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi - -echo "$as_me:$LINENO: result: $bash_cv_func_ctype_nonascii" >&5 -echo "${ECHO_T}$bash_cv_func_ctype_nonascii" >&6 -if test $bash_cv_func_ctype_nonascii = yes; then -cat >>confdefs.h <<\_ACEOF -#define CTYPE_NON_ASCII 1 -_ACEOF - -fi - - -echo "$as_me:$LINENO: checking whether getpw functions are declared in pwd.h" >&5 -echo $ECHO_N "checking whether getpw functions are declared in pwd.h... $ECHO_C" >&6 -if test "${bash_cv_getpw_declared+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -#include -#ifdef HAVE_UNISTD_H -# include -#endif -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "getpwuid" >/dev/null 2>&1; then - bash_cv_getpw_declared=yes -else - bash_cv_getpw_declared=no -fi -rm -f conftest* - -fi - -echo "$as_me:$LINENO: result: $bash_cv_getpw_declared" >&5 -echo "${ECHO_T}$bash_cv_getpw_declared" >&6 -if test $bash_cv_getpw_declared = yes; then -cat >>confdefs.h <<\_ACEOF -#define HAVE_GETPW_DECLS 1 -_ACEOF - -fi - - -echo "$as_me:$LINENO: checking whether termios.h defines TIOCGWINSZ" >&5 -echo $ECHO_N "checking whether termios.h defines TIOCGWINSZ... $ECHO_C" >&6 -if test "${ac_cv_sys_tiocgwinsz_in_termios_h+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#ifdef TIOCGWINSZ - yes -#endif - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1; then - ac_cv_sys_tiocgwinsz_in_termios_h=yes -else - ac_cv_sys_tiocgwinsz_in_termios_h=no -fi -rm -f conftest* - -fi -echo "$as_me:$LINENO: result: $ac_cv_sys_tiocgwinsz_in_termios_h" >&5 -echo "${ECHO_T}$ac_cv_sys_tiocgwinsz_in_termios_h" >&6 - -if test $ac_cv_sys_tiocgwinsz_in_termios_h != yes; then - echo "$as_me:$LINENO: checking whether sys/ioctl.h defines TIOCGWINSZ" >&5 -echo $ECHO_N "checking whether sys/ioctl.h defines TIOCGWINSZ... $ECHO_C" >&6 -if test "${ac_cv_sys_tiocgwinsz_in_sys_ioctl_h+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#ifdef TIOCGWINSZ - yes -#endif - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1; then - ac_cv_sys_tiocgwinsz_in_sys_ioctl_h=yes -else - ac_cv_sys_tiocgwinsz_in_sys_ioctl_h=no -fi -rm -f conftest* - -fi -echo "$as_me:$LINENO: result: $ac_cv_sys_tiocgwinsz_in_sys_ioctl_h" >&5 -echo "${ECHO_T}$ac_cv_sys_tiocgwinsz_in_sys_ioctl_h" >&6 - - if test $ac_cv_sys_tiocgwinsz_in_sys_ioctl_h = yes; then - -cat >>confdefs.h <<\_ACEOF -#define GWINSZ_IN_SYS_IOCTL 1 -_ACEOF - - fi -fi - - -echo "$as_me:$LINENO: checking whether signal handlers are of type void" >&5 -echo $ECHO_N "checking whether signal handlers are of type void... $ECHO_C" >&6 -if test "${bash_cv_void_sighandler+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#ifdef signal -#undef signal -#endif -#ifdef __cplusplus -extern "C" -#endif -void (*signal ()) (); -int -main () -{ -int i; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - bash_cv_void_sighandler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -bash_cv_void_sighandler=no -fi -rm -f conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $bash_cv_void_sighandler" >&5 -echo "${ECHO_T}$bash_cv_void_sighandler" >&6 -if test $bash_cv_void_sighandler = yes; then -cat >>confdefs.h <<\_ACEOF -#define VOID_SIGHANDLER 1 -_ACEOF - -fi - -echo "$as_me:$LINENO: checking for TIOCSTAT in sys/ioctl.h" >&5 -echo $ECHO_N "checking for TIOCSTAT in sys/ioctl.h... $ECHO_C" >&6 -if test "${bash_cv_tiocstat_in_ioctl+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -int -main () -{ -int x = TIOCSTAT; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - bash_cv_tiocstat_in_ioctl=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -bash_cv_tiocstat_in_ioctl=no -fi -rm -f conftest.$ac_objext conftest.$ac_ext -fi - -echo "$as_me:$LINENO: result: $bash_cv_tiocstat_in_ioctl" >&5 -echo "${ECHO_T}$bash_cv_tiocstat_in_ioctl" >&6 -if test $bash_cv_tiocstat_in_ioctl = yes; then -cat >>confdefs.h <<\_ACEOF -#define TIOCSTAT_IN_SYS_IOCTL 1 -_ACEOF - -fi - -echo "$as_me:$LINENO: checking for FIONREAD in sys/ioctl.h" >&5 -echo $ECHO_N "checking for FIONREAD in sys/ioctl.h... $ECHO_C" >&6 -if test "${bash_cv_fionread_in_ioctl+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -int -main () -{ -int x = FIONREAD; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - bash_cv_fionread_in_ioctl=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -bash_cv_fionread_in_ioctl=no -fi -rm -f conftest.$ac_objext conftest.$ac_ext -fi - -echo "$as_me:$LINENO: result: $bash_cv_fionread_in_ioctl" >&5 -echo "${ECHO_T}$bash_cv_fionread_in_ioctl" >&6 -if test $bash_cv_fionread_in_ioctl = yes; then -cat >>confdefs.h <<\_ACEOF -#define FIONREAD_IN_SYS_IOCTL 1 -_ACEOF - -fi - -echo "$as_me:$LINENO: checking for speed_t in sys/types.h" >&5 -echo $ECHO_N "checking for speed_t in sys/types.h... $ECHO_C" >&6 -if test "${bash_cv_speed_t_in_sys_types+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -int -main () -{ -speed_t x; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - bash_cv_speed_t_in_sys_types=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -bash_cv_speed_t_in_sys_types=no -fi -rm -f conftest.$ac_objext conftest.$ac_ext -fi - -echo "$as_me:$LINENO: result: $bash_cv_speed_t_in_sys_types" >&5 -echo "${ECHO_T}$bash_cv_speed_t_in_sys_types" >&6 -if test $bash_cv_speed_t_in_sys_types = yes; then -cat >>confdefs.h <<\_ACEOF -#define SPEED_T_IN_SYS_TYPES 1 -_ACEOF - -fi - -echo "$as_me:$LINENO: checking for struct winsize in sys/ioctl.h and termios.h" >&5 -echo $ECHO_N "checking for struct winsize in sys/ioctl.h and termios.h... $ECHO_C" >&6 -if test "${bash_cv_struct_winsize_header+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -int -main () -{ -struct winsize x; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - bash_cv_struct_winsize_header=ioctl_h -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -int -main () -{ -struct winsize x; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - bash_cv_struct_winsize_header=termios_h -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -bash_cv_struct_winsize_header=other -fi -rm -f conftest.$ac_objext conftest.$ac_ext - -fi -rm -f conftest.$ac_objext conftest.$ac_ext -fi - -if test $bash_cv_struct_winsize_header = ioctl_h; then - echo "$as_me:$LINENO: result: sys/ioctl.h" >&5 -echo "${ECHO_T}sys/ioctl.h" >&6 - cat >>confdefs.h <<\_ACEOF -#define STRUCT_WINSIZE_IN_SYS_IOCTL 1 -_ACEOF - -elif test $bash_cv_struct_winsize_header = termios_h; then - echo "$as_me:$LINENO: result: termios.h" >&5 -echo "${ECHO_T}termios.h" >&6 - cat >>confdefs.h <<\_ACEOF -#define STRUCT_WINSIZE_IN_TERMIOS 1 -_ACEOF - -else - echo "$as_me:$LINENO: result: not found" >&5 -echo "${ECHO_T}not found" >&6 -fi - - -echo "$as_me:$LINENO: checking for struct dirent.d_ino" >&5 -echo $ECHO_N "checking for struct dirent.d_ino... $ECHO_C" >&6 -if test "${bash_cv_dirent_has_dino+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -#include -#include -#ifdef HAVE_UNISTD_H -# include -#endif /* HAVE_UNISTD_H */ -#if defined(HAVE_DIRENT_H) -# include -#else -# define dirent direct -# ifdef HAVE_SYS_NDIR_H -# include -# endif /* SYSNDIR */ -# ifdef HAVE_SYS_DIR_H -# include -# endif /* SYSDIR */ -# ifdef HAVE_NDIR_H -# include -# endif -#endif /* HAVE_DIRENT_H */ - -int -main () -{ - -struct dirent d; int z; z = d.d_ino; - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - bash_cv_dirent_has_dino=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -bash_cv_dirent_has_dino=no -fi -rm -f conftest.$ac_objext conftest.$ac_ext -fi - -echo "$as_me:$LINENO: result: $bash_cv_dirent_has_dino" >&5 -echo "${ECHO_T}$bash_cv_dirent_has_dino" >&6 -if test $bash_cv_dirent_has_dino = yes; then -cat >>confdefs.h <<\_ACEOF -#define HAVE_STRUCT_DIRENT_D_INO 1 -_ACEOF - -fi - - -echo "$as_me:$LINENO: checking for struct dirent.d_fileno" >&5 -echo $ECHO_N "checking for struct dirent.d_fileno... $ECHO_C" >&6 -if test "${bash_cv_dirent_has_d_fileno+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -#include -#include -#ifdef HAVE_UNISTD_H -# include -#endif /* HAVE_UNISTD_H */ -#if defined(HAVE_DIRENT_H) -# include -#else -# define dirent direct -# ifdef HAVE_SYS_NDIR_H -# include -# endif /* SYSNDIR */ -# ifdef HAVE_SYS_DIR_H -# include -# endif /* SYSDIR */ -# ifdef HAVE_NDIR_H -# include -# endif -#endif /* HAVE_DIRENT_H */ - -int -main () -{ - -struct dirent d; int z; z = d.d_fileno; - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - bash_cv_dirent_has_d_fileno=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -bash_cv_dirent_has_d_fileno=no -fi -rm -f conftest.$ac_objext conftest.$ac_ext -fi - -echo "$as_me:$LINENO: result: $bash_cv_dirent_has_d_fileno" >&5 -echo "${ECHO_T}$bash_cv_dirent_has_d_fileno" >&6 -if test $bash_cv_dirent_has_d_fileno = yes; then -cat >>confdefs.h <<\_ACEOF -#define HAVE_STRUCT_DIRENT_D_FILENO 1 -_ACEOF - -fi - - -case "$host_os" in -aix*) prefer_curses=yes ;; -esac - -if test "X$bash_cv_termcap_lib" = "X"; then -_bash_needmsg=yes -else -echo "$as_me:$LINENO: checking which library has the termcap functions" >&5 -echo $ECHO_N "checking which library has the termcap functions... $ECHO_C" >&6 -_bash_needmsg= -fi -if test "${bash_cv_termcap_lib+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - echo "$as_me:$LINENO: checking for tgetent" >&5 -echo $ECHO_N "checking for tgetent... $ECHO_C" >&6 -if test "${ac_cv_func_tgetent+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char tgetent (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ -#ifdef __STDC__ -# include -#else -# include -#endif -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char tgetent (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_tgetent) || defined (__stub___tgetent) -choke me -#else -char (*f) () = tgetent; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != tgetent; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_tgetent=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_tgetent=no -fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_tgetent" >&5 -echo "${ECHO_T}$ac_cv_func_tgetent" >&6 -if test $ac_cv_func_tgetent = yes; then - bash_cv_termcap_lib=libc -else - echo "$as_me:$LINENO: checking for tgetent in -ltermcap" >&5 -echo $ECHO_N "checking for tgetent in -ltermcap... $ECHO_C" >&6 -if test "${ac_cv_lib_termcap_tgetent+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ltermcap $LIBS" -cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char tgetent (); -int -main () -{ -tgetent (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_termcap_tgetent=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_termcap_tgetent=no -fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_lib_termcap_tgetent" >&5 -echo "${ECHO_T}$ac_cv_lib_termcap_tgetent" >&6 -if test $ac_cv_lib_termcap_tgetent = yes; then - bash_cv_termcap_lib=libtermcap -else - echo "$as_me:$LINENO: checking for tgetent in -ltinfo" >&5 -echo $ECHO_N "checking for tgetent in -ltinfo... $ECHO_C" >&6 -if test "${ac_cv_lib_tinfo_tgetent+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ltinfo $LIBS" -cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char tgetent (); -int -main () -{ -tgetent (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_tinfo_tgetent=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_tinfo_tgetent=no -fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_lib_tinfo_tgetent" >&5 -echo "${ECHO_T}$ac_cv_lib_tinfo_tgetent" >&6 -if test $ac_cv_lib_tinfo_tgetent = yes; then - bash_cv_termcap_lib=libtinfo -else - echo "$as_me:$LINENO: checking for tgetent in -lcurses" >&5 -echo $ECHO_N "checking for tgetent in -lcurses... $ECHO_C" >&6 -if test "${ac_cv_lib_curses_tgetent+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lcurses $LIBS" -cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char tgetent (); -int -main () -{ -tgetent (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_curses_tgetent=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_curses_tgetent=no -fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_lib_curses_tgetent" >&5 -echo "${ECHO_T}$ac_cv_lib_curses_tgetent" >&6 -if test $ac_cv_lib_curses_tgetent = yes; then - bash_cv_termcap_lib=libcurses -else - echo "$as_me:$LINENO: checking for tgetent in -lncurses" >&5 -echo $ECHO_N "checking for tgetent in -lncurses... $ECHO_C" >&6 -if test "${ac_cv_lib_ncurses_tgetent+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lncurses $LIBS" -cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char tgetent (); -int -main () -{ -tgetent (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_ncurses_tgetent=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_ncurses_tgetent=no -fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_lib_ncurses_tgetent" >&5 -echo "${ECHO_T}$ac_cv_lib_ncurses_tgetent" >&6 -if test $ac_cv_lib_ncurses_tgetent = yes; then - bash_cv_termcap_lib=libncurses -else - bash_cv_termcap_lib=gnutermcap -fi - -fi - -fi - -fi - -fi - -fi - -if test "X$_bash_needmsg" = "Xyes"; then -echo "$as_me:$LINENO: checking which library has the termcap functions" >&5 -echo $ECHO_N "checking which library has the termcap functions... $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: using $bash_cv_termcap_lib" >&5 -echo "${ECHO_T}using $bash_cv_termcap_lib" >&6 -if test $bash_cv_termcap_lib = gnutermcap && test -z "$prefer_curses"; then -LDFLAGS="$LDFLAGS -L./lib/termcap" -TERMCAP_LIB="./lib/termcap/libtermcap.a" -TERMCAP_DEP="./lib/termcap/libtermcap.a" -elif test $bash_cv_termcap_lib = libtermcap && test -z "$prefer_curses"; then -TERMCAP_LIB=-ltermcap -TERMCAP_DEP= -elif test $bash_cv_termcap_lib = libtinfo; then -TERMCAP_LIB=-ltinfo -TERMCAP_DEP= -elif test $bash_cv_termcap_lib = libncurses; then -TERMCAP_LIB=-lncurses -TERMCAP_DEP= -elif test $bash_cv_termcap_lib = libc; then -TERMCAP_LIB= -TERMCAP_DEP= -else -TERMCAP_LIB=-lcurses -TERMCAP_DEP= -fi - -if test "$TERMCAP_LIB" = "./lib/termcap/libtermcap.a"; then - if test "$prefer_curses" = yes; then - TERMCAP_LIB=-lcurses - else - TERMCAP_LIB=-ltermcap #default - fi -fi - - - -for ac_header in wctype.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc in - yes:no ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------ ## -## Report this to bug-autoconf@gnu.org. ## -## ------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; - no:yes ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------ ## -## Report this to bug-autoconf@gnu.org. ## -## ------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -for ac_header in wchar.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc in - yes:no ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------ ## -## Report this to bug-autoconf@gnu.org. ## -## ------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; - no:yes ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------ ## -## Report this to bug-autoconf@gnu.org. ## -## ------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -for ac_header in langinfo.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc in - yes:no ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------ ## -## Report this to bug-autoconf@gnu.org. ## -## ------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; - no:yes ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------ ## -## Report this to bug-autoconf@gnu.org. ## -## ------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -echo "$as_me:$LINENO: checking for mbsrtowcs" >&5 -echo $ECHO_N "checking for mbsrtowcs... $ECHO_C" >&6 -if test "${ac_cv_func_mbsrtowcs+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char mbsrtowcs (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ -#ifdef __STDC__ -# include -#else -# include -#endif -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char mbsrtowcs (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_mbsrtowcs) || defined (__stub___mbsrtowcs) -choke me -#else -char (*f) () = mbsrtowcs; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != mbsrtowcs; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_mbsrtowcs=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_mbsrtowcs=no -fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_mbsrtowcs" >&5 -echo "${ECHO_T}$ac_cv_func_mbsrtowcs" >&6 -if test $ac_cv_func_mbsrtowcs = yes; then - cat >>confdefs.h <<\_ACEOF -#define HAVE_MBSRTOWCS 1 -_ACEOF - -fi - -echo "$as_me:$LINENO: checking for mbrtowc" >&5 -echo $ECHO_N "checking for mbrtowc... $ECHO_C" >&6 -if test "${ac_cv_func_mbrtowc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char mbrtowc (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ -#ifdef __STDC__ -# include -#else -# include -#endif -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char mbrtowc (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_mbrtowc) || defined (__stub___mbrtowc) -choke me -#else -char (*f) () = mbrtowc; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != mbrtowc; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_mbrtowc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_mbrtowc=no -fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_mbrtowc" >&5 -echo "${ECHO_T}$ac_cv_func_mbrtowc" >&6 -if test $ac_cv_func_mbrtowc = yes; then - cat >>confdefs.h <<\_ACEOF -#define HAVE_MBRTOWC 1 -_ACEOF - -fi - -echo "$as_me:$LINENO: checking for mbrlen" >&5 -echo $ECHO_N "checking for mbrlen... $ECHO_C" >&6 -if test "${ac_cv_func_mbrlen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char mbrlen (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ -#ifdef __STDC__ -# include -#else -# include -#endif -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char mbrlen (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_mbrlen) || defined (__stub___mbrlen) -choke me -#else -char (*f) () = mbrlen; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != mbrlen; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_mbrlen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_mbrlen=no -fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_mbrlen" >&5 -echo "${ECHO_T}$ac_cv_func_mbrlen" >&6 -if test $ac_cv_func_mbrlen = yes; then - cat >>confdefs.h <<\_ACEOF -#define HAVE_MBRLEN 1 -_ACEOF - -fi - -echo "$as_me:$LINENO: checking for wctomb" >&5 -echo $ECHO_N "checking for wctomb... $ECHO_C" >&6 -if test "${ac_cv_func_wctomb+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char wctomb (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ -#ifdef __STDC__ -# include -#else -# include -#endif -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char wctomb (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_wctomb) || defined (__stub___wctomb) -choke me -#else -char (*f) () = wctomb; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != wctomb; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_wctomb=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_wctomb=no -fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_wctomb" >&5 -echo "${ECHO_T}$ac_cv_func_wctomb" >&6 -if test $ac_cv_func_wctomb = yes; then - cat >>confdefs.h <<\_ACEOF -#define HAVE_WCTOMB 1 -_ACEOF - -fi - -echo "$as_me:$LINENO: checking for wcwidth" >&5 -echo $ECHO_N "checking for wcwidth... $ECHO_C" >&6 -if test "${ac_cv_func_wcwidth+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char wcwidth (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ -#ifdef __STDC__ -# include -#else -# include -#endif -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char wcwidth (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_wcwidth) || defined (__stub___wcwidth) -choke me -#else -char (*f) () = wcwidth; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != wcwidth; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_wcwidth=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_wcwidth=no -fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_wcwidth" >&5 -echo "${ECHO_T}$ac_cv_func_wcwidth" >&6 -if test $ac_cv_func_wcwidth = yes; then - cat >>confdefs.h <<\_ACEOF -#define HAVE_WCWIDTH 1 -_ACEOF - -fi - -echo "$as_me:$LINENO: checking for wcsdup" >&5 -echo $ECHO_N "checking for wcsdup... $ECHO_C" >&6 -if test "${ac_cv_func_wcsdup+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char wcsdup (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ -#ifdef __STDC__ -# include -#else -# include -#endif -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char wcsdup (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_wcsdup) || defined (__stub___wcsdup) -choke me -#else -char (*f) () = wcsdup; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != wcsdup; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_wcsdup=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_wcsdup=no -fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_wcsdup" >&5 -echo "${ECHO_T}$ac_cv_func_wcsdup" >&6 -if test $ac_cv_func_wcsdup = yes; then - cat >>confdefs.h <<\_ACEOF -#define HAVE_WCSDUP 1 -_ACEOF - -fi - - -echo "$as_me:$LINENO: checking for mbstate_t" >&5 -echo $ECHO_N "checking for mbstate_t... $ECHO_C" >&6 -if test "${bash_cv_have_mbstate_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -#include -int -main () -{ - - mbstate_t ps; - mbstate_t *psp; - psp = (mbstate_t *)0; - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - bash_cv_have_mbstate_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -bash_cv_have_mbstate_t=no -fi -rm -f conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $bash_cv_have_mbstate_t" >&5 -echo "${ECHO_T}$bash_cv_have_mbstate_t" >&6 -if test $bash_cv_have_mbstate_t = yes; then - cat >>confdefs.h <<\_ACEOF -#define HAVE_MBSTATE_T 1 -_ACEOF - -fi - -echo "$as_me:$LINENO: checking for nl_langinfo and CODESET" >&5 -echo $ECHO_N "checking for nl_langinfo and CODESET... $ECHO_C" >&6 -if test "${bash_cv_langinfo_codeset+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -int -main () -{ -char* cs = nl_langinfo(CODESET); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - bash_cv_langinfo_codeset=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -bash_cv_langinfo_codeset=no -fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $bash_cv_langinfo_codeset" >&5 -echo "${ECHO_T}$bash_cv_langinfo_codeset" >&6 -if test $bash_cv_langinfo_codeset = yes; then - cat >>confdefs.h <<\_ACEOF -#define HAVE_LANGINFO_CODESET 1 -_ACEOF - -fi - - - -case "$host_cpu" in -*cray*) LOCAL_CFLAGS=-DCRAY ;; -*s390*) LOCAL_CFLAGS=-fsigned-char ;; -esac - -case "$host_os" in -isc*) LOCAL_CFLAGS=-Disc386 ;; -esac - -# shared library configuration section -# -# Shared object configuration section. These values are generated by -# ${srcdir}/support/shobj-conf -# -if test -f ${srcdir}/support/shobj-conf; then - echo "$as_me:$LINENO: checking configuration for building shared libraries" >&5 -echo $ECHO_N "checking configuration for building shared libraries... $ECHO_C" >&6 - eval `${CONFIG_SHELL-/bin/sh} ${srcdir}/support/shobj-conf -C "${CC}" -c ${host_cpu} -o ${host_os} -v ${host_vendor}` - - - - - - - - - - - - - echo "$as_me:$LINENO: result: $SHLIB_STATUS" >&5 -echo "${ECHO_T}$SHLIB_STATUS" >&6 - - # SHLIB_STATUS is either `supported' or `unsupported'. If it's - # `unsupported', turn off any default shared library building - if test "$SHLIB_STATUS" = 'unsupported'; then - opt_shared_libs=no - fi - - # shared library versioning - # quoted for m4 so I can use character classes - SHLIB_MAJOR=`expr "$LIBVERSION" : '\([0-9]\)\..*'` - SHLIB_MINOR=`expr "$LIBVERSION" : '[0-9]\.\([0-9]\).*'` - - -fi - -if test "$opt_static_libs" = "yes"; then - STATIC_TARGET=static - STATIC_INSTALL_TARGET=install-static -fi -if test "$opt_shared_libs" = "yes"; then - SHARED_TARGET=shared - SHARED_INSTALL_TARGET=install-shared -fi - - - - - - -case "$host_os" in -msdosdjgpp*) BUILD_DIR=`pwd.exe` ;; # to prevent //d/path/file -*) BUILD_DIR=`pwd` ;; -esac - - - - - - - - - - - - - - - - - - - ac_config_files="$ac_config_files Makefile doc/Makefile examples/Makefile shlib/Makefile" - ac_config_commands="$ac_config_commands default" -cat >confcache <<\_ACEOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs, see configure's option --config-cache. -# It is not useful on other systems. If it contains results you don't -# want to keep, you may remove or edit it. -# -# config.status only pays attention to the cache file if you give it -# the --recheck option to rerun configure. -# -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the -# following values. - -_ACEOF - -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -{ - (set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \). - sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" - ;; - esac; -} | - sed ' - t clear - : clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - : end' >>confcache -if diff $cache_file confcache >/dev/null 2>&1; then :; else - if test -w $cache_file; then - test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" - cat confcache >$cache_file - else - echo "not updating unwritable cache $cache_file" - fi -fi -rm -f confcache - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# VPATH may cause trouble with some makes, so we remove $(srcdir), -# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=/{ -s/:*\$(srcdir):*/:/; -s/:*\${srcdir}:*/:/; -s/:*@srcdir@:*/:/; -s/^\([^=]*=[ ]*\):*/\1/; -s/:*$//; -s/^[^=]*=[ ]*$//; -}' -fi - -DEFS=-DHAVE_CONFIG_H - -ac_libobjs= -ac_ltlibobjs= -for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue - # 1. Remove the extension, and $U if already installed. - ac_i=`echo "$ac_i" | - sed 's/\$U\././;s/\.o$//;s/\.obj$//'` - # 2. Add them. - ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" - ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' -done -LIBOBJS=$ac_libobjs - -LTLIBOBJS=$ac_ltlibobjs - - - -: ${CONFIG_STATUS=./config.status} -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 -echo "$as_me: creating $CONFIG_STATUS" >&6;} -cat >$CONFIG_STATUS <<_ACEOF -#! $SHELL -# Generated by $as_me. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false -SHELL=\${CONFIG_SHELL-$SHELL} -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## - -# Be Bourne compatible -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' -elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then - set -o posix -fi - -# Support unset when possible. -if (FOO=FOO; unset FOO) >/dev/null 2>&1; then - as_unset=unset -else - as_unset=false -fi - - -# Work around bugs in pre-3.0 UWIN ksh. -$as_unset ENV MAIL MAILPATH -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -for as_var in \ - LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ - LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ - LC_TELEPHONE LC_TIME -do - if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then - eval $as_var=C; export $as_var - else - $as_unset $as_var - fi -done - -# Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1; then - as_expr=expr -else - as_expr=false -fi - -if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - - -# Name of the executable. -as_me=`$as_basename "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)$' \| \ - . : '\(.\)' 2>/dev/null || -echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } - /^X\/\(\/\/\)$/{ s//\1/; q; } - /^X\/\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - - -# PATH needs CR, and LINENO needs CR and PATH. -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conf$$.sh -fi - - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" || { - # Find who we are. Look in the path if we contain no path at all - # relative or not. - case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done - - ;; - esac - # We did not find ourselves, most probably we were run as `sh COMMAND' - # in which case we are not to be found in the path. - if test "x$as_myself" = x; then - as_myself=$0 - fi - if test ! -f "$as_myself"; then - { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 -echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} - { (exit 1); exit 1; }; } - fi - case $CONFIG_SHELL in - '') - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for as_base in sh bash ksh sh5; do - case $as_dir in - /*) - if ("$as_dir/$as_base" -c ' - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then - $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } - $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } - CONFIG_SHELL=$as_dir/$as_base - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$0" ${1+"$@"} - fi;; - esac - done -done -;; - esac - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line before each line; the second 'sed' does the real - # work. The second script uses 'N' to pair each line-number line - # with the numbered line, and appends trailing '-' during - # substitution so that $LINENO is not a special case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) - sed '=' <$as_myself | - sed ' - N - s,$,-, - : loop - s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, - t loop - s,-$,, - s,^['$as_cr_digits']*\n,, - ' >$as_me.lineno && - chmod +x $as_me.lineno || - { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 -echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} - { (exit 1); exit 1; }; } - - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensible to this). - . ./$as_me.lineno - # Exit status is that of the last command. - exit -} - - -case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in - *c*,-n*) ECHO_N= ECHO_C=' -' ECHO_T=' ' ;; - *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; - *) ECHO_N= ECHO_C='\c' ECHO_T= ;; -esac - -if expr a : '\(a\)' >/dev/null 2>&1; then - as_expr=expr -else - as_expr=false -fi - -rm -f conf$$ conf$$.exe conf$$.file -echo >conf$$.file -if ln -s conf$$.file conf$$ 2>/dev/null; then - # We could just check for DJGPP; but this test a) works b) is more generic - # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). - if test -f conf$$.exe; then - # Don't use ln at all; we don't have any links - as_ln_s='cp -p' - else - as_ln_s='ln -s' - fi -elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.file - -if mkdir -p . 2>/dev/null; then - as_mkdir_p=: -else - as_mkdir_p=false -fi - -as_executable_p="test -f" - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" - - -# IFS -# We need space, tab and new line, in precisely that order. -as_nl=' -' -IFS=" $as_nl" - -# CDPATH. -$as_unset CDPATH - -exec 6>&1 - -# Open the log real soon, to keep \$[0] and so on meaningful, and to -# report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. Logging --version etc. is OK. -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX -} >&5 -cat >&5 <<_CSEOF - -This file was extended by readline $as_me 5.0-rc1, which was -generated by GNU Autoconf 2.57. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -_CSEOF -echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 -echo >&5 -_ACEOF - -# Files that config.status was made for. -if test -n "$ac_config_files"; then - echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS -fi - -if test -n "$ac_config_headers"; then - echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS -fi - -if test -n "$ac_config_links"; then - echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS -fi - -if test -n "$ac_config_commands"; then - echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS -fi - -cat >>$CONFIG_STATUS <<\_ACEOF - -ac_cs_usage="\ -\`$as_me' instantiates files from templates according to the -current configuration. - -Usage: $0 [OPTIONS] [FILE]... - - -h, --help print this help, then exit - -V, --version print version number, then exit - -q, --quiet do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - --header=FILE[:TEMPLATE] - instantiate the configuration header FILE - -Configuration files: -$config_files - -Configuration headers: -$config_headers - -Configuration commands: -$config_commands - -Report bugs to ." -_ACEOF - -cat >>$CONFIG_STATUS <<_ACEOF -ac_cs_version="\\ -readline config.status 5.0-rc1 -configured by $0, generated by GNU Autoconf 2.57, - with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" - -Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 -Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." -srcdir=$srcdir -INSTALL="$INSTALL" -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF -# If no file are specified by the user, then we need to provide default -# value. By we need to know if files were specified by the user. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=*) - ac_option=`expr "x$1" : 'x\([^=]*\)='` - ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` - ac_shift=: - ;; - -*) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - *) # This is not an option, so the user has probably given explicit - # arguments. - ac_option=$1 - ac_need_defaults=false;; - esac - - case $ac_option in - # Handling of the options. -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --vers* | -V ) - echo "$ac_cs_version"; exit 0 ;; - --he | --h) - # Conflict between --help and --header - { { echo "$as_me:$LINENO: error: ambiguous option: $1 -Try \`$0 --help' for more information." >&5 -echo "$as_me: error: ambiguous option: $1 -Try \`$0 --help' for more information." >&2;} - { (exit 1); exit 1; }; };; - --help | --hel | -h ) - echo "$ac_cs_usage"; exit 0 ;; - --debug | --d* | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - CONFIG_FILES="$CONFIG_FILES $ac_optarg" - ac_need_defaults=false;; - --header | --heade | --head | --hea ) - $ac_shift - CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" - ac_need_defaults=false;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&5 -echo "$as_me: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&2;} - { (exit 1); exit 1; }; } ;; - - *) ac_config_targets="$ac_config_targets $1" ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF -if \$ac_cs_recheck; then - echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 - exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion -fi - -_ACEOF - - - - - -cat >>$CONFIG_STATUS <<\_ACEOF -for ac_config_target in $ac_config_targets -do - case "$ac_config_target" in - # Handling of arguments. - "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; - "examples/Makefile" ) CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;; - "shlib/Makefile" ) CONFIG_FILES="$CONFIG_FILES shlib/Makefile" ;; - "default" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;; - "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; - *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 -echo "$as_me: error: invalid argument: $ac_config_target" >&2;} - { (exit 1); exit 1; }; };; - esac -done - -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -# We use the long form for the default assignment because of an extremely -# bizarre bug on SunOS 4.1.3. -if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files - test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers - test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason to put it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Create a temporary directory, and hook for its removal unless debugging. -$debug || -{ - trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 - trap '{ (exit 1); exit 1; }' 1 2 13 15 -} - -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && - test -n "$tmp" && test -d "$tmp" -} || -{ - tmp=./confstat$$-$RANDOM - (umask 077 && mkdir $tmp) -} || -{ - echo "$me: cannot create a temporary directory in ." >&2 - { (exit 1); exit 1; } -} - -_ACEOF - -cat >>$CONFIG_STATUS <<_ACEOF - -# -# CONFIG_FILES section. -# - -# No need to generate the scripts if there are no CONFIG_FILES. -# This happens for instance when ./config.status config.h -if test -n "\$CONFIG_FILES"; then - # Protect against being on the right side of a sed subst in config.status. - sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; - s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF -s,@SHELL@,$SHELL,;t t -s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t -s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t -s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t -s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t -s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t -s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t -s,@exec_prefix@,$exec_prefix,;t t -s,@prefix@,$prefix,;t t -s,@program_transform_name@,$program_transform_name,;t t -s,@bindir@,$bindir,;t t -s,@sbindir@,$sbindir,;t t -s,@libexecdir@,$libexecdir,;t t -s,@datadir@,$datadir,;t t -s,@sysconfdir@,$sysconfdir,;t t -s,@sharedstatedir@,$sharedstatedir,;t t -s,@localstatedir@,$localstatedir,;t t -s,@libdir@,$libdir,;t t -s,@includedir@,$includedir,;t t -s,@oldincludedir@,$oldincludedir,;t t -s,@infodir@,$infodir,;t t -s,@mandir@,$mandir,;t t -s,@build_alias@,$build_alias,;t t -s,@host_alias@,$host_alias,;t t -s,@target_alias@,$target_alias,;t t -s,@DEFS@,$DEFS,;t t -s,@ECHO_C@,$ECHO_C,;t t -s,@ECHO_N@,$ECHO_N,;t t -s,@ECHO_T@,$ECHO_T,;t t -s,@LIBS@,$LIBS,;t t -s,@build@,$build,;t t -s,@build_cpu@,$build_cpu,;t t -s,@build_vendor@,$build_vendor,;t t -s,@build_os@,$build_os,;t t -s,@host@,$host,;t t -s,@host_cpu@,$host_cpu,;t t -s,@host_vendor@,$host_vendor,;t t -s,@host_os@,$host_os,;t t -s,@SET_MAKE@,$SET_MAKE,;t t -s,@CC@,$CC,;t t -s,@CFLAGS@,$CFLAGS,;t t -s,@LDFLAGS@,$LDFLAGS,;t t -s,@CPPFLAGS@,$CPPFLAGS,;t t -s,@ac_ct_CC@,$ac_ct_CC,;t t -s,@EXEEXT@,$EXEEXT,;t t -s,@OBJEXT@,$OBJEXT,;t t -s,@CPP@,$CPP,;t t -s,@EGREP@,$EGREP,;t t -s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t -s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t -s,@INSTALL_DATA@,$INSTALL_DATA,;t t -s,@AR@,$AR,;t t -s,@RANLIB@,$RANLIB,;t t -s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t -s,@MAKE_SHELL@,$MAKE_SHELL,;t t -s,@SHOBJ_CC@,$SHOBJ_CC,;t t -s,@SHOBJ_CFLAGS@,$SHOBJ_CFLAGS,;t t -s,@SHOBJ_LD@,$SHOBJ_LD,;t t -s,@SHOBJ_LDFLAGS@,$SHOBJ_LDFLAGS,;t t -s,@SHOBJ_XLDFLAGS@,$SHOBJ_XLDFLAGS,;t t -s,@SHOBJ_LIBS@,$SHOBJ_LIBS,;t t -s,@SHOBJ_STATUS@,$SHOBJ_STATUS,;t t -s,@SHLIB_STATUS@,$SHLIB_STATUS,;t t -s,@SHLIB_XLDFLAGS@,$SHLIB_XLDFLAGS,;t t -s,@SHLIB_LIBSUFF@,$SHLIB_LIBSUFF,;t t -s,@SHLIB_LIBVERSION@,$SHLIB_LIBVERSION,;t t -s,@SHLIB_LIBS@,$SHLIB_LIBS,;t t -s,@SHLIB_MAJOR@,$SHLIB_MAJOR,;t t -s,@SHLIB_MINOR@,$SHLIB_MINOR,;t t -s,@STATIC_TARGET@,$STATIC_TARGET,;t t -s,@SHARED_TARGET@,$SHARED_TARGET,;t t -s,@STATIC_INSTALL_TARGET@,$STATIC_INSTALL_TARGET,;t t -s,@SHARED_INSTALL_TARGET@,$SHARED_INSTALL_TARGET,;t t -s,@BUILD_DIR@,$BUILD_DIR,;t t -s,@LOCAL_CFLAGS@,$LOCAL_CFLAGS,;t t -s,@LOCAL_LDFLAGS@,$LOCAL_LDFLAGS,;t t -s,@LOCAL_DEFS@,$LOCAL_DEFS,;t t -s,@ARFLAGS@,$ARFLAGS,;t t -s,@LIBVERSION@,$LIBVERSION,;t t -s,@TERMCAP_LIB@,$TERMCAP_LIB,;t t -s,@LIBOBJS@,$LIBOBJS,;t t -s,@LTLIBOBJS@,$LTLIBOBJS,;t t -CEOF - -_ACEOF - - cat >>$CONFIG_STATUS <<\_ACEOF - # Split the substitutions into bite-sized pieces for seds with - # small command number limits, like on Digital OSF/1 and HP-UX. - ac_max_sed_lines=48 - ac_sed_frag=1 # Number of current file. - ac_beg=1 # First line for current file. - ac_end=$ac_max_sed_lines # Line after last line for current file. - ac_more_lines=: - ac_sed_cmds= - while $ac_more_lines; do - if test $ac_beg -gt 1; then - sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag - else - sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag - fi - if test ! -s $tmp/subs.frag; then - ac_more_lines=false - else - # The purpose of the label and of the branching condition is to - # speed up the sed processing (if there are no `@' at all, there - # is no need to browse any of the substitutions). - # These are the two extra sed commands mentioned above. - (echo ':t - /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed - if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" - else - ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" - fi - ac_sed_frag=`expr $ac_sed_frag + 1` - ac_beg=$ac_end - ac_end=`expr $ac_end + $ac_max_sed_lines` - fi - done - if test -z "$ac_sed_cmds"; then - ac_sed_cmds=cat - fi -fi # test -n "$CONFIG_FILES" - -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF -for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case $ac_file in - - | *:- | *:-:* ) # input from stdin - cat >$tmp/stdin - ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - * ) ac_file_in=$ac_file.in ;; - esac - - # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. - ac_dir=`(dirname "$ac_file") 2>/dev/null || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else - as_dir="$ac_dir" - as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} - { (exit 1); exit 1; }; }; } - - ac_builddir=. - -if test "$ac_dir" != .; then - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi - -case $srcdir in - .) # No --srcdir option. We are building in place. - ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; -esac -# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be -# absolute. -ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` -ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` -ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` -ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` - - - case $INSTALL in - [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_builddir$INSTALL ;; - esac - - if test x"$ac_file" != x-; then - { echo "$as_me:$LINENO: creating $ac_file" >&5 -echo "$as_me: creating $ac_file" >&6;} - rm -f "$ac_file" - fi - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - if test x"$ac_file" = x-; then - configure_input= - else - configure_input="$ac_file. " - fi - configure_input=$configure_input"Generated from `echo $ac_file_in | - sed 's,.*/,,'` by configure." - - # First look for the input files in the build tree, otherwise in the - # src tree. - ac_file_inputs=`IFS=: - for f in $ac_file_in; do - case $f in - -) echo $tmp/stdin ;; - [\\/$]*) - # Absolute (can't be DOS-style, as IFS=:) - test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - echo $f;; - *) # Relative - if test -f "$f"; then - # Build tree - echo $f - elif test -f "$srcdir/$f"; then - # Source tree - echo $srcdir/$f - else - # /dev/null tree - { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - fi;; - esac - done` || { (exit 1); exit 1; } -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF - sed "$ac_vpsub -$extrasub -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s,@configure_input@,$configure_input,;t t -s,@srcdir@,$ac_srcdir,;t t -s,@abs_srcdir@,$ac_abs_srcdir,;t t -s,@top_srcdir@,$ac_top_srcdir,;t t -s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t -s,@builddir@,$ac_builddir,;t t -s,@abs_builddir@,$ac_abs_builddir,;t t -s,@top_builddir@,$ac_top_builddir,;t t -s,@abs_top_builddir@,$ac_abs_top_builddir,;t t -s,@INSTALL@,$ac_INSTALL,;t t -" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out - rm -f $tmp/stdin - if test x"$ac_file" != x-; then - mv $tmp/out $ac_file - else - cat $tmp/out - rm -f $tmp/out - fi - -done -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF - -# -# CONFIG_HEADER section. -# - -# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where -# NAME is the cpp macro being defined and VALUE is the value it is being given. -# -# ac_d sets the value in "#define NAME VALUE" lines. -ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' -ac_dB='[ ].*$,\1#\2' -ac_dC=' ' -ac_dD=',;t' -# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". -ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_uB='$,\1#\2define\3' -ac_uC=' ' -ac_uD=',;t' - -for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case $ac_file in - - | *:- | *:-:* ) # input from stdin - cat >$tmp/stdin - ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - * ) ac_file_in=$ac_file.in ;; - esac - - test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 -echo "$as_me: creating $ac_file" >&6;} - - # First look for the input files in the build tree, otherwise in the - # src tree. - ac_file_inputs=`IFS=: - for f in $ac_file_in; do - case $f in - -) echo $tmp/stdin ;; - [\\/$]*) - # Absolute (can't be DOS-style, as IFS=:) - test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - echo $f;; - *) # Relative - if test -f "$f"; then - # Build tree - echo $f - elif test -f "$srcdir/$f"; then - # Source tree - echo $srcdir/$f - else - # /dev/null tree - { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - fi;; - esac - done` || { (exit 1); exit 1; } - # Remove the trailing spaces. - sed 's/[ ]*$//' $ac_file_inputs >$tmp/in - -_ACEOF - -# Transform confdefs.h into two sed scripts, `conftest.defines' and -# `conftest.undefs', that substitutes the proper values into -# config.h.in to produce config.h. The first handles `#define' -# templates, and the second `#undef' templates. -# And first: Protect against being on the right side of a sed subst in -# config.status. Protect against being in an unquoted here document -# in config.status. -rm -f conftest.defines conftest.undefs -# Using a here document instead of a string reduces the quoting nightmare. -# Putting comments in sed scripts is not portable. -# -# `end' is used to avoid that the second main sed command (meant for -# 0-ary CPP macros) applies to n-ary macro definitions. -# See the Autoconf documentation for `clear'. -cat >confdef2sed.sed <<\_ACEOF -s/[\\&,]/\\&/g -s,[\\$`],\\&,g -t clear -: clear -s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp -t end -s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp -: end -_ACEOF -# If some macros were called several times there might be several times -# the same #defines, which is useless. Nevertheless, we may not want to -# sort them, since we want the *last* AC-DEFINE to be honored. -uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines -sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs -rm -f confdef2sed.sed - -# This sed command replaces #undef with comments. This is necessary, for -# example, in the case of _POSIX_SOURCE, which is predefined and required -# on some systems where configure will not decide to define it. -cat >>conftest.undefs <<\_ACEOF -s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, -_ACEOF - -# Break up conftest.defines because some shells have a limit on the size -# of here documents, and old seds have small limits too (100 cmds). -echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS -echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS -echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS -echo ' :' >>$CONFIG_STATUS -rm -f conftest.tail -while grep . conftest.defines >/dev/null -do - # Write a limited-size here document to $tmp/defines.sed. - echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS - # Speed up: don't consider the non `#define' lines. - echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS - # Work around the forget-to-reset-the-flag bug. - echo 't clr' >>$CONFIG_STATUS - echo ': clr' >>$CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS - echo 'CEOF - sed -f $tmp/defines.sed $tmp/in >$tmp/out - rm -f $tmp/in - mv $tmp/out $tmp/in -' >>$CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail - rm -f conftest.defines - mv conftest.tail conftest.defines -done -rm -f conftest.defines -echo ' fi # grep' >>$CONFIG_STATUS -echo >>$CONFIG_STATUS - -# Break up conftest.undefs because some shells have a limit on the size -# of here documents, and old seds have small limits too (100 cmds). -echo ' # Handle all the #undef templates' >>$CONFIG_STATUS -rm -f conftest.tail -while grep . conftest.undefs >/dev/null -do - # Write a limited-size here document to $tmp/undefs.sed. - echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS - # Speed up: don't consider the non `#undef' - echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS - # Work around the forget-to-reset-the-flag bug. - echo 't clr' >>$CONFIG_STATUS - echo ': clr' >>$CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS - echo 'CEOF - sed -f $tmp/undefs.sed $tmp/in >$tmp/out - rm -f $tmp/in - mv $tmp/out $tmp/in -' >>$CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail - rm -f conftest.undefs - mv conftest.tail conftest.undefs -done -rm -f conftest.undefs - -cat >>$CONFIG_STATUS <<\_ACEOF - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - if test x"$ac_file" = x-; then - echo "/* Generated by configure. */" >$tmp/config.h - else - echo "/* $ac_file. Generated by configure. */" >$tmp/config.h - fi - cat $tmp/in >>$tmp/config.h - rm -f $tmp/in - if test x"$ac_file" != x-; then - if diff $ac_file $tmp/config.h >/dev/null 2>&1; then - { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 -echo "$as_me: $ac_file is unchanged" >&6;} - else - ac_dir=`(dirname "$ac_file") 2>/dev/null || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else - as_dir="$ac_dir" - as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} - { (exit 1); exit 1; }; }; } - - rm -f $ac_file - mv $tmp/config.h $ac_file - fi - else - cat $tmp/config.h - rm -f $tmp/config.h - fi -done -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF - -# -# CONFIG_COMMANDS section. -# -for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue - ac_dest=`echo "$ac_file" | sed 's,:.*,,'` - ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_dir=`(dirname "$ac_dest") 2>/dev/null || -$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_dest" : 'X\(//\)[^/]' \| \ - X"$ac_dest" : 'X\(//\)$' \| \ - X"$ac_dest" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$ac_dest" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - ac_builddir=. - -if test "$ac_dir" != .; then - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi - -case $srcdir in - .) # No --srcdir option. We are building in place. - ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; -esac -# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be -# absolute. -ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` -ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` -ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` -ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` - - - { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 -echo "$as_me: executing $ac_dest commands" >&6;} - case $ac_dest in - default ) -# Makefile uses this timestamp file to record whether config.h is up to date. -echo > stamp-h - ;; - esac -done -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF - -{ (exit 0); exit 0; } -_ACEOF -chmod +x $CONFIG_STATUS -ac_clean_files=$ac_clean_files_save - - -# configure is writing to config.log, and then calls config.status. -# config.status does its own redirection, appending to config.log. -# Unfortunately, on DOS this fails, as config.log is still kept open -# by configure, so config.status won't be able to write to it; its -# output is simply discarded. So we exec the FD to /dev/null, -# effectively closing config.log, so it can be properly (re)opened and -# appended to by config.status. When coming back to configure, we -# need to make the FD available again. -if test "$no_create" != yes; then - ac_cs_success=: - ac_config_status_args= - test "$silent" = yes && - ac_config_status_args="$ac_config_status_args --quiet" - exec 5>/dev/null - $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false - exec 5>>config.log - # Use ||, not &&, to avoid exiting from the if with $? = 1, which - # would make configure fail if this is the last instruction. - $ac_cs_success || { (exit 1); exit 1; } -fi - diff --git a/dep/src/readline/src/configure.in b/dep/src/readline/src/configure.in deleted file mode 100644 index 31e17606024..00000000000 --- a/dep/src/readline/src/configure.in +++ /dev/null @@ -1,215 +0,0 @@ -dnl -dnl Configure script for readline library -dnl -dnl report bugs to chet@po.cwru.edu -dnl -dnl Process this file with autoconf to produce a configure script. -AC_REVISION([for Readline 5.0, version 2.52, from autoconf version] AC_ACVERSION) - -AC_INIT(readline, 5.0-rc1, bug-readline@gnu.org) - -dnl make sure we are using a recent autoconf version -AC_PREREQ(2.50) - -AC_CONFIG_SRCDIR(readline.h) -AC_CONFIG_AUX_DIR(./support) -AC_CONFIG_HEADERS(config.h) - -dnl update the value of RL_READLINE_VERSION in readline.h when this changes -LIBVERSION=5.0 - -AC_CANONICAL_HOST - -dnl configure defaults -opt_curses=no - -dnl arguments to configure -AC_ARG_WITH(curses, AC_HELP_STRING([--with-curses], [use the curses library instead of the termcap library]), opt_curses=$withval) - -if test "$opt_curses" = "yes"; then - prefer_curses=yes -fi - -dnl option parsing for optional features -opt_multibyte=yes -opt_static_libs=yes -opt_shared_libs=yes - -AC_ARG_ENABLE(multibyte, AC_HELP_STRING([--enable-multibyte], [enable multibyte characters if OS supports them]), opt_multibyte=$enableval) -AC_ARG_ENABLE(shared, AC_HELP_STRING([--enable-shared], [build shared libraries [[default=YES]]]), opt_shared_libs=$enableval) -AC_ARG_ENABLE(static, AC_HELP_STRING([--enable-static], [build static libraries [[default=YES]]]), opt_static_libs=$enableval) - -if test $opt_multibyte = no; then -AC_DEFINE(NO_MULTIBYTE_SUPPORT) -fi - -echo "" -echo "Beginning configuration for readline-$LIBVERSION for ${host_cpu}-${host_vendor}-${host_os}" -echo "" - -# We want these before the checks, so the checks can modify their values. -test -z "$CFLAGS" && CFLAGS=-g auto_cflags=1 - -AC_PROG_MAKE_SET -AC_PROG_CC -dnl AC_AIX -AC_MINIX - -# If we're using gcc and the user hasn't specified CFLAGS, add -O to CFLAGS. -test -n "$GCC" && test -n "$auto_cflags" && CFLAGS="$CFLAGS -O" - -AC_PROG_GCC_TRADITIONAL -AC_PROG_INSTALL -AC_CHECK_PROG(AR, ar, , ar) -dnl Set default for ARFLAGS, since autoconf does not have a macro for it. -dnl This allows people to set it when running configure or make -test -n "$ARFLAGS" || ARFLAGS="cr" -AC_PROG_RANLIB - -MAKE_SHELL=/bin/sh -AC_SUBST(MAKE_SHELL) - -AC_C_CONST -AC_C_PROTOTYPES -AC_C_CHAR_UNSIGNED - -AC_TYPE_SIGNAL - -AC_TYPE_SIZE_T -AC_CHECK_TYPE(ssize_t, int) - -AC_HEADER_STDC - -AC_HEADER_STAT -AC_HEADER_DIRENT - -AC_CHECK_FUNCS(lstat memmove putenv select setenv setlocale \ - strcasecmp strpbrk tcgetattr vsnprintf isascii isxdigit) - -AC_FUNC_STRCOLL - -AC_CHECK_HEADERS(unistd.h stdlib.h varargs.h stdarg.h string.h strings.h \ - limits.h sys/ptem.h sys/pte.h sys/stream.h sys/select.h \ - termcap.h termios.h termio.h sys/file.h locale.h memory.h ) - -BASH_SYS_SIGNAL_VINTAGE -BASH_SYS_REINSTALL_SIGHANDLERS - -BASH_FUNC_POSIX_SETJMP -BASH_FUNC_LSTAT -BASH_FUNC_STRCOLL -BASH_FUNC_CTYPE_NONASCII - -BASH_CHECK_GETPW_FUNCS - -AC_HEADER_TIOCGWINSZ - -BASH_TYPE_SIGHANDLER -BASH_HAVE_TIOCSTAT -BASH_HAVE_FIONREAD -BASH_CHECK_SPEED_T -BASH_STRUCT_WINSIZE -BASH_STRUCT_DIRENT_D_INO -BASH_STRUCT_DIRENT_D_FILENO - -dnl yuck -case "$host_os" in -aix*) prefer_curses=yes ;; -esac -BASH_CHECK_LIB_TERMCAP -if test "$TERMCAP_LIB" = "./lib/termcap/libtermcap.a"; then - if test "$prefer_curses" = yes; then - TERMCAP_LIB=-lcurses - else - TERMCAP_LIB=-ltermcap #default - fi -fi - -BASH_CHECK_MULTIBYTE - -case "$host_cpu" in -*cray*) LOCAL_CFLAGS=-DCRAY ;; -*s390*) LOCAL_CFLAGS=-fsigned-char ;; -esac - -case "$host_os" in -isc*) LOCAL_CFLAGS=-Disc386 ;; -esac - -# shared library configuration section -# -# Shared object configuration section. These values are generated by -# ${srcdir}/support/shobj-conf -# -if test -f ${srcdir}/support/shobj-conf; then - AC_MSG_CHECKING(configuration for building shared libraries) - eval `${CONFIG_SHELL-/bin/sh} ${srcdir}/support/shobj-conf -C "${CC}" -c ${host_cpu} -o ${host_os} -v ${host_vendor}` - AC_SUBST(SHOBJ_CC) - AC_SUBST(SHOBJ_CFLAGS) - AC_SUBST(SHOBJ_LD) - AC_SUBST(SHOBJ_LDFLAGS) - AC_SUBST(SHOBJ_XLDFLAGS) - AC_SUBST(SHOBJ_LIBS) - AC_SUBST(SHOBJ_STATUS) - AC_SUBST(SHLIB_STATUS) - AC_SUBST(SHLIB_XLDFLAGS) - AC_SUBST(SHLIB_LIBSUFF) - AC_SUBST(SHLIB_LIBVERSION) - AC_SUBST(SHLIB_LIBS) - AC_MSG_RESULT($SHLIB_STATUS) - - # SHLIB_STATUS is either `supported' or `unsupported'. If it's - # `unsupported', turn off any default shared library building - if test "$SHLIB_STATUS" = 'unsupported'; then - opt_shared_libs=no - fi - - # shared library versioning - # quoted for m4 so I can use character classes - SHLIB_MAJOR=[`expr "$LIBVERSION" : '\([0-9]\)\..*'`] - SHLIB_MINOR=[`expr "$LIBVERSION" : '[0-9]\.\([0-9]\).*'`] - AC_SUBST(SHLIB_MAJOR) - AC_SUBST(SHLIB_MINOR) -fi - -if test "$opt_static_libs" = "yes"; then - STATIC_TARGET=static - STATIC_INSTALL_TARGET=install-static -fi -if test "$opt_shared_libs" = "yes"; then - SHARED_TARGET=shared - SHARED_INSTALL_TARGET=install-shared -fi - -AC_SUBST(STATIC_TARGET) -AC_SUBST(SHARED_TARGET) -AC_SUBST(STATIC_INSTALL_TARGET) -AC_SUBST(SHARED_INSTALL_TARGET) - -case "$host_os" in -msdosdjgpp*) BUILD_DIR=`pwd.exe` ;; # to prevent //d/path/file -*) BUILD_DIR=`pwd` ;; -esac - -AC_SUBST(BUILD_DIR) - -AC_SUBST(CFLAGS) -AC_SUBST(LOCAL_CFLAGS) -AC_SUBST(LOCAL_LDFLAGS) -AC_SUBST(LOCAL_DEFS) - -AC_SUBST(AR) -AC_SUBST(ARFLAGS) - -AC_SUBST(host_cpu) -AC_SUBST(host_os) - -AC_SUBST(LIBVERSION) - -AC_SUBST(TERMCAP_LIB) - -AC_OUTPUT([Makefile doc/Makefile examples/Makefile shlib/Makefile], -[ -# Makefile uses this timestamp file to record whether config.h is up to date. -echo > stamp-h -]) diff --git a/dep/src/readline/src/display.c b/dep/src/readline/src/display.c deleted file mode 100644 index ce3f0aba05a..00000000000 --- a/dep/src/readline/src/display.c +++ /dev/null @@ -1,2379 +0,0 @@ -/* display.c -- readline redisplay facility. */ - -/* Copyright (C) 1987-2004 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ -#define READLINE_LIBRARY - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#include - -#if defined (HAVE_UNISTD_H) -# include -#endif /* HAVE_UNISTD_H */ - -#include "posixstat.h" - -#if defined (HAVE_STDLIB_H) -# include -#else -# include "ansi_stdlib.h" -#endif /* HAVE_STDLIB_H */ - -#include - -#ifdef __MSDOS__ -# include -#endif - -/* System-specific feature definitions and include files. */ -#include "rldefs.h" -#include "rlmbutil.h" - -/* Termcap library stuff. */ -#include "tcap.h" - -/* Some standard library routines. */ -#include "readline.h" -#include "history.h" - -#include "rlprivate.h" -#include "xmalloc.h" - -#if defined (_WIN32) -#include -extern int haveConsole; -extern HANDLE hStdout, hStdin; -extern COORD rlScreenEnd; -extern int rlScreenMax; -#endif /* _WIN32 */ - -#if !defined (strchr) && !defined (__STDC__) && !defined (_WIN32) -extern char *strchr (), *strrchr (); -#endif /* !strchr && !__STDC__ */ - -#if defined (HACK_TERMCAP_MOTION) -extern char *_rl_term_forward_char; -#endif - -static void update_line PARAMS((char *, char *, int, int, int, int)); -static void space_to_eol PARAMS((int)); -static void delete_chars PARAMS((int)); -static void insert_some_chars PARAMS((char *, int, int)); -static void cr PARAMS((void)); - -#ifdef _WIN32 -# define putc(ch, stream) \ -if ((ch) == '\r') cr (); else _rl_output_character_function (ch) -#endif - -#if defined (HANDLE_MULTIBYTE) -static int _rl_col_width PARAMS((const char *, int, int)); -static int *_rl_wrapped_line; -#else -# define _rl_col_width(l, s, e) (((e) <= (s)) ? 0 : (e) - (s)) -#endif - -static int *inv_lbreaks, *vis_lbreaks; -static int inv_lbsize, vis_lbsize; - -/* Heuristic used to decide whether it is faster to move from CUR to NEW - by backing up or outputting a carriage return and moving forward. */ -#define CR_FASTER(new, cur) (((new) + 1) < ((cur) - (new))) - -/* **************************************************************** */ -/* */ -/* Display stuff */ -/* */ -/* **************************************************************** */ - -/* This is the stuff that is hard for me. I never seem to write good - display routines in C. Let's see how I do this time. */ - -/* (PWP) Well... Good for a simple line updater, but totally ignores - the problems of input lines longer than the screen width. - - update_line and the code that calls it makes a multiple line, - automatically wrapping line update. Careful attention needs - to be paid to the vertical position variables. */ - -/* Keep two buffers; one which reflects the current contents of the - screen, and the other to draw what we think the new contents should - be. Then compare the buffers, and make whatever changes to the - screen itself that we should. Finally, make the buffer that we - just drew into be the one which reflects the current contents of the - screen, and place the cursor where it belongs. - - Commands that want to can fix the display themselves, and then let - this function know that the display has been fixed by setting the - RL_DISPLAY_FIXED variable. This is good for efficiency. */ - -/* Application-specific redisplay function. */ -rl_voidfunc_t *rl_redisplay_function = rl_redisplay; - -/* Global variables declared here. */ -/* What YOU turn on when you have handled all redisplay yourself. */ -int rl_display_fixed = 0; - -int _rl_suppress_redisplay = 0; - -/* The stuff that gets printed out before the actual text of the line. - This is usually pointing to rl_prompt. */ -char *rl_display_prompt = (char *)NULL; - -/* Pseudo-global variables declared here. */ -/* The visible cursor position. If you print some text, adjust this. */ -int _rl_last_c_pos = 0; -int _rl_last_v_pos = 0; - -/* Number of lines currently on screen minus 1. */ -int _rl_vis_botlin = 0; - -/* Variables used only in this file. */ -/* The last left edge of text that was displayed. This is used when - doing horizontal scrolling. It shifts in thirds of a screenwidth. */ -static int last_lmargin; - -/* The line display buffers. One is the line currently displayed on - the screen. The other is the line about to be displayed. */ -static char *visible_line = (char *)NULL; -static char *invisible_line = (char *)NULL; - -/* A buffer for `modeline' messages. */ -static char msg_buf[128]; - -/* Non-zero forces the redisplay even if we thought it was unnecessary. */ -static int forced_display; - -/* Default and initial buffer size. Can grow. */ -static int line_size = 1024; - -/* Variables to keep track of the expanded prompt string, which may - include invisible characters. */ - -static char *local_prompt, *local_prompt_prefix; -static int prompt_visible_length, prompt_prefix_length; - -/* The number of invisible characters in the line currently being - displayed on the screen. */ -static int visible_wrap_offset; - -/* The number of invisible characters in the prompt string. Static so it - can be shared between rl_redisplay and update_line */ -static int wrap_offset; - -/* The index of the last invisible character in the prompt string. */ -static int prompt_last_invisible; - -/* The length (buffer offset) of the first line of the last (possibly - multi-line) buffer displayed on the screen. */ -static int visible_first_line_len; - -/* Number of invisible characters on the first physical line of the prompt. - Only valid when the number of physical characters in the prompt exceeds - (or is equal to) _rl_screenwidth. */ -static int prompt_invis_chars_first_line; - -static int prompt_last_screen_line; - -static int prompt_physical_chars; - -/* Expand the prompt string S and return the number of visible - characters in *LP, if LP is not null. This is currently more-or-less - a placeholder for expansion. LIP, if non-null is a place to store the - index of the last invisible character in the returned string. NIFLP, - if non-zero, is a place to store the number of invisible characters in - the first prompt line. The previous are used as byte counts -- indexes - into a character buffer. */ - -/* Current implementation: - \001 (^A) start non-visible characters - \002 (^B) end non-visible characters - all characters except \001 and \002 (following a \001) are copied to - the returned string; all characters except those between \001 and - \002 are assumed to be `visible'. */ - -static char * -expand_prompt (pmt, lp, lip, niflp, vlp) - char *pmt; - int *lp, *lip, *niflp, *vlp; -{ - char *r, *ret, *p; - int l, rl, last, ignoring, ninvis, invfl, physchars; - - /* Short-circuit if we can. */ - if ((MB_CUR_MAX <= 1 || rl_byte_oriented) && strchr (pmt, RL_PROMPT_START_IGNORE) == 0) - { - r = savestring (pmt); - if (lp) - *lp = (int)strlen (r); - if (lip) - *lip = 0; - if (niflp) - *niflp = 0; - if (vlp) - *vlp = lp ? *lp : (int)strlen (r); - return r; - } - - l = (int)strlen (pmt); - r = ret = (char *)xmalloc (l + 1); - - invfl = 0; /* invisible chars in first line of prompt */ - - for (rl = ignoring = last = ninvis = physchars = 0, p = pmt; p && *p; p++) - { - /* This code strips the invisible character string markers - RL_PROMPT_START_IGNORE and RL_PROMPT_END_IGNORE */ - if (*p == RL_PROMPT_START_IGNORE) - { - ignoring++; - continue; - } - else if (ignoring && *p == RL_PROMPT_END_IGNORE) - { - ignoring = 0; - last = (int)(r - ret) - 1; - continue; - } - else - { -#if defined (HANDLE_MULTIBYTE) - int ind, pind; - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - { - pind = p - pmt; - ind = _rl_find_next_mbchar (pmt, pind, 1, MB_FIND_NONZERO); - l = ind - pind; - while (l--) - *r++ = *p++; - if (!ignoring) - rl += ind - pind; - else - ninvis += ind - pind; - p--; /* compensate for later increment */ - } - else -#endif - { - *r++ = *p; - if (!ignoring) - rl++; /* visible length byte counter */ - else - ninvis++; /* invisible chars byte counter */ - } - - if (rl >= _rl_screenwidth) - invfl = ninvis; - - if (ignoring == 0) - physchars++; - } - } - - if (rl < _rl_screenwidth) - invfl = ninvis; - - *r = '\0'; - if (lp) - *lp = rl; - if (lip) - *lip = last; - if (niflp) - *niflp = invfl; - if (vlp) - *vlp = physchars; - return ret; -} - -/* Just strip out RL_PROMPT_START_IGNORE and RL_PROMPT_END_IGNORE from - PMT and return the rest of PMT. */ -char * -_rl_strip_prompt (pmt) - char *pmt; -{ - char *ret; - - ret = expand_prompt (pmt, (int *)NULL, (int *)NULL, (int *)NULL, (int *)NULL); - return ret; -} - -/* - * Expand the prompt string into the various display components, if - * necessary. - * - * local_prompt = expanded last line of string in rl_display_prompt - * (portion after the final newline) - * local_prompt_prefix = portion before last newline of rl_display_prompt, - * expanded via expand_prompt - * prompt_visible_length = number of visible characters in local_prompt - * prompt_prefix_length = number of visible characters in local_prompt_prefix - * - * This function is called once per call to readline(). It may also be - * called arbitrarily to expand the primary prompt. - * - * The return value is the number of visible characters on the last line - * of the (possibly multi-line) prompt. - */ -int -rl_expand_prompt (prompt) - char *prompt; -{ - char *p, *t; - int c; - - /* Clear out any saved values. */ - FREE (local_prompt); - FREE (local_prompt_prefix); - - local_prompt = local_prompt_prefix = (char *)0; - prompt_last_invisible = prompt_visible_length = 0; - - if (prompt == 0 || *prompt == 0) - return (0); - - p = strrchr (prompt, '\n'); - if (!p) - { - /* The prompt is only one logical line, though it might wrap. */ - local_prompt = expand_prompt (prompt, &prompt_visible_length, - &prompt_last_invisible, - &prompt_invis_chars_first_line, - &prompt_physical_chars); - local_prompt_prefix = (char *)0; - return (prompt_visible_length); - } - else - { - /* The prompt spans multiple lines. */ - t = ++p; - local_prompt = expand_prompt (p, &prompt_visible_length, - &prompt_last_invisible, - (int *)NULL, - (int *)NULL); - c = *t; *t = '\0'; - /* The portion of the prompt string up to and including the - final newline is now null-terminated. */ - local_prompt_prefix = expand_prompt (prompt, &prompt_prefix_length, - (int *)NULL, - &prompt_invis_chars_first_line, - &prompt_physical_chars); - *t = c; - return (prompt_prefix_length); - } -} - -/* Initialize the VISIBLE_LINE and INVISIBLE_LINE arrays, and their associated - arrays of line break markers. MINSIZE is the minimum size of VISIBLE_LINE - and INVISIBLE_LINE; if it is greater than LINE_SIZE, LINE_SIZE is - increased. If the lines have already been allocated, this ensures that - they can hold at least MINSIZE characters. */ -static void -init_line_structures (minsize) - int minsize; -{ - register int n; - - if (invisible_line == 0) /* initialize it */ - { - if (line_size < minsize) - line_size = minsize; - visible_line = (char *)xmalloc (line_size); - invisible_line = (char *)xmalloc (line_size); - } - else if (line_size < minsize) /* ensure it can hold MINSIZE chars */ - { - line_size *= 2; - if (line_size < minsize) - line_size = minsize; - visible_line = (char *)xrealloc (visible_line, line_size); - invisible_line = (char *)xrealloc (invisible_line, line_size); - } - - for (n = minsize; n < line_size; n++) - { - visible_line[n] = 0; - invisible_line[n] = 1; - } - - if (vis_lbreaks == 0) - { - /* should be enough. */ - inv_lbsize = vis_lbsize = 256; - inv_lbreaks = (int *)xmalloc (inv_lbsize * sizeof (int)); - vis_lbreaks = (int *)xmalloc (vis_lbsize * sizeof (int)); -#if defined (HANDLE_MULTIBYTE) - _rl_wrapped_line = (int *)xmalloc (vis_lbsize * sizeof (int)); -#endif - inv_lbreaks[0] = vis_lbreaks[0] = 0; - } -} - -/* Basic redisplay algorithm. */ -void -rl_redisplay () -{ - register int in, out, c, linenum, cursor_linenum; - register char *line; - int c_pos, inv_botlin, lb_botlin, lb_linenum; - int newlines, lpos, temp, modmark; - char *prompt_this_line; -#if defined (HANDLE_MULTIBYTE) - wchar_t wc; - size_t wc_bytes; - int wc_width; - mbstate_t ps; - int _rl_wrapped_multicolumn = 0; -#endif - - if (!readline_echoing_p) - return; - - if (!rl_display_prompt) - rl_display_prompt = ""; - - if (invisible_line == 0) - { - init_line_structures (0); - rl_on_new_line (); - } - - /* Draw the line into the buffer. */ - c_pos = -1; - - line = invisible_line; - out = inv_botlin = 0; - - /* Mark the line as modified or not. We only do this for history - lines. */ - modmark = 0; - if (_rl_mark_modified_lines && current_history () && rl_undo_list) - { - line[out++] = '*'; - line[out] = '\0'; - modmark = 1; - } - - /* If someone thought that the redisplay was handled, but the currently - visible line has a different modification state than the one about - to become visible, then correct the caller's misconception. */ - if (visible_line[0] != invisible_line[0]) - rl_display_fixed = 0; - - /* If the prompt to be displayed is the `primary' readline prompt (the - one passed to readline()), use the values we have already expanded. - If not, use what's already in rl_display_prompt. WRAP_OFFSET is the - number of non-visible characters in the prompt string. */ - if (rl_display_prompt == rl_prompt || local_prompt) - { - int local_len = local_prompt ? (int)strlen (local_prompt) : 0; - if (local_prompt_prefix && forced_display) - _rl_output_some_chars (local_prompt_prefix, (int)strlen (local_prompt_prefix)); - - if (local_len > 0) - { - temp = local_len + out + 2; - if (temp >= line_size) - { - line_size = (temp + 1024) - (temp % 1024); - visible_line = (char *)xrealloc (visible_line, line_size); - line = invisible_line = (char *)xrealloc (invisible_line, line_size); - } - strncpy (line + out, local_prompt, local_len); - out += local_len; - } - line[out] = '\0'; - wrap_offset = local_len - prompt_visible_length; - } - else - { - int pmtlen; - prompt_this_line = strrchr (rl_display_prompt, '\n'); - if (!prompt_this_line) - prompt_this_line = rl_display_prompt; - else - { - prompt_this_line++; - pmtlen = (int)(prompt_this_line - rl_display_prompt); /* temp var */ - if (forced_display) - { - _rl_output_some_chars (rl_display_prompt, pmtlen); - /* Make sure we are at column zero even after a newline, - regardless of the state of terminal output processing. */ - if (pmtlen < 2 || prompt_this_line[-2] != '\r') - cr (); - } - } - - prompt_physical_chars = pmtlen = (int)strlen (prompt_this_line); - temp = pmtlen + out + 2; - if (temp >= line_size) - { - line_size = (temp + 1024) - (temp % 1024); - visible_line = (char *)xrealloc (visible_line, line_size); - line = invisible_line = (char *)xrealloc (invisible_line, line_size); - } - strncpy (line + out, prompt_this_line, pmtlen); - out += pmtlen; - line[out] = '\0'; - wrap_offset = prompt_invis_chars_first_line = 0; - } - -#define CHECK_INV_LBREAKS() \ - do { \ - if (newlines >= (inv_lbsize - 2)) \ - { \ - inv_lbsize *= 2; \ - inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \ - } \ - } while (0) - -#if defined (HANDLE_MULTIBYTE) -#define CHECK_LPOS() \ - do { \ - lpos++; \ - if (lpos >= _rl_screenwidth) \ - { \ - if (newlines >= (inv_lbsize - 2)) \ - { \ - inv_lbsize *= 2; \ - inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \ - _rl_wrapped_line = (int *)xrealloc (_rl_wrapped_line, inv_lbsize * sizeof (int)); \ - } \ - inv_lbreaks[++newlines] = out; \ - _rl_wrapped_line[newlines] = _rl_wrapped_multicolumn; \ - lpos = 0; \ - } \ - } while (0) -#else -#define CHECK_LPOS() \ - do { \ - lpos++; \ - if (lpos >= _rl_screenwidth) \ - { \ - if (newlines >= (inv_lbsize - 2)) \ - { \ - inv_lbsize *= 2; \ - inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \ - } \ - inv_lbreaks[++newlines] = out; \ - lpos = 0; \ - } \ - } while (0) -#endif - - /* inv_lbreaks[i] is where line i starts in the buffer. */ - inv_lbreaks[newlines = 0] = 0; -#if 0 - lpos = out - wrap_offset; -#else - lpos = prompt_physical_chars + modmark; -#endif - -#if defined (HANDLE_MULTIBYTE) - memset (_rl_wrapped_line, 0, vis_lbsize); -#endif - - /* prompt_invis_chars_first_line is the number of invisible characters in - the first physical line of the prompt. - wrap_offset - prompt_invis_chars_first_line is the number of invis - chars on the second line. */ - - /* what if lpos is already >= _rl_screenwidth before we start drawing the - contents of the command line? */ - while (lpos >= _rl_screenwidth) - { - /* fix from Darin Johnson for prompt string with - invisible characters that is longer than the screen width. The - prompt_invis_chars_first_line variable could be made into an array - saying how many invisible characters there are per line, but that's - probably too much work for the benefit gained. How many people have - prompts that exceed two physical lines? - Additional logic fix from Edward Catmur */ - temp = ((newlines + 1) * _rl_screenwidth) + - ((local_prompt_prefix == 0) ? ((newlines == 0) ? prompt_invis_chars_first_line - : ((newlines == 1) ? wrap_offset : 0)) - : ((newlines == 0) ? wrap_offset :0)); - - inv_lbreaks[++newlines] = temp; - lpos -= _rl_screenwidth; - } - - prompt_last_screen_line = newlines; - - /* Draw the rest of the line (after the prompt) into invisible_line, keeping - track of where the cursor is (c_pos), the number of the line containing - the cursor (lb_linenum), the last line number (lb_botlin and inv_botlin). - It maintains an array of line breaks for display (inv_lbreaks). - This handles expanding tabs for display and displaying meta characters. */ - lb_linenum = 0; -#if defined (HANDLE_MULTIBYTE) - in = 0; - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - { - memset (&ps, 0, sizeof (mbstate_t)); - wc_bytes = mbrtowc (&wc, rl_line_buffer, rl_end, &ps); - } - else - wc_bytes = 1; - while (in < rl_end) -#else - for (in = 0; in < rl_end; in++) -#endif - { - c = (unsigned char)rl_line_buffer[in]; - -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - { - if (MB_INVALIDCH (wc_bytes)) - { - /* Byte sequence is invalid or shortened. Assume that the - first byte represents a character. */ - wc_bytes = 1; - /* Assume that a character occupies a single column. */ - wc_width = 1; - memset (&ps, 0, sizeof (mbstate_t)); - } - else if (MB_NULLWCH (wc_bytes)) - break; /* Found '\0' */ - else - { - temp = wcwidth (wc); - wc_width = (temp >= 0) ? temp : 1; - } - } -#endif - - if (out + 8 >= line_size) /* XXX - 8 for \t */ - { - line_size *= 2; - visible_line = (char *)xrealloc (visible_line, line_size); - invisible_line = (char *)xrealloc (invisible_line, line_size); - line = invisible_line; - } - - if (in == rl_point) - { - c_pos = out; - lb_linenum = newlines; - } - -#if defined (HANDLE_MULTIBYTE) - if (META_CHAR (c) && _rl_output_meta_chars == 0) /* XXX - clean up */ -#else - if (META_CHAR (c)) -#endif - { - if (_rl_output_meta_chars == 0) - { - sprintf (line + out, "\\%o", c); - - if (lpos + 4 >= _rl_screenwidth) - { - temp = _rl_screenwidth - lpos; - CHECK_INV_LBREAKS (); - inv_lbreaks[++newlines] = out + temp; - lpos = 4 - temp; - } - else - lpos += 4; - - out += 4; - } - else - { - line[out++] = c; - CHECK_LPOS(); - } - } -#if defined (DISPLAY_TABS) - else if (c == '\t') - { - register int newout; - -#if 0 - newout = (out | (int)7) + 1; -#else - newout = out + 8 - lpos % 8; -#endif - temp = newout - out; - if (lpos + temp >= _rl_screenwidth) - { - register int temp2; - temp2 = _rl_screenwidth - lpos; - CHECK_INV_LBREAKS (); - inv_lbreaks[++newlines] = out + temp2; - lpos = temp - temp2; - while (out < newout) - line[out++] = ' '; - } - else - { - while (out < newout) - line[out++] = ' '; - lpos += temp; - } - } -#endif - else if (c == '\n' && _rl_horizontal_scroll_mode == 0 && _rl_term_up && *_rl_term_up) - { - line[out++] = '\0'; /* XXX - sentinel */ - CHECK_INV_LBREAKS (); - inv_lbreaks[++newlines] = out; - lpos = 0; - } - else if (CTRL_CHAR (c) || c == RUBOUT) - { - line[out++] = '^'; - CHECK_LPOS(); - line[out++] = CTRL_CHAR (c) ? UNCTRL (c) : '?'; - CHECK_LPOS(); - } - else - { -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - { - register int i; - - _rl_wrapped_multicolumn = 0; - - if (_rl_screenwidth < lpos + wc_width) - for (i = lpos; i < _rl_screenwidth; i++) - { - /* The space will be removed in update_line() */ - line[out++] = ' '; - _rl_wrapped_multicolumn++; - CHECK_LPOS(); - } - if (in == rl_point) - { - c_pos = out; - lb_linenum = newlines; - } - for (i = in; i < in+wc_bytes; i++) - line[out++] = rl_line_buffer[i]; - for (i = 0; i < wc_width; i++) - CHECK_LPOS(); - } - else - { - line[out++] = c; - CHECK_LPOS(); - } -#else - line[out++] = c; - CHECK_LPOS(); -#endif - } - -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - { - in += wc_bytes; - wc_bytes = mbrtowc (&wc, rl_line_buffer + in, rl_end - in, &ps); - } - else - in++; -#endif - - } - line[out] = '\0'; - if (c_pos < 0) - { - c_pos = out; - lb_linenum = newlines; - } - - inv_botlin = lb_botlin = newlines; - CHECK_INV_LBREAKS (); - inv_lbreaks[newlines+1] = out; - cursor_linenum = lb_linenum; - - /* C_POS == position in buffer where cursor should be placed. - CURSOR_LINENUM == line number where the cursor should be placed. */ - - /* PWP: now is when things get a bit hairy. The visible and invisible - line buffers are really multiple lines, which would wrap every - (screenwidth - 1) characters. Go through each in turn, finding - the changed region and updating it. The line order is top to bottom. */ - - /* If we can move the cursor up and down, then use multiple lines, - otherwise, let long lines display in a single terminal line, and - horizontally scroll it. */ - - if (_rl_horizontal_scroll_mode == 0 && _rl_term_up && *_rl_term_up) - { - int nleft, pos, changed_screen_line; - - if (!rl_display_fixed || forced_display) - { - forced_display = 0; - - /* If we have more than a screenful of material to display, then - only display a screenful. We should display the last screen, - not the first. */ - if (out >= _rl_screenchars) - { - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - out = _rl_find_prev_mbchar (line, _rl_screenchars, MB_FIND_ANY); - else - out = _rl_screenchars - 1; - } - - /* The first line is at character position 0 in the buffer. The - second and subsequent lines start at inv_lbreaks[N], offset by - OFFSET (which has already been calculated above). */ - -#define W_OFFSET(line, offset) ((line) == 0 ? offset : 0) -#define VIS_LLEN(l) ((l) > _rl_vis_botlin ? 0 : (vis_lbreaks[l+1] - vis_lbreaks[l])) -#define INV_LLEN(l) (inv_lbreaks[l+1] - inv_lbreaks[l]) -#define VIS_CHARS(line) (visible_line + vis_lbreaks[line]) -#define VIS_LINE(line) ((line) > _rl_vis_botlin) ? "" : VIS_CHARS(line) -#define INV_LINE(line) (invisible_line + inv_lbreaks[line]) - - /* For each line in the buffer, do the updating display. */ - for (linenum = 0; linenum <= inv_botlin; linenum++) - { - update_line (VIS_LINE(linenum), INV_LINE(linenum), linenum, - VIS_LLEN(linenum), INV_LLEN(linenum), inv_botlin); - - /* If this is the line with the prompt, we might need to - compensate for invisible characters in the new line. Do - this only if there is not more than one new line (which - implies that we completely overwrite the old visible line) - and the new line is shorter than the old. Make sure we are - at the end of the new line before clearing. */ - if (linenum == 0 && - inv_botlin == 0 && _rl_last_c_pos == out && - (wrap_offset > visible_wrap_offset) && - (_rl_last_c_pos < visible_first_line_len)) - { - nleft = _rl_screenwidth + wrap_offset - _rl_last_c_pos; - if (nleft) - _rl_clear_to_eol (nleft); - } - - /* Since the new first line is now visible, save its length. */ - if (linenum == 0) - visible_first_line_len = (inv_botlin > 0) ? inv_lbreaks[1] : out - wrap_offset; - } - - /* We may have deleted some lines. If so, clear the left over - blank ones at the bottom out. */ - if (_rl_vis_botlin > inv_botlin) - { - char *tt; - for (; linenum <= _rl_vis_botlin; linenum++) - { - tt = VIS_CHARS (linenum); - _rl_move_vert (linenum); - _rl_move_cursor_relative (0, tt); - _rl_clear_to_eol - ((linenum == _rl_vis_botlin) ? (int)strlen (tt) : _rl_screenwidth); - } - } - _rl_vis_botlin = inv_botlin; - - /* CHANGED_SCREEN_LINE is set to 1 if we have moved to a - different screen line during this redisplay. */ - changed_screen_line = _rl_last_v_pos != cursor_linenum; - if (changed_screen_line) - { - _rl_move_vert (cursor_linenum); - /* If we moved up to the line with the prompt using _rl_term_up, - the physical cursor position on the screen stays the same, - but the buffer position needs to be adjusted to account - for invisible characters. */ - if (cursor_linenum == 0 && wrap_offset) - _rl_last_c_pos += wrap_offset; - } - - /* We have to reprint the prompt if it contains invisible - characters, since it's not generally OK to just reprint - the characters from the current cursor position. But we - only need to reprint it if the cursor is before the last - invisible character in the prompt string. */ - nleft = prompt_visible_length + wrap_offset; - if (cursor_linenum == 0 && wrap_offset > 0 && _rl_last_c_pos > 0 && - _rl_last_c_pos <= prompt_last_invisible && local_prompt) - { -#if defined (__MSDOS__) || defined (_WIN32) - putc ('\r', rl_outstream); -#else - if (_rl_term_cr) - tputs (_rl_term_cr, 1, _rl_output_character_function); -#endif - _rl_output_some_chars (local_prompt, nleft); - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - _rl_last_c_pos = _rl_col_width (local_prompt, 0, nleft); - else - _rl_last_c_pos = nleft; - } - - /* Where on that line? And where does that line start - in the buffer? */ - pos = inv_lbreaks[cursor_linenum]; - /* nleft == number of characters in the line buffer between the - start of the line and the cursor position. */ - nleft = c_pos - pos; - - /* Since _rl_backspace() doesn't know about invisible characters in the - prompt, and there's no good way to tell it, we compensate for - those characters here and call _rl_backspace() directly. */ - if (wrap_offset && cursor_linenum == 0 && nleft < _rl_last_c_pos) - { - _rl_backspace (_rl_last_c_pos - nleft); - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - _rl_last_c_pos = _rl_col_width (&visible_line[pos], 0, nleft); - else - _rl_last_c_pos = nleft; - } - - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - _rl_move_cursor_relative (nleft, &invisible_line[pos]); - else if (nleft != _rl_last_c_pos) - _rl_move_cursor_relative (nleft, &invisible_line[pos]); - } - } - else /* Do horizontal scrolling. */ - { -#define M_OFFSET(margin, offset) ((margin) == 0 ? offset : 0) - int lmargin, ndisp, nleft, phys_c_pos, t; - - /* Always at top line. */ - _rl_last_v_pos = 0; - - /* Compute where in the buffer the displayed line should start. This - will be LMARGIN. */ - - /* The number of characters that will be displayed before the cursor. */ - ndisp = c_pos - wrap_offset; - nleft = prompt_visible_length + wrap_offset; - /* Where the new cursor position will be on the screen. This can be - longer than SCREENWIDTH; if it is, lmargin will be adjusted. */ - phys_c_pos = c_pos - (last_lmargin ? last_lmargin : wrap_offset); - t = _rl_screenwidth / 3; - - /* If the number of characters had already exceeded the screenwidth, - last_lmargin will be > 0. */ - - /* If the number of characters to be displayed is more than the screen - width, compute the starting offset so that the cursor is about - two-thirds of the way across the screen. */ - if (phys_c_pos > _rl_screenwidth - 2) - { - lmargin = c_pos - (2 * t); - if (lmargin < 0) - lmargin = 0; - /* If the left margin would be in the middle of a prompt with - invisible characters, don't display the prompt at all. */ - if (wrap_offset && lmargin > 0 && lmargin < nleft) - lmargin = nleft; - } - else if (ndisp < _rl_screenwidth - 2) /* XXX - was -1 */ - lmargin = 0; - else if (phys_c_pos < 1) - { - /* If we are moving back towards the beginning of the line and - the last margin is no longer correct, compute a new one. */ - lmargin = ((c_pos - 1) / t) * t; /* XXX */ - if (wrap_offset && lmargin > 0 && lmargin < nleft) - lmargin = nleft; - } - else - lmargin = last_lmargin; - - /* If the first character on the screen isn't the first character - in the display line, indicate this with a special character. */ - if (lmargin > 0) - line[lmargin] = '<'; - - /* If SCREENWIDTH characters starting at LMARGIN do not encompass - the whole line, indicate that with a special character at the - right edge of the screen. If LMARGIN is 0, we need to take the - wrap offset into account. */ - t = lmargin + M_OFFSET (lmargin, wrap_offset) + _rl_screenwidth; - if (t < out) - line[t - 1] = '>'; - - if (!rl_display_fixed || forced_display || lmargin != last_lmargin) - { - forced_display = 0; - update_line (&visible_line[last_lmargin], - &invisible_line[lmargin], - 0, - _rl_screenwidth + visible_wrap_offset, - _rl_screenwidth + (lmargin ? 0 : wrap_offset), - 0); - - /* If the visible new line is shorter than the old, but the number - of invisible characters is greater, and we are at the end of - the new line, we need to clear to eol. */ - t = _rl_last_c_pos - M_OFFSET (lmargin, wrap_offset); - if ((M_OFFSET (lmargin, wrap_offset) > visible_wrap_offset) && - (_rl_last_c_pos == out) && - t < visible_first_line_len) - { - nleft = _rl_screenwidth - t; - _rl_clear_to_eol (nleft); - } - visible_first_line_len = out - lmargin - M_OFFSET (lmargin, wrap_offset); - if (visible_first_line_len > _rl_screenwidth) - visible_first_line_len = _rl_screenwidth; - - _rl_move_cursor_relative (c_pos - lmargin, &invisible_line[lmargin]); - last_lmargin = lmargin; - } - } - fflush (rl_outstream); - - /* Swap visible and non-visible lines. */ - { - char *vtemp = visible_line; - int *itemp = vis_lbreaks, ntemp = vis_lbsize; - - visible_line = invisible_line; - invisible_line = vtemp; - - vis_lbreaks = inv_lbreaks; - inv_lbreaks = itemp; - - vis_lbsize = inv_lbsize; - inv_lbsize = ntemp; - - rl_display_fixed = 0; - /* If we are displaying on a single line, and last_lmargin is > 0, we - are not displaying any invisible characters, so set visible_wrap_offset - to 0. */ - if (_rl_horizontal_scroll_mode && last_lmargin) - visible_wrap_offset = 0; - else - visible_wrap_offset = wrap_offset; - } -} - -/* PWP: update_line() is based on finding the middle difference of each - line on the screen; vis: - - /old first difference - /beginning of line | /old last same /old EOL - v v v v -old: eddie> Oh, my little gruntle-buggy is to me, as lurgid as -new: eddie> Oh, my little buggy says to me, as lurgid as - ^ ^ ^ ^ - \beginning of line | \new last same \new end of line - \new first difference - - All are character pointers for the sake of speed. Special cases for - no differences, as well as for end of line additions must be handled. - - Could be made even smarter, but this works well enough */ -static void -update_line (old, new, current_line, omax, nmax, inv_botlin) - register char *old, *new; - int current_line, omax, nmax, inv_botlin; -{ - register char *ofd, *ols, *oe, *nfd, *nls, *ne; - int temp, lendiff, wsatend, od, nd; - int current_invis_chars; - int col_lendiff, col_temp; -#if defined (HANDLE_MULTIBYTE) - mbstate_t ps_new, ps_old; - int new_offset, old_offset, tmp; -#endif - - /* If we're at the right edge of a terminal that supports xn, we're - ready to wrap around, so do so. This fixes problems with knowing - the exact cursor position and cut-and-paste with certain terminal - emulators. In this calculation, TEMP is the physical screen - position of the cursor. */ - temp = _rl_last_c_pos - W_OFFSET(_rl_last_v_pos, visible_wrap_offset); - if (temp == _rl_screenwidth && _rl_term_autowrap && !_rl_horizontal_scroll_mode - && _rl_last_v_pos == current_line - 1) - { -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - { - wchar_t wc; - mbstate_t ps; - int tempwidth, bytes; - size_t ret; - - /* This fixes only double-column characters, but if the wrapped - character comsumes more than three columns, spaces will be - inserted in the string buffer. */ - if (_rl_wrapped_line[current_line] > 0) - _rl_clear_to_eol (_rl_wrapped_line[current_line]); - - memset (&ps, 0, sizeof (mbstate_t)); - ret = mbrtowc (&wc, new, MB_CUR_MAX, &ps); - if (MB_INVALIDCH (ret)) - { - tempwidth = 1; - ret = 1; - } - else if (MB_NULLWCH (ret)) - tempwidth = 0; - else - tempwidth = wcwidth (wc); - - if (tempwidth > 0) - { - int count; - bytes = ret; - for (count = 0; count < bytes; count++) - putc (new[count], rl_outstream); - _rl_last_c_pos = tempwidth; - _rl_last_v_pos++; - memset (&ps, 0, sizeof (mbstate_t)); - ret = mbrtowc (&wc, old, MB_CUR_MAX, &ps); - if (ret != 0 && bytes != 0) - { - if (MB_INVALIDCH (ret)) - memmove (old+bytes, old+1, strlen (old+1)); - else - memmove (old+bytes, old+ret, strlen (old+ret)); - memcpy (old, new, bytes); - } - } - else - { - putc (' ', rl_outstream); - _rl_last_c_pos = 1; - _rl_last_v_pos++; - if (old[0] && new[0]) - old[0] = new[0]; - } - } - else -#endif - { - if (new[0]) - putc (new[0], rl_outstream); - else - putc (' ', rl_outstream); - _rl_last_c_pos = 1; /* XXX */ - _rl_last_v_pos++; - if (old[0] && new[0]) - old[0] = new[0]; - } - } - - - /* Find first difference. */ -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - { - /* See if the old line is a subset of the new line, so that the - only change is adding characters. */ - temp = (omax < nmax) ? omax : nmax; - if (memcmp (old, new, temp) == 0) - { - ofd = old + temp; - nfd = new + temp; - } - else - { - memset (&ps_new, 0, sizeof(mbstate_t)); - memset (&ps_old, 0, sizeof(mbstate_t)); - - if (omax == nmax && STREQN (new, old, omax)) - { - ofd = old + omax; - nfd = new + nmax; - } - else - { - new_offset = old_offset = 0; - for (ofd = old, nfd = new; - (ofd - old < omax) && *ofd && - _rl_compare_chars(old, old_offset, &ps_old, new, new_offset, &ps_new); ) - { - old_offset = _rl_find_next_mbchar (old, old_offset, 1, MB_FIND_ANY); - new_offset = _rl_find_next_mbchar (new, new_offset, 1, MB_FIND_ANY); - ofd = old + old_offset; - nfd = new + new_offset; - } - } - } - } - else -#endif - for (ofd = old, nfd = new; - (ofd - old < omax) && *ofd && (*ofd == *nfd); - ofd++, nfd++) - ; - - /* Move to the end of the screen line. ND and OD are used to keep track - of the distance between ne and new and oe and old, respectively, to - move a subtraction out of each loop. */ - for (od = (int)(ofd - old), oe = ofd; od < omax && *oe; oe++, od++); - for (nd = (int)(nfd - new), ne = nfd; nd < nmax && *ne; ne++, nd++); - - /* If no difference, continue to next line. */ - if (ofd == oe && nfd == ne) - return; - - wsatend = 1; /* flag for trailing whitespace */ - -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - { - ols = old + _rl_find_prev_mbchar (old, oe - old, MB_FIND_ANY); - nls = new + _rl_find_prev_mbchar (new, ne - new, MB_FIND_ANY); - while ((ols > ofd) && (nls > nfd)) - { - memset (&ps_old, 0, sizeof (mbstate_t)); - memset (&ps_new, 0, sizeof (mbstate_t)); - -#if 0 - /* On advice from jir@yamato.ibm.com */ - _rl_adjust_point (old, ols - old, &ps_old); - _rl_adjust_point (new, nls - new, &ps_new); -#endif - - if (_rl_compare_chars (old, ols - old, &ps_old, new, nls - new, &ps_new) == 0) - break; - - if (*ols == ' ') - wsatend = 0; - - ols = old + _rl_find_prev_mbchar (old, ols - old, MB_FIND_ANY); - nls = new + _rl_find_prev_mbchar (new, nls - new, MB_FIND_ANY); - } - } - else - { -#endif /* HANDLE_MULTIBYTE */ - ols = oe - 1; /* find last same */ - nls = ne - 1; - while ((ols > ofd) && (nls > nfd) && (*ols == *nls)) - { - if (*ols != ' ') - wsatend = 0; - ols--; - nls--; - } -#if defined (HANDLE_MULTIBYTE) - } -#endif - - if (wsatend) - { - ols = oe; - nls = ne; - } -#if defined (HANDLE_MULTIBYTE) - /* This may not work for stateful encoding, but who cares? To handle - stateful encoding properly, we have to scan each string from the - beginning and compare. */ - else if (_rl_compare_chars (ols, 0, NULL, nls, 0, NULL) == 0) -#else - else if (*ols != *nls) -#endif - { - if (*ols) /* don't step past the NUL */ - { - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - ols = old + _rl_find_next_mbchar (old, ols - old, 1, MB_FIND_ANY); - else - ols++; - } - if (*nls) - { - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - nls = new + _rl_find_next_mbchar (new, nls - new, 1, MB_FIND_ANY); - else - nls++; - } - } - - /* count of invisible characters in the current invisible line. */ - current_invis_chars = W_OFFSET (current_line, wrap_offset); - if (_rl_last_v_pos != current_line) - { - _rl_move_vert (current_line); - if (current_line == 0 && visible_wrap_offset) - _rl_last_c_pos += visible_wrap_offset; - } - - /* If this is the first line and there are invisible characters in the - prompt string, and the prompt string has not changed, and the current - cursor position is before the last invisible character in the prompt, - and the index of the character to move to is past the end of the prompt - string, then redraw the entire prompt string. We can only do this - reliably if the terminal supports a `cr' capability. - - This is not an efficiency hack -- there is a problem with redrawing - portions of the prompt string if they contain terminal escape - sequences (like drawing the `unbold' sequence without a corresponding - `bold') that manifests itself on certain terminals. */ - - lendiff = local_prompt ? (int)strlen (local_prompt) : 0; - od = (int)(ofd - old); /* index of first difference in visible line */ - if (current_line == 0 && !_rl_horizontal_scroll_mode && - _rl_term_cr && lendiff > prompt_visible_length && _rl_last_c_pos > 0 && - od >= lendiff && _rl_last_c_pos <= prompt_last_invisible) - { -#if defined (__MSDOS__) || defined (_WIN32) - putc ('\r', rl_outstream); -#else - tputs (_rl_term_cr, 1, _rl_output_character_function); -#endif - _rl_output_some_chars (local_prompt, lendiff); - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - _rl_last_c_pos = _rl_col_width (local_prompt, 0, lendiff); - else - _rl_last_c_pos = lendiff; - } - - _rl_move_cursor_relative (od, old); - - /* if (len (new) > len (old)) - lendiff == difference in buffer - col_lendiff == difference on screen - When not using multibyte characters, these are equal */ - lendiff = (int)(nls - nfd) - (int)(ols - ofd); - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - col_lendiff = _rl_col_width (new, (int)(nfd - new), (int)(nls - new)) - _rl_col_width (old, (int)(ofd - old), (int)(ols - old)); - else - col_lendiff = lendiff; - - /* If we are changing the number of invisible characters in a line, and - the spot of first difference is before the end of the invisible chars, - lendiff needs to be adjusted. */ - if (current_line == 0 && !_rl_horizontal_scroll_mode && - current_invis_chars != visible_wrap_offset) - { - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - { - lendiff += visible_wrap_offset - current_invis_chars; - col_lendiff += visible_wrap_offset - current_invis_chars; - } - else - { - lendiff += visible_wrap_offset - current_invis_chars; - col_lendiff = lendiff; - } - } - - /* Insert (diff (len (old), len (new)) ch. */ - temp = (int)(ne - nfd); - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - col_temp = _rl_col_width (new, (int)(nfd - new), (int)(ne - new)); - else - col_temp = temp; - - if (col_lendiff > 0) /* XXX - was lendiff */ - { -#ifndef _WIN32 - /* Non-zero if we're increasing the number of lines. */ - int gl = current_line >= _rl_vis_botlin && inv_botlin > _rl_vis_botlin; - /* Sometimes it is cheaper to print the characters rather than - use the terminal's capabilities. If we're growing the number - of lines, make sure we actually cause the new line to wrap - around on auto-wrapping terminals. */ - if (_rl_terminal_can_insert && ((2 * col_temp) >= col_lendiff || _rl_term_IC) && (!_rl_term_autowrap || !gl)) - { - /* If lendiff > prompt_visible_length and _rl_last_c_pos == 0 and - _rl_horizontal_scroll_mode == 1, inserting the characters with - _rl_term_IC or _rl_term_ic will screw up the screen because of the - invisible characters. We need to just draw them. */ - if (*ols && (!_rl_horizontal_scroll_mode || _rl_last_c_pos > 0 || - lendiff <= prompt_visible_length || !current_invis_chars)) - { - insert_some_chars (nfd, lendiff, col_lendiff); - _rl_last_c_pos += col_lendiff; - } - else if (*ols == 0 && lendiff > 0) - { - /* At the end of a line the characters do not have to - be "inserted". They can just be placed on the screen. */ - /* However, this screws up the rest of this block, which - assumes you've done the insert because you can. */ - _rl_output_some_chars (nfd, lendiff); - _rl_last_c_pos += col_lendiff; - } - else - { - /* We have horizontal scrolling and we are not inserting at - the end. We have invisible characters in this line. This - is a dumb update. */ - _rl_output_some_chars (nfd, temp); - _rl_last_c_pos += col_temp; - return; - } - /* Copy (new) chars to screen from first diff to last match. */ - temp = nls - nfd; - if ((temp - lendiff) > 0) - { - _rl_output_some_chars (nfd + lendiff, temp - lendiff); -#if 1 - /* XXX -- this bears closer inspection. Fixes a redisplay bug - reported against bash-3.0-alpha by Andreas Schwab involving - multibyte characters and prompt strings with invisible - characters, but was previously disabled. */ - _rl_last_c_pos += _rl_col_width (nfd+lendiff, 0, temp-col_lendiff); -#else - _rl_last_c_pos += _rl_col_width (nfd+lendiff, 0, temp-lendiff); -#endif - } - } - else -#endif /* !_WIN32 */ - { - /* cannot insert chars, write to EOL */ - _rl_output_some_chars (nfd, temp); - _rl_last_c_pos += col_temp; - } - } - else /* Delete characters from line. */ - { -#ifndef _WIN32 - /* If possible and inexpensive to use terminal deletion, then do so. */ - if (_rl_term_dc && (2 * col_temp) >= -col_lendiff) - { - /* If all we're doing is erasing the invisible characters in the - prompt string, don't bother. It screws up the assumptions - about what's on the screen. */ - if (_rl_horizontal_scroll_mode && _rl_last_c_pos == 0 && - -lendiff == visible_wrap_offset) - col_lendiff = 0; - - if (col_lendiff) - delete_chars (-col_lendiff); /* delete (diff) characters */ - - /* Copy (new) chars to screen from first diff to last match */ - temp = nls - nfd; - if (temp > 0) - { - _rl_output_some_chars (nfd, temp); - _rl_last_c_pos += _rl_col_width (nfd, 0, temp);; - } - } - /* Otherwise, print over the existing material. */ - else -#endif /* !_WIN32 */ - { - if (temp > 0) - { - _rl_output_some_chars (nfd, temp); - _rl_last_c_pos += col_temp; - } - lendiff = (int)(oe - old) - (int)(ne - new); - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - col_lendiff = _rl_col_width (old, 0, (int)(oe - old)) - _rl_col_width (new, 0, (int)(ne - new)); - else - col_lendiff = lendiff; - - if (col_lendiff) - { - if (_rl_term_autowrap && current_line < inv_botlin) - space_to_eol (col_lendiff); - else - _rl_clear_to_eol (col_lendiff); - } - } - } -} - -/* Tell the update routines that we have moved onto a new (empty) line. */ -int -rl_on_new_line () -{ - if (visible_line) - visible_line[0] = '\0'; - - _rl_last_c_pos = _rl_last_v_pos = 0; - _rl_vis_botlin = last_lmargin = 0; - if (vis_lbreaks) - vis_lbreaks[0] = vis_lbreaks[1] = 0; - visible_wrap_offset = 0; - return 0; -} - -/* Tell the update routines that we have moved onto a new line with the - prompt already displayed. Code originally from the version of readline - distributed with CLISP. rl_expand_prompt must have already been called - (explicitly or implicitly). This still doesn't work exactly right. */ -int -rl_on_new_line_with_prompt () -{ - int prompt_size, i, l, real_screenwidth, newlines; - char *prompt_last_line, *lprompt; - - /* Initialize visible_line and invisible_line to ensure that they can hold - the already-displayed prompt. */ - prompt_size = (int)strlen (rl_prompt) + 1; - init_line_structures (prompt_size); - - /* Make sure the line structures hold the already-displayed prompt for - redisplay. */ - lprompt = local_prompt ? local_prompt : rl_prompt; - strcpy (visible_line, lprompt); - strcpy (invisible_line, lprompt); - - /* If the prompt contains newlines, take the last tail. */ - prompt_last_line = strrchr (rl_prompt, '\n'); - if (!prompt_last_line) - prompt_last_line = rl_prompt; - - l = (int)strlen (prompt_last_line); - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - _rl_last_c_pos = _rl_col_width (prompt_last_line, 0, l); - else - _rl_last_c_pos = l; - - /* Dissect prompt_last_line into screen lines. Note that here we have - to use the real screenwidth. Readline's notion of screenwidth might be - one less, see terminal.c. */ - real_screenwidth = _rl_screenwidth + (_rl_term_autowrap ? 0 : 1); - _rl_last_v_pos = l / real_screenwidth; - /* If the prompt length is a multiple of real_screenwidth, we don't know - whether the cursor is at the end of the last line, or already at the - beginning of the next line. Output a newline just to be safe. */ - if (l > 0 && (l % real_screenwidth) == 0) - _rl_output_some_chars ("\n", 1); - last_lmargin = 0; - - newlines = 0; i = 0; - while (i <= l) - { - _rl_vis_botlin = newlines; - vis_lbreaks[newlines++] = i; - i += real_screenwidth; - } - vis_lbreaks[newlines] = l; - visible_wrap_offset = 0; - - rl_display_prompt = rl_prompt; /* XXX - make sure it's set */ - - return 0; -} - -/* Actually update the display, period. */ -int -rl_forced_update_display () -{ - if (visible_line) - { - register char *temp = visible_line; - - while (*temp) - *temp++ = '\0'; - } - rl_on_new_line (); - forced_display++; - (*rl_redisplay_function) (); - return 0; -} - -/* Move the cursor from _rl_last_c_pos to NEW, which are buffer indices. - DATA is the contents of the screen line of interest; i.e., where - the movement is being done. */ -void -_rl_move_cursor_relative (new, data) - int new; - const char *data; -{ -#ifdef _WIN32 - CONSOLE_SCREEN_BUFFER_INFO csbi; - if ( (_rl_last_c_pos != new) - && haveConsole && GetConsoleScreenBufferInfo(hStdout, &csbi) ) - { - csbi.dwCursorPosition.X += new - _rl_last_c_pos; - if ( SetConsoleCursorPosition(hStdout, csbi.dwCursorPosition) ) - _rl_last_c_pos = new; - } -#else /* _WIN32 */ - register int i; - - /* If we don't have to do anything, then return. */ -#if defined (HANDLE_MULTIBYTE) - /* If we have multibyte characters, NEW is indexed by the buffer point in - a multibyte string, but _rl_last_c_pos is the display position. In - this case, NEW's display position is not obvious and must be - calculated. */ - if (MB_CUR_MAX == 1 || rl_byte_oriented) - { - if (_rl_last_c_pos == new) - return; - } - else if (_rl_last_c_pos == _rl_col_width (data, 0, new)) - return; -#else - if (_rl_last_c_pos == new) return; -#endif - - /* It may be faster to output a CR, and then move forwards instead - of moving backwards. */ - /* i == current physical cursor position. */ - i = _rl_last_c_pos - W_OFFSET(_rl_last_v_pos, visible_wrap_offset); - if (new == 0 || CR_FASTER (new, _rl_last_c_pos) || - (_rl_term_autowrap && i == _rl_screenwidth)) - { -#if defined (__MSDOS__) || defined (_WIN32) - putc ('\r', rl_outstream); -#else - tputs (_rl_term_cr, 1, _rl_output_character_function); -#endif /* !__MSDOS__ */ - _rl_last_c_pos = 0; - } - - if (_rl_last_c_pos < new) - { - /* Move the cursor forward. We do it by printing the command - to move the cursor forward if there is one, else print that - portion of the output buffer again. Which is cheaper? */ - - /* The above comment is left here for posterity. It is faster - to print one character (non-control) than to print a control - sequence telling the terminal to move forward one character. - That kind of control is for people who don't know what the - data is underneath the cursor. */ -#if defined (HACK_TERMCAP_MOTION) - if (_rl_term_forward_char) - { - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - { - int width; - width = _rl_col_width (data, _rl_last_c_pos, new); - for (i = 0; i < width; i++) - tputs (_rl_term_forward_char, 1, _rl_output_character_function); - } - else - { - for (i = _rl_last_c_pos; i < new; i++) - tputs (_rl_term_forward_char, 1, _rl_output_character_function); - } - } - else if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - { - tputs (_rl_term_cr, 1, _rl_output_character_function); - for (i = 0; i < new; i++) - putc (data[i], rl_outstream); - } - else - for (i = _rl_last_c_pos; i < new; i++) - putc (data[i], rl_outstream); - -#else /* !HACK_TERMCAP_MOTION */ - - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - _rl_backspace (_rl_last_c_pos - _rl_col_width (data, 0, new)); - else - for (i = _rl_last_c_pos; i < new; i++) - putc (data[i], rl_outstream); - -#endif /* !HACK_TERMCAP_MOTION */ - - } -#if defined (HANDLE_MULTIBYTE) - /* NEW points to the buffer point, but _rl_last_c_pos is the display point. - The byte length of the string is probably bigger than the column width - of the string, which means that if NEW == _rl_last_c_pos, then NEW's - display point is less than _rl_last_c_pos. */ - else if (_rl_last_c_pos >= new) -#else - else if (_rl_last_c_pos > new) -#endif - { - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - _rl_backspace (_rl_last_c_pos - _rl_col_width (data, 0, new)); - else - _rl_backspace (_rl_last_c_pos - new); - } - - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - _rl_last_c_pos = _rl_col_width (data, 0, new); - else - _rl_last_c_pos = new; -#endif /* !_MINGW32__ */ -} - -/* PWP: move the cursor up or down. */ -void -_rl_move_vert (to) - int to; -{ -#if defined (_WIN32) - CONSOLE_SCREEN_BUFFER_INFO csbi; - if ( (_rl_last_v_pos != to) && (to <= _rl_screenheight) - && haveConsole && GetConsoleScreenBufferInfo(hStdout, &csbi) ) - { - csbi.dwCursorPosition.Y += to - _rl_last_v_pos; - if ( SetConsoleCursorPosition(hStdout, csbi.dwCursorPosition) ) - _rl_last_v_pos = to; - } -#else /* !_WIN32 */ - register int delta, i; - - if (_rl_last_v_pos == to || to > _rl_screenheight) - return; - - if ((delta = to - _rl_last_v_pos) > 0) - { - for (i = 0; i < delta; i++) - putc ('\n', rl_outstream); -#if defined (__MSDOS__) - putc ('\r', rl_outstream); -#else - tputs (_rl_term_cr, 1, _rl_output_character_function); -#endif - _rl_last_c_pos = 0; - } - else - { /* delta < 0 */ -#ifdef __MSDOS__ - int row, col; - - fflush (rl_outstream); /* make sure the cursor pos is current! */ - ScreenGetCursor (&row, &col); - ScreenSetCursor (row + delta, col); - i = -delta; /* in case someone wants to use it after the loop */ -#else /* !__MSDOS__ */ - if (_rl_term_up && *_rl_term_up) - for (i = 0; i < -delta; i++) - tputs (_rl_term_up, 1, _rl_output_character_function); -#endif /* !__MSDOS__ */ - } - - _rl_last_v_pos = to; /* Now TO is here */ -#endif /* _WIN32 */ -} - -/* Physically print C on rl_outstream. This is for functions which know - how to optimize the display. Return the number of characters output. */ -int -rl_show_char (c) - int c; -{ - int n = 1; - if (META_CHAR (c) && (_rl_output_meta_chars == 0)) - { - fprintf (rl_outstream, "M-"); - n += 2; - c = UNMETA (c); - } - -#if defined (DISPLAY_TABS) - if ((CTRL_CHAR (c) && c != '\t') || c == RUBOUT) -#else - if (CTRL_CHAR (c) || c == RUBOUT) -#endif /* !DISPLAY_TABS */ - { - fprintf (rl_outstream, "C-"); - n += 2; - c = CTRL_CHAR (c) ? UNCTRL (c) : '?'; - } - - putc (c, rl_outstream); - fflush (rl_outstream); - return n; -} - -int -rl_character_len (c, pos) - register int c, pos; -{ - unsigned char uc; - - uc = (unsigned char)c; - - if (META_CHAR (uc)) - return ((_rl_output_meta_chars == 0) ? 4 : 1); - - if (uc == '\t') - { -#if defined (DISPLAY_TABS) - return (((pos | 7) + 1) - pos); -#else - return (2); -#endif /* !DISPLAY_TABS */ - } - - if (CTRL_CHAR (c) || c == RUBOUT) - return (2); - - return ((ISPRINT (uc)) ? 1 : 2); -} - -/* How to print things in the "echo-area". The prompt is treated as a - mini-modeline. */ - -#if defined (USE_VARARGS) -int -#if defined (PREFER_STDARG) -rl_message (const char *format, ...) -#else -rl_message (va_alist) - va_dcl -#endif -{ - va_list args; -#if defined (PREFER_VARARGS) - char *format; -#endif - -#if defined (PREFER_STDARG) - va_start (args, format); -#else - va_start (args); - format = va_arg (args, char *); -#endif - -#if defined (HAVE_VSNPRINTF) - vsnprintf (msg_buf, sizeof (msg_buf) - 1, format, args); -#else - vsprintf (msg_buf, format, args); - msg_buf[sizeof(msg_buf) - 1] = '\0'; /* overflow? */ -#endif - va_end (args); - - rl_display_prompt = msg_buf; - (*rl_redisplay_function) (); - return 0; -} -#else /* !USE_VARARGS */ -int -rl_message (format, arg1, arg2) - char *format; -{ - sprintf (msg_buf, format, arg1, arg2); - msg_buf[sizeof(msg_buf) - 1] = '\0'; /* overflow? */ - rl_display_prompt = msg_buf; - (*rl_redisplay_function) (); - return 0; -} -#endif /* !USE_VARARGS */ - -/* How to clear things from the "echo-area". */ -int -rl_clear_message () -{ - rl_display_prompt = rl_prompt; - (*rl_redisplay_function) (); - return 0; -} - -int -rl_reset_line_state () -{ - rl_on_new_line (); - - rl_display_prompt = rl_prompt ? rl_prompt : ""; - forced_display = 1; - return 0; -} - -/* These are getting numerous enough that it's time to create a struct. */ - -static char *saved_local_prompt; -static char *saved_local_prefix; -static int saved_last_invisible; -static int saved_visible_length; -static int saved_invis_chars_first_line; -static int saved_physical_chars; - -void -rl_save_prompt () -{ - saved_local_prompt = local_prompt; - saved_local_prefix = local_prompt_prefix; - saved_last_invisible = prompt_last_invisible; - saved_visible_length = prompt_visible_length; - saved_invis_chars_first_line = prompt_invis_chars_first_line; - saved_physical_chars = prompt_physical_chars; - - local_prompt = local_prompt_prefix = (char *)0; - prompt_last_invisible = prompt_visible_length = 0; - prompt_invis_chars_first_line = prompt_physical_chars = 0; -} - -void -rl_restore_prompt () -{ - FREE (local_prompt); - FREE (local_prompt_prefix); - - local_prompt = saved_local_prompt; - local_prompt_prefix = saved_local_prefix; - prompt_last_invisible = saved_last_invisible; - prompt_visible_length = saved_visible_length; - prompt_invis_chars_first_line = saved_invis_chars_first_line; - prompt_physical_chars = saved_physical_chars; -} - -char * -_rl_make_prompt_for_search (pchar) - int pchar; -{ - size_t len; - char *pmt; - - rl_save_prompt (); - - if (saved_local_prompt == 0) - { - len = (rl_prompt && *rl_prompt) ? strlen (rl_prompt) : 0; - pmt = (char *)xmalloc (len + 2); - if (len) - strcpy (pmt, rl_prompt); - pmt[len] = pchar; - pmt[len+1] = '\0'; - } - else - { - len = *saved_local_prompt ? strlen (saved_local_prompt) : 0; - pmt = (char *)xmalloc (len + 2); - if (len) - strcpy (pmt, saved_local_prompt); - pmt[len] = pchar; - pmt[len+1] = '\0'; - local_prompt = savestring (pmt); - prompt_last_invisible = saved_last_invisible; - prompt_visible_length = saved_visible_length + 1; - } - - return pmt; -} - -/* Quick redisplay hack when erasing characters at the end of the line. */ -void -_rl_erase_at_end_of_line (l) - int l; -{ - register int i; - - _rl_backspace (l); - for (i = 0; i < l; i++) - putc (' ', rl_outstream); - _rl_backspace (l); - for (i = 0; i < l; i++) - visible_line[--_rl_last_c_pos] = '\0'; - rl_display_fixed++; -} - -/* Clear to the end of the line. COUNT is the minimum - number of character spaces to clear, */ -void -_rl_clear_to_eol (count) - int count; -{ -#if defined (_WIN32) - CONSOLE_SCREEN_BUFFER_INFO csbi; - if (haveConsole && GetConsoleScreenBufferInfo(hStdout, &csbi)) - { - DWORD written; - int linear_pos; - - linear_pos = (int)csbi.dwCursorPosition.Y * (int)csbi.dwSize.X - + (int)csbi.dwCursorPosition.X; - if (linear_pos < rlScreenMax) - { - rlScreenEnd = csbi.dwCursorPosition; - rlScreenMax = linear_pos; - } - FillConsoleOutputCharacter(hStdout, ' ', count, csbi.dwCursorPosition, &written); - } -#else /* !_WIN32 */ -#ifndef __MSDOS__ - if (_rl_term_clreol) - tputs (_rl_term_clreol, 1, _rl_output_character_function); - else -#endif - if (count) - space_to_eol (count); -#endif /* _WIN32 */ -} - -/* Clear to the end of the line using spaces. COUNT is the minimum - number of character spaces to clear, */ -static void -space_to_eol (count) - int count; -{ -#if defined (_WIN32) - _rl_clear_to_eol (count); -#else - register int i; - - for (i = 0; i < count; i++) - putc (' ', rl_outstream); - - _rl_last_c_pos += count; -#endif /* _WIN32 */ -} - -void -_rl_clear_screen () -{ -#if defined (__GO32__) - ScreenClear (); /* FIXME: only works in text modes */ - ScreenSetCursor (0, 0); /* term_clrpag is "cl" which homes the cursor */ -#else -#if !defined (_WIN32) - if (_rl_term_clrpag) - tputs (_rl_term_clrpag, 1, _rl_output_character_function); - else -#endif /* !_WIN32 */ - rl_crlf (); -#endif -} - -/* Insert COUNT characters from STRING to the output stream at column COL. */ -#if !defined (_WIN32) -static void -insert_some_chars (string, count, col) - char *string; - int count, col; -{ -#ifdef __MSDOS__ - _rl_output_some_chars (string, count); -#else /* !__MSDOS__ */ - /* DEBUGGING */ - if (MB_CUR_MAX == 1 || rl_byte_oriented) - if (count != col) - fprintf(stderr, "readline: debug: insert_some_chars: count (%d) != col (%d)\n", count, col); - - /* If IC is defined, then we do not have to "enter" insert mode. */ - if (_rl_term_IC) - { - char *buffer; - - buffer = tgoto (_rl_term_IC, 0, col); - tputs (buffer, 1, _rl_output_character_function); - _rl_output_some_chars (string, count); - } - else - { - register int i; - - /* If we have to turn on insert-mode, then do so. */ - if (_rl_term_im && *_rl_term_im) - tputs (_rl_term_im, 1, _rl_output_character_function); - - /* If there is a special command for inserting characters, then - use that first to open up the space. */ - if (_rl_term_ic && *_rl_term_ic) - { - for (i = col; i--; ) - tputs (_rl_term_ic, 1, _rl_output_character_function); - } - - /* Print the text. */ - _rl_output_some_chars (string, count); - - /* If there is a string to turn off insert mode, we had best use - it now. */ - if (_rl_term_ei && *_rl_term_ei) - tputs (_rl_term_ei, 1, _rl_output_character_function); - } -#endif /* !__MSDOS__ */ -} - -/* Delete COUNT characters from the display line. */ -static void -delete_chars (count) - int count; -{ - if (count > _rl_screenwidth) /* XXX */ - return; - -#ifndef __MSDOS__ - if (_rl_term_DC && *_rl_term_DC) - { - char *buffer; - buffer = tgoto (_rl_term_DC, count, count); - tputs (buffer, count, _rl_output_character_function); - } - else - { - if (_rl_term_dc && *_rl_term_dc) - while (count--) - tputs (_rl_term_dc, 1, _rl_output_character_function); - } -#endif /* !__MSDOS__ */ -} -#endif /* !_WIN32 */ - -void -_rl_update_final () -{ - int full_lines; - - full_lines = 0; - /* If the cursor is the only thing on an otherwise-blank last line, - compensate so we don't print an extra CRLF. */ - if (_rl_vis_botlin && _rl_last_c_pos == 0 && - visible_line[vis_lbreaks[_rl_vis_botlin]] == 0) - { - _rl_vis_botlin--; - full_lines = 1; - } - _rl_move_vert (_rl_vis_botlin); - /* If we've wrapped lines, remove the final xterm line-wrap flag. */ - if (full_lines && _rl_term_autowrap && (VIS_LLEN(_rl_vis_botlin) == _rl_screenwidth)) - { - char *last_line; - - last_line = &visible_line[vis_lbreaks[_rl_vis_botlin]]; - _rl_move_cursor_relative (_rl_screenwidth - 1, last_line); - _rl_clear_to_eol (0); - putc (last_line[_rl_screenwidth - 1], rl_outstream); - } - _rl_vis_botlin = 0; - rl_crlf (); - fflush (rl_outstream); - rl_display_fixed++; -} - -/* Move to the start of the current line. */ -static void -cr () -{ -#if defined (_WIN32) - _rl_move_cursor_relative (0, 0); -#else - if (_rl_term_cr) - { -#if defined (__MSDOS__) - putc ('\r', rl_outstream); -#else - tputs (_rl_term_cr, 1, _rl_output_character_function); -#endif - _rl_last_c_pos = 0; - } -#endif /* _WIN32 */ -} - -/* Redraw the last line of a multi-line prompt that may possibly contain - terminal escape sequences. Called with the cursor at column 0 of the - line to draw the prompt on. */ -static void -redraw_prompt (t) - char *t; -{ - char *oldp, *oldl, *oldlprefix; - int oldlen, oldlast, oldplen, oldninvis, oldphyschars; - - /* Geez, I should make this a struct. */ - oldp = rl_display_prompt; - oldl = local_prompt; - oldlprefix = local_prompt_prefix; - oldlen = prompt_visible_length; - oldplen = prompt_prefix_length; - oldlast = prompt_last_invisible; - oldninvis = prompt_invis_chars_first_line; - oldphyschars = prompt_physical_chars; - - rl_display_prompt = t; - local_prompt = expand_prompt (t, &prompt_visible_length, - &prompt_last_invisible, - &prompt_invis_chars_first_line, - &prompt_physical_chars); - local_prompt_prefix = (char *)NULL; - rl_forced_update_display (); - - rl_display_prompt = oldp; - local_prompt = oldl; - local_prompt_prefix = oldlprefix; - prompt_visible_length = oldlen; - prompt_prefix_length = oldplen; - prompt_last_invisible = oldlast; - prompt_invis_chars_first_line = oldninvis; - prompt_physical_chars = oldphyschars; -} - -/* Redisplay the current line after a SIGWINCH is received. */ -void -_rl_redisplay_after_sigwinch () -{ - char *t; - - /* Clear the current line and put the cursor at column 0. Make sure - the right thing happens if we have wrapped to a new screen line. */ - if (_rl_term_cr) - { -#if defined (_WIN32) - _rl_move_cursor_relative (0, 0); - space_to_eol (_rl_screenwidth); - _rl_move_cursor_relative (0, 0); -#elif defined (__MSDOS__) - putc ('\r', rl_outstream); -#else - tputs (_rl_term_cr, 1, _rl_output_character_function); -#endif - _rl_last_c_pos = 0; -#if defined (__MSDOS__) - space_to_eol (_rl_screenwidth); - putc ('\r', rl_outstream); -#elif !defined (_WIN32) - if (_rl_term_clreol) - tputs (_rl_term_clreol, 1, _rl_output_character_function); - else - { - space_to_eol (_rl_screenwidth); - tputs (_rl_term_cr, 1, _rl_output_character_function); - } -#endif - if (_rl_last_v_pos > 0) - _rl_move_vert (0); - } - else - rl_crlf (); - - /* Redraw only the last line of a multi-line prompt. */ - t = strrchr (rl_display_prompt, '\n'); - if (t) - redraw_prompt (++t); - else - rl_forced_update_display (); -} - -void -_rl_clean_up_for_exit () -{ - if (readline_echoing_p) - { - _rl_move_vert (_rl_vis_botlin); - _rl_vis_botlin = 0; - fflush (rl_outstream); - rl_restart_output (1, 0); - } -} - -void -_rl_erase_entire_line () -{ - cr (); - _rl_clear_to_eol (0); - cr (); - fflush (rl_outstream); -} - -/* return the `current display line' of the cursor -- the number of lines to - move up to get to the first screen line of the current readline line. */ -int -_rl_current_display_line () -{ - int ret, nleft; - - /* Find out whether or not there might be invisible characters in the - editing buffer. */ - if (rl_display_prompt == rl_prompt) - nleft = _rl_last_c_pos - _rl_screenwidth - rl_visible_prompt_length; - else - nleft = _rl_last_c_pos - _rl_screenwidth; - - if (nleft > 0) - ret = 1 + nleft / _rl_screenwidth; - else - ret = 0; - - return ret; -} - -#if defined (HANDLE_MULTIBYTE) -/* Calculate the number of screen columns occupied by STR from START to END. - In the case of multibyte characters with stateful encoding, we have to - scan from the beginning of the string to take the state into account. */ -static int -_rl_col_width (str, start, end) - const char *str; - int start, end; -{ - wchar_t wc; - mbstate_t ps = {0}; - int tmp, point, width, max; - - if (end <= start) - return 0; - - point = 0; - max = end; - - while (point < start) - { - tmp = mbrlen (str + point, max, &ps); - if (MB_INVALIDCH ((size_t)tmp)) - { - /* In this case, the bytes are invalid or too short to compose a - multibyte character, so we assume that the first byte represents - a single character. */ - point++; - max--; - - /* Clear the state of the byte sequence, because in this case the - effect of mbstate is undefined. */ - memset (&ps, 0, sizeof (mbstate_t)); - } - else if (MB_NULLWCH (tmp)) - break; /* Found '\0' */ - else - { - point += tmp; - max -= tmp; - } - } - - /* If START is not a byte that starts a character, then POINT will be - greater than START. In this case, assume that (POINT - START) gives - a byte count that is the number of columns of difference. */ - width = point - start; - - while (point < end) - { - tmp = mbrtowc (&wc, str + point, max, &ps); - if (MB_INVALIDCH ((size_t)tmp)) - { - /* In this case, the bytes are invalid or too short to compose a - multibyte character, so we assume that the first byte represents - a single character. */ - point++; - max--; - - /* and assume that the byte occupies a single column. */ - width++; - - /* Clear the state of the byte sequence, because in this case the - effect of mbstate is undefined. */ - memset (&ps, 0, sizeof (mbstate_t)); - } - else if (MB_NULLWCH (tmp)) - break; /* Found '\0' */ - else - { - point += tmp; - max -= tmp; - tmp = wcwidth(wc); - width += (tmp >= 0) ? tmp : 1; - } - } - - width += point - end; - - return width; -} -#endif /* HANDLE_MULTIBYTE */ diff --git a/dep/src/readline/src/doc/Makefile.in b/dep/src/readline/src/doc/Makefile.in deleted file mode 100644 index 692a4e87db1..00000000000 --- a/dep/src/readline/src/doc/Makefile.in +++ /dev/null @@ -1,252 +0,0 @@ -# This makefile for Readline library documentation is in -*- text -*- mode. -# Emacs likes it that way. - -# Copyright (C) 1996-2004 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. - -topdir = @top_srcdir@ -srcdir = @srcdir@ -VPATH = .:@srcdir@ - -prefix = @prefix@ -infodir = @infodir@ - -mandir = @mandir@ -manpfx = man - -man1ext = .1 -man1dir = $(mandir)/$(manpfx)1 -man3ext = .3 -man3dir = $(mandir)/$(manpfx)3 - -# set this to a value to have the HTML documentation installed -htmldir = - -# Support an alternate destination root directory for package building -DESTDIR = - -SHELL = @MAKE_SHELL@ -RM = rm -f - -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ - -BUILD_DIR = @BUILD_DIR@ -TEXINPUTDIR = $(srcdir) - -MAKEINFO = LANGUAGE= makeinfo -TEXI2DVI = $(srcdir)/texi2dvi -TEXI2HTML = $(srcdir)/texi2html -QUIETPS = #set this to -q to shut up dvips -PAPERSIZE = letter -PSDPI = 600 -DVIPS = dvips -D ${PSDPI} $(QUIETPS) -t ${PAPERSIZE} -o $@ # tricky - -# These tools might not be available; they're not required -DVIPDF = dvipdfm -o $@ -p ${PAPERSIZE} -PSPDF = gs -sPAPERSIZE=${PAPERSIZE} -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -sOutputFile=$@ - -RLSRC = $(srcdir)/rlman.texi $(srcdir)/rluser.texi \ - $(srcdir)/rltech.texi $(srcdir)/version.texi \ - $(srcdir)/rluserman.texi -HISTSRC = $(srcdir)/history.texi $(srcdir)/hsuser.texi \ - $(srcdir)/hstech.texi $(srcdir)/version.texi - -# This should be a program that converts troff to an ascii-readable format -NROFF = groff -Tascii - -# This should be a program that converts troff to postscript -GROFF = groff - -DVIOBJ = readline.dvi history.dvi rluserman.dvi -INFOOBJ = readline.info history.info rluserman.info -PSOBJ = readline.ps history.ps rluserman.ps readline_3.ps history_3.ps -HTMLOBJ = readline.html history.html rluserman.html -TEXTOBJ = readline.0 history.0 -PDFOBJ = readline.pdf history.pdf rluserman.pdf - -INTERMEDIATE_OBJ = rlman.dvi - -DIST_DOCS = $(DVIOBJ) $(PSOBJ) $(HTMLOBJ) $(INFOOBJ) $(TEXTOBJ) - -.SUFFIXES: .0 .3 .ps .txt .dvi .html .pdf - -.3.0: - $(RM) $@ - -${NROFF} -man $< > $@ - -.ps.pdf: - $(RM) $@ - -${PSPDF} $< - -.dvi.pdf: - $(RM) $@ - -${DVIPDF} $< - -all: info dvi html ps text -nodvi: info html text - -info: $(INFOOBJ) -dvi: $(DVIOBJ) -ps: $(PSOBJ) -html: $(HTMLOBJ) -text: $(TEXTOBJ) -pdf: $(PDFOBJ) - -readline.dvi: $(RLSRC) - TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) $(srcdir)/rlman.texi - mv rlman.dvi readline.dvi - -readline.info: $(RLSRC) - $(MAKEINFO) --no-split -I $(TEXINPUTDIR) -o $@ $(srcdir)/rlman.texi - -rluserman.dvi: $(RLSRC) - TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) $(srcdir)/rluserman.texi - -rluserman.info: $(RLSRC) - $(MAKEINFO) --no-split -I $(TEXINPUTDIR) -o $@ $(srcdir)/rluserman.texi - -history.dvi: ${HISTSRC} - TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) $(srcdir)/history.texi - -history.info: ${HISTSRC} - $(MAKEINFO) --no-split -I $(TEXINPUTDIR) -o $@ $(srcdir)/history.texi - -readline.ps: readline.dvi - $(RM) $@ - $(DVIPS) readline.dvi - -rluserman.ps: rluserman.dvi - $(RM) $@ - $(DVIPS) rluserman.dvi - -history.ps: history.dvi - $(RM) $@ - $(DVIPS) history.dvi - -# -# This leaves readline.html and rlman.html -- rlman.html is for www.gnu.org -# -readline.html: ${RLSRC} - $(TEXI2HTML) -menu -monolithic -I $(TEXINPUTDIR) $(srcdir)/rlman.texi - sed -e 's:rlman.html:readline.html:g' rlman.html > readline.html - $(RM) rlman.html - -rluserman.html: ${RLSRC} - $(TEXI2HTML) -menu -monolithic -I $(TEXINPUTDIR) $(srcdir)/rluserman.texi - -history.html: ${HISTSRC} - $(TEXI2HTML) -menu -monolithic -I $(TEXINPUTDIR) $(srcdir)/history.texi - -readline.0: readline.3 - -readline_3.ps: readline.3 - ${RM} $@ - ${GROFF} -man < $(srcdir)/readline.3 > $@ - -history.0: history.3 - -history_3.ps: history.3 - ${RM} $@ - ${GROFF} -man < $(srcdir)/history.3 > $@ - -readline.pdf: readline.dvi -history.pdf: history.dvi -rluserman.pdf: rluserman.dvi - -clean: - $(RM) *.aux *.bak *.cp *.fn *.ky *.log *.pg *.toc *.tp *.vr *.cps \ - *.pgs *.bt *.bts *.rw *.rws *.fns *.kys *.tps *.vrs *.o \ - core *.core - -mostlyclean: clean - -distclean: clean maybe-clean - $(RM) $(INTERMEDIATE_OBJ) - $(RM) Makefile - -maybe-clean: - -if test "X$(topdir)" != "X$(BUILD_DIR)"; then \ - $(RM) $(DIST_DOCS); \ - fi - -maintainer-clean: clean - $(RM) $(DIST_DOCS) - $(RM) $(INTERMEDIATE_OBJ) - $(RM) $(PDFOBJ) - $(RM) Makefile - -installdirs: $(topdir)/support/mkdirs - -$(SHELL) $(topdir)/support/mkdirs $(DESTDIR)$(infodir) $(DESTDIR)$(man3dir) - -if test -n "${htmldir}" ; then \ - $(SHELL) $(topdir)/support/mkdirs $(DESTDIR)$(htmldir) ; \ - fi - -install: installdirs - if test -f readline.info; then \ - ${INSTALL_DATA} readline.info $(DESTDIR)$(infodir)/readline.info; \ - else \ - ${INSTALL_DATA} $(srcdir)/readline.info $(DESTDIR)$(infodir)/readline.info; \ - fi - if test -f rluserman.info; then \ - ${INSTALL_DATA} rluserman.info $(DESTDIR)$(infodir)/rluserman.info; \ - else \ - ${INSTALL_DATA} $(srcdir)/rluserman.info $(DESTDIR)$(infodir)/rluserman.info; \ - fi - if test -f history.info; then \ - ${INSTALL_DATA} history.info $(DESTDIR)$(infodir)/history.info; \ - else \ - ${INSTALL_DATA} $(srcdir)/history.info $(DESTDIR)$(infodir)/history.info; \ - fi - -if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \ - install-info --dir-file=$(DESTDIR)$(infodir)/dir \ - $(DESTDIR)$(infodir)/readline.info ; \ - install-info --dir-file=$(DESTDIR)$(infodir)/dir \ - $(DESTDIR)$(infodir)/history.info ; \ - install-info --dir-file=$(DESTDIR)$(infodir)/dir \ - $(DESTDIR)$(infodir)/rluserman.info ; \ - else true; fi - -${INSTALL_DATA} $(srcdir)/readline.3 $(DESTDIR)$(man3dir)/readline$(man3ext) - -${INSTALL_DATA} $(srcdir)/history.3 $(DESTDIR)$(man3dir)/history$(man3ext) - -if test -n "${htmldir}" ; then \ - if test -f readline.html; then \ - ${INSTALL_DATA} readline.html $(DESTDIR)$(htmldir)/readline.html; \ - else \ - ${INSTALL_DATA} $(srcdir)/readline.html $(DESTDIR)$(htmldir)/readline.html; \ - fi ; \ - if test -f history.html; then \ - ${INSTALL_DATA} history.html $(DESTDIR)$(htmldir)/history.html; \ - else \ - ${INSTALL_DATA} $(srcdir)/history.html $(DESTDIR)$(htmldir)/history.html; \ - fi ; \ - if test -f rluserman.html; then \ - ${INSTALL_DATA} rluserman.html $(DESTDIR)$(htmldir)/rluserman.html; \ - else \ - ${INSTALL_DATA} $(srcdir)/rluserman.html $(DESTDIR)$(htmldir)/rluserman.html; \ - fi ; \ - fi - -uninstall: - $(RM) $(DESTDIR)$(infodir)/readline.info - $(RM) $(DESTDIR)$(infodir)/rluserman.info - $(RM) $(DESTDIR)$(infodir)/history.info - $(RM) $(DESTDIR)$(man3dir)/readline$(man3ext) - $(RM) $(DESTDIR)$(man3dir)/history$(man3ext) - -if test -n "${htmldir}" ; then \ - $(RM) $(DESTDIR)$(htmldir)/readline.html ; \ - $(RM) $(DESTDIR)$(htmldir)/rluserman.html ; \ - $(RM) $(DESTDIR)$(htmldir)/history.html ; \ - fi diff --git a/dep/src/readline/src/doc/fdl.texi b/dep/src/readline/src/doc/fdl.texi deleted file mode 100644 index 47ead9f095e..00000000000 --- a/dep/src/readline/src/doc/fdl.texi +++ /dev/null @@ -1,452 +0,0 @@ - -@node GNU Free Documentation License -@appendixsec GNU Free Documentation License - -@cindex FDL, GNU Free Documentation License -@center Version 1.2, November 2002 - -@display -Copyright @copyright{} 2000,2001,2002 Free Software Foundation, Inc. -59 Temple Place, Suite 330, Boston, MA 02111-1307, USA - -Everyone is permitted to copy and distribute verbatim copies -of this license document, but changing it is not allowed. -@end display - -@enumerate 0 -@item -PREAMBLE - -The purpose of this License is to make a manual, textbook, or other -functional and useful document @dfn{free} in the sense of freedom: to -assure everyone the effective freedom to copy and redistribute it, -with or without modifying it, either commercially or noncommercially. -Secondarily, this License preserves for the author and publisher a way -to get credit for their work, while not being considered responsible -for modifications made by others. - -This License is a kind of ``copyleft'', which means that derivative -works of the document must themselves be free in the same sense. It -complements the GNU General Public License, which is a copyleft -license designed for free software. - -We have designed this License in order to use it for manuals for free -software, because free software needs free documentation: a free -program should come with manuals providing the same freedoms that the -software does. But this License is not limited to software manuals; -it can be used for any textual work, regardless of subject matter or -whether it is published as a printed book. We recommend this License -principally for works whose purpose is instruction or reference. - -@item -APPLICABILITY AND DEFINITIONS - -This License applies to any manual or other work, in any medium, that -contains a notice placed by the copyright holder saying it can be -distributed under the terms of this License. Such a notice grants a -world-wide, royalty-free license, unlimited in duration, to use that -work under the conditions stated herein. The ``Document'', below, -refers to any such manual or work. Any member of the public is a -licensee, and is addressed as ``you''. You accept the license if you -copy, modify or distribute the work in a way requiring permission -under copyright law. - -A ``Modified Version'' of the Document means any work containing the -Document or a portion of it, either copied verbatim, or with -modifications and/or translated into another language. - -A ``Secondary Section'' is a named appendix or a front-matter section -of the Document that deals exclusively with the relationship of the -publishers or authors of the Document to the Document's overall -subject (or to related matters) and contains nothing that could fall -directly within that overall subject. (Thus, if the Document is in -part a textbook of mathematics, a Secondary Section may not explain -any mathematics.) The relationship could be a matter of historical -connection with the subject or with related matters, or of legal, -commercial, philosophical, ethical or political position regarding -them. - -The ``Invariant Sections'' are certain Secondary Sections whose titles -are designated, as being those of Invariant Sections, in the notice -that says that the Document is released under this License. If a -section does not fit the above definition of Secondary then it is not -allowed to be designated as Invariant. The Document may contain zero -Invariant Sections. If the Document does not identify any Invariant -Sections then there are none. - -The ``Cover Texts'' are certain short passages of text that are listed, -as Front-Cover Texts or Back-Cover Texts, in the notice that says that -the Document is released under this License. A Front-Cover Text may -be at most 5 words, and a Back-Cover Text may be at most 25 words. - -A ``Transparent'' copy of the Document means a machine-readable copy, -represented in a format whose specification is available to the -general public, that is suitable for revising the document -straightforwardly with generic text editors or (for images composed of -pixels) generic paint programs or (for drawings) some widely available -drawing editor, and that is suitable for input to text formatters or -for automatic translation to a variety of formats suitable for input -to text formatters. A copy made in an otherwise Transparent file -format whose markup, or absence of markup, has been arranged to thwart -or discourage subsequent modification by readers is not Transparent. -An image format is not Transparent if used for any substantial amount -of text. A copy that is not ``Transparent'' is called ``Opaque''. - -Examples of suitable formats for Transparent copies include plain -@sc{ascii} without markup, Texinfo input format, La@TeX{} input -format, @acronym{SGML} or @acronym{XML} using a publicly available -@acronym{DTD}, and standard-conforming simple @acronym{HTML}, -PostScript or @acronym{PDF} designed for human modification. Examples -of transparent image formats include @acronym{PNG}, @acronym{XCF} and -@acronym{JPG}. Opaque formats include proprietary formats that can be -read and edited only by proprietary word processors, @acronym{SGML} or -@acronym{XML} for which the @acronym{DTD} and/or processing tools are -not generally available, and the machine-generated @acronym{HTML}, -PostScript or @acronym{PDF} produced by some word processors for -output purposes only. - -The ``Title Page'' means, for a printed book, the title page itself, -plus such following pages as are needed to hold, legibly, the material -this License requires to appear in the title page. For works in -formats which do not have any title page as such, ``Title Page'' means -the text near the most prominent appearance of the work's title, -preceding the beginning of the body of the text. - -A section ``Entitled XYZ'' means a named subunit of the Document whose -title either is precisely XYZ or contains XYZ in parentheses following -text that translates XYZ in another language. (Here XYZ stands for a -specific section name mentioned below, such as ``Acknowledgements'', -``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title'' -of such a section when you modify the Document means that it remains a -section ``Entitled XYZ'' according to this definition. - -The Document may include Warranty Disclaimers next to the notice which -states that this License applies to the Document. These Warranty -Disclaimers are considered to be included by reference in this -License, but only as regards disclaiming warranties: any other -implication that these Warranty Disclaimers may have is void and has -no effect on the meaning of this License. - -@item -VERBATIM COPYING - -You may copy and distribute the Document in any medium, either -commercially or noncommercially, provided that this License, the -copyright notices, and the license notice saying this License applies -to the Document are reproduced in all copies, and that you add no other -conditions whatsoever to those of this License. You may not use -technical measures to obstruct or control the reading or further -copying of the copies you make or distribute. However, you may accept -compensation in exchange for copies. If you distribute a large enough -number of copies you must also follow the conditions in section 3. - -You may also lend copies, under the same conditions stated above, and -you may publicly display copies. - -@item -COPYING IN QUANTITY - -If you publish printed copies (or copies in media that commonly have -printed covers) of the Document, numbering more than 100, and the -Document's license notice requires Cover Texts, you must enclose the -copies in covers that carry, clearly and legibly, all these Cover -Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on -the back cover. Both covers must also clearly and legibly identify -you as the publisher of these copies. The front cover must present -the full title with all words of the title equally prominent and -visible. You may add other material on the covers in addition. -Copying with changes limited to the covers, as long as they preserve -the title of the Document and satisfy these conditions, can be treated -as verbatim copying in other respects. - -If the required texts for either cover are too voluminous to fit -legibly, you should put the first ones listed (as many as fit -reasonably) on the actual cover, and continue the rest onto adjacent -pages. - -If you publish or distribute Opaque copies of the Document numbering -more than 100, you must either include a machine-readable Transparent -copy along with each Opaque copy, or state in or with each Opaque copy -a computer-network location from which the general network-using -public has access to download using public-standard network protocols -a complete Transparent copy of the Document, free of added material. -If you use the latter option, you must take reasonably prudent steps, -when you begin distribution of Opaque copies in quantity, to ensure -that this Transparent copy will remain thus accessible at the stated -location until at least one year after the last time you distribute an -Opaque copy (directly or through your agents or retailers) of that -edition to the public. - -It is requested, but not required, that you contact the authors of the -Document well before redistributing any large number of copies, to give -them a chance to provide you with an updated version of the Document. - -@item -MODIFICATIONS - -You may copy and distribute a Modified Version of the Document under -the conditions of sections 2 and 3 above, provided that you release -the Modified Version under precisely this License, with the Modified -Version filling the role of the Document, thus licensing distribution -and modification of the Modified Version to whoever possesses a copy -of it. In addition, you must do these things in the Modified Version: - -@enumerate A -@item -Use in the Title Page (and on the covers, if any) a title distinct -from that of the Document, and from those of previous versions -(which should, if there were any, be listed in the History section -of the Document). You may use the same title as a previous version -if the original publisher of that version gives permission. - -@item -List on the Title Page, as authors, one or more persons or entities -responsible for authorship of the modifications in the Modified -Version, together with at least five of the principal authors of the -Document (all of its principal authors, if it has fewer than five), -unless they release you from this requirement. - -@item -State on the Title page the name of the publisher of the -Modified Version, as the publisher. - -@item -Preserve all the copyright notices of the Document. - -@item -Add an appropriate copyright notice for your modifications -adjacent to the other copyright notices. - -@item -Include, immediately after the copyright notices, a license notice -giving the public permission to use the Modified Version under the -terms of this License, in the form shown in the Addendum below. - -@item -Preserve in that license notice the full lists of Invariant Sections -and required Cover Texts given in the Document's license notice. - -@item -Include an unaltered copy of this License. - -@item -Preserve the section Entitled ``History'', Preserve its Title, and add -to it an item stating at least the title, year, new authors, and -publisher of the Modified Version as given on the Title Page. If -there is no section Entitled ``History'' in the Document, create one -stating the title, year, authors, and publisher of the Document as -given on its Title Page, then add an item describing the Modified -Version as stated in the previous sentence. - -@item -Preserve the network location, if any, given in the Document for -public access to a Transparent copy of the Document, and likewise -the network locations given in the Document for previous versions -it was based on. These may be placed in the ``History'' section. -You may omit a network location for a work that was published at -least four years before the Document itself, or if the original -publisher of the version it refers to gives permission. - -@item -For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve -the Title of the section, and preserve in the section all the -substance and tone of each of the contributor acknowledgements and/or -dedications given therein. - -@item -Preserve all the Invariant Sections of the Document, -unaltered in their text and in their titles. Section numbers -or the equivalent are not considered part of the section titles. - -@item -Delete any section Entitled ``Endorsements''. Such a section -may not be included in the Modified Version. - -@item -Do not retitle any existing section to be Entitled ``Endorsements'' or -to conflict in title with any Invariant Section. - -@item -Preserve any Warranty Disclaimers. -@end enumerate - -If the Modified Version includes new front-matter sections or -appendices that qualify as Secondary Sections and contain no material -copied from the Document, you may at your option designate some or all -of these sections as invariant. To do this, add their titles to the -list of Invariant Sections in the Modified Version's license notice. -These titles must be distinct from any other section titles. - -You may add a section Entitled ``Endorsements'', provided it contains -nothing but endorsements of your Modified Version by various -parties---for example, statements of peer review or that the text has -been approved by an organization as the authoritative definition of a -standard. - -You may add a passage of up to five words as a Front-Cover Text, and a -passage of up to 25 words as a Back-Cover Text, to the end of the list -of Cover Texts in the Modified Version. Only one passage of -Front-Cover Text and one of Back-Cover Text may be added by (or -through arrangements made by) any one entity. If the Document already -includes a cover text for the same cover, previously added by you or -by arrangement made by the same entity you are acting on behalf of, -you may not add another; but you may replace the old one, on explicit -permission from the previous publisher that added the old one. - -The author(s) and publisher(s) of the Document do not by this License -give permission to use their names for publicity for or to assert or -imply endorsement of any Modified Version. - -@item -COMBINING DOCUMENTS - -You may combine the Document with other documents released under this -License, under the terms defined in section 4 above for modified -versions, provided that you include in the combination all of the -Invariant Sections of all of the original documents, unmodified, and -list them all as Invariant Sections of your combined work in its -license notice, and that you preserve all their Warranty Disclaimers. - -The combined work need only contain one copy of this License, and -multiple identical Invariant Sections may be replaced with a single -copy. If there are multiple Invariant Sections with the same name but -different contents, make the title of each such section unique by -adding at the end of it, in parentheses, the name of the original -author or publisher of that section if known, or else a unique number. -Make the same adjustment to the section titles in the list of -Invariant Sections in the license notice of the combined work. - -In the combination, you must combine any sections Entitled ``History'' -in the various original documents, forming one section Entitled -``History''; likewise combine any sections Entitled ``Acknowledgements'', -and any sections Entitled ``Dedications''. You must delete all -sections Entitled ``Endorsements.'' - -@item -COLLECTIONS OF DOCUMENTS - -You may make a collection consisting of the Document and other documents -released under this License, and replace the individual copies of this -License in the various documents with a single copy that is included in -the collection, provided that you follow the rules of this License for -verbatim copying of each of the documents in all other respects. - -You may extract a single document from such a collection, and distribute -it individually under this License, provided you insert a copy of this -License into the extracted document, and follow this License in all -other respects regarding verbatim copying of that document. - -@item -AGGREGATION WITH INDEPENDENT WORKS - -A compilation of the Document or its derivatives with other separate -and independent documents or works, in or on a volume of a storage or -distribution medium, is called an ``aggregate'' if the copyright -resulting from the compilation is not used to limit the legal rights -of the compilation's users beyond what the individual works permit. -When the Document is included an aggregate, this License does not -apply to the other works in the aggregate which are not themselves -derivative works of the Document. - -If the Cover Text requirement of section 3 is applicable to these -copies of the Document, then if the Document is less than one half of -the entire aggregate, the Document's Cover Texts may be placed on -covers that bracket the Document within the aggregate, or the -electronic equivalent of covers if the Document is in electronic form. -Otherwise they must appear on printed covers that bracket the whole -aggregate. - -@item -TRANSLATION - -Translation is considered a kind of modification, so you may -distribute translations of the Document under the terms of section 4. -Replacing Invariant Sections with translations requires special -permission from their copyright holders, but you may include -translations of some or all Invariant Sections in addition to the -original versions of these Invariant Sections. You may include a -translation of this License, and all the license notices in the -Document, and any Warranty Disclaimers, provided that you also include -the original English version of this License and the original versions -of those notices and disclaimers. In case of a disagreement between -the translation and the original version of this License or a notice -or disclaimer, the original version will prevail. - -If a section in the Document is Entitled ``Acknowledgements'', -``Dedications'', or ``History'', the requirement (section 4) to Preserve -its Title (section 1) will typically require changing the actual -title. - -@item -TERMINATION - -You may not copy, modify, sublicense, or distribute the Document except -as expressly provided for under this License. Any other attempt to -copy, modify, sublicense or distribute the Document is void, and will -automatically terminate your rights under this License. However, -parties who have received copies, or rights, from you under this -License will not have their licenses terminated so long as such -parties remain in full compliance. - -@item -FUTURE REVISIONS OF THIS LICENSE - -The Free Software Foundation may publish new, revised versions -of the GNU Free Documentation License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. See -@uref{http://www.gnu.org/copyleft/}. - -Each version of the License is given a distinguishing version number. -If the Document specifies that a particular numbered version of this -License ``or any later version'' applies to it, you have the option of -following the terms and conditions either of that specified version or -of any later version that has been published (not as a draft) by the -Free Software Foundation. If the Document does not specify a version -number of this License, you may choose any version ever published (not -as a draft) by the Free Software Foundation. -@end enumerate - -@page -@appendixsubsec ADDENDUM: How to use this License for your documents - -To use this License in a document you have written, include a copy of -the License in the document and put the following copyright and -license notices just after the title page: - -@smallexample -@group - Copyright (C) @var{year} @var{your name}. - Permission is granted to copy, distribute and/or modify this document - under the terms of the GNU Free Documentation License, Version 1.2 - or any later version published by the Free Software Foundation; - with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. - A copy of the license is included in the section entitled ``GNU - Free Documentation License''. -@end group -@end smallexample - -If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, -replace the ``with...Texts.'' line with this: - -@smallexample -@group - with the Invariant Sections being @var{list their titles}, with - the Front-Cover Texts being @var{list}, and with the Back-Cover Texts - being @var{list}. -@end group -@end smallexample - -If you have Invariant Sections without Cover Texts, or some other -combination of the three, merge those two alternatives to suit the -situation. - -If your document contains nontrivial examples of program code, we -recommend releasing these examples in parallel under your choice of -free software license, such as the GNU General Public License, -to permit their use in free software. - -@c Local Variables: -@c ispell-local-pdict: "ispell-dict" -@c End: - diff --git a/dep/src/readline/src/doc/history.0 b/dep/src/readline/src/doc/history.0 deleted file mode 100644 index 3362294983a..00000000000 --- a/dep/src/readline/src/doc/history.0 +++ /dev/null @@ -1,488 +0,0 @@ -HISTORY(3) HISTORY(3) - - - -NNAAMMEE - history - GNU History Library - -CCOOPPYYRRIIGGHHTT - The GNU History Library is Copyright (C) 1989-2002 by the Free Software - Foundation, Inc. - -DDEESSCCRRIIPPTTIIOONN - Many programs read input from the user a line at a time. The GNU His- - tory library is able to keep track of those lines, associate arbitrary - data with each line, and utilize information from previous lines in - composing new ones. - - -HHIISSTTOORRYY EEXXPPAANNSSIIOONN - The history library supports a history expansion feature that is iden- - tical to the history expansion in bbaasshh.. This section describes what - syntax features are available. - - History expansions introduce words from the history list into the input - stream, making it easy to repeat commands, insert the arguments to a - previous command into the current input line, or fix errors in previous - commands quickly. - - History expansion is usually performed immediately after a complete - line is read. It takes place in two parts. The first is to determine - which line from the history list to use during substitution. The sec- - ond is to select portions of that line for inclusion into the current - one. The line selected from the history is the _e_v_e_n_t, and the portions - of that line that are acted upon are _w_o_r_d_s. Various _m_o_d_i_f_i_e_r_s are - available to manipulate the selected words. The line is broken into - words in the same fashion as bbaasshh does when reading input, so that sev- - eral words that would otherwise be separated are considered one word - when surrounded by quotes (see the description of hhiissttoorryy__ttookkeenniizzee(()) - below). History expansions are introduced by the appearance of the - history expansion character, which is !! by default. Only backslash (\\) - and single quotes can quote the history expansion character. - - EEvveenntt DDeessiiggnnaattoorrss - An event designator is a reference to a command line entry in the his- - tory list. - - !! Start a history substitution, except when followed by a bbllaannkk, - newline, = or (. - !!_n Refer to command line _n. - !!--_n Refer to the current command line minus _n. - !!!! Refer to the previous command. This is a synonym for `!-1'. - !!_s_t_r_i_n_g - Refer to the most recent command starting with _s_t_r_i_n_g. - !!??_s_t_r_i_n_g[[??]] - Refer to the most recent command containing _s_t_r_i_n_g. The trail- - ing ?? may be omitted if _s_t_r_i_n_g is followed immediately by a new- - line. - ^^_s_t_r_i_n_g_1^^_s_t_r_i_n_g_2^^ - Quick substitution. Repeat the last command, replacing _s_t_r_i_n_g_1 - with _s_t_r_i_n_g_2. Equivalent to ``!!:s/_s_t_r_i_n_g_1/_s_t_r_i_n_g_2/'' (see MMoodd-- - iiffiieerrss below). - !!## The entire command line typed so far. - - WWoorrdd DDeessiiggnnaattoorrss - Word designators are used to select desired words from the event. A :: - separates the event specification from the word designator. It may be - omitted if the word designator begins with a ^^, $$, **, --, or %%. Words - are numbered from the beginning of the line, with the first word being - denoted by 0 (zero). Words are inserted into the current line sepa- - rated by single spaces. - - 00 ((zzeerroo)) - The zeroth word. For the shell, this is the command word. - _n The _nth word. - ^^ The first argument. That is, word 1. - $$ The last argument. - %% The word matched by the most recent `?_s_t_r_i_n_g?' search. - _x--_y A range of words; `-_y' abbreviates `0-_y'. - ** All of the words but the zeroth. This is a synonym for `_1_-_$'. - It is not an error to use ** if there is just one word in the - event; the empty string is returned in that case. - xx** Abbreviates _x_-_$. - xx-- Abbreviates _x_-_$ like xx**, but omits the last word. - - If a word designator is supplied without an event specification, the - previous command is used as the event. - - MMooddiiffiieerrss - After the optional word designator, there may appear a sequence of one - or more of the following modifiers, each preceded by a `:'. - - hh Remove a trailing file name component, leaving only the head. - tt Remove all leading file name components, leaving the tail. - rr Remove a trailing suffix of the form _._x_x_x, leaving the basename. - ee Remove all but the trailing suffix. - pp Print the new command but do not execute it. - qq Quote the substituted words, escaping further substitutions. - xx Quote the substituted words as with qq, but break into words at - bbllaannkkss and newlines. - ss//_o_l_d//_n_e_w// - Substitute _n_e_w for the first occurrence of _o_l_d in the event - line. Any delimiter can be used in place of /. The final - delimiter is optional if it is the last character of the event - line. The delimiter may be quoted in _o_l_d and _n_e_w with a single - backslash. If & appears in _n_e_w, it is replaced by _o_l_d. A sin- - gle backslash will quote the &. If _o_l_d is null, it is set to - the last _o_l_d substituted, or, if no previous history substitu- - tions took place, the last _s_t_r_i_n_g in a !!??_s_t_r_i_n_g[[??]] search. - && Repeat the previous substitution. - gg Cause changes to be applied over the entire event line. This is - used in conjunction with `::ss' (e.g., `::ggss//_o_l_d//_n_e_w//') or `::&&'. - If used with `::ss', any delimiter can be used in place of /, and - the final delimiter is optional if it is the last character of - the event line. An aa may be used as a synonym for gg. - GG Apply the following `ss' modifier once to each word in the event - line. - -PPRROOGGRRAAMMMMIINNGG WWIITTHH HHIISSTTOORRYY FFUUNNCCTTIIOONNSS - This section describes how to use the History library in other pro- - grams. - - IInnttrroodduuccttiioonn ttoo HHiissttoorryy - The programmer using the History library has available functions for - remembering lines on a history list, associating arbitrary data with a - line, removing lines from the list, searching through the list for a - line containing an arbitrary text string, and referencing any line in - the list directly. In addition, a history _e_x_p_a_n_s_i_o_n function is avail- - able which provides for a consistent user interface across different - programs. - - The user using programs written with the History library has the bene- - fit of a consistent user interface with a set of well-known commands - for manipulating the text of previous lines and using that text in new - commands. The basic history manipulation commands are identical to the - history substitution provided by bbaasshh. - - If the programmer desires, he can use the Readline library, which - includes some history manipulation by default, and has the added advan- - tage of command line editing. - - Before declaring any functions using any functionality the History - library provides in other code, an application writer should include - the file _<_r_e_a_d_l_i_n_e_/_h_i_s_t_o_r_y_._h_> in any file that uses the History - library's features. It supplies extern declarations for all of the - library's public functions and variables, and declares all of the pub- - lic data structures. - - - HHiissttoorryy SSttoorraaggee - The history list is an array of history entries. A history entry is - declared as follows: - - _t_y_p_e_d_e_f _v_o_i_d _* hhiissttddaattaa__tt;; - - typedef struct _hist_entry { - char *line; - char *timestamp; - histdata_t data; - } HIST_ENTRY; - - The history list itself might therefore be declared as - - _H_I_S_T___E_N_T_R_Y _*_* tthhee__hhiissttoorryy__lliisstt;; - - The state of the History library is encapsulated into a single struc- - ture: - - /* - * A structure used to pass around the current state of the history. - */ - typedef struct _hist_state { - HIST_ENTRY **entries; /* Pointer to the entries themselves. */ - int offset; /* The location pointer within this array. */ - int length; /* Number of elements within this array. */ - int size; /* Number of slots allocated to this array. */ - int flags; - } HISTORY_STATE; - - If the flags member includes HHSS__SSTTIIFFLLEEDD, the history has been stifled. - -HHiissttoorryy FFuunnccttiioonnss - This section describes the calling sequence for the various functions - exported by the GNU History library. - - IInniittiiaalliizziinngg HHiissttoorryy aanndd SSttaattee MMaannaaggeemmeenntt - This section describes functions used to initialize and manage the - state of the History library when you want to use the history functions - in your program. - - _v_o_i_d uussiinngg__hhiissttoorryy (_v_o_i_d) - Begin a session in which the history functions might be used. This - initializes the interactive variables. - - _H_I_S_T_O_R_Y___S_T_A_T_E _* hhiissttoorryy__ggeett__hhiissttoorryy__ssttaattee (_v_o_i_d) - Return a structure describing the current state of the input history. - - _v_o_i_d hhiissttoorryy__sseett__hhiissttoorryy__ssttaattee (_H_I_S_T_O_R_Y___S_T_A_T_E _*_s_t_a_t_e) - Set the state of the history list according to _s_t_a_t_e. - - - HHiissttoorryy LLiisstt MMaannaaggeemmeenntt - These functions manage individual entries on the history list, or set - parameters managing the list itself. - - _v_o_i_d aadddd__hhiissttoorryy (_c_o_n_s_t _c_h_a_r _*_s_t_r_i_n_g) - Place _s_t_r_i_n_g at the end of the history list. The associated data field - (if any) is set to NNUULLLL. - - _v_o_i_d aadddd__hhiissttoorryy__ttiimmee (_c_o_n_s_t _c_h_a_r _*_s_t_r_i_n_g) - Change the time stamp associated with the most recent history entry to - _s_t_r_i_n_g. - - _H_I_S_T___E_N_T_R_Y _* rreemmoovvee__hhiissttoorryy (_i_n_t _w_h_i_c_h) - Remove history entry at offset _w_h_i_c_h from the history. The removed - element is returned so you can free the line, data, and containing - structure. - - _h_i_s_t_d_a_t_a___t ffrreeee__hhiissttoorryy__eennttrryy (_H_I_S_T___E_N_T_R_Y _*_h_i_s_t_e_n_t) - Free the history entry _h_i_s_t_e_n_t and any history library private data - associated with it. Returns the application-specific data so the - caller can dispose of it. - - _H_I_S_T___E_N_T_R_Y _* rreeppllaaccee__hhiissttoorryy__eennttrryy (_i_n_t _w_h_i_c_h_, _c_o_n_s_t _c_h_a_r _*_l_i_n_e_, _h_i_s_t_- - _d_a_t_a___t _d_a_t_a) - Make the history entry at offset _w_h_i_c_h have _l_i_n_e and _d_a_t_a. This - returns the old entry so the caller can dispose of any application-spe- - cific data. In the case of an invalid _w_h_i_c_h, a NNUULLLL pointer is - returned. - - _v_o_i_d cclleeaarr__hhiissttoorryy (_v_o_i_d) - Clear the history list by deleting all the entries. - - _v_o_i_d ssttiiffllee__hhiissttoorryy (_i_n_t _m_a_x) - Stifle the history list, remembering only the last _m_a_x entries. - - _i_n_t uunnssttiiffllee__hhiissttoorryy (_v_o_i_d) - Stop stifling the history. This returns the previously-set maximum - number of history entries (as set by ssttiiffllee__hhiissttoorryy(())). history was - stifled. The value is positive if the history was stifled, negative if - it wasn't. - - _i_n_t hhiissttoorryy__iiss__ssttiifflleedd (_v_o_i_d) - Returns non-zero if the history is stifled, zero if it is not. - - - IInnffoorrmmaattiioonn AAbboouutt tthhee HHiissttoorryy LLiisstt - These functions return information about the entire history list or - individual list entries. - - _H_I_S_T___E_N_T_R_Y _*_* hhiissttoorryy__lliisstt (_v_o_i_d) - Return a NNUULLLL terminated array of _H_I_S_T___E_N_T_R_Y _* which is the current - input history. Element 0 of this list is the beginning of time. If - there is no history, return NNUULLLL. - - _i_n_t wwhheerree__hhiissttoorryy (_v_o_i_d) - Returns the offset of the current history element. - - _H_I_S_T___E_N_T_R_Y _* ccuurrrreenntt__hhiissttoorryy (_v_o_i_d) - Return the history entry at the current position, as determined by - wwhheerree__hhiissttoorryy(()). If there is no entry there, return a NNUULLLL pointer. - - _H_I_S_T___E_N_T_R_Y _* hhiissttoorryy__ggeett (_i_n_t _o_f_f_s_e_t) - Return the history entry at position _o_f_f_s_e_t, starting from hhiiss-- - ttoorryy__bbaassee. If there is no entry there, or if _o_f_f_s_e_t is greater than - the history length, return a NNUULLLL pointer. - - _t_i_m_e___t hhiissttoorryy__ggeett__ttiimmee (_H_I_S_T___E_N_T_R_Y _*) - Return the time stamp associated with the history entry passed as the - argument. - - _i_n_t hhiissttoorryy__ttoottaall__bbyytteess (_v_o_i_d) - Return the number of bytes that the primary history entries are using. - This function returns the sum of the lengths of all the lines in the - history. - - - MMoovviinngg AArroouunndd tthhee HHiissttoorryy LLiisstt - These functions allow the current index into the history list to be set - or changed. - - _i_n_t hhiissttoorryy__sseett__ppooss (_i_n_t _p_o_s) - Set the current history offset to _p_o_s, an absolute index into the list. - Returns 1 on success, 0 if _p_o_s is less than zero or greater than the - number of history entries. - - _H_I_S_T___E_N_T_R_Y _* pprreevviioouuss__hhiissttoorryy (_v_o_i_d) - Back up the current history offset to the previous history entry, and - return a pointer to that entry. If there is no previous entry, return - a NNUULLLL pointer. - - _H_I_S_T___E_N_T_R_Y _* nneexxtt__hhiissttoorryy (_v_o_i_d) - Move the current history offset forward to the next history entry, and - return the a pointer to that entry. If there is no next entry, return - a NNUULLLL pointer. - - - SSeeaarrcchhiinngg tthhee HHiissttoorryy LLiisstt - These functions allow searching of the history list for entries con- - taining a specific string. Searching may be performed both forward and - backward from the current history position. The search may be - _a_n_c_h_o_r_e_d, meaning that the string must match at the beginning of the - history entry. - - _i_n_t hhiissttoorryy__sseeaarrcchh (_c_o_n_s_t _c_h_a_r _*_s_t_r_i_n_g_, _i_n_t _d_i_r_e_c_t_i_o_n) - Search the history for _s_t_r_i_n_g, starting at the current history offset. - If _d_i_r_e_c_t_i_o_n is less than 0, then the search is through previous - entries, otherwise through subsequent entries. If _s_t_r_i_n_g is found, - then the current history index is set to that history entry, and the - value returned is the offset in the line of the entry where _s_t_r_i_n_g was - found. Otherwise, nothing is changed, and a -1 is returned. - - _i_n_t hhiissttoorryy__sseeaarrcchh__pprreeffiixx (_c_o_n_s_t _c_h_a_r _*_s_t_r_i_n_g_, _i_n_t _d_i_r_e_c_t_i_o_n) - Search the history for _s_t_r_i_n_g, starting at the current history offset. - The search is anchored: matching lines must begin with _s_t_r_i_n_g. If - _d_i_r_e_c_t_i_o_n is less than 0, then the search is through previous entries, - otherwise through subsequent entries. If _s_t_r_i_n_g is found, then the - current history index is set to that entry, and the return value is 0. - Otherwise, nothing is changed, and a -1 is returned. - - _i_n_t hhiissttoorryy__sseeaarrcchh__ppooss (_c_o_n_s_t _c_h_a_r _*_s_t_r_i_n_g_, _i_n_t _d_i_r_e_c_t_i_o_n_, _i_n_t _p_o_s) - Search for _s_t_r_i_n_g in the history list, starting at _p_o_s, an absolute - index into the list. If _d_i_r_e_c_t_i_o_n is negative, the search proceeds - backward from _p_o_s, otherwise forward. Returns the absolute index of - the history element where _s_t_r_i_n_g was found, or -1 otherwise. - - - MMaannaaggiinngg tthhee HHiissttoorryy FFiillee - The History library can read the history from and write it to a file. - This section documents the functions for managing a history file. - - _i_n_t rreeaadd__hhiissttoorryy (_c_o_n_s_t _c_h_a_r _*_f_i_l_e_n_a_m_e) - Add the contents of _f_i_l_e_n_a_m_e to the history list, a line at a time. If - _f_i_l_e_n_a_m_e is NNUULLLL, then read from _~_/_._h_i_s_t_o_r_y. Returns 0 if successful, - or eerrrrnnoo if not. - - _i_n_t rreeaadd__hhiissttoorryy__rraannggee (_c_o_n_s_t _c_h_a_r _*_f_i_l_e_n_a_m_e_, _i_n_t _f_r_o_m_, _i_n_t _t_o) - Read a range of lines from _f_i_l_e_n_a_m_e, adding them to the history list. - Start reading at line _f_r_o_m and end at _t_o. If _f_r_o_m is zero, start at - the beginning. If _t_o is less than _f_r_o_m, then read until the end of the - file. If _f_i_l_e_n_a_m_e is NNUULLLL, then read from _~_/_._h_i_s_t_o_r_y. Returns 0 if - successful, or eerrrrnnoo if not. - - _i_n_t wwrriittee__hhiissttoorryy (_c_o_n_s_t _c_h_a_r _*_f_i_l_e_n_a_m_e) - Write the current history to _f_i_l_e_n_a_m_e, overwriting _f_i_l_e_n_a_m_e if neces- - sary. If _f_i_l_e_n_a_m_e is NNUULLLL, then write the history list to _~_/_._h_i_s_t_o_r_y. - Returns 0 on success, or eerrrrnnoo on a read or write error. - - - _i_n_t aappppeenndd__hhiissttoorryy (_i_n_t _n_e_l_e_m_e_n_t_s_, _c_o_n_s_t _c_h_a_r _*_f_i_l_e_n_a_m_e) - Append the last _n_e_l_e_m_e_n_t_s of the history list to _f_i_l_e_n_a_m_e. If _f_i_l_e_n_a_m_e - is NNUULLLL, then append to _~_/_._h_i_s_t_o_r_y. Returns 0 on success, or eerrrrnnoo on - a read or write error. - - _i_n_t hhiissttoorryy__ttrruunnccaattee__ffiillee (_c_o_n_s_t _c_h_a_r _*_f_i_l_e_n_a_m_e_, _i_n_t _n_l_i_n_e_s) - Truncate the history file _f_i_l_e_n_a_m_e, leaving only the last _n_l_i_n_e_s lines. - If _f_i_l_e_n_a_m_e is NNUULLLL, then _~_/_._h_i_s_t_o_r_y is truncated. Returns 0 on suc- - cess, or eerrrrnnoo on failure. - - - HHiissttoorryy EExxppaannssiioonn - These functions implement history expansion. - - _i_n_t hhiissttoorryy__eexxppaanndd (_c_h_a_r _*_s_t_r_i_n_g_, _c_h_a_r _*_*_o_u_t_p_u_t) - Expand _s_t_r_i_n_g, placing the result into _o_u_t_p_u_t, a pointer to a string. - Returns: - 0 If no expansions took place (or, if the only change in - the text was the removal of escape characters preceding - the history expansion character); - 1 if expansions did take place; - -1 if there was an error in expansion; - 2 if the returned line should be displayed, but not exe- - cuted, as with the ::pp modifier. - If an error ocurred in expansion, then _o_u_t_p_u_t contains a descriptive - error message. - - _c_h_a_r _* ggeett__hhiissttoorryy__eevveenntt (_c_o_n_s_t _c_h_a_r _*_s_t_r_i_n_g_, _i_n_t _*_c_i_n_d_e_x_, _i_n_t _q_c_h_a_r) - Returns the text of the history event beginning at _s_t_r_i_n_g + _*_c_i_n_d_e_x. - _*_c_i_n_d_e_x is modified to point to after the event specifier. At function - entry, _c_i_n_d_e_x points to the index into _s_t_r_i_n_g where the history event - specification begins. _q_c_h_a_r is a character that is allowed to end the - event specification in addition to the ``normal'' terminating charac- - ters. - - _c_h_a_r _*_* hhiissttoorryy__ttookkeenniizzee (_c_o_n_s_t _c_h_a_r _*_s_t_r_i_n_g) - Return an array of tokens parsed out of _s_t_r_i_n_g, much as the shell - might. The tokens are split on the characters in the hhiiss-- - ttoorryy__wwoorrdd__ddeelliimmiitteerrss variable, and shell quoting conventions are - obeyed. - - _c_h_a_r _* hhiissttoorryy__aarrgg__eexxttrraacctt (_i_n_t _f_i_r_s_t_, _i_n_t _l_a_s_t_, _c_o_n_s_t _c_h_a_r _*_s_t_r_i_n_g) - Extract a string segment consisting of the _f_i_r_s_t through _l_a_s_t arguments - present in _s_t_r_i_n_g. Arguments are split using hhiissttoorryy__ttookkeenniizzee(()). - - - HHiissttoorryy VVaarriiaabblleess - This section describes the externally-visible variables exported by the - GNU History Library. - - _i_n_t hhiissttoorryy__bbaassee - The logical offset of the first entry in the history list. - - _i_n_t hhiissttoorryy__lleennggtthh - The number of entries currently stored in the history list. - - _i_n_t hhiissttoorryy__mmaaxx__eennttrriieess - The maximum number of history entries. This must be changed using ssttii-- - ffllee__hhiissttoorryy(()). - - _i_n_t hhiissttoorryy__wwrriittee__ttiimmeessttaammppss - If non-zero, timestamps are written to the history file, so they can be - preserved between sessions. The default value is 0, meaning that - timestamps are not saved. - - _c_h_a_r hhiissttoorryy__eexxppaannssiioonn__cchhaarr - The character that introduces a history event. The default is !!. Set- - ting this to 0 inhibits history expansion. - - _c_h_a_r hhiissttoorryy__ssuubbsstt__cchhaarr - The character that invokes word substitution if found at the start of a - line. The default is ^^. - - _c_h_a_r hhiissttoorryy__ccoommmmeenntt__cchhaarr - During tokenization, if this character is seen as the first character - of a word, then it and all subsequent characters up to a newline are - ignored, suppressing history expansion for the remainder of the line. - This is disabled by default. - - _c_h_a_r _* hhiissttoorryy__wwoorrdd__ddeelliimmiitteerrss - The characters that separate tokens for hhiissttoorryy__ttookkeenniizzee(()). The - default value is "" \\tt\\nn(())<<>>;;&&||"". - - _c_h_a_r _* hhiissttoorryy__nnoo__eexxppaanndd__cchhaarrss - The list of characters which inhibit history expansion if found immedi- - ately following hhiissttoorryy__eexxppaannssiioonn__cchhaarr. The default is space, tab, - newline, \\rr, and ==. - - _c_h_a_r _* hhiissttoorryy__sseeaarrcchh__ddeelliimmiitteerr__cchhaarrss - The list of additional characters which can delimit a history search - string, in addition to space, tab, _: and _? in the case of a substring - search. The default is empty. - - _i_n_t hhiissttoorryy__qquuootteess__iinnhhiibbiitt__eexxppaannssiioonn - If non-zero, single-quoted words are not scanned for the history expan- - sion character. The default value is 0. - - _r_l___l_i_n_e_b_u_f___f_u_n_c___t _* hhiissttoorryy__iinnhhiibbiitt__eexxppaannssiioonn__ffuunnccttiioonn - This should be set to the address of a function that takes two argu- - ments: a cchhaarr ** (_s_t_r_i_n_g) and an iinntt index into that string (_i). It - should return a non-zero value if the history expansion starting at - _s_t_r_i_n_g_[_i_] should not be performed; zero if the expansion should be - done. It is intended for use by applications like bbaasshh that use the - history expansion character for additional purposes. By default, this - variable is set to NNUULLLL. - -FFIILLEESS - _~_/_._h_i_s_t_o_r_y - Default filename for reading and writing saved history - -SSEEEE AALLSSOO - _T_h_e _G_n_u _R_e_a_d_l_i_n_e _L_i_b_r_a_r_y, Brian Fox and Chet Ramey - _T_h_e _G_n_u _H_i_s_t_o_r_y _L_i_b_r_a_r_y, Brian Fox and Chet Ramey - _b_a_s_h(1) - _r_e_a_d_l_i_n_e(3) - -AAUUTTHHOORRSS - Brian Fox, Free Software Foundation - bfox@gnu.org - - Chet Ramey, Case Western Reserve University - chet@ins.CWRU.Edu - -BBUUGG RREEPPOORRTTSS - If you find a bug in the hhiissttoorryy library, you should report it. But - first, you should make sure that it really is a bug, and that it - appears in the latest version of the hhiissttoorryy library that you have. - - Once you have determined that a bug actually exists, mail a bug report - to _b_u_g_-_r_e_a_d_l_i_n_e@_g_n_u_._o_r_g. If you have a fix, you are welcome to mail - that as well! Suggestions and `philosophical' bug reports may be - mailed to _b_u_g_-_r_e_a_d_l_i_n_e@_g_n_u_._o_r_g or posted to the Usenet newsgroup - ggnnuu..bbaasshh..bbuugg. - - Comments and bug reports concerning this manual page should be directed - to _c_h_e_t_@_i_n_s_._C_W_R_U_._E_d_u. - - - -GNU History 5.0 2003 July 31 HISTORY(3) diff --git a/dep/src/readline/src/doc/history.3 b/dep/src/readline/src/doc/history.3 deleted file mode 100644 index 3ade839ff7d..00000000000 --- a/dep/src/readline/src/doc/history.3 +++ /dev/null @@ -1,663 +0,0 @@ -.\" -.\" MAN PAGE COMMENTS to -.\" -.\" Chet Ramey -.\" Information Network Services -.\" Case Western Reserve University -.\" chet@ins.CWRU.Edu -.\" -.\" Last Change: Thu Jul 31 08:46:08 EDT 2003 -.\" -.TH HISTORY 3 "2003 July 31" "GNU History 5.0" -.\" -.\" File Name macro. This used to be `.PN', for Path Name, -.\" but Sun doesn't seem to like that very much. -.\" -.de FN -\fI\|\\$1\|\fP -.. -.ds lp \fR\|(\fP -.ds rp \fR\|)\fP -.\" FnN return-value fun-name N arguments -.de Fn1 -\fI\\$1\fP \fB\\$2\fP \\*(lp\fI\\$3\fP\\*(rp -.br -.. -.de Fn2 -.if t \fI\\$1\fP \fB\\$2\fP \\*(lp\fI\\$3,\|\\$4\fP\\*(rp -.if n \fI\\$1\fP \fB\\$2\fP \\*(lp\fI\\$3, \\$4\fP\\*(rp -.br -.. -.de Fn3 -.if t \fI\\$1\fP \fB\\$2\fP \\*(lp\fI\\$3,\|\\$4,\|\\$5\fP\|\\*(rp -.if n \fI\\$1\fP \fB\\$2\fP \\*(lp\fI\\$3, \\$4, \\$5\fP\\*(rp -.br -.. -.de Vb -\fI\\$1\fP \fB\\$2\fP -.br -.. -.SH NAME -history \- GNU History Library -.SH COPYRIGHT -.if t The GNU History Library is Copyright \(co 1989-2002 by the Free Software Foundation, Inc. -.if n The GNU History Library is Copyright (C) 1989-2002 by the Free Software Foundation, Inc. -.SH DESCRIPTION -Many programs read input from the user a line at a time. The GNU -History library is able to keep track of those lines, associate arbitrary -data with each line, and utilize information from previous lines in -composing new ones. -.PP -.SH "HISTORY EXPANSION" -.PP -The history library supports a history expansion feature that -is identical to the history expansion in -.BR bash. -This section describes what syntax features are available. -.PP -History expansions introduce words from the history list into -the input stream, making it easy to repeat commands, insert the -arguments to a previous command into the current input line, or -fix errors in previous commands quickly. -.PP -History expansion is usually performed immediately after a complete line -is read. -It takes place in two parts. -The first is to determine which line from the history list -to use during substitution. -The second is to select portions of that line for inclusion into -the current one. -The line selected from the history is the \fIevent\fP, -and the portions of that line that are acted upon are \fIwords\fP. -Various \fImodifiers\fP are available to manipulate the selected words. -The line is broken into words in the same fashion as \fBbash\fP -does when reading input, -so that several words that would otherwise be separated -are considered one word when surrounded by quotes (see the -description of \fBhistory_tokenize()\fP below). -History expansions are introduced by the appearance of the -history expansion character, which is \^\fB!\fP\^ by default. -Only backslash (\^\fB\e\fP\^) and single quotes can quote -the history expansion character. -.SS Event Designators -.PP -An event designator is a reference to a command line entry in the -history list. -.PP -.PD 0 -.TP -.B ! -Start a history substitution, except when followed by a -.BR blank , -newline, = or (. -.TP -.B !\fIn\fR -Refer to command line -.IR n . -.TP -.B !\-\fIn\fR -Refer to the current command line minus -.IR n . -.TP -.B !! -Refer to the previous command. This is a synonym for `!\-1'. -.TP -.B !\fIstring\fR -Refer to the most recent command starting with -.IR string . -.TP -.B !?\fIstring\fR\fB[?]\fR -Refer to the most recent command containing -.IR string . -The trailing \fB?\fP may be omitted if -.I string -is followed immediately by a newline. -.TP -.B \d\s+2^\s-2\u\fIstring1\fP\d\s+2^\s-2\u\fIstring2\fP\d\s+2^\s-2\u -Quick substitution. Repeat the last command, replacing -.I string1 -with -.IR string2 . -Equivalent to -``!!:s/\fIstring1\fP/\fIstring2\fP/'' -(see \fBModifiers\fP below). -.TP -.B !# -The entire command line typed so far. -.PD -.SS Word Designators -.PP -Word designators are used to select desired words from the event. -A -.B : -separates the event specification from the word designator. -It may be omitted if the word designator begins with a -.BR ^ , -.BR $ , -.BR * , -.BR \- , -or -.BR % . -Words are numbered from the beginning of the line, -with the first word being denoted by 0 (zero). -Words are inserted into the current line separated by single spaces. -.PP -.PD 0 -.TP -.B 0 (zero) -The zeroth word. For the shell, this is the command -word. -.TP -.I n -The \fIn\fRth word. -.TP -.B ^ -The first argument. That is, word 1. -.TP -.B $ -The last argument. -.TP -.B % -The word matched by the most recent `?\fIstring\fR?' search. -.TP -.I x\fB\-\fPy -A range of words; `\-\fIy\fR' abbreviates `0\-\fIy\fR'. -.TP -.B * -All of the words but the zeroth. This is a synonym -for `\fI1\-$\fP'. It is not an error to use -.B * -if there is just one -word in the event; the empty string is returned in that case. -.TP -.B x* -Abbreviates \fIx\-$\fP. -.TP -.B x\- -Abbreviates \fIx\-$\fP like \fBx*\fP, but omits the last word. -.PD -.PP -If a word designator is supplied without an event specification, the -previous command is used as the event. -.SS Modifiers -.PP -After the optional word designator, there may appear a sequence of -one or more of the following modifiers, each preceded by a `:'. -.PP -.PD 0 -.PP -.TP -.B h -Remove a trailing file name component, leaving only the head. -.TP -.B t -Remove all leading file name components, leaving the tail. -.TP -.B r -Remove a trailing suffix of the form \fI.xxx\fP, leaving the -basename. -.TP -.B e -Remove all but the trailing suffix. -.TP -.B p -Print the new command but do not execute it. -.TP -.B q -Quote the substituted words, escaping further substitutions. -.TP -.B x -Quote the substituted words as with -.BR q , -but break into words at -.B blanks -and newlines. -.TP -.B s/\fIold\fP/\fInew\fP/ -Substitute -.I new -for the first occurrence of -.I old -in the event line. Any delimiter can be used in place of /. The -final delimiter is optional if it is the last character of the -event line. The delimiter may be quoted in -.I old -and -.I new -with a single backslash. If & appears in -.IR new , -it is replaced by -.IR old . -A single backslash will quote the &. If -.I old -is null, it is set to the last -.I old -substituted, or, if no previous history substitutions took place, -the last -.I string -in a -.B !?\fIstring\fR\fB[?]\fR -search. -.TP -.B & -Repeat the previous substitution. -.TP -.B g -Cause changes to be applied over the entire event line. This is -used in conjunction with `\fB:s\fP' (e.g., `\fB:gs/\fIold\fP/\fInew\fP/\fR') -or `\fB:&\fP'. If used with -`\fB:s\fP', any delimiter can be used -in place of /, and the final delimiter is optional -if it is the last character of the event line. -An \fBa\fP may be used as a synonym for \fBg\fP. -.TP -.B G -Apply the following `\fBs\fP' modifier once to each word in the event line. -.PD -.SH "PROGRAMMING WITH HISTORY FUNCTIONS" -This section describes how to use the History library in other programs. -.SS Introduction to History -.PP -The programmer using the History library has available functions -for remembering lines on a history list, associating arbitrary data -with a line, removing lines from the list, searching through the list -for a line containing an arbitrary text string, and referencing any line -in the list directly. In addition, a history \fIexpansion\fP function -is available which provides for a consistent user interface across -different programs. -.PP -The user using programs written with the History library has the -benefit of a consistent user interface with a set of well-known -commands for manipulating the text of previous lines and using that text -in new commands. The basic history manipulation commands are -identical to -the history substitution provided by \fBbash\fP. -.PP -If the programmer desires, he can use the Readline library, which -includes some history manipulation by default, and has the added -advantage of command line editing. -.PP -Before declaring any functions using any functionality the History -library provides in other code, an application writer should include -the file -.FN -in any file that uses the -History library's features. It supplies extern declarations for all -of the library's public functions and variables, and declares all of -the public data structures. - -.SS History Storage -.PP -The history list is an array of history entries. A history entry is -declared as follows: -.PP -.Vb "typedef void *" histdata_t; -.PP -.nf -typedef struct _hist_entry { - char *line; - char *timestamp; - histdata_t data; -} HIST_ENTRY; -.fi -.PP -The history list itself might therefore be declared as -.PP -.Vb "HIST_ENTRY **" the_history_list; -.PP -The state of the History library is encapsulated into a single structure: -.PP -.nf -/* - * A structure used to pass around the current state of the history. - */ -typedef struct _hist_state { - HIST_ENTRY **entries; /* Pointer to the entries themselves. */ - int offset; /* The location pointer within this array. */ - int length; /* Number of elements within this array. */ - int size; /* Number of slots allocated to this array. */ - int flags; -} HISTORY_STATE; -.fi -.PP -If the flags member includes \fBHS_STIFLED\fP, the history has been -stifled. -.SH "History Functions" -.PP -This section describes the calling sequence for the various functions -exported by the GNU History library. -.SS Initializing History and State Management -This section describes functions used to initialize and manage -the state of the History library when you want to use the history -functions in your program. - -.Fn1 void using_history void -Begin a session in which the history functions might be used. This -initializes the interactive variables. - -.Fn1 "HISTORY_STATE *" history_get_history_state void -Return a structure describing the current state of the input history. - -.Fn1 void history_set_history_state "HISTORY_STATE *state" -Set the state of the history list according to \fIstate\fP. - -.SS History List Management - -These functions manage individual entries on the history list, or set -parameters managing the list itself. - -.Fn1 void add_history "const char *string" -Place \fIstring\fP at the end of the history list. The associated data -field (if any) is set to \fBNULL\fP. - -.Fn1 void add_history_time "const char *string" -Change the time stamp associated with the most recent history entry to -\fIstring\fP. - -.Fn1 "HIST_ENTRY *" remove_history "int which" -Remove history entry at offset \fIwhich\fP from the history. The -removed element is returned so you can free the line, data, -and containing structure. - -.Fn1 "histdata_t" free_history_entry "HIST_ENTRY *histent" -Free the history entry \fIhistent\fP and any history library private -data associated with it. Returns the application-specific data -so the caller can dispose of it. - -.Fn3 "HIST_ENTRY *" replace_history_entry "int which" "const char *line" "histdata_t data" -Make the history entry at offset \fIwhich\fP have \fIline\fP and \fIdata\fP. -This returns the old entry so the caller can dispose of any -application-specific data. In the case -of an invalid \fIwhich\fP, a \fBNULL\fP pointer is returned. - -.Fn1 void clear_history "void" -Clear the history list by deleting all the entries. - -.Fn1 void stifle_history "int max" -Stifle the history list, remembering only the last \fImax\fP entries. - -.Fn1 int unstifle_history "void" -Stop stifling the history. This returns the previously-set -maximum number of history entries (as set by \fBstifle_history()\fP). -history was stifled. The value is positive if the history was -stifled, negative if it wasn't. - -.Fn1 int history_is_stifled "void" -Returns non-zero if the history is stifled, zero if it is not. - -.SS Information About the History List - -These functions return information about the entire history list or -individual list entries. - -.Fn1 "HIST_ENTRY **" history_list "void" -Return a \fBNULL\fP terminated array of \fIHIST_ENTRY *\fP which is the -current input history. Element 0 of this list is the beginning of time. -If there is no history, return \fBNULL\fP. - -.Fn1 int where_history "void" -Returns the offset of the current history element. - -.Fn1 "HIST_ENTRY *" current_history "void" -Return the history entry at the current position, as determined by -\fBwhere_history()\fP. If there is no entry there, return a \fBNULL\fP -pointer. - -.Fn1 "HIST_ENTRY *" history_get "int offset" -Return the history entry at position \fIoffset\fP, starting from -\fBhistory_base\fP. -If there is no entry there, or if \fIoffset\fP -is greater than the history length, return a \fBNULL\fP pointer. - -.Fn1 "time_t" history_get_time "HIST_ENTRY *" -Return the time stamp associated with the history entry passed as the argument. - -.Fn1 int history_total_bytes "void" -Return the number of bytes that the primary history entries are using. -This function returns the sum of the lengths of all the lines in the -history. - -.SS Moving Around the History List - -These functions allow the current index into the history list to be -set or changed. - -.Fn1 int history_set_pos "int pos" -Set the current history offset to \fIpos\fP, an absolute index -into the list. -Returns 1 on success, 0 if \fIpos\fP is less than zero or greater -than the number of history entries. - -.Fn1 "HIST_ENTRY *" previous_history "void" -Back up the current history offset to the previous history entry, and -return a pointer to that entry. If there is no previous entry, return -a \fBNULL\fP pointer. - -.Fn1 "HIST_ENTRY *" next_history "void" -Move the current history offset forward to the next history entry, and -return the a pointer to that entry. If there is no next entry, return -a \fBNULL\fP pointer. - -.SS Searching the History List - -These functions allow searching of the history list for entries containing -a specific string. Searching may be performed both forward and backward -from the current history position. The search may be \fIanchored\fP, -meaning that the string must match at the beginning of the history entry. - -.Fn2 int history_search "const char *string" "int direction" -Search the history for \fIstring\fP, starting at the current history offset. -If \fIdirection\fP is less than 0, then the search is through -previous entries, otherwise through subsequent entries. -If \fIstring\fP is found, then -the current history index is set to that history entry, and the value -returned is the offset in the line of the entry where -\fIstring\fP was found. Otherwise, nothing is changed, and a -1 is -returned. - -.Fn2 int history_search_prefix "const char *string" "int direction" -Search the history for \fIstring\fP, starting at the current history -offset. The search is anchored: matching lines must begin with -\fIstring\fP. If \fIdirection\fP is less than 0, then the search is -through previous entries, otherwise through subsequent entries. -If \fIstring\fP is found, then the -current history index is set to that entry, and the return value is 0. -Otherwise, nothing is changed, and a -1 is returned. - -.Fn3 int history_search_pos "const char *string" "int direction" "int pos" -Search for \fIstring\fP in the history list, starting at \fIpos\fP, an -absolute index into the list. If \fIdirection\fP is negative, the search -proceeds backward from \fIpos\fP, otherwise forward. Returns the absolute -index of the history element where \fIstring\fP was found, or -1 otherwise. - -.SS Managing the History File -The History library can read the history from and write it to a file. -This section documents the functions for managing a history file. - -.Fn1 int read_history "const char *filename" -Add the contents of \fIfilename\fP to the history list, a line at a time. -If \fIfilename\fP is \fBNULL\fP, then read from \fI~/.history\fP. -Returns 0 if successful, or \fBerrno\fP if not. - -.Fn3 int read_history_range "const char *filename" "int from" "int to" -Read a range of lines from \fIfilename\fP, adding them to the history list. -Start reading at line \fIfrom\fP and end at \fIto\fP. -If \fIfrom\fP is zero, start at the beginning. If \fIto\fP is less than -\fIfrom\fP, then read until the end of the file. If \fIfilename\fP is -\fBNULL\fP, then read from \fI~/.history\fP. Returns 0 if successful, -or \fBerrno\fP if not. - -.Fn1 int write_history "const char *filename" -Write the current history to \fIfilename\fP, overwriting \fIfilename\fP -if necessary. -If \fIfilename\fP is \fBNULL\fP, then write the history list to \fI~/.history\fP. -Returns 0 on success, or \fBerrno\fP on a read or write error. - - -.Fn2 int append_history "int nelements" "const char *filename" -Append the last \fInelements\fP of the history list to \fIfilename\fP. -If \fIfilename\fP is \fBNULL\fP, then append to \fI~/.history\fP. -Returns 0 on success, or \fBerrno\fP on a read or write error. - -.Fn2 int history_truncate_file "const char *filename" "int nlines" -Truncate the history file \fIfilename\fP, leaving only the last -\fInlines\fP lines. -If \fIfilename\fP is \fBNULL\fP, then \fI~/.history\fP is truncated. -Returns 0 on success, or \fBerrno\fP on failure. - -.SS History Expansion - -These functions implement history expansion. - -.Fn2 int history_expand "char *string" "char **output" -Expand \fIstring\fP, placing the result into \fIoutput\fP, a pointer -to a string. Returns: -.RS -.PD 0 -.TP -0 -If no expansions took place (or, if the only change in -the text was the removal of escape characters preceding the history expansion -character); -.TP -1 -if expansions did take place; -.TP --1 -if there was an error in expansion; -.TP -2 -if the returned line should be displayed, but not executed, -as with the \fB:p\fP modifier. -.PD -.RE -If an error ocurred in expansion, then \fIoutput\fP contains a descriptive -error message. - -.Fn3 "char *" get_history_event "const char *string" "int *cindex" "int qchar" -Returns the text of the history event beginning at \fIstring\fP + -\fI*cindex\fP. \fI*cindex\fP is modified to point to after the event -specifier. At function entry, \fIcindex\fP points to the index into -\fIstring\fP where the history event specification begins. \fIqchar\fP -is a character that is allowed to end the event specification in addition -to the ``normal'' terminating characters. - -.Fn1 "char **" history_tokenize "const char *string" -Return an array of tokens parsed out of \fIstring\fP, much as the -shell might. -The tokens are split on the characters in the -\fBhistory_word_delimiters\fP variable, -and shell quoting conventions are obeyed. - -.Fn3 "char *" history_arg_extract "int first" "int last" "const char *string" -Extract a string segment consisting of the \fIfirst\fP through \fIlast\fP -arguments present in \fIstring\fP. Arguments are split using -\fBhistory_tokenize()\fP. - -.SS History Variables - -This section describes the externally-visible variables exported by -the GNU History Library. - -.Vb int history_base -The logical offset of the first entry in the history list. - -.Vb int history_length -The number of entries currently stored in the history list. - -.Vb int history_max_entries -The maximum number of history entries. This must be changed using -\fBstifle_history()\fP. - -.Vb int history_write_timestamps -If non-zero, timestamps are written to the history file, so they can be -preserved between sessions. The default value is 0, meaning that -timestamps are not saved. - -.Vb char history_expansion_char -The character that introduces a history event. The default is \fB!\fP. -Setting this to 0 inhibits history expansion. - -.Vb char history_subst_char -The character that invokes word substitution if found at the start of -a line. The default is \fB^\fP. - -.Vb char history_comment_char -During tokenization, if this character is seen as the first character -of a word, then it and all subsequent characters up to a newline are -ignored, suppressing history expansion for the remainder of the line. -This is disabled by default. - -.Vb "char *" history_word_delimiters -The characters that separate tokens for \fBhistory_tokenize()\fP. -The default value is \fB"\ \et\en()<>;&|"\fP. - -.Vb "char *" history_no_expand_chars -The list of characters which inhibit history expansion if found immediately -following \fBhistory_expansion_char\fP. The default is space, tab, newline, -\fB\er\fP, and \fB=\fP. - -.Vb "char *" history_search_delimiter_chars -The list of additional characters which can delimit a history search -string, in addition to space, tab, \fI:\fP and \fI?\fP in the case of -a substring search. The default is empty. - -.Vb int history_quotes_inhibit_expansion -If non-zero, single-quoted words are not scanned for the history expansion -character. The default value is 0. - -.Vb "rl_linebuf_func_t *" history_inhibit_expansion_function -This should be set to the address of a function that takes two arguments: -a \fBchar *\fP (\fIstring\fP) -and an \fBint\fP index into that string (\fIi\fP). -It should return a non-zero value if the history expansion starting at -\fIstring[i]\fP should not be performed; zero if the expansion should -be done. -It is intended for use by applications like \fBbash\fP that use the history -expansion character for additional purposes. -By default, this variable is set to \fBNULL\fP. -.SH FILES -.PD 0 -.TP -.FN ~/.history -Default filename for reading and writing saved history -.PD -.SH "SEE ALSO" -.PD 0 -.TP -\fIThe Gnu Readline Library\fP, Brian Fox and Chet Ramey -.TP -\fIThe Gnu History Library\fP, Brian Fox and Chet Ramey -.TP -\fIbash\fP(1) -.TP -\fIreadline\fP(3) -.PD -.SH AUTHORS -Brian Fox, Free Software Foundation -.br -bfox@gnu.org -.PP -Chet Ramey, Case Western Reserve University -.br -chet@ins.CWRU.Edu -.SH BUG REPORTS -If you find a bug in the -.B history -library, you should report it. But first, you should -make sure that it really is a bug, and that it appears in the latest -version of the -.B history -library that you have. -.PP -Once you have determined that a bug actually exists, mail a -bug report to \fIbug\-readline\fP@\fIgnu.org\fP. -If you have a fix, you are welcome to mail that -as well! Suggestions and `philosophical' bug reports may be mailed -to \fPbug-readline\fP@\fIgnu.org\fP or posted to the Usenet -newsgroup -.BR gnu.bash.bug . -.PP -Comments and bug reports concerning -this manual page should be directed to -.IR chet@ins.CWRU.Edu . diff --git a/dep/src/readline/src/doc/history.dvi b/dep/src/readline/src/doc/history.dvi deleted file mode 100644 index 031a31d67d216788192ce2f5bc657cd0200eea81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79856 zcmeFa3w&Hwob!GE!zyz1nR)P|FD{lⅈ>j&dO=mVXo!!`S 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 diff --git a/dep/src/readline/src/doc/history.html b/dep/src/readline/src/doc/history.html deleted file mode 100644 index d8e3a0e9030..00000000000 --- a/dep/src/readline/src/doc/history.html +++ /dev/null @@ -1,2270 +0,0 @@ - - - - - -GNU History Library: - - - - - - - - - - - - - - - - - -
[Top][Contents][Index][ ? ]
-

GNU History Library

- -This document describes the GNU History library, a programming tool that -provides a consistent user interface for recalling lines of previously -typed input. -

- -

- - - - - -
1. Using History Interactively  GNU History User's Manual.
2. Programming with GNU History  GNU History Programmer's Manual.
A. Copying This Manual  
B. Concept Index  Index of concepts described in this manual.
C. Function and Variable Index  Index of externally visible functions - and variables.
-

- -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
- -

1. Using History Interactively

- -

- -This chapter describes how to use the GNU History Library interactively, -from a user's standpoint. It should be considered a user's guide. For -information on using the GNU History Library in your own programs, -see section 2. Programming with GNU History. -

- -

- -
1.1 History Expansion  What it feels like using History as a user.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.1 History Expansion

- -

- -The History library provides a history expansion feature that is similar -to the history expansion provided by csh. This section -describes the syntax used to manipulate the history information. -

- -History expansions introduce words from the history list into -the input stream, making it easy to repeat commands, insert the -arguments to a previous command into the current input line, or -fix errors in previous commands quickly. -

- -History expansion takes place in two parts. The first is to determine -which line from the history list should be used during substitution. -The second is to select portions of that line for inclusion into the -current one. The line selected from the history is called the -event, and the portions of that line that are acted upon are -called words. Various modifiers are available to manipulate -the selected words. The line is broken into words in the same fashion -that Bash does, so that several words -surrounded by quotes are considered one word. -History expansions are introduced by the appearance of the -history expansion character, which is `!' by default. -

- -

- - - -
1.1.1 Event Designators  How to specify which history line to use.
1.1.2 Word Designators  Specifying which words are of interest.
1.1.3 Modifiers  Modifying the results of substitution.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.1.1 Event Designators

- -

- -An event designator is a reference to a command line entry in the -history list. - -

- -

- -
! -
Start a history substitution, except when followed by a space, tab, -the end of the line, or `='. -

- -

!n -
Refer to command line n. -

- -

!-n -
Refer to the command n lines back. -

- -

!! -
Refer to the previous command. This is a synonym for `!-1'. -

- -

!string -
Refer to the most recent command starting with string. -

- -

!?string[?] -
Refer to the most recent command containing string. The trailing -`?' may be omitted if the string is followed immediately by -a newline. -

- -

^string1^string2^ -
Quick Substitution. Repeat the last command, replacing string1 -with string2. Equivalent to -!!:s/string1/string2/. -

- -

!# -
The entire command line typed so far. -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.1.2 Word Designators

- -

- -Word designators are used to select desired words from the event. -A `:' separates the event specification from the word designator. It -may be omitted if the word designator begins with a `^', `$', -`*', `-', or `%'. Words are numbered from the beginning -of the line, with the first word being denoted by 0 (zero). Words are -inserted into the current line separated by single spaces. -

- -For example, -

- -

-
!! -
designates the preceding command. When you type this, the preceding -command is repeated in toto. -

- -

!!:$ -
designates the last argument of the preceding command. This may be -shortened to !$. -

- -

!fi:2 -
designates the second argument of the most recent command starting with -the letters fi. -
-

- -Here are the word designators: - -

- -
0 (zero) -
The 0th word. For many applications, this is the command word. -

- -

n -
The nth word. -

- -

^ -
The first argument; that is, word 1. -

- -

$ -
The last argument. -

- -

% -
The word matched by the most recent `?string?' search. -

- -

x-y -
A range of words; `-y' abbreviates `0-y'. -

- -

* -
All of the words, except the 0th. This is a synonym for `1-$'. -It is not an error to use `*' if there is just one word in the event; -the empty string is returned in that case. -

- -

x* -
Abbreviates `x-$' -

- -

x- -
Abbreviates `x-$' like `x*', but omits the last word. -

- -

-

- -If a word designator is supplied without an event specification, the -previous command is used as the event. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.1.3 Modifiers

- -

- -After the optional word designator, you can add a sequence of one or more -of the following modifiers, each preceded by a `:'. -

- -

- -
h -
Remove a trailing pathname component, leaving only the head. -

- -

t -
Remove all leading pathname components, leaving the tail. -

- -

r -
Remove a trailing suffix of the form `.suffix', leaving -the basename. -

- -

e -
Remove all but the trailing suffix. -

- -

p -
Print the new command but do not execute it. -

- -

s/old/new/ -
Substitute new for the first occurrence of old in the -event line. Any delimiter may be used in place of `/'. -The delimiter may be quoted in old and new -with a single backslash. If `&' appears in new, -it is replaced by old. A single backslash will quote -the `&'. The final delimiter is optional if it is the last -character on the input line. -

- -

& -
Repeat the previous substitution. -

- -

g -
a -
Cause changes to be applied over the entire event line. Used in -conjunction with `s', as in gs/old/new/, -or with `&'. -

- -

G -
Apply the following `s' modifier once to each word in the event. -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2. Programming with GNU History

- -

- -This chapter describes how to interface programs that you write -with the GNU History Library. -It should be considered a technical guide. -For information on the interactive use of GNU History, see section 1. Using History Interactively. -

- -

- - - - - -
2.1 Introduction to History  What is the GNU History library for?
2.2 History Storage  How information is stored.
2.3 History Functions  Functions that you can use.
2.4 History Variables  Variables that control behaviour.
2.5 History Programming Example  Example of using the GNU History Library.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.1 Introduction to History

- -

- -Many programs read input from the user a line at a time. The GNU -History library is able to keep track of those lines, associate arbitrary -data with each line, and utilize information from previous lines in -composing new ones. -

- -The programmer using the History library has available functions -for remembering lines on a history list, associating arbitrary data -with a line, removing lines from the list, searching through the list -for a line containing an arbitrary text string, and referencing any line -in the list directly. In addition, a history expansion function -is available which provides for a consistent user interface across -different programs. -

- -The user using programs written with the History library has the -benefit of a consistent user interface with a set of well-known -commands for manipulating the text of previous lines and using that text -in new commands. The basic history manipulation commands are similar to -the history substitution provided by csh. -

- -If the programmer desires, he can use the Readline library, which -includes some history manipulation by default, and has the added -advantage of command line editing. -

- -Before declaring any functions using any functionality the History -library provides in other code, an application writer should include -the file <readline/history.h> in any file that uses the -History library's features. It supplies extern declarations for all -of the library's public functions and variables, and declares all of -the public data structures. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.2 History Storage

- -

- -The history list is an array of history entries. A history entry is -declared as follows: -

- -
 
typedef void *histdata_t;
-
-typedef struct _hist_entry {
-  char *line;
-  char *timestamp;
-  histdata_t data;
-} HIST_ENTRY;
-

- -The history list itself might therefore be declared as -

- -
 
HIST_ENTRY **the_history_list;
-

- -The state of the History library is encapsulated into a single structure: -

- -
 
/*
- * A structure used to pass around the current state of the history.
- */
-typedef struct _hist_state {
-  HIST_ENTRY **entries; /* Pointer to the entries themselves. */
-  int offset;           /* The location pointer within this array. */
-  int length;           /* Number of elements within this array. */
-  int size;             /* Number of slots allocated to this array. */
-  int flags;
-} HISTORY_STATE;
-

- -If the flags member includes HS_STIFLED, the history has been -stifled. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.3 History Functions

- -

- -This section describes the calling sequence for the various functions -exported by the GNU History library. -

- -

- - - - - - - -
2.3.1 Initializing History and State Management  Functions to call when you - want to use history in a - program.
2.3.2 History List Management  Functions used to manage the list - of history entries.
2.3.3 Information About the History List  Functions returning information about - the history list.
2.3.4 Moving Around the History List  Functions used to change the position - in the history list.
2.3.5 Searching the History List  Functions to search the history list - for entries containing a string.
2.3.6 Managing the History File  Functions that read and write a file - containing the history list.
2.3.7 History Expansion  Functions to perform csh-like history - expansion.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.3.1 Initializing History and State Management

- -

- -This section describes functions used to initialize and manage -the state of the History library when you want to use the history -functions in your program. -

- - -

-
Function: void using_history (void) -
Begin a session in which the history functions might be used. This -initializes the interactive variables. -
-

- - -

-
Function: HISTORY_STATE * history_get_history_state (void) -
Return a structure describing the current state of the input history. -
-

- - -

-
Function: void history_set_history_state (HISTORY_STATE *state) -
Set the state of the history list according to state. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.3.2 History List Management

- -

- -These functions manage individual entries on the history list, or set -parameters managing the list itself. -

- - -

-
Function: void add_history (const char *string) -
Place string at the end of the history list. The associated data -field (if any) is set to NULL. -
-

- - -

-
Function: void add_history_time (const char *string) -
Change the time stamp associated with the most recent history entry to -string. -
-

- - -

-
Function: HIST_ENTRY * remove_history (int which) -
Remove history entry at offset which from the history. The -removed element is returned so you can free the line, data, -and containing structure. -
-

- - -

-
Function: histdata_t free_history_entry (HIST_ENTRY *histent) -
Free the history entry histent and any history library private -data associated with it. Returns the application-specific data -so the caller can dispose of it. -
-

- - -

-
Function: HIST_ENTRY * replace_history_entry (int which, const char *line, histdata_t data) -
Make the history entry at offset which have line and data. -This returns the old entry so the caller can dispose of any -application-specific data. In the case -of an invalid which, a NULL pointer is returned. -
-

- - -

-
Function: void clear_history (void) -
Clear the history list by deleting all the entries. -
-

- - -

-
Function: void stifle_history (int max) -
Stifle the history list, remembering only the last max entries. -
-

- - -

-
Function: int unstifle_history (void) -
Stop stifling the history. This returns the previously-set -maximum number of history entries (as set by stifle_history()). -The value is positive if the history was -stifled, negative if it wasn't. -
-

- - -

-
Function: int history_is_stifled (void) -
Returns non-zero if the history is stifled, zero if it is not. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.3.3 Information About the History List

- -

- -These functions return information about the entire history list or -individual list entries. -

- - -

-
Function: HIST_ENTRY ** history_list (void) -
Return a NULL terminated array of HIST_ENTRY * which is the -current input history. Element 0 of this list is the beginning of time. -If there is no history, return NULL. -
-

- - -

-
Function: int where_history (void) -
Returns the offset of the current history element. -
-

- - -

-
Function: HIST_ENTRY * current_history (void) -
Return the history entry at the current position, as determined by -where_history(). If there is no entry there, return a NULL -pointer. -
-

- - -

-
Function: HIST_ENTRY * history_get (int offset) -
Return the history entry at position offset, starting from -history_base (see section 2.4 History Variables). -If there is no entry there, or if offset -is greater than the history length, return a NULL pointer. -
-

- - -

-
Function: time_t history_get_time (HIST_ENTRY *entry) -
Return the time stamp associated with the history entry entry. -
-

- - -

-
Function: int history_total_bytes (void) -
Return the number of bytes that the primary history entries are using. -This function returns the sum of the lengths of all the lines in the -history. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.3.4 Moving Around the History List

- -

- -These functions allow the current index into the history list to be -set or changed. -

- - -

-
Function: int history_set_pos (int pos) -
Set the current history offset to pos, an absolute index -into the list. -Returns 1 on success, 0 if pos is less than zero or greater -than the number of history entries. -
-

- - -

-
Function: HIST_ENTRY * previous_history (void) -
Back up the current history offset to the previous history entry, and -return a pointer to that entry. If there is no previous entry, return -a NULL pointer. -
-

- - -

-
Function: HIST_ENTRY * next_history (void) -
Move the current history offset forward to the next history entry, and -return the a pointer to that entry. If there is no next entry, return -a NULL pointer. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.3.5 Searching the History List

- -

- -These functions allow searching of the history list for entries containing -a specific string. Searching may be performed both forward and backward -from the current history position. The search may be anchored, -meaning that the string must match at the beginning of the history entry. - -

- - -

-
Function: int history_search (const char *string, int direction) -
Search the history for string, starting at the current history offset. -If direction is less than 0, then the search is through -previous entries, otherwise through subsequent entries. -If string is found, then -the current history index is set to that history entry, and the value -returned is the offset in the line of the entry where -string was found. Otherwise, nothing is changed, and a -1 is -returned. -
-

- - -

-
Function: int history_search_prefix (const char *string, int direction) -
Search the history for string, starting at the current history -offset. The search is anchored: matching lines must begin with -string. If direction is less than 0, then the search is -through previous entries, otherwise through subsequent entries. -If string is found, then the -current history index is set to that entry, and the return value is 0. -Otherwise, nothing is changed, and a -1 is returned. -
-

- - -

-
Function: int history_search_pos (const char *string, int direction, int pos) -
Search for string in the history list, starting at pos, an -absolute index into the list. If direction is negative, the search -proceeds backward from pos, otherwise forward. Returns the absolute -index of the history element where string was found, or -1 otherwise. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.3.6 Managing the History File

- -

- -The History library can read the history from and write it to a file. -This section documents the functions for managing a history file. -

- - -

-
Function: int read_history (const char *filename) -
Add the contents of filename to the history list, a line at a time. -If filename is NULL, then read from `~/.history'. -Returns 0 if successful, or errno if not. -
-

- - -

-
Function: int read_history_range (const char *filename, int from, int to) -
Read a range of lines from filename, adding them to the history list. -Start reading at line from and end at to. -If from is zero, start at the beginning. If to is less than -from, then read until the end of the file. If filename is -NULL, then read from `~/.history'. Returns 0 if successful, -or errno if not. -
-

- - -

-
Function: int write_history (const char *filename) -
Write the current history to filename, overwriting filename -if necessary. -If filename is NULL, then write the history list to -`~/.history'. -Returns 0 on success, or errno on a read or write error. -
-

- - -

-
Function: int append_history (int nelements, const char *filename) -
Append the last nelements of the history list to filename. -If filename is NULL, then append to `~/.history'. -Returns 0 on success, or errno on a read or write error. -
-

- - -

-
Function: int history_truncate_file (const char *filename, int nlines) -
Truncate the history file filename, leaving only the last -nlines lines. -If filename is NULL, then `~/.history' is truncated. -Returns 0 on success, or errno on failure. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.3.7 History Expansion

- -

- -These functions implement history expansion. -

- - -

-
Function: int history_expand (char *string, char **output) -
Expand string, placing the result into output, a pointer -to a string (see section 1.1 History Expansion). Returns: -
-
0 -
If no expansions took place (or, if the only change in -the text was the removal of escape characters preceding the history expansion -character); -
1 -
if expansions did take place; -
-1 -
if there was an error in expansion; -
2 -
if the returned line should be displayed, but not executed, -as with the :p modifier (see section 1.1.3 Modifiers). -
-

- -If an error ocurred in expansion, then output contains a descriptive -error message. -

-

- - -

-
Function: char * get_history_event (const char *string, int *cindex, int qchar) -
Returns the text of the history event beginning at string + -*cindex. *cindex is modified to point to after the event -specifier. At function entry, cindex points to the index into -string where the history event specification begins. qchar -is a character that is allowed to end the event specification in addition -to the "normal" terminating characters. -
-

- - -

-
Function: char ** history_tokenize (const char *string) -
Return an array of tokens parsed out of string, much as the -shell might. The tokens are split on the characters in the -history_word_delimiters variable, -and shell quoting conventions are obeyed. -
-

- - -

-
Function: char * history_arg_extract (int first, int last, const char *string) -
Extract a string segment consisting of the first through last -arguments present in string. Arguments are split using -history_tokenize. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.4 History Variables

- -

- -This section describes the externally-visible variables exported by -the GNU History Library. -

- - -

-
Variable: int history_base -
The logical offset of the first entry in the history list. -
-

- - -

-
Variable: int history_length -
The number of entries currently stored in the history list. -
-

- - -

-
Variable: int history_max_entries -
The maximum number of history entries. This must be changed using -stifle_history(). -
-

- - -

-
Variable: int history_write_timestamps -
If non-zero, timestamps are written to the history file, so they can be -preserved between sessions. The default value is 0, meaning that -timestamps are not saved. -
-

- - -

-
Variable: char history_expansion_char -
The character that introduces a history event. The default is `!'. -Setting this to 0 inhibits history expansion. -
-

- - -

-
Variable: char history_subst_char -
The character that invokes word substitution if found at the start of -a line. The default is `^'. -
-

- - -

-
Variable: char history_comment_char -
During tokenization, if this character is seen as the first character -of a word, then it and all subsequent characters up to a newline are -ignored, suppressing history expansion for the remainder of the line. -This is disabled by default. -
-

- - -

-
Variable: char * history_word_delimiters -
The characters that separate tokens for history_tokenize(). -The default value is " \t\n()<>;&|". -
-

- - -

-
Variable: char * history_search_delimiter_chars -
The list of additional characters which can delimit a history search -string, in addition to space, TAB, `:' and `?' in the case of -a substring search. The default is empty. -
-

- - -

-
Variable: char * history_no_expand_chars -
The list of characters which inhibit history expansion if found immediately -following history_expansion_char. The default is space, tab, newline, -carriage return, and `='. -
-

- - -

-
Variable: int history_quotes_inhibit_expansion -
If non-zero, single-quoted words are not scanned for the history expansion -character. The default value is 0. -
-

- - -

-
Variable: rl_linebuf_func_t * history_inhibit_expansion_function -
This should be set to the address of a function that takes two arguments: -a char * (string) -and an int index into that string (i). -It should return a non-zero value if the history expansion starting at -string[i] should not be performed; zero if the expansion should -be done. -It is intended for use by applications like Bash that use the history -expansion character for additional purposes. -By default, this variable is set to NULL. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.5 History Programming Example

- -

- -The following program demonstrates simple use of the GNU History Library. -

- -
 
#include <stdio.h>
-#include <readline/history.h>
-
-main (argc, argv)
-     int argc;
-     char **argv;
-{
-  char line[1024], *t;
-  int len, done = 0;
-
-  line[0] = 0;
-
-  using_history ();
-  while (!done)
-    {
-      printf ("history$ ");
-      fflush (stdout);
-      t = fgets (line, sizeof (line) - 1, stdin);
-      if (t && *t)
-        {
-          len = strlen (t);
-          if (t[len - 1] == '\n')
-            t[len - 1] = '\0';
-        }
-
-      if (!t)
-        strcpy (line, "quit");
-
-      if (line[0])
-        {
-          char *expansion;
-          int result;
-
-          result = history_expand (line, &expansion);
-          if (result)
-            fprintf (stderr, "%s\n", expansion);
-
-          if (result < 0 || result == 2)
-            {
-              free (expansion);
-              continue;
-            }
-
-          add_history (expansion);
-          strncpy (line, expansion, sizeof (line) - 1);
-          free (expansion);
-        }
-
-      if (strcmp (line, "quit") == 0)
-        done = 1;
-      else if (strcmp (line, "save") == 0)
-        write_history ("history_file");
-      else if (strcmp (line, "read") == 0)
-        read_history ("history_file");
-      else if (strcmp (line, "list") == 0)
-        {
-          register HIST_ENTRY **the_list;
-          register int i;
-
-          the_list = history_list ();
-          if (the_list)
-            for (i = 0; the_list[i]; i++)
-              printf ("%d: %s\n", i + history_base, the_list[i]->line);
-        }
-      else if (strncmp (line, "delete", 6) == 0)
-        {
-          int which;
-          if ((sscanf (line + 6, "%d", &which)) == 1)
-            {
-              HIST_ENTRY *entry = remove_history (which);
-              if (!entry)
-                fprintf (stderr, "No such entry %d\n", which);
-              else
-                {
-                  free (entry->line);
-                  free (entry);
-                }
-            }
-          else
-            {
-              fprintf (stderr, "non-numeric arg given to `delete'\n");
-            }
-        }
-    }
-}
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

A. Copying This Manual

- -

- -

- -
A.1 GNU Free Documentation License  License for copying this manual.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

A.1 GNU Free Documentation License

- -

- - -

- Version 1.2, November 2002 -
-

- -
 
Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
-59 Temple Place, Suite 330, Boston, MA  02111-1307, USA
-
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.
-

- -

    -
  1. -PREAMBLE -

    - -The purpose of this License is to make a manual, textbook, or other -functional and useful document free in the sense of freedom: to -assure everyone the effective freedom to copy and redistribute it, -with or without modifying it, either commercially or noncommercially. -Secondarily, this License preserves for the author and publisher a way -to get credit for their work, while not being considered responsible -for modifications made by others. -

    - -This License is a kind of "copyleft", which means that derivative -works of the document must themselves be free in the same sense. It -complements the GNU General Public License, which is a copyleft -license designed for free software. -

    - -We have designed this License in order to use it for manuals for free -software, because free software needs free documentation: a free -program should come with manuals providing the same freedoms that the -software does. But this License is not limited to software manuals; -it can be used for any textual work, regardless of subject matter or -whether it is published as a printed book. We recommend this License -principally for works whose purpose is instruction or reference. -

    - -

  2. -APPLICABILITY AND DEFINITIONS -

    - -This License applies to any manual or other work, in any medium, that -contains a notice placed by the copyright holder saying it can be -distributed under the terms of this License. Such a notice grants a -world-wide, royalty-free license, unlimited in duration, to use that -work under the conditions stated herein. The "Document", below, -refers to any such manual or work. Any member of the public is a -licensee, and is addressed as "you". You accept the license if you -copy, modify or distribute the work in a way requiring permission -under copyright law. -

    - -A "Modified Version" of the Document means any work containing the -Document or a portion of it, either copied verbatim, or with -modifications and/or translated into another language. -

    - -A "Secondary Section" is a named appendix or a front-matter section -of the Document that deals exclusively with the relationship of the -publishers or authors of the Document to the Document's overall -subject (or to related matters) and contains nothing that could fall -directly within that overall subject. (Thus, if the Document is in -part a textbook of mathematics, a Secondary Section may not explain -any mathematics.) The relationship could be a matter of historical -connection with the subject or with related matters, or of legal, -commercial, philosophical, ethical or political position regarding -them. -

    - -The "Invariant Sections" are certain Secondary Sections whose titles -are designated, as being those of Invariant Sections, in the notice -that says that the Document is released under this License. If a -section does not fit the above definition of Secondary then it is not -allowed to be designated as Invariant. The Document may contain zero -Invariant Sections. If the Document does not identify any Invariant -Sections then there are none. -

    - -The "Cover Texts" are certain short passages of text that are listed, -as Front-Cover Texts or Back-Cover Texts, in the notice that says that -the Document is released under this License. A Front-Cover Text may -be at most 5 words, and a Back-Cover Text may be at most 25 words. -

    - -A "Transparent" copy of the Document means a machine-readable copy, -represented in a format whose specification is available to the -general public, that is suitable for revising the document -straightforwardly with generic text editors or (for images composed of -pixels) generic paint programs or (for drawings) some widely available -drawing editor, and that is suitable for input to text formatters or -for automatic translation to a variety of formats suitable for input -to text formatters. A copy made in an otherwise Transparent file -format whose markup, or absence of markup, has been arranged to thwart -or discourage subsequent modification by readers is not Transparent. -An image format is not Transparent if used for any substantial amount -of text. A copy that is not "Transparent" is called "Opaque". -

    - -Examples of suitable formats for Transparent copies include plain -ASCII without markup, Texinfo input format, LaTeX input -format, SGML or XML using a publicly available -DTD, and standard-conforming simple HTML, -PostScript or PDF designed for human modification. Examples -of transparent image formats include PNG, XCF and -JPG. Opaque formats include proprietary formats that can be -read and edited only by proprietary word processors, SGML or -XML for which the DTD and/or processing tools are -not generally available, and the machine-generated HTML, -PostScript or PDF produced by some word processors for -output purposes only. -

    - -The "Title Page" means, for a printed book, the title page itself, -plus such following pages as are needed to hold, legibly, the material -this License requires to appear in the title page. For works in -formats which do not have any title page as such, "Title Page" means -the text near the most prominent appearance of the work's title, -preceding the beginning of the body of the text. -

    - -A section "Entitled XYZ" means a named subunit of the Document whose -title either is precisely XYZ or contains XYZ in parentheses following -text that translates XYZ in another language. (Here XYZ stands for a -specific section name mentioned below, such as "Acknowledgements", -"Dedications", "Endorsements", or "History".) To "Preserve the Title" -of such a section when you modify the Document means that it remains a -section "Entitled XYZ" according to this definition. -

    - -The Document may include Warranty Disclaimers next to the notice which -states that this License applies to the Document. These Warranty -Disclaimers are considered to be included by reference in this -License, but only as regards disclaiming warranties: any other -implication that these Warranty Disclaimers may have is void and has -no effect on the meaning of this License. -

    - -

  3. -VERBATIM COPYING -

    - -You may copy and distribute the Document in any medium, either -commercially or noncommercially, provided that this License, the -copyright notices, and the license notice saying this License applies -to the Document are reproduced in all copies, and that you add no other -conditions whatsoever to those of this License. You may not use -technical measures to obstruct or control the reading or further -copying of the copies you make or distribute. However, you may accept -compensation in exchange for copies. If you distribute a large enough -number of copies you must also follow the conditions in section 3. -

    - -You may also lend copies, under the same conditions stated above, and -you may publicly display copies. -

    - -

  4. -COPYING IN QUANTITY -

    - -If you publish printed copies (or copies in media that commonly have -printed covers) of the Document, numbering more than 100, and the -Document's license notice requires Cover Texts, you must enclose the -copies in covers that carry, clearly and legibly, all these Cover -Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on -the back cover. Both covers must also clearly and legibly identify -you as the publisher of these copies. The front cover must present -the full title with all words of the title equally prominent and -visible. You may add other material on the covers in addition. -Copying with changes limited to the covers, as long as they preserve -the title of the Document and satisfy these conditions, can be treated -as verbatim copying in other respects. -

    - -If the required texts for either cover are too voluminous to fit -legibly, you should put the first ones listed (as many as fit -reasonably) on the actual cover, and continue the rest onto adjacent -pages. -

    - -If you publish or distribute Opaque copies of the Document numbering -more than 100, you must either include a machine-readable Transparent -copy along with each Opaque copy, or state in or with each Opaque copy -a computer-network location from which the general network-using -public has access to download using public-standard network protocols -a complete Transparent copy of the Document, free of added material. -If you use the latter option, you must take reasonably prudent steps, -when you begin distribution of Opaque copies in quantity, to ensure -that this Transparent copy will remain thus accessible at the stated -location until at least one year after the last time you distribute an -Opaque copy (directly or through your agents or retailers) of that -edition to the public. -

    - -It is requested, but not required, that you contact the authors of the -Document well before redistributing any large number of copies, to give -them a chance to provide you with an updated version of the Document. -

    - -

  5. -MODIFICATIONS -

    - -You may copy and distribute a Modified Version of the Document under -the conditions of sections 2 and 3 above, provided that you release -the Modified Version under precisely this License, with the Modified -Version filling the role of the Document, thus licensing distribution -and modification of the Modified Version to whoever possesses a copy -of it. In addition, you must do these things in the Modified Version: -

    - -

      -
    1. -Use in the Title Page (and on the covers, if any) a title distinct -from that of the Document, and from those of previous versions -(which should, if there were any, be listed in the History section -of the Document). You may use the same title as a previous version -if the original publisher of that version gives permission. -

      - -

    2. -List on the Title Page, as authors, one or more persons or entities -responsible for authorship of the modifications in the Modified -Version, together with at least five of the principal authors of the -Document (all of its principal authors, if it has fewer than five), -unless they release you from this requirement. -

      - -

    3. -State on the Title page the name of the publisher of the -Modified Version, as the publisher. -

      - -

    4. -Preserve all the copyright notices of the Document. -

      - -

    5. -Add an appropriate copyright notice for your modifications -adjacent to the other copyright notices. -

      - -

    6. -Include, immediately after the copyright notices, a license notice -giving the public permission to use the Modified Version under the -terms of this License, in the form shown in the Addendum below. -

      - -

    7. -Preserve in that license notice the full lists of Invariant Sections -and required Cover Texts given in the Document's license notice. -

      - -

    8. -Include an unaltered copy of this License. -

      - -

    9. -Preserve the section Entitled "History", Preserve its Title, and add -to it an item stating at least the title, year, new authors, and -publisher of the Modified Version as given on the Title Page. If -there is no section Entitled "History" in the Document, create one -stating the title, year, authors, and publisher of the Document as -given on its Title Page, then add an item describing the Modified -Version as stated in the previous sentence. -

      - -

    10. -Preserve the network location, if any, given in the Document for -public access to a Transparent copy of the Document, and likewise -the network locations given in the Document for previous versions -it was based on. These may be placed in the "History" section. -You may omit a network location for a work that was published at -least four years before the Document itself, or if the original -publisher of the version it refers to gives permission. -

      - -

    11. -For any section Entitled "Acknowledgements" or "Dedications", Preserve -the Title of the section, and preserve in the section all the -substance and tone of each of the contributor acknowledgements and/or -dedications given therein. -

      - -

    12. -Preserve all the Invariant Sections of the Document, -unaltered in their text and in their titles. Section numbers -or the equivalent are not considered part of the section titles. -

      - -

    13. -Delete any section Entitled "Endorsements". Such a section -may not be included in the Modified Version. -

      - -

    14. -Do not retitle any existing section to be Entitled "Endorsements" or -to conflict in title with any Invariant Section. -

      - -

    15. -Preserve any Warranty Disclaimers. -
    -

    - -If the Modified Version includes new front-matter sections or -appendices that qualify as Secondary Sections and contain no material -copied from the Document, you may at your option designate some or all -of these sections as invariant. To do this, add their titles to the -list of Invariant Sections in the Modified Version's license notice. -These titles must be distinct from any other section titles. -

    - -You may add a section Entitled "Endorsements", provided it contains -nothing but endorsements of your Modified Version by various -parties--for example, statements of peer review or that the text has -been approved by an organization as the authoritative definition of a -standard. -

    - -You may add a passage of up to five words as a Front-Cover Text, and a -passage of up to 25 words as a Back-Cover Text, to the end of the list -of Cover Texts in the Modified Version. Only one passage of -Front-Cover Text and one of Back-Cover Text may be added by (or -through arrangements made by) any one entity. If the Document already -includes a cover text for the same cover, previously added by you or -by arrangement made by the same entity you are acting on behalf of, -you may not add another; but you may replace the old one, on explicit -permission from the previous publisher that added the old one. -

    - -The author(s) and publisher(s) of the Document do not by this License -give permission to use their names for publicity for or to assert or -imply endorsement of any Modified Version. -

    - -

  6. -COMBINING DOCUMENTS -

    - -You may combine the Document with other documents released under this -License, under the terms defined in section 4 above for modified -versions, provided that you include in the combination all of the -Invariant Sections of all of the original documents, unmodified, and -list them all as Invariant Sections of your combined work in its -license notice, and that you preserve all their Warranty Disclaimers. -

    - -The combined work need only contain one copy of this License, and -multiple identical Invariant Sections may be replaced with a single -copy. If there are multiple Invariant Sections with the same name but -different contents, make the title of each such section unique by -adding at the end of it, in parentheses, the name of the original -author or publisher of that section if known, or else a unique number. -Make the same adjustment to the section titles in the list of -Invariant Sections in the license notice of the combined work. -

    - -In the combination, you must combine any sections Entitled "History" -in the various original documents, forming one section Entitled -"History"; likewise combine any sections Entitled "Acknowledgements", -and any sections Entitled "Dedications". You must delete all -sections Entitled "Endorsements." -

    - -

  7. -COLLECTIONS OF DOCUMENTS -

    - -You may make a collection consisting of the Document and other documents -released under this License, and replace the individual copies of this -License in the various documents with a single copy that is included in -the collection, provided that you follow the rules of this License for -verbatim copying of each of the documents in all other respects. -

    - -You may extract a single document from such a collection, and distribute -it individually under this License, provided you insert a copy of this -License into the extracted document, and follow this License in all -other respects regarding verbatim copying of that document. -

    - -

  8. -AGGREGATION WITH INDEPENDENT WORKS -

    - -A compilation of the Document or its derivatives with other separate -and independent documents or works, in or on a volume of a storage or -distribution medium, is called an "aggregate" if the copyright -resulting from the compilation is not used to limit the legal rights -of the compilation's users beyond what the individual works permit. -When the Document is included an aggregate, this License does not -apply to the other works in the aggregate which are not themselves -derivative works of the Document. -

    - -If the Cover Text requirement of section 3 is applicable to these -copies of the Document, then if the Document is less than one half of -the entire aggregate, the Document's Cover Texts may be placed on -covers that bracket the Document within the aggregate, or the -electronic equivalent of covers if the Document is in electronic form. -Otherwise they must appear on printed covers that bracket the whole -aggregate. -

    - -

  9. -TRANSLATION -

    - -Translation is considered a kind of modification, so you may -distribute translations of the Document under the terms of section 4. -Replacing Invariant Sections with translations requires special -permission from their copyright holders, but you may include -translations of some or all Invariant Sections in addition to the -original versions of these Invariant Sections. You may include a -translation of this License, and all the license notices in the -Document, and any Warranty Disclaimers, provided that you also include -the original English version of this License and the original versions -of those notices and disclaimers. In case of a disagreement between -the translation and the original version of this License or a notice -or disclaimer, the original version will prevail. -

    - -If a section in the Document is Entitled "Acknowledgements", -"Dedications", or "History", the requirement (section 4) to Preserve -its Title (section 1) will typically require changing the actual -title. -

    - -

  10. -TERMINATION -

    - -You may not copy, modify, sublicense, or distribute the Document except -as expressly provided for under this License. Any other attempt to -copy, modify, sublicense or distribute the Document is void, and will -automatically terminate your rights under this License. However, -parties who have received copies, or rights, from you under this -License will not have their licenses terminated so long as such -parties remain in full compliance. -

    - -

  11. -FUTURE REVISIONS OF THIS LICENSE -

    - -The Free Software Foundation may publish new, revised versions -of the GNU Free Documentation License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. See -http://www.gnu.org/copyleft/. -

    - -Each version of the License is given a distinguishing version number. -If the Document specifies that a particular numbered version of this -License "or any later version" applies to it, you have the option of -following the terms and conditions either of that specified version or -of any later version that has been published (not as a draft) by the -Free Software Foundation. If the Document does not specify a version -number of this License, you may choose any version ever published (not -as a draft) by the Free Software Foundation. -

-

- -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

A.1.1 ADDENDUM: How to use this License for your documents

- -

- -To use this License in a document you have written, include a copy of -the License in the document and put the following copyright and -license notices just after the title page: -

- -
 
  Copyright (C)  year  your name.
-  Permission is granted to copy, distribute and/or modify this document
-  under the terms of the GNU Free Documentation License, Version 1.2
-  or any later version published by the Free Software Foundation;
-  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
-  A copy of the license is included in the section entitled ``GNU
-  Free Documentation License''.
-

- -If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, -replace the "with...Texts." line with this: -

- -
 
    with the Invariant Sections being list their titles, with
-    the Front-Cover Texts being list, and with the Back-Cover Texts
-    being list.
-

- -If you have Invariant Sections without Cover Texts, or some other -combination of the three, merge those two alternatives to suit the -situation. -

- -If your document contains nontrivial examples of program code, we -recommend releasing these examples in parallel under your choice of -free software license, such as the GNU General Public License, -to permit their use in free software. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

B. Concept Index

- -
Jump to:   A -   -E -   -F -   -H -   -

- - - - - - - - - - - - - - - - - -
Index Entry Section

A
anchored search2.3.5 Searching the History List

E
event designators1.1.1 Event Designators

F
FDL, GNU Free Documentation LicenseA.1 GNU Free Documentation License

H
history events1.1.1 Event Designators
history expansion1.1 History Expansion
History Searching2.3.5 Searching the History List

Jump to:   A -   -E -   -F -   -H -   -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

C. Function and Variable Index

- -
Jump to:   A -   -C -   -F -   -G -   -H -   -N -   -P -   -R -   -S -   -U -   -W -   -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Index Entry Section

A
add_history2.3.2 History List Management
add_history_time2.3.2 History List Management
append_history2.3.6 Managing the History File

C
clear_history2.3.2 History List Management
current_history2.3.3 Information About the History List

F
free_history_entry2.3.2 History List Management

G
get_history_event2.3.7 History Expansion

H
history_arg_extract2.3.7 History Expansion
history_base2.4 History Variables
history_comment_char2.4 History Variables
history_expand2.3.7 History Expansion
history_expansion_char2.4 History Variables
history_get2.3.3 Information About the History List
history_get_history_state2.3.1 Initializing History and State Management
history_get_time2.3.3 Information About the History List
history_inhibit_expansion_function2.4 History Variables
history_is_stifled2.3.2 History List Management
history_length2.4 History Variables
history_list2.3.3 Information About the History List
history_max_entries2.4 History Variables
history_no_expand_chars2.4 History Variables
history_quotes_inhibit_expansion2.4 History Variables
history_search2.3.5 Searching the History List
history_search_delimiter_chars2.4 History Variables
history_search_pos2.3.5 Searching the History List
history_search_prefix2.3.5 Searching the History List
history_set_history_state2.3.1 Initializing History and State Management
history_set_pos2.3.4 Moving Around the History List
history_subst_char2.4 History Variables
history_tokenize2.3.7 History Expansion
history_total_bytes2.3.3 Information About the History List
history_truncate_file2.3.6 Managing the History File
history_word_delimiters2.4 History Variables
history_write_timestamps2.4 History Variables

N
next_history2.3.4 Moving Around the History List

P
previous_history2.3.4 Moving Around the History List

R
read_history2.3.6 Managing the History File
read_history_range2.3.6 Managing the History File
remove_history2.3.2 History List Management
replace_history_entry2.3.2 History List Management

S
stifle_history2.3.2 History List Management

U
unstifle_history2.3.2 History List Management
using_history2.3.1 Initializing History and State Management

W
where_history2.3.3 Information About the History List
write_history2.3.6 Managing the History File

Jump to:   A -   -C -   -F -   -G -   -H -   -N -   -P -   -R -   -S -   -U -   -W -   -

- -


- - - - - - -
[Top][Contents][Index][ ? ]
-

Table of Contents

- -
- - - - - - -
[Top][Contents][Index][ ? ]
-

Short Table of Contents

-
-1. Using History Interactively -
-2. Programming with GNU History -
-A. Copying This Manual -
-B. Concept Index -
-C. Function and Variable Index -
- -
-
- - - - - - -
[Top][Contents][Index][ ? ]
-

About this document

-This document was generated by Chet Ramey on July, 27 2004 -using texi2html -

-The buttons in the navigation panels have the following meaning: -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Button Name Go to From 1.2.3 go to
- [ < ] -Back - -previous section in reading order - -1.2.2 -
- [ > ] -Forward - -next section in reading order - -1.2.4 -
- [ << ] -FastBack - -previous or up-and-previous section - -1.1 -
- [ Up ] -Up - -up section - -1.2 -
- [ >> ] -FastForward - -next or up-and-next section - -1.3 -
- [Top] -Top - -cover (top) of document - -   -
- [Contents] -Contents - -table of contents - -   -
- [Index] -Index - -concept index - -   -
- [ ? ] -About - -this page - -   -
-

-where the Example assumes that the current position -is at Subsubsection One-Two-Three of a document of -the following structure: -
    -
  • 1. Section One
  • -
      -
    • 1.1 Subsection One-One
    • -
        -
      • ...
      • -
      -
    • 1.2 Subsection One-Two
    • -
        -
      • 1.2.1 Subsubsection One-Two-One -
      • 1.2.2 Subsubsection One-Two-Two -
      • 1.2.3 Subsubsection One-Two-Three     -<== Current Position -
      • 1.2.4 Subsubsection One-Two-Four -
      -
    • 1.3 Subsection One-Three
    • -
        -
      • ...
      • -
      -
    • 1.4 Subsection One-Four
    • -
    -
- -
-
- -This document was generated -by Chet Ramey on July, 27 2004 -using texi2html - - - diff --git a/dep/src/readline/src/doc/history.info b/dep/src/readline/src/doc/history.info deleted file mode 100644 index 8896f58f117..00000000000 --- a/dep/src/readline/src/doc/history.info +++ /dev/null @@ -1,1317 +0,0 @@ -This is history.info, produced by makeinfo version 4.5 from -/usr/homes/chet/src/bash/readline-src/doc/history.texi. - -This document describes the GNU History library (version 5.0, 28 -January 2004), a programming tool that provides a consistent user -interface for recalling lines of previously typed input. - - Copyright (C) 1988-2004 Free Software Foundation, Inc. - - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - - Permission is granted to copy, distribute and/or modify this - document under the terms of the GNU Free Documentation License, - Version 1.1 or any later version published by the Free Software - Foundation; with no Invariant Sections, with the Front-Cover texts - being "A GNU Manual," and with the Back-Cover Texts as in (a) - below. A copy of the license is included in the section entitled - "GNU Free Documentation License." - - (a) The FSF's Back-Cover Text is: "You have freedom to copy and - modify this GNU Manual, like GNU software. Copies published by - the Free Software Foundation raise funds for GNU development." - -INFO-DIR-SECTION Libraries -START-INFO-DIR-ENTRY -* History: (history). The GNU history library API. -END-INFO-DIR-ENTRY - - -File: history.info, Node: Top, Next: Using History Interactively, Up: (dir) - -GNU History Library -******************* - - This document describes the GNU History library, a programming tool -that provides a consistent user interface for recalling lines of -previously typed input. - -* Menu: - -* Using History Interactively:: GNU History User's Manual. -* Programming with GNU History:: GNU History Programmer's Manual. -* Copying This Manual:: Copying This Manual. -* Concept Index:: Index of concepts described in this manual. -* Function and Variable Index:: Index of externally visible functions - and variables. - - -File: history.info, Node: Using History Interactively, Next: Programming with GNU History, Prev: Top, Up: Top - -Using History Interactively -*************************** - - This chapter describes how to use the GNU History Library -interactively, from a user's standpoint. It should be considered a -user's guide. For information on using the GNU History Library in your -own programs, *note Programming with GNU History::. - -* Menu: - -* History Interaction:: What it feels like using History as a user. - - -File: history.info, Node: History Interaction, Up: Using History Interactively - -History Expansion -================= - - The History library provides a history expansion feature that is -similar to the history expansion provided by `csh'. This section -describes the syntax used to manipulate the history information. - - History expansions introduce words from the history list into the -input stream, making it easy to repeat commands, insert the arguments -to a previous command into the current input line, or fix errors in -previous commands quickly. - - History expansion takes place in two parts. The first is to -determine which line from the history list should be used during -substitution. The second is to select portions of that line for -inclusion into the current one. The line selected from the history is -called the "event", and the portions of that line that are acted upon -are called "words". Various "modifiers" are available to manipulate -the selected words. The line is broken into words in the same fashion -that Bash does, so that several words surrounded by quotes are -considered one word. History expansions are introduced by the -appearance of the history expansion character, which is `!' by default. - -* Menu: - -* Event Designators:: How to specify which history line to use. -* Word Designators:: Specifying which words are of interest. -* Modifiers:: Modifying the results of substitution. - - -File: history.info, Node: Event Designators, Next: Word Designators, Up: History Interaction - -Event Designators ------------------ - - An event designator is a reference to a command line entry in the -history list. - -`!' - Start a history substitution, except when followed by a space, tab, - the end of the line, or `='. - -`!N' - Refer to command line N. - -`!-N' - Refer to the command N lines back. - -`!!' - Refer to the previous command. This is a synonym for `!-1'. - -`!STRING' - Refer to the most recent command starting with STRING. - -`!?STRING[?]' - Refer to the most recent command containing STRING. The trailing - `?' may be omitted if the STRING is followed immediately by a - newline. - -`^STRING1^STRING2^' - Quick Substitution. Repeat the last command, replacing STRING1 - with STRING2. Equivalent to `!!:s/STRING1/STRING2/'. - -`!#' - The entire command line typed so far. - - - -File: history.info, Node: Word Designators, Next: Modifiers, Prev: Event Designators, Up: History Interaction - -Word Designators ----------------- - - Word designators are used to select desired words from the event. A -`:' separates the event specification from the word designator. It may -be omitted if the word designator begins with a `^', `$', `*', `-', or -`%'. Words are numbered from the beginning of the line, with the first -word being denoted by 0 (zero). Words are inserted into the current -line separated by single spaces. - - For example, - -`!!' - designates the preceding command. When you type this, the - preceding command is repeated in toto. - -`!!:$' - designates the last argument of the preceding command. This may be - shortened to `!$'. - -`!fi:2' - designates the second argument of the most recent command starting - with the letters `fi'. - - Here are the word designators: - -`0 (zero)' - The `0'th word. For many applications, this is the command word. - -`N' - The Nth word. - -`^' - The first argument; that is, word 1. - -`$' - The last argument. - -`%' - The word matched by the most recent `?STRING?' search. - -`X-Y' - A range of words; `-Y' abbreviates `0-Y'. - -`*' - All of the words, except the `0'th. This is a synonym for `1-$'. - It is not an error to use `*' if there is just one word in the - event; the empty string is returned in that case. - -`X*' - Abbreviates `X-$' - -`X-' - Abbreviates `X-$' like `X*', but omits the last word. - - - If a word designator is supplied without an event specification, the -previous command is used as the event. - - -File: history.info, Node: Modifiers, Prev: Word Designators, Up: History Interaction - -Modifiers ---------- - - After the optional word designator, you can add a sequence of one or -more of the following modifiers, each preceded by a `:'. - -`h' - Remove a trailing pathname component, leaving only the head. - -`t' - Remove all leading pathname components, leaving the tail. - -`r' - Remove a trailing suffix of the form `.SUFFIX', leaving the - basename. - -`e' - Remove all but the trailing suffix. - -`p' - Print the new command but do not execute it. - -`s/OLD/NEW/' - Substitute NEW for the first occurrence of OLD in the event line. - Any delimiter may be used in place of `/'. The delimiter may be - quoted in OLD and NEW with a single backslash. If `&' appears in - NEW, it is replaced by OLD. A single backslash will quote the - `&'. The final delimiter is optional if it is the last character - on the input line. - -`&' - Repeat the previous substitution. - -`g' -`a' - Cause changes to be applied over the entire event line. Used in - conjunction with `s', as in `gs/OLD/NEW/', or with `&'. - -`G' - Apply the following `s' modifier once to each word in the event. - - - -File: history.info, Node: Programming with GNU History, Next: Copying This Manual, Prev: Using History Interactively, Up: Top - -Programming with GNU History -**************************** - - This chapter describes how to interface programs that you write with -the GNU History Library. It should be considered a technical guide. -For information on the interactive use of GNU History, *note Using -History Interactively::. - -* Menu: - -* Introduction to History:: What is the GNU History library for? -* History Storage:: How information is stored. -* History Functions:: Functions that you can use. -* History Variables:: Variables that control behaviour. -* History Programming Example:: Example of using the GNU History Library. - - -File: history.info, Node: Introduction to History, Next: History Storage, Up: Programming with GNU History - -Introduction to History -======================= - - Many programs read input from the user a line at a time. The GNU -History library is able to keep track of those lines, associate -arbitrary data with each line, and utilize information from previous -lines in composing new ones. - - The programmer using the History library has available functions for -remembering lines on a history list, associating arbitrary data with a -line, removing lines from the list, searching through the list for a -line containing an arbitrary text string, and referencing any line in -the list directly. In addition, a history "expansion" function is -available which provides for a consistent user interface across -different programs. - - The user using programs written with the History library has the -benefit of a consistent user interface with a set of well-known -commands for manipulating the text of previous lines and using that text -in new commands. The basic history manipulation commands are similar to -the history substitution provided by `csh'. - - If the programmer desires, he can use the Readline library, which -includes some history manipulation by default, and has the added -advantage of command line editing. - - Before declaring any functions using any functionality the History -library provides in other code, an application writer should include -the file `' in any file that uses the History -library's features. It supplies extern declarations for all of the -library's public functions and variables, and declares all of the -public data structures. - - -File: history.info, Node: History Storage, Next: History Functions, Prev: Introduction to History, Up: Programming with GNU History - -History Storage -=============== - - The history list is an array of history entries. A history entry is -declared as follows: - - typedef void *histdata_t; - - typedef struct _hist_entry { - char *line; - char *timestamp; - histdata_t data; - } HIST_ENTRY; - - The history list itself might therefore be declared as - - HIST_ENTRY **the_history_list; - - The state of the History library is encapsulated into a single -structure: - - /* - * A structure used to pass around the current state of the history. - */ - typedef struct _hist_state { - HIST_ENTRY **entries; /* Pointer to the entries themselves. */ - int offset; /* The location pointer within this array. */ - int length; /* Number of elements within this array. */ - int size; /* Number of slots allocated to this array. */ - int flags; - } HISTORY_STATE; - - If the flags member includes `HS_STIFLED', the history has been -stifled. - - -File: history.info, Node: History Functions, Next: History Variables, Prev: History Storage, Up: Programming with GNU History - -History Functions -================= - - This section describes the calling sequence for the various functions -exported by the GNU History library. - -* Menu: - -* Initializing History and State Management:: Functions to call when you - want to use history in a - program. -* History List Management:: Functions used to manage the list - of history entries. -* Information About the History List:: Functions returning information about - the history list. -* Moving Around the History List:: Functions used to change the position - in the history list. -* Searching the History List:: Functions to search the history list - for entries containing a string. -* Managing the History File:: Functions that read and write a file - containing the history list. -* History Expansion:: Functions to perform csh-like history - expansion. - - -File: history.info, Node: Initializing History and State Management, Next: History List Management, Up: History Functions - -Initializing History and State Management ------------------------------------------ - - This section describes functions used to initialize and manage the -state of the History library when you want to use the history functions -in your program. - - - Function: void using_history (void) - Begin a session in which the history functions might be used. This - initializes the interactive variables. - - - Function: HISTORY_STATE * history_get_history_state (void) - Return a structure describing the current state of the input - history. - - - Function: void history_set_history_state (HISTORY_STATE *state) - Set the state of the history list according to STATE. - - -File: history.info, Node: History List Management, Next: Information About the History List, Prev: Initializing History and State Management, Up: History Functions - -History List Management ------------------------ - - These functions manage individual entries on the history list, or set -parameters managing the list itself. - - - Function: void add_history (const char *string) - Place STRING at the end of the history list. The associated data - field (if any) is set to `NULL'. - - - Function: void add_history_time (const char *string) - Change the time stamp associated with the most recent history - entry to STRING. - - - Function: HIST_ENTRY * remove_history (int which) - Remove history entry at offset WHICH from the history. The - removed element is returned so you can free the line, data, and - containing structure. - - - Function: histdata_t free_history_entry (HIST_ENTRY *histent) - Free the history entry HISTENT and any history library private - data associated with it. Returns the application-specific data so - the caller can dispose of it. - - - Function: HIST_ENTRY * replace_history_entry (int which, const char - *line, histdata_t data) - Make the history entry at offset WHICH have LINE and DATA. This - returns the old entry so the caller can dispose of any - application-specific data. In the case of an invalid WHICH, a - `NULL' pointer is returned. - - - Function: void clear_history (void) - Clear the history list by deleting all the entries. - - - Function: void stifle_history (int max) - Stifle the history list, remembering only the last MAX entries. - - - Function: int unstifle_history (void) - Stop stifling the history. This returns the previously-set - maximum number of history entries (as set by `stifle_history()'). - The value is positive if the history was stifled, negative if it - wasn't. - - - Function: int history_is_stifled (void) - Returns non-zero if the history is stifled, zero if it is not. - - -File: history.info, Node: Information About the History List, Next: Moving Around the History List, Prev: History List Management, Up: History Functions - -Information About the History List ----------------------------------- - - These functions return information about the entire history list or -individual list entries. - - - Function: HIST_ENTRY ** history_list (void) - Return a `NULL' terminated array of `HIST_ENTRY *' which is the - current input history. Element 0 of this list is the beginning of - time. If there is no history, return `NULL'. - - - Function: int where_history (void) - Returns the offset of the current history element. - - - Function: HIST_ENTRY * current_history (void) - Return the history entry at the current position, as determined by - `where_history()'. If there is no entry there, return a `NULL' - pointer. - - - Function: HIST_ENTRY * history_get (int offset) - Return the history entry at position OFFSET, starting from - `history_base' (*note History Variables::). If there is no entry - there, or if OFFSET is greater than the history length, return a - `NULL' pointer. - - - Function: time_t history_get_time (HIST_ENTRY *entry) - Return the time stamp associated with the history entry ENTRY. - - - Function: int history_total_bytes (void) - Return the number of bytes that the primary history entries are - using. This function returns the sum of the lengths of all the - lines in the history. - - -File: history.info, Node: Moving Around the History List, Next: Searching the History List, Prev: Information About the History List, Up: History Functions - -Moving Around the History List ------------------------------- - - These functions allow the current index into the history list to be -set or changed. - - - Function: int history_set_pos (int pos) - Set the current history offset to POS, an absolute index into the - list. Returns 1 on success, 0 if POS is less than zero or greater - than the number of history entries. - - - Function: HIST_ENTRY * previous_history (void) - Back up the current history offset to the previous history entry, - and return a pointer to that entry. If there is no previous - entry, return a `NULL' pointer. - - - Function: HIST_ENTRY * next_history (void) - Move the current history offset forward to the next history entry, - and return the a pointer to that entry. If there is no next - entry, return a `NULL' pointer. - - -File: history.info, Node: Searching the History List, Next: Managing the History File, Prev: Moving Around the History List, Up: History Functions - -Searching the History List --------------------------- - - These functions allow searching of the history list for entries -containing a specific string. Searching may be performed both forward -and backward from the current history position. The search may be -"anchored", meaning that the string must match at the beginning of the -history entry. - - - Function: int history_search (const char *string, int direction) - Search the history for STRING, starting at the current history - offset. If DIRECTION is less than 0, then the search is through - previous entries, otherwise through subsequent entries. If STRING - is found, then the current history index is set to that history - entry, and the value returned is the offset in the line of the - entry where STRING was found. Otherwise, nothing is changed, and - a -1 is returned. - - - Function: int history_search_prefix (const char *string, int - direction) - Search the history for STRING, starting at the current history - offset. The search is anchored: matching lines must begin with - STRING. If DIRECTION is less than 0, then the search is through - previous entries, otherwise through subsequent entries. If STRING - is found, then the current history index is set to that entry, and - the return value is 0. Otherwise, nothing is changed, and a -1 is - returned. - - - Function: int history_search_pos (const char *string, int direction, - int pos) - Search for STRING in the history list, starting at POS, an - absolute index into the list. If DIRECTION is negative, the search - proceeds backward from POS, otherwise forward. Returns the - absolute index of the history element where STRING was found, or - -1 otherwise. - - -File: history.info, Node: Managing the History File, Next: History Expansion, Prev: Searching the History List, Up: History Functions - -Managing the History File -------------------------- - - The History library can read the history from and write it to a file. -This section documents the functions for managing a history file. - - - Function: int read_history (const char *filename) - Add the contents of FILENAME to the history list, a line at a time. - If FILENAME is `NULL', then read from `~/.history'. Returns 0 if - successful, or `errno' if not. - - - Function: int read_history_range (const char *filename, int from, - int to) - Read a range of lines from FILENAME, adding them to the history - list. Start reading at line FROM and end at TO. If FROM is zero, - start at the beginning. If TO is less than FROM, then read until - the end of the file. If FILENAME is `NULL', then read from - `~/.history'. Returns 0 if successful, or `errno' if not. - - - Function: int write_history (const char *filename) - Write the current history to FILENAME, overwriting FILENAME if - necessary. If FILENAME is `NULL', then write the history list to - `~/.history'. Returns 0 on success, or `errno' on a read or write - error. - - - Function: int append_history (int nelements, const char *filename) - Append the last NELEMENTS of the history list to FILENAME. If - FILENAME is `NULL', then append to `~/.history'. Returns 0 on - success, or `errno' on a read or write error. - - - Function: int history_truncate_file (const char *filename, int - nlines) - Truncate the history file FILENAME, leaving only the last NLINES - lines. If FILENAME is `NULL', then `~/.history' is truncated. - Returns 0 on success, or `errno' on failure. - - -File: history.info, Node: History Expansion, Prev: Managing the History File, Up: History Functions - -History Expansion ------------------ - - These functions implement history expansion. - - - Function: int history_expand (char *string, char **output) - Expand STRING, placing the result into OUTPUT, a pointer to a - string (*note History Interaction::). Returns: - `0' - If no expansions took place (or, if the only change in the - text was the removal of escape characters preceding the - history expansion character); - - `1' - if expansions did take place; - - `-1' - if there was an error in expansion; - - `2' - if the returned line should be displayed, but not executed, - as with the `:p' modifier (*note Modifiers::). - - If an error ocurred in expansion, then OUTPUT contains a - descriptive error message. - - - Function: char * get_history_event (const char *string, int *cindex, - int qchar) - Returns the text of the history event beginning at STRING + - *CINDEX. *CINDEX is modified to point to after the event - specifier. At function entry, CINDEX points to the index into - STRING where the history event specification begins. QCHAR is a - character that is allowed to end the event specification in - addition to the "normal" terminating characters. - - - Function: char ** history_tokenize (const char *string) - Return an array of tokens parsed out of STRING, much as the shell - might. The tokens are split on the characters in the - HISTORY_WORD_DELIMITERS variable, and shell quoting conventions - are obeyed. - - - Function: char * history_arg_extract (int first, int last, const - char *string) - Extract a string segment consisting of the FIRST through LAST - arguments present in STRING. Arguments are split using - `history_tokenize'. - - -File: history.info, Node: History Variables, Next: History Programming Example, Prev: History Functions, Up: Programming with GNU History - -History Variables -================= - - This section describes the externally-visible variables exported by -the GNU History Library. - - - Variable: int history_base - The logical offset of the first entry in the history list. - - - Variable: int history_length - The number of entries currently stored in the history list. - - - Variable: int history_max_entries - The maximum number of history entries. This must be changed using - `stifle_history()'. - - - Variable: int history_write_timestamps - If non-zero, timestamps are written to the history file, so they - can be preserved between sessions. The default value is 0, - meaning that timestamps are not saved. - - - Variable: char history_expansion_char - The character that introduces a history event. The default is `!'. - Setting this to 0 inhibits history expansion. - - - Variable: char history_subst_char - The character that invokes word substitution if found at the start - of a line. The default is `^'. - - - Variable: char history_comment_char - During tokenization, if this character is seen as the first - character of a word, then it and all subsequent characters up to a - newline are ignored, suppressing history expansion for the - remainder of the line. This is disabled by default. - - - Variable: char * history_word_delimiters - The characters that separate tokens for `history_tokenize()'. The - default value is `" \t\n()<>;&|"'. - - - Variable: char * history_search_delimiter_chars - The list of additional characters which can delimit a history - search string, in addition to space, TAB, `:' and `?' in the case - of a substring search. The default is empty. - - - Variable: char * history_no_expand_chars - The list of characters which inhibit history expansion if found - immediately following HISTORY_EXPANSION_CHAR. The default is - space, tab, newline, carriage return, and `='. - - - Variable: int history_quotes_inhibit_expansion - If non-zero, single-quoted words are not scanned for the history - expansion character. The default value is 0. - - - Variable: rl_linebuf_func_t * history_inhibit_expansion_function - This should be set to the address of a function that takes two - arguments: a `char *' (STRING) and an `int' index into that string - (I). It should return a non-zero value if the history expansion - starting at STRING[I] should not be performed; zero if the - expansion should be done. It is intended for use by applications - like Bash that use the history expansion character for additional - purposes. By default, this variable is set to `NULL'. - - -File: history.info, Node: History Programming Example, Prev: History Variables, Up: Programming with GNU History - -History Programming Example -=========================== - - The following program demonstrates simple use of the GNU History -Library. - - #include - #include - - main (argc, argv) - int argc; - char **argv; - { - char line[1024], *t; - int len, done = 0; - - line[0] = 0; - - using_history (); - while (!done) - { - printf ("history$ "); - fflush (stdout); - t = fgets (line, sizeof (line) - 1, stdin); - if (t && *t) - { - len = strlen (t); - if (t[len - 1] == '\n') - t[len - 1] = '\0'; - } - - if (!t) - strcpy (line, "quit"); - - if (line[0]) - { - char *expansion; - int result; - - result = history_expand (line, &expansion); - if (result) - fprintf (stderr, "%s\n", expansion); - - if (result < 0 || result == 2) - { - free (expansion); - continue; - } - - add_history (expansion); - strncpy (line, expansion, sizeof (line) - 1); - free (expansion); - } - - if (strcmp (line, "quit") == 0) - done = 1; - else if (strcmp (line, "save") == 0) - write_history ("history_file"); - else if (strcmp (line, "read") == 0) - read_history ("history_file"); - else if (strcmp (line, "list") == 0) - { - register HIST_ENTRY **the_list; - register int i; - - the_list = history_list (); - if (the_list) - for (i = 0; the_list[i]; i++) - printf ("%d: %s\n", i + history_base, the_list[i]->line); - } - else if (strncmp (line, "delete", 6) == 0) - { - int which; - if ((sscanf (line + 6, "%d", &which)) == 1) - { - HIST_ENTRY *entry = remove_history (which); - if (!entry) - fprintf (stderr, "No such entry %d\n", which); - else - { - free (entry->line); - free (entry); - } - } - else - { - fprintf (stderr, "non-numeric arg given to `delete'\n"); - } - } - } - } - - -File: history.info, Node: Copying This Manual, Next: Concept Index, Prev: Programming with GNU History, Up: Top - -Copying This Manual -******************* - -* Menu: - -* GNU Free Documentation License:: License for copying this manual. - - -File: history.info, Node: GNU Free Documentation License, Up: Copying This Manual - -GNU Free Documentation License -============================== - - Version 1.2, November 2002 - Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA - - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - 0. PREAMBLE - - The purpose of this License is to make a manual, textbook, or other - functional and useful document "free" in the sense of freedom: to - assure everyone the effective freedom to copy and redistribute it, - with or without modifying it, either commercially or - noncommercially. Secondarily, this License preserves for the - author and publisher a way to get credit for their work, while not - being considered responsible for modifications made by others. - - This License is a kind of "copyleft", which means that derivative - works of the document must themselves be free in the same sense. - It complements the GNU General Public License, which is a copyleft - license designed for free software. - - We have designed this License in order to use it for manuals for - free software, because free software needs free documentation: a - free program should come with manuals providing the same freedoms - that the software does. But this License is not limited to - software manuals; it can be used for any textual work, regardless - of subject matter or whether it is published as a printed book. - We recommend this License principally for works whose purpose is - instruction or reference. - - 1. APPLICABILITY AND DEFINITIONS - - This License applies to any manual or other work, in any medium, - that contains a notice placed by the copyright holder saying it - can be distributed under the terms of this License. Such a notice - grants a world-wide, royalty-free license, unlimited in duration, - to use that work under the conditions stated herein. The - "Document", below, refers to any such manual or work. Any member - of the public is a licensee, and is addressed as "you". You - accept the license if you copy, modify or distribute the work in a - way requiring permission under copyright law. - - A "Modified Version" of the Document means any work containing the - Document or a portion of it, either copied verbatim, or with - modifications and/or translated into another language. - - A "Secondary Section" is a named appendix or a front-matter section - of the Document that deals exclusively with the relationship of the - publishers or authors of the Document to the Document's overall - subject (or to related matters) and contains nothing that could - fall directly within that overall subject. (Thus, if the Document - is in part a textbook of mathematics, a Secondary Section may not - explain any mathematics.) The relationship could be a matter of - historical connection with the subject or with related matters, or - of legal, commercial, philosophical, ethical or political position - regarding them. - - The "Invariant Sections" are certain Secondary Sections whose - titles are designated, as being those of Invariant Sections, in - the notice that says that the Document is released under this - License. If a section does not fit the above definition of - Secondary then it is not allowed to be designated as Invariant. - The Document may contain zero Invariant Sections. If the Document - does not identify any Invariant Sections then there are none. - - The "Cover Texts" are certain short passages of text that are - listed, as Front-Cover Texts or Back-Cover Texts, in the notice - that says that the Document is released under this License. A - Front-Cover Text may be at most 5 words, and a Back-Cover Text may - be at most 25 words. - - A "Transparent" copy of the Document means a machine-readable copy, - represented in a format whose specification is available to the - general public, that is suitable for revising the document - straightforwardly with generic text editors or (for images - composed of pixels) generic paint programs or (for drawings) some - widely available drawing editor, and that is suitable for input to - text formatters or for automatic translation to a variety of - formats suitable for input to text formatters. A copy made in an - otherwise Transparent file format whose markup, or absence of - markup, has been arranged to thwart or discourage subsequent - modification by readers is not Transparent. An image format is - not Transparent if used for any substantial amount of text. A - copy that is not "Transparent" is called "Opaque". - - Examples of suitable formats for Transparent copies include plain - ASCII without markup, Texinfo input format, LaTeX input format, - SGML or XML using a publicly available DTD, and - standard-conforming simple HTML, PostScript or PDF designed for - human modification. Examples of transparent image formats include - PNG, XCF and JPG. Opaque formats include proprietary formats that - can be read and edited only by proprietary word processors, SGML or - XML for which the DTD and/or processing tools are not generally - available, and the machine-generated HTML, PostScript or PDF - produced by some word processors for output purposes only. - - The "Title Page" means, for a printed book, the title page itself, - plus such following pages as are needed to hold, legibly, the - material this License requires to appear in the title page. For - works in formats which do not have any title page as such, "Title - Page" means the text near the most prominent appearance of the - work's title, preceding the beginning of the body of the text. - - A section "Entitled XYZ" means a named subunit of the Document - whose title either is precisely XYZ or contains XYZ in parentheses - following text that translates XYZ in another language. (Here XYZ - stands for a specific section name mentioned below, such as - "Acknowledgements", "Dedications", "Endorsements", or "History".) - To "Preserve the Title" of such a section when you modify the - Document means that it remains a section "Entitled XYZ" according - to this definition. - - The Document may include Warranty Disclaimers next to the notice - which states that this License applies to the Document. These - Warranty Disclaimers are considered to be included by reference in - this License, but only as regards disclaiming warranties: any other - implication that these Warranty Disclaimers may have is void and - has no effect on the meaning of this License. - - 2. VERBATIM COPYING - - You may copy and distribute the Document in any medium, either - commercially or noncommercially, provided that this License, the - copyright notices, and the license notice saying this License - applies to the Document are reproduced in all copies, and that you - add no other conditions whatsoever to those of this License. You - may not use technical measures to obstruct or control the reading - or further copying of the copies you make or distribute. However, - you may accept compensation in exchange for copies. If you - distribute a large enough number of copies you must also follow - the conditions in section 3. - - You may also lend copies, under the same conditions stated above, - and you may publicly display copies. - - 3. COPYING IN QUANTITY - - If you publish printed copies (or copies in media that commonly - have printed covers) of the Document, numbering more than 100, and - the Document's license notice requires Cover Texts, you must - enclose the copies in covers that carry, clearly and legibly, all - these Cover Texts: Front-Cover Texts on the front cover, and - Back-Cover Texts on the back cover. Both covers must also clearly - and legibly identify you as the publisher of these copies. The - front cover must present the full title with all words of the - title equally prominent and visible. You may add other material - on the covers in addition. Copying with changes limited to the - covers, as long as they preserve the title of the Document and - satisfy these conditions, can be treated as verbatim copying in - other respects. - - If the required texts for either cover are too voluminous to fit - legibly, you should put the first ones listed (as many as fit - reasonably) on the actual cover, and continue the rest onto - adjacent pages. - - If you publish or distribute Opaque copies of the Document - numbering more than 100, you must either include a - machine-readable Transparent copy along with each Opaque copy, or - state in or with each Opaque copy a computer-network location from - which the general network-using public has access to download - using public-standard network protocols a complete Transparent - copy of the Document, free of added material. If you use the - latter option, you must take reasonably prudent steps, when you - begin distribution of Opaque copies in quantity, to ensure that - this Transparent copy will remain thus accessible at the stated - location until at least one year after the last time you - distribute an Opaque copy (directly or through your agents or - retailers) of that edition to the public. - - It is requested, but not required, that you contact the authors of - the Document well before redistributing any large number of - copies, to give them a chance to provide you with an updated - version of the Document. - - 4. MODIFICATIONS - - You may copy and distribute a Modified Version of the Document - under the conditions of sections 2 and 3 above, provided that you - release the Modified Version under precisely this License, with - the Modified Version filling the role of the Document, thus - licensing distribution and modification of the Modified Version to - whoever possesses a copy of it. In addition, you must do these - things in the Modified Version: - - A. Use in the Title Page (and on the covers, if any) a title - distinct from that of the Document, and from those of - previous versions (which should, if there were any, be listed - in the History section of the Document). You may use the - same title as a previous version if the original publisher of - that version gives permission. - - B. List on the Title Page, as authors, one or more persons or - entities responsible for authorship of the modifications in - the Modified Version, together with at least five of the - principal authors of the Document (all of its principal - authors, if it has fewer than five), unless they release you - from this requirement. - - C. State on the Title page the name of the publisher of the - Modified Version, as the publisher. - - D. Preserve all the copyright notices of the Document. - - E. Add an appropriate copyright notice for your modifications - adjacent to the other copyright notices. - - F. Include, immediately after the copyright notices, a license - notice giving the public permission to use the Modified - Version under the terms of this License, in the form shown in - the Addendum below. - - G. Preserve in that license notice the full lists of Invariant - Sections and required Cover Texts given in the Document's - license notice. - - H. Include an unaltered copy of this License. - - I. Preserve the section Entitled "History", Preserve its Title, - and add to it an item stating at least the title, year, new - authors, and publisher of the Modified Version as given on - the Title Page. If there is no section Entitled "History" in - the Document, create one stating the title, year, authors, - and publisher of the Document as given on its Title Page, - then add an item describing the Modified Version as stated in - the previous sentence. - - J. Preserve the network location, if any, given in the Document - for public access to a Transparent copy of the Document, and - likewise the network locations given in the Document for - previous versions it was based on. These may be placed in - the "History" section. You may omit a network location for a - work that was published at least four years before the - Document itself, or if the original publisher of the version - it refers to gives permission. - - K. For any section Entitled "Acknowledgements" or "Dedications", - Preserve the Title of the section, and preserve in the - section all the substance and tone of each of the contributor - acknowledgements and/or dedications given therein. - - L. Preserve all the Invariant Sections of the Document, - unaltered in their text and in their titles. Section numbers - or the equivalent are not considered part of the section - titles. - - M. Delete any section Entitled "Endorsements". Such a section - may not be included in the Modified Version. - - N. Do not retitle any existing section to be Entitled - "Endorsements" or to conflict in title with any Invariant - Section. - - O. Preserve any Warranty Disclaimers. - - If the Modified Version includes new front-matter sections or - appendices that qualify as Secondary Sections and contain no - material copied from the Document, you may at your option - designate some or all of these sections as invariant. To do this, - add their titles to the list of Invariant Sections in the Modified - Version's license notice. These titles must be distinct from any - other section titles. - - You may add a section Entitled "Endorsements", provided it contains - nothing but endorsements of your Modified Version by various - parties--for example, statements of peer review or that the text - has been approved by an organization as the authoritative - definition of a standard. - - You may add a passage of up to five words as a Front-Cover Text, - and a passage of up to 25 words as a Back-Cover Text, to the end - of the list of Cover Texts in the Modified Version. Only one - passage of Front-Cover Text and one of Back-Cover Text may be - added by (or through arrangements made by) any one entity. If the - Document already includes a cover text for the same cover, - previously added by you or by arrangement made by the same entity - you are acting on behalf of, you may not add another; but you may - replace the old one, on explicit permission from the previous - publisher that added the old one. - - The author(s) and publisher(s) of the Document do not by this - License give permission to use their names for publicity for or to - assert or imply endorsement of any Modified Version. - - 5. COMBINING DOCUMENTS - - You may combine the Document with other documents released under - this License, under the terms defined in section 4 above for - modified versions, provided that you include in the combination - all of the Invariant Sections of all of the original documents, - unmodified, and list them all as Invariant Sections of your - combined work in its license notice, and that you preserve all - their Warranty Disclaimers. - - The combined work need only contain one copy of this License, and - multiple identical Invariant Sections may be replaced with a single - copy. If there are multiple Invariant Sections with the same name - but different contents, make the title of each such section unique - by adding at the end of it, in parentheses, the name of the - original author or publisher of that section if known, or else a - unique number. Make the same adjustment to the section titles in - the list of Invariant Sections in the license notice of the - combined work. - - In the combination, you must combine any sections Entitled - "History" in the various original documents, forming one section - Entitled "History"; likewise combine any sections Entitled - "Acknowledgements", and any sections Entitled "Dedications". You - must delete all sections Entitled "Endorsements." - - 6. COLLECTIONS OF DOCUMENTS - - You may make a collection consisting of the Document and other - documents released under this License, and replace the individual - copies of this License in the various documents with a single copy - that is included in the collection, provided that you follow the - rules of this License for verbatim copying of each of the - documents in all other respects. - - You may extract a single document from such a collection, and - distribute it individually under this License, provided you insert - a copy of this License into the extracted document, and follow - this License in all other respects regarding verbatim copying of - that document. - - 7. AGGREGATION WITH INDEPENDENT WORKS - - A compilation of the Document or its derivatives with other - separate and independent documents or works, in or on a volume of - a storage or distribution medium, is called an "aggregate" if the - copyright resulting from the compilation is not used to limit the - legal rights of the compilation's users beyond what the individual - works permit. When the Document is included an aggregate, this - License does not apply to the other works in the aggregate which - are not themselves derivative works of the Document. - - If the Cover Text requirement of section 3 is applicable to these - copies of the Document, then if the Document is less than one half - of the entire aggregate, the Document's Cover Texts may be placed - on covers that bracket the Document within the aggregate, or the - electronic equivalent of covers if the Document is in electronic - form. Otherwise they must appear on printed covers that bracket - the whole aggregate. - - 8. TRANSLATION - - Translation is considered a kind of modification, so you may - distribute translations of the Document under the terms of section - 4. Replacing Invariant Sections with translations requires special - permission from their copyright holders, but you may include - translations of some or all Invariant Sections in addition to the - original versions of these Invariant Sections. You may include a - translation of this License, and all the license notices in the - Document, and any Warranty Disclaimers, provided that you also - include the original English version of this License and the - original versions of those notices and disclaimers. In case of a - disagreement between the translation and the original version of - this License or a notice or disclaimer, the original version will - prevail. - - If a section in the Document is Entitled "Acknowledgements", - "Dedications", or "History", the requirement (section 4) to - Preserve its Title (section 1) will typically require changing the - actual title. - - 9. TERMINATION - - You may not copy, modify, sublicense, or distribute the Document - except as expressly provided for under this License. Any other - attempt to copy, modify, sublicense or distribute the Document is - void, and will automatically terminate your rights under this - License. However, parties who have received copies, or rights, - from you under this License will not have their licenses - terminated so long as such parties remain in full compliance. - - 10. FUTURE REVISIONS OF THIS LICENSE - - The Free Software Foundation may publish new, revised versions of - the GNU Free Documentation License from time to time. Such new - versions will be similar in spirit to the present version, but may - differ in detail to address new problems or concerns. See - `http://www.gnu.org/copyleft/'. - - Each version of the License is given a distinguishing version - number. If the Document specifies that a particular numbered - version of this License "or any later version" applies to it, you - have the option of following the terms and conditions either of - that specified version or of any later version that has been - published (not as a draft) by the Free Software Foundation. If - the Document does not specify a version number of this License, - you may choose any version ever published (not as a draft) by the - Free Software Foundation. - -ADDENDUM: How to use this License for your documents ----------------------------------------------------- - - To use this License in a document you have written, include a copy of -the License in the document and put the following copyright and license -notices just after the title page: - - Copyright (C) YEAR YOUR NAME. - Permission is granted to copy, distribute and/or modify this document - under the terms of the GNU Free Documentation License, Version 1.2 - or any later version published by the Free Software Foundation; - with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. - A copy of the license is included in the section entitled ``GNU - Free Documentation License''. - - If you have Invariant Sections, Front-Cover Texts and Back-Cover -Texts, replace the "with...Texts." line with this: - - with the Invariant Sections being LIST THEIR TITLES, with - the Front-Cover Texts being LIST, and with the Back-Cover Texts - being LIST. - - If you have Invariant Sections without Cover Texts, or some other -combination of the three, merge those two alternatives to suit the -situation. - - If your document contains nontrivial examples of program code, we -recommend releasing these examples in parallel under your choice of -free software license, such as the GNU General Public License, to -permit their use in free software. - - -File: history.info, Node: Concept Index, Next: Function and Variable Index, Prev: Copying This Manual, Up: Top - -Concept Index -************* - -* Menu: - -* anchored search: Searching the History List. -* event designators: Event Designators. -* FDL, GNU Free Documentation License: GNU Free Documentation License. -* history events: Event Designators. -* history expansion: History Interaction. -* History Searching: Searching the History List. - - -File: history.info, Node: Function and Variable Index, Prev: Concept Index, Up: Top - -Function and Variable Index -*************************** - -* Menu: - -* add_history: History List Management. -* add_history_time: History List Management. -* append_history: Managing the History File. -* clear_history: History List Management. -* current_history: Information About the History List. -* free_history_entry: History List Management. -* get_history_event: History Expansion. -* history_arg_extract: History Expansion. -* history_base: History Variables. -* history_comment_char: History Variables. -* history_expand: History Expansion. -* history_expansion_char: History Variables. -* history_get: Information About the History List. -* history_get_history_state: Initializing History and State Management. -* history_get_time: Information About the History List. -* history_inhibit_expansion_function: History Variables. -* history_is_stifled: History List Management. -* history_length: History Variables. -* history_list: Information About the History List. -* history_max_entries: History Variables. -* history_no_expand_chars: History Variables. -* history_quotes_inhibit_expansion: History Variables. -* history_search: Searching the History List. -* history_search_delimiter_chars: History Variables. -* history_search_pos: Searching the History List. -* history_search_prefix: Searching the History List. -* history_set_history_state: Initializing History and State Management. -* history_set_pos: Moving Around the History List. -* history_subst_char: History Variables. -* history_tokenize: History Expansion. -* history_total_bytes: Information About the History List. -* history_truncate_file: Managing the History File. -* history_word_delimiters: History Variables. -* history_write_timestamps: History Variables. -* next_history: Moving Around the History List. -* previous_history: Moving Around the History List. -* read_history: Managing the History File. -* read_history_range: Managing the History File. -* remove_history: History List Management. -* replace_history_entry: History List Management. -* stifle_history: History List Management. -* unstifle_history: History List Management. -* using_history: Initializing History and State Management. -* where_history: Information About the History List. -* write_history: Managing the History File. - - - -Tag Table: -Node: Top1320 -Node: Using History Interactively1948 -Node: History Interaction2455 -Node: Event Designators3874 -Node: Word Designators4798 -Node: Modifiers6428 -Node: Programming with GNU History7646 -Node: Introduction to History8377 -Node: History Storage10062 -Node: History Functions11197 -Node: Initializing History and State Management12181 -Node: History List Management12981 -Node: Information About the History List14995 -Node: Moving Around the History List16477 -Node: Searching the History List17466 -Node: Managing the History File19384 -Node: History Expansion21190 -Node: History Variables23085 -Node: History Programming Example25874 -Node: Copying This Manual28596 -Node: GNU Free Documentation License28834 -Node: Concept Index51227 -Node: Function and Variable Index51777 - -End Tag Table diff --git a/dep/src/readline/src/doc/history.pdf b/dep/src/readline/src/doc/history.pdf deleted file mode 100644 index 2ed10c44da0e6e0ed8bd588aea5e345aa4eabad8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166940 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 diff --git a/dep/src/readline/src/doc/history.ps b/dep/src/readline/src/doc/history.ps deleted file mode 100644 index 312a6dcdbb5702f0d98ea750ff9fa9c02438f30a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220512 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

GNU Readline Library

- -This document describes the GNU Readline Library, a utility which aids -in the consistency of user interface across discrete programs which -provide a command line interface. -

- -

- - - - - -
1. Command Line Editing  GNU Readline User's Manual.
2. Programming with GNU Readline  GNU Readline Programmer's Manual.
A. Copying This Manual  Copying this manual.
Concept Index  Index of concepts described in this manual.
Function and Variable Index  Index of externally visible functions - and variables.
-

- -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
- -

1. Command Line Editing

- -

- -This chapter describes the basic features of the GNU -command line editing interface. -

- -

- - - - - -
1.1 Introduction to Line Editing  Notation used in this text.
1.2 Readline Interaction  The minimum set of commands for editing a line.
1.3 Readline Init File  Customizing Readline from a user's view.
1.4 Bindable Readline Commands  A description of most of the Readline commands - available for binding
1.5 Readline vi Mode  A short description of how to make Readline - behave like the vi editor.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.1 Introduction to Line Editing

- -

- -The following paragraphs describe the notation used to represent -keystrokes. -

- -The text C-k is read as `Control-K' and describes the character -produced when the k key is pressed while the Control key -is depressed. -

- -The text M-k is read as `Meta-K' and describes the character -produced when the Meta key (if you have one) is depressed, and the k -key is pressed. -The Meta key is labeled ALT on many keyboards. -On keyboards with two keys labeled ALT (usually to either side of -the space bar), the ALT on the left side is generally set to -work as a Meta key. -The ALT key on the right may also be configured to work as a -Meta key or may be configured as some other modifier, such as a -Compose key for typing accented characters. -

- -If you do not have a Meta or ALT key, or another key working as -a Meta key, the identical keystroke can be generated by typing ESC -first, and then typing k. -Either process is known as metafying the k key. -

- -The text M-C-k is read as `Meta-Control-k' and describes the -character produced by metafying C-k. -

- -In addition, several keys have their own names. Specifically, -DEL, ESC, LFD, SPC, RET, and TAB all -stand for themselves when seen in this text, or in an init file -(see section 1.3 Readline Init File). -If your keyboard lacks a LFD key, typing C-j will -produce the desired character. -The RET key may be labeled Return or Enter on -some keyboards. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.2 Readline Interaction

- -

- -Often during an interactive session you type in a long line of text, -only to notice that the first word on the line is misspelled. The -Readline library gives you a set of commands for manipulating the text -as you type it in, allowing you to just fix your typo, and not forcing -you to retype the majority of the line. Using these editing commands, -you move the cursor to the place that needs correction, and delete or -insert the text of the corrections. Then, when you are satisfied with -the line, you simply press RET. You do not have to be at the -end of the line to press RET; the entire line is accepted -regardless of the location of the cursor within the line. -

- -

- - - - - -
1.2.1 Readline Bare Essentials  The least you need to know about Readline.
1.2.2 Readline Movement Commands  Moving about the input line.
1.2.3 Readline Killing Commands  How to delete text, and how to get it back!
1.2.4 Readline Arguments  Giving numeric arguments to commands.
1.2.5 Searching for Commands in the History  Searching through previous lines.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.2.1 Readline Bare Essentials

- -

- -In order to enter characters into the line, simply type them. The typed -character appears where the cursor was, and then the cursor moves one -space to the right. If you mistype a character, you can use your -erase character to back up and delete the mistyped character. -

- -Sometimes you may mistype a character, and -not notice the error until you have typed several other characters. In -that case, you can type C-b to move the cursor to the left, and then -correct your mistake. Afterwards, you can move the cursor to the right -with C-f. -

- -When you add text in the middle of a line, you will notice that characters -to the right of the cursor are `pushed over' to make room for the text -that you have inserted. Likewise, when you delete text behind the cursor, -characters to the right of the cursor are `pulled back' to fill in the -blank space created by the removal of the text. A list of the bare -essentials for editing the text of an input line follows. -

- -

-
C-b -
Move back one character. -
C-f -
Move forward one character. -
DEL or Backspace -
Delete the character to the left of the cursor. -
C-d -
Delete the character underneath the cursor. -
Printing characters -
Insert the character into the line at the cursor. -
C-_ or C-x C-u -
Undo the last editing command. You can undo all the way back to an -empty line. -
-

- -(Depending on your configuration, the Backspace key be set to -delete the character to the left of the cursor and the DEL key set -to delete the character underneath the cursor, like C-d, rather -than the character to the left of the cursor.) -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.2.2 Readline Movement Commands

- -

- -The above table describes the most basic keystrokes that you need -in order to do editing of the input line. For your convenience, many -other commands have been added in addition to C-b, C-f, -C-d, and DEL. Here are some commands for moving more rapidly -about the line. -

- -

-
C-a -
Move to the start of the line. -
C-e -
Move to the end of the line. -
M-f -
Move forward a word, where a word is composed of letters and digits. -
M-b -
Move backward a word. -
C-l -
Clear the screen, reprinting the current line at the top. -
-

- -Notice how C-f moves forward a character, while M-f moves -forward a word. It is a loose convention that control keystrokes -operate on characters while meta keystrokes operate on words. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.2.3 Readline Killing Commands

- -

- - - -

- -Killing text means to delete the text from the line, but to save -it away for later use, usually by yanking (re-inserting) -it back into the line. -(`Cut' and `paste' are more recent jargon for `kill' and `yank'.) -

- -If the description for a command says that it `kills' text, then you can -be sure that you can get the text back in a different (or the same) -place later. -

- -When you use a kill command, the text is saved in a kill-ring. -Any number of consecutive kills save all of the killed text together, so -that when you yank it back, you get it all. The kill -ring is not line specific; the text that you killed on a previously -typed line is available to be yanked back later, when you are typing -another line. - -

- -Here is the list of commands for killing text. -

- -

-
C-k -
Kill the text from the current cursor position to the end of the line. -

- -

M-d -
Kill from the cursor to the end of the current word, or, if between -words, to the end of the next word. -Word boundaries are the same as those used by M-f. -

- -

M-DEL -
Kill from the cursor the start of the current word, or, if between -words, to the start of the previous word. -Word boundaries are the same as those used by M-b. -

- -

C-w -
Kill from the cursor to the previous whitespace. This is different than -M-DEL because the word boundaries differ. -

- -

-

- -Here is how to yank the text back into the line. Yanking -means to copy the most-recently-killed text from the kill buffer. -

- -

-
C-y -
Yank the most recently killed text back into the buffer at the cursor. -

- -

M-y -
Rotate the kill-ring, and yank the new top. You can only do this if -the prior command is C-y or M-y. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.2.4 Readline Arguments

- -

- -You can pass numeric arguments to Readline commands. Sometimes the -argument acts as a repeat count, other times it is the sign of the -argument that is significant. If you pass a negative argument to a -command which normally acts in a forward direction, that command will -act in a backward direction. For example, to kill text back to the -start of the line, you might type `M-- C-k'. -

- -The general way to pass numeric arguments to a command is to type meta -digits before the command. If the first `digit' typed is a minus -sign (`-'), then the sign of the argument will be negative. Once -you have typed one meta digit to get the argument started, you can type -the remainder of the digits, and then the command. For example, to give -the C-d command an argument of 10, you could type `M-1 0 C-d', -which will delete the next ten characters on the input line. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.2.5 Searching for Commands in the History

- -

- -Readline provides commands for searching through the command history -for lines containing a specified string. -There are two search modes: incremental and non-incremental. -

- -Incremental searches begin before the user has finished typing the -search string. -As each character of the search string is typed, Readline displays -the next entry from the history matching the string typed so far. -An incremental search requires only as many characters as needed to -find the desired history entry. -To search backward in the history for a particular string, type -C-r. Typing C-s searches forward through the history. -The characters present in the value of the isearch-terminators variable -are used to terminate an incremental search. -If that variable has not been assigned a value, the ESC and -C-J characters will terminate an incremental search. -C-g will abort an incremental search and restore the original line. -When the search is terminated, the history entry containing the -search string becomes the current line. -

- -To find other matching entries in the history list, type C-r or -C-s as appropriate. -This will search backward or forward in the history for the next -entry matching the search string typed so far. -Any other key sequence bound to a Readline command will terminate -the search and execute that command. -For instance, a RET will terminate the search and accept -the line, thereby executing the command from the history list. -A movement command will terminate the search, make the last line found -the current line, and begin editing. -

- -Readline remembers the last incremental search string. If two -C-rs are typed without any intervening characters defining a new -search string, any remembered search string is used. -

- -Non-incremental searches read the entire search string before starting -to search for matching history lines. The search string may be -typed by the user or be part of the contents of the current line. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.3 Readline Init File

- -

- -Although the Readline library comes with a set of Emacs-like -keybindings installed by default, it is possible to use a different set -of keybindings. -Any user can customize programs that use Readline by putting -commands in an inputrc file, conventionally in his home directory. -The name of this -file is taken from the value of the environment variable INPUTRC. If -that variable is unset, the default is `~/.inputrc'. -

- -When a program which uses the Readline library starts up, the -init file is read, and the key bindings are set. -

- -In addition, the C-x C-r command re-reads this init file, thus -incorporating any changes that you might have made to it. -

- -

- -
1.3.1 Readline Init File Syntax  Syntax for the commands in the inputrc file.
- -
- - -
1.3.2 Conditional Init Constructs  Conditional key bindings in the inputrc file.
- -
- - -
1.3.3 Sample Init File  An example inputrc file.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.3.1 Readline Init File Syntax

- -

- -There are only a few basic constructs allowed in the -Readline init file. Blank lines are ignored. -Lines beginning with a `#' are comments. -Lines beginning with a `$' indicate conditional -constructs (see section 1.3.2 Conditional Init Constructs). Other lines -denote variable settings and key bindings. -

- -

-
Variable Settings -
You can modify the run-time behavior of Readline by -altering the values of variables in Readline -using the set command within the init file. -The syntax is simple: -

- -
 
set variable value
-

- -Here, for example, is how to -change from the default Emacs-like key binding to use -vi line editing commands: -

- -
 
set editing-mode vi
-

- -Variable names and values, where appropriate, are recognized without regard -to case. -

- -A great deal of run-time behavior is changeable with the following -variables. -

- - -

- -
bell-style -
-Controls what happens when Readline wants to ring the terminal bell. -If set to `none', Readline never rings the bell. If set to -`visible', Readline uses a visible bell if one is available. -If set to `audible' (the default), Readline attempts to ring -the terminal's bell. -

- -

comment-begin -
-The string to insert at the beginning of the line when the -insert-comment command is executed. The default value -is "#". -

- -

completion-ignore-case -
If set to `on', Readline performs filename matching and completion -in a case-insensitive fashion. -The default value is `off'. -

- -

completion-query-items -
-The number of possible completions that determines when the user is -asked whether the list of possibilities should be displayed. -If the number of possible completions is greater than this value, -Readline will ask the user whether or not he wishes to view -them; otherwise, they are simply listed. -This variable must be set to an integer value greater than or equal to 0. -The default limit is 100. -

- -

convert-meta -
-If set to `on', Readline will convert characters with the -eighth bit set to an ASCII key sequence by stripping the eighth -bit and prefixing an ESC character, converting them to a -meta-prefixed key sequence. The default value is `on'. -

- -

disable-completion -
-If set to `On', Readline will inhibit word completion. -Completion characters will be inserted into the line as if they had -been mapped to self-insert. The default is `off'. -

- -

editing-mode -
-The editing-mode variable controls which default set of -key bindings is used. By default, Readline starts up in Emacs editing -mode, where the keystrokes are most similar to Emacs. This variable can be -set to either `emacs' or `vi'. -

- -

enable-keypad -
-When set to `on', Readline will try to enable the application -keypad when it is called. Some systems need this to enable the -arrow keys. The default is `off'. -

- -

expand-tilde -
-If set to `on', tilde expansion is performed when Readline -attempts word completion. The default is `off'. -

- - -If set to `on', the history code attempts to place point at the -same location on each history line retrieved with previous-history -or next-history. -

- -

horizontal-scroll-mode -
-This variable can be set to either `on' or `off'. Setting it -to `on' means that the text of the lines being edited will scroll -horizontally on a single screen line when they are longer than the width -of the screen, instead of wrapping onto a new screen line. By default, -this variable is set to `off'. -

- -

input-meta -
- -If set to `on', Readline will enable eight-bit input (it -will not clear the eighth bit in the characters it reads), -regardless of what the terminal claims it can support. The -default value is `off'. The name meta-flag is a -synonym for this variable. -

- -

isearch-terminators -
-The string of characters that should terminate an incremental search without -subsequently executing the character as a command (see section 1.2.5 Searching for Commands in the History). -If this variable has not been given a value, the characters ESC and -C-J will terminate an incremental search. -

- -

keymap -
-Sets Readline's idea of the current keymap for key binding commands. -Acceptable keymap names are -emacs, -emacs-standard, -emacs-meta, -emacs-ctlx, -vi, -vi-move, -vi-command, and -vi-insert. -vi is equivalent to vi-command; emacs is -equivalent to emacs-standard. The default value is emacs. -The value of the editing-mode variable also affects the -default keymap. -

- -

mark-directories -
If set to `on', completed directory names have a slash -appended. The default is `on'. -

- -

mark-modified-lines -
-This variable, when set to `on', causes Readline to display an -asterisk (`*') at the start of history lines which have been modified. -This variable is `off' by default. -

- -

mark-symlinked-directories -
-If set to `on', completed names which are symbolic links -to directories have a slash appended (subject to the value of -mark-directories). -The default is `off'. -

- -

match-hidden-files -
-This variable, when set to `on', causes Readline to match files whose -names begin with a `.' (hidden files) when performing filename -completion, unless the leading `.' is -supplied by the user in the filename to be completed. -This variable is `on' by default. -

- -

output-meta -
-If set to `on', Readline will display characters with the -eighth bit set directly rather than as a meta-prefixed escape -sequence. The default is `off'. -

- -

page-completions -
-If set to `on', Readline uses an internal more-like pager -to display a screenful of possible completions at a time. -This variable is `on' by default. -

- -

print-completions-horizontally -
If set to `on', Readline will display completions with matches -sorted horizontally in alphabetical order, rather than down the screen. -The default is `off'. -

- -

show-all-if-ambiguous -
-This alters the default behavior of the completion functions. If -set to `on', -words which have more than one possible completion cause the -matches to be listed immediately instead of ringing the bell. -The default value is `off'. -

- -

show-all-if-unmodified -
-This alters the default behavior of the completion functions in -a fashion similar to show-all-if-ambiguous. -If set to `on', -words which have more than one possible completion without any -possible partial completion (the possible completions don't share -a common prefix) cause the matches to be listed immediately instead -of ringing the bell. -The default value is `off'. -

- -

visible-stats -
-If set to `on', a character denoting a file's type -is appended to the filename when listing possible -completions. The default is `off'. -

- -

-

- -

Key Bindings -
The syntax for controlling key bindings in the init file is -simple. First you need to find the name of the command that you -want to change. The following sections contain tables of the command -name, the default keybinding, if any, and a short description of what -the command does. -

- -Once you know the name of the command, simply place on a line -in the init file the name of the key -you wish to bind the command to, a colon, and then the name of the -command. The name of the key -can be expressed in different ways, depending on what you find most -comfortable. -

- -In addition to command names, readline allows keys to be bound -to a string that is inserted when the key is pressed (a macro). -

- -

-
keyname: function-name or macro -
keyname is the name of a key spelled out in English. For example: -
 
Control-u: universal-argument
-Meta-Rubout: backward-kill-word
-Control-o: "> output"
-

- -In the above example, C-u is bound to the function -universal-argument, -M-DEL is bound to the function backward-kill-word, and -C-o is bound to run the macro -expressed on the right hand side (that is, to insert the text -`> output' into the line). -

- -A number of symbolic character names are recognized while -processing this key binding syntax: -DEL, -ESC, -ESCAPE, -LFD, -NEWLINE, -RET, -RETURN, -RUBOUT, -SPACE, -SPC, -and -TAB. -

- -

"keyseq": function-name or macro -
keyseq differs from keyname above in that strings -denoting an entire key sequence can be specified, by placing -the key sequence in double quotes. Some GNU Emacs style key -escapes can be used, as in the following example, but the -special character names are not recognized. -

- -
 
"\C-u": universal-argument
-"\C-x\C-r": re-read-init-file
-"\e[11~": "Function Key 1"
-

- -In the above example, C-u is again bound to the function -universal-argument (just as it was in the first example), -`C-x C-r' is bound to the function re-read-init-file, -and `ESC [ 1 1 ~' is bound to insert -the text `Function Key 1'. -

- -

-

- -The following GNU Emacs style escape sequences are available when -specifying key sequences: -

- -

-
\C- -
control prefix -
\M- -
meta prefix -
\e -
an escape character -
\\ -
backslash -
\" -
", a double quotation mark -
\' -
', a single quote or apostrophe -
-

- -In addition to the GNU Emacs style escape sequences, a second -set of backslash escapes is available: -

- -

-
\a -
alert (bell) -
\b -
backspace -
\d -
delete -
\f -
form feed -
\n -
newline -
\r -
carriage return -
\t -
horizontal tab -
\v -
vertical tab -
\nnn -
the eight-bit character whose value is the octal value nnn -(one to three digits) -
\xHH -
the eight-bit character whose value is the hexadecimal value HH -(one or two hex digits) -
-

- -When entering the text of a macro, single or double quotes must -be used to indicate a macro definition. -Unquoted text is assumed to be a function name. -In the macro body, the backslash escapes described above are expanded. -Backslash will quote any other character in the macro text, -including `"' and `''. -For example, the following binding will make `C-x \' -insert a single `\' into the line: -
 
"\C-x\\": "\\"
-

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.3.2 Conditional Init Constructs

- -

- -Readline implements a facility similar in spirit to the conditional -compilation features of the C preprocessor which allows key -bindings and variable settings to be performed as the result -of tests. There are four parser directives used. -

- -

-
$if -
The $if construct allows bindings to be made based on the -editing mode, the terminal being used, or the application using -Readline. The text of the test extends to the end of the line; -no characters are required to isolate it. -

- -

-
mode -
The mode= form of the $if directive is used to test -whether Readline is in emacs or vi mode. -This may be used in conjunction -with the `set keymap' command, for instance, to set bindings in -the emacs-standard and emacs-ctlx keymaps only if -Readline is starting out in emacs mode. -

- -

term -
The term= form may be used to include terminal-specific -key bindings, perhaps to bind the key sequences output by the -terminal's function keys. The word on the right side of the -`=' is tested against both the full name of the terminal and -the portion of the terminal name before the first `-'. This -allows sun to match both sun and sun-cmd, -for instance. -

- -

application -
The application construct is used to include -application-specific settings. Each program using the Readline -library sets the application name, and you can test for -a particular value. -This could be used to bind key sequences to functions useful for -a specific program. For instance, the following command adds a -key sequence that quotes the current or previous word in Bash: -
 
$if Bash
-# Quote the current or previous word
-"\C-xq": "\eb\"\ef\""
-$endif
-
-

- -

$endif -
This command, as seen in the previous example, terminates an -$if command. -

- -

$else -
Commands in this branch of the $if directive are executed if -the test fails. -

- -

$include -
This directive takes a single filename as an argument and reads commands -and bindings from that file. -For example, the following directive reads from `/etc/inputrc': -
 
$include /etc/inputrc
-
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.3.3 Sample Init File

- -

- -Here is an example of an inputrc file. This illustrates key -binding, variable assignment, and conditional syntax. -

- -
 
# This file controls the behaviour of line input editing for
-# programs that use the GNU Readline library.  Existing
-# programs include FTP, Bash, and GDB.
-#
-# You can re-read the inputrc file with C-x C-r.
-# Lines beginning with '#' are comments.
-#
-# First, include any systemwide bindings and variable
-# assignments from /etc/Inputrc
-$include /etc/Inputrc
-
-#
-# Set various bindings for emacs mode.
-
-set editing-mode emacs 
-
-$if mode=emacs
-
-Meta-Control-h:	backward-kill-word	Text after the function name is ignored
-
-#
-# Arrow keys in keypad mode
-#
-#"\M-OD":        backward-char
-#"\M-OC":        forward-char
-#"\M-OA":        previous-history
-#"\M-OB":        next-history
-#
-# Arrow keys in ANSI mode
-#
-"\M-[D":        backward-char
-"\M-[C":        forward-char
-"\M-[A":        previous-history
-"\M-[B":        next-history
-#
-# Arrow keys in 8 bit keypad mode
-#
-#"\M-\C-OD":       backward-char
-#"\M-\C-OC":       forward-char
-#"\M-\C-OA":       previous-history
-#"\M-\C-OB":       next-history
-#
-# Arrow keys in 8 bit ANSI mode
-#
-#"\M-\C-[D":       backward-char
-#"\M-\C-[C":       forward-char
-#"\M-\C-[A":       previous-history
-#"\M-\C-[B":       next-history
-
-C-q: quoted-insert
-
-$endif
-
-# An old-style binding.  This happens to be the default.
-TAB: complete
-
-# Macros that are convenient for shell interaction
-$if Bash
-# edit the path
-"\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f"
-# prepare to type a quoted word --
-# insert open and close double quotes
-# and move to just after the open quote
-"\C-x\"": "\"\"\C-b"
-# insert a backslash (testing backslash escapes
-# in sequences and macros)
-"\C-x\\": "\\"
-# Quote the current or previous word
-"\C-xq": "\eb\"\ef\""
-# Add a binding to refresh the line, which is unbound
-"\C-xr": redraw-current-line
-# Edit variable on current line.
-"\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y="
-$endif
-
-# use a visible bell if one is available
-set bell-style visible
-
-# don't strip characters to 7 bits when reading
-set input-meta on
-
-# allow iso-latin1 characters to be inserted rather
-# than converted to prefix-meta sequences
-set convert-meta off
-
-# display characters with the eighth bit set directly
-# rather than as meta-prefixed characters
-set output-meta on
-
-# if there are more than 150 possible completions for
-# a word, ask the user if he wants to see all of them
-set completion-query-items 150
-
-# For FTP
-$if Ftp
-"\C-xg": "get \M-?"
-"\C-xt": "put \M-?"
-"\M-.": yank-last-arg
-$endif
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.4 Bindable Readline Commands

- -

- -

- - - - - - - - -
1.4.1 Commands For Moving  Moving about the line.
1.4.2 Commands For Manipulating The History  Getting at previous lines.
1.4.3 Commands For Changing Text  Commands for changing text.
1.4.4 Killing And Yanking  Commands for killing and yanking.
1.4.5 Specifying Numeric Arguments  Specifying numeric arguments, repeat counts.
1.4.6 Letting Readline Type For You  Getting Readline to do the typing for you.
1.4.7 Keyboard Macros  Saving and re-executing typed characters
1.4.8 Some Miscellaneous Commands  Other miscellaneous commands.
-

- -This section describes Readline commands that may be bound to key -sequences. -Command names without an accompanying key sequence are unbound by default. -

- -In the following descriptions, point refers to the current cursor -position, and mark refers to a cursor position saved by the -set-mark command. -The text between the point and mark is referred to as the region. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.4.1 Commands For Moving

- -
- -
beginning-of-line (C-a) -
-Move to the start of the current line. -

- - -

end-of-line (C-e) -
-Move to the end of the line. -

- - -

forward-char (C-f) -
-Move forward a character. -

- - -

backward-char (C-b) -
-Move back a character. -

- - -

forward-word (M-f) -
-Move forward to the end of the next word. Words are composed of -letters and digits. -

- - -

backward-word (M-b) -
-Move back to the start of the current or previous word. Words are -composed of letters and digits. -

- - -

clear-screen (C-l) -
-Clear the screen and redraw the current line, -leaving the current line at the top of the screen. -

- - -

redraw-current-line () -
-Refresh the current line. By default, this is unbound. -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.4.2 Commands For Manipulating The History

- -

- -

- -
accept-line (Newline or Return) -
-Accept the line regardless of where the cursor is. -If this line is -non-empty, it may be added to the history list for future recall with -add_history(). -If this line is a modified history line, the history line is restored -to its original state. -

- - -

previous-history (C-p) -
-Move `back' through the history list, fetching the previous command. -

- - -

next-history (C-n) -
-Move `forward' through the history list, fetching the next command. -

- - -

beginning-of-history (M-<) -
-Move to the first line in the history. -

- - -

end-of-history (M->) -
-Move to the end of the input history, i.e., the line currently -being entered. -

- - -

reverse-search-history (C-r) -
-Search backward starting at the current line and moving `up' through -the history as necessary. This is an incremental search. -

- - -

forward-search-history (C-s) -
-Search forward starting at the current line and moving `down' through -the the history as necessary. This is an incremental search. -

- - -

non-incremental-reverse-search-history (M-p) -
-Search backward starting at the current line and moving `up' -through the history as necessary using a non-incremental search -for a string supplied by the user. -

- - -

non-incremental-forward-search-history (M-n) -
-Search forward starting at the current line and moving `down' -through the the history as necessary using a non-incremental search -for a string supplied by the user. -

- - -

history-search-forward () -
-Search forward through the history for the string of characters -between the start of the current line and the point. -This is a non-incremental search. -By default, this command is unbound. -

- - -

history-search-backward () -
-Search backward through the history for the string of characters -between the start of the current line and the point. This -is a non-incremental search. By default, this command is unbound. -

- - -

yank-nth-arg (M-C-y) -
-Insert the first argument to the previous command (usually -the second word on the previous line) at point. -With an argument n, -insert the nth word from the previous command (the words -in the previous command begin with word 0). A negative argument -inserts the nth word from the end of the previous command. -

- - -

yank-last-arg (M-. or M-_) -
-Insert last argument to the previous command (the last word of the -previous history entry). With an -argument, behave exactly like yank-nth-arg. -Successive calls to yank-last-arg move back through the history -list, inserting the last argument of each line in turn. -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.4.3 Commands For Changing Text

- -

- -

- -
delete-char (C-d) -
-Delete the character at point. If point is at the -beginning of the line, there are no characters in the line, and -the last character typed was not bound to delete-char, then -return EOF. -

- - -

backward-delete-char (Rubout) -
-Delete the character behind the cursor. A numeric argument means -to kill the characters instead of deleting them. -

- - -

forward-backward-delete-char () -
-Delete the character under the cursor, unless the cursor is at the -end of the line, in which case the character behind the cursor is -deleted. By default, this is not bound to a key. -

- - -

quoted-insert (C-q or C-v) -
-Add the next character typed to the line verbatim. This is -how to insert key sequences like C-q, for example. -

- - -

tab-insert (M-TAB) -
-Insert a tab character. -

- - -

self-insert (a, b, A, 1, !, ...) -
-Insert yourself. -

- - -

transpose-chars (C-t) -
-Drag the character before the cursor forward over -the character at the cursor, moving the -cursor forward as well. If the insertion point -is at the end of the line, then this -transposes the last two characters of the line. -Negative arguments have no effect. -

- - -

transpose-words (M-t) -
-Drag the word before point past the word after point, -moving point past that word as well. -If the insertion point is at the end of the line, this transposes -the last two words on the line. -

- - -

upcase-word (M-u) -
-Uppercase the current (or following) word. With a negative argument, -uppercase the previous word, but do not move the cursor. -

- - -

downcase-word (M-l) -
-Lowercase the current (or following) word. With a negative argument, -lowercase the previous word, but do not move the cursor. -

- - -

capitalize-word (M-c) -
-Capitalize the current (or following) word. With a negative argument, -capitalize the previous word, but do not move the cursor. -

- - -

overwrite-mode () -
-Toggle overwrite mode. With an explicit positive numeric argument, -switches to overwrite mode. With an explicit non-positive numeric -argument, switches to insert mode. This command affects only -emacs mode; vi mode does overwrite differently. -Each call to readline() starts in insert mode. -

- -In overwrite mode, characters bound to self-insert replace -the text at point rather than pushing the text to the right. -Characters bound to backward-delete-char replace the character -before point with a space. -

- -By default, this command is unbound. -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.4.4 Killing And Yanking

- -

- -

- - -
kill-line (C-k) -
-Kill the text from point to the end of the line. -

- - -

backward-kill-line (C-x Rubout) -
-Kill backward to the beginning of the line. -

- - -

unix-line-discard (C-u) -
-Kill backward from the cursor to the beginning of the current line. -

- - -

kill-whole-line () -
-Kill all characters on the current line, no matter where point is. -By default, this is unbound. -

- - -

kill-word (M-d) -
-Kill from point to the end of the current word, or if between -words, to the end of the next word. -Word boundaries are the same as forward-word. -

- - -

backward-kill-word (M-DEL) -
-Kill the word behind point. -Word boundaries are the same as backward-word. -

- - -

unix-word-rubout (C-w) -
-Kill the word behind point, using white space as a word boundary. -The killed text is saved on the kill-ring. -

- - -

unix-filename-rubout () -
-Kill the word behind point, using white space and the slash character -as the word boundaries. -The killed text is saved on the kill-ring. -

- - -

delete-horizontal-space () -
-Delete all spaces and tabs around point. By default, this is unbound. -

- - -

kill-region () -
-Kill the text in the current region. -By default, this command is unbound. -

- - -

copy-region-as-kill () -
-Copy the text in the region to the kill buffer, so it can be yanked -right away. By default, this command is unbound. -

- - -

copy-backward-word () -
-Copy the word before point to the kill buffer. -The word boundaries are the same as backward-word. -By default, this command is unbound. -

- - -

copy-forward-word () -
-Copy the word following point to the kill buffer. -The word boundaries are the same as forward-word. -By default, this command is unbound. -

- - -

yank (C-y) -
-Yank the top of the kill ring into the buffer at point. -

- - -

yank-pop (M-y) -
-Rotate the kill-ring, and yank the new top. You can only do this if -the prior command is yank or yank-pop. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.4.5 Specifying Numeric Arguments

- -
- - -
digit-argument (M-0, M-1, ... M--) -
-Add this digit to the argument already accumulating, or start a new -argument. M-- starts a negative argument. -

- - -

universal-argument () -
-This is another way to specify an argument. -If this command is followed by one or more digits, optionally with a -leading minus sign, those digits define the argument. -If the command is followed by digits, executing universal-argument -again ends the numeric argument, but is otherwise ignored. -As a special case, if this command is immediately followed by a -character that is neither a digit or minus sign, the argument count -for the next command is multiplied by four. -The argument count is initially one, so executing this function the -first time makes the argument count four, a second time makes the -argument count sixteen, and so on. -By default, this is not bound to a key. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.4.6 Letting Readline Type For You

- -

- -

- -
complete (TAB) -
-Attempt to perform completion on the text before point. -The actual completion performed is application-specific. -The default is filename completion. -

- - -

possible-completions (M-?) -
-List the possible completions of the text before point. -

- - -

insert-completions (M-*) -
-Insert all completions of the text before point that would have -been generated by possible-completions. -

- - -

menu-complete () -
-Similar to complete, but replaces the word to be completed -with a single match from the list of possible completions. -Repeated execution of menu-complete steps through the list -of possible completions, inserting each match in turn. -At the end of the list of completions, the bell is rung -(subject to the setting of bell-style) -and the original text is restored. -An argument of n moves n positions forward in the list -of matches; a negative argument may be used to move backward -through the list. -This command is intended to be bound to TAB, but is unbound -by default. -

- - -

delete-char-or-list () -
-Deletes the character under the cursor if not at the beginning or -end of the line (like delete-char). -If at the end of the line, behaves identically to -possible-completions. -This command is unbound by default. -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.4.7 Keyboard Macros

- -
- - -
start-kbd-macro (C-x () -
-Begin saving the characters typed into the current keyboard macro. -

- - -

end-kbd-macro (C-x )) -
-Stop saving the characters typed into the current keyboard macro -and save the definition. -

- - -

call-last-kbd-macro (C-x e) -
-Re-execute the last keyboard macro defined, by making the characters -in the macro appear as if typed at the keyboard. -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.4.8 Some Miscellaneous Commands

- -
- - -
re-read-init-file (C-x C-r) -
-Read in the contents of the inputrc file, and incorporate -any bindings or variable assignments found there. -

- - -

abort (C-g) -
-Abort the current editing command and -ring the terminal's bell (subject to the setting of -bell-style). -

- - -

do-uppercase-version (M-a, M-b, M-x, ...) -
-If the metafied character x is lowercase, run the command -that is bound to the corresponding uppercase character. -

- - -

prefix-meta (ESC) -
-Metafy the next character typed. This is for keyboards -without a meta key. Typing `ESC f' is equivalent to typing -M-f. -

- - -

undo (C-_ or C-x C-u) -
-Incremental undo, separately remembered for each line. -

- - -

revert-line (M-r) -
-Undo all changes made to this line. This is like executing the undo -command enough times to get back to the beginning. -

- - -

tilde-expand (M-~) -
-Perform tilde expansion on the current word. -

- - -

set-mark (C-@) -
-Set the mark to the point. If a -numeric argument is supplied, the mark is set to that position. -

- - -

exchange-point-and-mark (C-x C-x) -
-Swap the point with the mark. The current cursor position is set to -the saved position, and the old cursor position is saved as the mark. -

- - -

character-search (C-]) -
-A character is read and point is moved to the next occurrence of that -character. A negative count searches for previous occurrences. -

- - -

character-search-backward (M-C-]) -
-A character is read and point is moved to the previous occurrence -of that character. A negative count searches for subsequent -occurrences. -

- - -

insert-comment (M-#) -
-Without a numeric argument, the value of the comment-begin -variable is inserted at the beginning of the current line. -If a numeric argument is supplied, this command acts as a toggle: if -the characters at the beginning of the line do not match the value -of comment-begin, the value is inserted, otherwise -the characters in comment-begin are deleted from the beginning of -the line. -In either case, the line is accepted as if a newline had been typed. -

- - -

dump-functions () -
-Print all of the functions and their key bindings to the -Readline output stream. If a numeric argument is supplied, -the output is formatted in such a way that it can be made part -of an inputrc file. This command is unbound by default. -

- - -

dump-variables () -
-Print all of the settable variables and their values to the -Readline output stream. If a numeric argument is supplied, -the output is formatted in such a way that it can be made part -of an inputrc file. This command is unbound by default. -

- - -

dump-macros () -
-Print all of the Readline key sequences bound to macros and the -strings they output. If a numeric argument is supplied, -the output is formatted in such a way that it can be made part -of an inputrc file. This command is unbound by default. -

- - -

emacs-editing-mode (C-e) -
-When in vi command mode, this causes a switch to emacs -editing mode. -

- - -

vi-editing-mode (M-C-j) -
-When in emacs editing mode, this causes a switch to vi -editing mode. -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.5 Readline vi Mode

- -

- -While the Readline library does not have a full set of vi -editing functions, it does contain enough to allow simple editing -of the line. The Readline vi mode behaves as specified in -the POSIX 1003.2 standard. -

- -In order to switch interactively between emacs and vi -editing modes, use the command M-C-j (bound to emacs-editing-mode -when in vi mode and to vi-editing-mode in emacs mode). -The Readline default is emacs mode. -

- -When you enter a line in vi mode, you are already placed in -`insertion' mode, as if you had typed an `i'. Pressing ESC -switches you into `command' mode, where you can edit the text of the -line with the standard vi movement keys, move to previous -history lines with `k' and subsequent lines with `j', and -so forth. -

- -This document describes the GNU Readline Library, a utility for aiding -in the consitency of user interface across discrete programs that need -to provide a command line interface. -

- -Copyright (C) 1988-2004 Free Software Foundation, Inc. -

- -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -pare preserved on all copies. -

- -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the entire -resulting derived work is distributed under the terms of a permission -notice identical to this one. -

- -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that this permission notice may be stated in a translation approved -by the Foundation. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2. Programming with GNU Readline

- -

- -This chapter describes the interface between the GNU Readline Library and -other programs. If you are a programmer, and you wish to include the -features found in GNU Readline -such as completion, line editing, and interactive history manipulation -in your own programs, this section is for you. -

- -

- - - - - - -
2.1 Basic Behavior  Using the default behavior of Readline.
2.2 Custom Functions  Adding your own functions to Readline.
2.3 Readline Variables  Variables accessible to custom - functions.
2.4 Readline Convenience Functions  Functions which Readline supplies to - aid in writing your own custom - functions.
2.5 Readline Signal Handling  How Readline behaves when it receives signals.
2.6 Custom Completers  Supplanting or supplementing Readline's - completion functions.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.1 Basic Behavior

- -

- -Many programs provide a command line interface, such as mail, -ftp, and sh. For such programs, the default behaviour of -Readline is sufficient. This section describes how to use Readline in -the simplest way possible, perhaps to replace calls in your code to -gets() or fgets(). -

- - - -

- -The function readline() prints a prompt prompt -and then reads and returns a single line of text from the user. -If prompt is NULL or the empty string, no prompt is displayed. -The line readline returns is allocated with malloc(); -the caller should free() the line when it has finished with it. -The declaration for readline in ANSI C is -

- -
 
char *readline (const char *prompt);
-

- -So, one might say -
 
char *line = readline ("Enter a line: ");
-
in order to read a line of text from the user. -The line returned has the final newline removed, so only the -text remains. -

- -If readline encounters an EOF while reading the line, and the -line is empty at that point, then (char *)NULL is returned. -Otherwise, the line is ended just as if a newline had been typed. -

- -If you want the user to be able to get at the line later, (with -C-p for example), you must call add_history() to save the -line away in a history list of such lines. -

- -
 
add_history (line);
-

- -For full details on the GNU History Library, see the associated manual. -

- -It is preferable to avoid saving empty lines on the history list, since -users rarely have a burning need to reuse a blank line. Here is -a function which usefully replaces the standard gets() library -function, and has the advantage of no static buffer to overflow: -

- -
 
/* A static variable for holding the line. */
-static char *line_read = (char *)NULL;
-
-/* Read a string, and return a pointer to it.
-   Returns NULL on EOF. */
-char *
-rl_gets ()
-{
-  /* If the buffer has already been allocated,
-     return the memory to the free pool. */
-  if (line_read)
-    {
-      free (line_read);
-      line_read = (char *)NULL;
-    }
-
-  /* Get a line from the user. */
-  line_read = readline ("");
-
-  /* If the line has any text in it,
-     save it on the history. */
-  if (line_read && *line_read)
-    add_history (line_read);
-
-  return (line_read);
-}
-

- -This function gives the user the default behaviour of TAB -completion: completion on file names. If you do not want Readline to -complete on filenames, you can change the binding of the TAB key -with rl_bind_key(). -

- -
 
int rl_bind_key (int key, rl_command_func_t *function);
-

- -rl_bind_key() takes two arguments: key is the character that -you want to bind, and function is the address of the function to -call when key is pressed. Binding TAB to rl_insert() -makes TAB insert itself. -rl_bind_key() returns non-zero if key is not a valid -ASCII character code (between 0 and 255). -

- -Thus, to disable the default TAB behavior, the following suffices: -
 
rl_bind_key ('\t', rl_insert);
-

- -This code should be executed once at the start of your program; you -might write a function called initialize_readline() which -performs this and other desired initializations, such as installing -custom completers (see section 2.6 Custom Completers). -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.2 Custom Functions

- -

- -Readline provides many functions for manipulating the text of -the line, but it isn't possible to anticipate the needs of all -programs. This section describes the various functions and variables -defined within the Readline library which allow a user program to add -customized functionality to Readline. -

- -Before declaring any functions that customize Readline's behavior, or -using any functionality Readline provides in other code, an -application writer should include the file <readline/readline.h> -in any file that uses Readline's features. Since some of the definitions -in readline.h use the stdio library, the file -<stdio.h> should be included before readline.h. -

- -readline.h defines a C preprocessor variable that should -be treated as an integer, RL_READLINE_VERSION, which may -be used to conditionally compile application code depending on -the installed Readline version. The value is a hexadecimal -encoding of the major and minor version numbers of the library, -of the form 0xMMmm. MM is the two-digit major -version number; mm is the two-digit minor version number. -For Readline 4.2, for example, the value of -RL_READLINE_VERSION would be 0x0402. -

- -

- - -
2.2.1 Readline Typedefs  C declarations to make code readable.
2.2.2 Writing a New Function  Variables and calling conventions.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.2.1 Readline Typedefs

- -

- -For readabilty, we declare a number of new object types, all pointers -to functions. -

- -The reason for declaring these new types is to make it easier to write -code describing pointers to C functions with appropriately prototyped -arguments and return values. -

- -For instance, say we want to declare a variable func as a pointer -to a function which takes two int arguments and returns an -int (this is the type of all of the Readline bindable functions). -Instead of the classic C declaration -

- -int (*func)(); -

- -or the ANSI-C style declaration -

- -int (*func)(int, int); -

- -we may write -

- -rl_command_func_t *func; -

- -The full list of function pointer types available is -

- -

-
typedef int rl_command_func_t (int, int); -

- -

typedef char *rl_compentry_func_t (const char *, int); -

- -

typedef char **rl_completion_func_t (const char *, int, int); -

- -

typedef char *rl_quote_func_t (char *, int, char *); -

- -

typedef char *rl_dequote_func_t (char *, int); -

- -

typedef int rl_compignore_func_t (char **); -

- -

typedef void rl_compdisp_func_t (char **, int, int); -

- -

typedef int rl_hook_func_t (void); -

- -

typedef int rl_getc_func_t (FILE *); -

- -

typedef int rl_linebuf_func_t (char *, int); -

- -

typedef int rl_intfunc_t (int); -
#define rl_ivoidfunc_t rl_hook_func_t -
typedef int rl_icpfunc_t (char *); -
typedef int rl_icppfunc_t (char **); -

- -

typedef void rl_voidfunc_t (void); -
typedef void rl_vintfunc_t (int); -
typedef void rl_vcpfunc_t (char *); -
typedef void rl_vcppfunc_t (char **); -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.2.2 Writing a New Function

- -

- -In order to write new functions for Readline, you need to know the -calling conventions for keyboard-invoked functions, and the names of the -variables that describe the current state of the line read so far. -

- -The calling sequence for a command foo looks like -

- -
 
int foo (int count, int key)
-

- -where count is the numeric argument (or 1 if defaulted) and -key is the key that invoked this function. -

- -It is completely up to the function as to what should be done with the -numeric argument. Some functions use it as a repeat count, some -as a flag, and others to choose alternate behavior (refreshing the current -line as opposed to refreshing the screen, for example). Some choose to -ignore it. In general, if a -function uses the numeric argument as a repeat count, it should be able -to do something useful with both negative and positive arguments. -At the very least, it should be aware that it can be passed a -negative argument. -

- -A command function should return 0 if its action completes successfully, -and a non-zero value if some error occurs. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.3 Readline Variables

- -

- -These variables are available to function writers. -

- - -

-
Variable: char * rl_line_buffer -
This is the line gathered so far. You are welcome to modify the -contents of the line, but see 2.4.5 Allowing Undoing. The -function rl_extend_line_buffer is available to increase -the memory allocated to rl_line_buffer. -
-

- - -

-
Variable: int rl_point -
The offset of the current cursor position in rl_line_buffer -(the point). -
-

- - -

-
Variable: int rl_end -
The number of characters present in rl_line_buffer. When -rl_point is at the end of the line, rl_point and -rl_end are equal. -
-

- - -

-
Variable: int rl_mark -
The mark (saved position) in the current line. If set, the mark -and point define a region. -
-

- - -

-
Variable: int rl_done -
Setting this to a non-zero value causes Readline to return the current -line immediately. -
-

- - -

-
Variable: int rl_num_chars_to_read -
Setting this to a positive value before calling readline() causes -Readline to return after accepting that many characters, rather -than reading up to a character bound to accept-line. -
-

- - -

-
Variable: int rl_pending_input -
Setting this to a value makes it the next keystroke read. This is a -way to stuff a single character into the input stream. -
-

- - -

-
Variable: int rl_dispatching -
Set to a non-zero value if a function is being called from a key binding; -zero otherwise. Application functions can test this to discover whether -they were called directly or by Readline's dispatching mechanism. -
-

- - -

-
Variable: int rl_erase_empty_line -
Setting this to a non-zero value causes Readline to completely erase -the current line, including any prompt, any time a newline is typed as -the only character on an otherwise-empty line. The cursor is moved to -the beginning of the newly-blank line. -
-

- - -

-
Variable: char * rl_prompt -
The prompt Readline uses. This is set from the argument to -readline(), and should not be assigned to directly. -The rl_set_prompt() function (see section 2.4.6 Redisplay) may -be used to modify the prompt string after calling readline(). -
-

- - -

-
Variable: int rl_already_prompted -
If an application wishes to display the prompt itself, rather than have -Readline do it the first time readline() is called, it should set -this variable to a non-zero value after displaying the prompt. -The prompt must also be passed as the argument to readline() so -the redisplay functions can update the display properly. -The calling application is responsible for managing the value; Readline -never sets it. -
-

- - -

-
Variable: const char * rl_library_version -
The version number of this revision of the library. -
-

- - -

-
Variable: int rl_readline_version -
An integer encoding the current version of the library. The encoding is -of the form 0xMMmm, where MM is the two-digit major version -number, and mm is the two-digit minor version number. -For example, for Readline-4.2, rl_readline_version would have the -value 0x0402. -
-

- - -

-
Variable: int rl_gnu_readline_p -
Always set to 1, denoting that this is GNU readline rather than some -emulation. -
-

- - -

-
Variable: const char * rl_terminal_name -
The terminal type, used for initialization. If not set by the application, -Readline sets this to the value of the TERM environment variable -the first time it is called. -
-

- - -

-
Variable: const char * rl_readline_name -
This variable is set to a unique name by each application using Readline. -The value allows conditional parsing of the inputrc file -(see section 1.3.2 Conditional Init Constructs). -
-

- - -

-
Variable: FILE * rl_instream -
The stdio stream from which Readline reads input. -If NULL, Readline defaults to stdin. -
-

- - -

-
Variable: FILE * rl_outstream -
The stdio stream to which Readline performs output. -If NULL, Readline defaults to stdout. -
-

- - -

-
Variable: rl_command_func_t * rl_last_func -
The address of the last command function Readline executed. May be used to -test whether or not a function is being executed twice in succession, for -example. -
-

- - -

-
Variable: rl_hook_func_t * rl_startup_hook -
If non-zero, this is the address of a function to call just -before readline prints the first prompt. -
-

- - -

-
Variable: rl_hook_func_t * rl_pre_input_hook -
If non-zero, this is the address of a function to call after -the first prompt has been printed and just before readline -starts reading input characters. -
-

- - -

-
Variable: rl_hook_func_t * rl_event_hook -
If non-zero, this is the address of a function to call periodically -when Readline is waiting for terminal input. -By default, this will be called at most ten times a second if there -is no keyboard input. -
-

- - -

-
Variable: rl_getc_func_t * rl_getc_function -
If non-zero, Readline will call indirectly through this pointer -to get a character from the input stream. By default, it is set to -rl_getc, the default Readline character input function -(see section 2.4.8 Character Input). -
-

- - -

-
Variable: rl_voidfunc_t * rl_redisplay_function -
If non-zero, Readline will call indirectly through this pointer -to update the display with the current contents of the editing buffer. -By default, it is set to rl_redisplay, the default Readline -redisplay function (see section 2.4.6 Redisplay). -
-

- - -

-
Variable: rl_vintfunc_t * rl_prep_term_function -
If non-zero, Readline will call indirectly through this pointer -to initialize the terminal. The function takes a single argument, an -int flag that says whether or not to use eight-bit characters. -By default, this is set to rl_prep_terminal -(see section 2.4.9 Terminal Management). -
-

- - -

-
Variable: rl_voidfunc_t * rl_deprep_term_function -
If non-zero, Readline will call indirectly through this pointer -to reset the terminal. This function should undo the effects of -rl_prep_term_function. -By default, this is set to rl_deprep_terminal -(see section 2.4.9 Terminal Management). -
-

- - -

-
Variable: Keymap rl_executing_keymap -
This variable is set to the keymap (see section 2.4.2 Selecting a Keymap) in which the -currently executing readline function was found. -
-

- - -

-
Variable: Keymap rl_binding_keymap -
This variable is set to the keymap (see section 2.4.2 Selecting a Keymap) in which the -last key binding occurred. -
-

- - -

-
Variable: char * rl_executing_macro -
This variable is set to the text of any currently-executing macro. -
-

- - -

-
Variable: int rl_readline_state -
A variable with bit values that encapsulate the current Readline state. -A bit is set with the RL_SETSTATE macro, and unset with the -RL_UNSETSTATE macro. Use the RL_ISSTATE macro to test -whether a particular state bit is set. Current state bits include: -

- -

-
RL_STATE_NONE -
Readline has not yet been called, nor has it begun to intialize. -
RL_STATE_INITIALIZING -
Readline is initializing its internal data structures. -
RL_STATE_INITIALIZED -
Readline has completed its initialization. -
RL_STATE_TERMPREPPED -
Readline has modified the terminal modes to do its own input and redisplay. -
RL_STATE_READCMD -
Readline is reading a command from the keyboard. -
RL_STATE_METANEXT -
Readline is reading more input after reading the meta-prefix character. -
RL_STATE_DISPATCHING -
Readline is dispatching to a command. -
RL_STATE_MOREINPUT -
Readline is reading more input while executing an editing command. -
RL_STATE_ISEARCH -
Readline is performing an incremental history search. -
RL_STATE_NSEARCH -
Readline is performing a non-incremental history search. -
RL_STATE_SEARCH -
Readline is searching backward or forward through the history for a string. -
RL_STATE_NUMERICARG -
Readline is reading a numeric argument. -
RL_STATE_MACROINPUT -
Readline is currently getting its input from a previously-defined keyboard -macro. -
RL_STATE_MACRODEF -
Readline is currently reading characters defining a keyboard macro. -
RL_STATE_OVERWRITE -
Readline is in overwrite mode. -
RL_STATE_COMPLETING -
Readline is performing word completion. -
RL_STATE_SIGHANDLER -
Readline is currently executing the readline signal handler. -
RL_STATE_UNDOING -
Readline is performing an undo. -
RL_STATE_DONE -
Readline has read a key sequence bound to accept-line -and is about to return the line to the caller. -
-

- -

-

- - -

-
Variable: int rl_explicit_arg -
Set to a non-zero value if an explicit numeric argument was specified by -the user. Only valid in a bindable command function. -
-

- - -

-
Variable: int rl_numeric_arg -
Set to the value of any numeric argument explicitly specified by the user -before executing the current Readline function. Only valid in a bindable -command function. -
-

- - -

-
Variable: int rl_editing_mode -
Set to a value denoting Readline's current editing mode. A value of -1 means Readline is currently in emacs mode; 0 -means that vi mode is active. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.4 Readline Convenience Functions

- -

- -

- - - - - - - - - - - - - -
2.4.1 Naming a Function  How to give a function you write a name.
2.4.2 Selecting a Keymap  Making keymaps.
2.4.3 Binding Keys  Changing Keymaps.
2.4.4 Associating Function Names and Bindings  Translate function names to - key sequences.
2.4.5 Allowing Undoing  How to make your functions undoable.
2.4.6 Redisplay  Functions to control line display.
2.4.7 Modifying Text  Functions to modify rl_line_buffer.
2.4.8 Character Input  Functions to read keyboard input.
2.4.9 Terminal Management  Functions to manage terminal settings.
2.4.10 Utility Functions  Generally useful functions and hooks.
2.4.11 Miscellaneous Functions  Functions that don't fall into any category.
2.4.12 Alternate Interface  Using Readline in a `callback' fashion.
2.4.13 A Readline Example  An example Readline function.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.4.1 Naming a Function

- -

- -The user can dynamically change the bindings of keys while using -Readline. This is done by representing the function with a descriptive -name. The user is able to type the descriptive name when referring to -the function. Thus, in an init file, one might find -

- -
 
Meta-Rubout:	backward-kill-word
-

- -This binds the keystroke Meta-Rubout to the function -descriptively named backward-kill-word. You, as the -programmer, should bind the functions you write to descriptive names as -well. Readline provides a function for doing that: -

- - -

-
Function: int rl_add_defun (const char *name, rl_command_func_t *function, int key) -
Add name to the list of named functions. Make function be -the function that gets called. If key is not -1, then bind it to -function using rl_bind_key(). -
-

- -Using this function alone is sufficient for most applications. -It is the recommended way to add a few functions to the default -functions that Readline has built in. -If you need to do something other than adding a function to Readline, -you may need to use the underlying functions described below. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.4.2 Selecting a Keymap

- -

- -Key bindings take place on a keymap. The keymap is the -association between the keys that the user types and the functions that -get run. You can make your own keymaps, copy existing keymaps, and tell -Readline which keymap to use. -

- - -

-
Function: Keymap rl_make_bare_keymap (void) -
Returns a new, empty keymap. The space for the keymap is allocated with -malloc(); the caller should free it by calling -rl_discard_keymap() when done. -
-

- - -

-
Function: Keymap rl_copy_keymap (Keymap map) -
Return a new keymap which is a copy of map. -
-

- - -

-
Function: Keymap rl_make_keymap (void) -
Return a new keymap with the printing characters bound to rl_insert, -the lowercase Meta characters bound to run their equivalents, and -the Meta digits bound to produce numeric arguments. -
-

- - -

-
Function: void rl_discard_keymap (Keymap keymap) -
Free the storage associated with keymap. -
-

- -Readline has several internal keymaps. These functions allow you to -change which keymap is active. -

- - -

-
Function: Keymap rl_get_keymap (void) -
Returns the currently active keymap. -
-

- - -

-
Function: void rl_set_keymap (Keymap keymap) -
Makes keymap the currently active keymap. -
-

- - -

-
Function: Keymap rl_get_keymap_by_name (const char *name) -
Return the keymap matching name. name is one which would -be supplied in a set keymap inputrc line (see section 1.3 Readline Init File). -
-

- - -

-
Function: char * rl_get_keymap_name (Keymap keymap) -
Return the name matching keymap. name is one which would -be supplied in a set keymap inputrc line (see section 1.3 Readline Init File). -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.4.3 Binding Keys

- -

- -Key sequences are associate with functions through the keymap. -Readline has several internal keymaps: emacs_standard_keymap, -emacs_meta_keymap, emacs_ctlx_keymap, -vi_movement_keymap, and vi_insertion_keymap. -emacs_standard_keymap is the default, and the examples in -this manual assume that. -

- -Since readline() installs a set of default key bindings the first -time it is called, there is always the danger that a custom binding -installed before the first call to readline() will be overridden. -An alternate mechanism is to install custom key bindings in an -initialization function assigned to the rl_startup_hook variable -(see section 2.3 Readline Variables). -

- -These functions manage key bindings. -

- - -

-
Function: int rl_bind_key (int key, rl_command_func_t *function) -
Binds key to function in the currently active keymap. -Returns non-zero in the case of an invalid key. -
-

- - -

-
Function: int rl_bind_key_in_map (int key, rl_command_func_t *function, Keymap map) -
Bind key to function in map. -Returns non-zero in the case of an invalid key. -
-

- - -

-
Function: int rl_bind_key_if_unbound (int key, rl_command_func_t *function) -
Binds key to function if it is not already bound in the -currently active keymap. -Returns non-zero in the case of an invalid key or if key is -already bound. -
-

- - -

-
Function: int rl_bind_key_if_unbound_in_map (int key, rl_command_func_t *function, Keymap map) -
Binds key to function if it is not already bound in map. -Returns non-zero in the case of an invalid key or if key is -already bound. -
-

- - -

-
Function: int rl_unbind_key (int key) -
Bind key to the null function in the currently active keymap. -Returns non-zero in case of error. -
-

- - -

-
Function: int rl_unbind_key_in_map (int key, Keymap map) -
Bind key to the null function in map. -Returns non-zero in case of error. -
-

- - -

-
Function: int rl_unbind_function_in_map (rl_command_func_t *function, Keymap map) -
Unbind all keys that execute function in map. -
-

- - -

-
Function: int rl_unbind_command_in_map (const char *command, Keymap map) -
Unbind all keys that are bound to command in map. -
-

- - -

-
Function: int rl_bind_keyseq (const char *keyseq, rl_command_func_t *function) -
Bind the key sequence represented by the string keyseq to the function -function, beginning in the current keymap. -This makes new keymaps as necessary. -The return value is non-zero if keyseq is invalid. -
-

- - -

-
Function: int rl_bind_keyseq_in_map (const char *keyseq, rl_command_func_t *function, Keymap map) -
Bind the key sequence represented by the string keyseq to the function -function. This makes new keymaps as necessary. -Initial bindings are performed in map. -The return value is non-zero if keyseq is invalid. -
-

- - -

-
Function: int rl_set_key (const char *keyseq, rl_command_func_t *function, Keymap map) -
Equivalent to rl_bind_keyseq_in_map. -
-

- - -

-
Function: int rl_bind_keyseq_if_unbound (const char *keyseq, rl_command_func_t *function) -
Binds keyseq to function if it is not already bound in the -currently active keymap. -Returns non-zero in the case of an invalid keyseq or if keyseq is -already bound. -
-

- - -

-
Function: int rl_bind_keyseq_if_unbound_in_map (const char *keyseq, rl_command_func_t *function, Keymap map) -
Binds keyseq to function if it is not already bound in map. -Returns non-zero in the case of an invalid keyseq or if keyseq is -already bound. -
-

- - -

-
Function: int rl_generic_bind (int type, const char *keyseq, char *data, Keymap map) -
Bind the key sequence represented by the string keyseq to the arbitrary -pointer data. type says what kind of data is pointed to by -data; this can be a function (ISFUNC), a macro -(ISMACR), or a keymap (ISKMAP). This makes new keymaps as -necessary. The initial keymap in which to do bindings is map. -
-

- - -

-
Function: int rl_parse_and_bind (char *line) -
Parse line as if it had been read from the inputrc file and -perform any key bindings and variable assignments found -(see section 1.3 Readline Init File). -
-

- - -

-
Function: int rl_read_init_file (const char *filename) -
Read keybindings and variable assignments from filename -(see section 1.3 Readline Init File). -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.4.4 Associating Function Names and Bindings

- -

- -These functions allow you to find out what keys invoke named functions -and the functions invoked by a particular key sequence. You may also -associate a new function name with an arbitrary function. -

- - -

-
Function: rl_command_func_t * rl_named_function (const char *name) -
Return the function with name name. -
-

- - -

-
Function: rl_command_func_t * rl_function_of_keyseq (const char *keyseq, Keymap map, int *type) -
Return the function invoked by keyseq in keymap map. -If map is NULL, the current keymap is used. If type is -not NULL, the type of the object is returned in the int variable -it points to (one of ISFUNC, ISKMAP, or ISMACR). -
-

- - -

-
Function: char ** rl_invoking_keyseqs (rl_command_func_t *function) -
Return an array of strings representing the key sequences used to -invoke function in the current keymap. -
-

- - -

-
Function: char ** rl_invoking_keyseqs_in_map (rl_command_func_t *function, Keymap map) -
Return an array of strings representing the key sequences used to -invoke function in the keymap map. -
-

- - -

-
Function: void rl_function_dumper (int readable) -
Print the readline function names and the key sequences currently -bound to them to rl_outstream. If readable is non-zero, -the list is formatted in such a way that it can be made part of an -inputrc file and re-read. -
-

- - -

-
Function: void rl_list_funmap_names (void) -
Print the names of all bindable Readline functions to rl_outstream. -
-

- - -

-
Function: const char ** rl_funmap_names (void) -
Return a NULL terminated array of known function names. The array is -sorted. The array itself is allocated, but not the strings inside. You -should free() the array when you are done, but not the pointers. -
-

- - -

-
Function: int rl_add_funmap_entry (const char *name, rl_command_func_t *function) -
Add name to the list of bindable Readline command names, and make -function the function to be called when name is invoked. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.4.5 Allowing Undoing

- -

- -Supporting the undo command is a painless thing, and makes your -functions much more useful. It is certainly easy to try -something if you know you can undo it. -

- -If your function simply inserts text once, or deletes text once, and -uses rl_insert_text() or rl_delete_text() to do it, then -undoing is already done for you automatically. -

- -If you do multiple insertions or multiple deletions, or any combination -of these operations, you should group them together into one operation. -This is done with rl_begin_undo_group() and -rl_end_undo_group(). -

- -The types of events that can be undone are: -

- -
 
enum undo_code { UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END }; 
-

- -Notice that UNDO_DELETE means to insert some text, and -UNDO_INSERT means to delete some text. That is, the undo code -tells what to undo, not how to undo it. UNDO_BEGIN and -UNDO_END are tags added by rl_begin_undo_group() and -rl_end_undo_group(). -

- - -

-
Function: int rl_begin_undo_group (void) -
Begins saving undo information in a group construct. The undo -information usually comes from calls to rl_insert_text() and -rl_delete_text(), but could be the result of calls to -rl_add_undo(). -
-

- - -

-
Function: int rl_end_undo_group (void) -
Closes the current undo group started with rl_begin_undo_group -(). There should be one call to rl_end_undo_group() -for each call to rl_begin_undo_group(). -
-

- - -

-
Function: void rl_add_undo (enum undo_code what, int start, int end, char *text) -
Remember how to undo an event (according to what). The affected -text runs from start to end, and encompasses text. -
-

- - -

-
Function: void rl_free_undo_list (void) -
Free the existing undo list. -
-

- - -

-
Function: int rl_do_undo (void) -
Undo the first thing on the undo list. Returns 0 if there was -nothing to undo, non-zero if something was undone. -
-

- -Finally, if you neither insert nor delete text, but directly modify the -existing text (e.g., change its case), call rl_modifying() -once, just before you modify the text. You must supply the indices of -the text range that you are going to modify. -

- - -

-
Function: int rl_modifying (int start, int end) -
Tell Readline to save the text between start and end as a -single undo unit. It is assumed that you will subsequently modify -that text. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.4.6 Redisplay

- -

- - -

-
Function: void rl_redisplay (void) -
Change what's displayed on the screen to reflect the current contents -of rl_line_buffer. -
-

- - -

-
Function: int rl_forced_update_display (void) -
Force the line to be updated and redisplayed, whether or not -Readline thinks the screen display is correct. -
-

- - -

-
Function: int rl_on_new_line (void) -
Tell the update functions that we have moved onto a new (empty) line, -usually after ouputting a newline. -
-

- - -

-
Function: int rl_on_new_line_with_prompt (void) -
Tell the update functions that we have moved onto a new line, with -rl_prompt already displayed. -This could be used by applications that want to output the prompt string -themselves, but still need Readline to know the prompt string length for -redisplay. -It should be used after setting rl_already_prompted. -
-

- - -

-
Function: int rl_reset_line_state (void) -
Reset the display state to a clean state and redisplay the current line -starting on a new line. -
-

- - -

-
Function: int rl_crlf (void) -
Move the cursor to the start of the next screen line. -
-

- - -

-
Function: int rl_show_char (int c) -
Display character c on rl_outstream. -If Readline has not been set to display meta characters directly, this -will convert meta characters to a meta-prefixed key sequence. -This is intended for use by applications which wish to do their own -redisplay. -
-

- - -

-
Function: int rl_message (const char *, ...) -
The arguments are a format string as would be supplied to printf, -possibly containing conversion specifications such as `%d', and -any additional arguments necessary to satisfy the conversion specifications. -The resulting string is displayed in the echo area. The echo area -is also used to display numeric arguments and search strings. -
-

- - -

-
Function: int rl_clear_message (void) -
Clear the message in the echo area. -
-

- - -

-
Function: void rl_save_prompt (void) -
Save the local Readline prompt display state in preparation for -displaying a new message in the message area with rl_message(). -
-

- - -

-
Function: void rl_restore_prompt (void) -
Restore the local Readline prompt display state saved by the most -recent call to rl_save_prompt. -
-

- - -

-
Function: int rl_expand_prompt (char *prompt) -
Expand any special character sequences in prompt and set up the -local Readline prompt redisplay variables. -This function is called by readline(). It may also be called to -expand the primary prompt if the rl_on_new_line_with_prompt() -function or rl_already_prompted variable is used. -It returns the number of visible characters on the last line of the -(possibly multi-line) prompt. -Applications may indicate that the prompt contains characters that take -up no physical screen space when displayed by bracketing a sequence of -such characters with the special markers RL_PROMPT_START_IGNORE -and RL_PROMPT_END_IGNORE (declared in `readline.h'. This may -be used to embed terminal-specific escape sequences in prompts. -
-

- - -

-
Function: int rl_set_prompt (const char *prompt) -
Make Readline use prompt for subsequent redisplay. This calls -rl_expand_prompt() to expand the prompt and sets rl_prompt -to the result. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.4.7 Modifying Text

- -

- - -

-
Function: int rl_insert_text (const char *text) -
Insert text into the line at the current cursor position. -Returns the number of characters inserted. -
-

- - -

-
Function: int rl_delete_text (int start, int end) -
Delete the text between start and end in the current line. -Returns the number of characters deleted. -
-

- - -

-
Function: char * rl_copy_text (int start, int end) -
Return a copy of the text between start and end in -the current line. -
-

- - -

-
Function: int rl_kill_text (int start, int end) -
Copy the text between start and end in the current line -to the kill ring, appending or prepending to the last kill if the -last command was a kill command. The text is deleted. -If start is less than end, -the text is appended, otherwise prepended. If the last command was -not a kill, a new kill ring slot is used. -
-

- - -

-
Function: int rl_push_macro_input (char *macro) -
Cause macro to be inserted into the line, as if it had been invoked -by a key bound to a macro. Not especially useful; use -rl_insert_text() instead. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.4.8 Character Input

- -

- - -

-
Function: int rl_read_key (void) -
Return the next character available from Readline's current input stream. -This handles input inserted into -the input stream via rl_pending_input (see section 2.3 Readline Variables) -and rl_stuff_char(), macros, and characters read from the keyboard. -While waiting for input, this function will call any function assigned to -the rl_event_hook variable. -
-

- - -

-
Function: int rl_getc (FILE *stream) -
Return the next character available from stream, which is assumed to -be the keyboard. -
-

- - -

-
Function: int rl_stuff_char (int c) -
Insert c into the Readline input stream. It will be "read" -before Readline attempts to read characters from the terminal with -rl_read_key(). Up to 512 characters may be pushed back. -rl_stuff_char returns 1 if the character was successfully inserted; -0 otherwise. -
-

- - -

-
Function: int rl_execute_next (int c) -
Make c be the next command to be executed when rl_read_key() -is called. This sets rl_pending_input. -
-

- - -

-
Function: int rl_clear_pending_input (void) -
Unset rl_pending_input, effectively negating the effect of any -previous call to rl_execute_next(). This works only if the -pending input has not already been read with rl_read_key(). -
-

- - -

-
Function: int rl_set_keyboard_input_timeout (int u) -
While waiting for keyboard input in rl_read_key(), Readline will -wait for u microseconds for input before calling any function -assigned to rl_event_hook. The default waiting period is -one-tenth of a second. Returns the old timeout value. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.4.9 Terminal Management

- -

- - -

-
Function: void rl_prep_terminal (int meta_flag) -
Modify the terminal settings for Readline's use, so readline() -can read a single character at a time from the keyboard. -The meta_flag argument should be non-zero if Readline should -read eight-bit input. -
-

- - -

-
Function: void rl_deprep_terminal (void) -
Undo the effects of rl_prep_terminal(), leaving the terminal in -the state in which it was before the most recent call to -rl_prep_terminal(). -
-

- - -

-
Function: void rl_tty_set_default_bindings (Keymap kmap) -
Read the operating system's terminal editing characters (as would be -displayed by stty) to their Readline equivalents. -The bindings are performed in kmap. -
-

- - -

-
Function: void rl_tty_unset_default_bindings (Keymap kmap) -
Reset the bindings manipulated by rl_tty_set_default_bindings so -that the terminal editing characters are bound to rl_insert. -The bindings are performed in kmap. -
-

- - -

-
Function: int rl_reset_terminal (const char *terminal_name) -
Reinitialize Readline's idea of the terminal settings using -terminal_name as the terminal type (e.g., vt100). -If terminal_name is NULL, the value of the TERM -environment variable is used. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.4.10 Utility Functions

- -

- - -

-
Function: void rl_replace_line (const char *text, int clear_undo) -
Replace the contents of rl_line_buffer with text. -The point and mark are preserved, if possible. -If clear_undo is non-zero, the undo list associated with the -current line is cleared. -
-

- - -

-
Function: int rl_extend_line_buffer (int len) -
Ensure that rl_line_buffer has enough space to hold len -characters, possibly reallocating it if necessary. -
-

- - -

-
Function: int rl_initialize (void) -
Initialize or re-initialize Readline's internal state. -It's not strictly necessary to call this; readline() calls it before -reading any input. -
-

- - -

-
Function: int rl_ding (void) -
Ring the terminal bell, obeying the setting of bell-style. -
-

- - -

-
Function: int rl_alphabetic (int c) -
Return 1 if c is an alphabetic character. -
-

- - -

-
Function: void rl_display_match_list (char **matches, int len, int max) -
A convenience function for displaying a list of strings in -columnar format on Readline's output stream. matches is the list -of strings, in argv format, such as a list of completion matches. -len is the number of strings in matches, and max -is the length of the longest string in matches. This function uses -the setting of print-completions-horizontally to select how the -matches are displayed (see section 1.3.1 Readline Init File Syntax). -
-

- -The following are implemented as macros, defined in chardefs.h. -Applications should refrain from using them. -

- - -

-
Function: int _rl_uppercase_p (int c) -
Return 1 if c is an uppercase alphabetic character. -
-

- - -

-
Function: int _rl_lowercase_p (int c) -
Return 1 if c is a lowercase alphabetic character. -
-

- - -

-
Function: int _rl_digit_p (int c) -
Return 1 if c is a numeric character. -
-

- - -

-
Function: int _rl_to_upper (int c) -
If c is a lowercase alphabetic character, return the corresponding -uppercase character. -
-

- - -

-
Function: int _rl_to_lower (int c) -
If c is an uppercase alphabetic character, return the corresponding -lowercase character. -
-

- - -

-
Function: int _rl_digit_value (int c) -
If c is a number, return the value it represents. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.4.11 Miscellaneous Functions

- -

- - -

-
Function: int rl_macro_bind (const char *keyseq, const char *macro, Keymap map) -
Bind the key sequence keyseq to invoke the macro macro. -The binding is performed in map. When keyseq is invoked, the -macro will be inserted into the line. This function is deprecated; -use rl_generic_bind() instead. -
-

- - -

-
Function: void rl_macro_dumper (int readable) -
Print the key sequences bound to macros and their values, using -the current keymap, to rl_outstream. -If readable is non-zero, the list is formatted in such a way -that it can be made part of an inputrc file and re-read. -
-

- - -

-
Function: int rl_variable_bind (const char *variable, const char *value) -
Make the Readline variable variable have value. -This behaves as if the readline command -`set variable value' had been executed in an inputrc -file (see section 1.3.1 Readline Init File Syntax). -
-

- - -

-
Function: void rl_variable_dumper (int readable) -
Print the readline variable names and their current values -to rl_outstream. -If readable is non-zero, the list is formatted in such a way -that it can be made part of an inputrc file and re-read. -
-

- - -

-
Function: int rl_set_paren_blink_timeout (int u) -
Set the time interval (in microseconds) that Readline waits when showing -a balancing character when blink-matching-paren has been enabled. -
-

- - -

-
Function: char * rl_get_termcap (const char *cap) -
Retrieve the string value of the termcap capability cap. -Readline fetches the termcap entry for the current terminal name and -uses those capabilities to move around the screen line and perform other -terminal-specific operations, like erasing a line. Readline does not -use all of a terminal's capabilities, and this function will return -values for only those capabilities Readline uses. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.4.12 Alternate Interface

- -

- -An alternate interface is available to plain readline(). Some -applications need to interleave keyboard I/O with file, device, or -window system I/O, typically by using a main loop to select() -on various file descriptors. To accomodate this need, readline can -also be invoked as a `callback' function from an event loop. There -are functions available to make this easy. -

- - -

-
Function: void rl_callback_handler_install (const char *prompt, rl_vcpfunc_t *lhandler) -
Set up the terminal for readline I/O and display the initial -expanded value of prompt. Save the value of lhandler to -use as a function to call when a complete line of input has been entered. -The function takes the text of the line as an argument. -
-

- - -

-
Function: void rl_callback_read_char (void) -
Whenever an application determines that keyboard input is available, it -should call rl_callback_read_char(), which will read the next -character from the current input source. -If that character completes the line, rl_callback_read_char will -invoke the lhandler function saved by rl_callback_handler_install -to process the line. -Before calling the lhandler function, the terminal settings are -reset to the values they had before calling -rl_callback_handler_install. -If the lhandler function returns, -the terminal settings are modified for Readline's use again. -EOF is indicated by calling lhandler with a -NULL line. -
-

- - -

-
Function: void rl_callback_handler_remove (void) -
Restore the terminal to its initial state and remove the line handler. -This may be called from within a callback as well as independently. -If the lhandler installed by rl_callback_handler_install -does not exit the program, either this function or the function referred -to by the value of rl_deprep_term_function should be called before -the program exits to reset the terminal settings. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.4.13 A Readline Example

- -

- -Here is a function which changes lowercase characters to their uppercase -equivalents, and uppercase characters to lowercase. If -this function was bound to `M-c', then typing `M-c' would -change the case of the character under point. Typing `M-1 0 M-c' -would change the case of the following 10 characters, leaving the cursor on -the last character changed. -

- -
 
/* Invert the case of the COUNT following characters. */
-int
-invert_case_line (count, key)
-     int count, key;
-{
-  register int start, end, i;
-
-  start = rl_point;
-
-  if (rl_point >= rl_end)
-    return (0);
-
-  if (count < 0)
-    {
-      direction = -1;
-      count = -count;
-    }
-  else
-    direction = 1;
-      
-  /* Find the end of the range to modify. */
-  end = start + (count * direction);
-
-  /* Force it to be within range. */
-  if (end > rl_end)
-    end = rl_end;
-  else if (end < 0)
-    end = 0;
-
-  if (start == end)
-    return (0);
-
-  if (start > end)
-    {
-      int temp = start;
-      start = end;
-      end = temp;
-    }
-
-  /* Tell readline that we are modifying the line,
-     so it will save the undo information. */
-  rl_modifying (start, end);
-
-  for (i = start; i != end; i++)
-    {
-      if (_rl_uppercase_p (rl_line_buffer[i]))
-        rl_line_buffer[i] = _rl_to_lower (rl_line_buffer[i]);
-      else if (_rl_lowercase_p (rl_line_buffer[i]))
-        rl_line_buffer[i] = _rl_to_upper (rl_line_buffer[i]);
-    }
-  /* Move point to on top of the last character changed. */
-  rl_point = (direction == 1) ? end - 1 : start;
-  return (0);
-}
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.5 Readline Signal Handling

- -

- -Signals are asynchronous events sent to a process by the Unix kernel, -sometimes on behalf of another process. They are intended to indicate -exceptional events, like a user pressing the interrupt key on his terminal, -or a network connection being broken. There is a class of signals that can -be sent to the process currently reading input from the keyboard. Since -Readline changes the terminal attributes when it is called, it needs to -perform special processing when such a signal is received in order to -restore the terminal to a sane state, or provide application writers with -functions to do so manually. -

- -Readline contains an internal signal handler that is installed for a -number of signals (SIGINT, SIGQUIT, SIGTERM, -SIGALRM, SIGTSTP, SIGTTIN, and SIGTTOU). -When one of these signals is received, the signal handler -will reset the terminal attributes to those that were in effect before -readline() was called, reset the signal handling to what it was -before readline() was called, and resend the signal to the calling -application. -If and when the calling application's signal handler returns, Readline -will reinitialize the terminal and continue to accept input. -When a SIGINT is received, the Readline signal handler performs -some additional work, which will cause any partially-entered line to be -aborted (see the description of rl_free_line_state() below). -

- -There is an additional Readline signal handler, for SIGWINCH, which -the kernel sends to a process whenever the terminal's size changes (for -example, if a user resizes an xterm). The Readline SIGWINCH -handler updates Readline's internal screen size information, and then calls -any SIGWINCH signal handler the calling application has installed. -Readline calls the application's SIGWINCH signal handler without -resetting the terminal to its original state. If the application's signal -handler does more than update its idea of the terminal size and return (for -example, a longjmp back to a main processing loop), it must -call rl_cleanup_after_signal() (described below), to restore the -terminal state. -

- -Readline provides two variables that allow application writers to -control whether or not it will catch certain signals and act on them -when they are received. It is important that applications change the -values of these variables only when calling readline(), not in -a signal handler, so Readline's internal signal state is not corrupted. -

- - -

-
Variable: int rl_catch_signals -
If this variable is non-zero, Readline will install signal handlers for -SIGINT, SIGQUIT, SIGTERM, SIGALRM, -SIGTSTP, SIGTTIN, and SIGTTOU. -

- -The default value of rl_catch_signals is 1. -

-

- - -

-
Variable: int rl_catch_sigwinch -
If this variable is non-zero, Readline will install a signal handler for -SIGWINCH. -

- -The default value of rl_catch_sigwinch is 1. -

-

- -If an application does not wish to have Readline catch any signals, or -to handle signals other than those Readline catches (SIGHUP, -for example), -Readline provides convenience functions to do the necessary terminal -and internal state cleanup upon receipt of a signal. -

- - -

-
Function: void rl_cleanup_after_signal (void) -
This function will reset the state of the terminal to what it was before -readline() was called, and remove the Readline signal handlers for -all signals, depending on the values of rl_catch_signals and -rl_catch_sigwinch. -
-

- - -

-
Function: void rl_free_line_state (void) -
This will free any partial state associated with the current input line -(undo information, any partial history entry, any partially-entered -keyboard macro, and any partially-entered numeric argument). This -should be called before rl_cleanup_after_signal(). The -Readline signal handler for SIGINT calls this to abort the -current input line. -
-

- - -

-
Function: void rl_reset_after_signal (void) -
This will reinitialize the terminal and reinstall any Readline signal -handlers, depending on the values of rl_catch_signals and -rl_catch_sigwinch. -
-

- -If an application does not wish Readline to catch SIGWINCH, it may -call rl_resize_terminal() or rl_set_screen_size() to force -Readline to update its idea of the terminal size when a SIGWINCH -is received. -

- - -

-
Function: void rl_resize_terminal (void) -
Update Readline's internal screen size by reading values from the kernel. -
-

- - -

-
Function: void rl_set_screen_size (int rows, int cols) -
Set Readline's idea of the terminal size to rows rows and -cols columns. -
-

- -If an application does not want to install a SIGWINCH handler, but -is still interested in the screen dimensions, Readline's idea of the screen -size may be queried. -

- - -

-
Function: void rl_get_screen_size (int *rows, int *cols) -
Return Readline's idea of the terminal's size in the -variables pointed to by the arguments. -
-

- -The following functions install and remove Readline's signal handlers. -

- - -

-
Function: int rl_set_signals (void) -
Install Readline's signal handler for SIGINT, SIGQUIT, -SIGTERM, SIGALRM, SIGTSTP, SIGTTIN, -SIGTTOU, and SIGWINCH, depending on the values of -rl_catch_signals and rl_catch_sigwinch. -
-

- - -

-
Function: int rl_clear_signals (void) -
Remove all of the Readline signal handlers installed by -rl_set_signals(). -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.6 Custom Completers

- -

- -Typically, a program that reads commands from the user has a way of -disambiguating commands and data. If your program is one of these, then -it can provide completion for commands, data, or both. -The following sections describe how your program and Readline -cooperate to provide this service. -

- -

- - - - -
2.6.1 How Completing Works  The logic used to do completion.
2.6.2 Completion Functions  Functions provided by Readline.
2.6.3 Completion Variables  Variables which control completion.
2.6.4 A Short Completion Example  An example of writing completer subroutines.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.6.1 How Completing Works

- -

- -In order to complete some text, the full list of possible completions -must be available. That is, it is not possible to accurately -expand a partial word without knowing all of the possible words -which make sense in that context. The Readline library provides -the user interface to completion, and two of the most common -completion functions: filename and username. For completing other types -of text, you must write your own completion function. This section -describes exactly what such functions must do, and provides an example. -

- -There are three major functions used to perform completion: -

- -

    -
  1. -The user-interface function rl_complete(). This function is -called with the same arguments as other bindable Readline functions: -count and invoking_key. -It isolates the word to be completed and calls -rl_completion_matches() to generate a list of possible completions. -It then either lists the possible completions, inserts the possible -completions, or actually performs the -completion, depending on which behavior is desired. -

    - -

  2. -The internal function rl_completion_matches() uses an -application-supplied generator function to generate the list of -possible matches, and then returns the array of these matches. -The caller should place the address of its generator function in -rl_completion_entry_function. -

    - -

  3. -The generator function is called repeatedly from -rl_completion_matches(), returning a string each time. The -arguments to the generator function are text and state. -text is the partial word to be completed. state is zero the -first time the function is called, allowing the generator to perform -any necessary initialization, and a positive non-zero integer for -each subsequent call. The generator function returns -(char *)NULL to inform rl_completion_matches() that there are -no more possibilities left. Usually the generator function computes the -list of possible completions when state is zero, and returns them -one at a time on subsequent calls. Each string the generator function -returns as a match must be allocated with malloc(); Readline -frees the strings when it has finished with them. -Such a generator function is referred to as an -application-specific completion function. -

    - -

-

- - -

-
Function: int rl_complete (int ignore, int invoking_key) -
Complete the word at or before point. You have supplied the function -that does the initial simple matching selection algorithm (see -rl_completion_matches()). The default is to do filename completion. -
-

- - -

-
Variable: rl_compentry_func_t * rl_completion_entry_function -
This is a pointer to the generator function for -rl_completion_matches(). -If the value of rl_completion_entry_function is -NULL then the default filename generator -function, rl_filename_completion_function(), is used. -An application-specific completion function is a function whose -address is assigned to rl_completion_entry_function and whose -return values are used to generate possible completions. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.6.2 Completion Functions

- -

- -Here is the complete list of callable completion functions present in -Readline. -

- - -

-
Function: int rl_complete_internal (int what_to_do) -
Complete the word at or before point. what_to_do says what to do -with the completion. A value of `?' means list the possible -completions. `TAB' means do standard completion. `*' means -insert all of the possible completions. `!' means to display -all of the possible completions, if there is more than one, as well as -performing partial completion. `@' is similar to `!', but -possible completions are not listed if the possible completions share -a common prefix. -
-

- - -

-
Function: int rl_complete (int ignore, int invoking_key) -
Complete the word at or before point. You have supplied the function -that does the initial simple matching selection algorithm (see -rl_completion_matches() and rl_completion_entry_function). -The default is to do filename -completion. This calls rl_complete_internal() with an -argument depending on invoking_key. -
-

- - -

-
Function: int rl_possible_completions (int count, int invoking_key) -
List the possible completions. See description of rl_complete -(). This calls rl_complete_internal() with an argument of -`?'. -
-

- - -

-
Function: int rl_insert_completions (int count, int invoking_key) -
Insert the list of possible completions into the line, deleting the -partially-completed word. See description of rl_complete(). -This calls rl_complete_internal() with an argument of `*'. -
-

- - -

-
Function: int rl_completion_mode (rl_command_func_t *cfunc) -
Returns the apppriate value to pass to rl_complete_internal() -depending on whether cfunc was called twice in succession and -the values of the show-all-if-ambiguous and -show-all-if-unmodified variables. -Application-specific completion functions may use this function to present -the same interface as rl_complete(). -
-

- - -

-
Function: char ** rl_completion_matches (const char *text, rl_compentry_func_t *entry_func) -
Returns an array of strings which is a list of completions for -text. If there are no completions, returns NULL. -The first entry in the returned array is the substitution for text. -The remaining entries are the possible completions. The array is -terminated with a NULL pointer. -

- -entry_func is a function of two args, and returns a -char *. The first argument is text. The second is a -state argument; it is zero on the first call, and non-zero on subsequent -calls. entry_func returns a NULL pointer to the caller -when there are no more matches. -

-

- - -

-
Function: char * rl_filename_completion_function (const char *text, int state) -
A generator function for filename completion in the general case. -text is a partial filename. -The Bash source is a useful reference for writing application-specific -completion functions (the Bash completion functions call this and other -Readline functions). -
-

- - -

-
Function: char * rl_username_completion_function (const char *text, int state) -
A completion generator for usernames. text contains a partial -username preceded by a random character (usually `~'). As with all -completion generators, state is zero on the first call and non-zero -for subsequent calls. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.6.3 Completion Variables

- -

- - -

-
Variable: rl_compentry_func_t * rl_completion_entry_function -
A pointer to the generator function for rl_completion_matches(). -NULL means to use rl_filename_completion_function(), -the default filename completer. -
-

- - -

-
Variable: rl_completion_func_t * rl_attempted_completion_function -
A pointer to an alternative function to create matches. -The function is called with text, start, and end. -start and end are indices in rl_line_buffer defining -the boundaries of text, which is a character string. -If this function exists and returns NULL, or if this variable is -set to NULL, then rl_complete() will call the value of -rl_completion_entry_function to generate matches, otherwise the -array of strings returned will be used. -If this function sets the rl_attempted_completion_over -variable to a non-zero value, Readline will not perform its default -completion even if this function returns no matches. -
-

- - -

-
Variable: rl_quote_func_t * rl_filename_quoting_function -
A pointer to a function that will quote a filename in an -application-specific fashion. This is called if filename completion is being -attempted and one of the characters in rl_filename_quote_characters -appears in a completed filename. The function is called with -text, match_type, and quote_pointer. The text -is the filename to be quoted. The match_type is either -SINGLE_MATCH, if there is only one completion match, or -MULT_MATCH. Some functions use this to decide whether or not to -insert a closing quote character. The quote_pointer is a pointer -to any opening quote character the user typed. Some functions choose -to reset this character. -
-

- - -

-
Variable: rl_dequote_func_t * rl_filename_dequoting_function -
A pointer to a function that will remove application-specific quoting -characters from a filename before completion is attempted, so those -characters do not interfere with matching the text against names in -the filesystem. It is called with text, the text of the word -to be dequoted, and quote_char, which is the quoting character -that delimits the filename (usually `'' or `"'). If -quote_char is zero, the filename was not in an embedded string. -
-

- - -

-
Variable: rl_linebuf_func_t * rl_char_is_quoted_p -
A pointer to a function to call that determines whether or not a specific -character in the line buffer is quoted, according to whatever quoting -mechanism the program calling Readline uses. The function is called with -two arguments: text, the text of the line, and index, the -index of the character in the line. It is used to decide whether a -character found in rl_completer_word_break_characters should be -used to break words for the completer. -
-

- - -

-
Variable: rl_compignore_func_t * rl_ignore_some_completions_function -
This function, if defined, is called by the completer when real filename -completion is done, after all the matching names have been generated. -It is passed a NULL terminated array of matches. -The first element (matches[0]) is the -maximal substring common to all matches. This function can -re-arrange the list of matches as required, but each element deleted -from the array must be freed. -
-

- - -

-
Variable: rl_icppfunc_t * rl_directory_completion_hook -
This function, if defined, is allowed to modify the directory portion -of filenames Readline completes. It is called with the address of a -string (the current directory name) as an argument, and may modify that string. -If the string is replaced with a new string, the old value should be freed. -Any modified directory name should have a trailing slash. -The modified value will be displayed as part of the completion, replacing -the directory portion of the pathname the user typed. -It returns an integer that should be non-zero if the function modifies -its directory argument. -It could be used to expand symbolic links or shell variables in pathnames. -
-

- - -

-
Variable: rl_compdisp_func_t * rl_completion_display_matches_hook -
If non-zero, then this is the address of a function to call when -completing a word would normally display the list of possible matches. -This function is called in lieu of Readline displaying the list. -It takes three arguments: -(char **matches, int num_matches, int max_length) -where matches is the array of matching strings, -num_matches is the number of strings in that array, and -max_length is the length of the longest string in that array. -Readline provides a convenience function, rl_display_match_list, -that takes care of doing the display to Readline's output stream. That -function may be called from this hook. -
-

- - -

-
Variable: const char * rl_basic_word_break_characters -
The basic list of characters that signal a break between words for the -completer routine. The default value of this variable is the characters -which break words for completion in Bash: -" \t\n\"\\'`@$><=;|&{(". -
-

- - -

-
Variable: const char * rl_basic_quote_characters -
A list of quote characters which can cause a word break. -
-

- - -

-
Variable: const char * rl_completer_word_break_characters -
The list of characters that signal a break between words for -rl_complete_internal(). The default list is the value of -rl_basic_word_break_characters. -
-

- - -

-
Variable: rl_cpvfunc_t * rl_completion_word_break_hook -
If non-zero, this is the address of a function to call when Readline is -deciding where to separate words for word completion. It should return -a character string like rl_completer_word_break_characters to be -used to perform the current completion. The function may choose to set -rl_completer_word_break_characters itself. If the function -returns NULL, rl_completer_word_break_characters is used. -
-

- - -

-
Variable: const char * rl_completer_quote_characters -
A list of characters which can be used to quote a substring of the line. -Completion occurs on the entire substring, and within the substring -rl_completer_word_break_characters are treated as any other character, -unless they also appear within this list. -
-

- - -

-
Variable: const char * rl_filename_quote_characters -
A list of characters that cause a filename to be quoted by the completer -when they appear in a completed filename. The default is the null string. -
-

- - -

-
Variable: const char * rl_special_prefixes -
The list of characters that are word break characters, but should be -left in text when it is passed to the completion function. -Programs can use this to help determine what kind of completing to do. -For instance, Bash sets this variable to "$@" so that it can complete -shell variables and hostnames. -
-

- - -

-
Variable: int rl_completion_query_items -
Up to this many items will be displayed in response to a -possible-completions call. After that, we ask the user if she is sure -she wants to see them all. The default value is 100. -
-

- - -

-
Variable: int rl_completion_append_character -
When a single completion alternative matches at the end of the command -line, this character is appended to the inserted completion text. The -default is a space character (` '). Setting this to the null -character (`\0') prevents anything being appended automatically. -This can be changed in application-specific completion functions to -provide the "most sensible word separator character" according to -an application-specific command line syntax specification. -
-

- - -

-
Variable: int rl_completion_suppress_append -
If non-zero, rl_completion_append_character is not appended to -matches at the end of the command line, as described above. -It is set to 0 before any application-specific completion function -is called, and may only be changed within such a function. -
-

- - -

-
Variable: int rl_completion_quote_character -
When Readline is completing quoted text, as delimited by one of the -characters in rl_completer_quote_characters, it sets this variable -to the quoting character found. -This is set before any application-specific completion function is called. -
-

- - -

-
Variable: int rl_completion_suppress_quote -
If non-zero, Readline does not append a matching quote character when -performing completion on a quoted string. -It is set to 0 before any application-specific completion function -is called, and may only be changed within such a function. -
-

- - -

-
Variable: int rl_completion_found_quote -
When Readline is completing quoted text, it sets this variable -to a non-zero value if the word being completed contains or is delimited -by any quoting characters, including backslashes. -This is set before any application-specific completion function is called. -
-

- - -

-
Variable: int rl_completion_mark_symlink_dirs -
If non-zero, a slash will be appended to completed filenames that are -symbolic links to directory names, subject to the value of the -user-settable mark-directories variable. -This variable exists so that application-specific completion functions -can override the user's global preference (set via the -mark-symlinked-directories Readline variable) if appropriate. -This variable is set to the user's preference before any -application-specific completion function is called, so unless that -function modifies the value, the user's preferences are honored. -
-

- - -

-
Variable: int rl_ignore_completion_duplicates -
If non-zero, then duplicates in the matches are removed. -The default is 1. -
-

- - -

-
Variable: int rl_filename_completion_desired -
Non-zero means that the results of the matches are to be treated as -filenames. This is always zero when completion is attempted, -and can only be changed -within an application-specific completion function. If it is set to a -non-zero value by such a function, directory names have a slash appended -and Readline attempts to quote completed filenames if they contain any -characters in rl_filename_quote_characters and -rl_filename_quoting_desired is set to a non-zero value. -
-

- - -

-
Variable: int rl_filename_quoting_desired -
Non-zero means that the results of the matches are to be quoted using -double quotes (or an application-specific quoting mechanism) if the -completed filename contains any characters in -rl_filename_quote_chars. This is always non-zero -when completion is attempted, and can only be changed within an -application-specific completion function. -The quoting is effected via a call to the function pointed to -by rl_filename_quoting_function. -
-

- - -

-
Variable: int rl_attempted_completion_over -
If an application-specific completion function assigned to -rl_attempted_completion_function sets this variable to a non-zero -value, Readline will not perform its default filename completion even -if the application's completion function returns no matches. -It should be set only by an application's completion function. -
-

- - -

-
Variable: int rl_completion_type -
Set to a character describing the type of completion Readline is currently -attempting; see the description of rl_complete_internal() -(see section 2.6.2 Completion Functions) for the list of characters. -This is set to the appropriate value before any application-specific -completion function is called, allowing such functions to present -the same interface as rl_complete(). -
-

- - -

-
Variable: int rl_inhibit_completion -
If this variable is non-zero, completion is inhibited. The completion -character will be inserted as any other bound to self-insert. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2.6.4 A Short Completion Example

- -

- -Here is a small application demonstrating the use of the GNU Readline -library. It is called fileman, and the source code resides in -`examples/fileman.c'. This sample application provides -completion of command names, line editing features, and access to the -history list. -

- -
 
/* fileman.c -- A tiny application which demonstrates how to use the
-   GNU Readline library.  This application interactively allows users
-   to manipulate files and their modes. */
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/file.h>
-#include <sys/stat.h>
-#include <sys/errno.h>
-
-#include <readline/readline.h>
-#include <readline/history.h>
-
-extern char *xmalloc ();
-
-/* The names of functions that actually do the manipulation. */
-int com_list __P((char *));
-int com_view __P((char *));
-int com_rename __P((char *));
-int com_stat __P((char *));
-int com_pwd __P((char *));
-int com_delete __P((char *));
-int com_help __P((char *));
-int com_cd __P((char *));
-int com_quit __P((char *));
-
-/* A structure which contains information on the commands this program
-   can understand. */
-
-typedef struct {
-  char *name;			/* User printable name of the function. */
-  rl_icpfunc_t *func;		/* Function to call to do the job. */
-  char *doc;			/* Documentation for this function.  */
-} COMMAND;
-
-COMMAND commands[] = {
-  { "cd", com_cd, "Change to directory DIR" },
-  { "delete", com_delete, "Delete FILE" },
-  { "help", com_help, "Display this text" },
-  { "?", com_help, "Synonym for `help'" },
-  { "list", com_list, "List files in DIR" },
-  { "ls", com_list, "Synonym for `list'" },
-  { "pwd", com_pwd, "Print the current working directory" },
-  { "quit", com_quit, "Quit using Fileman" },
-  { "rename", com_rename, "Rename FILE to NEWNAME" },
-  { "stat", com_stat, "Print out statistics on FILE" },
-  { "view", com_view, "View the contents of FILE" },
-  { (char *)NULL, (rl_icpfunc_t *)NULL, (char *)NULL }
-};
-
-/* Forward declarations. */
-char *stripwhite ();
-COMMAND *find_command ();
-
-/* The name of this program, as taken from argv[0]. */
-char *progname;
-
-/* When non-zero, this means the user is done using this program. */
-int done;
-
-char *
-dupstr (s)
-     int s;
-{
-  char *r;
-
-  r = xmalloc (strlen (s) + 1);
-  strcpy (r, s);
-  return (r);
-}
-
-main (argc, argv)
-     int argc;
-     char **argv;
-{
-  char *line, *s;
-
-  progname = argv[0];
-
-  initialize_readline ();	/* Bind our completer. */
-
-  /* Loop reading and executing lines until the user quits. */
-  for ( ; done == 0; )
-    {
-      line = readline ("FileMan: ");
-
-      if (!line)
-        break;
-
-      /* Remove leading and trailing whitespace from the line.
-         Then, if there is anything left, add it to the history list
-         and execute it. */
-      s = stripwhite (line);
-
-      if (*s)
-        {
-          add_history (s);
-          execute_line (s);
-        }
-
-      free (line);
-    }
-  exit (0);
-}
-
-/* Execute a command line. */
-int
-execute_line (line)
-     char *line;
-{
-  register int i;
-  COMMAND *command;
-  char *word;
-
-  /* Isolate the command word. */
-  i = 0;
-  while (line[i] && whitespace (line[i]))
-    i++;
-  word = line + i;
-
-  while (line[i] && !whitespace (line[i]))
-    i++;
-
-  if (line[i])
-    line[i++] = '\0';
-
-  command = find_command (word);
-
-  if (!command)
-    {
-      fprintf (stderr, "%s: No such command for FileMan.\n", word);
-      return (-1);
-    }
-
-  /* Get argument to command, if any. */
-  while (whitespace (line[i]))
-    i++;
-
-  word = line + i;
-
-  /* Call the function. */
-  return ((*(command->func)) (word));
-}
-
-/* Look up NAME as the name of a command, and return a pointer to that
-   command.  Return a NULL pointer if NAME isn't a command name. */
-COMMAND *
-find_command (name)
-     char *name;
-{
-  register int i;
-
-  for (i = 0; commands[i].name; i++)
-    if (strcmp (name, commands[i].name) == 0)
-      return (&commands[i]);
-
-  return ((COMMAND *)NULL);
-}
-
-/* Strip whitespace from the start and end of STRING.  Return a pointer
-   into STRING. */
-char *
-stripwhite (string)
-     char *string;
-{
-  register char *s, *t;
-
-  for (s = string; whitespace (*s); s++)
-    ;
-    
-  if (*s == 0)
-    return (s);
-
-  t = s + strlen (s) - 1;
-  while (t > s && whitespace (*t))
-    t--;
-  *++t = '\0';
-
-  return s;
-}
-
-/* **************************************************************** */
-/*                                                                  */
-/*                  Interface to Readline Completion                */
-/*                                                                  */
-/* **************************************************************** */
-
-char *command_generator __P((const char *, int));
-char **fileman_completion __P((const char *, int, int));
-
-/* Tell the GNU Readline library how to complete.  We want to try to
-   complete on command names if this is the first word in the line, or
-   on filenames if not. */
-initialize_readline ()
-{
-  /* Allow conditional parsing of the ~/.inputrc file. */
-  rl_readline_name = "FileMan";
-
-  /* Tell the completer that we want a crack first. */
-  rl_attempted_completion_function = fileman_completion;
-}
-
-/* Attempt to complete on the contents of TEXT.  START and END
-   bound the region of rl_line_buffer that contains the word to
-   complete.  TEXT is the word to complete.  We can use the entire
-   contents of rl_line_buffer in case we want to do some simple
-   parsing.  Returnthe array of matches, or NULL if there aren't any. */
-char **
-fileman_completion (text, start, end)
-     const char *text;
-     int start, end;
-{
-  char **matches;
-
-  matches = (char **)NULL;
-
-  /* If this word is at the start of the line, then it is a command
-     to complete.  Otherwise it is the name of a file in the current
-     directory. */
-  if (start == 0)
-    matches = rl_completion_matches (text, command_generator);
-
-  return (matches);
-}
-
-/* Generator function for command completion.  STATE lets us
-   know whether to start from scratch; without any state
-   (i.e. STATE == 0), then we start at the top of the list. */
-char *
-command_generator (text, state)
-     const char *text;
-     int state;
-{
-  static int list_index, len;
-  char *name;
-
-  /* If this is a new word to complete, initialize now.  This
-     includes saving the length of TEXT for efficiency, and
-     initializing the index variable to 0. */
-  if (!state)
-    {
-      list_index = 0;
-      len = strlen (text);
-    }
-
-  /* Return the next name which partially matches from the
-     command list. */
-  while (name = commands[list_index].name)
-    {
-      list_index++;
-
-      if (strncmp (name, text, len) == 0)
-        return (dupstr(name));
-    }
-
-  /* If no names matched, then return NULL. */
-  return ((char *)NULL);
-}
-
-/* **************************************************************** */
-/*                                                                  */
-/*                       FileMan Commands                           */
-/*                                                                  */
-/* **************************************************************** */
-
-/* String to pass to system ().  This is for the LIST, VIEW and RENAME
-   commands. */
-static char syscom[1024];
-
-/* List the file(s) named in arg. */
-com_list (arg)
-     char *arg;
-{
-  if (!arg)
-    arg = "";
-
-  sprintf (syscom, "ls -FClg %s", arg);
-  return (system (syscom));
-}
-
-com_view (arg)
-     char *arg;
-{
-  if (!valid_argument ("view", arg))
-    return 1;
-
-  sprintf (syscom, "more %s", arg);
-  return (system (syscom));
-}
-
-com_rename (arg)
-     char *arg;
-{
-  too_dangerous ("rename");
-  return (1);
-}
-
-com_stat (arg)
-     char *arg;
-{
-  struct stat finfo;
-
-  if (!valid_argument ("stat", arg))
-    return (1);
-
-  if (stat (arg, &finfo) == -1)
-    {
-      perror (arg);
-      return (1);
-    }
-
-  printf ("Statistics for `%s':\n", arg);
-
-  printf ("%s has %d link%s, and is %d byte%s in length.\n", arg,
-          finfo.st_nlink,
-          (finfo.st_nlink == 1) ? "" : "s",
-          finfo.st_size,
-          (finfo.st_size == 1) ? "" : "s");
-  printf ("Inode Last Change at: %s", ctime (&finfo.st_ctime));
-  printf ("      Last access at: %s", ctime (&finfo.st_atime));
-  printf ("    Last modified at: %s", ctime (&finfo.st_mtime));
-  return (0);
-}
-
-com_delete (arg)
-     char *arg;
-{
-  too_dangerous ("delete");
-  return (1);
-}
-
-/* Print out help for ARG, or for all of the commands if ARG is
-   not present. */
-com_help (arg)
-     char *arg;
-{
-  register int i;
-  int printed = 0;
-
-  for (i = 0; commands[i].name; i++)
-    {
-      if (!*arg || (strcmp (arg, commands[i].name) == 0))
-        {
-          printf ("%s\t\t%s.\n", commands[i].name, commands[i].doc);
-          printed++;
-        }
-    }
-
-  if (!printed)
-    {
-      printf ("No commands match `%s'.  Possibilties are:\n", arg);
-
-      for (i = 0; commands[i].name; i++)
-        {
-          /* Print in six columns. */
-          if (printed == 6)
-            {
-              printed = 0;
-              printf ("\n");
-            }
-
-          printf ("%s\t", commands[i].name);
-          printed++;
-        }
-
-      if (printed)
-        printf ("\n");
-    }
-  return (0);
-}
-
-/* Change to the directory ARG. */
-com_cd (arg)
-     char *arg;
-{
-  if (chdir (arg) == -1)
-    {
-      perror (arg);
-      return 1;
-    }
-
-  com_pwd ("");
-  return (0);
-}
-
-/* Print out the current working directory. */
-com_pwd (ignore)
-     char *ignore;
-{
-  char dir[1024], *s;
-
-  s = getcwd (dir, sizeof(dir) - 1);
-  if (s == 0)
-    {
-      printf ("Error getting pwd: %s\n", dir);
-      return 1;
-    }
-
-  printf ("Current directory is %s\n", dir);
-  return 0;
-}
-
-/* The user wishes to quit using this program.  Just set DONE
-   non-zero. */
-com_quit (arg)
-     char *arg;
-{
-  done = 1;
-  return (0);
-}
-
-/* Function which tells you that you can't do this. */
-too_dangerous (caller)
-     char *caller;
-{
-  fprintf (stderr,
-           "%s: Too dangerous for me to distribute.\n"
-           caller);
-  fprintf (stderr, "Write it yourself.\n");
-}
-
-/* Return non-zero if ARG is a valid argument for CALLER,
-   else print an error message and return zero. */
-int
-valid_argument (caller, arg)
-     char *caller, *arg;
-{
-  if (!arg || !*arg)
-    {
-      fprintf (stderr, "%s: Argument required.\n", caller);
-      return (0);
-    }
-
-  return (1);
-}
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

A. Copying This Manual

- -

- -

- -
A.1 GNU Free Documentation License  License for copying this manual.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

A.1 GNU Free Documentation License

- -

- - -

- Version 1.2, November 2002 -
-

- -
 
Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
-59 Temple Place, Suite 330, Boston, MA  02111-1307, USA
-
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.
-

- -

    -
  1. -PREAMBLE -

    - -The purpose of this License is to make a manual, textbook, or other -functional and useful document free in the sense of freedom: to -assure everyone the effective freedom to copy and redistribute it, -with or without modifying it, either commercially or noncommercially. -Secondarily, this License preserves for the author and publisher a way -to get credit for their work, while not being considered responsible -for modifications made by others. -

    - -This License is a kind of "copyleft", which means that derivative -works of the document must themselves be free in the same sense. It -complements the GNU General Public License, which is a copyleft -license designed for free software. -

    - -We have designed this License in order to use it for manuals for free -software, because free software needs free documentation: a free -program should come with manuals providing the same freedoms that the -software does. But this License is not limited to software manuals; -it can be used for any textual work, regardless of subject matter or -whether it is published as a printed book. We recommend this License -principally for works whose purpose is instruction or reference. -

    - -

  2. -APPLICABILITY AND DEFINITIONS -

    - -This License applies to any manual or other work, in any medium, that -contains a notice placed by the copyright holder saying it can be -distributed under the terms of this License. Such a notice grants a -world-wide, royalty-free license, unlimited in duration, to use that -work under the conditions stated herein. The "Document", below, -refers to any such manual or work. Any member of the public is a -licensee, and is addressed as "you". You accept the license if you -copy, modify or distribute the work in a way requiring permission -under copyright law. -

    - -A "Modified Version" of the Document means any work containing the -Document or a portion of it, either copied verbatim, or with -modifications and/or translated into another language. -

    - -A "Secondary Section" is a named appendix or a front-matter section -of the Document that deals exclusively with the relationship of the -publishers or authors of the Document to the Document's overall -subject (or to related matters) and contains nothing that could fall -directly within that overall subject. (Thus, if the Document is in -part a textbook of mathematics, a Secondary Section may not explain -any mathematics.) The relationship could be a matter of historical -connection with the subject or with related matters, or of legal, -commercial, philosophical, ethical or political position regarding -them. -

    - -The "Invariant Sections" are certain Secondary Sections whose titles -are designated, as being those of Invariant Sections, in the notice -that says that the Document is released under this License. If a -section does not fit the above definition of Secondary then it is not -allowed to be designated as Invariant. The Document may contain zero -Invariant Sections. If the Document does not identify any Invariant -Sections then there are none. -

    - -The "Cover Texts" are certain short passages of text that are listed, -as Front-Cover Texts or Back-Cover Texts, in the notice that says that -the Document is released under this License. A Front-Cover Text may -be at most 5 words, and a Back-Cover Text may be at most 25 words. -

    - -A "Transparent" copy of the Document means a machine-readable copy, -represented in a format whose specification is available to the -general public, that is suitable for revising the document -straightforwardly with generic text editors or (for images composed of -pixels) generic paint programs or (for drawings) some widely available -drawing editor, and that is suitable for input to text formatters or -for automatic translation to a variety of formats suitable for input -to text formatters. A copy made in an otherwise Transparent file -format whose markup, or absence of markup, has been arranged to thwart -or discourage subsequent modification by readers is not Transparent. -An image format is not Transparent if used for any substantial amount -of text. A copy that is not "Transparent" is called "Opaque". -

    - -Examples of suitable formats for Transparent copies include plain -ASCII without markup, Texinfo input format, LaTeX input -format, SGML or XML using a publicly available -DTD, and standard-conforming simple HTML, -PostScript or PDF designed for human modification. Examples -of transparent image formats include PNG, XCF and -JPG. Opaque formats include proprietary formats that can be -read and edited only by proprietary word processors, SGML or -XML for which the DTD and/or processing tools are -not generally available, and the machine-generated HTML, -PostScript or PDF produced by some word processors for -output purposes only. -

    - -The "Title Page" means, for a printed book, the title page itself, -plus such following pages as are needed to hold, legibly, the material -this License requires to appear in the title page. For works in -formats which do not have any title page as such, "Title Page" means -the text near the most prominent appearance of the work's title, -preceding the beginning of the body of the text. -

    - -A section "Entitled XYZ" means a named subunit of the Document whose -title either is precisely XYZ or contains XYZ in parentheses following -text that translates XYZ in another language. (Here XYZ stands for a -specific section name mentioned below, such as "Acknowledgements", -"Dedications", "Endorsements", or "History".) To "Preserve the Title" -of such a section when you modify the Document means that it remains a -section "Entitled XYZ" according to this definition. -

    - -The Document may include Warranty Disclaimers next to the notice which -states that this License applies to the Document. These Warranty -Disclaimers are considered to be included by reference in this -License, but only as regards disclaiming warranties: any other -implication that these Warranty Disclaimers may have is void and has -no effect on the meaning of this License. -

    - -

  3. -VERBATIM COPYING -

    - -You may copy and distribute the Document in any medium, either -commercially or noncommercially, provided that this License, the -copyright notices, and the license notice saying this License applies -to the Document are reproduced in all copies, and that you add no other -conditions whatsoever to those of this License. You may not use -technical measures to obstruct or control the reading or further -copying of the copies you make or distribute. However, you may accept -compensation in exchange for copies. If you distribute a large enough -number of copies you must also follow the conditions in section 3. -

    - -You may also lend copies, under the same conditions stated above, and -you may publicly display copies. -

    - -

  4. -COPYING IN QUANTITY -

    - -If you publish printed copies (or copies in media that commonly have -printed covers) of the Document, numbering more than 100, and the -Document's license notice requires Cover Texts, you must enclose the -copies in covers that carry, clearly and legibly, all these Cover -Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on -the back cover. Both covers must also clearly and legibly identify -you as the publisher of these copies. The front cover must present -the full title with all words of the title equally prominent and -visible. You may add other material on the covers in addition. -Copying with changes limited to the covers, as long as they preserve -the title of the Document and satisfy these conditions, can be treated -as verbatim copying in other respects. -

    - -If the required texts for either cover are too voluminous to fit -legibly, you should put the first ones listed (as many as fit -reasonably) on the actual cover, and continue the rest onto adjacent -pages. -

    - -If you publish or distribute Opaque copies of the Document numbering -more than 100, you must either include a machine-readable Transparent -copy along with each Opaque copy, or state in or with each Opaque copy -a computer-network location from which the general network-using -public has access to download using public-standard network protocols -a complete Transparent copy of the Document, free of added material. -If you use the latter option, you must take reasonably prudent steps, -when you begin distribution of Opaque copies in quantity, to ensure -that this Transparent copy will remain thus accessible at the stated -location until at least one year after the last time you distribute an -Opaque copy (directly or through your agents or retailers) of that -edition to the public. -

    - -It is requested, but not required, that you contact the authors of the -Document well before redistributing any large number of copies, to give -them a chance to provide you with an updated version of the Document. -

    - -

  5. -MODIFICATIONS -

    - -You may copy and distribute a Modified Version of the Document under -the conditions of sections 2 and 3 above, provided that you release -the Modified Version under precisely this License, with the Modified -Version filling the role of the Document, thus licensing distribution -and modification of the Modified Version to whoever possesses a copy -of it. In addition, you must do these things in the Modified Version: -

    - -

      -
    1. -Use in the Title Page (and on the covers, if any) a title distinct -from that of the Document, and from those of previous versions -(which should, if there were any, be listed in the History section -of the Document). You may use the same title as a previous version -if the original publisher of that version gives permission. -

      - -

    2. -List on the Title Page, as authors, one or more persons or entities -responsible for authorship of the modifications in the Modified -Version, together with at least five of the principal authors of the -Document (all of its principal authors, if it has fewer than five), -unless they release you from this requirement. -

      - -

    3. -State on the Title page the name of the publisher of the -Modified Version, as the publisher. -

      - -

    4. -Preserve all the copyright notices of the Document. -

      - -

    5. -Add an appropriate copyright notice for your modifications -adjacent to the other copyright notices. -

      - -

    6. -Include, immediately after the copyright notices, a license notice -giving the public permission to use the Modified Version under the -terms of this License, in the form shown in the Addendum below. -

      - -

    7. -Preserve in that license notice the full lists of Invariant Sections -and required Cover Texts given in the Document's license notice. -

      - -

    8. -Include an unaltered copy of this License. -

      - -

    9. -Preserve the section Entitled "History", Preserve its Title, and add -to it an item stating at least the title, year, new authors, and -publisher of the Modified Version as given on the Title Page. If -there is no section Entitled "History" in the Document, create one -stating the title, year, authors, and publisher of the Document as -given on its Title Page, then add an item describing the Modified -Version as stated in the previous sentence. -

      - -

    10. -Preserve the network location, if any, given in the Document for -public access to a Transparent copy of the Document, and likewise -the network locations given in the Document for previous versions -it was based on. These may be placed in the "History" section. -You may omit a network location for a work that was published at -least four years before the Document itself, or if the original -publisher of the version it refers to gives permission. -

      - -

    11. -For any section Entitled "Acknowledgements" or "Dedications", Preserve -the Title of the section, and preserve in the section all the -substance and tone of each of the contributor acknowledgements and/or -dedications given therein. -

      - -

    12. -Preserve all the Invariant Sections of the Document, -unaltered in their text and in their titles. Section numbers -or the equivalent are not considered part of the section titles. -

      - -

    13. -Delete any section Entitled "Endorsements". Such a section -may not be included in the Modified Version. -

      - -

    14. -Do not retitle any existing section to be Entitled "Endorsements" or -to conflict in title with any Invariant Section. -

      - -

    15. -Preserve any Warranty Disclaimers. -
    -

    - -If the Modified Version includes new front-matter sections or -appendices that qualify as Secondary Sections and contain no material -copied from the Document, you may at your option designate some or all -of these sections as invariant. To do this, add their titles to the -list of Invariant Sections in the Modified Version's license notice. -These titles must be distinct from any other section titles. -

    - -You may add a section Entitled "Endorsements", provided it contains -nothing but endorsements of your Modified Version by various -parties--for example, statements of peer review or that the text has -been approved by an organization as the authoritative definition of a -standard. -

    - -You may add a passage of up to five words as a Front-Cover Text, and a -passage of up to 25 words as a Back-Cover Text, to the end of the list -of Cover Texts in the Modified Version. Only one passage of -Front-Cover Text and one of Back-Cover Text may be added by (or -through arrangements made by) any one entity. If the Document already -includes a cover text for the same cover, previously added by you or -by arrangement made by the same entity you are acting on behalf of, -you may not add another; but you may replace the old one, on explicit -permission from the previous publisher that added the old one. -

    - -The author(s) and publisher(s) of the Document do not by this License -give permission to use their names for publicity for or to assert or -imply endorsement of any Modified Version. -

    - -

  6. -COMBINING DOCUMENTS -

    - -You may combine the Document with other documents released under this -License, under the terms defined in section 4 above for modified -versions, provided that you include in the combination all of the -Invariant Sections of all of the original documents, unmodified, and -list them all as Invariant Sections of your combined work in its -license notice, and that you preserve all their Warranty Disclaimers. -

    - -The combined work need only contain one copy of this License, and -multiple identical Invariant Sections may be replaced with a single -copy. If there are multiple Invariant Sections with the same name but -different contents, make the title of each such section unique by -adding at the end of it, in parentheses, the name of the original -author or publisher of that section if known, or else a unique number. -Make the same adjustment to the section titles in the list of -Invariant Sections in the license notice of the combined work. -

    - -In the combination, you must combine any sections Entitled "History" -in the various original documents, forming one section Entitled -"History"; likewise combine any sections Entitled "Acknowledgements", -and any sections Entitled "Dedications". You must delete all -sections Entitled "Endorsements." -

    - -

  7. -COLLECTIONS OF DOCUMENTS -

    - -You may make a collection consisting of the Document and other documents -released under this License, and replace the individual copies of this -License in the various documents with a single copy that is included in -the collection, provided that you follow the rules of this License for -verbatim copying of each of the documents in all other respects. -

    - -You may extract a single document from such a collection, and distribute -it individually under this License, provided you insert a copy of this -License into the extracted document, and follow this License in all -other respects regarding verbatim copying of that document. -

    - -

  8. -AGGREGATION WITH INDEPENDENT WORKS -

    - -A compilation of the Document or its derivatives with other separate -and independent documents or works, in or on a volume of a storage or -distribution medium, is called an "aggregate" if the copyright -resulting from the compilation is not used to limit the legal rights -of the compilation's users beyond what the individual works permit. -When the Document is included an aggregate, this License does not -apply to the other works in the aggregate which are not themselves -derivative works of the Document. -

    - -If the Cover Text requirement of section 3 is applicable to these -copies of the Document, then if the Document is less than one half of -the entire aggregate, the Document's Cover Texts may be placed on -covers that bracket the Document within the aggregate, or the -electronic equivalent of covers if the Document is in electronic form. -Otherwise they must appear on printed covers that bracket the whole -aggregate. -

    - -

  9. -TRANSLATION -

    - -Translation is considered a kind of modification, so you may -distribute translations of the Document under the terms of section 4. -Replacing Invariant Sections with translations requires special -permission from their copyright holders, but you may include -translations of some or all Invariant Sections in addition to the -original versions of these Invariant Sections. You may include a -translation of this License, and all the license notices in the -Document, and any Warranty Disclaimers, provided that you also include -the original English version of this License and the original versions -of those notices and disclaimers. In case of a disagreement between -the translation and the original version of this License or a notice -or disclaimer, the original version will prevail. -

    - -If a section in the Document is Entitled "Acknowledgements", -"Dedications", or "History", the requirement (section 4) to Preserve -its Title (section 1) will typically require changing the actual -title. -

    - -

  10. -TERMINATION -

    - -You may not copy, modify, sublicense, or distribute the Document except -as expressly provided for under this License. Any other attempt to -copy, modify, sublicense or distribute the Document is void, and will -automatically terminate your rights under this License. However, -parties who have received copies, or rights, from you under this -License will not have their licenses terminated so long as such -parties remain in full compliance. -

    - -

  11. -FUTURE REVISIONS OF THIS LICENSE -

    - -The Free Software Foundation may publish new, revised versions -of the GNU Free Documentation License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. See -http://www.gnu.org/copyleft/. -

    - -Each version of the License is given a distinguishing version number. -If the Document specifies that a particular numbered version of this -License "or any later version" applies to it, you have the option of -following the terms and conditions either of that specified version or -of any later version that has been published (not as a draft) by the -Free Software Foundation. If the Document does not specify a version -number of this License, you may choose any version ever published (not -as a draft) by the Free Software Foundation. -

-

- -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

A.1.1 ADDENDUM: How to use this License for your documents

- -

- -To use this License in a document you have written, include a copy of -the License in the document and put the following copyright and -license notices just after the title page: -

- -
 
  Copyright (C)  year  your name.
-  Permission is granted to copy, distribute and/or modify this document
-  under the terms of the GNU Free Documentation License, Version 1.2
-  or any later version published by the Free Software Foundation;
-  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
-  A copy of the license is included in the section entitled ``GNU
-  Free Documentation License''.
-

- -If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, -replace the "with...Texts." line with this: -

- -
 
    with the Invariant Sections being list their titles, with
-    the Front-Cover Texts being list, and with the Back-Cover Texts
-    being list.
-

- -If you have Invariant Sections without Cover Texts, or some other -combination of the three, merge those two alternatives to suit the -situation. -

- -If your document contains nontrivial examples of program code, we -recommend releasing these examples in parallel under your choice of -free software license, such as the GNU General Public License, -to permit their use in free software. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

Concept Index

- -
Jump to:   A -   -C -   -E -   -F -   -I -   -K -   -N -   -R -   -V -   -Y -   -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Index Entry Section

A
application-specific completion functions2.6 Custom Completers

C
command editing1.2.1 Readline Bare Essentials

E
editing command lines1.2.1 Readline Bare Essentials

F
FDL, GNU Free Documentation LicenseA.1 GNU Free Documentation License

I
initialization file, readline1.3 Readline Init File
interaction, readline1.2 Readline Interaction

K
kill ring1.2.3 Readline Killing Commands
killing text1.2.3 Readline Killing Commands

N
notation, readline1.2.1 Readline Bare Essentials

R
readline, function2.1 Basic Behavior

V
variables, readline1.3.1 Readline Init File Syntax

Y
yanking text1.2.3 Readline Killing Commands

Jump to:   A -   -C -   -E -   -F -   -I -   -K -   -N -   -R -   -V -   -Y -   -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

Function and Variable Index

- -
Jump to:   _ -   -
-A -   -B -   -C -   -D -   -E -   -F -   -H -   -I -   -K -   -M -   -N -   -O -   -P -   -Q -   -R -   -S -   -T -   -U -   -V -   -Y -   -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Index Entry Section

_
_rl_digit_p2.4.10 Utility Functions
_rl_digit_value2.4.10 Utility Functions
_rl_lowercase_p2.4.10 Utility Functions
_rl_to_lower2.4.10 Utility Functions
_rl_to_upper2.4.10 Utility Functions
_rl_uppercase_p2.4.10 Utility Functions

A
abort (C-g)1.4.8 Some Miscellaneous Commands
abort (C-g)1.4.8 Some Miscellaneous Commands
accept-line (Newline or Return)1.4.2 Commands For Manipulating The History
accept-line (Newline or Return)1.4.2 Commands For Manipulating The History

B
backward-char (C-b)1.4.1 Commands For Moving
backward-char (C-b)1.4.1 Commands For Moving
backward-delete-char (Rubout)1.4.3 Commands For Changing Text
backward-delete-char (Rubout)1.4.3 Commands For Changing Text
backward-kill-line (C-x Rubout)1.4.4 Killing And Yanking
backward-kill-line (C-x Rubout)1.4.4 Killing And Yanking
backward-kill-word (M-DEL)1.4.4 Killing And Yanking
backward-kill-word (M-DEL)1.4.4 Killing And Yanking
backward-word (M-b)1.4.1 Commands For Moving
backward-word (M-b)1.4.1 Commands For Moving
beginning-of-history (M-&#60;)1.4.2 Commands For Manipulating The History
beginning-of-history (M-&#60;)1.4.2 Commands For Manipulating The History
beginning-of-line (C-a)1.4.1 Commands For Moving
beginning-of-line (C-a)1.4.1 Commands For Moving
bell-style1.3.1 Readline Init File Syntax

C
call-last-kbd-macro (C-x e)1.4.7 Keyboard Macros
call-last-kbd-macro (C-x e)1.4.7 Keyboard Macros
capitalize-word (M-c)1.4.3 Commands For Changing Text
capitalize-word (M-c)1.4.3 Commands For Changing Text
character-search (C-])1.4.8 Some Miscellaneous Commands
character-search (C-])1.4.8 Some Miscellaneous Commands
character-search-backward (M-C-])1.4.8 Some Miscellaneous Commands
character-search-backward (M-C-])1.4.8 Some Miscellaneous Commands
clear-screen (C-l)1.4.1 Commands For Moving
clear-screen (C-l)1.4.1 Commands For Moving
comment-begin1.3.1 Readline Init File Syntax
complete (TAB)1.4.6 Letting Readline Type For You
complete (TAB)1.4.6 Letting Readline Type For You
completion-query-items1.3.1 Readline Init File Syntax
convert-meta1.3.1 Readline Init File Syntax
copy-backward-word ()1.4.4 Killing And Yanking
copy-backward-word ()1.4.4 Killing And Yanking
copy-forward-word ()1.4.4 Killing And Yanking
copy-forward-word ()1.4.4 Killing And Yanking
copy-region-as-kill ()1.4.4 Killing And Yanking
copy-region-as-kill ()1.4.4 Killing And Yanking

D
delete-char (C-d)1.4.3 Commands For Changing Text
delete-char (C-d)1.4.3 Commands For Changing Text
delete-char-or-list ()1.4.6 Letting Readline Type For You
delete-char-or-list ()1.4.6 Letting Readline Type For You
delete-horizontal-space ()1.4.4 Killing And Yanking
delete-horizontal-space ()1.4.4 Killing And Yanking
digit-argument (M-0, M-1, <small>...</small> M--)1.4.5 Specifying Numeric Arguments
digit-argument (M-0, M-1, <small>...</small> M--)1.4.5 Specifying Numeric Arguments
disable-completion1.3.1 Readline Init File Syntax
do-uppercase-version (M-a, M-b, M-x, <small>...</small>)1.4.8 Some Miscellaneous Commands
do-uppercase-version (M-a, M-b, M-x, <small>...</small>)1.4.8 Some Miscellaneous Commands
downcase-word (M-l)1.4.3 Commands For Changing Text
downcase-word (M-l)1.4.3 Commands For Changing Text
dump-functions ()1.4.8 Some Miscellaneous Commands
dump-functions ()1.4.8 Some Miscellaneous Commands
dump-macros ()1.4.8 Some Miscellaneous Commands
dump-macros ()1.4.8 Some Miscellaneous Commands
dump-variables ()1.4.8 Some Miscellaneous Commands
dump-variables ()1.4.8 Some Miscellaneous Commands

E
editing-mode1.3.1 Readline Init File Syntax
emacs-editing-mode (C-e)1.4.8 Some Miscellaneous Commands
emacs-editing-mode (C-e)1.4.8 Some Miscellaneous Commands
enable-keypad1.3.1 Readline Init File Syntax
end-kbd-macro (C-x ))1.4.7 Keyboard Macros
end-kbd-macro (C-x ))1.4.7 Keyboard Macros
end-of-history (M-&#62;)1.4.2 Commands For Manipulating The History
end-of-history (M-&#62;)1.4.2 Commands For Manipulating The History
end-of-line (C-e)1.4.1 Commands For Moving
end-of-line (C-e)1.4.1 Commands For Moving
exchange-point-and-mark (C-x C-x)1.4.8 Some Miscellaneous Commands
exchange-point-and-mark (C-x C-x)1.4.8 Some Miscellaneous Commands
expand-tilde1.3.1 Readline Init File Syntax

F
forward-backward-delete-char ()1.4.3 Commands For Changing Text
forward-backward-delete-char ()1.4.3 Commands For Changing Text
forward-char (C-f)1.4.1 Commands For Moving
forward-char (C-f)1.4.1 Commands For Moving
forward-search-history (C-s)1.4.2 Commands For Manipulating The History
forward-search-history (C-s)1.4.2 Commands For Manipulating The History
forward-word (M-f)1.4.1 Commands For Moving
forward-word (M-f)1.4.1 Commands For Moving

H
history-preserve-point1.3.1 Readline Init File Syntax
history-search-backward ()1.4.2 Commands For Manipulating The History
history-search-backward ()1.4.2 Commands For Manipulating The History
history-search-forward ()1.4.2 Commands For Manipulating The History
history-search-forward ()1.4.2 Commands For Manipulating The History
horizontal-scroll-mode1.3.1 Readline Init File Syntax

I
input-meta1.3.1 Readline Init File Syntax
insert-comment (M-#)1.4.8 Some Miscellaneous Commands
insert-comment (M-#)1.4.8 Some Miscellaneous Commands
insert-completions (M-*)1.4.6 Letting Readline Type For You
insert-completions (M-*)1.4.6 Letting Readline Type For You
isearch-terminators1.3.1 Readline Init File Syntax

K
keymap1.3.1 Readline Init File Syntax
kill-line (C-k)1.4.4 Killing And Yanking
kill-line (C-k)1.4.4 Killing And Yanking
kill-region ()1.4.4 Killing And Yanking
kill-region ()1.4.4 Killing And Yanking
kill-whole-line ()1.4.4 Killing And Yanking
kill-whole-line ()1.4.4 Killing And Yanking
kill-word (M-d)1.4.4 Killing And Yanking
kill-word (M-d)1.4.4 Killing And Yanking

M
mark-modified-lines1.3.1 Readline Init File Syntax
mark-symlinked-directories1.3.1 Readline Init File Syntax
match-hidden-files1.3.1 Readline Init File Syntax
menu-complete ()1.4.6 Letting Readline Type For You
menu-complete ()1.4.6 Letting Readline Type For You
meta-flag1.3.1 Readline Init File Syntax

N
next-history (C-n)1.4.2 Commands For Manipulating The History
next-history (C-n)1.4.2 Commands For Manipulating The History
non-incremental-forward-search-history (M-n)1.4.2 Commands For Manipulating The History
non-incremental-forward-search-history (M-n)1.4.2 Commands For Manipulating The History
non-incremental-reverse-search-history (M-p)1.4.2 Commands For Manipulating The History
non-incremental-reverse-search-history (M-p)1.4.2 Commands For Manipulating The History

O
output-meta1.3.1 Readline Init File Syntax
overwrite-mode ()1.4.3 Commands For Changing Text
overwrite-mode ()1.4.3 Commands For Changing Text

P
page-completions1.3.1 Readline Init File Syntax
possible-completions (M-?)1.4.6 Letting Readline Type For You
possible-completions (M-?)1.4.6 Letting Readline Type For You
prefix-meta (ESC)1.4.8 Some Miscellaneous Commands
prefix-meta (ESC)1.4.8 Some Miscellaneous Commands
previous-history (C-p)1.4.2 Commands For Manipulating The History
previous-history (C-p)1.4.2 Commands For Manipulating The History

Q
quoted-insert (C-q or C-v)1.4.3 Commands For Changing Text
quoted-insert (C-q or C-v)1.4.3 Commands For Changing Text

R
re-read-init-file (C-x C-r)1.4.8 Some Miscellaneous Commands
re-read-init-file (C-x C-r)1.4.8 Some Miscellaneous Commands
readline2.1 Basic Behavior
redraw-current-line ()1.4.1 Commands For Moving
redraw-current-line ()1.4.1 Commands For Moving
reverse-search-history (C-r)1.4.2 Commands For Manipulating The History
reverse-search-history (C-r)1.4.2 Commands For Manipulating The History
revert-line (M-r)1.4.8 Some Miscellaneous Commands
revert-line (M-r)1.4.8 Some Miscellaneous Commands
rl_add_defun2.4.1 Naming a Function
rl_add_funmap_entry2.4.4 Associating Function Names and Bindings
rl_add_undo2.4.5 Allowing Undoing
rl_alphabetic2.4.10 Utility Functions
rl_already_prompted2.3 Readline Variables
rl_attempted_completion_function2.6.3 Completion Variables
rl_attempted_completion_over2.6.3 Completion Variables
rl_basic_quote_characters2.6.3 Completion Variables
rl_basic_word_break_characters2.6.3 Completion Variables
rl_begin_undo_group2.4.5 Allowing Undoing
rl_bind_key2.4.3 Binding Keys
rl_bind_key_if_unbound2.4.3 Binding Keys
rl_bind_key_if_unbound_in_map2.4.3 Binding Keys
rl_bind_key_in_map2.4.3 Binding Keys
rl_bind_keyseq2.4.3 Binding Keys
rl_bind_keyseq_if_unbound2.4.3 Binding Keys
rl_bind_keyseq_if_unbound_in_map2.4.3 Binding Keys
rl_bind_keyseq_in_map2.4.3 Binding Keys
rl_binding_keymap2.3 Readline Variables
rl_callback_handler_install2.4.12 Alternate Interface
rl_callback_handler_remove2.4.12 Alternate Interface
rl_callback_read_char2.4.12 Alternate Interface
rl_catch_signals2.5 Readline Signal Handling
rl_catch_sigwinch2.5 Readline Signal Handling
rl_char_is_quoted_p2.6.3 Completion Variables
rl_cleanup_after_signal2.5 Readline Signal Handling
rl_clear_message2.4.6 Redisplay
rl_clear_pending_input2.4.8 Character Input
rl_clear_signals2.5 Readline Signal Handling
rl_complete2.6.1 How Completing Works
rl_complete2.6.2 Completion Functions
rl_complete_internal2.6.2 Completion Functions
rl_completer_quote_characters2.6.3 Completion Variables
rl_completer_word_break_characters2.6.3 Completion Variables
rl_completion_append_character2.6.3 Completion Variables
rl_completion_display_matches_hook2.6.3 Completion Variables
rl_completion_entry_function2.6.1 How Completing Works
rl_completion_entry_function2.6.3 Completion Variables
rl_completion_found_quote2.6.3 Completion Variables
rl_completion_mark_symlink_dirs2.6.3 Completion Variables
rl_completion_matches2.6.2 Completion Functions
rl_completion_mode2.6.2 Completion Functions
rl_completion_query_items2.6.3 Completion Variables
rl_completion_quote_character2.6.3 Completion Variables
rl_completion_suppress_append2.6.3 Completion Variables
rl_completion_suppress_quote2.6.3 Completion Variables
rl_completion_type2.6.3 Completion Variables
rl_completion_word_break_hook2.6.3 Completion Variables
rl_copy_keymap2.4.2 Selecting a Keymap
rl_copy_text2.4.7 Modifying Text
rl_crlf2.4.6 Redisplay
rl_delete_text2.4.7 Modifying Text
rl_deprep_term_function2.3 Readline Variables
rl_deprep_terminal2.4.9 Terminal Management
rl_ding2.4.10 Utility Functions
rl_directory_completion_hook2.6.3 Completion Variables
rl_discard_keymap2.4.2 Selecting a Keymap
rl_dispatching2.3 Readline Variables
rl_display_match_list2.4.10 Utility Functions
rl_do_undo2.4.5 Allowing Undoing
rl_done2.3 Readline Variables
rl_editing_mode2.3 Readline Variables
rl_end2.3 Readline Variables
rl_end_undo_group2.4.5 Allowing Undoing
rl_erase_empty_line2.3 Readline Variables
rl_event_hook2.3 Readline Variables
rl_execute_next2.4.8 Character Input
rl_executing_keymap2.3 Readline Variables
rl_executing_macro2.3 Readline Variables
rl_expand_prompt2.4.6 Redisplay
rl_explicit_arg2.3 Readline Variables
rl_extend_line_buffer2.4.10 Utility Functions
rl_filename_completion_desired2.6.3 Completion Variables
rl_filename_completion_function2.6.2 Completion Functions
rl_filename_dequoting_function2.6.3 Completion Variables
rl_filename_quote_characters2.6.3 Completion Variables
rl_filename_quoting_desired2.6.3 Completion Variables
rl_filename_quoting_function2.6.3 Completion Variables
rl_forced_update_display2.4.6 Redisplay
rl_free_line_state2.5 Readline Signal Handling
rl_free_undo_list2.4.5 Allowing Undoing
rl_function_dumper2.4.4 Associating Function Names and Bindings
rl_function_of_keyseq2.4.4 Associating Function Names and Bindings
rl_funmap_names2.4.4 Associating Function Names and Bindings
rl_generic_bind2.4.3 Binding Keys
rl_get_keymap2.4.2 Selecting a Keymap
rl_get_keymap_by_name2.4.2 Selecting a Keymap
rl_get_keymap_name2.4.2 Selecting a Keymap
rl_get_screen_size2.5 Readline Signal Handling
rl_get_termcap2.4.11 Miscellaneous Functions
rl_getc2.4.8 Character Input
rl_getc_function2.3 Readline Variables
rl_gnu_readline_p2.3 Readline Variables
rl_ignore_completion_duplicates2.6.3 Completion Variables
rl_ignore_some_completions_function2.6.3 Completion Variables
rl_inhibit_completion2.6.3 Completion Variables
rl_initialize2.4.10 Utility Functions
rl_insert_completions2.6.2 Completion Functions
rl_insert_text2.4.7 Modifying Text
rl_instream2.3 Readline Variables
rl_invoking_keyseqs2.4.4 Associating Function Names and Bindings
rl_invoking_keyseqs_in_map2.4.4 Associating Function Names and Bindings
rl_kill_text2.4.7 Modifying Text
rl_last_func2.3 Readline Variables
rl_library_version2.3 Readline Variables
rl_line_buffer2.3 Readline Variables
rl_list_funmap_names2.4.4 Associating Function Names and Bindings
rl_macro_bind2.4.11 Miscellaneous Functions
rl_macro_dumper2.4.11 Miscellaneous Functions
rl_make_bare_keymap2.4.2 Selecting a Keymap
rl_make_keymap2.4.2 Selecting a Keymap
rl_mark2.3 Readline Variables
rl_message2.4.6 Redisplay
rl_modifying2.4.5 Allowing Undoing
rl_named_function2.4.4 Associating Function Names and Bindings
rl_num_chars_to_read2.3 Readline Variables
rl_numeric_arg2.3 Readline Variables
rl_on_new_line2.4.6 Redisplay
rl_on_new_line_with_prompt2.4.6 Redisplay
rl_outstream2.3 Readline Variables
rl_parse_and_bind2.4.3 Binding Keys
rl_pending_input2.3 Readline Variables
rl_point2.3 Readline Variables
rl_possible_completions2.6.2 Completion Functions
rl_pre_input_hook2.3 Readline Variables
rl_prep_term_function2.3 Readline Variables
rl_prep_terminal2.4.9 Terminal Management
rl_prompt2.3 Readline Variables
rl_push_macro_input2.4.7 Modifying Text
rl_read_init_file2.4.3 Binding Keys
rl_read_key2.4.8 Character Input
rl_readline_name2.3 Readline Variables
rl_readline_state2.3 Readline Variables
rl_readline_version2.3 Readline Variables
rl_redisplay2.4.6 Redisplay
rl_redisplay_function2.3 Readline Variables
rl_replace_line2.4.10 Utility Functions
rl_reset_after_signal2.5 Readline Signal Handling
rl_reset_line_state2.4.6 Redisplay
rl_reset_terminal2.4.9 Terminal Management
rl_resize_terminal2.5 Readline Signal Handling
rl_restore_prompt2.4.6 Redisplay
rl_save_prompt2.4.6 Redisplay
rl_set_key2.4.3 Binding Keys
rl_set_keyboard_input_timeout2.4.8 Character Input
rl_set_keymap2.4.2 Selecting a Keymap
rl_set_paren_blink_timeout2.4.11 Miscellaneous Functions
rl_set_prompt2.4.6 Redisplay
rl_set_screen_size2.5 Readline Signal Handling
rl_set_signals2.5 Readline Signal Handling
rl_show_char2.4.6 Redisplay
rl_special_prefixes2.6.3 Completion Variables
rl_startup_hook2.3 Readline Variables
rl_stuff_char2.4.8 Character Input
rl_terminal_name2.3 Readline Variables
rl_tty_set_default_bindings2.4.9 Terminal Management
rl_tty_unset_default_bindings2.4.9 Terminal Management
rl_unbind_command_in_map2.4.3 Binding Keys
rl_unbind_function_in_map2.4.3 Binding Keys
rl_unbind_key2.4.3 Binding Keys
rl_unbind_key_in_map2.4.3 Binding Keys
rl_username_completion_function2.6.2 Completion Functions
rl_variable_bind2.4.11 Miscellaneous Functions
rl_variable_dumper2.4.11 Miscellaneous Functions

S
self-insert (a, b, A, 1, !, <small>...</small>)1.4.3 Commands For Changing Text
self-insert (a, b, A, 1, !, <small>...</small>)1.4.3 Commands For Changing Text
set-mark (C-@)1.4.8 Some Miscellaneous Commands
set-mark (C-@)1.4.8 Some Miscellaneous Commands
show-all-if-ambiguous1.3.1 Readline Init File Syntax
show-all-if-unmodified1.3.1 Readline Init File Syntax
start-kbd-macro (C-x ()1.4.7 Keyboard Macros
start-kbd-macro (C-x ()1.4.7 Keyboard Macros

T
tab-insert (M-TAB)1.4.3 Commands For Changing Text
tab-insert (M-TAB)1.4.3 Commands For Changing Text
tilde-expand (M-~)1.4.8 Some Miscellaneous Commands
tilde-expand (M-~)1.4.8 Some Miscellaneous Commands
transpose-chars (C-t)1.4.3 Commands For Changing Text
transpose-chars (C-t)1.4.3 Commands For Changing Text
transpose-words (M-t)1.4.3 Commands For Changing Text
transpose-words (M-t)1.4.3 Commands For Changing Text

U
undo (C-_ or C-x C-u)1.4.8 Some Miscellaneous Commands
undo (C-_ or C-x C-u)1.4.8 Some Miscellaneous Commands
universal-argument ()1.4.5 Specifying Numeric Arguments
universal-argument ()1.4.5 Specifying Numeric Arguments
unix-filename-rubout ()1.4.4 Killing And Yanking
unix-filename-rubout ()1.4.4 Killing And Yanking
unix-line-discard (C-u)1.4.4 Killing And Yanking
unix-line-discard (C-u)1.4.4 Killing And Yanking
unix-word-rubout (C-w)1.4.4 Killing And Yanking
unix-word-rubout (C-w)1.4.4 Killing And Yanking
upcase-word (M-u)1.4.3 Commands For Changing Text
upcase-word (M-u)1.4.3 Commands For Changing Text

V
vi-editing-mode (M-C-j)1.4.8 Some Miscellaneous Commands
vi-editing-mode (M-C-j)1.4.8 Some Miscellaneous Commands
visible-stats1.3.1 Readline Init File Syntax

Y
yank (C-y)1.4.4 Killing And Yanking
yank (C-y)1.4.4 Killing And Yanking
yank-last-arg (M-. or M-_)1.4.2 Commands For Manipulating The History
yank-last-arg (M-. or M-_)1.4.2 Commands For Manipulating The History
yank-nth-arg (M-C-y)1.4.2 Commands For Manipulating The History
yank-nth-arg (M-C-y)1.4.2 Commands For Manipulating The History
yank-pop (M-y)1.4.4 Killing And Yanking
yank-pop (M-y)1.4.4 Killing And Yanking

Jump to:   _ -   -
-A -   -B -   -C -   -D -   -E -   -F -   -H -   -I -   -K -   -M -   -N -   -O -   -P -   -Q -   -R -   -S -   -T -   -U -   -V -   -Y -   -

- -


- - - - - - -
[Top][Contents][Index][ ? ]
-

Table of Contents

- -
- - - - - - -
[Top][Contents][Index][ ? ]
-

Short Table of Contents

-
-1. Command Line Editing -
-2. Programming with GNU Readline -
-A. Copying This Manual -
-Concept Index -
-Function and Variable Index -
- -
-
- - - - - - -
[Top][Contents][Index][ ? ]
-

About this document

-This document was generated by Chet Ramey on July, 27 2004 -using texi2html -

-The buttons in the navigation panels have the following meaning: -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Button Name Go to From 1.2.3 go to
- [ < ] -Back - -previous section in reading order - -1.2.2 -
- [ > ] -Forward - -next section in reading order - -1.2.4 -
- [ << ] -FastBack - -previous or up-and-previous section - -1.1 -
- [ Up ] -Up - -up section - -1.2 -
- [ >> ] -FastForward - -next or up-and-next section - -1.3 -
- [Top] -Top - -cover (top) of document - -   -
- [Contents] -Contents - -table of contents - -   -
- [Index] -Index - -concept index - -   -
- [ ? ] -About - -this page - -   -
-

-where the Example assumes that the current position -is at Subsubsection One-Two-Three of a document of -the following structure: -
    -
  • 1. Section One
  • -
      -
    • 1.1 Subsection One-One
    • -
        -
      • ...
      • -
      -
    • 1.2 Subsection One-Two
    • -
        -
      • 1.2.1 Subsubsection One-Two-One -
      • 1.2.2 Subsubsection One-Two-Two -
      • 1.2.3 Subsubsection One-Two-Three     -<== Current Position -
      • 1.2.4 Subsubsection One-Two-Four -
      -
    • 1.3 Subsection One-Three
    • -
        -
      • ...
      • -
      -
    • 1.4 Subsection One-Four
    • -
    -
- -
-
- -This document was generated -by Chet Ramey on July, 27 2004 -using texi2html - - - diff --git a/dep/src/readline/src/doc/readline.info b/dep/src/readline/src/doc/readline.info deleted file mode 100644 index c07a0cab03a..00000000000 --- a/dep/src/readline/src/doc/readline.info +++ /dev/null @@ -1,4209 +0,0 @@ -This is readline.info, produced by makeinfo version 4.5 from -/usr/homes/chet/src/bash/readline-src/doc/rlman.texi. - -This manual describes the GNU Readline Library (version 5.0, 28 January -2004), a library which aids in the consistency of user interface across -discrete programs which provide a command line interface. - - Copyright (C) 1988-2004 Free Software Foundation, Inc. - - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - - Permission is granted to copy, distribute and/or modify this - document under the terms of the GNU Free Documentation License, - Version 1.1 or any later version published by the Free Software - Foundation; with no Invariant Sections, with the Front-Cover texts - being "A GNU Manual," and with the Back-Cover Texts as in (a) - below. A copy of the license is included in the section entitled - "GNU Free Documentation License." - - (a) The FSF's Back-Cover Text is: "You have freedom to copy and - modify this GNU Manual, like GNU software. Copies published by - the Free Software Foundation raise funds for GNU development." - -INFO-DIR-SECTION Libraries -START-INFO-DIR-ENTRY -* Readline: (readline). The GNU readline library API. -END-INFO-DIR-ENTRY - - -File: readline.info, Node: Top, Next: Command Line Editing, Up: (dir) - -GNU Readline Library -******************** - - This document describes the GNU Readline Library, a utility which -aids in the consistency of user interface across discrete programs which -provide a command line interface. - -* Menu: - -* Command Line Editing:: GNU Readline User's Manual. -* Programming with GNU Readline:: GNU Readline Programmer's Manual. -* Copying This Manual:: Copying this manual. -* Concept Index:: Index of concepts described in this manual. -* Function and Variable Index:: Index of externally visible functions - and variables. - - -File: readline.info, Node: Command Line Editing, Next: Programming with GNU Readline, Prev: Top, Up: Top - -Command Line Editing -******************** - - This chapter describes the basic features of the GNU command line -editing interface. - -* Menu: - -* Introduction and Notation:: Notation used in this text. -* Readline Interaction:: The minimum set of commands for editing a line. -* Readline Init File:: Customizing Readline from a user's view. -* Bindable Readline Commands:: A description of most of the Readline commands - available for binding -* Readline vi Mode:: A short description of how to make Readline - behave like the vi editor. - - -File: readline.info, Node: Introduction and Notation, Next: Readline Interaction, Up: Command Line Editing - -Introduction to Line Editing -============================ - - The following paragraphs describe the notation used to represent -keystrokes. - - The text `C-k' is read as `Control-K' and describes the character -produced when the key is pressed while the Control key is depressed. - - The text `M-k' is read as `Meta-K' and describes the character -produced when the Meta key (if you have one) is depressed, and the -key is pressed. The Meta key is labeled on many keyboards. On -keyboards with two keys labeled (usually to either side of the -space bar), the on the left side is generally set to work as a -Meta key. The key on the right may also be configured to work as -a Meta key or may be configured as some other modifier, such as a -Compose key for typing accented characters. - - If you do not have a Meta or key, or another key working as a -Meta key, the identical keystroke can be generated by typing -_first_, and then typing . Either process is known as "metafying" -the key. - - The text `M-C-k' is read as `Meta-Control-k' and describes the -character produced by "metafying" `C-k'. - - In addition, several keys have their own names. Specifically, -, , , , , and all stand for themselves -when seen in this text, or in an init file (*note Readline Init File::). -If your keyboard lacks a key, typing will produce the -desired character. The key may be labeled or on -some keyboards. - - -File: readline.info, Node: Readline Interaction, Next: Readline Init File, Prev: Introduction and Notation, Up: Command Line Editing - -Readline Interaction -==================== - - Often during an interactive session you type in a long line of text, -only to notice that the first word on the line is misspelled. The -Readline library gives you a set of commands for manipulating the text -as you type it in, allowing you to just fix your typo, and not forcing -you to retype the majority of the line. Using these editing commands, -you move the cursor to the place that needs correction, and delete or -insert the text of the corrections. Then, when you are satisfied with -the line, you simply press . You do not have to be at the end of -the line to press ; the entire line is accepted regardless of the -location of the cursor within the line. - -* Menu: - -* Readline Bare Essentials:: The least you need to know about Readline. -* Readline Movement Commands:: Moving about the input line. -* Readline Killing Commands:: How to delete text, and how to get it back! -* Readline Arguments:: Giving numeric arguments to commands. -* Searching:: Searching through previous lines. - - -File: readline.info, Node: Readline Bare Essentials, Next: Readline Movement Commands, Up: Readline Interaction - -Readline Bare Essentials ------------------------- - - In order to enter characters into the line, simply type them. The -typed character appears where the cursor was, and then the cursor moves -one space to the right. If you mistype a character, you can use your -erase character to back up and delete the mistyped character. - - Sometimes you may mistype a character, and not notice the error -until you have typed several other characters. In that case, you can -type `C-b' to move the cursor to the left, and then correct your -mistake. Afterwards, you can move the cursor to the right with `C-f'. - - When you add text in the middle of a line, you will notice that -characters to the right of the cursor are `pushed over' to make room -for the text that you have inserted. Likewise, when you delete text -behind the cursor, characters to the right of the cursor are `pulled -back' to fill in the blank space created by the removal of the text. A -list of the bare essentials for editing the text of an input line -follows. - -`C-b' - Move back one character. - -`C-f' - Move forward one character. - - or - Delete the character to the left of the cursor. - -`C-d' - Delete the character underneath the cursor. - -Printing characters - Insert the character into the line at the cursor. - -`C-_' or `C-x C-u' - Undo the last editing command. You can undo all the way back to an - empty line. - -(Depending on your configuration, the key be set to delete -the character to the left of the cursor and the key set to delete -the character underneath the cursor, like `C-d', rather than the -character to the left of the cursor.) - - -File: readline.info, Node: Readline Movement Commands, Next: Readline Killing Commands, Prev: Readline Bare Essentials, Up: Readline Interaction - -Readline Movement Commands --------------------------- - - The above table describes the most basic keystrokes that you need in -order to do editing of the input line. For your convenience, many -other commands have been added in addition to `C-b', `C-f', `C-d', and -. Here are some commands for moving more rapidly about the line. - -`C-a' - Move to the start of the line. - -`C-e' - Move to the end of the line. - -`M-f' - Move forward a word, where a word is composed of letters and - digits. - -`M-b' - Move backward a word. - -`C-l' - Clear the screen, reprinting the current line at the top. - - Notice how `C-f' moves forward a character, while `M-f' moves -forward a word. It is a loose convention that control keystrokes -operate on characters while meta keystrokes operate on words. - - -File: readline.info, Node: Readline Killing Commands, Next: Readline Arguments, Prev: Readline Movement Commands, Up: Readline Interaction - -Readline Killing Commands -------------------------- - - "Killing" text means to delete the text from the line, but to save -it away for later use, usually by "yanking" (re-inserting) it back into -the line. (`Cut' and `paste' are more recent jargon for `kill' and -`yank'.) - - If the description for a command says that it `kills' text, then you -can be sure that you can get the text back in a different (or the same) -place later. - - When you use a kill command, the text is saved in a "kill-ring". -Any number of consecutive kills save all of the killed text together, so -that when you yank it back, you get it all. The kill ring is not line -specific; the text that you killed on a previously typed line is -available to be yanked back later, when you are typing another line. - - Here is the list of commands for killing text. - -`C-k' - Kill the text from the current cursor position to the end of the - line. - -`M-d' - Kill from the cursor to the end of the current word, or, if between - words, to the end of the next word. Word boundaries are the same - as those used by `M-f'. - -`M-' - Kill from the cursor the start of the current word, or, if between - words, to the start of the previous word. Word boundaries are the - same as those used by `M-b'. - -`C-w' - Kill from the cursor to the previous whitespace. This is - different than `M-' because the word boundaries differ. - - - Here is how to "yank" the text back into the line. Yanking means to -copy the most-recently-killed text from the kill buffer. - -`C-y' - Yank the most recently killed text back into the buffer at the - cursor. - -`M-y' - Rotate the kill-ring, and yank the new top. You can only do this - if the prior command is `C-y' or `M-y'. - - -File: readline.info, Node: Readline Arguments, Next: Searching, Prev: Readline Killing Commands, Up: Readline Interaction - -Readline Arguments ------------------- - - You can pass numeric arguments to Readline commands. Sometimes the -argument acts as a repeat count, other times it is the sign of the -argument that is significant. If you pass a negative argument to a -command which normally acts in a forward direction, that command will -act in a backward direction. For example, to kill text back to the -start of the line, you might type `M-- C-k'. - - The general way to pass numeric arguments to a command is to type -meta digits before the command. If the first `digit' typed is a minus -sign (`-'), then the sign of the argument will be negative. Once you -have typed one meta digit to get the argument started, you can type the -remainder of the digits, and then the command. For example, to give -the `C-d' command an argument of 10, you could type `M-1 0 C-d', which -will delete the next ten characters on the input line. - - -File: readline.info, Node: Searching, Prev: Readline Arguments, Up: Readline Interaction - -Searching for Commands in the History -------------------------------------- - - Readline provides commands for searching through the command history -for lines containing a specified string. There are two search modes: -"incremental" and "non-incremental". - - Incremental searches begin before the user has finished typing the -search string. As each character of the search string is typed, -Readline displays the next entry from the history matching the string -typed so far. An incremental search requires only as many characters -as needed to find the desired history entry. To search backward in the -history for a particular string, type `C-r'. Typing `C-s' searches -forward through the history. The characters present in the value of -the `isearch-terminators' variable are used to terminate an incremental -search. If that variable has not been assigned a value, the and -`C-J' characters will terminate an incremental search. `C-g' will -abort an incremental search and restore the original line. When the -search is terminated, the history entry containing the search string -becomes the current line. - - To find other matching entries in the history list, type `C-r' or -`C-s' as appropriate. This will search backward or forward in the -history for the next entry matching the search string typed so far. -Any other key sequence bound to a Readline command will terminate the -search and execute that command. For instance, a will terminate -the search and accept the line, thereby executing the command from the -history list. A movement command will terminate the search, make the -last line found the current line, and begin editing. - - Readline remembers the last incremental search string. If two -`C-r's are typed without any intervening characters defining a new -search string, any remembered search string is used. - - Non-incremental searches read the entire search string before -starting to search for matching history lines. The search string may be -typed by the user or be part of the contents of the current line. - - -File: readline.info, Node: Readline Init File, Next: Bindable Readline Commands, Prev: Readline Interaction, Up: Command Line Editing - -Readline Init File -================== - - Although the Readline library comes with a set of Emacs-like -keybindings installed by default, it is possible to use a different set -of keybindings. Any user can customize programs that use Readline by -putting commands in an "inputrc" file, conventionally in his home -directory. The name of this file is taken from the value of the -environment variable `INPUTRC'. If that variable is unset, the default -is `~/.inputrc'. - - When a program which uses the Readline library starts up, the init -file is read, and the key bindings are set. - - In addition, the `C-x C-r' command re-reads this init file, thus -incorporating any changes that you might have made to it. - -* Menu: - -* Readline Init File Syntax:: Syntax for the commands in the inputrc file. - -* Conditional Init Constructs:: Conditional key bindings in the inputrc file. - -* Sample Init File:: An example inputrc file. - - -File: readline.info, Node: Readline Init File Syntax, Next: Conditional Init Constructs, Up: Readline Init File - -Readline Init File Syntax -------------------------- - - There are only a few basic constructs allowed in the Readline init -file. Blank lines are ignored. Lines beginning with a `#' are -comments. Lines beginning with a `$' indicate conditional constructs -(*note Conditional Init Constructs::). Other lines denote variable -settings and key bindings. - -Variable Settings - You can modify the run-time behavior of Readline by altering the - values of variables in Readline using the `set' command within the - init file. The syntax is simple: - - set VARIABLE VALUE - - Here, for example, is how to change from the default Emacs-like - key binding to use `vi' line editing commands: - - set editing-mode vi - - Variable names and values, where appropriate, are recognized - without regard to case. - - A great deal of run-time behavior is changeable with the following - variables. - - `bell-style' - Controls what happens when Readline wants to ring the - terminal bell. If set to `none', Readline never rings the - bell. If set to `visible', Readline uses a visible bell if - one is available. If set to `audible' (the default), - Readline attempts to ring the terminal's bell. - - `comment-begin' - The string to insert at the beginning of the line when the - `insert-comment' command is executed. The default value is - `"#"'. - - `completion-ignore-case' - If set to `on', Readline performs filename matching and - completion in a case-insensitive fashion. The default value - is `off'. - - `completion-query-items' - The number of possible completions that determines when the - user is asked whether the list of possibilities should be - displayed. If the number of possible completions is greater - than this value, Readline will ask the user whether or not he - wishes to view them; otherwise, they are simply listed. This - variable must be set to an integer value greater than or - equal to 0. The default limit is `100'. - - `convert-meta' - If set to `on', Readline will convert characters with the - eighth bit set to an ASCII key sequence by stripping the - eighth bit and prefixing an character, converting them - to a meta-prefixed key sequence. The default value is `on'. - - `disable-completion' - If set to `On', Readline will inhibit word completion. - Completion characters will be inserted into the line as if - they had been mapped to `self-insert'. The default is `off'. - - `editing-mode' - The `editing-mode' variable controls which default set of key - bindings is used. By default, Readline starts up in Emacs - editing mode, where the keystrokes are most similar to Emacs. - This variable can be set to either `emacs' or `vi'. - - `enable-keypad' - When set to `on', Readline will try to enable the application - keypad when it is called. Some systems need this to enable - the arrow keys. The default is `off'. - - `expand-tilde' - If set to `on', tilde expansion is performed when Readline - attempts word completion. The default is `off'. - - If set to `on', the history code attempts to place point at - the same location on each history line retrieved with - `previous-history' or `next-history'. - - `horizontal-scroll-mode' - This variable can be set to either `on' or `off'. Setting it - to `on' means that the text of the lines being edited will - scroll horizontally on a single screen line when they are - longer than the width of the screen, instead of wrapping onto - a new screen line. By default, this variable is set to `off'. - - `input-meta' - If set to `on', Readline will enable eight-bit input (it will - not clear the eighth bit in the characters it reads), - regardless of what the terminal claims it can support. The - default value is `off'. The name `meta-flag' is a synonym - for this variable. - - `isearch-terminators' - The string of characters that should terminate an incremental - search without subsequently executing the character as a - command (*note Searching::). If this variable has not been - given a value, the characters and `C-J' will terminate - an incremental search. - - `keymap' - Sets Readline's idea of the current keymap for key binding - commands. Acceptable `keymap' names are `emacs', - `emacs-standard', `emacs-meta', `emacs-ctlx', `vi', `vi-move', - `vi-command', and `vi-insert'. `vi' is equivalent to - `vi-command'; `emacs' is equivalent to `emacs-standard'. The - default value is `emacs'. The value of the `editing-mode' - variable also affects the default keymap. - - `mark-directories' - If set to `on', completed directory names have a slash - appended. The default is `on'. - - `mark-modified-lines' - This variable, when set to `on', causes Readline to display an - asterisk (`*') at the start of history lines which have been - modified. This variable is `off' by default. - - `mark-symlinked-directories' - If set to `on', completed names which are symbolic links to - directories have a slash appended (subject to the value of - `mark-directories'). The default is `off'. - - `match-hidden-files' - This variable, when set to `on', causes Readline to match - files whose names begin with a `.' (hidden files) when - performing filename completion, unless the leading `.' is - supplied by the user in the filename to be completed. This - variable is `on' by default. - - `output-meta' - If set to `on', Readline will display characters with the - eighth bit set directly rather than as a meta-prefixed escape - sequence. The default is `off'. - - `page-completions' - If set to `on', Readline uses an internal `more'-like pager - to display a screenful of possible completions at a time. - This variable is `on' by default. - - `print-completions-horizontally' - If set to `on', Readline will display completions with matches - sorted horizontally in alphabetical order, rather than down - the screen. The default is `off'. - - `show-all-if-ambiguous' - This alters the default behavior of the completion functions. - If set to `on', words which have more than one possible - completion cause the matches to be listed immediately instead - of ringing the bell. The default value is `off'. - - `show-all-if-unmodified' - This alters the default behavior of the completion functions - in a fashion similar to SHOW-ALL-IF-AMBIGUOUS. If set to - `on', words which have more than one possible completion - without any possible partial completion (the possible - completions don't share a common prefix) cause the matches to - be listed immediately instead of ringing the bell. The - default value is `off'. - - `visible-stats' - If set to `on', a character denoting a file's type is - appended to the filename when listing possible completions. - The default is `off'. - - -Key Bindings - The syntax for controlling key bindings in the init file is - simple. First you need to find the name of the command that you - want to change. The following sections contain tables of the - command name, the default keybinding, if any, and a short - description of what the command does. - - Once you know the name of the command, simply place on a line in - the init file the name of the key you wish to bind the command to, - a colon, and then the name of the command. The name of the key - can be expressed in different ways, depending on what you find most - comfortable. - - In addition to command names, readline allows keys to be bound to - a string that is inserted when the key is pressed (a MACRO). - - KEYNAME: FUNCTION-NAME or MACRO - KEYNAME is the name of a key spelled out in English. For - example: - Control-u: universal-argument - Meta-Rubout: backward-kill-word - Control-o: "> output" - - In the above example, `C-u' is bound to the function - `universal-argument', `M-DEL' is bound to the function - `backward-kill-word', and `C-o' is bound to run the macro - expressed on the right hand side (that is, to insert the text - `> output' into the line). - - A number of symbolic character names are recognized while - processing this key binding syntax: DEL, ESC, ESCAPE, LFD, - NEWLINE, RET, RETURN, RUBOUT, SPACE, SPC, and TAB. - - "KEYSEQ": FUNCTION-NAME or MACRO - KEYSEQ differs from KEYNAME above in that strings denoting an - entire key sequence can be specified, by placing the key - sequence in double quotes. Some GNU Emacs style key escapes - can be used, as in the following example, but the special - character names are not recognized. - - "\C-u": universal-argument - "\C-x\C-r": re-read-init-file - "\e[11~": "Function Key 1" - - In the above example, `C-u' is again bound to the function - `universal-argument' (just as it was in the first example), - `C-x C-r' is bound to the function `re-read-init-file', and - ` <[> <1> <1> <~>' is bound to insert the text `Function - Key 1'. - - - The following GNU Emacs style escape sequences are available when - specifying key sequences: - - `\C-' - control prefix - - `\M-' - meta prefix - - `\e' - an escape character - - `\\' - backslash - - `\"' - <">, a double quotation mark - - `\'' - <'>, a single quote or apostrophe - - In addition to the GNU Emacs style escape sequences, a second set - of backslash escapes is available: - - `\a' - alert (bell) - - `\b' - backspace - - `\d' - delete - - `\f' - form feed - - `\n' - newline - - `\r' - carriage return - - `\t' - horizontal tab - - `\v' - vertical tab - - `\NNN' - the eight-bit character whose value is the octal value NNN - (one to three digits) - - `\xHH' - the eight-bit character whose value is the hexadecimal value - HH (one or two hex digits) - - When entering the text of a macro, single or double quotes must be - used to indicate a macro definition. Unquoted text is assumed to - be a function name. In the macro body, the backslash escapes - described above are expanded. Backslash will quote any other - character in the macro text, including `"' and `''. For example, - the following binding will make `C-x \' insert a single `\' into - the line: - "\C-x\\": "\\" - - - -File: readline.info, Node: Conditional Init Constructs, Next: Sample Init File, Prev: Readline Init File Syntax, Up: Readline Init File - -Conditional Init Constructs ---------------------------- - - Readline implements a facility similar in spirit to the conditional -compilation features of the C preprocessor which allows key bindings -and variable settings to be performed as the result of tests. There -are four parser directives used. - -`$if' - The `$if' construct allows bindings to be made based on the - editing mode, the terminal being used, or the application using - Readline. The text of the test extends to the end of the line; no - characters are required to isolate it. - - `mode' - The `mode=' form of the `$if' directive is used to test - whether Readline is in `emacs' or `vi' mode. This may be - used in conjunction with the `set keymap' command, for - instance, to set bindings in the `emacs-standard' and - `emacs-ctlx' keymaps only if Readline is starting out in - `emacs' mode. - - `term' - The `term=' form may be used to include terminal-specific key - bindings, perhaps to bind the key sequences output by the - terminal's function keys. The word on the right side of the - `=' is tested against both the full name of the terminal and - the portion of the terminal name before the first `-'. This - allows `sun' to match both `sun' and `sun-cmd', for instance. - - `application' - The APPLICATION construct is used to include - application-specific settings. Each program using the - Readline library sets the APPLICATION NAME, and you can test - for a particular value. This could be used to bind key - sequences to functions useful for a specific program. For - instance, the following command adds a key sequence that - quotes the current or previous word in Bash: - $if Bash - # Quote the current or previous word - "\C-xq": "\eb\"\ef\"" - $endif - -`$endif' - This command, as seen in the previous example, terminates an `$if' - command. - -`$else' - Commands in this branch of the `$if' directive are executed if the - test fails. - -`$include' - This directive takes a single filename as an argument and reads - commands and bindings from that file. For example, the following - directive reads from `/etc/inputrc': - $include /etc/inputrc - - -File: readline.info, Node: Sample Init File, Prev: Conditional Init Constructs, Up: Readline Init File - -Sample Init File ----------------- - - Here is an example of an INPUTRC file. This illustrates key -binding, variable assignment, and conditional syntax. - - - # This file controls the behaviour of line input editing for - # programs that use the GNU Readline library. Existing - # programs include FTP, Bash, and GDB. - # - # You can re-read the inputrc file with C-x C-r. - # Lines beginning with '#' are comments. - # - # First, include any systemwide bindings and variable - # assignments from /etc/Inputrc - $include /etc/Inputrc - - # - # Set various bindings for emacs mode. - - set editing-mode emacs - - $if mode=emacs - - Meta-Control-h: backward-kill-word Text after the function name is ignored - - # - # Arrow keys in keypad mode - # - #"\M-OD": backward-char - #"\M-OC": forward-char - #"\M-OA": previous-history - #"\M-OB": next-history - # - # Arrow keys in ANSI mode - # - "\M-[D": backward-char - "\M-[C": forward-char - "\M-[A": previous-history - "\M-[B": next-history - # - # Arrow keys in 8 bit keypad mode - # - #"\M-\C-OD": backward-char - #"\M-\C-OC": forward-char - #"\M-\C-OA": previous-history - #"\M-\C-OB": next-history - # - # Arrow keys in 8 bit ANSI mode - # - #"\M-\C-[D": backward-char - #"\M-\C-[C": forward-char - #"\M-\C-[A": previous-history - #"\M-\C-[B": next-history - - C-q: quoted-insert - - $endif - - # An old-style binding. This happens to be the default. - TAB: complete - - # Macros that are convenient for shell interaction - $if Bash - # edit the path - "\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f" - # prepare to type a quoted word -- - # insert open and close double quotes - # and move to just after the open quote - "\C-x\"": "\"\"\C-b" - # insert a backslash (testing backslash escapes - # in sequences and macros) - "\C-x\\": "\\" - # Quote the current or previous word - "\C-xq": "\eb\"\ef\"" - # Add a binding to refresh the line, which is unbound - "\C-xr": redraw-current-line - # Edit variable on current line. - "\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y=" - $endif - - # use a visible bell if one is available - set bell-style visible - - # don't strip characters to 7 bits when reading - set input-meta on - - # allow iso-latin1 characters to be inserted rather - # than converted to prefix-meta sequences - set convert-meta off - - # display characters with the eighth bit set directly - # rather than as meta-prefixed characters - set output-meta on - - # if there are more than 150 possible completions for - # a word, ask the user if he wants to see all of them - set completion-query-items 150 - - # For FTP - $if Ftp - "\C-xg": "get \M-?" - "\C-xt": "put \M-?" - "\M-.": yank-last-arg - $endif - - -File: readline.info, Node: Bindable Readline Commands, Next: Readline vi Mode, Prev: Readline Init File, Up: Command Line Editing - -Bindable Readline Commands -========================== - -* Menu: - -* Commands For Moving:: Moving about the line. -* Commands For History:: Getting at previous lines. -* Commands For Text:: Commands for changing text. -* Commands For Killing:: Commands for killing and yanking. -* Numeric Arguments:: Specifying numeric arguments, repeat counts. -* Commands For Completion:: Getting Readline to do the typing for you. -* Keyboard Macros:: Saving and re-executing typed characters -* Miscellaneous Commands:: Other miscellaneous commands. - - This section describes Readline commands that may be bound to key -sequences. Command names without an accompanying key sequence are -unbound by default. - - In the following descriptions, "point" refers to the current cursor -position, and "mark" refers to a cursor position saved by the -`set-mark' command. The text between the point and mark is referred to -as the "region". - - -File: readline.info, Node: Commands For Moving, Next: Commands For History, Up: Bindable Readline Commands - -Commands For Moving -------------------- - -`beginning-of-line (C-a)' - Move to the start of the current line. - -`end-of-line (C-e)' - Move to the end of the line. - -`forward-char (C-f)' - Move forward a character. - -`backward-char (C-b)' - Move back a character. - -`forward-word (M-f)' - Move forward to the end of the next word. Words are composed of - letters and digits. - -`backward-word (M-b)' - Move back to the start of the current or previous word. Words are - composed of letters and digits. - -`clear-screen (C-l)' - Clear the screen and redraw the current line, leaving the current - line at the top of the screen. - -`redraw-current-line ()' - Refresh the current line. By default, this is unbound. - - - -File: readline.info, Node: Commands For History, Next: Commands For Text, Prev: Commands For Moving, Up: Bindable Readline Commands - -Commands For Manipulating The History -------------------------------------- - -`accept-line (Newline or Return)' - Accept the line regardless of where the cursor is. If this line is - non-empty, it may be added to the history list for future recall - with `add_history()'. If this line is a modified history line, - the history line is restored to its original state. - -`previous-history (C-p)' - Move `back' through the history list, fetching the previous - command. - -`next-history (C-n)' - Move `forward' through the history list, fetching the next command. - -`beginning-of-history (M-<)' - Move to the first line in the history. - -`end-of-history (M->)' - Move to the end of the input history, i.e., the line currently - being entered. - -`reverse-search-history (C-r)' - Search backward starting at the current line and moving `up' - through the history as necessary. This is an incremental search. - -`forward-search-history (C-s)' - Search forward starting at the current line and moving `down' - through the the history as necessary. This is an incremental - search. - -`non-incremental-reverse-search-history (M-p)' - Search backward starting at the current line and moving `up' - through the history as necessary using a non-incremental search - for a string supplied by the user. - -`non-incremental-forward-search-history (M-n)' - Search forward starting at the current line and moving `down' - through the the history as necessary using a non-incremental search - for a string supplied by the user. - -`history-search-forward ()' - Search forward through the history for the string of characters - between the start of the current line and the point. This is a - non-incremental search. By default, this command is unbound. - -`history-search-backward ()' - Search backward through the history for the string of characters - between the start of the current line and the point. This is a - non-incremental search. By default, this command is unbound. - -`yank-nth-arg (M-C-y)' - Insert the first argument to the previous command (usually the - second word on the previous line) at point. With an argument N, - insert the Nth word from the previous command (the words in the - previous command begin with word 0). A negative argument inserts - the Nth word from the end of the previous command. - -`yank-last-arg (M-. or M-_)' - Insert last argument to the previous command (the last word of the - previous history entry). With an argument, behave exactly like - `yank-nth-arg'. Successive calls to `yank-last-arg' move back - through the history list, inserting the last argument of each line - in turn. - - - -File: readline.info, Node: Commands For Text, Next: Commands For Killing, Prev: Commands For History, Up: Bindable Readline Commands - -Commands For Changing Text --------------------------- - -`delete-char (C-d)' - Delete the character at point. If point is at the beginning of - the line, there are no characters in the line, and the last - character typed was not bound to `delete-char', then return EOF. - -`backward-delete-char (Rubout)' - Delete the character behind the cursor. A numeric argument means - to kill the characters instead of deleting them. - -`forward-backward-delete-char ()' - Delete the character under the cursor, unless the cursor is at the - end of the line, in which case the character behind the cursor is - deleted. By default, this is not bound to a key. - -`quoted-insert (C-q or C-v)' - Add the next character typed to the line verbatim. This is how to - insert key sequences like `C-q', for example. - -`tab-insert (M-)' - Insert a tab character. - -`self-insert (a, b, A, 1, !, ...)' - Insert yourself. - -`transpose-chars (C-t)' - Drag the character before the cursor forward over the character at - the cursor, moving the cursor forward as well. If the insertion - point is at the end of the line, then this transposes the last two - characters of the line. Negative arguments have no effect. - -`transpose-words (M-t)' - Drag the word before point past the word after point, moving point - past that word as well. If the insertion point is at the end of - the line, this transposes the last two words on the line. - -`upcase-word (M-u)' - Uppercase the current (or following) word. With a negative - argument, uppercase the previous word, but do not move the cursor. - -`downcase-word (M-l)' - Lowercase the current (or following) word. With a negative - argument, lowercase the previous word, but do not move the cursor. - -`capitalize-word (M-c)' - Capitalize the current (or following) word. With a negative - argument, capitalize the previous word, but do not move the cursor. - -`overwrite-mode ()' - Toggle overwrite mode. With an explicit positive numeric argument, - switches to overwrite mode. With an explicit non-positive numeric - argument, switches to insert mode. This command affects only - `emacs' mode; `vi' mode does overwrite differently. Each call to - `readline()' starts in insert mode. - - In overwrite mode, characters bound to `self-insert' replace the - text at point rather than pushing the text to the right. - Characters bound to `backward-delete-char' replace the character - before point with a space. - - By default, this command is unbound. - - - -File: readline.info, Node: Commands For Killing, Next: Numeric Arguments, Prev: Commands For Text, Up: Bindable Readline Commands - -Killing And Yanking -------------------- - -`kill-line (C-k)' - Kill the text from point to the end of the line. - -`backward-kill-line (C-x Rubout)' - Kill backward to the beginning of the line. - -`unix-line-discard (C-u)' - Kill backward from the cursor to the beginning of the current line. - -`kill-whole-line ()' - Kill all characters on the current line, no matter where point is. - By default, this is unbound. - -`kill-word (M-d)' - Kill from point to the end of the current word, or if between - words, to the end of the next word. Word boundaries are the same - as `forward-word'. - -`backward-kill-word (M-)' - Kill the word behind point. Word boundaries are the same as - `backward-word'. - -`unix-word-rubout (C-w)' - Kill the word behind point, using white space as a word boundary. - The killed text is saved on the kill-ring. - -`unix-filename-rubout ()' - Kill the word behind point, using white space and the slash - character as the word boundaries. The killed text is saved on the - kill-ring. - -`delete-horizontal-space ()' - Delete all spaces and tabs around point. By default, this is - unbound. - -`kill-region ()' - Kill the text in the current region. By default, this command is - unbound. - -`copy-region-as-kill ()' - Copy the text in the region to the kill buffer, so it can be yanked - right away. By default, this command is unbound. - -`copy-backward-word ()' - Copy the word before point to the kill buffer. The word - boundaries are the same as `backward-word'. By default, this - command is unbound. - -`copy-forward-word ()' - Copy the word following point to the kill buffer. The word - boundaries are the same as `forward-word'. By default, this - command is unbound. - -`yank (C-y)' - Yank the top of the kill ring into the buffer at point. - -`yank-pop (M-y)' - Rotate the kill-ring, and yank the new top. You can only do this - if the prior command is `yank' or `yank-pop'. - - -File: readline.info, Node: Numeric Arguments, Next: Commands For Completion, Prev: Commands For Killing, Up: Bindable Readline Commands - -Specifying Numeric Arguments ----------------------------- - -`digit-argument (M-0, M-1, ... M--)' - Add this digit to the argument already accumulating, or start a new - argument. `M--' starts a negative argument. - -`universal-argument ()' - This is another way to specify an argument. If this command is - followed by one or more digits, optionally with a leading minus - sign, those digits define the argument. If the command is - followed by digits, executing `universal-argument' again ends the - numeric argument, but is otherwise ignored. As a special case, if - this command is immediately followed by a character that is - neither a digit or minus sign, the argument count for the next - command is multiplied by four. The argument count is initially - one, so executing this function the first time makes the argument - count four, a second time makes the argument count sixteen, and so - on. By default, this is not bound to a key. - - -File: readline.info, Node: Commands For Completion, Next: Keyboard Macros, Prev: Numeric Arguments, Up: Bindable Readline Commands - -Letting Readline Type For You ------------------------------ - -`complete ()' - Attempt to perform completion on the text before point. The - actual completion performed is application-specific. The default - is filename completion. - -`possible-completions (M-?)' - List the possible completions of the text before point. - -`insert-completions (M-*)' - Insert all completions of the text before point that would have - been generated by `possible-completions'. - -`menu-complete ()' - Similar to `complete', but replaces the word to be completed with - a single match from the list of possible completions. Repeated - execution of `menu-complete' steps through the list of possible - completions, inserting each match in turn. At the end of the list - of completions, the bell is rung (subject to the setting of - `bell-style') and the original text is restored. An argument of N - moves N positions forward in the list of matches; a negative - argument may be used to move backward through the list. This - command is intended to be bound to , but is unbound by - default. - -`delete-char-or-list ()' - Deletes the character under the cursor if not at the beginning or - end of the line (like `delete-char'). If at the end of the line, - behaves identically to `possible-completions'. This command is - unbound by default. - - - -File: readline.info, Node: Keyboard Macros, Next: Miscellaneous Commands, Prev: Commands For Completion, Up: Bindable Readline Commands - -Keyboard Macros ---------------- - -`start-kbd-macro (C-x ()' - Begin saving the characters typed into the current keyboard macro. - -`end-kbd-macro (C-x ))' - Stop saving the characters typed into the current keyboard macro - and save the definition. - -`call-last-kbd-macro (C-x e)' - Re-execute the last keyboard macro defined, by making the - characters in the macro appear as if typed at the keyboard. - - - -File: readline.info, Node: Miscellaneous Commands, Prev: Keyboard Macros, Up: Bindable Readline Commands - -Some Miscellaneous Commands ---------------------------- - -`re-read-init-file (C-x C-r)' - Read in the contents of the INPUTRC file, and incorporate any - bindings or variable assignments found there. - -`abort (C-g)' - Abort the current editing command and ring the terminal's bell - (subject to the setting of `bell-style'). - -`do-uppercase-version (M-a, M-b, M-X, ...)' - If the metafied character X is lowercase, run the command that is - bound to the corresponding uppercase character. - -`prefix-meta ()' - Metafy the next character typed. This is for keyboards without a - meta key. Typing ` f' is equivalent to typing `M-f'. - -`undo (C-_ or C-x C-u)' - Incremental undo, separately remembered for each line. - -`revert-line (M-r)' - Undo all changes made to this line. This is like executing the - `undo' command enough times to get back to the beginning. - -`tilde-expand (M-~)' - Perform tilde expansion on the current word. - -`set-mark (C-@)' - Set the mark to the point. If a numeric argument is supplied, the - mark is set to that position. - -`exchange-point-and-mark (C-x C-x)' - Swap the point with the mark. The current cursor position is set - to the saved position, and the old cursor position is saved as the - mark. - -`character-search (C-])' - A character is read and point is moved to the next occurrence of - that character. A negative count searches for previous - occurrences. - -`character-search-backward (M-C-])' - A character is read and point is moved to the previous occurrence - of that character. A negative count searches for subsequent - occurrences. - -`insert-comment (M-#)' - Without a numeric argument, the value of the `comment-begin' - variable is inserted at the beginning of the current line. If a - numeric argument is supplied, this command acts as a toggle: if - the characters at the beginning of the line do not match the value - of `comment-begin', the value is inserted, otherwise the - characters in `comment-begin' are deleted from the beginning of - the line. In either case, the line is accepted as if a newline - had been typed. - -`dump-functions ()' - Print all of the functions and their key bindings to the Readline - output stream. If a numeric argument is supplied, the output is - formatted in such a way that it can be made part of an INPUTRC - file. This command is unbound by default. - -`dump-variables ()' - Print all of the settable variables and their values to the - Readline output stream. If a numeric argument is supplied, the - output is formatted in such a way that it can be made part of an - INPUTRC file. This command is unbound by default. - -`dump-macros ()' - Print all of the Readline key sequences bound to macros and the - strings they output. If a numeric argument is supplied, the - output is formatted in such a way that it can be made part of an - INPUTRC file. This command is unbound by default. - -`emacs-editing-mode (C-e)' - When in `vi' command mode, this causes a switch to `emacs' editing - mode. - -`vi-editing-mode (M-C-j)' - When in `emacs' editing mode, this causes a switch to `vi' editing - mode. - - - -File: readline.info, Node: Readline vi Mode, Prev: Bindable Readline Commands, Up: Command Line Editing - -Readline vi Mode -================ - - While the Readline library does not have a full set of `vi' editing -functions, it does contain enough to allow simple editing of the line. -The Readline `vi' mode behaves as specified in the POSIX 1003.2 -standard. - - In order to switch interactively between `emacs' and `vi' editing -modes, use the command `M-C-j' (bound to emacs-editing-mode when in -`vi' mode and to vi-editing-mode in `emacs' mode). The Readline -default is `emacs' mode. - - When you enter a line in `vi' mode, you are already placed in -`insertion' mode, as if you had typed an `i'. Pressing switches -you into `command' mode, where you can edit the text of the line with -the standard `vi' movement keys, move to previous history lines with -`k' and subsequent lines with `j', and so forth. - - This document describes the GNU Readline Library, a utility for -aiding in the consitency of user interface across discrete programs -that need to provide a command line interface. - - Copyright (C) 1988-2004 Free Software Foundation, Inc. - - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice pare -preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be stated in a -translation approved by the Foundation. - - -File: readline.info, Node: Programming with GNU Readline, Next: Copying This Manual, Prev: Command Line Editing, Up: Top - -Programming with GNU Readline -***************************** - - This chapter describes the interface between the GNU Readline -Library and other programs. If you are a programmer, and you wish to -include the features found in GNU Readline such as completion, line -editing, and interactive history manipulation in your own programs, -this section is for you. - -* Menu: - -* Basic Behavior:: Using the default behavior of Readline. -* Custom Functions:: Adding your own functions to Readline. -* Readline Variables:: Variables accessible to custom - functions. -* Readline Convenience Functions:: Functions which Readline supplies to - aid in writing your own custom - functions. -* Readline Signal Handling:: How Readline behaves when it receives signals. -* Custom Completers:: Supplanting or supplementing Readline's - completion functions. - - -File: readline.info, Node: Basic Behavior, Next: Custom Functions, Up: Programming with GNU Readline - -Basic Behavior -============== - - Many programs provide a command line interface, such as `mail', -`ftp', and `sh'. For such programs, the default behaviour of Readline -is sufficient. This section describes how to use Readline in the -simplest way possible, perhaps to replace calls in your code to -`gets()' or `fgets()'. - - The function `readline()' prints a prompt PROMPT and then reads and -returns a single line of text from the user. If PROMPT is `NULL' or -the empty string, no prompt is displayed. The line `readline' returns -is allocated with `malloc()'; the caller should `free()' the line when -it has finished with it. The declaration for `readline' in ANSI C is - - `char *readline (const char *PROMPT);' - -So, one might say - `char *line = readline ("Enter a line: ");' - -in order to read a line of text from the user. The line returned has -the final newline removed, so only the text remains. - - If `readline' encounters an `EOF' while reading the line, and the -line is empty at that point, then `(char *)NULL' is returned. -Otherwise, the line is ended just as if a newline had been typed. - - If you want the user to be able to get at the line later, (with - for example), you must call `add_history()' to save the line away -in a "history" list of such lines. - - `add_history (line)'; - -For full details on the GNU History Library, see the associated manual. - - It is preferable to avoid saving empty lines on the history list, -since users rarely have a burning need to reuse a blank line. Here is -a function which usefully replaces the standard `gets()' library -function, and has the advantage of no static buffer to overflow: - - /* A static variable for holding the line. */ - static char *line_read = (char *)NULL; - - /* Read a string, and return a pointer to it. - Returns NULL on EOF. */ - char * - rl_gets () - { - /* If the buffer has already been allocated, - return the memory to the free pool. */ - if (line_read) - { - free (line_read); - line_read = (char *)NULL; - } - - /* Get a line from the user. */ - line_read = readline (""); - - /* If the line has any text in it, - save it on the history. */ - if (line_read && *line_read) - add_history (line_read); - - return (line_read); - } - - This function gives the user the default behaviour of -completion: completion on file names. If you do not want Readline to -complete on filenames, you can change the binding of the key with -`rl_bind_key()'. - - `int rl_bind_key (int KEY, rl_command_func_t *FUNCTION);' - - `rl_bind_key()' takes two arguments: KEY is the character that you -want to bind, and FUNCTION is the address of the function to call when -KEY is pressed. Binding to `rl_insert()' makes insert -itself. `rl_bind_key()' returns non-zero if KEY is not a valid ASCII -character code (between 0 and 255). - - Thus, to disable the default behavior, the following suffices: - `rl_bind_key ('\t', rl_insert);' - - This code should be executed once at the start of your program; you -might write a function called `initialize_readline()' which performs -this and other desired initializations, such as installing custom -completers (*note Custom Completers::). - - -File: readline.info, Node: Custom Functions, Next: Readline Variables, Prev: Basic Behavior, Up: Programming with GNU Readline - -Custom Functions -================ - - Readline provides many functions for manipulating the text of the -line, but it isn't possible to anticipate the needs of all programs. -This section describes the various functions and variables defined -within the Readline library which allow a user program to add -customized functionality to Readline. - - Before declaring any functions that customize Readline's behavior, or -using any functionality Readline provides in other code, an application -writer should include the file `' in any file that -uses Readline's features. Since some of the definitions in -`readline.h' use the `stdio' library, the file `' should be -included before `readline.h'. - - `readline.h' defines a C preprocessor variable that should be -treated as an integer, `RL_READLINE_VERSION', which may be used to -conditionally compile application code depending on the installed -Readline version. The value is a hexadecimal encoding of the major and -minor version numbers of the library, of the form 0xMMMM. MM is the -two-digit major version number; MM is the two-digit minor version -number. For Readline 4.2, for example, the value of -`RL_READLINE_VERSION' would be `0x0402'. - -* Menu: - -* Readline Typedefs:: C declarations to make code readable. -* Function Writing:: Variables and calling conventions. - - -File: readline.info, Node: Readline Typedefs, Next: Function Writing, Up: Custom Functions - -Readline Typedefs ------------------ - - For readabilty, we declare a number of new object types, all pointers -to functions. - - The reason for declaring these new types is to make it easier to -write code describing pointers to C functions with appropriately -prototyped arguments and return values. - - For instance, say we want to declare a variable FUNC as a pointer to -a function which takes two `int' arguments and returns an `int' (this -is the type of all of the Readline bindable functions). Instead of the -classic C declaration - - `int (*func)();' - -or the ANSI-C style declaration - - `int (*func)(int, int);' - -we may write - - `rl_command_func_t *func;' - - The full list of function pointer types available is - -`typedef int rl_command_func_t (int, int);' - -`typedef char *rl_compentry_func_t (const char *, int);' - -`typedef char **rl_completion_func_t (const char *, int, int);' - -`typedef char *rl_quote_func_t (char *, int, char *);' - -`typedef char *rl_dequote_func_t (char *, int);' - -`typedef int rl_compignore_func_t (char **);' - -`typedef void rl_compdisp_func_t (char **, int, int);' - -`typedef int rl_hook_func_t (void);' - -`typedef int rl_getc_func_t (FILE *);' - -`typedef int rl_linebuf_func_t (char *, int);' - -`typedef int rl_intfunc_t (int);' - -`#define rl_ivoidfunc_t rl_hook_func_t' - -`typedef int rl_icpfunc_t (char *);' - -`typedef int rl_icppfunc_t (char **);' - -`typedef void rl_voidfunc_t (void);' - -`typedef void rl_vintfunc_t (int);' - -`typedef void rl_vcpfunc_t (char *);' - -`typedef void rl_vcppfunc_t (char **);' - - -File: readline.info, Node: Function Writing, Prev: Readline Typedefs, Up: Custom Functions - -Writing a New Function ----------------------- - - In order to write new functions for Readline, you need to know the -calling conventions for keyboard-invoked functions, and the names of the -variables that describe the current state of the line read so far. - - The calling sequence for a command `foo' looks like - - `int foo (int count, int key)' - -where COUNT is the numeric argument (or 1 if defaulted) and KEY is the -key that invoked this function. - - It is completely up to the function as to what should be done with -the numeric argument. Some functions use it as a repeat count, some as -a flag, and others to choose alternate behavior (refreshing the current -line as opposed to refreshing the screen, for example). Some choose to -ignore it. In general, if a function uses the numeric argument as a -repeat count, it should be able to do something useful with both -negative and positive arguments. At the very least, it should be aware -that it can be passed a negative argument. - - A command function should return 0 if its action completes -successfully, and a non-zero value if some error occurs. - - -File: readline.info, Node: Readline Variables, Next: Readline Convenience Functions, Prev: Custom Functions, Up: Programming with GNU Readline - -Readline Variables -================== - - These variables are available to function writers. - - - Variable: char * rl_line_buffer - This is the line gathered so far. You are welcome to modify the - contents of the line, but see *Note Allowing Undoing::. The - function `rl_extend_line_buffer' is available to increase the - memory allocated to `rl_line_buffer'. - - - Variable: int rl_point - The offset of the current cursor position in `rl_line_buffer' (the - _point_). - - - Variable: int rl_end - The number of characters present in `rl_line_buffer'. When - `rl_point' is at the end of the line, `rl_point' and `rl_end' are - equal. - - - Variable: int rl_mark - The MARK (saved position) in the current line. If set, the mark - and point define a _region_. - - - Variable: int rl_done - Setting this to a non-zero value causes Readline to return the - current line immediately. - - - Variable: int rl_num_chars_to_read - Setting this to a positive value before calling `readline()' causes - Readline to return after accepting that many characters, rather - than reading up to a character bound to `accept-line'. - - - Variable: int rl_pending_input - Setting this to a value makes it the next keystroke read. This is - a way to stuff a single character into the input stream. - - - Variable: int rl_dispatching - Set to a non-zero value if a function is being called from a key - binding; zero otherwise. Application functions can test this to - discover whether they were called directly or by Readline's - dispatching mechanism. - - - Variable: int rl_erase_empty_line - Setting this to a non-zero value causes Readline to completely - erase the current line, including any prompt, any time a newline - is typed as the only character on an otherwise-empty line. The - cursor is moved to the beginning of the newly-blank line. - - - Variable: char * rl_prompt - The prompt Readline uses. This is set from the argument to - `readline()', and should not be assigned to directly. The - `rl_set_prompt()' function (*note Redisplay::) may be used to - modify the prompt string after calling `readline()'. - - - Variable: int rl_already_prompted - If an application wishes to display the prompt itself, rather than - have Readline do it the first time `readline()' is called, it - should set this variable to a non-zero value after displaying the - prompt. The prompt must also be passed as the argument to - `readline()' so the redisplay functions can update the display - properly. The calling application is responsible for managing the - value; Readline never sets it. - - - Variable: const char * rl_library_version - The version number of this revision of the library. - - - Variable: int rl_readline_version - An integer encoding the current version of the library. The - encoding is of the form 0xMMMM, where MM is the two-digit major - version number, and MM is the two-digit minor version number. For - example, for Readline-4.2, `rl_readline_version' would have the - value 0x0402. - - - Variable: int rl_gnu_readline_p - Always set to 1, denoting that this is GNU readline rather than - some emulation. - - - Variable: const char * rl_terminal_name - The terminal type, used for initialization. If not set by the - application, Readline sets this to the value of the `TERM' - environment variable the first time it is called. - - - Variable: const char * rl_readline_name - This variable is set to a unique name by each application using - Readline. The value allows conditional parsing of the inputrc file - (*note Conditional Init Constructs::). - - - Variable: FILE * rl_instream - The stdio stream from which Readline reads input. If `NULL', - Readline defaults to STDIN. - - - Variable: FILE * rl_outstream - The stdio stream to which Readline performs output. If `NULL', - Readline defaults to STDOUT. - - - Variable: rl_command_func_t * rl_last_func - The address of the last command function Readline executed. May - be used to test whether or not a function is being executed twice - in succession, for example. - - - Variable: rl_hook_func_t * rl_startup_hook - If non-zero, this is the address of a function to call just before - `readline' prints the first prompt. - - - Variable: rl_hook_func_t * rl_pre_input_hook - If non-zero, this is the address of a function to call after the - first prompt has been printed and just before `readline' starts - reading input characters. - - - Variable: rl_hook_func_t * rl_event_hook - If non-zero, this is the address of a function to call periodically - when Readline is waiting for terminal input. By default, this - will be called at most ten times a second if there is no keyboard - input. - - - Variable: rl_getc_func_t * rl_getc_function - If non-zero, Readline will call indirectly through this pointer to - get a character from the input stream. By default, it is set to - `rl_getc', the default Readline character input function (*note - Character Input::). - - - Variable: rl_voidfunc_t * rl_redisplay_function - If non-zero, Readline will call indirectly through this pointer to - update the display with the current contents of the editing buffer. - By default, it is set to `rl_redisplay', the default Readline - redisplay function (*note Redisplay::). - - - Variable: rl_vintfunc_t * rl_prep_term_function - If non-zero, Readline will call indirectly through this pointer to - initialize the terminal. The function takes a single argument, an - `int' flag that says whether or not to use eight-bit characters. - By default, this is set to `rl_prep_terminal' (*note Terminal - Management::). - - - Variable: rl_voidfunc_t * rl_deprep_term_function - If non-zero, Readline will call indirectly through this pointer to - reset the terminal. This function should undo the effects of - `rl_prep_term_function'. By default, this is set to - `rl_deprep_terminal' (*note Terminal Management::). - - - Variable: Keymap rl_executing_keymap - This variable is set to the keymap (*note Keymaps::) in which the - currently executing readline function was found. - - - Variable: Keymap rl_binding_keymap - This variable is set to the keymap (*note Keymaps::) in which the - last key binding occurred. - - - Variable: char * rl_executing_macro - This variable is set to the text of any currently-executing macro. - - - Variable: int rl_readline_state - A variable with bit values that encapsulate the current Readline - state. A bit is set with the `RL_SETSTATE' macro, and unset with - the `RL_UNSETSTATE' macro. Use the `RL_ISSTATE' macro to test - whether a particular state bit is set. Current state bits include: - - `RL_STATE_NONE' - Readline has not yet been called, nor has it begun to - intialize. - - `RL_STATE_INITIALIZING' - Readline is initializing its internal data structures. - - `RL_STATE_INITIALIZED' - Readline has completed its initialization. - - `RL_STATE_TERMPREPPED' - Readline has modified the terminal modes to do its own input - and redisplay. - - `RL_STATE_READCMD' - Readline is reading a command from the keyboard. - - `RL_STATE_METANEXT' - Readline is reading more input after reading the meta-prefix - character. - - `RL_STATE_DISPATCHING' - Readline is dispatching to a command. - - `RL_STATE_MOREINPUT' - Readline is reading more input while executing an editing - command. - - `RL_STATE_ISEARCH' - Readline is performing an incremental history search. - - `RL_STATE_NSEARCH' - Readline is performing a non-incremental history search. - - `RL_STATE_SEARCH' - Readline is searching backward or forward through the history - for a string. - - `RL_STATE_NUMERICARG' - Readline is reading a numeric argument. - - `RL_STATE_MACROINPUT' - Readline is currently getting its input from a - previously-defined keyboard macro. - - `RL_STATE_MACRODEF' - Readline is currently reading characters defining a keyboard - macro. - - `RL_STATE_OVERWRITE' - Readline is in overwrite mode. - - `RL_STATE_COMPLETING' - Readline is performing word completion. - - `RL_STATE_SIGHANDLER' - Readline is currently executing the readline signal handler. - - `RL_STATE_UNDOING' - Readline is performing an undo. - - `RL_STATE_DONE' - Readline has read a key sequence bound to `accept-line' and - is about to return the line to the caller. - - - - Variable: int rl_explicit_arg - Set to a non-zero value if an explicit numeric argument was - specified by the user. Only valid in a bindable command function. - - - Variable: int rl_numeric_arg - Set to the value of any numeric argument explicitly specified by - the user before executing the current Readline function. Only - valid in a bindable command function. - - - Variable: int rl_editing_mode - Set to a value denoting Readline's current editing mode. A value - of 1 means Readline is currently in emacs mode; 0 means that vi - mode is active. - - -File: readline.info, Node: Readline Convenience Functions, Next: Readline Signal Handling, Prev: Readline Variables, Up: Programming with GNU Readline - -Readline Convenience Functions -============================== - -* Menu: - -* Function Naming:: How to give a function you write a name. -* Keymaps:: Making keymaps. -* Binding Keys:: Changing Keymaps. -* Associating Function Names and Bindings:: Translate function names to - key sequences. -* Allowing Undoing:: How to make your functions undoable. -* Redisplay:: Functions to control line display. -* Modifying Text:: Functions to modify `rl_line_buffer'. -* Character Input:: Functions to read keyboard input. -* Terminal Management:: Functions to manage terminal settings. -* Utility Functions:: Generally useful functions and hooks. -* Miscellaneous Functions:: Functions that don't fall into any category. -* Alternate Interface:: Using Readline in a `callback' fashion. -* A Readline Example:: An example Readline function. - - -File: readline.info, Node: Function Naming, Next: Keymaps, Up: Readline Convenience Functions - -Naming a Function ------------------ - - The user can dynamically change the bindings of keys while using -Readline. This is done by representing the function with a descriptive -name. The user is able to type the descriptive name when referring to -the function. Thus, in an init file, one might find - - Meta-Rubout: backward-kill-word - - This binds the keystroke to the function -_descriptively_ named `backward-kill-word'. You, as the programmer, -should bind the functions you write to descriptive names as well. -Readline provides a function for doing that: - - - Function: int rl_add_defun (const char *name, rl_command_func_t - *function, int key) - Add NAME to the list of named functions. Make FUNCTION be the - function that gets called. If KEY is not -1, then bind it to - FUNCTION using `rl_bind_key()'. - - Using this function alone is sufficient for most applications. It -is the recommended way to add a few functions to the default functions -that Readline has built in. If you need to do something other than -adding a function to Readline, you may need to use the underlying -functions described below. - - -File: readline.info, Node: Keymaps, Next: Binding Keys, Prev: Function Naming, Up: Readline Convenience Functions - -Selecting a Keymap ------------------- - - Key bindings take place on a "keymap". The keymap is the -association between the keys that the user types and the functions that -get run. You can make your own keymaps, copy existing keymaps, and tell -Readline which keymap to use. - - - Function: Keymap rl_make_bare_keymap (void) - Returns a new, empty keymap. The space for the keymap is - allocated with `malloc()'; the caller should free it by calling - `rl_discard_keymap()' when done. - - - Function: Keymap rl_copy_keymap (Keymap map) - Return a new keymap which is a copy of MAP. - - - Function: Keymap rl_make_keymap (void) - Return a new keymap with the printing characters bound to - rl_insert, the lowercase Meta characters bound to run their - equivalents, and the Meta digits bound to produce numeric - arguments. - - - Function: void rl_discard_keymap (Keymap keymap) - Free the storage associated with KEYMAP. - - Readline has several internal keymaps. These functions allow you to -change which keymap is active. - - - Function: Keymap rl_get_keymap (void) - Returns the currently active keymap. - - - Function: void rl_set_keymap (Keymap keymap) - Makes KEYMAP the currently active keymap. - - - Function: Keymap rl_get_keymap_by_name (const char *name) - Return the keymap matching NAME. NAME is one which would be - supplied in a `set keymap' inputrc line (*note Readline Init - File::). - - - Function: char * rl_get_keymap_name (Keymap keymap) - Return the name matching KEYMAP. NAME is one which would be - supplied in a `set keymap' inputrc line (*note Readline Init - File::). - - -File: readline.info, Node: Binding Keys, Next: Associating Function Names and Bindings, Prev: Keymaps, Up: Readline Convenience Functions - -Binding Keys ------------- - - Key sequences are associate with functions through the keymap. -Readline has several internal keymaps: `emacs_standard_keymap', -`emacs_meta_keymap', `emacs_ctlx_keymap', `vi_movement_keymap', and -`vi_insertion_keymap'. `emacs_standard_keymap' is the default, and the -examples in this manual assume that. - - Since `readline()' installs a set of default key bindings the first -time it is called, there is always the danger that a custom binding -installed before the first call to `readline()' will be overridden. An -alternate mechanism is to install custom key bindings in an -initialization function assigned to the `rl_startup_hook' variable -(*note Readline Variables::). - - These functions manage key bindings. - - - Function: int rl_bind_key (int key, rl_command_func_t *function) - Binds KEY to FUNCTION in the currently active keymap. Returns - non-zero in the case of an invalid KEY. - - - Function: int rl_bind_key_in_map (int key, rl_command_func_t - *function, Keymap map) - Bind KEY to FUNCTION in MAP. Returns non-zero in the case of an - invalid KEY. - - - Function: int rl_bind_key_if_unbound (int key, rl_command_func_t - *function) - Binds KEY to FUNCTION if it is not already bound in the currently - active keymap. Returns non-zero in the case of an invalid KEY or - if KEY is already bound. - - - Function: int rl_bind_key_if_unbound_in_map (int key, - rl_command_func_t *function, Keymap map) - Binds KEY to FUNCTION if it is not already bound in MAP. Returns - non-zero in the case of an invalid KEY or if KEY is already bound. - - - Function: int rl_unbind_key (int key) - Bind KEY to the null function in the currently active keymap. - Returns non-zero in case of error. - - - Function: int rl_unbind_key_in_map (int key, Keymap map) - Bind KEY to the null function in MAP. Returns non-zero in case of - error. - - - Function: int rl_unbind_function_in_map (rl_command_func_t - *function, Keymap map) - Unbind all keys that execute FUNCTION in MAP. - - - Function: int rl_unbind_command_in_map (const char *command, Keymap - map) - Unbind all keys that are bound to COMMAND in MAP. - - - Function: int rl_bind_keyseq (const char *keyseq, rl_command_func_t - *function) - Bind the key sequence represented by the string KEYSEQ to the - function FUNCTION, beginning in the current keymap. This makes - new keymaps as necessary. The return value is non-zero if KEYSEQ - is invalid. - - - Function: int rl_bind_keyseq_in_map (const char *keyseq, - rl_command_func_t *function, Keymap map) - Bind the key sequence represented by the string KEYSEQ to the - function FUNCTION. This makes new keymaps as necessary. Initial - bindings are performed in MAP. The return value is non-zero if - KEYSEQ is invalid. - - - Function: int rl_set_key (const char *keyseq, rl_command_func_t - *function, Keymap map) - Equivalent to `rl_bind_keyseq_in_map'. - - - Function: int rl_bind_keyseq_if_unbound (const char *keyseq, - rl_command_func_t *function) - Binds KEYSEQ to FUNCTION if it is not already bound in the - currently active keymap. Returns non-zero in the case of an - invalid KEYSEQ or if KEYSEQ is already bound. - - - Function: int rl_bind_keyseq_if_unbound_in_map (const char *keyseq, - rl_command_func_t *function, Keymap map) - Binds KEYSEQ to FUNCTION if it is not already bound in MAP. - Returns non-zero in the case of an invalid KEYSEQ or if KEYSEQ is - already bound. - - - Function: int rl_generic_bind (int type, const char *keyseq, char - *data, Keymap map) - Bind the key sequence represented by the string KEYSEQ to the - arbitrary pointer DATA. TYPE says what kind of data is pointed to - by DATA; this can be a function (`ISFUNC'), a macro (`ISMACR'), or - a keymap (`ISKMAP'). This makes new keymaps as necessary. The - initial keymap in which to do bindings is MAP. - - - Function: int rl_parse_and_bind (char *line) - Parse LINE as if it had been read from the `inputrc' file and - perform any key bindings and variable assignments found (*note - Readline Init File::). - - - Function: int rl_read_init_file (const char *filename) - Read keybindings and variable assignments from FILENAME (*note - Readline Init File::). - - -File: readline.info, Node: Associating Function Names and Bindings, Next: Allowing Undoing, Prev: Binding Keys, Up: Readline Convenience Functions - -Associating Function Names and Bindings ---------------------------------------- - - These functions allow you to find out what keys invoke named -functions and the functions invoked by a particular key sequence. You -may also associate a new function name with an arbitrary function. - - - Function: rl_command_func_t * rl_named_function (const char *name) - Return the function with name NAME. - - - Function: rl_command_func_t * rl_function_of_keyseq (const char - *keyseq, Keymap map, int *type) - Return the function invoked by KEYSEQ in keymap MAP. If MAP is - `NULL', the current keymap is used. If TYPE is not `NULL', the - type of the object is returned in the `int' variable it points to - (one of `ISFUNC', `ISKMAP', or `ISMACR'). - - - Function: char ** rl_invoking_keyseqs (rl_command_func_t *function) - Return an array of strings representing the key sequences used to - invoke FUNCTION in the current keymap. - - - Function: char ** rl_invoking_keyseqs_in_map (rl_command_func_t - *function, Keymap map) - Return an array of strings representing the key sequences used to - invoke FUNCTION in the keymap MAP. - - - Function: void rl_function_dumper (int readable) - Print the readline function names and the key sequences currently - bound to them to `rl_outstream'. If READABLE is non-zero, the - list is formatted in such a way that it can be made part of an - `inputrc' file and re-read. - - - Function: void rl_list_funmap_names (void) - Print the names of all bindable Readline functions to - `rl_outstream'. - - - Function: const char ** rl_funmap_names (void) - Return a NULL terminated array of known function names. The array - is sorted. The array itself is allocated, but not the strings - inside. You should `free()' the array when you are done, but not - the pointers. - - - Function: int rl_add_funmap_entry (const char *name, - rl_command_func_t *function) - Add NAME to the list of bindable Readline command names, and make - FUNCTION the function to be called when NAME is invoked. - - -File: readline.info, Node: Allowing Undoing, Next: Redisplay, Prev: Associating Function Names and Bindings, Up: Readline Convenience Functions - -Allowing Undoing ----------------- - - Supporting the undo command is a painless thing, and makes your -functions much more useful. It is certainly easy to try something if -you know you can undo it. - - If your function simply inserts text once, or deletes text once, and -uses `rl_insert_text()' or `rl_delete_text()' to do it, then undoing is -already done for you automatically. - - If you do multiple insertions or multiple deletions, or any -combination of these operations, you should group them together into -one operation. This is done with `rl_begin_undo_group()' and -`rl_end_undo_group()'. - - The types of events that can be undone are: - - enum undo_code { UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END }; - - Notice that `UNDO_DELETE' means to insert some text, and -`UNDO_INSERT' means to delete some text. That is, the undo code tells -what to undo, not how to undo it. `UNDO_BEGIN' and `UNDO_END' are tags -added by `rl_begin_undo_group()' and `rl_end_undo_group()'. - - - Function: int rl_begin_undo_group (void) - Begins saving undo information in a group construct. The undo - information usually comes from calls to `rl_insert_text()' and - `rl_delete_text()', but could be the result of calls to - `rl_add_undo()'. - - - Function: int rl_end_undo_group (void) - Closes the current undo group started with `rl_begin_undo_group - ()'. There should be one call to `rl_end_undo_group()' for each - call to `rl_begin_undo_group()'. - - - Function: void rl_add_undo (enum undo_code what, int start, int end, - char *text) - Remember how to undo an event (according to WHAT). The affected - text runs from START to END, and encompasses TEXT. - - - Function: void rl_free_undo_list (void) - Free the existing undo list. - - - Function: int rl_do_undo (void) - Undo the first thing on the undo list. Returns `0' if there was - nothing to undo, non-zero if something was undone. - - Finally, if you neither insert nor delete text, but directly modify -the existing text (e.g., change its case), call `rl_modifying()' once, -just before you modify the text. You must supply the indices of the -text range that you are going to modify. - - - Function: int rl_modifying (int start, int end) - Tell Readline to save the text between START and END as a single - undo unit. It is assumed that you will subsequently modify that - text. - - -File: readline.info, Node: Redisplay, Next: Modifying Text, Prev: Allowing Undoing, Up: Readline Convenience Functions - -Redisplay ---------- - - - Function: void rl_redisplay (void) - Change what's displayed on the screen to reflect the current - contents of `rl_line_buffer'. - - - Function: int rl_forced_update_display (void) - Force the line to be updated and redisplayed, whether or not - Readline thinks the screen display is correct. - - - Function: int rl_on_new_line (void) - Tell the update functions that we have moved onto a new (empty) - line, usually after ouputting a newline. - - - Function: int rl_on_new_line_with_prompt (void) - Tell the update functions that we have moved onto a new line, with - RL_PROMPT already displayed. This could be used by applications - that want to output the prompt string themselves, but still need - Readline to know the prompt string length for redisplay. It - should be used after setting RL_ALREADY_PROMPTED. - - - Function: int rl_reset_line_state (void) - Reset the display state to a clean state and redisplay the current - line starting on a new line. - - - Function: int rl_crlf (void) - Move the cursor to the start of the next screen line. - - - Function: int rl_show_char (int c) - Display character C on `rl_outstream'. If Readline has not been - set to display meta characters directly, this will convert meta - characters to a meta-prefixed key sequence. This is intended for - use by applications which wish to do their own redisplay. - - - Function: int rl_message (const char *, ...) - The arguments are a format string as would be supplied to `printf', - possibly containing conversion specifications such as `%d', and - any additional arguments necessary to satisfy the conversion - specifications. The resulting string is displayed in the "echo - area". The echo area is also used to display numeric arguments - and search strings. - - - Function: int rl_clear_message (void) - Clear the message in the echo area. - - - Function: void rl_save_prompt (void) - Save the local Readline prompt display state in preparation for - displaying a new message in the message area with `rl_message()'. - - - Function: void rl_restore_prompt (void) - Restore the local Readline prompt display state saved by the most - recent call to `rl_save_prompt'. - - - Function: int rl_expand_prompt (char *prompt) - Expand any special character sequences in PROMPT and set up the - local Readline prompt redisplay variables. This function is - called by `readline()'. It may also be called to expand the - primary prompt if the `rl_on_new_line_with_prompt()' function or - `rl_already_prompted' variable is used. It returns the number of - visible characters on the last line of the (possibly multi-line) - prompt. Applications may indicate that the prompt contains - characters that take up no physical screen space when displayed by - bracketing a sequence of such characters with the special markers - `RL_PROMPT_START_IGNORE' and `RL_PROMPT_END_IGNORE' (declared in - `readline.h'. This may be used to embed terminal-specific escape - sequences in prompts. - - - Function: int rl_set_prompt (const char *prompt) - Make Readline use PROMPT for subsequent redisplay. This calls - `rl_expand_prompt()' to expand the prompt and sets `rl_prompt' to - the result. - - -File: readline.info, Node: Modifying Text, Next: Character Input, Prev: Redisplay, Up: Readline Convenience Functions - -Modifying Text --------------- - - - Function: int rl_insert_text (const char *text) - Insert TEXT into the line at the current cursor position. Returns - the number of characters inserted. - - - Function: int rl_delete_text (int start, int end) - Delete the text between START and END in the current line. - Returns the number of characters deleted. - - - Function: char * rl_copy_text (int start, int end) - Return a copy of the text between START and END in the current - line. - - - Function: int rl_kill_text (int start, int end) - Copy the text between START and END in the current line to the - kill ring, appending or prepending to the last kill if the last - command was a kill command. The text is deleted. If START is - less than END, the text is appended, otherwise prepended. If the - last command was not a kill, a new kill ring slot is used. - - - Function: int rl_push_macro_input (char *macro) - Cause MACRO to be inserted into the line, as if it had been invoked - by a key bound to a macro. Not especially useful; use - `rl_insert_text()' instead. - - -File: readline.info, Node: Character Input, Next: Terminal Management, Prev: Modifying Text, Up: Readline Convenience Functions - -Character Input ---------------- - - - Function: int rl_read_key (void) - Return the next character available from Readline's current input - stream. This handles input inserted into the input stream via - RL_PENDING_INPUT (*note Readline Variables::) and - `rl_stuff_char()', macros, and characters read from the keyboard. - While waiting for input, this function will call any function - assigned to the `rl_event_hook' variable. - - - Function: int rl_getc (FILE *stream) - Return the next character available from STREAM, which is assumed - to be the keyboard. - - - Function: int rl_stuff_char (int c) - Insert C into the Readline input stream. It will be "read" before - Readline attempts to read characters from the terminal with - `rl_read_key()'. Up to 512 characters may be pushed back. - `rl_stuff_char' returns 1 if the character was successfully - inserted; 0 otherwise. - - - Function: int rl_execute_next (int c) - Make C be the next command to be executed when `rl_read_key()' is - called. This sets RL_PENDING_INPUT. - - - Function: int rl_clear_pending_input (void) - Unset RL_PENDING_INPUT, effectively negating the effect of any - previous call to `rl_execute_next()'. This works only if the - pending input has not already been read with `rl_read_key()'. - - - Function: int rl_set_keyboard_input_timeout (int u) - While waiting for keyboard input in `rl_read_key()', Readline will - wait for U microseconds for input before calling any function - assigned to `rl_event_hook'. The default waiting period is - one-tenth of a second. Returns the old timeout value. - - -File: readline.info, Node: Terminal Management, Next: Utility Functions, Prev: Character Input, Up: Readline Convenience Functions - -Terminal Management -------------------- - - - Function: void rl_prep_terminal (int meta_flag) - Modify the terminal settings for Readline's use, so `readline()' - can read a single character at a time from the keyboard. The - META_FLAG argument should be non-zero if Readline should read - eight-bit input. - - - Function: void rl_deprep_terminal (void) - Undo the effects of `rl_prep_terminal()', leaving the terminal in - the state in which it was before the most recent call to - `rl_prep_terminal()'. - - - Function: void rl_tty_set_default_bindings (Keymap kmap) - Read the operating system's terminal editing characters (as would - be displayed by `stty') to their Readline equivalents. The - bindings are performed in KMAP. - - - Function: void rl_tty_unset_default_bindings (Keymap kmap) - Reset the bindings manipulated by `rl_tty_set_default_bindings' so - that the terminal editing characters are bound to `rl_insert'. - The bindings are performed in KMAP. - - - Function: int rl_reset_terminal (const char *terminal_name) - Reinitialize Readline's idea of the terminal settings using - TERMINAL_NAME as the terminal type (e.g., `vt100'). If - TERMINAL_NAME is `NULL', the value of the `TERM' environment - variable is used. - - -File: readline.info, Node: Utility Functions, Next: Miscellaneous Functions, Prev: Terminal Management, Up: Readline Convenience Functions - -Utility Functions ------------------ - - - Function: void rl_replace_line (const char *text, int clear_undo) - Replace the contents of `rl_line_buffer' with TEXT. The point and - mark are preserved, if possible. If CLEAR_UNDO is non-zero, the - undo list associated with the current line is cleared. - - - Function: int rl_extend_line_buffer (int len) - Ensure that `rl_line_buffer' has enough space to hold LEN - characters, possibly reallocating it if necessary. - - - Function: int rl_initialize (void) - Initialize or re-initialize Readline's internal state. It's not - strictly necessary to call this; `readline()' calls it before - reading any input. - - - Function: int rl_ding (void) - Ring the terminal bell, obeying the setting of `bell-style'. - - - Function: int rl_alphabetic (int c) - Return 1 if C is an alphabetic character. - - - Function: void rl_display_match_list (char **matches, int len, int - max) - A convenience function for displaying a list of strings in - columnar format on Readline's output stream. `matches' is the list - of strings, in argv format, such as a list of completion matches. - `len' is the number of strings in `matches', and `max' is the - length of the longest string in `matches'. This function uses the - setting of `print-completions-horizontally' to select how the - matches are displayed (*note Readline Init File Syntax::). - - The following are implemented as macros, defined in `chardefs.h'. -Applications should refrain from using them. - - - Function: int _rl_uppercase_p (int c) - Return 1 if C is an uppercase alphabetic character. - - - Function: int _rl_lowercase_p (int c) - Return 1 if C is a lowercase alphabetic character. - - - Function: int _rl_digit_p (int c) - Return 1 if C is a numeric character. - - - Function: int _rl_to_upper (int c) - If C is a lowercase alphabetic character, return the corresponding - uppercase character. - - - Function: int _rl_to_lower (int c) - If C is an uppercase alphabetic character, return the corresponding - lowercase character. - - - Function: int _rl_digit_value (int c) - If C is a number, return the value it represents. - - -File: readline.info, Node: Miscellaneous Functions, Next: Alternate Interface, Prev: Utility Functions, Up: Readline Convenience Functions - -Miscellaneous Functions ------------------------ - - - Function: int rl_macro_bind (const char *keyseq, const char *macro, - Keymap map) - Bind the key sequence KEYSEQ to invoke the macro MACRO. The - binding is performed in MAP. When KEYSEQ is invoked, the MACRO - will be inserted into the line. This function is deprecated; use - `rl_generic_bind()' instead. - - - Function: void rl_macro_dumper (int readable) - Print the key sequences bound to macros and their values, using - the current keymap, to `rl_outstream'. If READABLE is non-zero, - the list is formatted in such a way that it can be made part of an - `inputrc' file and re-read. - - - Function: int rl_variable_bind (const char *variable, const char - *value) - Make the Readline variable VARIABLE have VALUE. This behaves as - if the readline command `set VARIABLE VALUE' had been executed in - an `inputrc' file (*note Readline Init File Syntax::). - - - Function: void rl_variable_dumper (int readable) - Print the readline variable names and their current values to - `rl_outstream'. If READABLE is non-zero, the list is formatted in - such a way that it can be made part of an `inputrc' file and - re-read. - - - Function: int rl_set_paren_blink_timeout (int u) - Set the time interval (in microseconds) that Readline waits when - showing a balancing character when `blink-matching-paren' has been - enabled. - - - Function: char * rl_get_termcap (const char *cap) - Retrieve the string value of the termcap capability CAP. Readline - fetches the termcap entry for the current terminal name and uses - those capabilities to move around the screen line and perform other - terminal-specific operations, like erasing a line. Readline does - not use all of a terminal's capabilities, and this function will - return values for only those capabilities Readline uses. - - -File: readline.info, Node: Alternate Interface, Next: A Readline Example, Prev: Miscellaneous Functions, Up: Readline Convenience Functions - -Alternate Interface -------------------- - - An alternate interface is available to plain `readline()'. Some -applications need to interleave keyboard I/O with file, device, or -window system I/O, typically by using a main loop to `select()' on -various file descriptors. To accomodate this need, readline can also -be invoked as a `callback' function from an event loop. There are -functions available to make this easy. - - - Function: void rl_callback_handler_install (const char *prompt, - rl_vcpfunc_t *lhandler) - Set up the terminal for readline I/O and display the initial - expanded value of PROMPT. Save the value of LHANDLER to use as a - function to call when a complete line of input has been entered. - The function takes the text of the line as an argument. - - - Function: void rl_callback_read_char (void) - Whenever an application determines that keyboard input is - available, it should call `rl_callback_read_char()', which will - read the next character from the current input source. If that - character completes the line, `rl_callback_read_char' will invoke - the LHANDLER function saved by `rl_callback_handler_install' to - process the line. Before calling the LHANDLER function, the - terminal settings are reset to the values they had before calling - `rl_callback_handler_install'. If the LHANDLER function returns, - the terminal settings are modified for Readline's use again. - `EOF' is indicated by calling LHANDLER with a `NULL' line. - - - Function: void rl_callback_handler_remove (void) - Restore the terminal to its initial state and remove the line - handler. This may be called from within a callback as well as - independently. If the LHANDLER installed by - `rl_callback_handler_install' does not exit the program, either - this function or the function referred to by the value of - `rl_deprep_term_function' should be called before the program - exits to reset the terminal settings. - - -File: readline.info, Node: A Readline Example, Prev: Alternate Interface, Up: Readline Convenience Functions - -A Readline Example ------------------- - - Here is a function which changes lowercase characters to their -uppercase equivalents, and uppercase characters to lowercase. If this -function was bound to `M-c', then typing `M-c' would change the case of -the character under point. Typing `M-1 0 M-c' would change the case of -the following 10 characters, leaving the cursor on the last character -changed. - - /* Invert the case of the COUNT following characters. */ - int - invert_case_line (count, key) - int count, key; - { - register int start, end, i; - - start = rl_point; - - if (rl_point >= rl_end) - return (0); - - if (count < 0) - { - direction = -1; - count = -count; - } - else - direction = 1; - - /* Find the end of the range to modify. */ - end = start + (count * direction); - - /* Force it to be within range. */ - if (end > rl_end) - end = rl_end; - else if (end < 0) - end = 0; - - if (start == end) - return (0); - - if (start > end) - { - int temp = start; - start = end; - end = temp; - } - - /* Tell readline that we are modifying the line, - so it will save the undo information. */ - rl_modifying (start, end); - - for (i = start; i != end; i++) - { - if (_rl_uppercase_p (rl_line_buffer[i])) - rl_line_buffer[i] = _rl_to_lower (rl_line_buffer[i]); - else if (_rl_lowercase_p (rl_line_buffer[i])) - rl_line_buffer[i] = _rl_to_upper (rl_line_buffer[i]); - } - /* Move point to on top of the last character changed. */ - rl_point = (direction == 1) ? end - 1 : start; - return (0); - } - - -File: readline.info, Node: Readline Signal Handling, Next: Custom Completers, Prev: Readline Convenience Functions, Up: Programming with GNU Readline - -Readline Signal Handling -======================== - - Signals are asynchronous events sent to a process by the Unix kernel, -sometimes on behalf of another process. They are intended to indicate -exceptional events, like a user pressing the interrupt key on his -terminal, or a network connection being broken. There is a class of -signals that can be sent to the process currently reading input from -the keyboard. Since Readline changes the terminal attributes when it -is called, it needs to perform special processing when such a signal is -received in order to restore the terminal to a sane state, or provide -application writers with functions to do so manually. - - Readline contains an internal signal handler that is installed for a -number of signals (`SIGINT', `SIGQUIT', `SIGTERM', `SIGALRM', -`SIGTSTP', `SIGTTIN', and `SIGTTOU'). When one of these signals is -received, the signal handler will reset the terminal attributes to -those that were in effect before `readline()' was called, reset the -signal handling to what it was before `readline()' was called, and -resend the signal to the calling application. If and when the calling -application's signal handler returns, Readline will reinitialize the -terminal and continue to accept input. When a `SIGINT' is received, -the Readline signal handler performs some additional work, which will -cause any partially-entered line to be aborted (see the description of -`rl_free_line_state()' below). - - There is an additional Readline signal handler, for `SIGWINCH', which -the kernel sends to a process whenever the terminal's size changes (for -example, if a user resizes an `xterm'). The Readline `SIGWINCH' -handler updates Readline's internal screen size information, and then -calls any `SIGWINCH' signal handler the calling application has -installed. Readline calls the application's `SIGWINCH' signal handler -without resetting the terminal to its original state. If the -application's signal handler does more than update its idea of the -terminal size and return (for example, a `longjmp' back to a main -processing loop), it _must_ call `rl_cleanup_after_signal()' (described -below), to restore the terminal state. - - Readline provides two variables that allow application writers to -control whether or not it will catch certain signals and act on them -when they are received. It is important that applications change the -values of these variables only when calling `readline()', not in a -signal handler, so Readline's internal signal state is not corrupted. - - - Variable: int rl_catch_signals - If this variable is non-zero, Readline will install signal - handlers for `SIGINT', `SIGQUIT', `SIGTERM', `SIGALRM', `SIGTSTP', - `SIGTTIN', and `SIGTTOU'. - - The default value of `rl_catch_signals' is 1. - - - Variable: int rl_catch_sigwinch - If this variable is non-zero, Readline will install a signal - handler for `SIGWINCH'. - - The default value of `rl_catch_sigwinch' is 1. - - If an application does not wish to have Readline catch any signals, -or to handle signals other than those Readline catches (`SIGHUP', for -example), Readline provides convenience functions to do the necessary -terminal and internal state cleanup upon receipt of a signal. - - - Function: void rl_cleanup_after_signal (void) - This function will reset the state of the terminal to what it was - before `readline()' was called, and remove the Readline signal - handlers for all signals, depending on the values of - `rl_catch_signals' and `rl_catch_sigwinch'. - - - Function: void rl_free_line_state (void) - This will free any partial state associated with the current input - line (undo information, any partial history entry, any - partially-entered keyboard macro, and any partially-entered - numeric argument). This should be called before - `rl_cleanup_after_signal()'. The Readline signal handler for - `SIGINT' calls this to abort the current input line. - - - Function: void rl_reset_after_signal (void) - This will reinitialize the terminal and reinstall any Readline - signal handlers, depending on the values of `rl_catch_signals' and - `rl_catch_sigwinch'. - - If an application does not wish Readline to catch `SIGWINCH', it may -call `rl_resize_terminal()' or `rl_set_screen_size()' to force Readline -to update its idea of the terminal size when a `SIGWINCH' is received. - - - Function: void rl_resize_terminal (void) - Update Readline's internal screen size by reading values from the - kernel. - - - Function: void rl_set_screen_size (int rows, int cols) - Set Readline's idea of the terminal size to ROWS rows and COLS - columns. - - If an application does not want to install a `SIGWINCH' handler, but -is still interested in the screen dimensions, Readline's idea of the -screen size may be queried. - - - Function: void rl_get_screen_size (int *rows, int *cols) - Return Readline's idea of the terminal's size in the variables - pointed to by the arguments. - - The following functions install and remove Readline's signal -handlers. - - - Function: int rl_set_signals (void) - Install Readline's signal handler for `SIGINT', `SIGQUIT', - `SIGTERM', `SIGALRM', `SIGTSTP', `SIGTTIN', `SIGTTOU', and - `SIGWINCH', depending on the values of `rl_catch_signals' and - `rl_catch_sigwinch'. - - - Function: int rl_clear_signals (void) - Remove all of the Readline signal handlers installed by - `rl_set_signals()'. - - -File: readline.info, Node: Custom Completers, Prev: Readline Signal Handling, Up: Programming with GNU Readline - -Custom Completers -================= - - Typically, a program that reads commands from the user has a way of -disambiguating commands and data. If your program is one of these, then -it can provide completion for commands, data, or both. The following -sections describe how your program and Readline cooperate to provide -this service. - -* Menu: - -* How Completing Works:: The logic used to do completion. -* Completion Functions:: Functions provided by Readline. -* Completion Variables:: Variables which control completion. -* A Short Completion Example:: An example of writing completer subroutines. - - -File: readline.info, Node: How Completing Works, Next: Completion Functions, Up: Custom Completers - -How Completing Works --------------------- - - In order to complete some text, the full list of possible completions -must be available. That is, it is not possible to accurately expand a -partial word without knowing all of the possible words which make sense -in that context. The Readline library provides the user interface to -completion, and two of the most common completion functions: filename -and username. For completing other types of text, you must write your -own completion function. This section describes exactly what such -functions must do, and provides an example. - - There are three major functions used to perform completion: - - 1. The user-interface function `rl_complete()'. This function is - called with the same arguments as other bindable Readline - functions: COUNT and INVOKING_KEY. It isolates the word to be - completed and calls `rl_completion_matches()' to generate a list - of possible completions. It then either lists the possible - completions, inserts the possible completions, or actually - performs the completion, depending on which behavior is desired. - - 2. The internal function `rl_completion_matches()' uses an - application-supplied "generator" function to generate the list of - possible matches, and then returns the array of these matches. - The caller should place the address of its generator function in - `rl_completion_entry_function'. - - 3. The generator function is called repeatedly from - `rl_completion_matches()', returning a string each time. The - arguments to the generator function are TEXT and STATE. TEXT is - the partial word to be completed. STATE is zero the first time - the function is called, allowing the generator to perform any - necessary initialization, and a positive non-zero integer for each - subsequent call. The generator function returns `(char *)NULL' to - inform `rl_completion_matches()' that there are no more - possibilities left. Usually the generator function computes the - list of possible completions when STATE is zero, and returns them - one at a time on subsequent calls. Each string the generator - function returns as a match must be allocated with `malloc()'; - Readline frees the strings when it has finished with them. Such a - generator function is referred to as an "application-specific - completion function". - - - - Function: int rl_complete (int ignore, int invoking_key) - Complete the word at or before point. You have supplied the - function that does the initial simple matching selection algorithm - (see `rl_completion_matches()'). The default is to do filename - completion. - - - Variable: rl_compentry_func_t * rl_completion_entry_function - This is a pointer to the generator function for - `rl_completion_matches()'. If the value of - `rl_completion_entry_function' is `NULL' then the default filename - generator function, `rl_filename_completion_function()', is used. - An "application-specific completion function" is a function whose - address is assigned to `rl_completion_entry_function' and whose - return values are used to generate possible completions. - - -File: readline.info, Node: Completion Functions, Next: Completion Variables, Prev: How Completing Works, Up: Custom Completers - -Completion Functions --------------------- - - Here is the complete list of callable completion functions present in -Readline. - - - Function: int rl_complete_internal (int what_to_do) - Complete the word at or before point. WHAT_TO_DO says what to do - with the completion. A value of `?' means list the possible - completions. `TAB' means do standard completion. `*' means - insert all of the possible completions. `!' means to display all - of the possible completions, if there is more than one, as well as - performing partial completion. `@' is similar to `!', but - possible completions are not listed if the possible completions - share a common prefix. - - - Function: int rl_complete (int ignore, int invoking_key) - Complete the word at or before point. You have supplied the - function that does the initial simple matching selection algorithm - (see `rl_completion_matches()' and `rl_completion_entry_function'). - The default is to do filename completion. This calls - `rl_complete_internal()' with an argument depending on - INVOKING_KEY. - - - Function: int rl_possible_completions (int count, int invoking_key) - List the possible completions. See description of `rl_complete - ()'. This calls `rl_complete_internal()' with an argument of `?'. - - - Function: int rl_insert_completions (int count, int invoking_key) - Insert the list of possible completions into the line, deleting the - partially-completed word. See description of `rl_complete()'. - This calls `rl_complete_internal()' with an argument of `*'. - - - Function: int rl_completion_mode (rl_command_func_t *cfunc) - Returns the apppriate value to pass to `rl_complete_internal()' - depending on whether CFUNC was called twice in succession and the - values of the `show-all-if-ambiguous' and `show-all-if-unmodified' - variables. Application-specific completion functions may use this - function to present the same interface as `rl_complete()'. - - - Function: char ** rl_completion_matches (const char *text, - rl_compentry_func_t *entry_func) - Returns an array of strings which is a list of completions for - TEXT. If there are no completions, returns `NULL'. The first - entry in the returned array is the substitution for TEXT. The - remaining entries are the possible completions. The array is - terminated with a `NULL' pointer. - - ENTRY_FUNC is a function of two args, and returns a `char *'. The - first argument is TEXT. The second is a state argument; it is - zero on the first call, and non-zero on subsequent calls. - ENTRY_FUNC returns a `NULL' pointer to the caller when there are - no more matches. - - - Function: char * rl_filename_completion_function (const char *text, - int state) - A generator function for filename completion in the general case. - TEXT is a partial filename. The Bash source is a useful reference - for writing application-specific completion functions (the Bash - completion functions call this and other Readline functions). - - - Function: char * rl_username_completion_function (const char *text, - int state) - A completion generator for usernames. TEXT contains a partial - username preceded by a random character (usually `~'). As with all - completion generators, STATE is zero on the first call and non-zero - for subsequent calls. - - -File: readline.info, Node: Completion Variables, Next: A Short Completion Example, Prev: Completion Functions, Up: Custom Completers - -Completion Variables --------------------- - - - Variable: rl_compentry_func_t * rl_completion_entry_function - A pointer to the generator function for `rl_completion_matches()'. - `NULL' means to use `rl_filename_completion_function()', the - default filename completer. - - - Variable: rl_completion_func_t * rl_attempted_completion_function - A pointer to an alternative function to create matches. The - function is called with TEXT, START, and END. START and END are - indices in `rl_line_buffer' defining the boundaries of TEXT, which - is a character string. If this function exists and returns - `NULL', or if this variable is set to `NULL', then `rl_complete()' - will call the value of `rl_completion_entry_function' to generate - matches, otherwise the array of strings returned will be used. If - this function sets the `rl_attempted_completion_over' variable to - a non-zero value, Readline will not perform its default completion - even if this function returns no matches. - - - Variable: rl_quote_func_t * rl_filename_quoting_function - A pointer to a function that will quote a filename in an - application-specific fashion. This is called if filename - completion is being attempted and one of the characters in - `rl_filename_quote_characters' appears in a completed filename. - The function is called with TEXT, MATCH_TYPE, and QUOTE_POINTER. - The TEXT is the filename to be quoted. The MATCH_TYPE is either - `SINGLE_MATCH', if there is only one completion match, or - `MULT_MATCH'. Some functions use this to decide whether or not to - insert a closing quote character. The QUOTE_POINTER is a pointer - to any opening quote character the user typed. Some functions - choose to reset this character. - - - Variable: rl_dequote_func_t * rl_filename_dequoting_function - A pointer to a function that will remove application-specific - quoting characters from a filename before completion is attempted, - so those characters do not interfere with matching the text - against names in the filesystem. It is called with TEXT, the text - of the word to be dequoted, and QUOTE_CHAR, which is the quoting - character that delimits the filename (usually `'' or `"'). If - QUOTE_CHAR is zero, the filename was not in an embedded string. - - - Variable: rl_linebuf_func_t * rl_char_is_quoted_p - A pointer to a function to call that determines whether or not a - specific character in the line buffer is quoted, according to - whatever quoting mechanism the program calling Readline uses. The - function is called with two arguments: TEXT, the text of the line, - and INDEX, the index of the character in the line. It is used to - decide whether a character found in - `rl_completer_word_break_characters' should be used to break words - for the completer. - - - Variable: rl_compignore_func_t * rl_ignore_some_completions_function - This function, if defined, is called by the completer when real - filename completion is done, after all the matching names have - been generated. It is passed a `NULL' terminated array of matches. - The first element (`matches[0]') is the maximal substring common - to all matches. This function can re-arrange the list of matches - as required, but each element deleted from the array must be freed. - - - Variable: rl_icppfunc_t * rl_directory_completion_hook - This function, if defined, is allowed to modify the directory - portion of filenames Readline completes. It is called with the - address of a string (the current directory name) as an argument, - and may modify that string. If the string is replaced with a new - string, the old value should be freed. Any modified directory - name should have a trailing slash. The modified value will be - displayed as part of the completion, replacing the directory - portion of the pathname the user typed. It returns an integer - that should be non-zero if the function modifies its directory - argument. It could be used to expand symbolic links or shell - variables in pathnames. - - - Variable: rl_compdisp_func_t * rl_completion_display_matches_hook - If non-zero, then this is the address of a function to call when - completing a word would normally display the list of possible - matches. This function is called in lieu of Readline displaying - the list. It takes three arguments: (`char **'MATCHES, `int' - NUM_MATCHES, `int' MAX_LENGTH) where MATCHES is the array of - matching strings, NUM_MATCHES is the number of strings in that - array, and MAX_LENGTH is the length of the longest string in that - array. Readline provides a convenience function, - `rl_display_match_list', that takes care of doing the display to - Readline's output stream. That function may be called from this - hook. - - - Variable: const char * rl_basic_word_break_characters - The basic list of characters that signal a break between words for - the completer routine. The default value of this variable is the - characters which break words for completion in Bash: `" - \t\n\"\\'`@$><=;|&{("'. - - - Variable: const char * rl_basic_quote_characters - A list of quote characters which can cause a word break. - - - Variable: const char * rl_completer_word_break_characters - The list of characters that signal a break between words for - `rl_complete_internal()'. The default list is the value of - `rl_basic_word_break_characters'. - - - Variable: rl_cpvfunc_t * rl_completion_word_break_hook - If non-zero, this is the address of a function to call when - Readline is deciding where to separate words for word completion. - It should return a character string like - `rl_completer_word_break_characters' to be used to perform the - current completion. The function may choose to set - `rl_completer_word_break_characters' itself. If the function - returns `NULL', `rl_completer_word_break_characters' is used. - - - Variable: const char * rl_completer_quote_characters - A list of characters which can be used to quote a substring of the - line. Completion occurs on the entire substring, and within the - substring `rl_completer_word_break_characters' are treated as any - other character, unless they also appear within this list. - - - Variable: const char * rl_filename_quote_characters - A list of characters that cause a filename to be quoted by the - completer when they appear in a completed filename. The default - is the null string. - - - Variable: const char * rl_special_prefixes - The list of characters that are word break characters, but should - be left in TEXT when it is passed to the completion function. - Programs can use this to help determine what kind of completing to - do. For instance, Bash sets this variable to "$@" so that it can - complete shell variables and hostnames. - - - Variable: int rl_completion_query_items - Up to this many items will be displayed in response to a - possible-completions call. After that, we ask the user if she is - sure she wants to see them all. The default value is 100. - - - Variable: int rl_completion_append_character - When a single completion alternative matches at the end of the - command line, this character is appended to the inserted - completion text. The default is a space character (` '). Setting - this to the null character (`\0') prevents anything being appended - automatically. This can be changed in application-specific - completion functions to provide the "most sensible word separator - character" according to an application-specific command line - syntax specification. - - - Variable: int rl_completion_suppress_append - If non-zero, RL_COMPLETION_APPEND_CHARACTER is not appended to - matches at the end of the command line, as described above. It is - set to 0 before any application-specific completion function is - called, and may only be changed within such a function. - - - Variable: int rl_completion_quote_character - When Readline is completing quoted text, as delimited by one of the - characters in RL_COMPLETER_QUOTE_CHARACTERS, it sets this variable - to the quoting character found. This is set before any - application-specific completion function is called. - - - Variable: int rl_completion_suppress_quote - If non-zero, Readline does not append a matching quote character - when performing completion on a quoted string. It is set to 0 - before any application-specific completion function is called, and - may only be changed within such a function. - - - Variable: int rl_completion_found_quote - When Readline is completing quoted text, it sets this variable to - a non-zero value if the word being completed contains or is - delimited by any quoting characters, including backslashes. This - is set before any application-specific completion function is - called. - - - Variable: int rl_completion_mark_symlink_dirs - If non-zero, a slash will be appended to completed filenames that - are symbolic links to directory names, subject to the value of the - user-settable MARK-DIRECTORIES variable. This variable exists so - that application-specific completion functions can override the - user's global preference (set via the MARK-SYMLINKED-DIRECTORIES - Readline variable) if appropriate. This variable is set to the - user's preference before any application-specific completion - function is called, so unless that function modifies the value, - the user's preferences are honored. - - - Variable: int rl_ignore_completion_duplicates - If non-zero, then duplicates in the matches are removed. The - default is 1. - - - Variable: int rl_filename_completion_desired - Non-zero means that the results of the matches are to be treated as - filenames. This is _always_ zero when completion is attempted, - and can only be changed within an application-specific completion - function. If it is set to a non-zero value by such a function, - directory names have a slash appended and Readline attempts to - quote completed filenames if they contain any characters in - `rl_filename_quote_characters' and `rl_filename_quoting_desired' - is set to a non-zero value. - - - Variable: int rl_filename_quoting_desired - Non-zero means that the results of the matches are to be quoted - using double quotes (or an application-specific quoting mechanism) - if the completed filename contains any characters in - `rl_filename_quote_chars'. This is _always_ non-zero when - completion is attempted, and can only be changed within an - application-specific completion function. The quoting is effected - via a call to the function pointed to by - `rl_filename_quoting_function'. - - - Variable: int rl_attempted_completion_over - If an application-specific completion function assigned to - `rl_attempted_completion_function' sets this variable to a non-zero - value, Readline will not perform its default filename completion - even if the application's completion function returns no matches. - It should be set only by an application's completion function. - - - Variable: int rl_completion_type - Set to a character describing the type of completion Readline is - currently attempting; see the description of - `rl_complete_internal()' (*note Completion Functions::) for the - list of characters. This is set to the appropriate value before - any application-specific completion function is called, allowing - such functions to present the same interface as `rl_complete()'. - - - Variable: int rl_inhibit_completion - If this variable is non-zero, completion is inhibited. The - completion character will be inserted as any other bound to - `self-insert'. - - -File: readline.info, Node: A Short Completion Example, Prev: Completion Variables, Up: Custom Completers - -A Short Completion Example --------------------------- - - Here is a small application demonstrating the use of the GNU Readline -library. It is called `fileman', and the source code resides in -`examples/fileman.c'. This sample application provides completion of -command names, line editing features, and access to the history list. - - /* fileman.c -- A tiny application which demonstrates how to use the - GNU Readline library. This application interactively allows users - to manipulate files and their modes. */ - - #include - #include - #include - #include - #include - - #include - #include - - extern char *xmalloc (); - - /* The names of functions that actually do the manipulation. */ - int com_list __P((char *)); - int com_view __P((char *)); - int com_rename __P((char *)); - int com_stat __P((char *)); - int com_pwd __P((char *)); - int com_delete __P((char *)); - int com_help __P((char *)); - int com_cd __P((char *)); - int com_quit __P((char *)); - - /* A structure which contains information on the commands this program - can understand. */ - - typedef struct { - char *name; /* User printable name of the function. */ - rl_icpfunc_t *func; /* Function to call to do the job. */ - char *doc; /* Documentation for this function. */ - } COMMAND; - - COMMAND commands[] = { - { "cd", com_cd, "Change to directory DIR" }, - { "delete", com_delete, "Delete FILE" }, - { "help", com_help, "Display this text" }, - { "?", com_help, "Synonym for `help'" }, - { "list", com_list, "List files in DIR" }, - { "ls", com_list, "Synonym for `list'" }, - { "pwd", com_pwd, "Print the current working directory" }, - { "quit", com_quit, "Quit using Fileman" }, - { "rename", com_rename, "Rename FILE to NEWNAME" }, - { "stat", com_stat, "Print out statistics on FILE" }, - { "view", com_view, "View the contents of FILE" }, - { (char *)NULL, (rl_icpfunc_t *)NULL, (char *)NULL } - }; - - /* Forward declarations. */ - char *stripwhite (); - COMMAND *find_command (); - - /* The name of this program, as taken from argv[0]. */ - char *progname; - - /* When non-zero, this means the user is done using this program. */ - int done; - - char * - dupstr (s) - int s; - { - char *r; - - r = xmalloc (strlen (s) + 1); - strcpy (r, s); - return (r); - } - - main (argc, argv) - int argc; - char **argv; - { - char *line, *s; - - progname = argv[0]; - - initialize_readline (); /* Bind our completer. */ - - /* Loop reading and executing lines until the user quits. */ - for ( ; done == 0; ) - { - line = readline ("FileMan: "); - - if (!line) - break; - - /* Remove leading and trailing whitespace from the line. - Then, if there is anything left, add it to the history list - and execute it. */ - s = stripwhite (line); - - if (*s) - { - add_history (s); - execute_line (s); - } - - free (line); - } - exit (0); - } - - /* Execute a command line. */ - int - execute_line (line) - char *line; - { - register int i; - COMMAND *command; - char *word; - - /* Isolate the command word. */ - i = 0; - while (line[i] && whitespace (line[i])) - i++; - word = line + i; - - while (line[i] && !whitespace (line[i])) - i++; - - if (line[i]) - line[i++] = '\0'; - - command = find_command (word); - - if (!command) - { - fprintf (stderr, "%s: No such command for FileMan.\n", word); - return (-1); - } - - /* Get argument to command, if any. */ - while (whitespace (line[i])) - i++; - - word = line + i; - - /* Call the function. */ - return ((*(command->func)) (word)); - } - - /* Look up NAME as the name of a command, and return a pointer to that - command. Return a NULL pointer if NAME isn't a command name. */ - COMMAND * - find_command (name) - char *name; - { - register int i; - - for (i = 0; commands[i].name; i++) - if (strcmp (name, commands[i].name) == 0) - return (&commands[i]); - - return ((COMMAND *)NULL); - } - - /* Strip whitespace from the start and end of STRING. Return a pointer - into STRING. */ - char * - stripwhite (string) - char *string; - { - register char *s, *t; - - for (s = string; whitespace (*s); s++) - ; - - if (*s == 0) - return (s); - - t = s + strlen (s) - 1; - while (t > s && whitespace (*t)) - t--; - *++t = '\0'; - - return s; - } - - /* **************************************************************** */ - /* */ - /* Interface to Readline Completion */ - /* */ - /* **************************************************************** */ - - char *command_generator __P((const char *, int)); - char **fileman_completion __P((const char *, int, int)); - - /* Tell the GNU Readline library how to complete. We want to try to - complete on command names if this is the first word in the line, or - on filenames if not. */ - initialize_readline () - { - /* Allow conditional parsing of the ~/.inputrc file. */ - rl_readline_name = "FileMan"; - - /* Tell the completer that we want a crack first. */ - rl_attempted_completion_function = fileman_completion; - } - - /* Attempt to complete on the contents of TEXT. START and END - bound the region of rl_line_buffer that contains the word to - complete. TEXT is the word to complete. We can use the entire - contents of rl_line_buffer in case we want to do some simple - parsing. Returnthe array of matches, or NULL if there aren't any. */ - char ** - fileman_completion (text, start, end) - const char *text; - int start, end; - { - char **matches; - - matches = (char **)NULL; - - /* If this word is at the start of the line, then it is a command - to complete. Otherwise it is the name of a file in the current - directory. */ - if (start == 0) - matches = rl_completion_matches (text, command_generator); - - return (matches); - } - - /* Generator function for command completion. STATE lets us - know whether to start from scratch; without any state - (i.e. STATE == 0), then we start at the top of the list. */ - char * - command_generator (text, state) - const char *text; - int state; - { - static int list_index, len; - char *name; - - /* If this is a new word to complete, initialize now. This - includes saving the length of TEXT for efficiency, and - initializing the index variable to 0. */ - if (!state) - { - list_index = 0; - len = strlen (text); - } - - /* Return the next name which partially matches from the - command list. */ - while (name = commands[list_index].name) - { - list_index++; - - if (strncmp (name, text, len) == 0) - return (dupstr(name)); - } - - /* If no names matched, then return NULL. */ - return ((char *)NULL); - } - - /* **************************************************************** */ - /* */ - /* FileMan Commands */ - /* */ - /* **************************************************************** */ - - /* String to pass to system (). This is for the LIST, VIEW and RENAME - commands. */ - static char syscom[1024]; - - /* List the file(s) named in arg. */ - com_list (arg) - char *arg; - { - if (!arg) - arg = ""; - - sprintf (syscom, "ls -FClg %s", arg); - return (system (syscom)); - } - - com_view (arg) - char *arg; - { - if (!valid_argument ("view", arg)) - return 1; - - sprintf (syscom, "more %s", arg); - return (system (syscom)); - } - - com_rename (arg) - char *arg; - { - too_dangerous ("rename"); - return (1); - } - - com_stat (arg) - char *arg; - { - struct stat finfo; - - if (!valid_argument ("stat", arg)) - return (1); - - if (stat (arg, &finfo) == -1) - { - perror (arg); - return (1); - } - - printf ("Statistics for `%s':\n", arg); - - printf ("%s has %d link%s, and is %d byte%s in length.\n", arg, - finfo.st_nlink, - (finfo.st_nlink == 1) ? "" : "s", - finfo.st_size, - (finfo.st_size == 1) ? "" : "s"); - printf ("Inode Last Change at: %s", ctime (&finfo.st_ctime)); - printf (" Last access at: %s", ctime (&finfo.st_atime)); - printf (" Last modified at: %s", ctime (&finfo.st_mtime)); - return (0); - } - - com_delete (arg) - char *arg; - { - too_dangerous ("delete"); - return (1); - } - - /* Print out help for ARG, or for all of the commands if ARG is - not present. */ - com_help (arg) - char *arg; - { - register int i; - int printed = 0; - - for (i = 0; commands[i].name; i++) - { - if (!*arg || (strcmp (arg, commands[i].name) == 0)) - { - printf ("%s\t\t%s.\n", commands[i].name, commands[i].doc); - printed++; - } - } - - if (!printed) - { - printf ("No commands match `%s'. Possibilties are:\n", arg); - - for (i = 0; commands[i].name; i++) - { - /* Print in six columns. */ - if (printed == 6) - { - printed = 0; - printf ("\n"); - } - - printf ("%s\t", commands[i].name); - printed++; - } - - if (printed) - printf ("\n"); - } - return (0); - } - - /* Change to the directory ARG. */ - com_cd (arg) - char *arg; - { - if (chdir (arg) == -1) - { - perror (arg); - return 1; - } - - com_pwd (""); - return (0); - } - - /* Print out the current working directory. */ - com_pwd (ignore) - char *ignore; - { - char dir[1024], *s; - - s = getcwd (dir, sizeof(dir) - 1); - if (s == 0) - { - printf ("Error getting pwd: %s\n", dir); - return 1; - } - - printf ("Current directory is %s\n", dir); - return 0; - } - - /* The user wishes to quit using this program. Just set DONE - non-zero. */ - com_quit (arg) - char *arg; - { - done = 1; - return (0); - } - - /* Function which tells you that you can't do this. */ - too_dangerous (caller) - char *caller; - { - fprintf (stderr, - "%s: Too dangerous for me to distribute.\n" - caller); - fprintf (stderr, "Write it yourself.\n"); - } - - /* Return non-zero if ARG is a valid argument for CALLER, - else print an error message and return zero. */ - int - valid_argument (caller, arg) - char *caller, *arg; - { - if (!arg || !*arg) - { - fprintf (stderr, "%s: Argument required.\n", caller); - return (0); - } - - return (1); - } - - -File: readline.info, Node: Copying This Manual, Next: Concept Index, Prev: Programming with GNU Readline, Up: Top - -Copying This Manual -******************* - -* Menu: - -* GNU Free Documentation License:: License for copying this manual. - - -File: readline.info, Node: GNU Free Documentation License, Up: Copying This Manual - -GNU Free Documentation License -============================== - - Version 1.2, November 2002 - Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA - - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - 0. PREAMBLE - - The purpose of this License is to make a manual, textbook, or other - functional and useful document "free" in the sense of freedom: to - assure everyone the effective freedom to copy and redistribute it, - with or without modifying it, either commercially or - noncommercially. Secondarily, this License preserves for the - author and publisher a way to get credit for their work, while not - being considered responsible for modifications made by others. - - This License is a kind of "copyleft", which means that derivative - works of the document must themselves be free in the same sense. - It complements the GNU General Public License, which is a copyleft - license designed for free software. - - We have designed this License in order to use it for manuals for - free software, because free software needs free documentation: a - free program should come with manuals providing the same freedoms - that the software does. But this License is not limited to - software manuals; it can be used for any textual work, regardless - of subject matter or whether it is published as a printed book. - We recommend this License principally for works whose purpose is - instruction or reference. - - 1. APPLICABILITY AND DEFINITIONS - - This License applies to any manual or other work, in any medium, - that contains a notice placed by the copyright holder saying it - can be distributed under the terms of this License. Such a notice - grants a world-wide, royalty-free license, unlimited in duration, - to use that work under the conditions stated herein. The - "Document", below, refers to any such manual or work. Any member - of the public is a licensee, and is addressed as "you". You - accept the license if you copy, modify or distribute the work in a - way requiring permission under copyright law. - - A "Modified Version" of the Document means any work containing the - Document or a portion of it, either copied verbatim, or with - modifications and/or translated into another language. - - A "Secondary Section" is a named appendix or a front-matter section - of the Document that deals exclusively with the relationship of the - publishers or authors of the Document to the Document's overall - subject (or to related matters) and contains nothing that could - fall directly within that overall subject. (Thus, if the Document - is in part a textbook of mathematics, a Secondary Section may not - explain any mathematics.) The relationship could be a matter of - historical connection with the subject or with related matters, or - of legal, commercial, philosophical, ethical or political position - regarding them. - - The "Invariant Sections" are certain Secondary Sections whose - titles are designated, as being those of Invariant Sections, in - the notice that says that the Document is released under this - License. If a section does not fit the above definition of - Secondary then it is not allowed to be designated as Invariant. - The Document may contain zero Invariant Sections. If the Document - does not identify any Invariant Sections then there are none. - - The "Cover Texts" are certain short passages of text that are - listed, as Front-Cover Texts or Back-Cover Texts, in the notice - that says that the Document is released under this License. A - Front-Cover Text may be at most 5 words, and a Back-Cover Text may - be at most 25 words. - - A "Transparent" copy of the Document means a machine-readable copy, - represented in a format whose specification is available to the - general public, that is suitable for revising the document - straightforwardly with generic text editors or (for images - composed of pixels) generic paint programs or (for drawings) some - widely available drawing editor, and that is suitable for input to - text formatters or for automatic translation to a variety of - formats suitable for input to text formatters. A copy made in an - otherwise Transparent file format whose markup, or absence of - markup, has been arranged to thwart or discourage subsequent - modification by readers is not Transparent. An image format is - not Transparent if used for any substantial amount of text. A - copy that is not "Transparent" is called "Opaque". - - Examples of suitable formats for Transparent copies include plain - ASCII without markup, Texinfo input format, LaTeX input format, - SGML or XML using a publicly available DTD, and - standard-conforming simple HTML, PostScript or PDF designed for - human modification. Examples of transparent image formats include - PNG, XCF and JPG. Opaque formats include proprietary formats that - can be read and edited only by proprietary word processors, SGML or - XML for which the DTD and/or processing tools are not generally - available, and the machine-generated HTML, PostScript or PDF - produced by some word processors for output purposes only. - - The "Title Page" means, for a printed book, the title page itself, - plus such following pages as are needed to hold, legibly, the - material this License requires to appear in the title page. For - works in formats which do not have any title page as such, "Title - Page" means the text near the most prominent appearance of the - work's title, preceding the beginning of the body of the text. - - A section "Entitled XYZ" means a named subunit of the Document - whose title either is precisely XYZ or contains XYZ in parentheses - following text that translates XYZ in another language. (Here XYZ - stands for a specific section name mentioned below, such as - "Acknowledgements", "Dedications", "Endorsements", or "History".) - To "Preserve the Title" of such a section when you modify the - Document means that it remains a section "Entitled XYZ" according - to this definition. - - The Document may include Warranty Disclaimers next to the notice - which states that this License applies to the Document. These - Warranty Disclaimers are considered to be included by reference in - this License, but only as regards disclaiming warranties: any other - implication that these Warranty Disclaimers may have is void and - has no effect on the meaning of this License. - - 2. VERBATIM COPYING - - You may copy and distribute the Document in any medium, either - commercially or noncommercially, provided that this License, the - copyright notices, and the license notice saying this License - applies to the Document are reproduced in all copies, and that you - add no other conditions whatsoever to those of this License. You - may not use technical measures to obstruct or control the reading - or further copying of the copies you make or distribute. However, - you may accept compensation in exchange for copies. If you - distribute a large enough number of copies you must also follow - the conditions in section 3. - - You may also lend copies, under the same conditions stated above, - and you may publicly display copies. - - 3. COPYING IN QUANTITY - - If you publish printed copies (or copies in media that commonly - have printed covers) of the Document, numbering more than 100, and - the Document's license notice requires Cover Texts, you must - enclose the copies in covers that carry, clearly and legibly, all - these Cover Texts: Front-Cover Texts on the front cover, and - Back-Cover Texts on the back cover. Both covers must also clearly - and legibly identify you as the publisher of these copies. The - front cover must present the full title with all words of the - title equally prominent and visible. You may add other material - on the covers in addition. Copying with changes limited to the - covers, as long as they preserve the title of the Document and - satisfy these conditions, can be treated as verbatim copying in - other respects. - - If the required texts for either cover are too voluminous to fit - legibly, you should put the first ones listed (as many as fit - reasonably) on the actual cover, and continue the rest onto - adjacent pages. - - If you publish or distribute Opaque copies of the Document - numbering more than 100, you must either include a - machine-readable Transparent copy along with each Opaque copy, or - state in or with each Opaque copy a computer-network location from - which the general network-using public has access to download - using public-standard network protocols a complete Transparent - copy of the Document, free of added material. If you use the - latter option, you must take reasonably prudent steps, when you - begin distribution of Opaque copies in quantity, to ensure that - this Transparent copy will remain thus accessible at the stated - location until at least one year after the last time you - distribute an Opaque copy (directly or through your agents or - retailers) of that edition to the public. - - It is requested, but not required, that you contact the authors of - the Document well before redistributing any large number of - copies, to give them a chance to provide you with an updated - version of the Document. - - 4. MODIFICATIONS - - You may copy and distribute a Modified Version of the Document - under the conditions of sections 2 and 3 above, provided that you - release the Modified Version under precisely this License, with - the Modified Version filling the role of the Document, thus - licensing distribution and modification of the Modified Version to - whoever possesses a copy of it. In addition, you must do these - things in the Modified Version: - - A. Use in the Title Page (and on the covers, if any) a title - distinct from that of the Document, and from those of - previous versions (which should, if there were any, be listed - in the History section of the Document). You may use the - same title as a previous version if the original publisher of - that version gives permission. - - B. List on the Title Page, as authors, one or more persons or - entities responsible for authorship of the modifications in - the Modified Version, together with at least five of the - principal authors of the Document (all of its principal - authors, if it has fewer than five), unless they release you - from this requirement. - - C. State on the Title page the name of the publisher of the - Modified Version, as the publisher. - - D. Preserve all the copyright notices of the Document. - - E. Add an appropriate copyright notice for your modifications - adjacent to the other copyright notices. - - F. Include, immediately after the copyright notices, a license - notice giving the public permission to use the Modified - Version under the terms of this License, in the form shown in - the Addendum below. - - G. Preserve in that license notice the full lists of Invariant - Sections and required Cover Texts given in the Document's - license notice. - - H. Include an unaltered copy of this License. - - I. Preserve the section Entitled "History", Preserve its Title, - and add to it an item stating at least the title, year, new - authors, and publisher of the Modified Version as given on - the Title Page. If there is no section Entitled "History" in - the Document, create one stating the title, year, authors, - and publisher of the Document as given on its Title Page, - then add an item describing the Modified Version as stated in - the previous sentence. - - J. Preserve the network location, if any, given in the Document - for public access to a Transparent copy of the Document, and - likewise the network locations given in the Document for - previous versions it was based on. These may be placed in - the "History" section. You may omit a network location for a - work that was published at least four years before the - Document itself, or if the original publisher of the version - it refers to gives permission. - - K. For any section Entitled "Acknowledgements" or "Dedications", - Preserve the Title of the section, and preserve in the - section all the substance and tone of each of the contributor - acknowledgements and/or dedications given therein. - - L. Preserve all the Invariant Sections of the Document, - unaltered in their text and in their titles. Section numbers - or the equivalent are not considered part of the section - titles. - - M. Delete any section Entitled "Endorsements". Such a section - may not be included in the Modified Version. - - N. Do not retitle any existing section to be Entitled - "Endorsements" or to conflict in title with any Invariant - Section. - - O. Preserve any Warranty Disclaimers. - - If the Modified Version includes new front-matter sections or - appendices that qualify as Secondary Sections and contain no - material copied from the Document, you may at your option - designate some or all of these sections as invariant. To do this, - add their titles to the list of Invariant Sections in the Modified - Version's license notice. These titles must be distinct from any - other section titles. - - You may add a section Entitled "Endorsements", provided it contains - nothing but endorsements of your Modified Version by various - parties--for example, statements of peer review or that the text - has been approved by an organization as the authoritative - definition of a standard. - - You may add a passage of up to five words as a Front-Cover Text, - and a passage of up to 25 words as a Back-Cover Text, to the end - of the list of Cover Texts in the Modified Version. Only one - passage of Front-Cover Text and one of Back-Cover Text may be - added by (or through arrangements made by) any one entity. If the - Document already includes a cover text for the same cover, - previously added by you or by arrangement made by the same entity - you are acting on behalf of, you may not add another; but you may - replace the old one, on explicit permission from the previous - publisher that added the old one. - - The author(s) and publisher(s) of the Document do not by this - License give permission to use their names for publicity for or to - assert or imply endorsement of any Modified Version. - - 5. COMBINING DOCUMENTS - - You may combine the Document with other documents released under - this License, under the terms defined in section 4 above for - modified versions, provided that you include in the combination - all of the Invariant Sections of all of the original documents, - unmodified, and list them all as Invariant Sections of your - combined work in its license notice, and that you preserve all - their Warranty Disclaimers. - - The combined work need only contain one copy of this License, and - multiple identical Invariant Sections may be replaced with a single - copy. If there are multiple Invariant Sections with the same name - but different contents, make the title of each such section unique - by adding at the end of it, in parentheses, the name of the - original author or publisher of that section if known, or else a - unique number. Make the same adjustment to the section titles in - the list of Invariant Sections in the license notice of the - combined work. - - In the combination, you must combine any sections Entitled - "History" in the various original documents, forming one section - Entitled "History"; likewise combine any sections Entitled - "Acknowledgements", and any sections Entitled "Dedications". You - must delete all sections Entitled "Endorsements." - - 6. COLLECTIONS OF DOCUMENTS - - You may make a collection consisting of the Document and other - documents released under this License, and replace the individual - copies of this License in the various documents with a single copy - that is included in the collection, provided that you follow the - rules of this License for verbatim copying of each of the - documents in all other respects. - - You may extract a single document from such a collection, and - distribute it individually under this License, provided you insert - a copy of this License into the extracted document, and follow - this License in all other respects regarding verbatim copying of - that document. - - 7. AGGREGATION WITH INDEPENDENT WORKS - - A compilation of the Document or its derivatives with other - separate and independent documents or works, in or on a volume of - a storage or distribution medium, is called an "aggregate" if the - copyright resulting from the compilation is not used to limit the - legal rights of the compilation's users beyond what the individual - works permit. When the Document is included an aggregate, this - License does not apply to the other works in the aggregate which - are not themselves derivative works of the Document. - - If the Cover Text requirement of section 3 is applicable to these - copies of the Document, then if the Document is less than one half - of the entire aggregate, the Document's Cover Texts may be placed - on covers that bracket the Document within the aggregate, or the - electronic equivalent of covers if the Document is in electronic - form. Otherwise they must appear on printed covers that bracket - the whole aggregate. - - 8. TRANSLATION - - Translation is considered a kind of modification, so you may - distribute translations of the Document under the terms of section - 4. Replacing Invariant Sections with translations requires special - permission from their copyright holders, but you may include - translations of some or all Invariant Sections in addition to the - original versions of these Invariant Sections. You may include a - translation of this License, and all the license notices in the - Document, and any Warranty Disclaimers, provided that you also - include the original English version of this License and the - original versions of those notices and disclaimers. In case of a - disagreement between the translation and the original version of - this License or a notice or disclaimer, the original version will - prevail. - - If a section in the Document is Entitled "Acknowledgements", - "Dedications", or "History", the requirement (section 4) to - Preserve its Title (section 1) will typically require changing the - actual title. - - 9. TERMINATION - - You may not copy, modify, sublicense, or distribute the Document - except as expressly provided for under this License. Any other - attempt to copy, modify, sublicense or distribute the Document is - void, and will automatically terminate your rights under this - License. However, parties who have received copies, or rights, - from you under this License will not have their licenses - terminated so long as such parties remain in full compliance. - - 10. FUTURE REVISIONS OF THIS LICENSE - - The Free Software Foundation may publish new, revised versions of - the GNU Free Documentation License from time to time. Such new - versions will be similar in spirit to the present version, but may - differ in detail to address new problems or concerns. See - `http://www.gnu.org/copyleft/'. - - Each version of the License is given a distinguishing version - number. If the Document specifies that a particular numbered - version of this License "or any later version" applies to it, you - have the option of following the terms and conditions either of - that specified version or of any later version that has been - published (not as a draft) by the Free Software Foundation. If - the Document does not specify a version number of this License, - you may choose any version ever published (not as a draft) by the - Free Software Foundation. - -ADDENDUM: How to use this License for your documents ----------------------------------------------------- - - To use this License in a document you have written, include a copy of -the License in the document and put the following copyright and license -notices just after the title page: - - Copyright (C) YEAR YOUR NAME. - Permission is granted to copy, distribute and/or modify this document - under the terms of the GNU Free Documentation License, Version 1.2 - or any later version published by the Free Software Foundation; - with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. - A copy of the license is included in the section entitled ``GNU - Free Documentation License''. - - If you have Invariant Sections, Front-Cover Texts and Back-Cover -Texts, replace the "with...Texts." line with this: - - with the Invariant Sections being LIST THEIR TITLES, with - the Front-Cover Texts being LIST, and with the Back-Cover Texts - being LIST. - - If you have Invariant Sections without Cover Texts, or some other -combination of the three, merge those two alternatives to suit the -situation. - - If your document contains nontrivial examples of program code, we -recommend releasing these examples in parallel under your choice of -free software license, such as the GNU General Public License, to -permit their use in free software. - - -File: readline.info, Node: Concept Index, Next: Function and Variable Index, Prev: Copying This Manual, Up: Top - -Concept Index -************* - -* Menu: - -* application-specific completion functions: Custom Completers. -* command editing: Readline Bare Essentials. -* editing command lines: Readline Bare Essentials. -* FDL, GNU Free Documentation License: GNU Free Documentation License. -* initialization file, readline: Readline Init File. -* interaction, readline: Readline Interaction. -* kill ring: Readline Killing Commands. -* killing text: Readline Killing Commands. -* notation, readline: Readline Bare Essentials. -* readline, function: Basic Behavior. -* variables, readline: Readline Init File Syntax. -* yanking text: Readline Killing Commands. - - -File: readline.info, Node: Function and Variable Index, Prev: Concept Index, Up: Top - -Function and Variable Index -*************************** - -* Menu: - -* _rl_digit_p: Utility Functions. -* _rl_digit_value: Utility Functions. -* _rl_lowercase_p: Utility Functions. -* _rl_to_lower: Utility Functions. -* _rl_to_upper: Utility Functions. -* _rl_uppercase_p: Utility Functions. -* abort (C-g): Miscellaneous Commands. -* accept-line (Newline or Return): Commands For History. -* backward-char (C-b): Commands For Moving. -* backward-delete-char (Rubout): Commands For Text. -* backward-kill-line (C-x Rubout): Commands For Killing. -* backward-kill-word (M-): Commands For Killing. -* backward-word (M-b): Commands For Moving. -* beginning-of-history (M-<): Commands For History. -* beginning-of-line (C-a): Commands For Moving. -* bell-style: Readline Init File Syntax. -* call-last-kbd-macro (C-x e): Keyboard Macros. -* capitalize-word (M-c): Commands For Text. -* character-search (C-]): Miscellaneous Commands. -* character-search-backward (M-C-]): Miscellaneous Commands. -* clear-screen (C-l): Commands For Moving. -* comment-begin: Readline Init File Syntax. -* complete (): Commands For Completion. -* completion-query-items: Readline Init File Syntax. -* convert-meta: Readline Init File Syntax. -* copy-backward-word (): Commands For Killing. -* copy-forward-word (): Commands For Killing. -* copy-region-as-kill (): Commands For Killing. -* delete-char (C-d): Commands For Text. -* delete-char-or-list (): Commands For Completion. -* delete-horizontal-space (): Commands For Killing. -* digit-argument (M-0, M-1, ... M--): Numeric Arguments. -* disable-completion: Readline Init File Syntax. -* do-uppercase-version (M-a, M-b, M-X, ...): Miscellaneous Commands. -* downcase-word (M-l): Commands For Text. -* dump-functions (): Miscellaneous Commands. -* dump-macros (): Miscellaneous Commands. -* dump-variables (): Miscellaneous Commands. -* editing-mode: Readline Init File Syntax. -* enable-keypad: Readline Init File Syntax. -* end-kbd-macro (C-x )): Keyboard Macros. -* end-of-history (M->): Commands For History. -* end-of-line (C-e): Commands For Moving. -* exchange-point-and-mark (C-x C-x): Miscellaneous Commands. -* expand-tilde: Readline Init File Syntax. -* forward-backward-delete-char (): Commands For Text. -* forward-char (C-f): Commands For Moving. -* forward-search-history (C-s): Commands For History. -* forward-word (M-f): Commands For Moving. -* history-preserve-point: Readline Init File Syntax. -* history-search-backward (): Commands For History. -* history-search-forward (): Commands For History. -* horizontal-scroll-mode: Readline Init File Syntax. -* input-meta: Readline Init File Syntax. -* insert-comment (M-#): Miscellaneous Commands. -* insert-completions (M-*): Commands For Completion. -* isearch-terminators: Readline Init File Syntax. -* keymap: Readline Init File Syntax. -* kill-line (C-k): Commands For Killing. -* kill-region (): Commands For Killing. -* kill-whole-line (): Commands For Killing. -* kill-word (M-d): Commands For Killing. -* mark-modified-lines: Readline Init File Syntax. -* mark-symlinked-directories: Readline Init File Syntax. -* match-hidden-files: Readline Init File Syntax. -* menu-complete (): Commands For Completion. -* meta-flag: Readline Init File Syntax. -* next-history (C-n): Commands For History. -* non-incremental-forward-search-history (M-n): Commands For History. -* non-incremental-reverse-search-history (M-p): Commands For History. -* output-meta: Readline Init File Syntax. -* overwrite-mode (): Commands For Text. -* page-completions: Readline Init File Syntax. -* possible-completions (M-?): Commands For Completion. -* prefix-meta (): Miscellaneous Commands. -* previous-history (C-p): Commands For History. -* quoted-insert (C-q or C-v): Commands For Text. -* re-read-init-file (C-x C-r): Miscellaneous Commands. -* readline: Basic Behavior. -* redraw-current-line (): Commands For Moving. -* reverse-search-history (C-r): Commands For History. -* revert-line (M-r): Miscellaneous Commands. -* rl_add_defun: Function Naming. -* rl_add_funmap_entry: Associating Function Names and Bindings. -* rl_add_undo: Allowing Undoing. -* rl_alphabetic: Utility Functions. -* rl_already_prompted: Readline Variables. -* rl_attempted_completion_function: Completion Variables. -* rl_attempted_completion_over: Completion Variables. -* rl_basic_quote_characters: Completion Variables. -* rl_basic_word_break_characters: Completion Variables. -* rl_begin_undo_group: Allowing Undoing. -* rl_bind_key: Binding Keys. -* rl_bind_key_if_unbound: Binding Keys. -* rl_bind_key_if_unbound_in_map: Binding Keys. -* rl_bind_key_in_map: Binding Keys. -* rl_bind_keyseq: Binding Keys. -* rl_bind_keyseq_if_unbound: Binding Keys. -* rl_bind_keyseq_if_unbound_in_map: Binding Keys. -* rl_bind_keyseq_in_map: Binding Keys. -* rl_binding_keymap: Readline Variables. -* rl_callback_handler_install: Alternate Interface. -* rl_callback_handler_remove: Alternate Interface. -* rl_callback_read_char: Alternate Interface. -* rl_catch_signals: Readline Signal Handling. -* rl_catch_sigwinch: Readline Signal Handling. -* rl_char_is_quoted_p: Completion Variables. -* rl_cleanup_after_signal: Readline Signal Handling. -* rl_clear_message: Redisplay. -* rl_clear_pending_input: Character Input. -* rl_clear_signals: Readline Signal Handling. -* rl_complete <1>: How Completing Works. -* rl_complete: Completion Functions. -* rl_complete_internal: Completion Functions. -* rl_completer_quote_characters: Completion Variables. -* rl_completer_word_break_characters: Completion Variables. -* rl_completion_append_character: Completion Variables. -* rl_completion_display_matches_hook: Completion Variables. -* rl_completion_entry_function <1>: Completion Variables. -* rl_completion_entry_function: How Completing Works. -* rl_completion_found_quote: Completion Variables. -* rl_completion_mark_symlink_dirs: Completion Variables. -* rl_completion_matches: Completion Functions. -* rl_completion_mode: Completion Functions. -* rl_completion_query_items: Completion Variables. -* rl_completion_quote_character: Completion Variables. -* rl_completion_suppress_append: Completion Variables. -* rl_completion_suppress_quote: Completion Variables. -* rl_completion_type: Completion Variables. -* rl_completion_word_break_hook: Completion Variables. -* rl_copy_keymap: Keymaps. -* rl_copy_text: Modifying Text. -* rl_crlf: Redisplay. -* rl_delete_text: Modifying Text. -* rl_deprep_term_function: Readline Variables. -* rl_deprep_terminal: Terminal Management. -* rl_ding: Utility Functions. -* rl_directory_completion_hook: Completion Variables. -* rl_discard_keymap: Keymaps. -* rl_dispatching: Readline Variables. -* rl_display_match_list: Utility Functions. -* rl_do_undo: Allowing Undoing. -* rl_done: Readline Variables. -* rl_editing_mode: Readline Variables. -* rl_end: Readline Variables. -* rl_end_undo_group: Allowing Undoing. -* rl_erase_empty_line: Readline Variables. -* rl_event_hook: Readline Variables. -* rl_execute_next: Character Input. -* rl_executing_keymap: Readline Variables. -* rl_executing_macro: Readline Variables. -* rl_expand_prompt: Redisplay. -* rl_explicit_arg: Readline Variables. -* rl_extend_line_buffer: Utility Functions. -* rl_filename_completion_desired: Completion Variables. -* rl_filename_completion_function: Completion Functions. -* rl_filename_dequoting_function: Completion Variables. -* rl_filename_quote_characters: Completion Variables. -* rl_filename_quoting_desired: Completion Variables. -* rl_filename_quoting_function: Completion Variables. -* rl_forced_update_display: Redisplay. -* rl_free_line_state: Readline Signal Handling. -* rl_free_undo_list: Allowing Undoing. -* rl_function_dumper: Associating Function Names and Bindings. -* rl_function_of_keyseq: Associating Function Names and Bindings. -* rl_funmap_names: Associating Function Names and Bindings. -* rl_generic_bind: Binding Keys. -* rl_get_keymap: Keymaps. -* rl_get_keymap_by_name: Keymaps. -* rl_get_keymap_name: Keymaps. -* rl_get_screen_size: Readline Signal Handling. -* rl_get_termcap: Miscellaneous Functions. -* rl_getc: Character Input. -* rl_getc_function: Readline Variables. -* rl_gnu_readline_p: Readline Variables. -* rl_ignore_completion_duplicates: Completion Variables. -* rl_ignore_some_completions_function: Completion Variables. -* rl_inhibit_completion: Completion Variables. -* rl_initialize: Utility Functions. -* rl_insert_completions: Completion Functions. -* rl_insert_text: Modifying Text. -* rl_instream: Readline Variables. -* rl_invoking_keyseqs: Associating Function Names and Bindings. -* rl_invoking_keyseqs_in_map: Associating Function Names and Bindings. -* rl_kill_text: Modifying Text. -* rl_last_func: Readline Variables. -* rl_library_version: Readline Variables. -* rl_line_buffer: Readline Variables. -* rl_list_funmap_names: Associating Function Names and Bindings. -* rl_macro_bind: Miscellaneous Functions. -* rl_macro_dumper: Miscellaneous Functions. -* rl_make_bare_keymap: Keymaps. -* rl_make_keymap: Keymaps. -* rl_mark: Readline Variables. -* rl_message: Redisplay. -* rl_modifying: Allowing Undoing. -* rl_named_function: Associating Function Names and Bindings. -* rl_num_chars_to_read: Readline Variables. -* rl_numeric_arg: Readline Variables. -* rl_on_new_line: Redisplay. -* rl_on_new_line_with_prompt: Redisplay. -* rl_outstream: Readline Variables. -* rl_parse_and_bind: Binding Keys. -* rl_pending_input: Readline Variables. -* rl_point: Readline Variables. -* rl_possible_completions: Completion Functions. -* rl_pre_input_hook: Readline Variables. -* rl_prep_term_function: Readline Variables. -* rl_prep_terminal: Terminal Management. -* rl_prompt: Readline Variables. -* rl_push_macro_input: Modifying Text. -* rl_read_init_file: Binding Keys. -* rl_read_key: Character Input. -* rl_readline_name: Readline Variables. -* rl_readline_state: Readline Variables. -* rl_readline_version: Readline Variables. -* rl_redisplay: Redisplay. -* rl_redisplay_function: Readline Variables. -* rl_replace_line: Utility Functions. -* rl_reset_after_signal: Readline Signal Handling. -* rl_reset_line_state: Redisplay. -* rl_reset_terminal: Terminal Management. -* rl_resize_terminal: Readline Signal Handling. -* rl_restore_prompt: Redisplay. -* rl_save_prompt: Redisplay. -* rl_set_key: Binding Keys. -* rl_set_keyboard_input_timeout: Character Input. -* rl_set_keymap: Keymaps. -* rl_set_paren_blink_timeout: Miscellaneous Functions. -* rl_set_prompt: Redisplay. -* rl_set_screen_size: Readline Signal Handling. -* rl_set_signals: Readline Signal Handling. -* rl_show_char: Redisplay. -* rl_special_prefixes: Completion Variables. -* rl_startup_hook: Readline Variables. -* rl_stuff_char: Character Input. -* rl_terminal_name: Readline Variables. -* rl_tty_set_default_bindings: Terminal Management. -* rl_tty_unset_default_bindings: Terminal Management. -* rl_unbind_command_in_map: Binding Keys. -* rl_unbind_function_in_map: Binding Keys. -* rl_unbind_key: Binding Keys. -* rl_unbind_key_in_map: Binding Keys. -* rl_username_completion_function: Completion Functions. -* rl_variable_bind: Miscellaneous Functions. -* rl_variable_dumper: Miscellaneous Functions. -* self-insert (a, b, A, 1, !, ...): Commands For Text. -* set-mark (C-@): Miscellaneous Commands. -* show-all-if-ambiguous: Readline Init File Syntax. -* show-all-if-unmodified: Readline Init File Syntax. -* start-kbd-macro (C-x (): Keyboard Macros. -* transpose-chars (C-t): Commands For Text. -* transpose-words (M-t): Commands For Text. -* undo (C-_ or C-x C-u): Miscellaneous Commands. -* universal-argument (): Numeric Arguments. -* unix-filename-rubout (): Commands For Killing. -* unix-line-discard (C-u): Commands For Killing. -* unix-word-rubout (C-w): Commands For Killing. -* upcase-word (M-u): Commands For Text. -* visible-stats: Readline Init File Syntax. -* yank (C-y): Commands For Killing. -* yank-last-arg (M-. or M-_): Commands For History. -* yank-nth-arg (M-C-y): Commands For History. -* yank-pop (M-y): Commands For Killing. - - - -Tag Table: -Node: Top1336 -Node: Command Line Editing1977 -Node: Introduction and Notation2628 -Node: Readline Interaction4246 -Node: Readline Bare Essentials5433 -Node: Readline Movement Commands7214 -Node: Readline Killing Commands8171 -Node: Readline Arguments10081 -Node: Searching11117 -Node: Readline Init File13260 -Node: Readline Init File Syntax14321 -Node: Conditional Init Constructs25684 -Node: Sample Init File28209 -Node: Bindable Readline Commands31393 -Node: Commands For Moving32443 -Node: Commands For History33293 -Node: Commands For Text36152 -Node: Commands For Killing38867 -Node: Numeric Arguments40998 -Node: Commands For Completion42126 -Node: Keyboard Macros43659 -Node: Miscellaneous Commands44219 -Node: Readline vi Mode47569 -Node: Programming with GNU Readline49387 -Node: Basic Behavior50361 -Node: Custom Functions53791 -Node: Readline Typedefs55269 -Node: Function Writing56899 -Node: Readline Variables58107 -Node: Readline Convenience Functions67530 -Node: Function Naming68512 -Node: Keymaps69764 -Node: Binding Keys71520 -Node: Associating Function Names and Bindings76042 -Node: Allowing Undoing78287 -Node: Redisplay80822 -Node: Modifying Text84256 -Node: Character Input85485 -Node: Terminal Management87265 -Node: Utility Functions88684 -Node: Miscellaneous Functions91023 -Node: Alternate Interface93087 -Node: A Readline Example95232 -Node: Readline Signal Handling97169 -Node: Custom Completers102772 -Node: How Completing Works103487 -Node: Completion Functions106790 -Node: Completion Variables110345 -Node: A Short Completion Example122415 -Node: Copying This Manual134968 -Node: GNU Free Documentation License135208 -Node: Concept Index157602 -Node: Function and Variable Index158551 - -End Tag Table diff --git a/dep/src/readline/src/doc/readline.pdf b/dep/src/readline/src/doc/readline.pdf deleted file mode 100644 index 7fc2dfeddaaa9dbe6d407805664c6d12f2d9f04a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 311657 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

y#3)d?|D%B6^ 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 z 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 z zo}`i2wk(qf>sQ1hRf)Ll*w8=S<;Js!6Sw|K1w##rwP@w3iQL&y?{kdodo&sg7fofJ zvr4e4Pl`Ih-Ll|{x`rEcx>s<_NL2MB3`D3*K>YSscblW|GXHHVt0^`O6!*_T5v%zr z3BRHq4^UY@lUwcd4Z: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�=xVgP#*H>8& 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 diff --git a/dep/src/readline/src/doc/readline_3.ps b/dep/src/readline/src/doc/readline_3.ps deleted file mode 100644 index 8ce4b473b26f34fa9a2f627e04dcf87903da953c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75755 zcmc${ZFd{Vk*56}zXGe7Sr=zTf&c-KY&pzXG>=sd#nUxtC?-3dKFaP7^@#dqm`N?#1XKTCjFaL6|m`-ly zi!Zuw7W4D-?z`z?Ih$W~`&<3}@|NFUPj04PbYI<0yT81>>JIk1{r(r*gD-}=-NE+u zkcMB+Pj4@$S2r)F)3fQ>(R4Y#U7SvrUv$ssS2x{Pv&-pn^JsoKxuWg=YCrsHesQ+` z?CH(qVs_d*Jz%iebkX|E@$L2X#cbt6*Nge-a(bh6TrWNUuGaT*@Ym)l=+r`|D>UJEymc1=Gkkotp*Q)wJyVd3N6EC3FVc-Lu*0P512fx_hE2 zcY4PM-JL=AY)Yd?z2)2a`|ibjauyH1`f5Xt&tI;;{|S@*)!jb#&iL6U+WmxSKmYL)^LAUF#6AtP=Iy^3a zzI;~xdR9Ms{^-T`kDmS5S;G8omu4Gg89li9?d0Mdj^7PlgB+Q5#a3Hudim_hkDWKm z$-8OyYWn_qa`U!(dNI59ANtS9$@~L6d%9HTj^PV0>rT$jg2=?!TEl(y^2bgur|&_< zu=;}a#q4T&I=OCs{9z7T+Z}YZytCOm^Sb5fSaPKI+Vxp<1*3nw>j-(Fp?6UxJgE>z&zr zeb7u8lpAk%nKqj>Urx1A?X|sn-o2dMEM^}9fxbTcvBRU3Klw%*SA#U5SYv=tZ)?PV z?tX=F*vuHC{mG+)-hvNUFf@Yc=vi-(3u+!7zv{*6S`zH}t6uV$rrp7_UcI_j)5i;N zeR{Kab8?DIUUbiA7Z>fB@b2{T;}7w&C4PI4e{jd<n!ms5Ud?ZQ>W zhuh^%TY)^E!1eT*c7xCxd5BWBxL(Xq=UYf$cd6gHeKNjIPcS=$ecfn}kRYc&7%;cX z>7tP&Oez`ZkAD`}G)J-1v+29p=`^0Tw&o>U^JC}qVmeuL*2dQ7;GsXVaerP+uQ6?c zRU;6W?01N9Oq`%3gpJv4LyxWjb@Ak*7?d^W|^7f*Jw$uXH$#Hjg&|!;v$Xl6L`V&nf zut+}+UmR@zwl`Ux&Ss}G82)AaeKWf_oA!=RCyV)2??3$y`xZa{6#x9@3=?s>oGp7$ z&)M{HviPC*$J_Z0kFMTaOnZm7i+OJg{-n?3zn${O|JQ&2e;jCuJvZ&aA1)@Bv7ob) zi{91k<%vx7H&?wg46@0hcRj`6M)mAXF8Omg0p4EzV)o|kP49YwX?QU`&%ff~WC@Fy zEq~};U)(Nxr&zI*-rJAYZ>N}pj4_*^^-zeGZ+m~50=xOuw0HA<-n)6bm`;1=*yKp7 zchlZ-_5p%@H@)gj{i!QhFoRvp8D%-WocT{!<8s-X{t<-{8x*pcE|?xPi8|OQdz3bi|dkEUzP4Bk%uJ^w8q4%-V`;$LB&Cf34S9~t;v|w3-ekYUVwD;x~ z;Xb{bd%~FF9Z!MRz^2Z;5J+i6y_V(({WN~|WF}Vd{Xf-(%?ywT}u^05jEZ+3y zZ`k#uBR=RQdsY01Y0sy<3&XurBc~Vp?P2d(>_>q{pzs-5LeC!)@*&UO^g@cCe(Ze| z;+;rKzB&P;m(u`2P1vXN>yP=>#o0NiWmFR!P2-v!#=-o}3@sl*@6iCfUf|!*x29)U zET>{1XH!scYOIeYp!M?B7{BNQewUxU$?5IQw0C(c3Yq}D>$gc7T7w5Y#d8D&iatuO zPH(CtM_5u?P;`m8f~67Z92WDb)&AkQfXxXBh$VVYqxZDcn;lHqF^e{{Xp=HX?4vg;Z5RkpT*U|H(S9E7 z=dCg4*`Rdmp#sjB;ykJ4HhSJh&)Zhd+q%ogcnJeoT=hPd$G<~@vBTjM{kQF|WM=t^ zwc87CYl!sny8Vncoopo4V6};!G=tb>yV}5yG=w#x+HWac2RCcCUvwiYKhvAr>&{m% zv#oR_Kj}T*?)JBH4&@uikGng=!PcNUI(+o?v!^c(UspS?H~3QP*9P|daIbsRd))8z zx3~63tLtEh&8&Ab@E1?I{(Zif zU-GvUQ@ooPIN-z$+-ak~z1Q6zcfadC?pMdZdGYPbM?k|?;zVofOUwWkeV5m-=*84@g*ct0ZmGkQ@Ha55Vd)>qGKm+8HX6VHR zP}sw{y|>c$E&Oi2_*mLU*WE6%6%(XPwZ@O*#~lV9Ri|%bBID847`ROq-GANSxd1l+ zto=QJ7cF*oqlFVUCzOFU~nDzYFsZQrt7#F7-kE*vC>DuezT{XYFzF}rVx7)5> zZ~T1Ykzjl9?aSXBJ$>@cs{ro)aBC=_Z&ycU%Vx{&!Tj1&7;KOAx>JQb&~Acy`+NJ^ zR)r+GCm*{vZ>QbIF#7KC{QTy8wIxuruQEail?e(WXaeB2>|Mr`|WlgS5MD3MtbY5 z(-0n^vpzyKTV@w_Y*4-U{@JtU_jWbUevGm;9CRwpd&+k{%6G&xA7bq1r@L&;Y`MIh zo^8eU40nOck^1#J)hjxh#$utk3u%s>KR-ncJTtX1-{C+j-l;DAhKcMC*e?(uM=>|} zxi=N@egTS%&wLVVy&Q0 zXRvERTP34ve!j7@wJV0z-x}<9s&kaq!i~CkI438w3s}>1i5)(>0GF7**%nZ>PQu>Q zQ_!bbz~c^M?d?}zeU!j9S;@odRX^pJ~hAG)OzX6rd*w|XVA_Pj{@dK7Z)O8 z33mbO#n?J!kzz#y5cj(-_*Ol72PmI(s+mY~dGnE(8YanC@diNz=Np@}60)*QaO%yuoP#Flq_b0j ziTQe>JKJK!M~a)+3q@!dhS^?c(Xzj{lM>r%e%^V=({sDvva3(bFH z)2)H+%Iw{-0&uM0=UDsT%V5+ozKc4Zy!gIbv$>ieS?-G3L)+u7NH&3{)t zdiMR{#%6zOxNAPYg2G5_ON+Z4u)npvkH8RT3lf7ycD6==b-cPmDHC{y1re~LA;|jZ z1Vr85?>+%fxA}cBx%#2aNMhVJO9I>7wPPMgXRw@g4XVR$AM5M!6Wzn(nO^Kbk{+M$ zAG1|^05)h#%vtY?(Xe)?>sbIH#xre z6FA4q_$Yjv55NkU0FQFou>X7dBU7xUOkl!SqObsi=JinQFvo@bfD)?^qqVGn!--CJ z#{1q}bGl>_#()>!dhhovUqRyiy>a#Gk#=Udvj=flB5rPNkA}IV{vIs;(N!>k%^-A) zFQb-70-7T}G>0;Iikmn-zrTn4J_@!vwWcBxx8E_9j=|P=uU}1tKYX01u6vXksAh3q{5DV!(XD0gnAMCW-3*)xw_PYA^ ziY<}0Ae3WHEel4sk&9mSArbE|Cssgm!tmnf<;&g5lQh3Z7hFc>I zFdkJOx4N%#1^RfW3hDF1hSmZ^85F_8>^-i&WZctp;R4h2O3+iLQaC;^)(%Qq2d=&a z5VnSU)|GI?5giT!GByM<8`3*ci;-G_N`P$$>egV>Cb#fZ*k?tuZmtK_!@2Q>zZTa* z2-<)(8t5K4<`6KUf*u8m(M4cuWEyLH&@2Cdl3CuK8YD_|S1H@pKV1!JtoVlLR9DYfO2P}|A0`(_qj7)zB;)?|Bje>H5Rd$rUCCNG=59pHcO40wdA9bNR8eNT?}LF*=C)t2fr~n6;+{J7C}T>E$s9 zoLS+6N$3F>`X+WHXJf!ioJ@cp{%Xu8&5Smh2DA>?0W{`_iJMHb#rpu^UYI0m0;0py z2wg0~!`OXYO~w7S8jmfIfr5cZSbgiiprCkswhg=&&O!Wu)rtylnbj ze}ExMkQih_cShq@z)cDi>3D*xKD?rA2Qlx^?*e~>sO5=f{t@L7b4DEmE-gX~bu^H@ z!pvkmjPL7Z$zLaJ7# zfr^b#32tF?;_=ZQ_N%8ap1yke=-Jc%wD)f`4zHLr*6!n{&kkk8;2E+Sfn9;MQ$z)u zd5SY(en|w^>f`n8jhuglq|Hu%2myzi8OGk9LO8$fh!KL7ujL#GeA?R%vvLO%V-)*P zP=yXFgh?$eK!km?=IC8;&JT@YOzlc36?P>sw`eC6WF#?>;c#HZev+HBFHhu=U!a0q z6`G%R-{tP83li*tjL`5;@Eim(uY3C9<@c|S4n)QK!!T4B0}_v4(e>Soz=@JvJ>-y{ zeh(j=*(&eibBZD1i~5#1;=3Fr<}4BF);0^k@MIM7NaS?f7w)VST)b1sk9VrS^tKY5 zBHFQS_wQCfI@;P9K|H^u`o>vkm&!d=^g(4fDm9UG4tHRr^${)X*8+cY7{kAr%RDR%V+CXB>-XH*&6 zyw|Qt6Hm|tmj*P+qb)Mj8LkB16AQOvW70jJN?2HJmu0(Cz1Nph8}Nwoc$~@&ySSA^ zlwS?%absiA_TCVU0(KnKRl}oRxV$Z~G1XTxzWqT6Nb2)$CD|C$MJ2!+lD@z3Kx7B6 zP@89NbAne*KLslOL8q8q5xOIJ8KWZHJ&B9|1i}oY6N?{u1g%(t71YDU6mQEg_m2MQ z!T)(}@UgapEEI7d;8c7gZZ&4ESbzOtII<1Ft?svwdH80=!=Q6isbMEUQCqm~sKpNZ z!{FJN9*Gy&ny5z)hymGkXhPN7PDL2+t$eP=XFH2Sv=;!^tcMsll4;9*a>ChKJg8!D#myj0WT?7s>E<#WQKkkX^(6Wf2bqNH3L4`Ro zMP8KZ7W<9lWj2A8X|ty?)%C^}r8l#SSmqTCcr&U#q?8696e72Pu31Q`!pZ*-&ENs) zV-jINvDtKequz9U9!dI`!}7dnD!cn58^z~jxdcx3w}bTjPC*tJ$@1gn$(%DI-P5;d z6sLHWyON;6p3w5=7%dX*hyZvw1jN}C+nuRNJx2I#v#nlPL#%~Pzi1Zn_2Dz9YhV<> zZhyET?*QzoU&(8Miqn3D7qz^4^zzWSoKZvgoBHl%-)E1%4%ozVj7S?C{p!WxuN4Yy zzpOjqtZhHXnQz8fytsPT5hLY89Ov;&Sm3Za`rh51R9}7j{VN%Vb)z!C@yi^T9jP9% zEc}4r!Xd)7G_GfH{PLilg;D1rE+YHUaa1S5fS;R8Mvg>b0AB`dF_QfGn)cRU8-e{4 zOC+7t(pnRZVlN*y65FCooS{FE8xvte@9OOpk4v9I&D0B>nQJ;>{;QJ%I)&-Sj)>ymWRLel3@OjYl zbrn`!f7q8RRw$(WlmKR>$Ws#|#XUrvnPBgI@$OOetLX;OzP>#h!K^<5Vd(+|gX^8x z#*!H0(q+cWkDO=vAQM^QPcBy3b}Yn@waWp>j>qGAEwv0|h!CC$FSYo>|rkDPvtlts7-0+m4#Jbbu zBj?xbyRW$%xQ2%n#v}ExZ}%h|8NPL8glF2(^HM@OOy`eQwwg^UVieHx&7eiZZT*XY zyl}#{z1~-I3+fhD;=9v&a(lj9)mYl zha{^KyWS#6LHIk6-7ODDO54L!zP{EcRPEd%0WK)Jnf`Zgc-j~QAEHLnF{`>J~IjvK?8&(&7;PKwMrvy?Ut}(kxVUU z*USkGp_Qa39fh=579q-Z_N>ZP4_?0xCiS4PfQQ@4lxTP|jLr($3f}>L(vz<}hr4y^ zu|DLO3&xb>9gSpd>0kM4^l!Qe#juBcWh0RC#7w5Y?f3serw5NSTc!Ie^W&j)=kHi} zjRF0D(KpqDNW8&7kgD-Pq?uUMCo4y1j8s^Op0mW8g_qWQE?fwP+z1 zofjL&6lFuqRZ>o(Wm5g zZd*b-J$qw^d=4ANWbwRy9SY3I*`A&{`Ce0wDs~^hcUHLF#sI>z8LmnFEI#0D$nO;9 zFa3U|esVw*F1Z0QDm!W20v36!ZQ<)qSy#P@9xcRVZhL(kCfjO1a;rzF8e%7}?=*f6 zZ>%8-VgQ1XR6oI`j4lZ?5u=OZ1z>O!X@Wc#ApR}zJohRibSxn#0-3h8geJs z!RZ#F5Tpu5a@s0N+(cWnNe}#%vp9bOOWEn0$;s**aN=uNj!CO&5CW=pz(xAxjgFzX zUouF6AUfe5p%YOa@(q;5k;%0>KDBv*ZCN8Mq^BH9z7^n(5Dr@@yqKSAVhZtS(?EE_ zJN3$A@MJrrSy!?+t!pV^_H6bB*RZxR_>!jfL38Vj7@6P2V`pC=z$o2E?o_sQ0HRn6Z@$SAF#FdPn^hev}rORgk4PUj=SkPRI3$d0O`CzjC^`Ud1;yXQZu?YuRC)rwu~ASSHhV&l7fTtD+ffa zP$*~d`>QxERs0dVJ~VLDfpe8G@?^OrtAU{-N?V&Pb|$n&+b;@nDD)@uvybvOD#y_& zYWvkg>EL+c0TkXWFyt;5XodFCH>EJro4qPtc{YdySQN#O^}BIg!LsbbHMRj!p6*xW zsGWAjnw=Bfy-+1E#%^lkKBnP7st19S7FweL2!mrKiubw?S{Wh1I5;6W^T0lupCt?q ztu7vwsGU6a(2*VXolkr02cP!X?{s(mTRisRo?kn1!x53MCd)W-5hN!Ti{6T=ByR;i z1ejS6dLDCc{GZ|Gl+ua=*_+q+tm&!Dg%V*3tU8-5(bqr9+9PkCv-PRRI{?Q{q_zy% zD;%UbDCt0)3FcCrNUhTo5R1W43y4h>=d2vK%!DZBJ_6+xyIL~5`Hr^O$yZChbV^1( zRX7y5XOksBNuIX$!TB1+L3h#vZ>#4vSlKr*GCm`vb=Hoddcvq=84DGE|nU5hQvX|vpG={Wo>BEak_|NQQyUs zA#Rg=#E90YJCYE=HwbvXxTcf?Q6b4JeuH+Gt|4V~VISbCg*VlQ|v^DO$Y3s}c3D^cihe#?PcF{6_3LAo@K zBjs3GkUnOqI70cGNyB9L;MOC4%48R|#E}HeT5OiLnbS}Z9kn~Sn{_EUengDdx0~XN z%9^h5stR-ZW5uynvKVUDcm&3kk#IA0)GG<_&?u0F@lpyk!=kh2WvK zZ~$}?zp<^1RwC;l6w5vd$3nnu>&QN2RR7}Lxz4_nmmUs~V82K1F%jq-mW^m<62^x~ z>0^ISCrdk$Xdnj3jDjn197R9Cdlo|`m?u;jzbs}ziW$P6Toi3i9x#hcl*pn<4a+e_ zxnIkItPo>3h5Nz_l(Q2FW$E&fdy;U`)=kWJ~ol%DeW2j z84hy}^eIztiq52)&7n=qS(ubGSX(g)erQPTL1V+jU~$G~OZiCJAwa^w36AUrG;)t} zCf305^1%@^C1`R3-CchI;$hVd;#8UW+EQL5F$nBmZ$?sE-%%-4Q4yodW?(@5KJa4K zQIG2P|MWBZjum0~87LEf3N%~WBr{8#hIcP`8OyIDkHifO^u5SuW>xRx+a8tU1{#3W za0y|f7YLrOy%{l%CYI?ncl(x*8eeU?THUCF|5`rtR0e=UU}^O~*22y4m_uZ=nEYPIFNSy4sYytt5Q#~g?*N)OO7 zouwq$cVIC3va;}5J^X@Qf%O>tnd#fYUjcci@620$9R5}2sTmo2Ys{sFfK1ksvgfD} zr>sujN+-}dnkh+2kaa6=MH->JcuP0|CPWd5#n{0EocVEtLY8k?4Jwz@ra1(?wnpNV zi;o@+{ACsu$r8zkc6K7nCe%_a(nsgc$j22MLFN}6QG(n;o29WRv8gBxZqaw7+ZqzX zKsP0|X7UAyMIjs2Bay?YPStIey5yksRkBqU1CN9bc=h{L8N%CB z@8J?^-Hy0{^s%vN3z$Od(&%{g7{zC-xL&B7=7B)nFZ-|pHR@L%)1UqXPdeI(AA(oz zO05BeS88GL$Vrn~vP48k?AF?Wc?&1A3-s`=o;1s9S^sKi*~7pgP3y;_+5lH z_7v)L6WE^-Je?r$Zlp92kcNGbu4AOLUefPJq!?7;&y-B+Rs@4BU40+CQR8<0`jGr} ze*-^R?ZJtYQ--_CN?690v<^b}JnE<&k73L~9gaEqm`yR4 z5Y7?~*VkcjV0p<;6JMBIz3!aVzEYc9=zAzq5Jd4G){}%$h~(N_MFj?(Lo>SOSB^B+TzQNDz!uCW#_-WDEh$wPU?)@j>z7gmE$C{K2)*Uvd^0{0 zLZ=)RW94aO8`&i#Im4nzT5|hg?PiBM6-R98ok8QZu0wXNNg;Dk)Vv}=HxU;%HMk02 zk7N$Ta7NIuwSczMVbC9gLy^^5EL&jWIfGfI2sgbd_!a@iQRw7MI7hK7Zi5X~amdYS4 z;=xr9NU}~&v4^#+BVz7*0*$8`}P8(-mr|2gi-N*T63~)*?Q(6 z`cQ})hlD<6ooj0MpEk^OZEB#2Tt}%2lUy9^hsHaa-O$ zJd8{98?81qsSrw6jq9t{%$MKp<7+iC*{0>^LsDHq0Pqb)yX~v^4WWD zAX$Jn@SB7`6FQGoe$ydgF?Y4#OIWeOkF%_nbst|?a?~wyP_6L|MJWC6dSW-NBvU6=`f0+R+=&*z8py(*kY#^Tt+AX@wzxqPm9QW2=n~#P=easc<%b zn$0PL6m>C8Wotyq->iQ)f)x-;SGfXAM zl;oj;8=gx}-=zC!f3%CG6nUqLwlEwR1FB2G6nt@{k4SL9wJ-{omS(zJ!NDf^@Nq?= zEzCljw;LKOhv5lpf{1n#oBXts>1C4!;+?&7Lg6RGJ9a)D??B!ChsHZF3pnQ?PON|j z^`C`ME8lJJN5S?1s0mu ziO8T&EuGNcK3RP>3PBPXb^Mkps>g`|_yxlWZ_SW{>qdySt%2i9hh<4L<*4Ah;PN>H z{?@Sb>Z!olNEMXNKY|G*6xEIyt|B_4%8U@UFXz8hd~e4uYZ)%nA8P(9Ky7?6 z7PO@83Iu)bnK%{+Os?7TqO}$)Z9r<}PIW8;3A(!{^yO(WwK&2rB~D0#8A?GPdNOL9 z;SD`0hD#lm!UJvuxL5f^C;DDshv8XiG@;EQp$C;5h+#Bi`E-;`VVKMMiFeFHO6kM8 z4hp*tw&&+47{w%gx&niiwmSr#BZL9-=1e|CDrZQMYLWEn_*iIL%ln8C|5O!!1$TNI5aJ#qJul7 zW&mJ4zEA2Ps4QI^>yLU0DBMXSil~Lo*>YuKPikuh9EeeA;jRN9N-LN-P;XfA|JL!Z;2isWH7_&W1`swp0glz4biNpDT5z| z=AO_kEFiIJoW?(R#h(SV`@~zK9!Tw6VX2;3p5d39T?t(QcRVi;h{gh*ef7rgl1{qr z@9l^ZsMTaZbf{wC)Rw7Yh0#@UaZ)b^IP`P5luWhBkp{GoGTt~C0awnD2tGXuf@j$z zYUvw&`Di%f$%g*qTU{ce^IXlk* znBY6hnfTZ^(wwp!%DKZ);1dGczv9C!1ke3ck?@BLia7Hslj2N6jruywnE_@d&7bL= zQLh!VB?-B$G@7D?ofsw@zuvV;3tSXpN_){h&Z?i z*V(LQ-sbii*HyYuD{gjY1#5LniWnXBT9C+V>&7N1B;QE&q69d)8wy97YitfvmIe%? zq7q1DWGs^mwXT!`fV<_(y8Af6SHfYapFYbv3 zZNmFglc4$!wF%_>m~>V4C{*N~Oh1&5f+?;6ML$=p@M74Cws)dRud4eIt|M!`b{b37 z7}BDF)1Im;i4Sn7hKfOU-l^M~%a}#I?kI7pV5_HW6fso;$|cq!o4YbAMfNVP-%d`5 zJ>stUUV)32>3kAnJrePQ=W1Q5FQW^?nn!-?m z4C!O~XLjx%)DU}fi$6!wy~H+S&9H9gM94%z+@+|OYMeQua6Kw<~@ktfyki>zk+>z>> zS!Dx>a|zHao+&($f|iiMcqoTMoUSZE#Mahf;maSSiI?pQUUc!g;}BGLMxhDr0lb+) z=D5Ib;1T{Lm6ZFCG2bz_{XdjS}(8LqtDgL|>!%U|bs~sLAJ^lnW;do!Me1 z)JOpX*dHKFRiX8B=wQ5Y<|1B%V*V2@78OLrD}>h$oaCc9p3EHto*tBHRM!-Yp&n2h z#as&L{vi0-{0cvY$HY_bf2$i=7icpcdRV=c5*D?%a4;4@qQr#kR;{D(>yFhl1ZqT4 ze*y|Sp(faEmcIgVGucM0Ls@4H+YoD2^(P4+;u6Dk!K>;^g|SLP4C@fRaO>g3TIU{r zvbLzq&>Txk&BRbqM}_G5SA{?Ui!<){;+PEpD)Q>eHwU*R2ns-=2UeLTEV)%atv<>d z8=wn`$tlMQ6Qk&zjXJdP6@CmIZV~K6;P)^M_?Z#HrzT)t1ky^S7?nH3^Q7uJ8yybd zk6ipI0EHLwsOTC#nflm_t6nwV%sFVb< zoSfcz9v2Wr*(})Ffp8|uTYwl&R50V-#s*C-zm(C4B1%dx)4NhSfh{1M)f~G!30|N| zWBW~j4_h1UJsd20f!do{kSI#7Tce4ClT8#SV#aLYQnj5VKDgo{WQENMkMauVH#^P$ z&$-=zip~p#YKW;aqsPRJU9T@=3a*V@NMF)G^oc+Pd2T&5;#X2G(*$Mb{+UCXg8euO z8-vgC9d0Pa-P%C3KpH87Dnb%UZ7O>l1(f2o?4L0umq=+ULC;w5CC439Y#MBXfY~~o z)`?)Jvy;Lzmu@q~kcD*!CHsf$(vS!g@AAI4gN2b;Tr7*g%5ffrwYX+6I%Xh2EANT^ zQAWLi?N`*nmR6^n{rWAGVFtofbw^WaENlDcIO|)garV?+>+nq0WnkH}o?ByD2TmNTx2 z6y+I5S{bKEg!G(#17BhI8Z+SId;&~KrT{9+XaWWcR+gGFoC7+v$0q{V;yIdRBocvW zTAh52xQOJZi5f>x)QDQKnS`XR)i7YuAIkB|Vq&n4Z558C7D4opmGMJ)ieD3Vqkx`T zn?{B93A z!OY(iEM3wGzrZI$AfG<*G5mA{WYit~Ln9!fdy_*s@gZ6u1t|nqpWyxCQludFrxhVA zf0(ODp^Z=?y1ZVbu#(OCc=oArC_JbHrGuAafwoGJF=|QHpg_oUK^k&s5jy;l{9!zj zGVK%N><7bu*!!bl_`m@)PKrOawACILwR^CkgW zH-!k$Bo1y9!vP4e0w~rIJ-vicj<)d$iPp@Kv1rq$-T4 zEo@toOBmnj$Ne@%=z6VjZH?qayR~*Dv+x9arMRY+C1uVGwT1t!o^28+dWcF3X*i{Z zvXAZhc?e1#X@{xdSCwNs_tk~uLd?QJJ8^0Qg?AABTHiNX07Q<9604~*2403sMJTDysuWK6Z?4w|uMm1=i7t#SD zQ~;sz9!eDxG#yh*5JMA|CjD#=)3nVx^&3+3sXiD~ z;B>Ummtbc1EQgWHa@ae(Oi_%&`>2nTp?@x(Wo z;2#%`$#sK>KPsxIjyDPm<#0YyEqA1Yj%Bu>Dux%yA<|d5_H=&x=55e#;A@?nr zlmtc*X!2O3j5}5+4}-kTwcB2zTy}vih=GoP5&y3%3}*gIt35GTjpTT^s=ln}$N(HA z3p3qe9AnRxidwbw8D!4F87x|OT*TGA`B*2ZXTD9sAi<(A`Cj#iWCJBV)|o4X11Oj- zR94Qt%r-+KMvzj#=qdqJ+Zh>*u+(|W6~h9NPwPG zTmcjt<2&O!fo0J_d{E^B^7e#O)nF)?&AL1xB}MsECqgi@}QJ5}}FR2N(G!x%_@9%-}8t=G7+CoLqdK znzCNEIWPP23V_vkM!qqgDQN?_E}wzz4t+!yoY}#;Xb#+@G}MZePoS(e1ia7op1$2I zl97xyeL17`;+x84iH1^ru%*h`VR=-FrdGP+2W#@wbPU~In{lO@9{~bXEggbMU2uzn zX|gv^b(B7_Lu?{2PHe8NW%)J7^#^**XfjRr!*V`Q%q*JPeAl4{Km^q6vB_j40LPG^yumgd?5 zVgm^^S_QmC!9A=R41&w?IS%s|?*ql!NKNAlBvF#lZ9d2Ym7GvZ1HGKga;w@SL8uso ztkhqs&$U8OwG1lu${HE8W-P5Ob>Y#D4)CYFRO_fPiT-Y>t_@x1kdZ2tPLeRL`WRQT z^l4sXc#6=a^YlJucsrYH7G{?`1V za4Kz#!dFO%k&Ue*OTATsNxx#yO&rLTEb<{xMR533adn-}Uw23wQ6++Oezl8E=ZH2ILGHi<(+e{B!$^z6@ z6t3bJJ$t3K8rz%>P)t^w>eOEdvDO0Zc$1u_D1*?0aW%BZj@xIVu!L1IkIk@< zA#vxu+#y@ zwVUx?TvP-gpQ~UNJ0ZV|F4o|d2GsB=Y()m8Rx@{Yj~VpqP?08i{v*P^Heei#cOY|rg@unUX|NAI&Bv=nDjwXF225{0oqDtCT90t1CN;899b zlniB=LCFPBrJ$*zgA0E^CGiEKEusmo^OQ|@&o@sJi*z`njYGmCt-HwDxW{JH!IO3R z!^+2E3ayW|m)q^*3~Mcy84Jxdc^$xY0gx=fVLGjs?aV42?5HPD7T&BI`xsT;)?cuv z))v$%q}vb;m%B zR2BZeL)5`{lMYm86i}3W_kA+057f(iIZs*g+c0*ae6-hn{6pfMD`Lv*5(QfP{APY# zfYZvVwB17K$QkAzW60;C&qcWe?0Y=bSgv{$URXJsxO$!g49Whz|82fmA1L!e%Z$n= zg%--z7g`9j>q^5)hd-{)789p*YCtv(2vn$Df|i!j00n<$J&Rf>2iN8czF^*nw<>T3 zPCgRab)Qpt?pl`umI;0nz9T*n^ci}7`7%56V(JpB54%UY+}nyy)bIbUQn3vaSLh8p zETww1Y9|0TZ&y^jm%+1oT+@Bp$2FA@q-{$@VTL|S7i|Vj!{dQS_6GB>T%2(yH{LE9 z&<^8=hFln&Ua$ClLjtM)aukZpil`Ywa4F=vchwD4@n9EvX_V@W(bZQ`>R`TiJ67g` z_{xZbD$maTEBn3XtO9n+U>KB*-%EokOA^xKX?2ch_Cw8R7s#>bvMf@}n-eI_MAGak zo(U*<9Ap>d>qvf+n%7;oYd9}1i~f^DEQVR!9JU2({OVUaihj>@goN_3 z?CjddqJuZhq@W!yIW;cC!B3e`*mLG8_BjTQw;dPt+=`UFtFkpvv#|R`PIKszv_QX> z^x<3oX}X4-zoZT%qJ+YlA4;_i>5n+k^=uMAD@xDWjJ_;0%9^jO8Aa@#bKkWP{-hq+ z61{n9zAzMPk)gfU)EL)yi@uGq$v?>&io`g09`xT%;_E`SSvI~}~AuME7=V6xvr;aIDLK{bl?^ka{%IGPz-JPOjh26{k zH2Ok-5}oQ~l==Pb_0M2oP4uY19oylGb7RXTx6B1zKen!>&C0lDYD^6eCXW)>DG)Kni)e;+TBeJ*Pc zc<6LPQAG6g{nbx^592WZ20-D3{5*U{+cvDsijfRr7LI?3J&Yo1&xuZuEG{8zih^+3 zH!ywrF5;tmItjRfT;d6Lkjs=Ue%JtWtB>?qK`sYiM@|V)G>X^OT<<}U&*IxH!A1#f z3ParMPLiWl^RNg+zLBHICK5=38-p7W*iyNJ3l({5Ier?(QJW149j-zzatqMb8t_>! z7s+9dq=8|)OM`YD@eHff81^C-gck{Q zffQnK$ecP(u$HRb_Eg-f_=~T`^59|VA}f3=b*kdMLAjIKBQ%M-X}MVPp4!75N>|rT zqF5fRJ+ICte)3f%s{F(@G^rpcI3XEUAR4#Fmf{e_UTV|R{-|Fd8O+-BRNu#{*Pnsq zXCO&=oyO~PA1o6~EU5}84T#{z^$n|zk9-yeDUEfzwpM?2T1R4wFYiuP5Hlt>lKaysm^fR+5^jqFa zSSjhL=tHle2I?9jij8}5xkRRVL=TyUCEqd!Q-nxgilGE3^FlFhbXsomL~yntW;IMk zKw4fjvG%)<`nzI!tzL?w$fSxd4Rke%$jg69$A`}90cxOFFOC|tYyFs$l3ei#aN)cD z){^Rogcg_+r>NAECwtd>ECh;0sMK;UHKgEQ(ul4db*hvCF^N&4`C| z{AoAiZg=+|>Sio7u2_<2J&D}T#T5$gayvbxnL6PM+v?(zm&Qz(&(GuWe{~_KcpMQF zod>QFJpxuq`bsE5?NZ?NlZ3C=yLSj*d*#rVDkTPHMne;PLX+_i2)^SyvBHJ~v#Q3i|B@nmb1RmeKq zItB6#cZE%;z73gl#!9meT}(c%wvH)eaf_>h%m|y|oF@0ddj2gGqih^gjCvqUFD?`) zitoy{D&K4Ev_8l{t?xzj(oa1wMBphaR$ycIKHVm4W3sHF$Kt2)2E|q@X`H0h+-39w z=TKQpDMR3P5qFZ<+F6f1WLmb^OZR}Ivv8j`-B*Pav9S45CGNOOPDMV1!O}j8hwcn? z)Q(2|eO+;cUuLvdeeKp39ksHequwp%UlOU+-iNjQPVtqruHcLKa7IFbXp>Qp;=R)X zGwkdmV=IT1(rKW576RHK65-k!yPJtc>@%vaM`|?%DY5`l-T459y7;iLErc7YBTkGRBjOAhfkputbMqOQ8CLglw&Ng+gN z1VN}U#5SF-h-V7gio^3WedVC2qT^g4EB89j3yBlqV;Ju)_r{hXBT-hzO4OD)#*&$D z3B>w^PPJXBKbs35;gpK1QR$d==wgG~@?+q}GLBU3wq;y2Od<9vbn6I=j>@5re0?8E zlNCUud<~Y7?tKJC>~qi1LtSKIt;EALH8)cGZV{M4yS3FsH`8b$`y{~^!lY@Tl$Pz zD`sPe+?0`vQ&pfa5>f21! zUQDSTzsL(xbr{3V8Ajtubwp0Jz8tKe`6%rBed}Hf+)sNff&|HRDRYPDAT#+afx7RN=2s)61YWPz+$u~eih5`G?QvWW@y@dU38}`ay+N-{& zq`{&{g*x!ZC4b7V^a+13b(q=Y(M3r=stqL+5t|)y%G9-1>hL!#RAbMimq+TQB+aML zlp-74&YIgHdsD-%o0A%mdKoq-DLAz1QC%kO_E> zj2hCOKh+*u)7LJr$3lru?}HV~W*?A=_wIve*Up7c?E_cO&TzKR{$#lfv z{_8j&aft$JlGHy1?0O!b0Jh#&bF51#CJ}C6)b|t>G4NfPp)hpPS4coN&1HZ9rI(u# z-spZ>a7S8tK{$y4EBR^=<0(1~SF<)wyL9I9UbcXmg{2R#uCbz^YH$er%E2+%tbJhegwOU!*Ftr zu;QtNm2T(IF%!x2O7#|E6;{r%1c~^%*y@mcT1$NHP-d@wPF>o3AaCRbg__EHNM{d6 zs9M2km1mo6+g6_uAQ~n-b?B7UQR9p>QQSXFBql}Hy~f)*%ec ziHZ};Jyg!~wTcsi5s_4>X}VO}ndGQbD#~HEm^V53%8j-YHh}5b3++g78t-{sTo`l} zU~;{l%(@q;xDB~Kgl}ovLY0S&T8e5{d;+nZ0C`no_b}-Gk>ora?-QtwdjHaZFl6-^ zUD~S8_!iir>9$J?2G(LU@8eIozNJQ2CN(jDF|||>(tGT$bnCnF0UAc48nwu|`=h0n zmbt5xxyYK?f5rxG%9?8)N^ETwQY-4LN5#({lc?J0yrqogQrAF-1>$%Yj;gOBaakCv z)NJ{1(76hB^XF}3IC~YLCjAQYUh7xbkHW!GaXuj4Vb62E_mGaeS@J;`VCxp)6bfa{Q57u9a75n@;+p)E~~==@T+Z4S@K% zaETJ69NvnL-vz)=nTPTf!V9BhBRqFZ8)&kb;pY+aY1nb5aaZVN!qdp&=H`t~+9)~H zW;k^G(0W_}F-274{vd6%*S5Q@lSW!w?yh)CjiI&rT_T_A_YgHwXC`ESQ2eJDYs}f` z+S%>L0YTk(j_!JF>kOJWc&DV6y}m*V&T(0D`*LW50Vh_>!4e=gf(-52&m z@F2n2#tL?)MH2<2Xmemv6Lqjc_fRLkr~p*L)W!UZxP%NNsQ=SByEy|8$sMJmN^j07 zN^ALbXe~l-x%DtR#o##gh~!cZuQ;wRR>2{_C8AV+^f^o2q80vdurmCE^7ZK2_L94h z8Or)#4U%-qu5ip%fI3ZkMVGA^K!Iz+eF9|8xb`NbC(qo+izF=~7s=fIp4F|okMmCT zdzVyr2y?POAH?u7#7`EtK=r1ullN^LA<1%dXF;lti7RF-BiNn*dz`(ja+4T-O=@9S zIJnqB;}}p{r+dXlIx~tKOs8|U4lg_XbA{#LosNu8zglHJE9z@-A7zEM_>X?Vf#5a# zRi7l$--ng9IC&8`P6?PSwozcFpgVQxIpxzpE5I0u-}un_gtcr>ab?{iVXt3|iYF!$M)zma9%%dtBR%Wj%saw5965|d=&*_V>`7 zQ}}s8tLLB`J9XE`D5K2RIVH$doQHC0`B|X&r%od&Twg2BLR&J+Ie~Hifuz&S?a$6tsoG&S{z}zHp3rKINc5}pTYtGpU8>JOale11cd7=@=Z_#uzlE( z!uK_99x4GVZ(bP;40kkqhNKRAi?jkB(#UR6GjK=R6-|ylJx&XSx+wKuk zo_np8Z|eRKmG9s{^}@%MLS#?~9mKv*G8OPdrArk>SG%Tng0$|c^ynH&Dpd}YaH7<3 z0xsM9ERf=rSE6THNL?oe4jnChws1v%uAyfi(+c=%=&43Kg((21qmCMCw+5eTxySJ9 zd~IFC*UscGB7Tf_5TP%vQKMfEY<8z7;!WI^h zZK_V|lP?eJJK|oXJLJ(qXCG^ScZ7wb+zr_VRBULc%Y-W%jUC{kc#jn!p%b$=7Tp$@+0!c5yozs-m#Gf7p%eRyMz-yaUbDYzAL)-(|Sq9;DE@tWaUKO{f@}|m_HH5D(Z?6xTK9Ua%P`Mxm-pPwEb&*FMwczqBk1M?kP)brC#v1-BL8qY|bp>jTVK47<{&e6AVg;bZYblp8L%?3ye`)jyHnK?XsL zK*ZdYbb^`!FFGaVorB)H<9jCVuQ~rf?deR{Bic-|#@OC~yUTkdzSB4_RdbFoHv z6gom(F(Hd3SVu5XY5O>a?y|Xm%hpvcX6bJFJef=66=1+cRI{9EWW@?NFb&T!Hc4R@ zJ|!IWQ;YyM$y+bP6pHHXqoXi;gpPdkv+r3i*Ls9I8_MD}L@4|=YN%*BRg$?EQ2Au5 zJKrwCA6THA1pH*1z5Yk4a<2HH?N8@WkquB zUS5P#LbK@$9PLLb7Ig)jY;@bL>8S;k@Y+rNzOM%?FJ0xLxA3Rj9Oh zM(zBQ+*grFY_yRJw!nAEoq}ahZI#P0MmqE)he};Bv%XTc_4OOXR-Gm&MchM(hq^xt z!eWfdPcmox7*w3;j%2`Tf)t8bT}z;(yA??#f3jhsJ#u#*q0r}j(d8*C`Dd7*PJM^? zpco<+5f^sqkcCX;`cpC%NWZ4Roq^%GcL(lNe_0>d1H;U3e)7PwLGDiZ-|ih4&4&4r zcMox8;XmD%etK~mSAJd0;AE1C=)+mdm;+VLKy>b<$R)hb@IjqVCg*?%QmG(}2%^%` z*{#YabI?;oo*uTYYyuhhv^g-*M^B+3E)<>!P}ps$2M_q4P$FZD#LZH=q)F{^QPte% zP5Be{h_}N}QBO#o;w>B?#5#$fgxp~|1ZSd&1OQDC!4}eG1|*wi-PdO60z{$@A`Ryn zRnH6pJHLrRf@$21JH_=Ukhw^BjmM2ErA<(gW_LlB_52 zuVn)Ax7%BdVzVcVh~zDKJKEh=KOa7BaL8TO7!zx7+DoBI+C)K4U7=&YkV2GAszkZp zPJ{W({hR64l$))rn^@_v6^)8yZ;Y$nR6QAwzZ)VaLDQ)<_p#F?2;QfP!z%&Eho5Ag>x$v@EbzHW`zE;dUzs! z4qYpeB70F*i*llGF^7BoXqG>OQRc6xg(y3TJGgOTrDnx-;K9|cjj;uPguEda;@ z;I_%EBxwu9f?X6id-be!O4qq17S2D(<4$LV_sjs6AnU1>WAM>GJ2u zw$PzJlT(J@r{Pfdo3;K`WbyB=8oynTQSXmjTR7z2elvbe}(FX}->*$z7f!^|6 zSi9hhYEx@ZbZ1_v+ELD+E_^`ms1e6^A3ze)x)y^GWtB!k;JaqCiLoTrj0 zfCb@``u1F|pE3~l;T$Oc6;va%5J3o~=W1IbJ3UxP9rol~tLf>owv;=EqzKFpEG9|; z-Rwxas6)-i-nv9;kaEvJYk z6zdKr>mWoir!pVnT)=Vl z@nkMkeLkV~jQv?vR9XhrBZEY+{^7(fR}yG2dC=iYp?7WQJPu}(;S@3U52&-n<&BV! zV%3s|Uq!Y?oC%Nv3-YK#;*rLzt*G~mEmSdM;o54cHPwfcp)G3d)R$gUcTNk@9Otcs zM}U3L3hF}fWd+h(+Djn#YuK`RttA|*WDaxIUgfcXOu+uzXI@X7$Ye8fD}qhI)^x>~ z&oqld^+i825#(9AwGHaVnS`)O?{1LKqOv@nHAmEK=Fa4$UFL$d_oeG%mEjC>hHt4A z>1I&}lpENU1G}=2;zd%%s%l9qJH@ot+Tdi6-ZPb1<>2vzD<9x5QO%DNEk=PP9PS4e z;Nz%ykV&aS8lP^1=sBq$$fC*Bl*7EjcnXT99qS28M6?yBL3~6-+i((%&M&Jh%Q+Bt{f ze9b?G{r6V%Q zTI--YauZuL9(!BmO~^E6N^#wW%25EG-oRQw2LaBx?t?=wMilW<6jxteoXOB@^U36& zR_u`*X$>+|d7%g-qm?-EDsL)2JU#$TL}{LT^_1J}Y!7-r}cEW1$Z50+CpVlBGO zr#TMT+-bnj%Bj*8o+IHR1VaP}!00Bn6ne$n_UfKcnhy6G0yCTUJt6JCh6wo9#|%*w zs6ZX${$F_(EXls)j}1q~YL&s-Tn?bFI3}l*iiKE_(F>}AT%M?MkKL#Ban#VQhT}qF zat~tZBx{0j#hkdc4)Cg$j~P*_9!5IxA6NBJKmv1?%O9%mHE-L^I=zYu#W(O-b_!{H z+(N`K+|#Z}O{H5M$B;%d_CQJy9r0!wnvG*PVff$xQE~k2S-V&BJfe0)06?3jyH%gk zG8M<^Rooka+ZEwn8iIRqNYv=zRWfPS=t_sLstuJAUEIx+T!{lavkM8C(P;XC3bJ+a z#Q&KLDr$#2$?xTKf%p0ncPu?H=>&$T$PMzUvk5#8rZj0>frj`Q>qINDmsT;=f+qi# zyxfmVt)5B4a0bnPWY zh}(r4$_j0&$%?~668Vq?sQlY5lPfczp1$(aFgxW{X{T7D1e2p6=gir)-7%`oAfHaF z(yk{mzrfq(mPBLj`_Lp85f1WDAXfD3vq^qHYN2jk6?1SJhrqFV;Q)AYfDLiNhTzva`w2hRvpiw}`Z zG^qeWaWe4Jel-C~1vY$g53N5daBwcClncNMho{x7edX#3m%}i6m0aeiFVf7-X)YFl|*--{99tJsTfxQkVve_H{w@`><2pw`{98}z=j8)BVY zP*Qe-&C$=;4gLz=sT)k91_=A1r;_7bOd?Z4g=d;|ht;{ZClc43CD6Sn_v{IV%>9R@ zw3(TACA7gM=a7?&y}^zZ-CN$CL?M5?W;I?!4sf?l*ar7kJiD%tlDg49CFf||$`Dyy z@FKFV!S|s~eGqcS4S*}8btuFRFWx503pST}7)a}Wt;^%T!0_7KEpW?8LWNx1vp%05hnIC9irs2PK1soQ;LIWB&{X3*vr0hVONq10 zjMqN495<{G6IAS6_zVG%+gEmg5!a;P&l$zwVN#2e~Nteg5p30`HgG>A9XE7uV zsyb;+?S#6b5s-<7@#(g|r*ZVu9!Ky+T;VC%0y9l4Blen_!N-n8byy*ftk-byNn&!` z-r80U;fk?b38hoPI$bUER-Z8t+{Teq`NMYgQ9u(!8PXj)P@RktAc@oa0IPCJs7; z-khgFYJUs(d>gSRFURw5{2JBS?d7$YTOD7usUUMfiW{$6+(VAeHdn`_XCR>V z<~9L{PHU+F*{o``IVjJit}7I3hsyF6t~ALMD<2Xdbw}1DY>tDIx-S%P+T1CZbl@jp zIiI-^Ha#$q5;}I<0aGprEQTSTf&_V3WdfSc2U%=nmL8DrSSP&$c$8Z*wMi$Sv!ERZ z0;Il{5n4O)u4acGO!O@~$$0Q7z$fca2Zz&FK%dI=|0~GL(f*Sm-*R)^fiYnq9~5Y6 zAl5)GKISMD-#DX<+#?0>?!dSPO=5JMCfFlrS1>xZNu_l52QZ3qMRN&TfI2vh;o+#< zVj)pq(qx~AjaE%jw~uJyLUb$L{Pqpck-p~!FzaXt_QiuIdF0jFxT{BHrc<0Upkzax zT=X{+15=U5OJn@hO~F4_`yQE~;#qCfZ?;9aTGyxd!CCQ~bm!?$pNdTrr(6@^vh^Z` zxJxW0waU@MntZx8&8KZ^4}!Lak(S5elhwkpeSjIfkDEj6>4~$ub@$>|RQCplq(9$3 zP5Vr20{kI0)T}tay*gFS1!$_E2pFN;_R=-f{@$mjo6Vb*D)`gxnp3SW>|CjYrE?Qs zA3oOAKrX|>Ot805P#=9Swy?i9MqwqKhjK$5JY|JHd)56F_f(Rr{!MlGo9CTEKoNZBe=X#zo^x{FT(+@E~|$- z!ehIw0}J+)Hr`YvhUzLg2Wo}mTpLzTDz3S~jTJihNV1ZP-6(r37X9e>;OW!0uIb_$ z7!!DZxwX`TF;imreSEIz=r6(D0FF{|ICF<~SKRQLd(CHHE-~|d)EEnQQoF_xUm45y zDR!q1QOY_KsUBtptUuh6)DVhtC?=F6Q!=bgbu+whX-Mn13TvC-4A)!MV4!yjm8eTD zd5%MpxL#C70yWegZI^wHFUkKMw3-gaa8^WRxcX{WMWqP!kcyNr^JbUTv(*d>0O18| z$HX0qY3eMg*d5o?9c&z6-0)Yue;`cW*T@3&7uklHt)m%omQhFFM#>R`(JgOoK0?EL z{PqcSkM+9hlaZFGtR)1|J=0xrq%f@boq(YBfbKG47dUn!3X2?3Wj`w=%kIJEe`>gc z&4Y(o)uF$qqQLZNvT^3B+k-+#4u>UIVRw zv~yxCwUkO&zQw);@tKhoC1D56)|}gJdc>tdU@o$I6bfqzr@?6U)ONy|2-rta@6;bP zH!tv$f9=fF1t9Epi+CD!r=pDE!1DjHV!Bpm2nS z1=hY<#(VOh>nLD0wi_NK&aZv5I{omx$MoAd5nhG*aF6@J=F_<9T=Mm(zvP>~ zGbJDv(=7KxmQjB7z!eWyn)pJ;dYET?M|b6vspsX1n{fdR8!;dbo(p+??ox1pzWK7hw<9t#zw+P8;{? zK~oUUC`js~msfIb%Syg~K;F&lgZE}LOEHwDjvm*m`S*L*+zCHo-RjplUP0M#C>|+5 zvl%C|!{{rp|ILH0PJb0L4i{cM+V8-NB3W`)=_spm`NEBWmJ#;9^m!G~@?whziVI

}`rnX*Hiy?F(xvOCamjCdBn_!bICZKO5 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 YeG}B)wh6jgND~%2oCI{Ya(S}z4ZFbuQ2+n{ diff --git a/dep/src/readline/src/doc/rlman.texi b/dep/src/readline/src/doc/rlman.texi deleted file mode 100644 index f834b582653..00000000000 --- a/dep/src/readline/src/doc/rlman.texi +++ /dev/null @@ -1,101 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@comment %**start of header (This is for running Texinfo on a region.) -@setfilename readline.info -@settitle GNU Readline Library -@comment %**end of header (This is for running Texinfo on a region.) -@synindex vr fn -@setchapternewpage odd - -@include version.texi - -@copying -This manual describes the GNU Readline Library -(version @value{VERSION}, @value{UPDATED}), a library which aids in the -consistency of user interface across discrete programs which provide -a command line interface. - -Copyright @copyright{} 1988-2004 Free Software Foundation, Inc. - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -@quotation -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU Free Documentation License, Version 1.1 or -any later version published by the Free Software Foundation; with no -Invariant Sections, with the Front-Cover texts being ``A GNU Manual,'' -and with the Back-Cover Texts as in (a) below. A copy of the license is -included in the section entitled ``GNU Free Documentation License.'' - -(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify -this GNU Manual, like GNU software. Copies published by the Free -Software Foundation raise funds for GNU development.'' -@end quotation -@end copying - -@dircategory Libraries -@direntry -* Readline: (readline). The GNU readline library API. -@end direntry - -@titlepage -@title GNU Readline Library -@subtitle Edition @value{EDITION}, for @code{Readline Library} Version @value{VERSION}. -@subtitle @value{UPDATED-MONTH} -@author Chet Ramey, Case Western Reserve University -@author Brian Fox, Free Software Foundation - -@page -@vskip 0pt plus 1filll -@insertcopying - -@sp 1 -Published by the Free Software Foundation @* -59 Temple Place, Suite 330, @* -Boston, MA 02111-1307 @* -USA @* - -@end titlepage - -@contents - -@ifnottex -@node Top -@top GNU Readline Library - -This document describes the GNU Readline Library, a utility which aids -in the consistency of user interface across discrete programs which -provide a command line interface. - -@menu -* Command Line Editing:: GNU Readline User's Manual. -* Programming with GNU Readline:: GNU Readline Programmer's Manual. -* Copying This Manual:: Copying this manual. -* Concept Index:: Index of concepts described in this manual. -* Function and Variable Index:: Index of externally visible functions - and variables. -@end menu -@end ifnottex - -@include rluser.texi -@include rltech.texi - -@node Copying This Manual -@appendix Copying This Manual - -@menu -* GNU Free Documentation License:: License for copying this manual. -@end menu - -@include fdl.texi - -@node Concept Index -@unnumbered Concept Index -@printindex cp - -@node Function and Variable Index -@unnumbered Function and Variable Index -@printindex fn - -@bye diff --git a/dep/src/readline/src/doc/rltech.texi b/dep/src/readline/src/doc/rltech.texi deleted file mode 100644 index af9bc530a7e..00000000000 --- a/dep/src/readline/src/doc/rltech.texi +++ /dev/null @@ -1,2259 +0,0 @@ -@comment %**start of header (This is for running Texinfo on a region.) -@setfilename rltech.info -@comment %**end of header (This is for running Texinfo on a region.) -@setchapternewpage odd - -@ifinfo -This document describes the GNU Readline Library, a utility for aiding -in the consitency of user interface across discrete programs that need -to provide a command line interface. - -Copyright (C) 1988-2004 Free Software Foundation, Inc. - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -pare preserved on all copies. - -@ignore -Permission is granted to process this file through TeX and print the -results, provided the printed document carries copying permission -notice identical to this one except for the removal of this paragraph -(this paragraph not being relevant to the printed manual). -@end ignore - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the entire -resulting derived work is distributed under the terms of a permission -notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that this permission notice may be stated in a translation approved -by the Foundation. -@end ifinfo - -@node Programming with GNU Readline -@chapter Programming with GNU Readline - -This chapter describes the interface between the @sc{gnu} Readline Library and -other programs. If you are a programmer, and you wish to include the -features found in @sc{gnu} Readline -such as completion, line editing, and interactive history manipulation -in your own programs, this section is for you. - -@menu -* Basic Behavior:: Using the default behavior of Readline. -* Custom Functions:: Adding your own functions to Readline. -* Readline Variables:: Variables accessible to custom - functions. -* Readline Convenience Functions:: Functions which Readline supplies to - aid in writing your own custom - functions. -* Readline Signal Handling:: How Readline behaves when it receives signals. -* Custom Completers:: Supplanting or supplementing Readline's - completion functions. -@end menu - -@node Basic Behavior -@section Basic Behavior - -Many programs provide a command line interface, such as @code{mail}, -@code{ftp}, and @code{sh}. For such programs, the default behaviour of -Readline is sufficient. This section describes how to use Readline in -the simplest way possible, perhaps to replace calls in your code to -@code{gets()} or @code{fgets()}. - -@findex readline -@cindex readline, function - -The function @code{readline()} prints a prompt @var{prompt} -and then reads and returns a single line of text from the user. -If @var{prompt} is @code{NULL} or the empty string, no prompt is displayed. -The line @code{readline} returns is allocated with @code{malloc()}; -the caller should @code{free()} the line when it has finished with it. -The declaration for @code{readline} in ANSI C is - -@example -@code{char *readline (const char *@var{prompt});} -@end example - -@noindent -So, one might say -@example -@code{char *line = readline ("Enter a line: ");} -@end example -@noindent -in order to read a line of text from the user. -The line returned has the final newline removed, so only the -text remains. - -If @code{readline} encounters an @code{EOF} while reading the line, and the -line is empty at that point, then @code{(char *)NULL} is returned. -Otherwise, the line is ended just as if a newline had been typed. - -If you want the user to be able to get at the line later, (with -@key{C-p} for example), you must call @code{add_history()} to save the -line away in a @dfn{history} list of such lines. - -@example -@code{add_history (line)}; -@end example - -@noindent -For full details on the GNU History Library, see the associated manual. - -It is preferable to avoid saving empty lines on the history list, since -users rarely have a burning need to reuse a blank line. Here is -a function which usefully replaces the standard @code{gets()} library -function, and has the advantage of no static buffer to overflow: - -@example -/* A static variable for holding the line. */ -static char *line_read = (char *)NULL; - -/* Read a string, and return a pointer to it. - Returns NULL on EOF. */ -char * -rl_gets () -@{ - /* If the buffer has already been allocated, - return the memory to the free pool. */ - if (line_read) - @{ - free (line_read); - line_read = (char *)NULL; - @} - - /* Get a line from the user. */ - line_read = readline (""); - - /* If the line has any text in it, - save it on the history. */ - if (line_read && *line_read) - add_history (line_read); - - return (line_read); -@} -@end example - -This function gives the user the default behaviour of @key{TAB} -completion: completion on file names. If you do not want Readline to -complete on filenames, you can change the binding of the @key{TAB} key -with @code{rl_bind_key()}. - -@example -@code{int rl_bind_key (int @var{key}, rl_command_func_t *@var{function});} -@end example - -@code{rl_bind_key()} takes two arguments: @var{key} is the character that -you want to bind, and @var{function} is the address of the function to -call when @var{key} is pressed. Binding @key{TAB} to @code{rl_insert()} -makes @key{TAB} insert itself. -@code{rl_bind_key()} returns non-zero if @var{key} is not a valid -ASCII character code (between 0 and 255). - -Thus, to disable the default @key{TAB} behavior, the following suffices: -@example -@code{rl_bind_key ('\t', rl_insert);} -@end example - -This code should be executed once at the start of your program; you -might write a function called @code{initialize_readline()} which -performs this and other desired initializations, such as installing -custom completers (@pxref{Custom Completers}). - -@node Custom Functions -@section Custom Functions - -Readline provides many functions for manipulating the text of -the line, but it isn't possible to anticipate the needs of all -programs. This section describes the various functions and variables -defined within the Readline library which allow a user program to add -customized functionality to Readline. - -Before declaring any functions that customize Readline's behavior, or -using any functionality Readline provides in other code, an -application writer should include the file @code{} -in any file that uses Readline's features. Since some of the definitions -in @code{readline.h} use the @code{stdio} library, the file -@code{} should be included before @code{readline.h}. - -@code{readline.h} defines a C preprocessor variable that should -be treated as an integer, @code{RL_READLINE_VERSION}, which may -be used to conditionally compile application code depending on -the installed Readline version. The value is a hexadecimal -encoding of the major and minor version numbers of the library, -of the form 0x@var{MMmm}. @var{MM} is the two-digit major -version number; @var{mm} is the two-digit minor version number. -For Readline 4.2, for example, the value of -@code{RL_READLINE_VERSION} would be @code{0x0402}. - -@menu -* Readline Typedefs:: C declarations to make code readable. -* Function Writing:: Variables and calling conventions. -@end menu - -@node Readline Typedefs -@subsection Readline Typedefs - -For readabilty, we declare a number of new object types, all pointers -to functions. - -The reason for declaring these new types is to make it easier to write -code describing pointers to C functions with appropriately prototyped -arguments and return values. - -For instance, say we want to declare a variable @var{func} as a pointer -to a function which takes two @code{int} arguments and returns an -@code{int} (this is the type of all of the Readline bindable functions). -Instead of the classic C declaration - -@code{int (*func)();} - -@noindent -or the ANSI-C style declaration - -@code{int (*func)(int, int);} - -@noindent -we may write - -@code{rl_command_func_t *func;} - -The full list of function pointer types available is - -@table @code -@item typedef int rl_command_func_t (int, int); - -@item typedef char *rl_compentry_func_t (const char *, int); - -@item typedef char **rl_completion_func_t (const char *, int, int); - -@item typedef char *rl_quote_func_t (char *, int, char *); - -@item typedef char *rl_dequote_func_t (char *, int); - -@item typedef int rl_compignore_func_t (char **); - -@item typedef void rl_compdisp_func_t (char **, int, int); - -@item typedef int rl_hook_func_t (void); - -@item typedef int rl_getc_func_t (FILE *); - -@item typedef int rl_linebuf_func_t (char *, int); - -@item typedef int rl_intfunc_t (int); -@item #define rl_ivoidfunc_t rl_hook_func_t -@item typedef int rl_icpfunc_t (char *); -@item typedef int rl_icppfunc_t (char **); - -@item typedef void rl_voidfunc_t (void); -@item typedef void rl_vintfunc_t (int); -@item typedef void rl_vcpfunc_t (char *); -@item typedef void rl_vcppfunc_t (char **); - -@end table - -@node Function Writing -@subsection Writing a New Function - -In order to write new functions for Readline, you need to know the -calling conventions for keyboard-invoked functions, and the names of the -variables that describe the current state of the line read so far. - -The calling sequence for a command @code{foo} looks like - -@example -@code{int foo (int count, int key)} -@end example - -@noindent -where @var{count} is the numeric argument (or 1 if defaulted) and -@var{key} is the key that invoked this function. - -It is completely up to the function as to what should be done with the -numeric argument. Some functions use it as a repeat count, some -as a flag, and others to choose alternate behavior (refreshing the current -line as opposed to refreshing the screen, for example). Some choose to -ignore it. In general, if a -function uses the numeric argument as a repeat count, it should be able -to do something useful with both negative and positive arguments. -At the very least, it should be aware that it can be passed a -negative argument. - -A command function should return 0 if its action completes successfully, -and a non-zero value if some error occurs. - -@node Readline Variables -@section Readline Variables - -These variables are available to function writers. - -@deftypevar {char *} rl_line_buffer -This is the line gathered so far. You are welcome to modify the -contents of the line, but see @ref{Allowing Undoing}. The -function @code{rl_extend_line_buffer} is available to increase -the memory allocated to @code{rl_line_buffer}. -@end deftypevar - -@deftypevar int rl_point -The offset of the current cursor position in @code{rl_line_buffer} -(the @emph{point}). -@end deftypevar - -@deftypevar int rl_end -The number of characters present in @code{rl_line_buffer}. When -@code{rl_point} is at the end of the line, @code{rl_point} and -@code{rl_end} are equal. -@end deftypevar - -@deftypevar int rl_mark -The @var{mark} (saved position) in the current line. If set, the mark -and point define a @emph{region}. -@end deftypevar - -@deftypevar int rl_done -Setting this to a non-zero value causes Readline to return the current -line immediately. -@end deftypevar - -@deftypevar int rl_num_chars_to_read -Setting this to a positive value before calling @code{readline()} causes -Readline to return after accepting that many characters, rather -than reading up to a character bound to @code{accept-line}. -@end deftypevar - -@deftypevar int rl_pending_input -Setting this to a value makes it the next keystroke read. This is a -way to stuff a single character into the input stream. -@end deftypevar - -@deftypevar int rl_dispatching -Set to a non-zero value if a function is being called from a key binding; -zero otherwise. Application functions can test this to discover whether -they were called directly or by Readline's dispatching mechanism. -@end deftypevar - -@deftypevar int rl_erase_empty_line -Setting this to a non-zero value causes Readline to completely erase -the current line, including any prompt, any time a newline is typed as -the only character on an otherwise-empty line. The cursor is moved to -the beginning of the newly-blank line. -@end deftypevar - -@deftypevar {char *} rl_prompt -The prompt Readline uses. This is set from the argument to -@code{readline()}, and should not be assigned to directly. -The @code{rl_set_prompt()} function (@pxref{Redisplay}) may -be used to modify the prompt string after calling @code{readline()}. -@end deftypevar - -@deftypevar int rl_already_prompted -If an application wishes to display the prompt itself, rather than have -Readline do it the first time @code{readline()} is called, it should set -this variable to a non-zero value after displaying the prompt. -The prompt must also be passed as the argument to @code{readline()} so -the redisplay functions can update the display properly. -The calling application is responsible for managing the value; Readline -never sets it. -@end deftypevar - -@deftypevar {const char *} rl_library_version -The version number of this revision of the library. -@end deftypevar - -@deftypevar int rl_readline_version -An integer encoding the current version of the library. The encoding is -of the form 0x@var{MMmm}, where @var{MM} is the two-digit major version -number, and @var{mm} is the two-digit minor version number. -For example, for Readline-4.2, @code{rl_readline_version} would have the -value 0x0402. -@end deftypevar - -@deftypevar {int} rl_gnu_readline_p -Always set to 1, denoting that this is @sc{gnu} readline rather than some -emulation. -@end deftypevar - -@deftypevar {const char *} rl_terminal_name -The terminal type, used for initialization. If not set by the application, -Readline sets this to the value of the @env{TERM} environment variable -the first time it is called. -@end deftypevar - -@deftypevar {const char *} rl_readline_name -This variable is set to a unique name by each application using Readline. -The value allows conditional parsing of the inputrc file -(@pxref{Conditional Init Constructs}). -@end deftypevar - -@deftypevar {FILE *} rl_instream -The stdio stream from which Readline reads input. -If @code{NULL}, Readline defaults to @var{stdin}. -@end deftypevar - -@deftypevar {FILE *} rl_outstream -The stdio stream to which Readline performs output. -If @code{NULL}, Readline defaults to @var{stdout}. -@end deftypevar - -@deftypevar {rl_command_func_t *} rl_last_func -The address of the last command function Readline executed. May be used to -test whether or not a function is being executed twice in succession, for -example. -@end deftypevar - -@deftypevar {rl_hook_func_t *} rl_startup_hook -If non-zero, this is the address of a function to call just -before @code{readline} prints the first prompt. -@end deftypevar - -@deftypevar {rl_hook_func_t *} rl_pre_input_hook -If non-zero, this is the address of a function to call after -the first prompt has been printed and just before @code{readline} -starts reading input characters. -@end deftypevar - -@deftypevar {rl_hook_func_t *} rl_event_hook -If non-zero, this is the address of a function to call periodically -when Readline is waiting for terminal input. -By default, this will be called at most ten times a second if there -is no keyboard input. -@end deftypevar - -@deftypevar {rl_getc_func_t *} rl_getc_function -If non-zero, Readline will call indirectly through this pointer -to get a character from the input stream. By default, it is set to -@code{rl_getc}, the default Readline character input function -(@pxref{Character Input}). -@end deftypevar - -@deftypevar {rl_voidfunc_t *} rl_redisplay_function -If non-zero, Readline will call indirectly through this pointer -to update the display with the current contents of the editing buffer. -By default, it is set to @code{rl_redisplay}, the default Readline -redisplay function (@pxref{Redisplay}). -@end deftypevar - -@deftypevar {rl_vintfunc_t *} rl_prep_term_function -If non-zero, Readline will call indirectly through this pointer -to initialize the terminal. The function takes a single argument, an -@code{int} flag that says whether or not to use eight-bit characters. -By default, this is set to @code{rl_prep_terminal} -(@pxref{Terminal Management}). -@end deftypevar - -@deftypevar {rl_voidfunc_t *} rl_deprep_term_function -If non-zero, Readline will call indirectly through this pointer -to reset the terminal. This function should undo the effects of -@code{rl_prep_term_function}. -By default, this is set to @code{rl_deprep_terminal} -(@pxref{Terminal Management}). -@end deftypevar - -@deftypevar {Keymap} rl_executing_keymap -This variable is set to the keymap (@pxref{Keymaps}) in which the -currently executing readline function was found. -@end deftypevar - -@deftypevar {Keymap} rl_binding_keymap -This variable is set to the keymap (@pxref{Keymaps}) in which the -last key binding occurred. -@end deftypevar - -@deftypevar {char *} rl_executing_macro -This variable is set to the text of any currently-executing macro. -@end deftypevar - -@deftypevar {int} rl_readline_state -A variable with bit values that encapsulate the current Readline state. -A bit is set with the @code{RL_SETSTATE} macro, and unset with the -@code{RL_UNSETSTATE} macro. Use the @code{RL_ISSTATE} macro to test -whether a particular state bit is set. Current state bits include: - -@table @code -@item RL_STATE_NONE -Readline has not yet been called, nor has it begun to intialize. -@item RL_STATE_INITIALIZING -Readline is initializing its internal data structures. -@item RL_STATE_INITIALIZED -Readline has completed its initialization. -@item RL_STATE_TERMPREPPED -Readline has modified the terminal modes to do its own input and redisplay. -@item RL_STATE_READCMD -Readline is reading a command from the keyboard. -@item RL_STATE_METANEXT -Readline is reading more input after reading the meta-prefix character. -@item RL_STATE_DISPATCHING -Readline is dispatching to a command. -@item RL_STATE_MOREINPUT -Readline is reading more input while executing an editing command. -@item RL_STATE_ISEARCH -Readline is performing an incremental history search. -@item RL_STATE_NSEARCH -Readline is performing a non-incremental history search. -@item RL_STATE_SEARCH -Readline is searching backward or forward through the history for a string. -@item RL_STATE_NUMERICARG -Readline is reading a numeric argument. -@item RL_STATE_MACROINPUT -Readline is currently getting its input from a previously-defined keyboard -macro. -@item RL_STATE_MACRODEF -Readline is currently reading characters defining a keyboard macro. -@item RL_STATE_OVERWRITE -Readline is in overwrite mode. -@item RL_STATE_COMPLETING -Readline is performing word completion. -@item RL_STATE_SIGHANDLER -Readline is currently executing the readline signal handler. -@item RL_STATE_UNDOING -Readline is performing an undo. -@item RL_STATE_DONE -Readline has read a key sequence bound to @code{accept-line} -and is about to return the line to the caller. -@end table - -@end deftypevar - -@deftypevar {int} rl_explicit_arg -Set to a non-zero value if an explicit numeric argument was specified by -the user. Only valid in a bindable command function. -@end deftypevar - -@deftypevar {int} rl_numeric_arg -Set to the value of any numeric argument explicitly specified by the user -before executing the current Readline function. Only valid in a bindable -command function. -@end deftypevar - -@deftypevar {int} rl_editing_mode -Set to a value denoting Readline's current editing mode. A value of -@var{1} means Readline is currently in emacs mode; @var{0} -means that vi mode is active. -@end deftypevar - - -@node Readline Convenience Functions -@section Readline Convenience Functions - -@menu -* Function Naming:: How to give a function you write a name. -* Keymaps:: Making keymaps. -* Binding Keys:: Changing Keymaps. -* Associating Function Names and Bindings:: Translate function names to - key sequences. -* Allowing Undoing:: How to make your functions undoable. -* Redisplay:: Functions to control line display. -* Modifying Text:: Functions to modify @code{rl_line_buffer}. -* Character Input:: Functions to read keyboard input. -* Terminal Management:: Functions to manage terminal settings. -* Utility Functions:: Generally useful functions and hooks. -* Miscellaneous Functions:: Functions that don't fall into any category. -* Alternate Interface:: Using Readline in a `callback' fashion. -* A Readline Example:: An example Readline function. -@end menu - -@node Function Naming -@subsection Naming a Function - -The user can dynamically change the bindings of keys while using -Readline. This is done by representing the function with a descriptive -name. The user is able to type the descriptive name when referring to -the function. Thus, in an init file, one might find - -@example -Meta-Rubout: backward-kill-word -@end example - -This binds the keystroke @key{Meta-Rubout} to the function -@emph{descriptively} named @code{backward-kill-word}. You, as the -programmer, should bind the functions you write to descriptive names as -well. Readline provides a function for doing that: - -@deftypefun int rl_add_defun (const char *name, rl_command_func_t *function, int key) -Add @var{name} to the list of named functions. Make @var{function} be -the function that gets called. If @var{key} is not -1, then bind it to -@var{function} using @code{rl_bind_key()}. -@end deftypefun - -Using this function alone is sufficient for most applications. -It is the recommended way to add a few functions to the default -functions that Readline has built in. -If you need to do something other than adding a function to Readline, -you may need to use the underlying functions described below. - -@node Keymaps -@subsection Selecting a Keymap - -Key bindings take place on a @dfn{keymap}. The keymap is the -association between the keys that the user types and the functions that -get run. You can make your own keymaps, copy existing keymaps, and tell -Readline which keymap to use. - -@deftypefun Keymap rl_make_bare_keymap (void) -Returns a new, empty keymap. The space for the keymap is allocated with -@code{malloc()}; the caller should free it by calling -@code{rl_discard_keymap()} when done. -@end deftypefun - -@deftypefun Keymap rl_copy_keymap (Keymap map) -Return a new keymap which is a copy of @var{map}. -@end deftypefun - -@deftypefun Keymap rl_make_keymap (void) -Return a new keymap with the printing characters bound to rl_insert, -the lowercase Meta characters bound to run their equivalents, and -the Meta digits bound to produce numeric arguments. -@end deftypefun - -@deftypefun void rl_discard_keymap (Keymap keymap) -Free the storage associated with @var{keymap}. -@end deftypefun - -Readline has several internal keymaps. These functions allow you to -change which keymap is active. - -@deftypefun Keymap rl_get_keymap (void) -Returns the currently active keymap. -@end deftypefun - -@deftypefun void rl_set_keymap (Keymap keymap) -Makes @var{keymap} the currently active keymap. -@end deftypefun - -@deftypefun Keymap rl_get_keymap_by_name (const char *name) -Return the keymap matching @var{name}. @var{name} is one which would -be supplied in a @code{set keymap} inputrc line (@pxref{Readline Init File}). -@end deftypefun - -@deftypefun {char *} rl_get_keymap_name (Keymap keymap) -Return the name matching @var{keymap}. @var{name} is one which would -be supplied in a @code{set keymap} inputrc line (@pxref{Readline Init File}). -@end deftypefun - -@node Binding Keys -@subsection Binding Keys - -Key sequences are associate with functions through the keymap. -Readline has several internal keymaps: @code{emacs_standard_keymap}, -@code{emacs_meta_keymap}, @code{emacs_ctlx_keymap}, -@code{vi_movement_keymap}, and @code{vi_insertion_keymap}. -@code{emacs_standard_keymap} is the default, and the examples in -this manual assume that. - -Since @code{readline()} installs a set of default key bindings the first -time it is called, there is always the danger that a custom binding -installed before the first call to @code{readline()} will be overridden. -An alternate mechanism is to install custom key bindings in an -initialization function assigned to the @code{rl_startup_hook} variable -(@pxref{Readline Variables}). - -These functions manage key bindings. - -@deftypefun int rl_bind_key (int key, rl_command_func_t *function) -Binds @var{key} to @var{function} in the currently active keymap. -Returns non-zero in the case of an invalid @var{key}. -@end deftypefun - -@deftypefun int rl_bind_key_in_map (int key, rl_command_func_t *function, Keymap map) -Bind @var{key} to @var{function} in @var{map}. -Returns non-zero in the case of an invalid @var{key}. -@end deftypefun - -@deftypefun int rl_bind_key_if_unbound (int key, rl_command_func_t *function) -Binds @var{key} to @var{function} if it is not already bound in the -currently active keymap. -Returns non-zero in the case of an invalid @var{key} or if @var{key} is -already bound. -@end deftypefun - -@deftypefun int rl_bind_key_if_unbound_in_map (int key, rl_command_func_t *function, Keymap map) -Binds @var{key} to @var{function} if it is not already bound in @var{map}. -Returns non-zero in the case of an invalid @var{key} or if @var{key} is -already bound. -@end deftypefun - -@deftypefun int rl_unbind_key (int key) -Bind @var{key} to the null function in the currently active keymap. -Returns non-zero in case of error. -@end deftypefun - -@deftypefun int rl_unbind_key_in_map (int key, Keymap map) -Bind @var{key} to the null function in @var{map}. -Returns non-zero in case of error. -@end deftypefun - -@deftypefun int rl_unbind_function_in_map (rl_command_func_t *function, Keymap map) -Unbind all keys that execute @var{function} in @var{map}. -@end deftypefun - -@deftypefun int rl_unbind_command_in_map (const char *command, Keymap map) -Unbind all keys that are bound to @var{command} in @var{map}. -@end deftypefun - -@deftypefun int rl_bind_keyseq (const char *keyseq, rl_command_func_t *function) -Bind the key sequence represented by the string @var{keyseq} to the function -@var{function}, beginning in the current keymap. -This makes new keymaps as necessary. -The return value is non-zero if @var{keyseq} is invalid. -@end deftypefun - -@deftypefun int rl_bind_keyseq_in_map (const char *keyseq, rl_command_func_t *function, Keymap map) -Bind the key sequence represented by the string @var{keyseq} to the function -@var{function}. This makes new keymaps as necessary. -Initial bindings are performed in @var{map}. -The return value is non-zero if @var{keyseq} is invalid. -@end deftypefun - -@deftypefun int rl_set_key (const char *keyseq, rl_command_func_t *function, Keymap map) -Equivalent to @code{rl_bind_keyseq_in_map}. -@end deftypefun - -@deftypefun int rl_bind_keyseq_if_unbound (const char *keyseq, rl_command_func_t *function) -Binds @var{keyseq} to @var{function} if it is not already bound in the -currently active keymap. -Returns non-zero in the case of an invalid @var{keyseq} or if @var{keyseq} is -already bound. -@end deftypefun - -@deftypefun int rl_bind_keyseq_if_unbound_in_map (const char *keyseq, rl_command_func_t *function, Keymap map) -Binds @var{keyseq} to @var{function} if it is not already bound in @var{map}. -Returns non-zero in the case of an invalid @var{keyseq} or if @var{keyseq} is -already bound. -@end deftypefun - -@deftypefun int rl_generic_bind (int type, const char *keyseq, char *data, Keymap map) -Bind the key sequence represented by the string @var{keyseq} to the arbitrary -pointer @var{data}. @var{type} says what kind of data is pointed to by -@var{data}; this can be a function (@code{ISFUNC}), a macro -(@code{ISMACR}), or a keymap (@code{ISKMAP}). This makes new keymaps as -necessary. The initial keymap in which to do bindings is @var{map}. -@end deftypefun - -@deftypefun int rl_parse_and_bind (char *line) -Parse @var{line} as if it had been read from the @code{inputrc} file and -perform any key bindings and variable assignments found -(@pxref{Readline Init File}). -@end deftypefun - -@deftypefun int rl_read_init_file (const char *filename) -Read keybindings and variable assignments from @var{filename} -(@pxref{Readline Init File}). -@end deftypefun - -@node Associating Function Names and Bindings -@subsection Associating Function Names and Bindings - -These functions allow you to find out what keys invoke named functions -and the functions invoked by a particular key sequence. You may also -associate a new function name with an arbitrary function. - -@deftypefun {rl_command_func_t *} rl_named_function (const char *name) -Return the function with name @var{name}. -@end deftypefun - -@deftypefun {rl_command_func_t *} rl_function_of_keyseq (const char *keyseq, Keymap map, int *type) -Return the function invoked by @var{keyseq} in keymap @var{map}. -If @var{map} is @code{NULL}, the current keymap is used. If @var{type} is -not @code{NULL}, the type of the object is returned in the @code{int} variable -it points to (one of @code{ISFUNC}, @code{ISKMAP}, or @code{ISMACR}). -@end deftypefun - -@deftypefun {char **} rl_invoking_keyseqs (rl_command_func_t *function) -Return an array of strings representing the key sequences used to -invoke @var{function} in the current keymap. -@end deftypefun - -@deftypefun {char **} rl_invoking_keyseqs_in_map (rl_command_func_t *function, Keymap map) -Return an array of strings representing the key sequences used to -invoke @var{function} in the keymap @var{map}. -@end deftypefun - -@deftypefun void rl_function_dumper (int readable) -Print the readline function names and the key sequences currently -bound to them to @code{rl_outstream}. If @var{readable} is non-zero, -the list is formatted in such a way that it can be made part of an -@code{inputrc} file and re-read. -@end deftypefun - -@deftypefun void rl_list_funmap_names (void) -Print the names of all bindable Readline functions to @code{rl_outstream}. -@end deftypefun - -@deftypefun {const char **} rl_funmap_names (void) -Return a NULL terminated array of known function names. The array is -sorted. The array itself is allocated, but not the strings inside. You -should @code{free()} the array when you are done, but not the pointers. -@end deftypefun - -@deftypefun int rl_add_funmap_entry (const char *name, rl_command_func_t *function) -Add @var{name} to the list of bindable Readline command names, and make -@var{function} the function to be called when @var{name} is invoked. -@end deftypefun - -@node Allowing Undoing -@subsection Allowing Undoing - -Supporting the undo command is a painless thing, and makes your -functions much more useful. It is certainly easy to try -something if you know you can undo it. - -If your function simply inserts text once, or deletes text once, and -uses @code{rl_insert_text()} or @code{rl_delete_text()} to do it, then -undoing is already done for you automatically. - -If you do multiple insertions or multiple deletions, or any combination -of these operations, you should group them together into one operation. -This is done with @code{rl_begin_undo_group()} and -@code{rl_end_undo_group()}. - -The types of events that can be undone are: - -@smallexample -enum undo_code @{ UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END @}; -@end smallexample - -Notice that @code{UNDO_DELETE} means to insert some text, and -@code{UNDO_INSERT} means to delete some text. That is, the undo code -tells what to undo, not how to undo it. @code{UNDO_BEGIN} and -@code{UNDO_END} are tags added by @code{rl_begin_undo_group()} and -@code{rl_end_undo_group()}. - -@deftypefun int rl_begin_undo_group (void) -Begins saving undo information in a group construct. The undo -information usually comes from calls to @code{rl_insert_text()} and -@code{rl_delete_text()}, but could be the result of calls to -@code{rl_add_undo()}. -@end deftypefun - -@deftypefun int rl_end_undo_group (void) -Closes the current undo group started with @code{rl_begin_undo_group -()}. There should be one call to @code{rl_end_undo_group()} -for each call to @code{rl_begin_undo_group()}. -@end deftypefun - -@deftypefun void rl_add_undo (enum undo_code what, int start, int end, char *text) -Remember how to undo an event (according to @var{what}). The affected -text runs from @var{start} to @var{end}, and encompasses @var{text}. -@end deftypefun - -@deftypefun void rl_free_undo_list (void) -Free the existing undo list. -@end deftypefun - -@deftypefun int rl_do_undo (void) -Undo the first thing on the undo list. Returns @code{0} if there was -nothing to undo, non-zero if something was undone. -@end deftypefun - -Finally, if you neither insert nor delete text, but directly modify the -existing text (e.g., change its case), call @code{rl_modifying()} -once, just before you modify the text. You must supply the indices of -the text range that you are going to modify. - -@deftypefun int rl_modifying (int start, int end) -Tell Readline to save the text between @var{start} and @var{end} as a -single undo unit. It is assumed that you will subsequently modify -that text. -@end deftypefun - -@node Redisplay -@subsection Redisplay - -@deftypefun void rl_redisplay (void) -Change what's displayed on the screen to reflect the current contents -of @code{rl_line_buffer}. -@end deftypefun - -@deftypefun int rl_forced_update_display (void) -Force the line to be updated and redisplayed, whether or not -Readline thinks the screen display is correct. -@end deftypefun - -@deftypefun int rl_on_new_line (void) -Tell the update functions that we have moved onto a new (empty) line, -usually after ouputting a newline. -@end deftypefun - -@deftypefun int rl_on_new_line_with_prompt (void) -Tell the update functions that we have moved onto a new line, with -@var{rl_prompt} already displayed. -This could be used by applications that want to output the prompt string -themselves, but still need Readline to know the prompt string length for -redisplay. -It should be used after setting @var{rl_already_prompted}. -@end deftypefun - -@deftypefun int rl_reset_line_state (void) -Reset the display state to a clean state and redisplay the current line -starting on a new line. -@end deftypefun - -@deftypefun int rl_crlf (void) -Move the cursor to the start of the next screen line. -@end deftypefun - -@deftypefun int rl_show_char (int c) -Display character @var{c} on @code{rl_outstream}. -If Readline has not been set to display meta characters directly, this -will convert meta characters to a meta-prefixed key sequence. -This is intended for use by applications which wish to do their own -redisplay. -@end deftypefun - -@deftypefun int rl_message (const char *, @dots{}) -The arguments are a format string as would be supplied to @code{printf}, -possibly containing conversion specifications such as @samp{%d}, and -any additional arguments necessary to satisfy the conversion specifications. -The resulting string is displayed in the @dfn{echo area}. The echo area -is also used to display numeric arguments and search strings. -@end deftypefun - -@deftypefun int rl_clear_message (void) -Clear the message in the echo area. -@end deftypefun - -@deftypefun void rl_save_prompt (void) -Save the local Readline prompt display state in preparation for -displaying a new message in the message area with @code{rl_message()}. -@end deftypefun - -@deftypefun void rl_restore_prompt (void) -Restore the local Readline prompt display state saved by the most -recent call to @code{rl_save_prompt}. -@end deftypefun - -@deftypefun int rl_expand_prompt (char *prompt) -Expand any special character sequences in @var{prompt} and set up the -local Readline prompt redisplay variables. -This function is called by @code{readline()}. It may also be called to -expand the primary prompt if the @code{rl_on_new_line_with_prompt()} -function or @code{rl_already_prompted} variable is used. -It returns the number of visible characters on the last line of the -(possibly multi-line) prompt. -Applications may indicate that the prompt contains characters that take -up no physical screen space when displayed by bracketing a sequence of -such characters with the special markers @code{RL_PROMPT_START_IGNORE} -and @code{RL_PROMPT_END_IGNORE} (declared in @file{readline.h}. This may -be used to embed terminal-specific escape sequences in prompts. -@end deftypefun - -@deftypefun int rl_set_prompt (const char *prompt) -Make Readline use @var{prompt} for subsequent redisplay. This calls -@code{rl_expand_prompt()} to expand the prompt and sets @code{rl_prompt} -to the result. -@end deftypefun - -@node Modifying Text -@subsection Modifying Text - -@deftypefun int rl_insert_text (const char *text) -Insert @var{text} into the line at the current cursor position. -Returns the number of characters inserted. -@end deftypefun - -@deftypefun int rl_delete_text (int start, int end) -Delete the text between @var{start} and @var{end} in the current line. -Returns the number of characters deleted. -@end deftypefun - -@deftypefun {char *} rl_copy_text (int start, int end) -Return a copy of the text between @var{start} and @var{end} in -the current line. -@end deftypefun - -@deftypefun int rl_kill_text (int start, int end) -Copy the text between @var{start} and @var{end} in the current line -to the kill ring, appending or prepending to the last kill if the -last command was a kill command. The text is deleted. -If @var{start} is less than @var{end}, -the text is appended, otherwise prepended. If the last command was -not a kill, a new kill ring slot is used. -@end deftypefun - -@deftypefun int rl_push_macro_input (char *macro) -Cause @var{macro} to be inserted into the line, as if it had been invoked -by a key bound to a macro. Not especially useful; use -@code{rl_insert_text()} instead. -@end deftypefun - -@node Character Input -@subsection Character Input - -@deftypefun int rl_read_key (void) -Return the next character available from Readline's current input stream. -This handles input inserted into -the input stream via @var{rl_pending_input} (@pxref{Readline Variables}) -and @code{rl_stuff_char()}, macros, and characters read from the keyboard. -While waiting for input, this function will call any function assigned to -the @code{rl_event_hook} variable. -@end deftypefun - -@deftypefun int rl_getc (FILE *stream) -Return the next character available from @var{stream}, which is assumed to -be the keyboard. -@end deftypefun - -@deftypefun int rl_stuff_char (int c) -Insert @var{c} into the Readline input stream. It will be "read" -before Readline attempts to read characters from the terminal with -@code{rl_read_key()}. Up to 512 characters may be pushed back. -@code{rl_stuff_char} returns 1 if the character was successfully inserted; -0 otherwise. -@end deftypefun - -@deftypefun int rl_execute_next (int c) -Make @var{c} be the next command to be executed when @code{rl_read_key()} -is called. This sets @var{rl_pending_input}. -@end deftypefun - -@deftypefun int rl_clear_pending_input (void) -Unset @var{rl_pending_input}, effectively negating the effect of any -previous call to @code{rl_execute_next()}. This works only if the -pending input has not already been read with @code{rl_read_key()}. -@end deftypefun - -@deftypefun int rl_set_keyboard_input_timeout (int u) -While waiting for keyboard input in @code{rl_read_key()}, Readline will -wait for @var{u} microseconds for input before calling any function -assigned to @code{rl_event_hook}. The default waiting period is -one-tenth of a second. Returns the old timeout value. -@end deftypefun - -@node Terminal Management -@subsection Terminal Management - -@deftypefun void rl_prep_terminal (int meta_flag) -Modify the terminal settings for Readline's use, so @code{readline()} -can read a single character at a time from the keyboard. -The @var{meta_flag} argument should be non-zero if Readline should -read eight-bit input. -@end deftypefun - -@deftypefun void rl_deprep_terminal (void) -Undo the effects of @code{rl_prep_terminal()}, leaving the terminal in -the state in which it was before the most recent call to -@code{rl_prep_terminal()}. -@end deftypefun - -@deftypefun void rl_tty_set_default_bindings (Keymap kmap) -Read the operating system's terminal editing characters (as would be -displayed by @code{stty}) to their Readline equivalents. -The bindings are performed in @var{kmap}. -@end deftypefun - -@deftypefun void rl_tty_unset_default_bindings (Keymap kmap) -Reset the bindings manipulated by @code{rl_tty_set_default_bindings} so -that the terminal editing characters are bound to @code{rl_insert}. -The bindings are performed in @var{kmap}. -@end deftypefun - -@deftypefun int rl_reset_terminal (const char *terminal_name) -Reinitialize Readline's idea of the terminal settings using -@var{terminal_name} as the terminal type (e.g., @code{vt100}). -If @var{terminal_name} is @code{NULL}, the value of the @code{TERM} -environment variable is used. -@end deftypefun - -@node Utility Functions -@subsection Utility Functions - -@deftypefun void rl_replace_line (const char *text, int clear_undo) -Replace the contents of @code{rl_line_buffer} with @var{text}. -The point and mark are preserved, if possible. -If @var{clear_undo} is non-zero, the undo list associated with the -current line is cleared. -@end deftypefun - -@deftypefun int rl_extend_line_buffer (int len) -Ensure that @code{rl_line_buffer} has enough space to hold @var{len} -characters, possibly reallocating it if necessary. -@end deftypefun - -@deftypefun int rl_initialize (void) -Initialize or re-initialize Readline's internal state. -It's not strictly necessary to call this; @code{readline()} calls it before -reading any input. -@end deftypefun - -@deftypefun int rl_ding (void) -Ring the terminal bell, obeying the setting of @code{bell-style}. -@end deftypefun - -@deftypefun int rl_alphabetic (int c) -Return 1 if @var{c} is an alphabetic character. -@end deftypefun - -@deftypefun void rl_display_match_list (char **matches, int len, int max) -A convenience function for displaying a list of strings in -columnar format on Readline's output stream. @code{matches} is the list -of strings, in argv format, such as a list of completion matches. -@code{len} is the number of strings in @code{matches}, and @code{max} -is the length of the longest string in @code{matches}. This function uses -the setting of @code{print-completions-horizontally} to select how the -matches are displayed (@pxref{Readline Init File Syntax}). -@end deftypefun - -The following are implemented as macros, defined in @code{chardefs.h}. -Applications should refrain from using them. - -@deftypefun int _rl_uppercase_p (int c) -Return 1 if @var{c} is an uppercase alphabetic character. -@end deftypefun - -@deftypefun int _rl_lowercase_p (int c) -Return 1 if @var{c} is a lowercase alphabetic character. -@end deftypefun - -@deftypefun int _rl_digit_p (int c) -Return 1 if @var{c} is a numeric character. -@end deftypefun - -@deftypefun int _rl_to_upper (int c) -If @var{c} is a lowercase alphabetic character, return the corresponding -uppercase character. -@end deftypefun - -@deftypefun int _rl_to_lower (int c) -If @var{c} is an uppercase alphabetic character, return the corresponding -lowercase character. -@end deftypefun - -@deftypefun int _rl_digit_value (int c) -If @var{c} is a number, return the value it represents. -@end deftypefun - -@node Miscellaneous Functions -@subsection Miscellaneous Functions - -@deftypefun int rl_macro_bind (const char *keyseq, const char *macro, Keymap map) -Bind the key sequence @var{keyseq} to invoke the macro @var{macro}. -The binding is performed in @var{map}. When @var{keyseq} is invoked, the -@var{macro} will be inserted into the line. This function is deprecated; -use @code{rl_generic_bind()} instead. -@end deftypefun - -@deftypefun void rl_macro_dumper (int readable) -Print the key sequences bound to macros and their values, using -the current keymap, to @code{rl_outstream}. -If @var{readable} is non-zero, the list is formatted in such a way -that it can be made part of an @code{inputrc} file and re-read. -@end deftypefun - -@deftypefun int rl_variable_bind (const char *variable, const char *value) -Make the Readline variable @var{variable} have @var{value}. -This behaves as if the readline command -@samp{set @var{variable} @var{value}} had been executed in an @code{inputrc} -file (@pxref{Readline Init File Syntax}). -@end deftypefun - -@deftypefun void rl_variable_dumper (int readable) -Print the readline variable names and their current values -to @code{rl_outstream}. -If @var{readable} is non-zero, the list is formatted in such a way -that it can be made part of an @code{inputrc} file and re-read. -@end deftypefun - -@deftypefun int rl_set_paren_blink_timeout (int u) -Set the time interval (in microseconds) that Readline waits when showing -a balancing character when @code{blink-matching-paren} has been enabled. -@end deftypefun - -@deftypefun {char *} rl_get_termcap (const char *cap) -Retrieve the string value of the termcap capability @var{cap}. -Readline fetches the termcap entry for the current terminal name and -uses those capabilities to move around the screen line and perform other -terminal-specific operations, like erasing a line. Readline does not -use all of a terminal's capabilities, and this function will return -values for only those capabilities Readline uses. -@end deftypefun - -@node Alternate Interface -@subsection Alternate Interface - -An alternate interface is available to plain @code{readline()}. Some -applications need to interleave keyboard I/O with file, device, or -window system I/O, typically by using a main loop to @code{select()} -on various file descriptors. To accomodate this need, readline can -also be invoked as a `callback' function from an event loop. There -are functions available to make this easy. - -@deftypefun void rl_callback_handler_install (const char *prompt, rl_vcpfunc_t *lhandler) -Set up the terminal for readline I/O and display the initial -expanded value of @var{prompt}. Save the value of @var{lhandler} to -use as a function to call when a complete line of input has been entered. -The function takes the text of the line as an argument. -@end deftypefun - -@deftypefun void rl_callback_read_char (void) -Whenever an application determines that keyboard input is available, it -should call @code{rl_callback_read_char()}, which will read the next -character from the current input source. -If that character completes the line, @code{rl_callback_read_char} will -invoke the @var{lhandler} function saved by @code{rl_callback_handler_install} -to process the line. -Before calling the @var{lhandler} function, the terminal settings are -reset to the values they had before calling -@code{rl_callback_handler_install}. -If the @var{lhandler} function returns, -the terminal settings are modified for Readline's use again. -@code{EOF} is indicated by calling @var{lhandler} with a -@code{NULL} line. -@end deftypefun - -@deftypefun void rl_callback_handler_remove (void) -Restore the terminal to its initial state and remove the line handler. -This may be called from within a callback as well as independently. -If the @var{lhandler} installed by @code{rl_callback_handler_install} -does not exit the program, either this function or the function referred -to by the value of @code{rl_deprep_term_function} should be called before -the program exits to reset the terminal settings. -@end deftypefun - -@node A Readline Example -@subsection A Readline Example - -Here is a function which changes lowercase characters to their uppercase -equivalents, and uppercase characters to lowercase. If -this function was bound to @samp{M-c}, then typing @samp{M-c} would -change the case of the character under point. Typing @samp{M-1 0 M-c} -would change the case of the following 10 characters, leaving the cursor on -the last character changed. - -@example -/* Invert the case of the COUNT following characters. */ -int -invert_case_line (count, key) - int count, key; -@{ - register int start, end, i; - - start = rl_point; - - if (rl_point >= rl_end) - return (0); - - if (count < 0) - @{ - direction = -1; - count = -count; - @} - else - direction = 1; - - /* Find the end of the range to modify. */ - end = start + (count * direction); - - /* Force it to be within range. */ - if (end > rl_end) - end = rl_end; - else if (end < 0) - end = 0; - - if (start == end) - return (0); - - if (start > end) - @{ - int temp = start; - start = end; - end = temp; - @} - - /* Tell readline that we are modifying the line, - so it will save the undo information. */ - rl_modifying (start, end); - - for (i = start; i != end; i++) - @{ - if (_rl_uppercase_p (rl_line_buffer[i])) - rl_line_buffer[i] = _rl_to_lower (rl_line_buffer[i]); - else if (_rl_lowercase_p (rl_line_buffer[i])) - rl_line_buffer[i] = _rl_to_upper (rl_line_buffer[i]); - @} - /* Move point to on top of the last character changed. */ - rl_point = (direction == 1) ? end - 1 : start; - return (0); -@} -@end example - -@node Readline Signal Handling -@section Readline Signal Handling - -Signals are asynchronous events sent to a process by the Unix kernel, -sometimes on behalf of another process. They are intended to indicate -exceptional events, like a user pressing the interrupt key on his terminal, -or a network connection being broken. There is a class of signals that can -be sent to the process currently reading input from the keyboard. Since -Readline changes the terminal attributes when it is called, it needs to -perform special processing when such a signal is received in order to -restore the terminal to a sane state, or provide application writers with -functions to do so manually. - -Readline contains an internal signal handler that is installed for a -number of signals (@code{SIGINT}, @code{SIGQUIT}, @code{SIGTERM}, -@code{SIGALRM}, @code{SIGTSTP}, @code{SIGTTIN}, and @code{SIGTTOU}). -When one of these signals is received, the signal handler -will reset the terminal attributes to those that were in effect before -@code{readline()} was called, reset the signal handling to what it was -before @code{readline()} was called, and resend the signal to the calling -application. -If and when the calling application's signal handler returns, Readline -will reinitialize the terminal and continue to accept input. -When a @code{SIGINT} is received, the Readline signal handler performs -some additional work, which will cause any partially-entered line to be -aborted (see the description of @code{rl_free_line_state()} below). - -There is an additional Readline signal handler, for @code{SIGWINCH}, which -the kernel sends to a process whenever the terminal's size changes (for -example, if a user resizes an @code{xterm}). The Readline @code{SIGWINCH} -handler updates Readline's internal screen size information, and then calls -any @code{SIGWINCH} signal handler the calling application has installed. -Readline calls the application's @code{SIGWINCH} signal handler without -resetting the terminal to its original state. If the application's signal -handler does more than update its idea of the terminal size and return (for -example, a @code{longjmp} back to a main processing loop), it @emph{must} -call @code{rl_cleanup_after_signal()} (described below), to restore the -terminal state. - -Readline provides two variables that allow application writers to -control whether or not it will catch certain signals and act on them -when they are received. It is important that applications change the -values of these variables only when calling @code{readline()}, not in -a signal handler, so Readline's internal signal state is not corrupted. - -@deftypevar int rl_catch_signals -If this variable is non-zero, Readline will install signal handlers for -@code{SIGINT}, @code{SIGQUIT}, @code{SIGTERM}, @code{SIGALRM}, -@code{SIGTSTP}, @code{SIGTTIN}, and @code{SIGTTOU}. - -The default value of @code{rl_catch_signals} is 1. -@end deftypevar - -@deftypevar int rl_catch_sigwinch -If this variable is non-zero, Readline will install a signal handler for -@code{SIGWINCH}. - -The default value of @code{rl_catch_sigwinch} is 1. -@end deftypevar - -If an application does not wish to have Readline catch any signals, or -to handle signals other than those Readline catches (@code{SIGHUP}, -for example), -Readline provides convenience functions to do the necessary terminal -and internal state cleanup upon receipt of a signal. - -@deftypefun void rl_cleanup_after_signal (void) -This function will reset the state of the terminal to what it was before -@code{readline()} was called, and remove the Readline signal handlers for -all signals, depending on the values of @code{rl_catch_signals} and -@code{rl_catch_sigwinch}. -@end deftypefun - -@deftypefun void rl_free_line_state (void) -This will free any partial state associated with the current input line -(undo information, any partial history entry, any partially-entered -keyboard macro, and any partially-entered numeric argument). This -should be called before @code{rl_cleanup_after_signal()}. The -Readline signal handler for @code{SIGINT} calls this to abort the -current input line. -@end deftypefun - -@deftypefun void rl_reset_after_signal (void) -This will reinitialize the terminal and reinstall any Readline signal -handlers, depending on the values of @code{rl_catch_signals} and -@code{rl_catch_sigwinch}. -@end deftypefun - -If an application does not wish Readline to catch @code{SIGWINCH}, it may -call @code{rl_resize_terminal()} or @code{rl_set_screen_size()} to force -Readline to update its idea of the terminal size when a @code{SIGWINCH} -is received. - -@deftypefun void rl_resize_terminal (void) -Update Readline's internal screen size by reading values from the kernel. -@end deftypefun - -@deftypefun void rl_set_screen_size (int rows, int cols) -Set Readline's idea of the terminal size to @var{rows} rows and -@var{cols} columns. -@end deftypefun - -If an application does not want to install a @code{SIGWINCH} handler, but -is still interested in the screen dimensions, Readline's idea of the screen -size may be queried. - -@deftypefun void rl_get_screen_size (int *rows, int *cols) -Return Readline's idea of the terminal's size in the -variables pointed to by the arguments. -@end deftypefun - -The following functions install and remove Readline's signal handlers. - -@deftypefun int rl_set_signals (void) -Install Readline's signal handler for @code{SIGINT}, @code{SIGQUIT}, -@code{SIGTERM}, @code{SIGALRM}, @code{SIGTSTP}, @code{SIGTTIN}, -@code{SIGTTOU}, and @code{SIGWINCH}, depending on the values of -@code{rl_catch_signals} and @code{rl_catch_sigwinch}. -@end deftypefun - -@deftypefun int rl_clear_signals (void) -Remove all of the Readline signal handlers installed by -@code{rl_set_signals()}. -@end deftypefun - -@node Custom Completers -@section Custom Completers -@cindex application-specific completion functions - -Typically, a program that reads commands from the user has a way of -disambiguating commands and data. If your program is one of these, then -it can provide completion for commands, data, or both. -The following sections describe how your program and Readline -cooperate to provide this service. - -@menu -* How Completing Works:: The logic used to do completion. -* Completion Functions:: Functions provided by Readline. -* Completion Variables:: Variables which control completion. -* A Short Completion Example:: An example of writing completer subroutines. -@end menu - -@node How Completing Works -@subsection How Completing Works - -In order to complete some text, the full list of possible completions -must be available. That is, it is not possible to accurately -expand a partial word without knowing all of the possible words -which make sense in that context. The Readline library provides -the user interface to completion, and two of the most common -completion functions: filename and username. For completing other types -of text, you must write your own completion function. This section -describes exactly what such functions must do, and provides an example. - -There are three major functions used to perform completion: - -@enumerate -@item -The user-interface function @code{rl_complete()}. This function is -called with the same arguments as other bindable Readline functions: -@var{count} and @var{invoking_key}. -It isolates the word to be completed and calls -@code{rl_completion_matches()} to generate a list of possible completions. -It then either lists the possible completions, inserts the possible -completions, or actually performs the -completion, depending on which behavior is desired. - -@item -The internal function @code{rl_completion_matches()} uses an -application-supplied @dfn{generator} function to generate the list of -possible matches, and then returns the array of these matches. -The caller should place the address of its generator function in -@code{rl_completion_entry_function}. - -@item -The generator function is called repeatedly from -@code{rl_completion_matches()}, returning a string each time. The -arguments to the generator function are @var{text} and @var{state}. -@var{text} is the partial word to be completed. @var{state} is zero the -first time the function is called, allowing the generator to perform -any necessary initialization, and a positive non-zero integer for -each subsequent call. The generator function returns -@code{(char *)NULL} to inform @code{rl_completion_matches()} that there are -no more possibilities left. Usually the generator function computes the -list of possible completions when @var{state} is zero, and returns them -one at a time on subsequent calls. Each string the generator function -returns as a match must be allocated with @code{malloc()}; Readline -frees the strings when it has finished with them. -Such a generator function is referred to as an -@dfn{application-specific completion function}. - -@end enumerate - -@deftypefun int rl_complete (int ignore, int invoking_key) -Complete the word at or before point. You have supplied the function -that does the initial simple matching selection algorithm (see -@code{rl_completion_matches()}). The default is to do filename completion. -@end deftypefun - -@deftypevar {rl_compentry_func_t *} rl_completion_entry_function -This is a pointer to the generator function for -@code{rl_completion_matches()}. -If the value of @code{rl_completion_entry_function} is -@code{NULL} then the default filename generator -function, @code{rl_filename_completion_function()}, is used. -An @dfn{application-specific completion function} is a function whose -address is assigned to @code{rl_completion_entry_function} and whose -return values are used to generate possible completions. -@end deftypevar - -@node Completion Functions -@subsection Completion Functions - -Here is the complete list of callable completion functions present in -Readline. - -@deftypefun int rl_complete_internal (int what_to_do) -Complete the word at or before point. @var{what_to_do} says what to do -with the completion. A value of @samp{?} means list the possible -completions. @samp{TAB} means do standard completion. @samp{*} means -insert all of the possible completions. @samp{!} means to display -all of the possible completions, if there is more than one, as well as -performing partial completion. @samp{@@} is similar to @samp{!}, but -possible completions are not listed if the possible completions share -a common prefix. -@end deftypefun - -@deftypefun int rl_complete (int ignore, int invoking_key) -Complete the word at or before point. You have supplied the function -that does the initial simple matching selection algorithm (see -@code{rl_completion_matches()} and @code{rl_completion_entry_function}). -The default is to do filename -completion. This calls @code{rl_complete_internal()} with an -argument depending on @var{invoking_key}. -@end deftypefun - -@deftypefun int rl_possible_completions (int count, int invoking_key) -List the possible completions. See description of @code{rl_complete -()}. This calls @code{rl_complete_internal()} with an argument of -@samp{?}. -@end deftypefun - -@deftypefun int rl_insert_completions (int count, int invoking_key) -Insert the list of possible completions into the line, deleting the -partially-completed word. See description of @code{rl_complete()}. -This calls @code{rl_complete_internal()} with an argument of @samp{*}. -@end deftypefun - -@deftypefun int rl_completion_mode (rl_command_func_t *cfunc) -Returns the apppriate value to pass to @code{rl_complete_internal()} -depending on whether @var{cfunc} was called twice in succession and -the values of the @code{show-all-if-ambiguous} and -@code{show-all-if-unmodified} variables. -Application-specific completion functions may use this function to present -the same interface as @code{rl_complete()}. -@end deftypefun - -@deftypefun {char **} rl_completion_matches (const char *text, rl_compentry_func_t *entry_func) -Returns an array of strings which is a list of completions for -@var{text}. If there are no completions, returns @code{NULL}. -The first entry in the returned array is the substitution for @var{text}. -The remaining entries are the possible completions. The array is -terminated with a @code{NULL} pointer. - -@var{entry_func} is a function of two args, and returns a -@code{char *}. The first argument is @var{text}. The second is a -state argument; it is zero on the first call, and non-zero on subsequent -calls. @var{entry_func} returns a @code{NULL} pointer to the caller -when there are no more matches. -@end deftypefun - -@deftypefun {char *} rl_filename_completion_function (const char *text, int state) -A generator function for filename completion in the general case. -@var{text} is a partial filename. -The Bash source is a useful reference for writing application-specific -completion functions (the Bash completion functions call this and other -Readline functions). -@end deftypefun - -@deftypefun {char *} rl_username_completion_function (const char *text, int state) -A completion generator for usernames. @var{text} contains a partial -username preceded by a random character (usually @samp{~}). As with all -completion generators, @var{state} is zero on the first call and non-zero -for subsequent calls. -@end deftypefun - -@node Completion Variables -@subsection Completion Variables - -@deftypevar {rl_compentry_func_t *} rl_completion_entry_function -A pointer to the generator function for @code{rl_completion_matches()}. -@code{NULL} means to use @code{rl_filename_completion_function()}, -the default filename completer. -@end deftypevar - -@deftypevar {rl_completion_func_t *} rl_attempted_completion_function -A pointer to an alternative function to create matches. -The function is called with @var{text}, @var{start}, and @var{end}. -@var{start} and @var{end} are indices in @code{rl_line_buffer} defining -the boundaries of @var{text}, which is a character string. -If this function exists and returns @code{NULL}, or if this variable is -set to @code{NULL}, then @code{rl_complete()} will call the value of -@code{rl_completion_entry_function} to generate matches, otherwise the -array of strings returned will be used. -If this function sets the @code{rl_attempted_completion_over} -variable to a non-zero value, Readline will not perform its default -completion even if this function returns no matches. -@end deftypevar - -@deftypevar {rl_quote_func_t *} rl_filename_quoting_function -A pointer to a function that will quote a filename in an -application-specific fashion. This is called if filename completion is being -attempted and one of the characters in @code{rl_filename_quote_characters} -appears in a completed filename. The function is called with -@var{text}, @var{match_type}, and @var{quote_pointer}. The @var{text} -is the filename to be quoted. The @var{match_type} is either -@code{SINGLE_MATCH}, if there is only one completion match, or -@code{MULT_MATCH}. Some functions use this to decide whether or not to -insert a closing quote character. The @var{quote_pointer} is a pointer -to any opening quote character the user typed. Some functions choose -to reset this character. -@end deftypevar - -@deftypevar {rl_dequote_func_t *} rl_filename_dequoting_function -A pointer to a function that will remove application-specific quoting -characters from a filename before completion is attempted, so those -characters do not interfere with matching the text against names in -the filesystem. It is called with @var{text}, the text of the word -to be dequoted, and @var{quote_char}, which is the quoting character -that delimits the filename (usually @samp{'} or @samp{"}). If -@var{quote_char} is zero, the filename was not in an embedded string. -@end deftypevar - -@deftypevar {rl_linebuf_func_t *} rl_char_is_quoted_p -A pointer to a function to call that determines whether or not a specific -character in the line buffer is quoted, according to whatever quoting -mechanism the program calling Readline uses. The function is called with -two arguments: @var{text}, the text of the line, and @var{index}, the -index of the character in the line. It is used to decide whether a -character found in @code{rl_completer_word_break_characters} should be -used to break words for the completer. -@end deftypevar - -@deftypevar {rl_compignore_func_t *} rl_ignore_some_completions_function -This function, if defined, is called by the completer when real filename -completion is done, after all the matching names have been generated. -It is passed a @code{NULL} terminated array of matches. -The first element (@code{matches[0]}) is the -maximal substring common to all matches. This function can -re-arrange the list of matches as required, but each element deleted -from the array must be freed. -@end deftypevar - -@deftypevar {rl_icppfunc_t *} rl_directory_completion_hook -This function, if defined, is allowed to modify the directory portion -of filenames Readline completes. It is called with the address of a -string (the current directory name) as an argument, and may modify that string. -If the string is replaced with a new string, the old value should be freed. -Any modified directory name should have a trailing slash. -The modified value will be displayed as part of the completion, replacing -the directory portion of the pathname the user typed. -It returns an integer that should be non-zero if the function modifies -its directory argument. -It could be used to expand symbolic links or shell variables in pathnames. -@end deftypevar - -@deftypevar {rl_compdisp_func_t *} rl_completion_display_matches_hook -If non-zero, then this is the address of a function to call when -completing a word would normally display the list of possible matches. -This function is called in lieu of Readline displaying the list. -It takes three arguments: -(@code{char **}@var{matches}, @code{int} @var{num_matches}, @code{int} @var{max_length}) -where @var{matches} is the array of matching strings, -@var{num_matches} is the number of strings in that array, and -@var{max_length} is the length of the longest string in that array. -Readline provides a convenience function, @code{rl_display_match_list}, -that takes care of doing the display to Readline's output stream. That -function may be called from this hook. -@end deftypevar - -@deftypevar {const char *} rl_basic_word_break_characters -The basic list of characters that signal a break between words for the -completer routine. The default value of this variable is the characters -which break words for completion in Bash: -@code{" \t\n\"\\'`@@$><=;|&@{("}. -@end deftypevar - -@deftypevar {const char *} rl_basic_quote_characters -A list of quote characters which can cause a word break. -@end deftypevar - -@deftypevar {const char *} rl_completer_word_break_characters -The list of characters that signal a break between words for -@code{rl_complete_internal()}. The default list is the value of -@code{rl_basic_word_break_characters}. -@end deftypevar - -@deftypevar {rl_cpvfunc_t *} rl_completion_word_break_hook -If non-zero, this is the address of a function to call when Readline is -deciding where to separate words for word completion. It should return -a character string like @code{rl_completer_word_break_characters} to be -used to perform the current completion. The function may choose to set -@code{rl_completer_word_break_characters} itself. If the function -returns @code{NULL}, @code{rl_completer_word_break_characters} is used. -@end deftypevar - -@deftypevar {const char *} rl_completer_quote_characters -A list of characters which can be used to quote a substring of the line. -Completion occurs on the entire substring, and within the substring -@code{rl_completer_word_break_characters} are treated as any other character, -unless they also appear within this list. -@end deftypevar - -@deftypevar {const char *} rl_filename_quote_characters -A list of characters that cause a filename to be quoted by the completer -when they appear in a completed filename. The default is the null string. -@end deftypevar - -@deftypevar {const char *} rl_special_prefixes -The list of characters that are word break characters, but should be -left in @var{text} when it is passed to the completion function. -Programs can use this to help determine what kind of completing to do. -For instance, Bash sets this variable to "$@@" so that it can complete -shell variables and hostnames. -@end deftypevar - -@deftypevar int rl_completion_query_items -Up to this many items will be displayed in response to a -possible-completions call. After that, we ask the user if she is sure -she wants to see them all. The default value is 100. -@end deftypevar - -@deftypevar {int} rl_completion_append_character -When a single completion alternative matches at the end of the command -line, this character is appended to the inserted completion text. The -default is a space character (@samp{ }). Setting this to the null -character (@samp{\0}) prevents anything being appended automatically. -This can be changed in application-specific completion functions to -provide the ``most sensible word separator character'' according to -an application-specific command line syntax specification. -@end deftypevar - -@deftypevar int rl_completion_suppress_append -If non-zero, @var{rl_completion_append_character} is not appended to -matches at the end of the command line, as described above. -It is set to 0 before any application-specific completion function -is called, and may only be changed within such a function. -@end deftypevar - -@deftypevar int rl_completion_quote_character -When Readline is completing quoted text, as delimited by one of the -characters in @var{rl_completer_quote_characters}, it sets this variable -to the quoting character found. -This is set before any application-specific completion function is called. -@end deftypevar - -@deftypevar int rl_completion_suppress_quote -If non-zero, Readline does not append a matching quote character when -performing completion on a quoted string. -It is set to 0 before any application-specific completion function -is called, and may only be changed within such a function. -@end deftypevar - -@deftypevar int rl_completion_found_quote -When Readline is completing quoted text, it sets this variable -to a non-zero value if the word being completed contains or is delimited -by any quoting characters, including backslashes. -This is set before any application-specific completion function is called. -@end deftypevar - -@deftypevar int rl_completion_mark_symlink_dirs -If non-zero, a slash will be appended to completed filenames that are -symbolic links to directory names, subject to the value of the -user-settable @var{mark-directories} variable. -This variable exists so that application-specific completion functions -can override the user's global preference (set via the -@var{mark-symlinked-directories} Readline variable) if appropriate. -This variable is set to the user's preference before any -application-specific completion function is called, so unless that -function modifies the value, the user's preferences are honored. -@end deftypevar - -@deftypevar int rl_ignore_completion_duplicates -If non-zero, then duplicates in the matches are removed. -The default is 1. -@end deftypevar - -@deftypevar int rl_filename_completion_desired -Non-zero means that the results of the matches are to be treated as -filenames. This is @emph{always} zero when completion is attempted, -and can only be changed -within an application-specific completion function. If it is set to a -non-zero value by such a function, directory names have a slash appended -and Readline attempts to quote completed filenames if they contain any -characters in @code{rl_filename_quote_characters} and -@code{rl_filename_quoting_desired} is set to a non-zero value. -@end deftypevar - -@deftypevar int rl_filename_quoting_desired -Non-zero means that the results of the matches are to be quoted using -double quotes (or an application-specific quoting mechanism) if the -completed filename contains any characters in -@code{rl_filename_quote_chars}. This is @emph{always} non-zero -when completion is attempted, and can only be changed within an -application-specific completion function. -The quoting is effected via a call to the function pointed to -by @code{rl_filename_quoting_function}. -@end deftypevar - -@deftypevar int rl_attempted_completion_over -If an application-specific completion function assigned to -@code{rl_attempted_completion_function} sets this variable to a non-zero -value, Readline will not perform its default filename completion even -if the application's completion function returns no matches. -It should be set only by an application's completion function. -@end deftypevar - -@deftypevar int rl_completion_type -Set to a character describing the type of completion Readline is currently -attempting; see the description of @code{rl_complete_internal()} -(@pxref{Completion Functions}) for the list of characters. -This is set to the appropriate value before any application-specific -completion function is called, allowing such functions to present -the same interface as @code{rl_complete()}. -@end deftypevar - -@deftypevar int rl_inhibit_completion -If this variable is non-zero, completion is inhibited. The completion -character will be inserted as any other bound to @code{self-insert}. -@end deftypevar - -@node A Short Completion Example -@subsection A Short Completion Example - -Here is a small application demonstrating the use of the GNU Readline -library. It is called @code{fileman}, and the source code resides in -@file{examples/fileman.c}. This sample application provides -completion of command names, line editing features, and access to the -history list. - -@page -@smallexample -/* fileman.c -- A tiny application which demonstrates how to use the - GNU Readline library. This application interactively allows users - to manipulate files and their modes. */ - -#include -#include -#include -#include -#include - -#include -#include - -extern char *xmalloc (); - -/* The names of functions that actually do the manipulation. */ -int com_list __P((char *)); -int com_view __P((char *)); -int com_rename __P((char *)); -int com_stat __P((char *)); -int com_pwd __P((char *)); -int com_delete __P((char *)); -int com_help __P((char *)); -int com_cd __P((char *)); -int com_quit __P((char *)); - -/* A structure which contains information on the commands this program - can understand. */ - -typedef struct @{ - char *name; /* User printable name of the function. */ - rl_icpfunc_t *func; /* Function to call to do the job. */ - char *doc; /* Documentation for this function. */ -@} COMMAND; - -COMMAND commands[] = @{ - @{ "cd", com_cd, "Change to directory DIR" @}, - @{ "delete", com_delete, "Delete FILE" @}, - @{ "help", com_help, "Display this text" @}, - @{ "?", com_help, "Synonym for `help'" @}, - @{ "list", com_list, "List files in DIR" @}, - @{ "ls", com_list, "Synonym for `list'" @}, - @{ "pwd", com_pwd, "Print the current working directory" @}, - @{ "quit", com_quit, "Quit using Fileman" @}, - @{ "rename", com_rename, "Rename FILE to NEWNAME" @}, - @{ "stat", com_stat, "Print out statistics on FILE" @}, - @{ "view", com_view, "View the contents of FILE" @}, - @{ (char *)NULL, (rl_icpfunc_t *)NULL, (char *)NULL @} -@}; - -/* Forward declarations. */ -char *stripwhite (); -COMMAND *find_command (); - -/* The name of this program, as taken from argv[0]. */ -char *progname; - -/* When non-zero, this means the user is done using this program. */ -int done; - -char * -dupstr (s) - int s; -@{ - char *r; - - r = xmalloc (strlen (s) + 1); - strcpy (r, s); - return (r); -@} - -main (argc, argv) - int argc; - char **argv; -@{ - char *line, *s; - - progname = argv[0]; - - initialize_readline (); /* Bind our completer. */ - - /* Loop reading and executing lines until the user quits. */ - for ( ; done == 0; ) - @{ - line = readline ("FileMan: "); - - if (!line) - break; - - /* Remove leading and trailing whitespace from the line. - Then, if there is anything left, add it to the history list - and execute it. */ - s = stripwhite (line); - - if (*s) - @{ - add_history (s); - execute_line (s); - @} - - free (line); - @} - exit (0); -@} - -/* Execute a command line. */ -int -execute_line (line) - char *line; -@{ - register int i; - COMMAND *command; - char *word; - - /* Isolate the command word. */ - i = 0; - while (line[i] && whitespace (line[i])) - i++; - word = line + i; - - while (line[i] && !whitespace (line[i])) - i++; - - if (line[i]) - line[i++] = '\0'; - - command = find_command (word); - - if (!command) - @{ - fprintf (stderr, "%s: No such command for FileMan.\n", word); - return (-1); - @} - - /* Get argument to command, if any. */ - while (whitespace (line[i])) - i++; - - word = line + i; - - /* Call the function. */ - return ((*(command->func)) (word)); -@} - -/* Look up NAME as the name of a command, and return a pointer to that - command. Return a NULL pointer if NAME isn't a command name. */ -COMMAND * -find_command (name) - char *name; -@{ - register int i; - - for (i = 0; commands[i].name; i++) - if (strcmp (name, commands[i].name) == 0) - return (&commands[i]); - - return ((COMMAND *)NULL); -@} - -/* Strip whitespace from the start and end of STRING. Return a pointer - into STRING. */ -char * -stripwhite (string) - char *string; -@{ - register char *s, *t; - - for (s = string; whitespace (*s); s++) - ; - - if (*s == 0) - return (s); - - t = s + strlen (s) - 1; - while (t > s && whitespace (*t)) - t--; - *++t = '\0'; - - return s; -@} - -/* **************************************************************** */ -/* */ -/* Interface to Readline Completion */ -/* */ -/* **************************************************************** */ - -char *command_generator __P((const char *, int)); -char **fileman_completion __P((const char *, int, int)); - -/* Tell the GNU Readline library how to complete. We want to try to - complete on command names if this is the first word in the line, or - on filenames if not. */ -initialize_readline () -@{ - /* Allow conditional parsing of the ~/.inputrc file. */ - rl_readline_name = "FileMan"; - - /* Tell the completer that we want a crack first. */ - rl_attempted_completion_function = fileman_completion; -@} - -/* Attempt to complete on the contents of TEXT. START and END - bound the region of rl_line_buffer that contains the word to - complete. TEXT is the word to complete. We can use the entire - contents of rl_line_buffer in case we want to do some simple - parsing. Returnthe array of matches, or NULL if there aren't any. */ -char ** -fileman_completion (text, start, end) - const char *text; - int start, end; -@{ - char **matches; - - matches = (char **)NULL; - - /* If this word is at the start of the line, then it is a command - to complete. Otherwise it is the name of a file in the current - directory. */ - if (start == 0) - matches = rl_completion_matches (text, command_generator); - - return (matches); -@} - -/* Generator function for command completion. STATE lets us - know whether to start from scratch; without any state - (i.e. STATE == 0), then we start at the top of the list. */ -char * -command_generator (text, state) - const char *text; - int state; -@{ - static int list_index, len; - char *name; - - /* If this is a new word to complete, initialize now. This - includes saving the length of TEXT for efficiency, and - initializing the index variable to 0. */ - if (!state) - @{ - list_index = 0; - len = strlen (text); - @} - - /* Return the next name which partially matches from the - command list. */ - while (name = commands[list_index].name) - @{ - list_index++; - - if (strncmp (name, text, len) == 0) - return (dupstr(name)); - @} - - /* If no names matched, then return NULL. */ - return ((char *)NULL); -@} - -/* **************************************************************** */ -/* */ -/* FileMan Commands */ -/* */ -/* **************************************************************** */ - -/* String to pass to system (). This is for the LIST, VIEW and RENAME - commands. */ -static char syscom[1024]; - -/* List the file(s) named in arg. */ -com_list (arg) - char *arg; -@{ - if (!arg) - arg = ""; - - sprintf (syscom, "ls -FClg %s", arg); - return (system (syscom)); -@} - -com_view (arg) - char *arg; -@{ - if (!valid_argument ("view", arg)) - return 1; - - sprintf (syscom, "more %s", arg); - return (system (syscom)); -@} - -com_rename (arg) - char *arg; -@{ - too_dangerous ("rename"); - return (1); -@} - -com_stat (arg) - char *arg; -@{ - struct stat finfo; - - if (!valid_argument ("stat", arg)) - return (1); - - if (stat (arg, &finfo) == -1) - @{ - perror (arg); - return (1); - @} - - printf ("Statistics for `%s':\n", arg); - - printf ("%s has %d link%s, and is %d byte%s in length.\n", arg, - finfo.st_nlink, - (finfo.st_nlink == 1) ? "" : "s", - finfo.st_size, - (finfo.st_size == 1) ? "" : "s"); - printf ("Inode Last Change at: %s", ctime (&finfo.st_ctime)); - printf (" Last access at: %s", ctime (&finfo.st_atime)); - printf (" Last modified at: %s", ctime (&finfo.st_mtime)); - return (0); -@} - -com_delete (arg) - char *arg; -@{ - too_dangerous ("delete"); - return (1); -@} - -/* Print out help for ARG, or for all of the commands if ARG is - not present. */ -com_help (arg) - char *arg; -@{ - register int i; - int printed = 0; - - for (i = 0; commands[i].name; i++) - @{ - if (!*arg || (strcmp (arg, commands[i].name) == 0)) - @{ - printf ("%s\t\t%s.\n", commands[i].name, commands[i].doc); - printed++; - @} - @} - - if (!printed) - @{ - printf ("No commands match `%s'. Possibilties are:\n", arg); - - for (i = 0; commands[i].name; i++) - @{ - /* Print in six columns. */ - if (printed == 6) - @{ - printed = 0; - printf ("\n"); - @} - - printf ("%s\t", commands[i].name); - printed++; - @} - - if (printed) - printf ("\n"); - @} - return (0); -@} - -/* Change to the directory ARG. */ -com_cd (arg) - char *arg; -@{ - if (chdir (arg) == -1) - @{ - perror (arg); - return 1; - @} - - com_pwd (""); - return (0); -@} - -/* Print out the current working directory. */ -com_pwd (ignore) - char *ignore; -@{ - char dir[1024], *s; - - s = getcwd (dir, sizeof(dir) - 1); - if (s == 0) - @{ - printf ("Error getting pwd: %s\n", dir); - return 1; - @} - - printf ("Current directory is %s\n", dir); - return 0; -@} - -/* The user wishes to quit using this program. Just set DONE - non-zero. */ -com_quit (arg) - char *arg; -@{ - done = 1; - return (0); -@} - -/* Function which tells you that you can't do this. */ -too_dangerous (caller) - char *caller; -@{ - fprintf (stderr, - "%s: Too dangerous for me to distribute.\n" - caller); - fprintf (stderr, "Write it yourself.\n"); -@} - -/* Return non-zero if ARG is a valid argument for CALLER, - else print an error message and return zero. */ -int -valid_argument (caller, arg) - char *caller, *arg; -@{ - if (!arg || !*arg) - @{ - fprintf (stderr, "%s: Argument required.\n", caller); - return (0); - @} - - return (1); -@} -@end smallexample diff --git a/dep/src/readline/src/doc/rluser.texi b/dep/src/readline/src/doc/rluser.texi deleted file mode 100644 index 6fa935075fe..00000000000 --- a/dep/src/readline/src/doc/rluser.texi +++ /dev/null @@ -1,1824 +0,0 @@ -@comment %**start of header (This is for running Texinfo on a region.) -@setfilename rluser.info -@comment %**end of header (This is for running Texinfo on a region.) -@setchapternewpage odd - -@ignore -This file documents the end user interface to the GNU command line -editing features. It is to be an appendix to manuals for programs which -use these features. There is a document entitled "readline.texinfo" -which contains both end-user and programmer documentation for the -GNU Readline Library. - -Copyright (C) 1988-2004 Free Software Foundation, Inc. - -Authored by Brian Fox and Chet Ramey. - -Permission is granted to process this file through Tex and print the -results, provided the printed document carries copying permission notice -identical to this one except for the removal of this paragraph (this -paragraph not being relevant to the printed manual). - -Permission is granted to make and distribute verbatim copies of this manual -provided the copyright notice and this permission notice are preserved on -all copies. - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided also that the -GNU Copyright statement is available to the distributee, and provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions. -@end ignore - -@comment If you are including this manual as an appendix, then set the -@comment variable readline-appendix. - -@ifclear BashFeatures -@defcodeindex bt -@end ifclear - -@node Command Line Editing -@chapter Command Line Editing - -This chapter describes the basic features of the @sc{gnu} -command line editing interface. -@ifset BashFeatures -Command line editing is provided by the Readline library, which is -used by several different programs, including Bash. -@end ifset - -@menu -* Introduction and Notation:: Notation used in this text. -* Readline Interaction:: The minimum set of commands for editing a line. -* Readline Init File:: Customizing Readline from a user's view. -* Bindable Readline Commands:: A description of most of the Readline commands - available for binding -* Readline vi Mode:: A short description of how to make Readline - behave like the vi editor. -@ifset BashFeatures -* Programmable Completion:: How to specify the possible completions for - a specific command. -* Programmable Completion Builtins:: Builtin commands to specify how to - complete arguments for a particular command. -@end ifset -@end menu - -@node Introduction and Notation -@section Introduction to Line Editing - -The following paragraphs describe the notation used to represent -keystrokes. - -The text @kbd{C-k} is read as `Control-K' and describes the character -produced when the @key{k} key is pressed while the Control key -is depressed. - -The text @kbd{M-k} is read as `Meta-K' and describes the character -produced when the Meta key (if you have one) is depressed, and the @key{k} -key is pressed. -The Meta key is labeled @key{ALT} on many keyboards. -On keyboards with two keys labeled @key{ALT} (usually to either side of -the space bar), the @key{ALT} on the left side is generally set to -work as a Meta key. -The @key{ALT} key on the right may also be configured to work as a -Meta key or may be configured as some other modifier, such as a -Compose key for typing accented characters. - -If you do not have a Meta or @key{ALT} key, or another key working as -a Meta key, the identical keystroke can be generated by typing @key{ESC} -@emph{first}, and then typing @key{k}. -Either process is known as @dfn{metafying} the @key{k} key. - -The text @kbd{M-C-k} is read as `Meta-Control-k' and describes the -character produced by @dfn{metafying} @kbd{C-k}. - -In addition, several keys have their own names. Specifically, -@key{DEL}, @key{ESC}, @key{LFD}, @key{SPC}, @key{RET}, and @key{TAB} all -stand for themselves when seen in this text, or in an init file -(@pxref{Readline Init File}). -If your keyboard lacks a @key{LFD} key, typing @key{C-j} will -produce the desired character. -The @key{RET} key may be labeled @key{Return} or @key{Enter} on -some keyboards. - -@node Readline Interaction -@section Readline Interaction -@cindex interaction, readline - -Often during an interactive session you type in a long line of text, -only to notice that the first word on the line is misspelled. The -Readline library gives you a set of commands for manipulating the text -as you type it in, allowing you to just fix your typo, and not forcing -you to retype the majority of the line. Using these editing commands, -you move the cursor to the place that needs correction, and delete or -insert the text of the corrections. Then, when you are satisfied with -the line, you simply press @key{RET}. You do not have to be at the -end of the line to press @key{RET}; the entire line is accepted -regardless of the location of the cursor within the line. - -@menu -* Readline Bare Essentials:: The least you need to know about Readline. -* Readline Movement Commands:: Moving about the input line. -* Readline Killing Commands:: How to delete text, and how to get it back! -* Readline Arguments:: Giving numeric arguments to commands. -* Searching:: Searching through previous lines. -@end menu - -@node Readline Bare Essentials -@subsection Readline Bare Essentials -@cindex notation, readline -@cindex command editing -@cindex editing command lines - -In order to enter characters into the line, simply type them. The typed -character appears where the cursor was, and then the cursor moves one -space to the right. If you mistype a character, you can use your -erase character to back up and delete the mistyped character. - -Sometimes you may mistype a character, and -not notice the error until you have typed several other characters. In -that case, you can type @kbd{C-b} to move the cursor to the left, and then -correct your mistake. Afterwards, you can move the cursor to the right -with @kbd{C-f}. - -When you add text in the middle of a line, you will notice that characters -to the right of the cursor are `pushed over' to make room for the text -that you have inserted. Likewise, when you delete text behind the cursor, -characters to the right of the cursor are `pulled back' to fill in the -blank space created by the removal of the text. A list of the bare -essentials for editing the text of an input line follows. - -@table @asis -@item @kbd{C-b} -Move back one character. -@item @kbd{C-f} -Move forward one character. -@item @key{DEL} or @key{Backspace} -Delete the character to the left of the cursor. -@item @kbd{C-d} -Delete the character underneath the cursor. -@item @w{Printing characters} -Insert the character into the line at the cursor. -@item @kbd{C-_} or @kbd{C-x C-u} -Undo the last editing command. You can undo all the way back to an -empty line. -@end table - -@noindent -(Depending on your configuration, the @key{Backspace} key be set to -delete the character to the left of the cursor and the @key{DEL} key set -to delete the character underneath the cursor, like @kbd{C-d}, rather -than the character to the left of the cursor.) - -@node Readline Movement Commands -@subsection Readline Movement Commands - - -The above table describes the most basic keystrokes that you need -in order to do editing of the input line. For your convenience, many -other commands have been added in addition to @kbd{C-b}, @kbd{C-f}, -@kbd{C-d}, and @key{DEL}. Here are some commands for moving more rapidly -about the line. - -@table @kbd -@item C-a -Move to the start of the line. -@item C-e -Move to the end of the line. -@item M-f -Move forward a word, where a word is composed of letters and digits. -@item M-b -Move backward a word. -@item C-l -Clear the screen, reprinting the current line at the top. -@end table - -Notice how @kbd{C-f} moves forward a character, while @kbd{M-f} moves -forward a word. It is a loose convention that control keystrokes -operate on characters while meta keystrokes operate on words. - -@node Readline Killing Commands -@subsection Readline Killing Commands - -@cindex killing text -@cindex yanking text - -@dfn{Killing} text means to delete the text from the line, but to save -it away for later use, usually by @dfn{yanking} (re-inserting) -it back into the line. -(`Cut' and `paste' are more recent jargon for `kill' and `yank'.) - -If the description for a command says that it `kills' text, then you can -be sure that you can get the text back in a different (or the same) -place later. - -When you use a kill command, the text is saved in a @dfn{kill-ring}. -Any number of consecutive kills save all of the killed text together, so -that when you yank it back, you get it all. The kill -ring is not line specific; the text that you killed on a previously -typed line is available to be yanked back later, when you are typing -another line. -@cindex kill ring - -Here is the list of commands for killing text. - -@table @kbd -@item C-k -Kill the text from the current cursor position to the end of the line. - -@item M-d -Kill from the cursor to the end of the current word, or, if between -words, to the end of the next word. -Word boundaries are the same as those used by @kbd{M-f}. - -@item M-@key{DEL} -Kill from the cursor the start of the current word, or, if between -words, to the start of the previous word. -Word boundaries are the same as those used by @kbd{M-b}. - -@item C-w -Kill from the cursor to the previous whitespace. This is different than -@kbd{M-@key{DEL}} because the word boundaries differ. - -@end table - -Here is how to @dfn{yank} the text back into the line. Yanking -means to copy the most-recently-killed text from the kill buffer. - -@table @kbd -@item C-y -Yank the most recently killed text back into the buffer at the cursor. - -@item M-y -Rotate the kill-ring, and yank the new top. You can only do this if -the prior command is @kbd{C-y} or @kbd{M-y}. -@end table - -@node Readline Arguments -@subsection Readline Arguments - -You can pass numeric arguments to Readline commands. Sometimes the -argument acts as a repeat count, other times it is the @i{sign} of the -argument that is significant. If you pass a negative argument to a -command which normally acts in a forward direction, that command will -act in a backward direction. For example, to kill text back to the -start of the line, you might type @samp{M-- C-k}. - -The general way to pass numeric arguments to a command is to type meta -digits before the command. If the first `digit' typed is a minus -sign (@samp{-}), then the sign of the argument will be negative. Once -you have typed one meta digit to get the argument started, you can type -the remainder of the digits, and then the command. For example, to give -the @kbd{C-d} command an argument of 10, you could type @samp{M-1 0 C-d}, -which will delete the next ten characters on the input line. - -@node Searching -@subsection Searching for Commands in the History - -Readline provides commands for searching through the command history -@ifset BashFeatures -(@pxref{Bash History Facilities}) -@end ifset -for lines containing a specified string. -There are two search modes: @dfn{incremental} and @dfn{non-incremental}. - -Incremental searches begin before the user has finished typing the -search string. -As each character of the search string is typed, Readline displays -the next entry from the history matching the string typed so far. -An incremental search requires only as many characters as needed to -find the desired history entry. -To search backward in the history for a particular string, type -@kbd{C-r}. Typing @kbd{C-s} searches forward through the history. -The characters present in the value of the @code{isearch-terminators} variable -are used to terminate an incremental search. -If that variable has not been assigned a value, the @key{ESC} and -@kbd{C-J} characters will terminate an incremental search. -@kbd{C-g} will abort an incremental search and restore the original line. -When the search is terminated, the history entry containing the -search string becomes the current line. - -To find other matching entries in the history list, type @kbd{C-r} or -@kbd{C-s} as appropriate. -This will search backward or forward in the history for the next -entry matching the search string typed so far. -Any other key sequence bound to a Readline command will terminate -the search and execute that command. -For instance, a @key{RET} will terminate the search and accept -the line, thereby executing the command from the history list. -A movement command will terminate the search, make the last line found -the current line, and begin editing. - -Readline remembers the last incremental search string. If two -@kbd{C-r}s are typed without any intervening characters defining a new -search string, any remembered search string is used. - -Non-incremental searches read the entire search string before starting -to search for matching history lines. The search string may be -typed by the user or be part of the contents of the current line. - -@node Readline Init File -@section Readline Init File -@cindex initialization file, readline - -Although the Readline library comes with a set of Emacs-like -keybindings installed by default, it is possible to use a different set -of keybindings. -Any user can customize programs that use Readline by putting -commands in an @dfn{inputrc} file, conventionally in his home directory. -The name of this -@ifset BashFeatures -file is taken from the value of the shell variable @env{INPUTRC}. If -@end ifset -@ifclear BashFeatures -file is taken from the value of the environment variable @env{INPUTRC}. If -@end ifclear -that variable is unset, the default is @file{~/.inputrc}. - -When a program which uses the Readline library starts up, the -init file is read, and the key bindings are set. - -In addition, the @code{C-x C-r} command re-reads this init file, thus -incorporating any changes that you might have made to it. - -@menu -* Readline Init File Syntax:: Syntax for the commands in the inputrc file. - -* Conditional Init Constructs:: Conditional key bindings in the inputrc file. - -* Sample Init File:: An example inputrc file. -@end menu - -@node Readline Init File Syntax -@subsection Readline Init File Syntax - -There are only a few basic constructs allowed in the -Readline init file. Blank lines are ignored. -Lines beginning with a @samp{#} are comments. -Lines beginning with a @samp{$} indicate conditional -constructs (@pxref{Conditional Init Constructs}). Other lines -denote variable settings and key bindings. - -@table @asis -@item Variable Settings -You can modify the run-time behavior of Readline by -altering the values of variables in Readline -using the @code{set} command within the init file. -The syntax is simple: - -@example -set @var{variable} @var{value} -@end example - -@noindent -Here, for example, is how to -change from the default Emacs-like key binding to use -@code{vi} line editing commands: - -@example -set editing-mode vi -@end example - -Variable names and values, where appropriate, are recognized without regard -to case. - -@ifset BashFeatures -The @w{@code{bind -V}} command lists the current Readline variable names -and values. @xref{Bash Builtins}. -@end ifset - -A great deal of run-time behavior is changeable with the following -variables. - -@cindex variables, readline -@table @code - -@item bell-style -@vindex bell-style -Controls what happens when Readline wants to ring the terminal bell. -If set to @samp{none}, Readline never rings the bell. If set to -@samp{visible}, Readline uses a visible bell if one is available. -If set to @samp{audible} (the default), Readline attempts to ring -the terminal's bell. - -@item comment-begin -@vindex comment-begin -The string to insert at the beginning of the line when the -@code{insert-comment} command is executed. The default value -is @code{"#"}. - -@item completion-ignore-case -If set to @samp{on}, Readline performs filename matching and completion -in a case-insensitive fashion. -The default value is @samp{off}. - -@item completion-query-items -@vindex completion-query-items -The number of possible completions that determines when the user is -asked whether the list of possibilities should be displayed. -If the number of possible completions is greater than this value, -Readline will ask the user whether or not he wishes to view -them; otherwise, they are simply listed. -This variable must be set to an integer value greater than or equal to 0. -The default limit is @code{100}. - -@item convert-meta -@vindex convert-meta -If set to @samp{on}, Readline will convert characters with the -eighth bit set to an @sc{ascii} key sequence by stripping the eighth -bit and prefixing an @key{ESC} character, converting them to a -meta-prefixed key sequence. The default value is @samp{on}. - -@item disable-completion -@vindex disable-completion -If set to @samp{On}, Readline will inhibit word completion. -Completion characters will be inserted into the line as if they had -been mapped to @code{self-insert}. The default is @samp{off}. - -@item editing-mode -@vindex editing-mode -The @code{editing-mode} variable controls which default set of -key bindings is used. By default, Readline starts up in Emacs editing -mode, where the keystrokes are most similar to Emacs. This variable can be -set to either @samp{emacs} or @samp{vi}. - -@item enable-keypad -@vindex enable-keypad -When set to @samp{on}, Readline will try to enable the application -keypad when it is called. Some systems need this to enable the -arrow keys. The default is @samp{off}. - -@item expand-tilde -@vindex expand-tilde -If set to @samp{on}, tilde expansion is performed when Readline -attempts word completion. The default is @samp{off}. - -@vindex history-preserve-point -If set to @samp{on}, the history code attempts to place point at the -same location on each history line retrieved with @code{previous-history} -or @code{next-history}. - -@item horizontal-scroll-mode -@vindex horizontal-scroll-mode -This variable can be set to either @samp{on} or @samp{off}. Setting it -to @samp{on} means that the text of the lines being edited will scroll -horizontally on a single screen line when they are longer than the width -of the screen, instead of wrapping onto a new screen line. By default, -this variable is set to @samp{off}. - -@item input-meta -@vindex input-meta -@vindex meta-flag -If set to @samp{on}, Readline will enable eight-bit input (it -will not clear the eighth bit in the characters it reads), -regardless of what the terminal claims it can support. The -default value is @samp{off}. The name @code{meta-flag} is a -synonym for this variable. - -@item isearch-terminators -@vindex isearch-terminators -The string of characters that should terminate an incremental search without -subsequently executing the character as a command (@pxref{Searching}). -If this variable has not been given a value, the characters @key{ESC} and -@kbd{C-J} will terminate an incremental search. - -@item keymap -@vindex keymap -Sets Readline's idea of the current keymap for key binding commands. -Acceptable @code{keymap} names are -@code{emacs}, -@code{emacs-standard}, -@code{emacs-meta}, -@code{emacs-ctlx}, -@code{vi}, -@code{vi-move}, -@code{vi-command}, and -@code{vi-insert}. -@code{vi} is equivalent to @code{vi-command}; @code{emacs} is -equivalent to @code{emacs-standard}. The default value is @code{emacs}. -The value of the @code{editing-mode} variable also affects the -default keymap. - -@item mark-directories -If set to @samp{on}, completed directory names have a slash -appended. The default is @samp{on}. - -@item mark-modified-lines -@vindex mark-modified-lines -This variable, when set to @samp{on}, causes Readline to display an -asterisk (@samp{*}) at the start of history lines which have been modified. -This variable is @samp{off} by default. - -@item mark-symlinked-directories -@vindex mark-symlinked-directories -If set to @samp{on}, completed names which are symbolic links -to directories have a slash appended (subject to the value of -@code{mark-directories}). -The default is @samp{off}. - -@item match-hidden-files -@vindex match-hidden-files -This variable, when set to @samp{on}, causes Readline to match files whose -names begin with a @samp{.} (hidden files) when performing filename -completion, unless the leading @samp{.} is -supplied by the user in the filename to be completed. -This variable is @samp{on} by default. - -@item output-meta -@vindex output-meta -If set to @samp{on}, Readline will display characters with the -eighth bit set directly rather than as a meta-prefixed escape -sequence. The default is @samp{off}. - -@item page-completions -@vindex page-completions -If set to @samp{on}, Readline uses an internal @code{more}-like pager -to display a screenful of possible completions at a time. -This variable is @samp{on} by default. - -@item print-completions-horizontally -If set to @samp{on}, Readline will display completions with matches -sorted horizontally in alphabetical order, rather than down the screen. -The default is @samp{off}. - -@item show-all-if-ambiguous -@vindex show-all-if-ambiguous -This alters the default behavior of the completion functions. If -set to @samp{on}, -words which have more than one possible completion cause the -matches to be listed immediately instead of ringing the bell. -The default value is @samp{off}. - -@item show-all-if-unmodified -@vindex show-all-if-unmodified -This alters the default behavior of the completion functions in -a fashion similar to @var{show-all-if-ambiguous}. -If set to @samp{on}, -words which have more than one possible completion without any -possible partial completion (the possible completions don't share -a common prefix) cause the matches to be listed immediately instead -of ringing the bell. -The default value is @samp{off}. - -@item visible-stats -@vindex visible-stats -If set to @samp{on}, a character denoting a file's type -is appended to the filename when listing possible -completions. The default is @samp{off}. - -@end table - -@item Key Bindings -The syntax for controlling key bindings in the init file is -simple. First you need to find the name of the command that you -want to change. The following sections contain tables of the command -name, the default keybinding, if any, and a short description of what -the command does. - -Once you know the name of the command, simply place on a line -in the init file the name of the key -you wish to bind the command to, a colon, and then the name of the -command. The name of the key -can be expressed in different ways, depending on what you find most -comfortable. - -In addition to command names, readline allows keys to be bound -to a string that is inserted when the key is pressed (a @var{macro}). - -@ifset BashFeatures -The @w{@code{bind -p}} command displays Readline function names and -bindings in a format that can put directly into an initialization file. -@xref{Bash Builtins}. -@end ifset - -@table @asis -@item @w{@var{keyname}: @var{function-name} or @var{macro}} -@var{keyname} is the name of a key spelled out in English. For example: -@example -Control-u: universal-argument -Meta-Rubout: backward-kill-word -Control-o: "> output" -@end example - -In the above example, @kbd{C-u} is bound to the function -@code{universal-argument}, -@kbd{M-DEL} is bound to the function @code{backward-kill-word}, and -@kbd{C-o} is bound to run the macro -expressed on the right hand side (that is, to insert the text -@samp{> output} into the line). - -A number of symbolic character names are recognized while -processing this key binding syntax: -@var{DEL}, -@var{ESC}, -@var{ESCAPE}, -@var{LFD}, -@var{NEWLINE}, -@var{RET}, -@var{RETURN}, -@var{RUBOUT}, -@var{SPACE}, -@var{SPC}, -and -@var{TAB}. - -@item @w{"@var{keyseq}": @var{function-name} or @var{macro}} -@var{keyseq} differs from @var{keyname} above in that strings -denoting an entire key sequence can be specified, by placing -the key sequence in double quotes. Some @sc{gnu} Emacs style key -escapes can be used, as in the following example, but the -special character names are not recognized. - -@example -"\C-u": universal-argument -"\C-x\C-r": re-read-init-file -"\e[11~": "Function Key 1" -@end example - -In the above example, @kbd{C-u} is again bound to the function -@code{universal-argument} (just as it was in the first example), -@samp{@kbd{C-x} @kbd{C-r}} is bound to the function @code{re-read-init-file}, -and @samp{@key{ESC} @key{[} @key{1} @key{1} @key{~}} is bound to insert -the text @samp{Function Key 1}. - -@end table - -The following @sc{gnu} Emacs style escape sequences are available when -specifying key sequences: - -@table @code -@item @kbd{\C-} -control prefix -@item @kbd{\M-} -meta prefix -@item @kbd{\e} -an escape character -@item @kbd{\\} -backslash -@item @kbd{\"} -@key{"}, a double quotation mark -@item @kbd{\'} -@key{'}, a single quote or apostrophe -@end table - -In addition to the @sc{gnu} Emacs style escape sequences, a second -set of backslash escapes is available: - -@table @code -@item \a -alert (bell) -@item \b -backspace -@item \d -delete -@item \f -form feed -@item \n -newline -@item \r -carriage return -@item \t -horizontal tab -@item \v -vertical tab -@item \@var{nnn} -the eight-bit character whose value is the octal value @var{nnn} -(one to three digits) -@item \x@var{HH} -the eight-bit character whose value is the hexadecimal value @var{HH} -(one or two hex digits) -@end table - -When entering the text of a macro, single or double quotes must -be used to indicate a macro definition. -Unquoted text is assumed to be a function name. -In the macro body, the backslash escapes described above are expanded. -Backslash will quote any other character in the macro text, -including @samp{"} and @samp{'}. -For example, the following binding will make @samp{@kbd{C-x} \} -insert a single @samp{\} into the line: -@example -"\C-x\\": "\\" -@end example - -@end table - -@node Conditional Init Constructs -@subsection Conditional Init Constructs - -Readline implements a facility similar in spirit to the conditional -compilation features of the C preprocessor which allows key -bindings and variable settings to be performed as the result -of tests. There are four parser directives used. - -@table @code -@item $if -The @code{$if} construct allows bindings to be made based on the -editing mode, the terminal being used, or the application using -Readline. The text of the test extends to the end of the line; -no characters are required to isolate it. - -@table @code -@item mode -The @code{mode=} form of the @code{$if} directive is used to test -whether Readline is in @code{emacs} or @code{vi} mode. -This may be used in conjunction -with the @samp{set keymap} command, for instance, to set bindings in -the @code{emacs-standard} and @code{emacs-ctlx} keymaps only if -Readline is starting out in @code{emacs} mode. - -@item term -The @code{term=} form may be used to include terminal-specific -key bindings, perhaps to bind the key sequences output by the -terminal's function keys. The word on the right side of the -@samp{=} is tested against both the full name of the terminal and -the portion of the terminal name before the first @samp{-}. This -allows @code{sun} to match both @code{sun} and @code{sun-cmd}, -for instance. - -@item application -The @var{application} construct is used to include -application-specific settings. Each program using the Readline -library sets the @var{application name}, and you can test for -a particular value. -This could be used to bind key sequences to functions useful for -a specific program. For instance, the following command adds a -key sequence that quotes the current or previous word in Bash: -@example -$if Bash -# Quote the current or previous word -"\C-xq": "\eb\"\ef\"" -$endif -@end example -@end table - -@item $endif -This command, as seen in the previous example, terminates an -@code{$if} command. - -@item $else -Commands in this branch of the @code{$if} directive are executed if -the test fails. - -@item $include -This directive takes a single filename as an argument and reads commands -and bindings from that file. -For example, the following directive reads from @file{/etc/inputrc}: -@example -$include /etc/inputrc -@end example -@end table - -@node Sample Init File -@subsection Sample Init File - -Here is an example of an @var{inputrc} file. This illustrates key -binding, variable assignment, and conditional syntax. - -@example -@page -# This file controls the behaviour of line input editing for -# programs that use the GNU Readline library. Existing -# programs include FTP, Bash, and GDB. -# -# You can re-read the inputrc file with C-x C-r. -# Lines beginning with '#' are comments. -# -# First, include any systemwide bindings and variable -# assignments from /etc/Inputrc -$include /etc/Inputrc - -# -# Set various bindings for emacs mode. - -set editing-mode emacs - -$if mode=emacs - -Meta-Control-h: backward-kill-word Text after the function name is ignored - -# -# Arrow keys in keypad mode -# -#"\M-OD": backward-char -#"\M-OC": forward-char -#"\M-OA": previous-history -#"\M-OB": next-history -# -# Arrow keys in ANSI mode -# -"\M-[D": backward-char -"\M-[C": forward-char -"\M-[A": previous-history -"\M-[B": next-history -# -# Arrow keys in 8 bit keypad mode -# -#"\M-\C-OD": backward-char -#"\M-\C-OC": forward-char -#"\M-\C-OA": previous-history -#"\M-\C-OB": next-history -# -# Arrow keys in 8 bit ANSI mode -# -#"\M-\C-[D": backward-char -#"\M-\C-[C": forward-char -#"\M-\C-[A": previous-history -#"\M-\C-[B": next-history - -C-q: quoted-insert - -$endif - -# An old-style binding. This happens to be the default. -TAB: complete - -# Macros that are convenient for shell interaction -$if Bash -# edit the path -"\C-xp": "PATH=$@{PATH@}\e\C-e\C-a\ef\C-f" -# prepare to type a quoted word -- -# insert open and close double quotes -# and move to just after the open quote -"\C-x\"": "\"\"\C-b" -# insert a backslash (testing backslash escapes -# in sequences and macros) -"\C-x\\": "\\" -# Quote the current or previous word -"\C-xq": "\eb\"\ef\"" -# Add a binding to refresh the line, which is unbound -"\C-xr": redraw-current-line -# Edit variable on current line. -"\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y=" -$endif - -# use a visible bell if one is available -set bell-style visible - -# don't strip characters to 7 bits when reading -set input-meta on - -# allow iso-latin1 characters to be inserted rather -# than converted to prefix-meta sequences -set convert-meta off - -# display characters with the eighth bit set directly -# rather than as meta-prefixed characters -set output-meta on - -# if there are more than 150 possible completions for -# a word, ask the user if he wants to see all of them -set completion-query-items 150 - -# For FTP -$if Ftp -"\C-xg": "get \M-?" -"\C-xt": "put \M-?" -"\M-.": yank-last-arg -$endif -@end example - -@node Bindable Readline Commands -@section Bindable Readline Commands - -@menu -* Commands For Moving:: Moving about the line. -* Commands For History:: Getting at previous lines. -* Commands For Text:: Commands for changing text. -* Commands For Killing:: Commands for killing and yanking. -* Numeric Arguments:: Specifying numeric arguments, repeat counts. -* Commands For Completion:: Getting Readline to do the typing for you. -* Keyboard Macros:: Saving and re-executing typed characters -* Miscellaneous Commands:: Other miscellaneous commands. -@end menu - -This section describes Readline commands that may be bound to key -sequences. -@ifset BashFeatures -You can list your key bindings by executing -@w{@code{bind -P}} or, for a more terse format, suitable for an -@var{inputrc} file, @w{@code{bind -p}}. (@xref{Bash Builtins}.) -@end ifset -Command names without an accompanying key sequence are unbound by default. - -In the following descriptions, @dfn{point} refers to the current cursor -position, and @dfn{mark} refers to a cursor position saved by the -@code{set-mark} command. -The text between the point and mark is referred to as the @dfn{region}. - -@node Commands For Moving -@subsection Commands For Moving -@ftable @code -@item beginning-of-line (C-a) -Move to the start of the current line. - -@item end-of-line (C-e) -Move to the end of the line. - -@item forward-char (C-f) -Move forward a character. - -@item backward-char (C-b) -Move back a character. - -@item forward-word (M-f) -Move forward to the end of the next word. Words are composed of -letters and digits. - -@item backward-word (M-b) -Move back to the start of the current or previous word. Words are -composed of letters and digits. - -@item clear-screen (C-l) -Clear the screen and redraw the current line, -leaving the current line at the top of the screen. - -@item redraw-current-line () -Refresh the current line. By default, this is unbound. - -@end ftable - -@node Commands For History -@subsection Commands For Manipulating The History - -@ftable @code -@item accept-line (Newline or Return) -@ifset BashFeatures -Accept the line regardless of where the cursor is. -If this line is -non-empty, add it to the history list according to the setting of -the @env{HISTCONTROL} and @env{HISTIGNORE} variables. -If this line is a modified history line, then restore the history line -to its original state. -@end ifset -@ifclear BashFeatures -Accept the line regardless of where the cursor is. -If this line is -non-empty, it may be added to the history list for future recall with -@code{add_history()}. -If this line is a modified history line, the history line is restored -to its original state. -@end ifclear - -@item previous-history (C-p) -Move `back' through the history list, fetching the previous command. - -@item next-history (C-n) -Move `forward' through the history list, fetching the next command. - -@item beginning-of-history (M-<) -Move to the first line in the history. - -@item end-of-history (M->) -Move to the end of the input history, i.e., the line currently -being entered. - -@item reverse-search-history (C-r) -Search backward starting at the current line and moving `up' through -the history as necessary. This is an incremental search. - -@item forward-search-history (C-s) -Search forward starting at the current line and moving `down' through -the the history as necessary. This is an incremental search. - -@item non-incremental-reverse-search-history (M-p) -Search backward starting at the current line and moving `up' -through the history as necessary using a non-incremental search -for a string supplied by the user. - -@item non-incremental-forward-search-history (M-n) -Search forward starting at the current line and moving `down' -through the the history as necessary using a non-incremental search -for a string supplied by the user. - -@item history-search-forward () -Search forward through the history for the string of characters -between the start of the current line and the point. -This is a non-incremental search. -By default, this command is unbound. - -@item history-search-backward () -Search backward through the history for the string of characters -between the start of the current line and the point. This -is a non-incremental search. By default, this command is unbound. - -@item yank-nth-arg (M-C-y) -Insert the first argument to the previous command (usually -the second word on the previous line) at point. -With an argument @var{n}, -insert the @var{n}th word from the previous command (the words -in the previous command begin with word 0). A negative argument -inserts the @var{n}th word from the end of the previous command. - -@item yank-last-arg (M-. or M-_) -Insert last argument to the previous command (the last word of the -previous history entry). With an -argument, behave exactly like @code{yank-nth-arg}. -Successive calls to @code{yank-last-arg} move back through the history -list, inserting the last argument of each line in turn. - -@end ftable - -@node Commands For Text -@subsection Commands For Changing Text - -@ftable @code -@item delete-char (C-d) -Delete the character at point. If point is at the -beginning of the line, there are no characters in the line, and -the last character typed was not bound to @code{delete-char}, then -return @sc{eof}. - -@item backward-delete-char (Rubout) -Delete the character behind the cursor. A numeric argument means -to kill the characters instead of deleting them. - -@item forward-backward-delete-char () -Delete the character under the cursor, unless the cursor is at the -end of the line, in which case the character behind the cursor is -deleted. By default, this is not bound to a key. - -@item quoted-insert (C-q or C-v) -Add the next character typed to the line verbatim. This is -how to insert key sequences like @kbd{C-q}, for example. - -@ifclear BashFeatures -@item tab-insert (M-@key{TAB}) -Insert a tab character. -@end ifclear - -@item self-insert (a, b, A, 1, !, @dots{}) -Insert yourself. - -@item transpose-chars (C-t) -Drag the character before the cursor forward over -the character at the cursor, moving the -cursor forward as well. If the insertion point -is at the end of the line, then this -transposes the last two characters of the line. -Negative arguments have no effect. - -@item transpose-words (M-t) -Drag the word before point past the word after point, -moving point past that word as well. -If the insertion point is at the end of the line, this transposes -the last two words on the line. - -@item upcase-word (M-u) -Uppercase the current (or following) word. With a negative argument, -uppercase the previous word, but do not move the cursor. - -@item downcase-word (M-l) -Lowercase the current (or following) word. With a negative argument, -lowercase the previous word, but do not move the cursor. - -@item capitalize-word (M-c) -Capitalize the current (or following) word. With a negative argument, -capitalize the previous word, but do not move the cursor. - -@item overwrite-mode () -Toggle overwrite mode. With an explicit positive numeric argument, -switches to overwrite mode. With an explicit non-positive numeric -argument, switches to insert mode. This command affects only -@code{emacs} mode; @code{vi} mode does overwrite differently. -Each call to @code{readline()} starts in insert mode. - -In overwrite mode, characters bound to @code{self-insert} replace -the text at point rather than pushing the text to the right. -Characters bound to @code{backward-delete-char} replace the character -before point with a space. - -By default, this command is unbound. - -@end ftable - -@node Commands For Killing -@subsection Killing And Yanking - -@ftable @code - -@item kill-line (C-k) -Kill the text from point to the end of the line. - -@item backward-kill-line (C-x Rubout) -Kill backward to the beginning of the line. - -@item unix-line-discard (C-u) -Kill backward from the cursor to the beginning of the current line. - -@item kill-whole-line () -Kill all characters on the current line, no matter where point is. -By default, this is unbound. - -@item kill-word (M-d) -Kill from point to the end of the current word, or if between -words, to the end of the next word. -Word boundaries are the same as @code{forward-word}. - -@item backward-kill-word (M-@key{DEL}) -Kill the word behind point. -Word boundaries are the same as @code{backward-word}. - -@item unix-word-rubout (C-w) -Kill the word behind point, using white space as a word boundary. -The killed text is saved on the kill-ring. - -@item unix-filename-rubout () -Kill the word behind point, using white space and the slash character -as the word boundaries. -The killed text is saved on the kill-ring. - -@item delete-horizontal-space () -Delete all spaces and tabs around point. By default, this is unbound. - -@item kill-region () -Kill the text in the current region. -By default, this command is unbound. - -@item copy-region-as-kill () -Copy the text in the region to the kill buffer, so it can be yanked -right away. By default, this command is unbound. - -@item copy-backward-word () -Copy the word before point to the kill buffer. -The word boundaries are the same as @code{backward-word}. -By default, this command is unbound. - -@item copy-forward-word () -Copy the word following point to the kill buffer. -The word boundaries are the same as @code{forward-word}. -By default, this command is unbound. - -@item yank (C-y) -Yank the top of the kill ring into the buffer at point. - -@item yank-pop (M-y) -Rotate the kill-ring, and yank the new top. You can only do this if -the prior command is @code{yank} or @code{yank-pop}. -@end ftable - -@node Numeric Arguments -@subsection Specifying Numeric Arguments -@ftable @code - -@item digit-argument (@kbd{M-0}, @kbd{M-1}, @dots{} @kbd{M--}) -Add this digit to the argument already accumulating, or start a new -argument. @kbd{M--} starts a negative argument. - -@item universal-argument () -This is another way to specify an argument. -If this command is followed by one or more digits, optionally with a -leading minus sign, those digits define the argument. -If the command is followed by digits, executing @code{universal-argument} -again ends the numeric argument, but is otherwise ignored. -As a special case, if this command is immediately followed by a -character that is neither a digit or minus sign, the argument count -for the next command is multiplied by four. -The argument count is initially one, so executing this function the -first time makes the argument count four, a second time makes the -argument count sixteen, and so on. -By default, this is not bound to a key. -@end ftable - -@node Commands For Completion -@subsection Letting Readline Type For You - -@ftable @code -@item complete (@key{TAB}) -Attempt to perform completion on the text before point. -The actual completion performed is application-specific. -@ifset BashFeatures -Bash attempts completion treating the text as a variable (if the -text begins with @samp{$}), username (if the text begins with -@samp{~}), hostname (if the text begins with @samp{@@}), or -command (including aliases and functions) in turn. If none -of these produces a match, filename completion is attempted. -@end ifset -@ifclear BashFeatures -The default is filename completion. -@end ifclear - -@item possible-completions (M-?) -List the possible completions of the text before point. - -@item insert-completions (M-*) -Insert all completions of the text before point that would have -been generated by @code{possible-completions}. - -@item menu-complete () -Similar to @code{complete}, but replaces the word to be completed -with a single match from the list of possible completions. -Repeated execution of @code{menu-complete} steps through the list -of possible completions, inserting each match in turn. -At the end of the list of completions, the bell is rung -(subject to the setting of @code{bell-style}) -and the original text is restored. -An argument of @var{n} moves @var{n} positions forward in the list -of matches; a negative argument may be used to move backward -through the list. -This command is intended to be bound to @key{TAB}, but is unbound -by default. - -@item delete-char-or-list () -Deletes the character under the cursor if not at the beginning or -end of the line (like @code{delete-char}). -If at the end of the line, behaves identically to -@code{possible-completions}. -This command is unbound by default. - -@ifset BashFeatures -@item complete-filename (M-/) -Attempt filename completion on the text before point. - -@item possible-filename-completions (C-x /) -List the possible completions of the text before point, -treating it as a filename. - -@item complete-username (M-~) -Attempt completion on the text before point, treating -it as a username. - -@item possible-username-completions (C-x ~) -List the possible completions of the text before point, -treating it as a username. - -@item complete-variable (M-$) -Attempt completion on the text before point, treating -it as a shell variable. - -@item possible-variable-completions (C-x $) -List the possible completions of the text before point, -treating it as a shell variable. - -@item complete-hostname (M-@@) -Attempt completion on the text before point, treating -it as a hostname. - -@item possible-hostname-completions (C-x @@) -List the possible completions of the text before point, -treating it as a hostname. - -@item complete-command (M-!) -Attempt completion on the text before point, treating -it as a command name. Command completion attempts to -match the text against aliases, reserved words, shell -functions, shell builtins, and finally executable filenames, -in that order. - -@item possible-command-completions (C-x !) -List the possible completions of the text before point, -treating it as a command name. - -@item dynamic-complete-history (M-@key{TAB}) -Attempt completion on the text before point, comparing -the text against lines from the history list for possible -completion matches. - -@item complete-into-braces (M-@{) -Perform filename completion and insert the list of possible completions -enclosed within braces so the list is available to the shell -(@pxref{Brace Expansion}). - -@end ifset -@end ftable - -@node Keyboard Macros -@subsection Keyboard Macros -@ftable @code - -@item start-kbd-macro (C-x () -Begin saving the characters typed into the current keyboard macro. - -@item end-kbd-macro (C-x )) -Stop saving the characters typed into the current keyboard macro -and save the definition. - -@item call-last-kbd-macro (C-x e) -Re-execute the last keyboard macro defined, by making the characters -in the macro appear as if typed at the keyboard. - -@end ftable - -@node Miscellaneous Commands -@subsection Some Miscellaneous Commands -@ftable @code - -@item re-read-init-file (C-x C-r) -Read in the contents of the @var{inputrc} file, and incorporate -any bindings or variable assignments found there. - -@item abort (C-g) -Abort the current editing command and -ring the terminal's bell (subject to the setting of -@code{bell-style}). - -@item do-uppercase-version (M-a, M-b, M-@var{x}, @dots{}) -If the metafied character @var{x} is lowercase, run the command -that is bound to the corresponding uppercase character. - -@item prefix-meta (@key{ESC}) -Metafy the next character typed. This is for keyboards -without a meta key. Typing @samp{@key{ESC} f} is equivalent to typing -@kbd{M-f}. - -@item undo (C-_ or C-x C-u) -Incremental undo, separately remembered for each line. - -@item revert-line (M-r) -Undo all changes made to this line. This is like executing the @code{undo} -command enough times to get back to the beginning. - -@ifset BashFeatures -@item tilde-expand (M-&) -@end ifset -@ifclear BashFeatures -@item tilde-expand (M-~) -@end ifclear -Perform tilde expansion on the current word. - -@item set-mark (C-@@) -Set the mark to the point. If a -numeric argument is supplied, the mark is set to that position. - -@item exchange-point-and-mark (C-x C-x) -Swap the point with the mark. The current cursor position is set to -the saved position, and the old cursor position is saved as the mark. - -@item character-search (C-]) -A character is read and point is moved to the next occurrence of that -character. A negative count searches for previous occurrences. - -@item character-search-backward (M-C-]) -A character is read and point is moved to the previous occurrence -of that character. A negative count searches for subsequent -occurrences. - -@item insert-comment (M-#) -Without a numeric argument, the value of the @code{comment-begin} -variable is inserted at the beginning of the current line. -If a numeric argument is supplied, this command acts as a toggle: if -the characters at the beginning of the line do not match the value -of @code{comment-begin}, the value is inserted, otherwise -the characters in @code{comment-begin} are deleted from the beginning of -the line. -In either case, the line is accepted as if a newline had been typed. -@ifset BashFeatures -The default value of @code{comment-begin} causes this command -to make the current line a shell comment. -If a numeric argument causes the comment character to be removed, the line -will be executed by the shell. -@end ifset - -@item dump-functions () -Print all of the functions and their key bindings to the -Readline output stream. If a numeric argument is supplied, -the output is formatted in such a way that it can be made part -of an @var{inputrc} file. This command is unbound by default. - -@item dump-variables () -Print all of the settable variables and their values to the -Readline output stream. If a numeric argument is supplied, -the output is formatted in such a way that it can be made part -of an @var{inputrc} file. This command is unbound by default. - -@item dump-macros () -Print all of the Readline key sequences bound to macros and the -strings they output. If a numeric argument is supplied, -the output is formatted in such a way that it can be made part -of an @var{inputrc} file. This command is unbound by default. - -@ifset BashFeatures -@item glob-complete-word (M-g) -The word before point is treated as a pattern for pathname expansion, -with an asterisk implicitly appended. This pattern is used to -generate a list of matching file names for possible completions. - -@item glob-expand-word (C-x *) -The word before point is treated as a pattern for pathname expansion, -and the list of matching file names is inserted, replacing the word. -If a numeric argument is supplied, a @samp{*} is appended before -pathname expansion. - -@item glob-list-expansions (C-x g) -The list of expansions that would have been generated by -@code{glob-expand-word} is displayed, and the line is redrawn. -If a numeric argument is supplied, a @samp{*} is appended before -pathname expansion. - -@item display-shell-version (C-x C-v) -Display version information about the current instance of Bash. - -@item shell-expand-line (M-C-e) -Expand the line as the shell does. -This performs alias and history expansion as well as all of the shell -word expansions (@pxref{Shell Expansions}). - -@item history-expand-line (M-^) -Perform history expansion on the current line. - -@item magic-space () -Perform history expansion on the current line and insert a space -(@pxref{History Interaction}). - -@item alias-expand-line () -Perform alias expansion on the current line (@pxref{Aliases}). - -@item history-and-alias-expand-line () -Perform history and alias expansion on the current line. - -@item insert-last-argument (M-. or M-_) -A synonym for @code{yank-last-arg}. - -@item operate-and-get-next (C-o) -Accept the current line for execution and fetch the next line -relative to the current line from the history for editing. Any -argument is ignored. - -@item edit-and-execute-command (C-xC-e) -Invoke an editor on the current command line, and execute the result as shell -commands. -Bash attempts to invoke -@code{$VISUAL}, @code{$EDITOR}, and @code{emacs} -as the editor, in that order. - -@end ifset - -@ifclear BashFeatures -@item emacs-editing-mode (C-e) -When in @code{vi} command mode, this causes a switch to @code{emacs} -editing mode. - -@item vi-editing-mode (M-C-j) -When in @code{emacs} editing mode, this causes a switch to @code{vi} -editing mode. - -@end ifclear - -@end ftable - -@node Readline vi Mode -@section Readline vi Mode - -While the Readline library does not have a full set of @code{vi} -editing functions, it does contain enough to allow simple editing -of the line. The Readline @code{vi} mode behaves as specified in -the @sc{posix} 1003.2 standard. - -@ifset BashFeatures -In order to switch interactively between @code{emacs} and @code{vi} -editing modes, use the @samp{set -o emacs} and @samp{set -o vi} -commands (@pxref{The Set Builtin}). -@end ifset -@ifclear BashFeatures -In order to switch interactively between @code{emacs} and @code{vi} -editing modes, use the command @kbd{M-C-j} (bound to emacs-editing-mode -when in @code{vi} mode and to vi-editing-mode in @code{emacs} mode). -@end ifclear -The Readline default is @code{emacs} mode. - -When you enter a line in @code{vi} mode, you are already placed in -`insertion' mode, as if you had typed an @samp{i}. Pressing @key{ESC} -switches you into `command' mode, where you can edit the text of the -line with the standard @code{vi} movement keys, move to previous -history lines with @samp{k} and subsequent lines with @samp{j}, and -so forth. - -@ifset BashFeatures -@node Programmable Completion -@section Programmable Completion -@cindex programmable completion - -When word completion is attempted for an argument to a command for -which a completion specification (a @var{compspec}) has been defined -using the @code{complete} builtin (@pxref{Programmable Completion Builtins}), -the programmable completion facilities are invoked. - -First, the command name is identified. -If a compspec has been defined for that command, the -compspec is used to generate the list of possible completions for the word. -If the command word is a full pathname, a compspec for the full -pathname is searched for first. -If no compspec is found for the full pathname, an attempt is made to -find a compspec for the portion following the final slash. - -Once a compspec has been found, it is used to generate the list of -matching words. -If a compspec is not found, the default Bash completion -described above (@pxref{Commands For Completion}) is performed. - -First, the actions specified by the compspec are used. -Only matches which are prefixed by the word being completed are -returned. -When the @option{-f} or @option{-d} option is used for filename or -directory name completion, the shell variable @env{FIGNORE} is -used to filter the matches. -@xref{Bash Variables}, for a description of @env{FIGNORE}. - -Any completions specified by a filename expansion pattern to the -@option{-G} option are generated next. -The words generated by the pattern need not match the word being completed. -The @env{GLOBIGNORE} shell variable is not used to filter the matches, -but the @env{FIGNORE} shell variable is used. - -Next, the string specified as the argument to the @option{-W} option -is considered. -The string is first split using the characters in the @env{IFS} -special variable as delimiters. -Shell quoting is honored. -Each word is then expanded using -brace expansion, tilde expansion, parameter and variable expansion, -command substitution, arithmetic expansion, and pathname expansion, -as described above (@pxref{Shell Expansions}). -The results are split using the rules described above -(@pxref{Word Splitting}). -The results of the expansion are prefix-matched against the word being -completed, and the matching words become the possible completions. - -After these matches have been generated, any shell function or command -specified with the @option{-F} and @option{-C} options is invoked. -When the command or function is invoked, the @env{COMP_LINE} and -@env{COMP_POINT} variables are assigned values as described above -(@pxref{Bash Variables}). -If a shell function is being invoked, the @env{COMP_WORDS} and -@env{COMP_CWORD} variables are also set. -When the function or command is invoked, the first argument is the -name of the command whose arguments are being completed, the -second argument is the word being completed, and the third argument -is the word preceding the word being completed on the current command line. -No filtering of the generated completions against the word being completed -is performed; the function or command has complete freedom in generating -the matches. - -Any function specified with @option{-F} is invoked first. -The function may use any of the shell facilities, including the -@code{compgen} builtin described below -(@pxref{Programmable Completion Builtins}), to generate the matches. -It must put the possible completions in the @env{COMPREPLY} array -variable. - -Next, any command specified with the @option{-C} option is invoked -in an environment equivalent to command substitution. -It should print a list of completions, one per line, to -the standard output. -Backslash may be used to escape a newline, if necessary. - -After all of the possible completions are generated, any filter -specified with the @option{-X} option is applied to the list. -The filter is a pattern as used for pathname expansion; a @samp{&} -in the pattern is replaced with the text of the word being completed. -A literal @samp{&} may be escaped with a backslash; the backslash -is removed before attempting a match. -Any completion that matches the pattern will be removed from the list. -A leading @samp{!} negates the pattern; in this case any completion -not matching the pattern will be removed. - -Finally, any prefix and suffix specified with the @option{-P} and @option{-S} -options are added to each member of the completion list, and the result is -returned to the Readline completion code as the list of possible -completions. - -If the previously-applied actions do not generate any matches, and the -@option{-o dirnames} option was supplied to @code{complete} when the -compspec was defined, directory name completion is attempted. - -If the @option{-o plusdirs} option was supplied to @code{complete} when -the compspec was defined, directory name completion is attempted and any -matches are added to the results of the other actions. - -By default, if a compspec is found, whatever it generates is returned to -the completion code as the full set of possible completions. -The default Bash completions are not attempted, and the Readline default -of filename completion is disabled. -If the @option{-o bashdefault} option was supplied to @code{complete} when -the compspec was defined, the default Bash completions are attempted -if the compspec generates no matches. -If the @option{-o default} option was supplied to @code{complete} when the -compspec was defined, Readline's default completion will be performed -if the compspec (and, if attempted, the default Bash completions) -generate no matches. - -When a compspec indicates that directory name completion is desired, -the programmable completion functions force Readline to append a slash -to completed names which are symbolic links to directories, subject to -the value of the @var{mark-directories} Readline variable, regardless -of the setting of the @var{mark-symlinked-directories} Readline variable. - -@node Programmable Completion Builtins -@section Programmable Completion Builtins -@cindex completion builtins - -Two builtin commands are available to manipulate the programmable completion -facilities. - -@table @code -@item compgen -@btindex compgen -@example -@code{compgen [@var{option}] [@var{word}]} -@end example - -Generate possible completion matches for @var{word} according to -the @var{option}s, which may be any option accepted by the -@code{complete} -builtin with the exception of @option{-p} and @option{-r}, and write -the matches to the standard output. -When using the @option{-F} or @option{-C} options, the various shell variables -set by the programmable completion facilities, while available, will not -have useful values. - -The matches will be generated in the same way as if the programmable -completion code had generated them directly from a completion specification -with the same flags. -If @var{word} is specified, only those completions matching @var{word} -will be displayed. - -The return value is true unless an invalid option is supplied, or no -matches were generated. - -@item complete -@btindex complete -@example -@code{complete [-abcdefgjksuv] [-o @var{comp-option}] [-A @var{action}] [-G @var{globpat}] [-W @var{wordlist}] -[-P @var{prefix}] [-S @var{suffix}] [-X @var{filterpat}] [-F @var{function}] -[-C @var{command}] @var{name} [@var{name} @dots{}]} -@code{complete -pr [@var{name} @dots{}]} -@end example - -Specify how arguments to each @var{name} should be completed. -If the @option{-p} option is supplied, or if no options are supplied, existing -completion specifications are printed in a way that allows them to be -reused as input. -The @option{-r} option removes a completion specification for -each @var{name}, or, if no @var{name}s are supplied, all -completion specifications. - -The process of applying these completion specifications when word completion -is attempted is described above (@pxref{Programmable Completion}). - -Other options, if specified, have the following meanings. -The arguments to the @option{-G}, @option{-W}, and @option{-X} options -(and, if necessary, the @option{-P} and @option{-S} options) -should be quoted to protect them from expansion before the -@code{complete} builtin is invoked. - - -@table @code -@item -o @var{comp-option} -The @var{comp-option} controls several aspects of the compspec's behavior -beyond the simple generation of completions. -@var{comp-option} may be one of: - -@table @code - -@item bashdefault -Perform the rest of the default Bash completions if the compspec -generates no matches. - -@item default -Use Readline's default filename completion if the compspec generates -no matches. - -@item dirnames -Perform directory name completion if the compspec generates no matches. - -@item filenames -Tell Readline that the compspec generates filenames, so it can perform any -filename-specific processing (like adding a slash to directory names or -suppressing trailing spaces). This option is intended to be used with -shell functions specified with @option{-F}. - -@item nospace -Tell Readline not to append a space (the default) to words completed at -the end of the line. -@end table - -@item -A @var{action} -The @var{action} may be one of the following to generate a list of possible -completions: - -@table @code -@item alias -Alias names. May also be specified as @option{-a}. - -@item arrayvar -Array variable names. - -@item binding -Readline key binding names (@pxref{Bindable Readline Commands}). - -@item builtin -Names of shell builtin commands. May also be specified as @option{-b}. - -@item command -Command names. May also be specified as @option{-c}. - -@item directory -Directory names. May also be specified as @option{-d}. - -@item disabled -Names of disabled shell builtins. - -@item enabled -Names of enabled shell builtins. - -@item export -Names of exported shell variables. May also be specified as @option{-e}. - -@item file -File names. May also be specified as @option{-f}. - -@item function -Names of shell functions. - -@item group -Group names. May also be specified as @option{-g}. - -@item helptopic -Help topics as accepted by the @code{help} builtin (@pxref{Bash Builtins}). - -@item hostname -Hostnames, as taken from the file specified by the -@env{HOSTFILE} shell variable (@pxref{Bash Variables}). - -@item job -Job names, if job control is active. May also be specified as @option{-j}. - -@item keyword -Shell reserved words. May also be specified as @option{-k}. - -@item running -Names of running jobs, if job control is active. - -@item service -Service names. May also be specified as @option{-s}. - -@item setopt -Valid arguments for the @option{-o} option to the @code{set} builtin -(@pxref{The Set Builtin}). - -@item shopt -Shell option names as accepted by the @code{shopt} builtin -(@pxref{Bash Builtins}). - -@item signal -Signal names. - -@item stopped -Names of stopped jobs, if job control is active. - -@item user -User names. May also be specified as @option{-u}. - -@item variable -Names of all shell variables. May also be specified as @option{-v}. -@end table - -@item -G @var{globpat} -The filename expansion pattern @var{globpat} is expanded to generate -the possible completions. - -@item -W @var{wordlist} -The @var{wordlist} is split using the characters in the -@env{IFS} special variable as delimiters, and each resultant word -is expanded. -The possible completions are the members of the resultant list which -match the word being completed. - -@item -C @var{command} -@var{command} is executed in a subshell environment, and its output is -used as the possible completions. - -@item -F @var{function} -The shell function @var{function} is executed in the current shell -environment. -When it finishes, the possible completions are retrieved from the value -of the @env{COMPREPLY} array variable. - -@item -X @var{filterpat} -@var{filterpat} is a pattern as used for filename expansion. -It is applied to the list of possible completions generated by the -preceding options and arguments, and each completion matching -@var{filterpat} is removed from the list. -A leading @samp{!} in @var{filterpat} negates the pattern; in this -case, any completion not matching @var{filterpat} is removed. - -@item -P @var{prefix} -@var{prefix} is added at the beginning of each possible completion -after all other options have been applied. - -@item -S @var{suffix} -@var{suffix} is appended to each possible completion -after all other options have been applied. -@end table - -The return value is true unless an invalid option is supplied, an option -other than @option{-p} or @option{-r} is supplied without a @var{name} -argument, an attempt is made to remove a completion specification for -a @var{name} for which no specification exists, or -an error occurs adding a completion specification. - -@end table -@end ifset diff --git a/dep/src/readline/src/doc/rluserman.dvi b/dep/src/readline/src/doc/rluserman.dvi deleted file mode 100644 index 55667c310cc82fe7fe056d868e921d5b67c780c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91852 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 diff --git a/dep/src/readline/src/doc/rluserman.html b/dep/src/readline/src/doc/rluserman.html deleted file mode 100644 index 6055fbe7944..00000000000 --- a/dep/src/readline/src/doc/rluserman.html +++ /dev/null @@ -1,2778 +0,0 @@ - - - - - -GNU Readline Library: - - - - - - - - - - - - - - - - - -
[Top][Contents][Index][ ? ]
-

GNU Readline Library

- -This document describes the end user interface of the GNU Readline Library, -a utility which aids in the consistency of user interface across discrete -programs which provide a command line interface. -

- -

- - -
1. Command Line Editing  GNU Readline User's Manual.
A. Copying This Manual  
-

- -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
- -

1. Command Line Editing

- -

- -This chapter describes the basic features of the GNU -command line editing interface. -

- -

- - - - - -
1.1 Introduction to Line Editing  Notation used in this text.
1.2 Readline Interaction  The minimum set of commands for editing a line.
1.3 Readline Init File  Customizing Readline from a user's view.
1.4 Bindable Readline Commands  A description of most of the Readline commands - available for binding
1.5 Readline vi Mode  A short description of how to make Readline - behave like the vi editor.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.1 Introduction to Line Editing

- -

- -The following paragraphs describe the notation used to represent -keystrokes. -

- -The text C-k is read as `Control-K' and describes the character -produced when the k key is pressed while the Control key -is depressed. -

- -The text M-k is read as `Meta-K' and describes the character -produced when the Meta key (if you have one) is depressed, and the k -key is pressed. -The Meta key is labeled ALT on many keyboards. -On keyboards with two keys labeled ALT (usually to either side of -the space bar), the ALT on the left side is generally set to -work as a Meta key. -The ALT key on the right may also be configured to work as a -Meta key or may be configured as some other modifier, such as a -Compose key for typing accented characters. -

- -If you do not have a Meta or ALT key, or another key working as -a Meta key, the identical keystroke can be generated by typing ESC -first, and then typing k. -Either process is known as metafying the k key. -

- -The text M-C-k is read as `Meta-Control-k' and describes the -character produced by metafying C-k. -

- -In addition, several keys have their own names. Specifically, -DEL, ESC, LFD, SPC, RET, and TAB all -stand for themselves when seen in this text, or in an init file -(see section 1.3 Readline Init File). -If your keyboard lacks a LFD key, typing C-j will -produce the desired character. -The RET key may be labeled Return or Enter on -some keyboards. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.2 Readline Interaction

- -

- -Often during an interactive session you type in a long line of text, -only to notice that the first word on the line is misspelled. The -Readline library gives you a set of commands for manipulating the text -as you type it in, allowing you to just fix your typo, and not forcing -you to retype the majority of the line. Using these editing commands, -you move the cursor to the place that needs correction, and delete or -insert the text of the corrections. Then, when you are satisfied with -the line, you simply press RET. You do not have to be at the -end of the line to press RET; the entire line is accepted -regardless of the location of the cursor within the line. -

- -

- - - - - -
1.2.1 Readline Bare Essentials  The least you need to know about Readline.
1.2.2 Readline Movement Commands  Moving about the input line.
1.2.3 Readline Killing Commands  How to delete text, and how to get it back!
1.2.4 Readline Arguments  Giving numeric arguments to commands.
1.2.5 Searching for Commands in the History  Searching through previous lines.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.2.1 Readline Bare Essentials

- -

- -In order to enter characters into the line, simply type them. The typed -character appears where the cursor was, and then the cursor moves one -space to the right. If you mistype a character, you can use your -erase character to back up and delete the mistyped character. -

- -Sometimes you may mistype a character, and -not notice the error until you have typed several other characters. In -that case, you can type C-b to move the cursor to the left, and then -correct your mistake. Afterwards, you can move the cursor to the right -with C-f. -

- -When you add text in the middle of a line, you will notice that characters -to the right of the cursor are `pushed over' to make room for the text -that you have inserted. Likewise, when you delete text behind the cursor, -characters to the right of the cursor are `pulled back' to fill in the -blank space created by the removal of the text. A list of the bare -essentials for editing the text of an input line follows. -

- -

-
C-b -
Move back one character. -
C-f -
Move forward one character. -
DEL or Backspace -
Delete the character to the left of the cursor. -
C-d -
Delete the character underneath the cursor. -
Printing characters -
Insert the character into the line at the cursor. -
C-_ or C-x C-u -
Undo the last editing command. You can undo all the way back to an -empty line. -
-

- -(Depending on your configuration, the Backspace key be set to -delete the character to the left of the cursor and the DEL key set -to delete the character underneath the cursor, like C-d, rather -than the character to the left of the cursor.) -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.2.2 Readline Movement Commands

- -

- -The above table describes the most basic keystrokes that you need -in order to do editing of the input line. For your convenience, many -other commands have been added in addition to C-b, C-f, -C-d, and DEL. Here are some commands for moving more rapidly -about the line. -

- -

-
C-a -
Move to the start of the line. -
C-e -
Move to the end of the line. -
M-f -
Move forward a word, where a word is composed of letters and digits. -
M-b -
Move backward a word. -
C-l -
Clear the screen, reprinting the current line at the top. -
-

- -Notice how C-f moves forward a character, while M-f moves -forward a word. It is a loose convention that control keystrokes -operate on characters while meta keystrokes operate on words. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.2.3 Readline Killing Commands

- -

- - - -

- -Killing text means to delete the text from the line, but to save -it away for later use, usually by yanking (re-inserting) -it back into the line. -(`Cut' and `paste' are more recent jargon for `kill' and `yank'.) -

- -If the description for a command says that it `kills' text, then you can -be sure that you can get the text back in a different (or the same) -place later. -

- -When you use a kill command, the text is saved in a kill-ring. -Any number of consecutive kills save all of the killed text together, so -that when you yank it back, you get it all. The kill -ring is not line specific; the text that you killed on a previously -typed line is available to be yanked back later, when you are typing -another line. - -

- -Here is the list of commands for killing text. -

- -

-
C-k -
Kill the text from the current cursor position to the end of the line. -

- -

M-d -
Kill from the cursor to the end of the current word, or, if between -words, to the end of the next word. -Word boundaries are the same as those used by M-f. -

- -

M-DEL -
Kill from the cursor the start of the current word, or, if between -words, to the start of the previous word. -Word boundaries are the same as those used by M-b. -

- -

C-w -
Kill from the cursor to the previous whitespace. This is different than -M-DEL because the word boundaries differ. -

- -

-

- -Here is how to yank the text back into the line. Yanking -means to copy the most-recently-killed text from the kill buffer. -

- -

-
C-y -
Yank the most recently killed text back into the buffer at the cursor. -

- -

M-y -
Rotate the kill-ring, and yank the new top. You can only do this if -the prior command is C-y or M-y. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.2.4 Readline Arguments

- -

- -You can pass numeric arguments to Readline commands. Sometimes the -argument acts as a repeat count, other times it is the sign of the -argument that is significant. If you pass a negative argument to a -command which normally acts in a forward direction, that command will -act in a backward direction. For example, to kill text back to the -start of the line, you might type `M-- C-k'. -

- -The general way to pass numeric arguments to a command is to type meta -digits before the command. If the first `digit' typed is a minus -sign (`-'), then the sign of the argument will be negative. Once -you have typed one meta digit to get the argument started, you can type -the remainder of the digits, and then the command. For example, to give -the C-d command an argument of 10, you could type `M-1 0 C-d', -which will delete the next ten characters on the input line. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.2.5 Searching for Commands in the History

- -

- -Readline provides commands for searching through the command history -for lines containing a specified string. -There are two search modes: incremental and non-incremental. -

- -Incremental searches begin before the user has finished typing the -search string. -As each character of the search string is typed, Readline displays -the next entry from the history matching the string typed so far. -An incremental search requires only as many characters as needed to -find the desired history entry. -To search backward in the history for a particular string, type -C-r. Typing C-s searches forward through the history. -The characters present in the value of the isearch-terminators variable -are used to terminate an incremental search. -If that variable has not been assigned a value, the ESC and -C-J characters will terminate an incremental search. -C-g will abort an incremental search and restore the original line. -When the search is terminated, the history entry containing the -search string becomes the current line. -

- -To find other matching entries in the history list, type C-r or -C-s as appropriate. -This will search backward or forward in the history for the next -entry matching the search string typed so far. -Any other key sequence bound to a Readline command will terminate -the search and execute that command. -For instance, a RET will terminate the search and accept -the line, thereby executing the command from the history list. -A movement command will terminate the search, make the last line found -the current line, and begin editing. -

- -Readline remembers the last incremental search string. If two -C-rs are typed without any intervening characters defining a new -search string, any remembered search string is used. -

- -Non-incremental searches read the entire search string before starting -to search for matching history lines. The search string may be -typed by the user or be part of the contents of the current line. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.3 Readline Init File

- -

- -Although the Readline library comes with a set of Emacs-like -keybindings installed by default, it is possible to use a different set -of keybindings. -Any user can customize programs that use Readline by putting -commands in an inputrc file, conventionally in his home directory. -The name of this -file is taken from the value of the environment variable INPUTRC. If -that variable is unset, the default is `~/.inputrc'. -

- -When a program which uses the Readline library starts up, the -init file is read, and the key bindings are set. -

- -In addition, the C-x C-r command re-reads this init file, thus -incorporating any changes that you might have made to it. -

- -

- -
1.3.1 Readline Init File Syntax  Syntax for the commands in the inputrc file.
- -
- - -
1.3.2 Conditional Init Constructs  Conditional key bindings in the inputrc file.
- -
- - -
1.3.3 Sample Init File  An example inputrc file.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.3.1 Readline Init File Syntax

- -

- -There are only a few basic constructs allowed in the -Readline init file. Blank lines are ignored. -Lines beginning with a `#' are comments. -Lines beginning with a `$' indicate conditional -constructs (see section 1.3.2 Conditional Init Constructs). Other lines -denote variable settings and key bindings. -

- -

-
Variable Settings -
You can modify the run-time behavior of Readline by -altering the values of variables in Readline -using the set command within the init file. -The syntax is simple: -

- -
 
set variable value
-

- -Here, for example, is how to -change from the default Emacs-like key binding to use -vi line editing commands: -

- -
 
set editing-mode vi
-

- -Variable names and values, where appropriate, are recognized without regard -to case. -

- -A great deal of run-time behavior is changeable with the following -variables. -

- - -

- -
bell-style -
-Controls what happens when Readline wants to ring the terminal bell. -If set to `none', Readline never rings the bell. If set to -`visible', Readline uses a visible bell if one is available. -If set to `audible' (the default), Readline attempts to ring -the terminal's bell. -

- -

comment-begin -
-The string to insert at the beginning of the line when the -insert-comment command is executed. The default value -is "#". -

- -

completion-ignore-case -
If set to `on', Readline performs filename matching and completion -in a case-insensitive fashion. -The default value is `off'. -

- -

completion-query-items -
-The number of possible completions that determines when the user is -asked whether the list of possibilities should be displayed. -If the number of possible completions is greater than this value, -Readline will ask the user whether or not he wishes to view -them; otherwise, they are simply listed. -This variable must be set to an integer value greater than or equal to 0. -The default limit is 100. -

- -

convert-meta -
-If set to `on', Readline will convert characters with the -eighth bit set to an ASCII key sequence by stripping the eighth -bit and prefixing an ESC character, converting them to a -meta-prefixed key sequence. The default value is `on'. -

- -

disable-completion -
-If set to `On', Readline will inhibit word completion. -Completion characters will be inserted into the line as if they had -been mapped to self-insert. The default is `off'. -

- -

editing-mode -
-The editing-mode variable controls which default set of -key bindings is used. By default, Readline starts up in Emacs editing -mode, where the keystrokes are most similar to Emacs. This variable can be -set to either `emacs' or `vi'. -

- -

enable-keypad -
-When set to `on', Readline will try to enable the application -keypad when it is called. Some systems need this to enable the -arrow keys. The default is `off'. -

- -

expand-tilde -
-If set to `on', tilde expansion is performed when Readline -attempts word completion. The default is `off'. -

- - -If set to `on', the history code attempts to place point at the -same location on each history line retrieved with previous-history -or next-history. -

- -

horizontal-scroll-mode -
-This variable can be set to either `on' or `off'. Setting it -to `on' means that the text of the lines being edited will scroll -horizontally on a single screen line when they are longer than the width -of the screen, instead of wrapping onto a new screen line. By default, -this variable is set to `off'. -

- -

input-meta -
- -If set to `on', Readline will enable eight-bit input (it -will not clear the eighth bit in the characters it reads), -regardless of what the terminal claims it can support. The -default value is `off'. The name meta-flag is a -synonym for this variable. -

- -

isearch-terminators -
-The string of characters that should terminate an incremental search without -subsequently executing the character as a command (see section 1.2.5 Searching for Commands in the History). -If this variable has not been given a value, the characters ESC and -C-J will terminate an incremental search. -

- -

keymap -
-Sets Readline's idea of the current keymap for key binding commands. -Acceptable keymap names are -emacs, -emacs-standard, -emacs-meta, -emacs-ctlx, -vi, -vi-move, -vi-command, and -vi-insert. -vi is equivalent to vi-command; emacs is -equivalent to emacs-standard. The default value is emacs. -The value of the editing-mode variable also affects the -default keymap. -

- -

mark-directories -
If set to `on', completed directory names have a slash -appended. The default is `on'. -

- -

mark-modified-lines -
-This variable, when set to `on', causes Readline to display an -asterisk (`*') at the start of history lines which have been modified. -This variable is `off' by default. -

- -

mark-symlinked-directories -
-If set to `on', completed names which are symbolic links -to directories have a slash appended (subject to the value of -mark-directories). -The default is `off'. -

- -

match-hidden-files -
-This variable, when set to `on', causes Readline to match files whose -names begin with a `.' (hidden files) when performing filename -completion, unless the leading `.' is -supplied by the user in the filename to be completed. -This variable is `on' by default. -

- -

output-meta -
-If set to `on', Readline will display characters with the -eighth bit set directly rather than as a meta-prefixed escape -sequence. The default is `off'. -

- -

page-completions -
-If set to `on', Readline uses an internal more-like pager -to display a screenful of possible completions at a time. -This variable is `on' by default. -

- -

print-completions-horizontally -
If set to `on', Readline will display completions with matches -sorted horizontally in alphabetical order, rather than down the screen. -The default is `off'. -

- -

show-all-if-ambiguous -
-This alters the default behavior of the completion functions. If -set to `on', -words which have more than one possible completion cause the -matches to be listed immediately instead of ringing the bell. -The default value is `off'. -

- -

show-all-if-unmodified -
-This alters the default behavior of the completion functions in -a fashion similar to show-all-if-ambiguous. -If set to `on', -words which have more than one possible completion without any -possible partial completion (the possible completions don't share -a common prefix) cause the matches to be listed immediately instead -of ringing the bell. -The default value is `off'. -

- -

visible-stats -
-If set to `on', a character denoting a file's type -is appended to the filename when listing possible -completions. The default is `off'. -

- -

-

- -

Key Bindings -
The syntax for controlling key bindings in the init file is -simple. First you need to find the name of the command that you -want to change. The following sections contain tables of the command -name, the default keybinding, if any, and a short description of what -the command does. -

- -Once you know the name of the command, simply place on a line -in the init file the name of the key -you wish to bind the command to, a colon, and then the name of the -command. The name of the key -can be expressed in different ways, depending on what you find most -comfortable. -

- -In addition to command names, readline allows keys to be bound -to a string that is inserted when the key is pressed (a macro). -

- -

-
keyname: function-name or macro -
keyname is the name of a key spelled out in English. For example: -
 
Control-u: universal-argument
-Meta-Rubout: backward-kill-word
-Control-o: "> output"
-

- -In the above example, C-u is bound to the function -universal-argument, -M-DEL is bound to the function backward-kill-word, and -C-o is bound to run the macro -expressed on the right hand side (that is, to insert the text -`> output' into the line). -

- -A number of symbolic character names are recognized while -processing this key binding syntax: -DEL, -ESC, -ESCAPE, -LFD, -NEWLINE, -RET, -RETURN, -RUBOUT, -SPACE, -SPC, -and -TAB. -

- -

"keyseq": function-name or macro -
keyseq differs from keyname above in that strings -denoting an entire key sequence can be specified, by placing -the key sequence in double quotes. Some GNU Emacs style key -escapes can be used, as in the following example, but the -special character names are not recognized. -

- -
 
"\C-u": universal-argument
-"\C-x\C-r": re-read-init-file
-"\e[11~": "Function Key 1"
-

- -In the above example, C-u is again bound to the function -universal-argument (just as it was in the first example), -`C-x C-r' is bound to the function re-read-init-file, -and `ESC [ 1 1 ~' is bound to insert -the text `Function Key 1'. -

- -

-

- -The following GNU Emacs style escape sequences are available when -specifying key sequences: -

- -

-
\C- -
control prefix -
\M- -
meta prefix -
\e -
an escape character -
\\ -
backslash -
\" -
", a double quotation mark -
\' -
', a single quote or apostrophe -
-

- -In addition to the GNU Emacs style escape sequences, a second -set of backslash escapes is available: -

- -

-
\a -
alert (bell) -
\b -
backspace -
\d -
delete -
\f -
form feed -
\n -
newline -
\r -
carriage return -
\t -
horizontal tab -
\v -
vertical tab -
\nnn -
the eight-bit character whose value is the octal value nnn -(one to three digits) -
\xHH -
the eight-bit character whose value is the hexadecimal value HH -(one or two hex digits) -
-

- -When entering the text of a macro, single or double quotes must -be used to indicate a macro definition. -Unquoted text is assumed to be a function name. -In the macro body, the backslash escapes described above are expanded. -Backslash will quote any other character in the macro text, -including `"' and `''. -For example, the following binding will make `C-x \' -insert a single `\' into the line: -
 
"\C-x\\": "\\"
-

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.3.2 Conditional Init Constructs

- -

- -Readline implements a facility similar in spirit to the conditional -compilation features of the C preprocessor which allows key -bindings and variable settings to be performed as the result -of tests. There are four parser directives used. -

- -

-
$if -
The $if construct allows bindings to be made based on the -editing mode, the terminal being used, or the application using -Readline. The text of the test extends to the end of the line; -no characters are required to isolate it. -

- -

-
mode -
The mode= form of the $if directive is used to test -whether Readline is in emacs or vi mode. -This may be used in conjunction -with the `set keymap' command, for instance, to set bindings in -the emacs-standard and emacs-ctlx keymaps only if -Readline is starting out in emacs mode. -

- -

term -
The term= form may be used to include terminal-specific -key bindings, perhaps to bind the key sequences output by the -terminal's function keys. The word on the right side of the -`=' is tested against both the full name of the terminal and -the portion of the terminal name before the first `-'. This -allows sun to match both sun and sun-cmd, -for instance. -

- -

application -
The application construct is used to include -application-specific settings. Each program using the Readline -library sets the application name, and you can test for -a particular value. -This could be used to bind key sequences to functions useful for -a specific program. For instance, the following command adds a -key sequence that quotes the current or previous word in Bash: -
 
$if Bash
-# Quote the current or previous word
-"\C-xq": "\eb\"\ef\""
-$endif
-
-

- -

$endif -
This command, as seen in the previous example, terminates an -$if command. -

- -

$else -
Commands in this branch of the $if directive are executed if -the test fails. -

- -

$include -
This directive takes a single filename as an argument and reads commands -and bindings from that file. -For example, the following directive reads from `/etc/inputrc': -
 
$include /etc/inputrc
-
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.3.3 Sample Init File

- -

- -Here is an example of an inputrc file. This illustrates key -binding, variable assignment, and conditional syntax. -

- -
 
# This file controls the behaviour of line input editing for
-# programs that use the GNU Readline library.  Existing
-# programs include FTP, Bash, and GDB.
-#
-# You can re-read the inputrc file with C-x C-r.
-# Lines beginning with '#' are comments.
-#
-# First, include any systemwide bindings and variable
-# assignments from /etc/Inputrc
-$include /etc/Inputrc
-
-#
-# Set various bindings for emacs mode.
-
-set editing-mode emacs 
-
-$if mode=emacs
-
-Meta-Control-h:	backward-kill-word	Text after the function name is ignored
-
-#
-# Arrow keys in keypad mode
-#
-#"\M-OD":        backward-char
-#"\M-OC":        forward-char
-#"\M-OA":        previous-history
-#"\M-OB":        next-history
-#
-# Arrow keys in ANSI mode
-#
-"\M-[D":        backward-char
-"\M-[C":        forward-char
-"\M-[A":        previous-history
-"\M-[B":        next-history
-#
-# Arrow keys in 8 bit keypad mode
-#
-#"\M-\C-OD":       backward-char
-#"\M-\C-OC":       forward-char
-#"\M-\C-OA":       previous-history
-#"\M-\C-OB":       next-history
-#
-# Arrow keys in 8 bit ANSI mode
-#
-#"\M-\C-[D":       backward-char
-#"\M-\C-[C":       forward-char
-#"\M-\C-[A":       previous-history
-#"\M-\C-[B":       next-history
-
-C-q: quoted-insert
-
-$endif
-
-# An old-style binding.  This happens to be the default.
-TAB: complete
-
-# Macros that are convenient for shell interaction
-$if Bash
-# edit the path
-"\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f"
-# prepare to type a quoted word --
-# insert open and close double quotes
-# and move to just after the open quote
-"\C-x\"": "\"\"\C-b"
-# insert a backslash (testing backslash escapes
-# in sequences and macros)
-"\C-x\\": "\\"
-# Quote the current or previous word
-"\C-xq": "\eb\"\ef\""
-# Add a binding to refresh the line, which is unbound
-"\C-xr": redraw-current-line
-# Edit variable on current line.
-"\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y="
-$endif
-
-# use a visible bell if one is available
-set bell-style visible
-
-# don't strip characters to 7 bits when reading
-set input-meta on
-
-# allow iso-latin1 characters to be inserted rather
-# than converted to prefix-meta sequences
-set convert-meta off
-
-# display characters with the eighth bit set directly
-# rather than as meta-prefixed characters
-set output-meta on
-
-# if there are more than 150 possible completions for
-# a word, ask the user if he wants to see all of them
-set completion-query-items 150
-
-# For FTP
-$if Ftp
-"\C-xg": "get \M-?"
-"\C-xt": "put \M-?"
-"\M-.": yank-last-arg
-$endif
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.4 Bindable Readline Commands

- -

- -

- - - - - - - - -
1.4.1 Commands For Moving  Moving about the line.
1.4.2 Commands For Manipulating The History  Getting at previous lines.
1.4.3 Commands For Changing Text  Commands for changing text.
1.4.4 Killing And Yanking  Commands for killing and yanking.
1.4.5 Specifying Numeric Arguments  Specifying numeric arguments, repeat counts.
1.4.6 Letting Readline Type For You  Getting Readline to do the typing for you.
1.4.7 Keyboard Macros  Saving and re-executing typed characters
1.4.8 Some Miscellaneous Commands  Other miscellaneous commands.
-

- -This section describes Readline commands that may be bound to key -sequences. -Command names without an accompanying key sequence are unbound by default. -

- -In the following descriptions, point refers to the current cursor -position, and mark refers to a cursor position saved by the -set-mark command. -The text between the point and mark is referred to as the region. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.4.1 Commands For Moving

- -
- -
beginning-of-line (C-a) -
-Move to the start of the current line. -

- - -

end-of-line (C-e) -
-Move to the end of the line. -

- - -

forward-char (C-f) -
-Move forward a character. -

- - -

backward-char (C-b) -
-Move back a character. -

- - -

forward-word (M-f) -
-Move forward to the end of the next word. Words are composed of -letters and digits. -

- - -

backward-word (M-b) -
-Move back to the start of the current or previous word. Words are -composed of letters and digits. -

- - -

clear-screen (C-l) -
-Clear the screen and redraw the current line, -leaving the current line at the top of the screen. -

- - -

redraw-current-line () -
-Refresh the current line. By default, this is unbound. -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.4.2 Commands For Manipulating The History

- -

- -

- -
accept-line (Newline or Return) -
-Accept the line regardless of where the cursor is. -If this line is -non-empty, it may be added to the history list for future recall with -add_history(). -If this line is a modified history line, the history line is restored -to its original state. -

- - -

previous-history (C-p) -
-Move `back' through the history list, fetching the previous command. -

- - -

next-history (C-n) -
-Move `forward' through the history list, fetching the next command. -

- - -

beginning-of-history (M-<) -
-Move to the first line in the history. -

- - -

end-of-history (M->) -
-Move to the end of the input history, i.e., the line currently -being entered. -

- - -

reverse-search-history (C-r) -
-Search backward starting at the current line and moving `up' through -the history as necessary. This is an incremental search. -

- - -

forward-search-history (C-s) -
-Search forward starting at the current line and moving `down' through -the the history as necessary. This is an incremental search. -

- - -

non-incremental-reverse-search-history (M-p) -
-Search backward starting at the current line and moving `up' -through the history as necessary using a non-incremental search -for a string supplied by the user. -

- - -

non-incremental-forward-search-history (M-n) -
-Search forward starting at the current line and moving `down' -through the the history as necessary using a non-incremental search -for a string supplied by the user. -

- - -

history-search-forward () -
-Search forward through the history for the string of characters -between the start of the current line and the point. -This is a non-incremental search. -By default, this command is unbound. -

- - -

history-search-backward () -
-Search backward through the history for the string of characters -between the start of the current line and the point. This -is a non-incremental search. By default, this command is unbound. -

- - -

yank-nth-arg (M-C-y) -
-Insert the first argument to the previous command (usually -the second word on the previous line) at point. -With an argument n, -insert the nth word from the previous command (the words -in the previous command begin with word 0). A negative argument -inserts the nth word from the end of the previous command. -

- - -

yank-last-arg (M-. or M-_) -
-Insert last argument to the previous command (the last word of the -previous history entry). With an -argument, behave exactly like yank-nth-arg. -Successive calls to yank-last-arg move back through the history -list, inserting the last argument of each line in turn. -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.4.3 Commands For Changing Text

- -

- -

- -
delete-char (C-d) -
-Delete the character at point. If point is at the -beginning of the line, there are no characters in the line, and -the last character typed was not bound to delete-char, then -return EOF. -

- - -

backward-delete-char (Rubout) -
-Delete the character behind the cursor. A numeric argument means -to kill the characters instead of deleting them. -

- - -

forward-backward-delete-char () -
-Delete the character under the cursor, unless the cursor is at the -end of the line, in which case the character behind the cursor is -deleted. By default, this is not bound to a key. -

- - -

quoted-insert (C-q or C-v) -
-Add the next character typed to the line verbatim. This is -how to insert key sequences like C-q, for example. -

- - -

tab-insert (M-TAB) -
-Insert a tab character. -

- - -

self-insert (a, b, A, 1, !, ...) -
-Insert yourself. -

- - -

transpose-chars (C-t) -
-Drag the character before the cursor forward over -the character at the cursor, moving the -cursor forward as well. If the insertion point -is at the end of the line, then this -transposes the last two characters of the line. -Negative arguments have no effect. -

- - -

transpose-words (M-t) -
-Drag the word before point past the word after point, -moving point past that word as well. -If the insertion point is at the end of the line, this transposes -the last two words on the line. -

- - -

upcase-word (M-u) -
-Uppercase the current (or following) word. With a negative argument, -uppercase the previous word, but do not move the cursor. -

- - -

downcase-word (M-l) -
-Lowercase the current (or following) word. With a negative argument, -lowercase the previous word, but do not move the cursor. -

- - -

capitalize-word (M-c) -
-Capitalize the current (or following) word. With a negative argument, -capitalize the previous word, but do not move the cursor. -

- - -

overwrite-mode () -
-Toggle overwrite mode. With an explicit positive numeric argument, -switches to overwrite mode. With an explicit non-positive numeric -argument, switches to insert mode. This command affects only -emacs mode; vi mode does overwrite differently. -Each call to readline() starts in insert mode. -

- -In overwrite mode, characters bound to self-insert replace -the text at point rather than pushing the text to the right. -Characters bound to backward-delete-char replace the character -before point with a space. -

- -By default, this command is unbound. -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.4.4 Killing And Yanking

- -

- -

- - -
kill-line (C-k) -
-Kill the text from point to the end of the line. -

- - -

backward-kill-line (C-x Rubout) -
-Kill backward to the beginning of the line. -

- - -

unix-line-discard (C-u) -
-Kill backward from the cursor to the beginning of the current line. -

- - -

kill-whole-line () -
-Kill all characters on the current line, no matter where point is. -By default, this is unbound. -

- - -

kill-word (M-d) -
-Kill from point to the end of the current word, or if between -words, to the end of the next word. -Word boundaries are the same as forward-word. -

- - -

backward-kill-word (M-DEL) -
-Kill the word behind point. -Word boundaries are the same as backward-word. -

- - -

unix-word-rubout (C-w) -
-Kill the word behind point, using white space as a word boundary. -The killed text is saved on the kill-ring. -

- - -

unix-filename-rubout () -
-Kill the word behind point, using white space and the slash character -as the word boundaries. -The killed text is saved on the kill-ring. -

- - -

delete-horizontal-space () -
-Delete all spaces and tabs around point. By default, this is unbound. -

- - -

kill-region () -
-Kill the text in the current region. -By default, this command is unbound. -

- - -

copy-region-as-kill () -
-Copy the text in the region to the kill buffer, so it can be yanked -right away. By default, this command is unbound. -

- - -

copy-backward-word () -
-Copy the word before point to the kill buffer. -The word boundaries are the same as backward-word. -By default, this command is unbound. -

- - -

copy-forward-word () -
-Copy the word following point to the kill buffer. -The word boundaries are the same as forward-word. -By default, this command is unbound. -

- - -

yank (C-y) -
-Yank the top of the kill ring into the buffer at point. -

- - -

yank-pop (M-y) -
-Rotate the kill-ring, and yank the new top. You can only do this if -the prior command is yank or yank-pop. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.4.5 Specifying Numeric Arguments

- -
- - -
digit-argument (M-0, M-1, ... M--) -
-Add this digit to the argument already accumulating, or start a new -argument. M-- starts a negative argument. -

- - -

universal-argument () -
-This is another way to specify an argument. -If this command is followed by one or more digits, optionally with a -leading minus sign, those digits define the argument. -If the command is followed by digits, executing universal-argument -again ends the numeric argument, but is otherwise ignored. -As a special case, if this command is immediately followed by a -character that is neither a digit or minus sign, the argument count -for the next command is multiplied by four. -The argument count is initially one, so executing this function the -first time makes the argument count four, a second time makes the -argument count sixteen, and so on. -By default, this is not bound to a key. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.4.6 Letting Readline Type For You

- -

- -

- -
complete (TAB) -
-Attempt to perform completion on the text before point. -The actual completion performed is application-specific. -The default is filename completion. -

- - -

possible-completions (M-?) -
-List the possible completions of the text before point. -

- - -

insert-completions (M-*) -
-Insert all completions of the text before point that would have -been generated by possible-completions. -

- - -

menu-complete () -
-Similar to complete, but replaces the word to be completed -with a single match from the list of possible completions. -Repeated execution of menu-complete steps through the list -of possible completions, inserting each match in turn. -At the end of the list of completions, the bell is rung -(subject to the setting of bell-style) -and the original text is restored. -An argument of n moves n positions forward in the list -of matches; a negative argument may be used to move backward -through the list. -This command is intended to be bound to TAB, but is unbound -by default. -

- - -

delete-char-or-list () -
-Deletes the character under the cursor if not at the beginning or -end of the line (like delete-char). -If at the end of the line, behaves identically to -possible-completions. -This command is unbound by default. -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.4.7 Keyboard Macros

- -
- - -
start-kbd-macro (C-x () -
-Begin saving the characters typed into the current keyboard macro. -

- - -

end-kbd-macro (C-x )) -
-Stop saving the characters typed into the current keyboard macro -and save the definition. -

- - -

call-last-kbd-macro (C-x e) -
-Re-execute the last keyboard macro defined, by making the characters -in the macro appear as if typed at the keyboard. -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.4.8 Some Miscellaneous Commands

- -
- - -
re-read-init-file (C-x C-r) -
-Read in the contents of the inputrc file, and incorporate -any bindings or variable assignments found there. -

- - -

abort (C-g) -
-Abort the current editing command and -ring the terminal's bell (subject to the setting of -bell-style). -

- - -

do-uppercase-version (M-a, M-b, M-x, ...) -
-If the metafied character x is lowercase, run the command -that is bound to the corresponding uppercase character. -

- - -

prefix-meta (ESC) -
-Metafy the next character typed. This is for keyboards -without a meta key. Typing `ESC f' is equivalent to typing -M-f. -

- - -

undo (C-_ or C-x C-u) -
-Incremental undo, separately remembered for each line. -

- - -

revert-line (M-r) -
-Undo all changes made to this line. This is like executing the undo -command enough times to get back to the beginning. -

- - -

tilde-expand (M-~) -
-Perform tilde expansion on the current word. -

- - -

set-mark (C-@) -
-Set the mark to the point. If a -numeric argument is supplied, the mark is set to that position. -

- - -

exchange-point-and-mark (C-x C-x) -
-Swap the point with the mark. The current cursor position is set to -the saved position, and the old cursor position is saved as the mark. -

- - -

character-search (C-]) -
-A character is read and point is moved to the next occurrence of that -character. A negative count searches for previous occurrences. -

- - -

character-search-backward (M-C-]) -
-A character is read and point is moved to the previous occurrence -of that character. A negative count searches for subsequent -occurrences. -

- - -

insert-comment (M-#) -
-Without a numeric argument, the value of the comment-begin -variable is inserted at the beginning of the current line. -If a numeric argument is supplied, this command acts as a toggle: if -the characters at the beginning of the line do not match the value -of comment-begin, the value is inserted, otherwise -the characters in comment-begin are deleted from the beginning of -the line. -In either case, the line is accepted as if a newline had been typed. -

- - -

dump-functions () -
-Print all of the functions and their key bindings to the -Readline output stream. If a numeric argument is supplied, -the output is formatted in such a way that it can be made part -of an inputrc file. This command is unbound by default. -

- - -

dump-variables () -
-Print all of the settable variables and their values to the -Readline output stream. If a numeric argument is supplied, -the output is formatted in such a way that it can be made part -of an inputrc file. This command is unbound by default. -

- - -

dump-macros () -
-Print all of the Readline key sequences bound to macros and the -strings they output. If a numeric argument is supplied, -the output is formatted in such a way that it can be made part -of an inputrc file. This command is unbound by default. -

- - -

emacs-editing-mode (C-e) -
-When in vi command mode, this causes a switch to emacs -editing mode. -

- - -

vi-editing-mode (M-C-j) -
-When in emacs editing mode, this causes a switch to vi -editing mode. -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.5 Readline vi Mode

- -

- -While the Readline library does not have a full set of vi -editing functions, it does contain enough to allow simple editing -of the line. The Readline vi mode behaves as specified in -the POSIX 1003.2 standard. -

- -In order to switch interactively between emacs and vi -editing modes, use the command M-C-j (bound to emacs-editing-mode -when in vi mode and to vi-editing-mode in emacs mode). -The Readline default is emacs mode. -

- -When you enter a line in vi mode, you are already placed in -`insertion' mode, as if you had typed an `i'. Pressing ESC -switches you into `command' mode, where you can edit the text of the -line with the standard vi movement keys, move to previous -history lines with `k' and subsequent lines with `j', and -so forth. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

A. Copying This Manual

- -

- -

- -
A.1 GNU Free Documentation License  License for copying this manual.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

A.1 GNU Free Documentation License

- -

- - -

- Version 1.2, November 2002 -
-

- -
 
Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
-59 Temple Place, Suite 330, Boston, MA  02111-1307, USA
-
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.
-

- -

    -
  1. -PREAMBLE -

    - -The purpose of this License is to make a manual, textbook, or other -functional and useful document free in the sense of freedom: to -assure everyone the effective freedom to copy and redistribute it, -with or without modifying it, either commercially or noncommercially. -Secondarily, this License preserves for the author and publisher a way -to get credit for their work, while not being considered responsible -for modifications made by others. -

    - -This License is a kind of "copyleft", which means that derivative -works of the document must themselves be free in the same sense. It -complements the GNU General Public License, which is a copyleft -license designed for free software. -

    - -We have designed this License in order to use it for manuals for free -software, because free software needs free documentation: a free -program should come with manuals providing the same freedoms that the -software does. But this License is not limited to software manuals; -it can be used for any textual work, regardless of subject matter or -whether it is published as a printed book. We recommend this License -principally for works whose purpose is instruction or reference. -

    - -

  2. -APPLICABILITY AND DEFINITIONS -

    - -This License applies to any manual or other work, in any medium, that -contains a notice placed by the copyright holder saying it can be -distributed under the terms of this License. Such a notice grants a -world-wide, royalty-free license, unlimited in duration, to use that -work under the conditions stated herein. The "Document", below, -refers to any such manual or work. Any member of the public is a -licensee, and is addressed as "you". You accept the license if you -copy, modify or distribute the work in a way requiring permission -under copyright law. -

    - -A "Modified Version" of the Document means any work containing the -Document or a portion of it, either copied verbatim, or with -modifications and/or translated into another language. -

    - -A "Secondary Section" is a named appendix or a front-matter section -of the Document that deals exclusively with the relationship of the -publishers or authors of the Document to the Document's overall -subject (or to related matters) and contains nothing that could fall -directly within that overall subject. (Thus, if the Document is in -part a textbook of mathematics, a Secondary Section may not explain -any mathematics.) The relationship could be a matter of historical -connection with the subject or with related matters, or of legal, -commercial, philosophical, ethical or political position regarding -them. -

    - -The "Invariant Sections" are certain Secondary Sections whose titles -are designated, as being those of Invariant Sections, in the notice -that says that the Document is released under this License. If a -section does not fit the above definition of Secondary then it is not -allowed to be designated as Invariant. The Document may contain zero -Invariant Sections. If the Document does not identify any Invariant -Sections then there are none. -

    - -The "Cover Texts" are certain short passages of text that are listed, -as Front-Cover Texts or Back-Cover Texts, in the notice that says that -the Document is released under this License. A Front-Cover Text may -be at most 5 words, and a Back-Cover Text may be at most 25 words. -

    - -A "Transparent" copy of the Document means a machine-readable copy, -represented in a format whose specification is available to the -general public, that is suitable for revising the document -straightforwardly with generic text editors or (for images composed of -pixels) generic paint programs or (for drawings) some widely available -drawing editor, and that is suitable for input to text formatters or -for automatic translation to a variety of formats suitable for input -to text formatters. A copy made in an otherwise Transparent file -format whose markup, or absence of markup, has been arranged to thwart -or discourage subsequent modification by readers is not Transparent. -An image format is not Transparent if used for any substantial amount -of text. A copy that is not "Transparent" is called "Opaque". -

    - -Examples of suitable formats for Transparent copies include plain -ASCII without markup, Texinfo input format, LaTeX input -format, SGML or XML using a publicly available -DTD, and standard-conforming simple HTML, -PostScript or PDF designed for human modification. Examples -of transparent image formats include PNG, XCF and -JPG. Opaque formats include proprietary formats that can be -read and edited only by proprietary word processors, SGML or -XML for which the DTD and/or processing tools are -not generally available, and the machine-generated HTML, -PostScript or PDF produced by some word processors for -output purposes only. -

    - -The "Title Page" means, for a printed book, the title page itself, -plus such following pages as are needed to hold, legibly, the material -this License requires to appear in the title page. For works in -formats which do not have any title page as such, "Title Page" means -the text near the most prominent appearance of the work's title, -preceding the beginning of the body of the text. -

    - -A section "Entitled XYZ" means a named subunit of the Document whose -title either is precisely XYZ or contains XYZ in parentheses following -text that translates XYZ in another language. (Here XYZ stands for a -specific section name mentioned below, such as "Acknowledgements", -"Dedications", "Endorsements", or "History".) To "Preserve the Title" -of such a section when you modify the Document means that it remains a -section "Entitled XYZ" according to this definition. -

    - -The Document may include Warranty Disclaimers next to the notice which -states that this License applies to the Document. These Warranty -Disclaimers are considered to be included by reference in this -License, but only as regards disclaiming warranties: any other -implication that these Warranty Disclaimers may have is void and has -no effect on the meaning of this License. -

    - -

  3. -VERBATIM COPYING -

    - -You may copy and distribute the Document in any medium, either -commercially or noncommercially, provided that this License, the -copyright notices, and the license notice saying this License applies -to the Document are reproduced in all copies, and that you add no other -conditions whatsoever to those of this License. You may not use -technical measures to obstruct or control the reading or further -copying of the copies you make or distribute. However, you may accept -compensation in exchange for copies. If you distribute a large enough -number of copies you must also follow the conditions in section 3. -

    - -You may also lend copies, under the same conditions stated above, and -you may publicly display copies. -

    - -

  4. -COPYING IN QUANTITY -

    - -If you publish printed copies (or copies in media that commonly have -printed covers) of the Document, numbering more than 100, and the -Document's license notice requires Cover Texts, you must enclose the -copies in covers that carry, clearly and legibly, all these Cover -Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on -the back cover. Both covers must also clearly and legibly identify -you as the publisher of these copies. The front cover must present -the full title with all words of the title equally prominent and -visible. You may add other material on the covers in addition. -Copying with changes limited to the covers, as long as they preserve -the title of the Document and satisfy these conditions, can be treated -as verbatim copying in other respects. -

    - -If the required texts for either cover are too voluminous to fit -legibly, you should put the first ones listed (as many as fit -reasonably) on the actual cover, and continue the rest onto adjacent -pages. -

    - -If you publish or distribute Opaque copies of the Document numbering -more than 100, you must either include a machine-readable Transparent -copy along with each Opaque copy, or state in or with each Opaque copy -a computer-network location from which the general network-using -public has access to download using public-standard network protocols -a complete Transparent copy of the Document, free of added material. -If you use the latter option, you must take reasonably prudent steps, -when you begin distribution of Opaque copies in quantity, to ensure -that this Transparent copy will remain thus accessible at the stated -location until at least one year after the last time you distribute an -Opaque copy (directly or through your agents or retailers) of that -edition to the public. -

    - -It is requested, but not required, that you contact the authors of the -Document well before redistributing any large number of copies, to give -them a chance to provide you with an updated version of the Document. -

    - -

  5. -MODIFICATIONS -

    - -You may copy and distribute a Modified Version of the Document under -the conditions of sections 2 and 3 above, provided that you release -the Modified Version under precisely this License, with the Modified -Version filling the role of the Document, thus licensing distribution -and modification of the Modified Version to whoever possesses a copy -of it. In addition, you must do these things in the Modified Version: -

    - -

      -
    1. -Use in the Title Page (and on the covers, if any) a title distinct -from that of the Document, and from those of previous versions -(which should, if there were any, be listed in the History section -of the Document). You may use the same title as a previous version -if the original publisher of that version gives permission. -

      - -

    2. -List on the Title Page, as authors, one or more persons or entities -responsible for authorship of the modifications in the Modified -Version, together with at least five of the principal authors of the -Document (all of its principal authors, if it has fewer than five), -unless they release you from this requirement. -

      - -

    3. -State on the Title page the name of the publisher of the -Modified Version, as the publisher. -

      - -

    4. -Preserve all the copyright notices of the Document. -

      - -

    5. -Add an appropriate copyright notice for your modifications -adjacent to the other copyright notices. -

      - -

    6. -Include, immediately after the copyright notices, a license notice -giving the public permission to use the Modified Version under the -terms of this License, in the form shown in the Addendum below. -

      - -

    7. -Preserve in that license notice the full lists of Invariant Sections -and required Cover Texts given in the Document's license notice. -

      - -

    8. -Include an unaltered copy of this License. -

      - -

    9. -Preserve the section Entitled "History", Preserve its Title, and add -to it an item stating at least the title, year, new authors, and -publisher of the Modified Version as given on the Title Page. If -there is no section Entitled "History" in the Document, create one -stating the title, year, authors, and publisher of the Document as -given on its Title Page, then add an item describing the Modified -Version as stated in the previous sentence. -

      - -

    10. -Preserve the network location, if any, given in the Document for -public access to a Transparent copy of the Document, and likewise -the network locations given in the Document for previous versions -it was based on. These may be placed in the "History" section. -You may omit a network location for a work that was published at -least four years before the Document itself, or if the original -publisher of the version it refers to gives permission. -

      - -

    11. -For any section Entitled "Acknowledgements" or "Dedications", Preserve -the Title of the section, and preserve in the section all the -substance and tone of each of the contributor acknowledgements and/or -dedications given therein. -

      - -

    12. -Preserve all the Invariant Sections of the Document, -unaltered in their text and in their titles. Section numbers -or the equivalent are not considered part of the section titles. -

      - -

    13. -Delete any section Entitled "Endorsements". Such a section -may not be included in the Modified Version. -

      - -

    14. -Do not retitle any existing section to be Entitled "Endorsements" or -to conflict in title with any Invariant Section. -

      - -

    15. -Preserve any Warranty Disclaimers. -
    -

    - -If the Modified Version includes new front-matter sections or -appendices that qualify as Secondary Sections and contain no material -copied from the Document, you may at your option designate some or all -of these sections as invariant. To do this, add their titles to the -list of Invariant Sections in the Modified Version's license notice. -These titles must be distinct from any other section titles. -

    - -You may add a section Entitled "Endorsements", provided it contains -nothing but endorsements of your Modified Version by various -parties--for example, statements of peer review or that the text has -been approved by an organization as the authoritative definition of a -standard. -

    - -You may add a passage of up to five words as a Front-Cover Text, and a -passage of up to 25 words as a Back-Cover Text, to the end of the list -of Cover Texts in the Modified Version. Only one passage of -Front-Cover Text and one of Back-Cover Text may be added by (or -through arrangements made by) any one entity. If the Document already -includes a cover text for the same cover, previously added by you or -by arrangement made by the same entity you are acting on behalf of, -you may not add another; but you may replace the old one, on explicit -permission from the previous publisher that added the old one. -

    - -The author(s) and publisher(s) of the Document do not by this License -give permission to use their names for publicity for or to assert or -imply endorsement of any Modified Version. -

    - -

  6. -COMBINING DOCUMENTS -

    - -You may combine the Document with other documents released under this -License, under the terms defined in section 4 above for modified -versions, provided that you include in the combination all of the -Invariant Sections of all of the original documents, unmodified, and -list them all as Invariant Sections of your combined work in its -license notice, and that you preserve all their Warranty Disclaimers. -

    - -The combined work need only contain one copy of this License, and -multiple identical Invariant Sections may be replaced with a single -copy. If there are multiple Invariant Sections with the same name but -different contents, make the title of each such section unique by -adding at the end of it, in parentheses, the name of the original -author or publisher of that section if known, or else a unique number. -Make the same adjustment to the section titles in the list of -Invariant Sections in the license notice of the combined work. -

    - -In the combination, you must combine any sections Entitled "History" -in the various original documents, forming one section Entitled -"History"; likewise combine any sections Entitled "Acknowledgements", -and any sections Entitled "Dedications". You must delete all -sections Entitled "Endorsements." -

    - -

  7. -COLLECTIONS OF DOCUMENTS -

    - -You may make a collection consisting of the Document and other documents -released under this License, and replace the individual copies of this -License in the various documents with a single copy that is included in -the collection, provided that you follow the rules of this License for -verbatim copying of each of the documents in all other respects. -

    - -You may extract a single document from such a collection, and distribute -it individually under this License, provided you insert a copy of this -License into the extracted document, and follow this License in all -other respects regarding verbatim copying of that document. -

    - -

  8. -AGGREGATION WITH INDEPENDENT WORKS -

    - -A compilation of the Document or its derivatives with other separate -and independent documents or works, in or on a volume of a storage or -distribution medium, is called an "aggregate" if the copyright -resulting from the compilation is not used to limit the legal rights -of the compilation's users beyond what the individual works permit. -When the Document is included an aggregate, this License does not -apply to the other works in the aggregate which are not themselves -derivative works of the Document. -

    - -If the Cover Text requirement of section 3 is applicable to these -copies of the Document, then if the Document is less than one half of -the entire aggregate, the Document's Cover Texts may be placed on -covers that bracket the Document within the aggregate, or the -electronic equivalent of covers if the Document is in electronic form. -Otherwise they must appear on printed covers that bracket the whole -aggregate. -

    - -

  9. -TRANSLATION -

    - -Translation is considered a kind of modification, so you may -distribute translations of the Document under the terms of section 4. -Replacing Invariant Sections with translations requires special -permission from their copyright holders, but you may include -translations of some or all Invariant Sections in addition to the -original versions of these Invariant Sections. You may include a -translation of this License, and all the license notices in the -Document, and any Warranty Disclaimers, provided that you also include -the original English version of this License and the original versions -of those notices and disclaimers. In case of a disagreement between -the translation and the original version of this License or a notice -or disclaimer, the original version will prevail. -

    - -If a section in the Document is Entitled "Acknowledgements", -"Dedications", or "History", the requirement (section 4) to Preserve -its Title (section 1) will typically require changing the actual -title. -

    - -

  10. -TERMINATION -

    - -You may not copy, modify, sublicense, or distribute the Document except -as expressly provided for under this License. Any other attempt to -copy, modify, sublicense or distribute the Document is void, and will -automatically terminate your rights under this License. However, -parties who have received copies, or rights, from you under this -License will not have their licenses terminated so long as such -parties remain in full compliance. -

    - -

  11. -FUTURE REVISIONS OF THIS LICENSE -

    - -The Free Software Foundation may publish new, revised versions -of the GNU Free Documentation License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. See -http://www.gnu.org/copyleft/. -

    - -Each version of the License is given a distinguishing version number. -If the Document specifies that a particular numbered version of this -License "or any later version" applies to it, you have the option of -following the terms and conditions either of that specified version or -of any later version that has been published (not as a draft) by the -Free Software Foundation. If the Document does not specify a version -number of this License, you may choose any version ever published (not -as a draft) by the Free Software Foundation. -

-

- -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

A.1.1 ADDENDUM: How to use this License for your documents

- -

- -To use this License in a document you have written, include a copy of -the License in the document and put the following copyright and -license notices just after the title page: -

- -
 
  Copyright (C)  year  your name.
-  Permission is granted to copy, distribute and/or modify this document
-  under the terms of the GNU Free Documentation License, Version 1.2
-  or any later version published by the Free Software Foundation;
-  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
-  A copy of the license is included in the section entitled ``GNU
-  Free Documentation License''.
-

- -If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, -replace the "with...Texts." line with this: -

- -
 
    with the Invariant Sections being list their titles, with
-    the Front-Cover Texts being list, and with the Back-Cover Texts
-    being list.
-

- -If you have Invariant Sections without Cover Texts, or some other -combination of the three, merge those two alternatives to suit the -situation. -

- -If your document contains nontrivial examples of program code, we -recommend releasing these examples in parallel under your choice of -free software license, such as the GNU General Public License, -to permit their use in free software. -

- -


- - - - - - -
[Top][Contents][Index][ ? ]
-

Table of Contents

- -
- - - - - - -
[Top][Contents][Index][ ? ]
-

Short Table of Contents

-
-1. Command Line Editing -
-A. Copying This Manual -
- -
-
- - - - - - -
[Top][Contents][Index][ ? ]
-

About this document

-This document was generated by Chet Ramey on July, 27 2004 -using texi2html -

-The buttons in the navigation panels have the following meaning: -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Button Name Go to From 1.2.3 go to
- [ < ] -Back - -previous section in reading order - -1.2.2 -
- [ > ] -Forward - -next section in reading order - -1.2.4 -
- [ << ] -FastBack - -previous or up-and-previous section - -1.1 -
- [ Up ] -Up - -up section - -1.2 -
- [ >> ] -FastForward - -next or up-and-next section - -1.3 -
- [Top] -Top - -cover (top) of document - -   -
- [Contents] -Contents - -table of contents - -   -
- [Index] -Index - -concept index - -   -
- [ ? ] -About - -this page - -   -
-

-where the Example assumes that the current position -is at Subsubsection One-Two-Three of a document of -the following structure: -
    -
  • 1. Section One
  • -
      -
    • 1.1 Subsection One-One
    • -
        -
      • ...
      • -
      -
    • 1.2 Subsection One-Two
    • -
        -
      • 1.2.1 Subsubsection One-Two-One -
      • 1.2.2 Subsubsection One-Two-Two -
      • 1.2.3 Subsubsection One-Two-Three     -<== Current Position -
      • 1.2.4 Subsubsection One-Two-Four -
      -
    • 1.3 Subsection One-Three
    • -
        -
      • ...
      • -
      -
    • 1.4 Subsection One-Four
    • -
    -
- -
-
- -This document was generated -by Chet Ramey on July, 27 2004 -using texi2html - - - diff --git a/dep/src/readline/src/doc/rluserman.info b/dep/src/readline/src/doc/rluserman.info deleted file mode 100644 index 4a9507c8baa..00000000000 --- a/dep/src/readline/src/doc/rluserman.info +++ /dev/null @@ -1,1731 +0,0 @@ -This is rluserman.info, produced by makeinfo version 4.5 from -/usr/homes/chet/src/bash/readline-src/doc/rluserman.texi. - -This manual describes the end user interface of the GNU Readline Library -(version 5.0, 28 January 2004), a library which aids in the consistency -of user interface across discrete programs which provide a command line -interface. - - Copyright (C) 1988-2004 Free Software Foundation, Inc. - - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - - Permission is granted to copy, distribute and/or modify this - document under the terms of the GNU Free Documentation License, - Version 1.1 or any later version published by the Free Software - Foundation; with no Invariant Sections, with the Front-Cover texts - being "A GNU Manual," and with the Back-Cover Texts as in (a) - below. A copy of the license is included in the section entitled - "GNU Free Documentation License." - - (a) The FSF's Back-Cover Text is: "You have freedom to copy and - modify this GNU Manual, like GNU software. Copies published by - the Free Software Foundation raise funds for GNU development." - -INFO-DIR-SECTION Libraries -START-INFO-DIR-ENTRY -* RLuserman: (rluserman). The GNU readline library User's Manual. -END-INFO-DIR-ENTRY - - -File: rluserman.info, Node: Top, Next: Command Line Editing, Up: (dir) - -GNU Readline Library -******************** - - This document describes the end user interface of the GNU Readline -Library, a utility which aids in the consistency of user interface -across discrete programs which provide a command line interface. - -* Menu: - -* Command Line Editing:: GNU Readline User's Manual. -* Copying This Manual:: Copying This Manual. - - -File: rluserman.info, Node: Command Line Editing, Next: Copying This Manual, Prev: Top, Up: Top - -Command Line Editing -******************** - - This chapter describes the basic features of the GNU command line -editing interface. - -* Menu: - -* Introduction and Notation:: Notation used in this text. -* Readline Interaction:: The minimum set of commands for editing a line. -* Readline Init File:: Customizing Readline from a user's view. -* Bindable Readline Commands:: A description of most of the Readline commands - available for binding -* Readline vi Mode:: A short description of how to make Readline - behave like the vi editor. - - -File: rluserman.info, Node: Introduction and Notation, Next: Readline Interaction, Up: Command Line Editing - -Introduction to Line Editing -============================ - - The following paragraphs describe the notation used to represent -keystrokes. - - The text `C-k' is read as `Control-K' and describes the character -produced when the key is pressed while the Control key is depressed. - - The text `M-k' is read as `Meta-K' and describes the character -produced when the Meta key (if you have one) is depressed, and the -key is pressed. The Meta key is labeled on many keyboards. On -keyboards with two keys labeled (usually to either side of the -space bar), the on the left side is generally set to work as a -Meta key. The key on the right may also be configured to work as -a Meta key or may be configured as some other modifier, such as a -Compose key for typing accented characters. - - If you do not have a Meta or key, or another key working as a -Meta key, the identical keystroke can be generated by typing -_first_, and then typing . Either process is known as "metafying" -the key. - - The text `M-C-k' is read as `Meta-Control-k' and describes the -character produced by "metafying" `C-k'. - - In addition, several keys have their own names. Specifically, -, , , , , and all stand for themselves -when seen in this text, or in an init file (*note Readline Init File::). -If your keyboard lacks a key, typing will produce the -desired character. The key may be labeled or on -some keyboards. - - -File: rluserman.info, Node: Readline Interaction, Next: Readline Init File, Prev: Introduction and Notation, Up: Command Line Editing - -Readline Interaction -==================== - - Often during an interactive session you type in a long line of text, -only to notice that the first word on the line is misspelled. The -Readline library gives you a set of commands for manipulating the text -as you type it in, allowing you to just fix your typo, and not forcing -you to retype the majority of the line. Using these editing commands, -you move the cursor to the place that needs correction, and delete or -insert the text of the corrections. Then, when you are satisfied with -the line, you simply press . You do not have to be at the end of -the line to press ; the entire line is accepted regardless of the -location of the cursor within the line. - -* Menu: - -* Readline Bare Essentials:: The least you need to know about Readline. -* Readline Movement Commands:: Moving about the input line. -* Readline Killing Commands:: How to delete text, and how to get it back! -* Readline Arguments:: Giving numeric arguments to commands. -* Searching:: Searching through previous lines. - - -File: rluserman.info, Node: Readline Bare Essentials, Next: Readline Movement Commands, Up: Readline Interaction - -Readline Bare Essentials ------------------------- - - In order to enter characters into the line, simply type them. The -typed character appears where the cursor was, and then the cursor moves -one space to the right. If you mistype a character, you can use your -erase character to back up and delete the mistyped character. - - Sometimes you may mistype a character, and not notice the error -until you have typed several other characters. In that case, you can -type `C-b' to move the cursor to the left, and then correct your -mistake. Afterwards, you can move the cursor to the right with `C-f'. - - When you add text in the middle of a line, you will notice that -characters to the right of the cursor are `pushed over' to make room -for the text that you have inserted. Likewise, when you delete text -behind the cursor, characters to the right of the cursor are `pulled -back' to fill in the blank space created by the removal of the text. A -list of the bare essentials for editing the text of an input line -follows. - -`C-b' - Move back one character. - -`C-f' - Move forward one character. - - or - Delete the character to the left of the cursor. - -`C-d' - Delete the character underneath the cursor. - -Printing characters - Insert the character into the line at the cursor. - -`C-_' or `C-x C-u' - Undo the last editing command. You can undo all the way back to an - empty line. - -(Depending on your configuration, the key be set to delete -the character to the left of the cursor and the key set to delete -the character underneath the cursor, like `C-d', rather than the -character to the left of the cursor.) - - -File: rluserman.info, Node: Readline Movement Commands, Next: Readline Killing Commands, Prev: Readline Bare Essentials, Up: Readline Interaction - -Readline Movement Commands --------------------------- - - The above table describes the most basic keystrokes that you need in -order to do editing of the input line. For your convenience, many -other commands have been added in addition to `C-b', `C-f', `C-d', and -. Here are some commands for moving more rapidly about the line. - -`C-a' - Move to the start of the line. - -`C-e' - Move to the end of the line. - -`M-f' - Move forward a word, where a word is composed of letters and - digits. - -`M-b' - Move backward a word. - -`C-l' - Clear the screen, reprinting the current line at the top. - - Notice how `C-f' moves forward a character, while `M-f' moves -forward a word. It is a loose convention that control keystrokes -operate on characters while meta keystrokes operate on words. - - -File: rluserman.info, Node: Readline Killing Commands, Next: Readline Arguments, Prev: Readline Movement Commands, Up: Readline Interaction - -Readline Killing Commands -------------------------- - - "Killing" text means to delete the text from the line, but to save -it away for later use, usually by "yanking" (re-inserting) it back into -the line. (`Cut' and `paste' are more recent jargon for `kill' and -`yank'.) - - If the description for a command says that it `kills' text, then you -can be sure that you can get the text back in a different (or the same) -place later. - - When you use a kill command, the text is saved in a "kill-ring". -Any number of consecutive kills save all of the killed text together, so -that when you yank it back, you get it all. The kill ring is not line -specific; the text that you killed on a previously typed line is -available to be yanked back later, when you are typing another line. - - Here is the list of commands for killing text. - -`C-k' - Kill the text from the current cursor position to the end of the - line. - -`M-d' - Kill from the cursor to the end of the current word, or, if between - words, to the end of the next word. Word boundaries are the same - as those used by `M-f'. - -`M-' - Kill from the cursor the start of the current word, or, if between - words, to the start of the previous word. Word boundaries are the - same as those used by `M-b'. - -`C-w' - Kill from the cursor to the previous whitespace. This is - different than `M-' because the word boundaries differ. - - - Here is how to "yank" the text back into the line. Yanking means to -copy the most-recently-killed text from the kill buffer. - -`C-y' - Yank the most recently killed text back into the buffer at the - cursor. - -`M-y' - Rotate the kill-ring, and yank the new top. You can only do this - if the prior command is `C-y' or `M-y'. - - -File: rluserman.info, Node: Readline Arguments, Next: Searching, Prev: Readline Killing Commands, Up: Readline Interaction - -Readline Arguments ------------------- - - You can pass numeric arguments to Readline commands. Sometimes the -argument acts as a repeat count, other times it is the sign of the -argument that is significant. If you pass a negative argument to a -command which normally acts in a forward direction, that command will -act in a backward direction. For example, to kill text back to the -start of the line, you might type `M-- C-k'. - - The general way to pass numeric arguments to a command is to type -meta digits before the command. If the first `digit' typed is a minus -sign (`-'), then the sign of the argument will be negative. Once you -have typed one meta digit to get the argument started, you can type the -remainder of the digits, and then the command. For example, to give -the `C-d' command an argument of 10, you could type `M-1 0 C-d', which -will delete the next ten characters on the input line. - - -File: rluserman.info, Node: Searching, Prev: Readline Arguments, Up: Readline Interaction - -Searching for Commands in the History -------------------------------------- - - Readline provides commands for searching through the command history -for lines containing a specified string. There are two search modes: -"incremental" and "non-incremental". - - Incremental searches begin before the user has finished typing the -search string. As each character of the search string is typed, -Readline displays the next entry from the history matching the string -typed so far. An incremental search requires only as many characters -as needed to find the desired history entry. To search backward in the -history for a particular string, type `C-r'. Typing `C-s' searches -forward through the history. The characters present in the value of -the `isearch-terminators' variable are used to terminate an incremental -search. If that variable has not been assigned a value, the and -`C-J' characters will terminate an incremental search. `C-g' will -abort an incremental search and restore the original line. When the -search is terminated, the history entry containing the search string -becomes the current line. - - To find other matching entries in the history list, type `C-r' or -`C-s' as appropriate. This will search backward or forward in the -history for the next entry matching the search string typed so far. -Any other key sequence bound to a Readline command will terminate the -search and execute that command. For instance, a will terminate -the search and accept the line, thereby executing the command from the -history list. A movement command will terminate the search, make the -last line found the current line, and begin editing. - - Readline remembers the last incremental search string. If two -`C-r's are typed without any intervening characters defining a new -search string, any remembered search string is used. - - Non-incremental searches read the entire search string before -starting to search for matching history lines. The search string may be -typed by the user or be part of the contents of the current line. - - -File: rluserman.info, Node: Readline Init File, Next: Bindable Readline Commands, Prev: Readline Interaction, Up: Command Line Editing - -Readline Init File -================== - - Although the Readline library comes with a set of Emacs-like -keybindings installed by default, it is possible to use a different set -of keybindings. Any user can customize programs that use Readline by -putting commands in an "inputrc" file, conventionally in his home -directory. The name of this file is taken from the value of the -environment variable `INPUTRC'. If that variable is unset, the default -is `~/.inputrc'. - - When a program which uses the Readline library starts up, the init -file is read, and the key bindings are set. - - In addition, the `C-x C-r' command re-reads this init file, thus -incorporating any changes that you might have made to it. - -* Menu: - -* Readline Init File Syntax:: Syntax for the commands in the inputrc file. - -* Conditional Init Constructs:: Conditional key bindings in the inputrc file. - -* Sample Init File:: An example inputrc file. - - -File: rluserman.info, Node: Readline Init File Syntax, Next: Conditional Init Constructs, Up: Readline Init File - -Readline Init File Syntax -------------------------- - - There are only a few basic constructs allowed in the Readline init -file. Blank lines are ignored. Lines beginning with a `#' are -comments. Lines beginning with a `$' indicate conditional constructs -(*note Conditional Init Constructs::). Other lines denote variable -settings and key bindings. - -Variable Settings - You can modify the run-time behavior of Readline by altering the - values of variables in Readline using the `set' command within the - init file. The syntax is simple: - - set VARIABLE VALUE - - Here, for example, is how to change from the default Emacs-like - key binding to use `vi' line editing commands: - - set editing-mode vi - - Variable names and values, where appropriate, are recognized - without regard to case. - - A great deal of run-time behavior is changeable with the following - variables. - - `bell-style' - Controls what happens when Readline wants to ring the - terminal bell. If set to `none', Readline never rings the - bell. If set to `visible', Readline uses a visible bell if - one is available. If set to `audible' (the default), - Readline attempts to ring the terminal's bell. - - `comment-begin' - The string to insert at the beginning of the line when the - `insert-comment' command is executed. The default value is - `"#"'. - - `completion-ignore-case' - If set to `on', Readline performs filename matching and - completion in a case-insensitive fashion. The default value - is `off'. - - `completion-query-items' - The number of possible completions that determines when the - user is asked whether the list of possibilities should be - displayed. If the number of possible completions is greater - than this value, Readline will ask the user whether or not he - wishes to view them; otherwise, they are simply listed. This - variable must be set to an integer value greater than or - equal to 0. The default limit is `100'. - - `convert-meta' - If set to `on', Readline will convert characters with the - eighth bit set to an ASCII key sequence by stripping the - eighth bit and prefixing an character, converting them - to a meta-prefixed key sequence. The default value is `on'. - - `disable-completion' - If set to `On', Readline will inhibit word completion. - Completion characters will be inserted into the line as if - they had been mapped to `self-insert'. The default is `off'. - - `editing-mode' - The `editing-mode' variable controls which default set of key - bindings is used. By default, Readline starts up in Emacs - editing mode, where the keystrokes are most similar to Emacs. - This variable can be set to either `emacs' or `vi'. - - `enable-keypad' - When set to `on', Readline will try to enable the application - keypad when it is called. Some systems need this to enable - the arrow keys. The default is `off'. - - `expand-tilde' - If set to `on', tilde expansion is performed when Readline - attempts word completion. The default is `off'. - - If set to `on', the history code attempts to place point at - the same location on each history line retrieved with - `previous-history' or `next-history'. - - `horizontal-scroll-mode' - This variable can be set to either `on' or `off'. Setting it - to `on' means that the text of the lines being edited will - scroll horizontally on a single screen line when they are - longer than the width of the screen, instead of wrapping onto - a new screen line. By default, this variable is set to `off'. - - `input-meta' - If set to `on', Readline will enable eight-bit input (it will - not clear the eighth bit in the characters it reads), - regardless of what the terminal claims it can support. The - default value is `off'. The name `meta-flag' is a synonym - for this variable. - - `isearch-terminators' - The string of characters that should terminate an incremental - search without subsequently executing the character as a - command (*note Searching::). If this variable has not been - given a value, the characters and `C-J' will terminate - an incremental search. - - `keymap' - Sets Readline's idea of the current keymap for key binding - commands. Acceptable `keymap' names are `emacs', - `emacs-standard', `emacs-meta', `emacs-ctlx', `vi', `vi-move', - `vi-command', and `vi-insert'. `vi' is equivalent to - `vi-command'; `emacs' is equivalent to `emacs-standard'. The - default value is `emacs'. The value of the `editing-mode' - variable also affects the default keymap. - - `mark-directories' - If set to `on', completed directory names have a slash - appended. The default is `on'. - - `mark-modified-lines' - This variable, when set to `on', causes Readline to display an - asterisk (`*') at the start of history lines which have been - modified. This variable is `off' by default. - - `mark-symlinked-directories' - If set to `on', completed names which are symbolic links to - directories have a slash appended (subject to the value of - `mark-directories'). The default is `off'. - - `match-hidden-files' - This variable, when set to `on', causes Readline to match - files whose names begin with a `.' (hidden files) when - performing filename completion, unless the leading `.' is - supplied by the user in the filename to be completed. This - variable is `on' by default. - - `output-meta' - If set to `on', Readline will display characters with the - eighth bit set directly rather than as a meta-prefixed escape - sequence. The default is `off'. - - `page-completions' - If set to `on', Readline uses an internal `more'-like pager - to display a screenful of possible completions at a time. - This variable is `on' by default. - - `print-completions-horizontally' - If set to `on', Readline will display completions with matches - sorted horizontally in alphabetical order, rather than down - the screen. The default is `off'. - - `show-all-if-ambiguous' - This alters the default behavior of the completion functions. - If set to `on', words which have more than one possible - completion cause the matches to be listed immediately instead - of ringing the bell. The default value is `off'. - - `show-all-if-unmodified' - This alters the default behavior of the completion functions - in a fashion similar to SHOW-ALL-IF-AMBIGUOUS. If set to - `on', words which have more than one possible completion - without any possible partial completion (the possible - completions don't share a common prefix) cause the matches to - be listed immediately instead of ringing the bell. The - default value is `off'. - - `visible-stats' - If set to `on', a character denoting a file's type is - appended to the filename when listing possible completions. - The default is `off'. - - -Key Bindings - The syntax for controlling key bindings in the init file is - simple. First you need to find the name of the command that you - want to change. The following sections contain tables of the - command name, the default keybinding, if any, and a short - description of what the command does. - - Once you know the name of the command, simply place on a line in - the init file the name of the key you wish to bind the command to, - a colon, and then the name of the command. The name of the key - can be expressed in different ways, depending on what you find most - comfortable. - - In addition to command names, readline allows keys to be bound to - a string that is inserted when the key is pressed (a MACRO). - - KEYNAME: FUNCTION-NAME or MACRO - KEYNAME is the name of a key spelled out in English. For - example: - Control-u: universal-argument - Meta-Rubout: backward-kill-word - Control-o: "> output" - - In the above example, `C-u' is bound to the function - `universal-argument', `M-DEL' is bound to the function - `backward-kill-word', and `C-o' is bound to run the macro - expressed on the right hand side (that is, to insert the text - `> output' into the line). - - A number of symbolic character names are recognized while - processing this key binding syntax: DEL, ESC, ESCAPE, LFD, - NEWLINE, RET, RETURN, RUBOUT, SPACE, SPC, and TAB. - - "KEYSEQ": FUNCTION-NAME or MACRO - KEYSEQ differs from KEYNAME above in that strings denoting an - entire key sequence can be specified, by placing the key - sequence in double quotes. Some GNU Emacs style key escapes - can be used, as in the following example, but the special - character names are not recognized. - - "\C-u": universal-argument - "\C-x\C-r": re-read-init-file - "\e[11~": "Function Key 1" - - In the above example, `C-u' is again bound to the function - `universal-argument' (just as it was in the first example), - `C-x C-r' is bound to the function `re-read-init-file', and - ` <[> <1> <1> <~>' is bound to insert the text `Function - Key 1'. - - - The following GNU Emacs style escape sequences are available when - specifying key sequences: - - `\C-' - control prefix - - `\M-' - meta prefix - - `\e' - an escape character - - `\\' - backslash - - `\"' - <">, a double quotation mark - - `\'' - <'>, a single quote or apostrophe - - In addition to the GNU Emacs style escape sequences, a second set - of backslash escapes is available: - - `\a' - alert (bell) - - `\b' - backspace - - `\d' - delete - - `\f' - form feed - - `\n' - newline - - `\r' - carriage return - - `\t' - horizontal tab - - `\v' - vertical tab - - `\NNN' - the eight-bit character whose value is the octal value NNN - (one to three digits) - - `\xHH' - the eight-bit character whose value is the hexadecimal value - HH (one or two hex digits) - - When entering the text of a macro, single or double quotes must be - used to indicate a macro definition. Unquoted text is assumed to - be a function name. In the macro body, the backslash escapes - described above are expanded. Backslash will quote any other - character in the macro text, including `"' and `''. For example, - the following binding will make `C-x \' insert a single `\' into - the line: - "\C-x\\": "\\" - - - -File: rluserman.info, Node: Conditional Init Constructs, Next: Sample Init File, Prev: Readline Init File Syntax, Up: Readline Init File - -Conditional Init Constructs ---------------------------- - - Readline implements a facility similar in spirit to the conditional -compilation features of the C preprocessor which allows key bindings -and variable settings to be performed as the result of tests. There -are four parser directives used. - -`$if' - The `$if' construct allows bindings to be made based on the - editing mode, the terminal being used, or the application using - Readline. The text of the test extends to the end of the line; no - characters are required to isolate it. - - `mode' - The `mode=' form of the `$if' directive is used to test - whether Readline is in `emacs' or `vi' mode. This may be - used in conjunction with the `set keymap' command, for - instance, to set bindings in the `emacs-standard' and - `emacs-ctlx' keymaps only if Readline is starting out in - `emacs' mode. - - `term' - The `term=' form may be used to include terminal-specific key - bindings, perhaps to bind the key sequences output by the - terminal's function keys. The word on the right side of the - `=' is tested against both the full name of the terminal and - the portion of the terminal name before the first `-'. This - allows `sun' to match both `sun' and `sun-cmd', for instance. - - `application' - The APPLICATION construct is used to include - application-specific settings. Each program using the - Readline library sets the APPLICATION NAME, and you can test - for a particular value. This could be used to bind key - sequences to functions useful for a specific program. For - instance, the following command adds a key sequence that - quotes the current or previous word in Bash: - $if Bash - # Quote the current or previous word - "\C-xq": "\eb\"\ef\"" - $endif - -`$endif' - This command, as seen in the previous example, terminates an `$if' - command. - -`$else' - Commands in this branch of the `$if' directive are executed if the - test fails. - -`$include' - This directive takes a single filename as an argument and reads - commands and bindings from that file. For example, the following - directive reads from `/etc/inputrc': - $include /etc/inputrc - - -File: rluserman.info, Node: Sample Init File, Prev: Conditional Init Constructs, Up: Readline Init File - -Sample Init File ----------------- - - Here is an example of an INPUTRC file. This illustrates key -binding, variable assignment, and conditional syntax. - - - # This file controls the behaviour of line input editing for - # programs that use the GNU Readline library. Existing - # programs include FTP, Bash, and GDB. - # - # You can re-read the inputrc file with C-x C-r. - # Lines beginning with '#' are comments. - # - # First, include any systemwide bindings and variable - # assignments from /etc/Inputrc - $include /etc/Inputrc - - # - # Set various bindings for emacs mode. - - set editing-mode emacs - - $if mode=emacs - - Meta-Control-h: backward-kill-word Text after the function name is ignored - - # - # Arrow keys in keypad mode - # - #"\M-OD": backward-char - #"\M-OC": forward-char - #"\M-OA": previous-history - #"\M-OB": next-history - # - # Arrow keys in ANSI mode - # - "\M-[D": backward-char - "\M-[C": forward-char - "\M-[A": previous-history - "\M-[B": next-history - # - # Arrow keys in 8 bit keypad mode - # - #"\M-\C-OD": backward-char - #"\M-\C-OC": forward-char - #"\M-\C-OA": previous-history - #"\M-\C-OB": next-history - # - # Arrow keys in 8 bit ANSI mode - # - #"\M-\C-[D": backward-char - #"\M-\C-[C": forward-char - #"\M-\C-[A": previous-history - #"\M-\C-[B": next-history - - C-q: quoted-insert - - $endif - - # An old-style binding. This happens to be the default. - TAB: complete - - # Macros that are convenient for shell interaction - $if Bash - # edit the path - "\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f" - # prepare to type a quoted word -- - # insert open and close double quotes - # and move to just after the open quote - "\C-x\"": "\"\"\C-b" - # insert a backslash (testing backslash escapes - # in sequences and macros) - "\C-x\\": "\\" - # Quote the current or previous word - "\C-xq": "\eb\"\ef\"" - # Add a binding to refresh the line, which is unbound - "\C-xr": redraw-current-line - # Edit variable on current line. - "\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y=" - $endif - - # use a visible bell if one is available - set bell-style visible - - # don't strip characters to 7 bits when reading - set input-meta on - - # allow iso-latin1 characters to be inserted rather - # than converted to prefix-meta sequences - set convert-meta off - - # display characters with the eighth bit set directly - # rather than as meta-prefixed characters - set output-meta on - - # if there are more than 150 possible completions for - # a word, ask the user if he wants to see all of them - set completion-query-items 150 - - # For FTP - $if Ftp - "\C-xg": "get \M-?" - "\C-xt": "put \M-?" - "\M-.": yank-last-arg - $endif - - -File: rluserman.info, Node: Bindable Readline Commands, Next: Readline vi Mode, Prev: Readline Init File, Up: Command Line Editing - -Bindable Readline Commands -========================== - -* Menu: - -* Commands For Moving:: Moving about the line. -* Commands For History:: Getting at previous lines. -* Commands For Text:: Commands for changing text. -* Commands For Killing:: Commands for killing and yanking. -* Numeric Arguments:: Specifying numeric arguments, repeat counts. -* Commands For Completion:: Getting Readline to do the typing for you. -* Keyboard Macros:: Saving and re-executing typed characters -* Miscellaneous Commands:: Other miscellaneous commands. - - This section describes Readline commands that may be bound to key -sequences. Command names without an accompanying key sequence are -unbound by default. - - In the following descriptions, "point" refers to the current cursor -position, and "mark" refers to a cursor position saved by the -`set-mark' command. The text between the point and mark is referred to -as the "region". - - -File: rluserman.info, Node: Commands For Moving, Next: Commands For History, Up: Bindable Readline Commands - -Commands For Moving -------------------- - -`beginning-of-line (C-a)' - Move to the start of the current line. - -`end-of-line (C-e)' - Move to the end of the line. - -`forward-char (C-f)' - Move forward a character. - -`backward-char (C-b)' - Move back a character. - -`forward-word (M-f)' - Move forward to the end of the next word. Words are composed of - letters and digits. - -`backward-word (M-b)' - Move back to the start of the current or previous word. Words are - composed of letters and digits. - -`clear-screen (C-l)' - Clear the screen and redraw the current line, leaving the current - line at the top of the screen. - -`redraw-current-line ()' - Refresh the current line. By default, this is unbound. - - - -File: rluserman.info, Node: Commands For History, Next: Commands For Text, Prev: Commands For Moving, Up: Bindable Readline Commands - -Commands For Manipulating The History -------------------------------------- - -`accept-line (Newline or Return)' - Accept the line regardless of where the cursor is. If this line is - non-empty, it may be added to the history list for future recall - with `add_history()'. If this line is a modified history line, - the history line is restored to its original state. - -`previous-history (C-p)' - Move `back' through the history list, fetching the previous - command. - -`next-history (C-n)' - Move `forward' through the history list, fetching the next command. - -`beginning-of-history (M-<)' - Move to the first line in the history. - -`end-of-history (M->)' - Move to the end of the input history, i.e., the line currently - being entered. - -`reverse-search-history (C-r)' - Search backward starting at the current line and moving `up' - through the history as necessary. This is an incremental search. - -`forward-search-history (C-s)' - Search forward starting at the current line and moving `down' - through the the history as necessary. This is an incremental - search. - -`non-incremental-reverse-search-history (M-p)' - Search backward starting at the current line and moving `up' - through the history as necessary using a non-incremental search - for a string supplied by the user. - -`non-incremental-forward-search-history (M-n)' - Search forward starting at the current line and moving `down' - through the the history as necessary using a non-incremental search - for a string supplied by the user. - -`history-search-forward ()' - Search forward through the history for the string of characters - between the start of the current line and the point. This is a - non-incremental search. By default, this command is unbound. - -`history-search-backward ()' - Search backward through the history for the string of characters - between the start of the current line and the point. This is a - non-incremental search. By default, this command is unbound. - -`yank-nth-arg (M-C-y)' - Insert the first argument to the previous command (usually the - second word on the previous line) at point. With an argument N, - insert the Nth word from the previous command (the words in the - previous command begin with word 0). A negative argument inserts - the Nth word from the end of the previous command. - -`yank-last-arg (M-. or M-_)' - Insert last argument to the previous command (the last word of the - previous history entry). With an argument, behave exactly like - `yank-nth-arg'. Successive calls to `yank-last-arg' move back - through the history list, inserting the last argument of each line - in turn. - - - -File: rluserman.info, Node: Commands For Text, Next: Commands For Killing, Prev: Commands For History, Up: Bindable Readline Commands - -Commands For Changing Text --------------------------- - -`delete-char (C-d)' - Delete the character at point. If point is at the beginning of - the line, there are no characters in the line, and the last - character typed was not bound to `delete-char', then return EOF. - -`backward-delete-char (Rubout)' - Delete the character behind the cursor. A numeric argument means - to kill the characters instead of deleting them. - -`forward-backward-delete-char ()' - Delete the character under the cursor, unless the cursor is at the - end of the line, in which case the character behind the cursor is - deleted. By default, this is not bound to a key. - -`quoted-insert (C-q or C-v)' - Add the next character typed to the line verbatim. This is how to - insert key sequences like `C-q', for example. - -`tab-insert (M-)' - Insert a tab character. - -`self-insert (a, b, A, 1, !, ...)' - Insert yourself. - -`transpose-chars (C-t)' - Drag the character before the cursor forward over the character at - the cursor, moving the cursor forward as well. If the insertion - point is at the end of the line, then this transposes the last two - characters of the line. Negative arguments have no effect. - -`transpose-words (M-t)' - Drag the word before point past the word after point, moving point - past that word as well. If the insertion point is at the end of - the line, this transposes the last two words on the line. - -`upcase-word (M-u)' - Uppercase the current (or following) word. With a negative - argument, uppercase the previous word, but do not move the cursor. - -`downcase-word (M-l)' - Lowercase the current (or following) word. With a negative - argument, lowercase the previous word, but do not move the cursor. - -`capitalize-word (M-c)' - Capitalize the current (or following) word. With a negative - argument, capitalize the previous word, but do not move the cursor. - -`overwrite-mode ()' - Toggle overwrite mode. With an explicit positive numeric argument, - switches to overwrite mode. With an explicit non-positive numeric - argument, switches to insert mode. This command affects only - `emacs' mode; `vi' mode does overwrite differently. Each call to - `readline()' starts in insert mode. - - In overwrite mode, characters bound to `self-insert' replace the - text at point rather than pushing the text to the right. - Characters bound to `backward-delete-char' replace the character - before point with a space. - - By default, this command is unbound. - - - -File: rluserman.info, Node: Commands For Killing, Next: Numeric Arguments, Prev: Commands For Text, Up: Bindable Readline Commands - -Killing And Yanking -------------------- - -`kill-line (C-k)' - Kill the text from point to the end of the line. - -`backward-kill-line (C-x Rubout)' - Kill backward to the beginning of the line. - -`unix-line-discard (C-u)' - Kill backward from the cursor to the beginning of the current line. - -`kill-whole-line ()' - Kill all characters on the current line, no matter where point is. - By default, this is unbound. - -`kill-word (M-d)' - Kill from point to the end of the current word, or if between - words, to the end of the next word. Word boundaries are the same - as `forward-word'. - -`backward-kill-word (M-)' - Kill the word behind point. Word boundaries are the same as - `backward-word'. - -`unix-word-rubout (C-w)' - Kill the word behind point, using white space as a word boundary. - The killed text is saved on the kill-ring. - -`unix-filename-rubout ()' - Kill the word behind point, using white space and the slash - character as the word boundaries. The killed text is saved on the - kill-ring. - -`delete-horizontal-space ()' - Delete all spaces and tabs around point. By default, this is - unbound. - -`kill-region ()' - Kill the text in the current region. By default, this command is - unbound. - -`copy-region-as-kill ()' - Copy the text in the region to the kill buffer, so it can be yanked - right away. By default, this command is unbound. - -`copy-backward-word ()' - Copy the word before point to the kill buffer. The word - boundaries are the same as `backward-word'. By default, this - command is unbound. - -`copy-forward-word ()' - Copy the word following point to the kill buffer. The word - boundaries are the same as `forward-word'. By default, this - command is unbound. - -`yank (C-y)' - Yank the top of the kill ring into the buffer at point. - -`yank-pop (M-y)' - Rotate the kill-ring, and yank the new top. You can only do this - if the prior command is `yank' or `yank-pop'. - - -File: rluserman.info, Node: Numeric Arguments, Next: Commands For Completion, Prev: Commands For Killing, Up: Bindable Readline Commands - -Specifying Numeric Arguments ----------------------------- - -`digit-argument (M-0, M-1, ... M--)' - Add this digit to the argument already accumulating, or start a new - argument. `M--' starts a negative argument. - -`universal-argument ()' - This is another way to specify an argument. If this command is - followed by one or more digits, optionally with a leading minus - sign, those digits define the argument. If the command is - followed by digits, executing `universal-argument' again ends the - numeric argument, but is otherwise ignored. As a special case, if - this command is immediately followed by a character that is - neither a digit or minus sign, the argument count for the next - command is multiplied by four. The argument count is initially - one, so executing this function the first time makes the argument - count four, a second time makes the argument count sixteen, and so - on. By default, this is not bound to a key. - - -File: rluserman.info, Node: Commands For Completion, Next: Keyboard Macros, Prev: Numeric Arguments, Up: Bindable Readline Commands - -Letting Readline Type For You ------------------------------ - -`complete ()' - Attempt to perform completion on the text before point. The - actual completion performed is application-specific. The default - is filename completion. - -`possible-completions (M-?)' - List the possible completions of the text before point. - -`insert-completions (M-*)' - Insert all completions of the text before point that would have - been generated by `possible-completions'. - -`menu-complete ()' - Similar to `complete', but replaces the word to be completed with - a single match from the list of possible completions. Repeated - execution of `menu-complete' steps through the list of possible - completions, inserting each match in turn. At the end of the list - of completions, the bell is rung (subject to the setting of - `bell-style') and the original text is restored. An argument of N - moves N positions forward in the list of matches; a negative - argument may be used to move backward through the list. This - command is intended to be bound to , but is unbound by - default. - -`delete-char-or-list ()' - Deletes the character under the cursor if not at the beginning or - end of the line (like `delete-char'). If at the end of the line, - behaves identically to `possible-completions'. This command is - unbound by default. - - - -File: rluserman.info, Node: Keyboard Macros, Next: Miscellaneous Commands, Prev: Commands For Completion, Up: Bindable Readline Commands - -Keyboard Macros ---------------- - -`start-kbd-macro (C-x ()' - Begin saving the characters typed into the current keyboard macro. - -`end-kbd-macro (C-x ))' - Stop saving the characters typed into the current keyboard macro - and save the definition. - -`call-last-kbd-macro (C-x e)' - Re-execute the last keyboard macro defined, by making the - characters in the macro appear as if typed at the keyboard. - - - -File: rluserman.info, Node: Miscellaneous Commands, Prev: Keyboard Macros, Up: Bindable Readline Commands - -Some Miscellaneous Commands ---------------------------- - -`re-read-init-file (C-x C-r)' - Read in the contents of the INPUTRC file, and incorporate any - bindings or variable assignments found there. - -`abort (C-g)' - Abort the current editing command and ring the terminal's bell - (subject to the setting of `bell-style'). - -`do-uppercase-version (M-a, M-b, M-X, ...)' - If the metafied character X is lowercase, run the command that is - bound to the corresponding uppercase character. - -`prefix-meta ()' - Metafy the next character typed. This is for keyboards without a - meta key. Typing ` f' is equivalent to typing `M-f'. - -`undo (C-_ or C-x C-u)' - Incremental undo, separately remembered for each line. - -`revert-line (M-r)' - Undo all changes made to this line. This is like executing the - `undo' command enough times to get back to the beginning. - -`tilde-expand (M-~)' - Perform tilde expansion on the current word. - -`set-mark (C-@)' - Set the mark to the point. If a numeric argument is supplied, the - mark is set to that position. - -`exchange-point-and-mark (C-x C-x)' - Swap the point with the mark. The current cursor position is set - to the saved position, and the old cursor position is saved as the - mark. - -`character-search (C-])' - A character is read and point is moved to the next occurrence of - that character. A negative count searches for previous - occurrences. - -`character-search-backward (M-C-])' - A character is read and point is moved to the previous occurrence - of that character. A negative count searches for subsequent - occurrences. - -`insert-comment (M-#)' - Without a numeric argument, the value of the `comment-begin' - variable is inserted at the beginning of the current line. If a - numeric argument is supplied, this command acts as a toggle: if - the characters at the beginning of the line do not match the value - of `comment-begin', the value is inserted, otherwise the - characters in `comment-begin' are deleted from the beginning of - the line. In either case, the line is accepted as if a newline - had been typed. - -`dump-functions ()' - Print all of the functions and their key bindings to the Readline - output stream. If a numeric argument is supplied, the output is - formatted in such a way that it can be made part of an INPUTRC - file. This command is unbound by default. - -`dump-variables ()' - Print all of the settable variables and their values to the - Readline output stream. If a numeric argument is supplied, the - output is formatted in such a way that it can be made part of an - INPUTRC file. This command is unbound by default. - -`dump-macros ()' - Print all of the Readline key sequences bound to macros and the - strings they output. If a numeric argument is supplied, the - output is formatted in such a way that it can be made part of an - INPUTRC file. This command is unbound by default. - -`emacs-editing-mode (C-e)' - When in `vi' command mode, this causes a switch to `emacs' editing - mode. - -`vi-editing-mode (M-C-j)' - When in `emacs' editing mode, this causes a switch to `vi' editing - mode. - - - -File: rluserman.info, Node: Readline vi Mode, Prev: Bindable Readline Commands, Up: Command Line Editing - -Readline vi Mode -================ - - While the Readline library does not have a full set of `vi' editing -functions, it does contain enough to allow simple editing of the line. -The Readline `vi' mode behaves as specified in the POSIX 1003.2 -standard. - - In order to switch interactively between `emacs' and `vi' editing -modes, use the command `M-C-j' (bound to emacs-editing-mode when in -`vi' mode and to vi-editing-mode in `emacs' mode). The Readline -default is `emacs' mode. - - When you enter a line in `vi' mode, you are already placed in -`insertion' mode, as if you had typed an `i'. Pressing switches -you into `command' mode, where you can edit the text of the line with -the standard `vi' movement keys, move to previous history lines with -`k' and subsequent lines with `j', and so forth. - - -File: rluserman.info, Node: Copying This Manual, Prev: Command Line Editing, Up: Top - -Copying This Manual -******************* - -* Menu: - -* GNU Free Documentation License:: License for copying this manual. - - -File: rluserman.info, Node: GNU Free Documentation License, Up: Copying This Manual - -GNU Free Documentation License -============================== - - Version 1.2, November 2002 - Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA - - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - 0. PREAMBLE - - The purpose of this License is to make a manual, textbook, or other - functional and useful document "free" in the sense of freedom: to - assure everyone the effective freedom to copy and redistribute it, - with or without modifying it, either commercially or - noncommercially. Secondarily, this License preserves for the - author and publisher a way to get credit for their work, while not - being considered responsible for modifications made by others. - - This License is a kind of "copyleft", which means that derivative - works of the document must themselves be free in the same sense. - It complements the GNU General Public License, which is a copyleft - license designed for free software. - - We have designed this License in order to use it for manuals for - free software, because free software needs free documentation: a - free program should come with manuals providing the same freedoms - that the software does. But this License is not limited to - software manuals; it can be used for any textual work, regardless - of subject matter or whether it is published as a printed book. - We recommend this License principally for works whose purpose is - instruction or reference. - - 1. APPLICABILITY AND DEFINITIONS - - This License applies to any manual or other work, in any medium, - that contains a notice placed by the copyright holder saying it - can be distributed under the terms of this License. Such a notice - grants a world-wide, royalty-free license, unlimited in duration, - to use that work under the conditions stated herein. The - "Document", below, refers to any such manual or work. Any member - of the public is a licensee, and is addressed as "you". You - accept the license if you copy, modify or distribute the work in a - way requiring permission under copyright law. - - A "Modified Version" of the Document means any work containing the - Document or a portion of it, either copied verbatim, or with - modifications and/or translated into another language. - - A "Secondary Section" is a named appendix or a front-matter section - of the Document that deals exclusively with the relationship of the - publishers or authors of the Document to the Document's overall - subject (or to related matters) and contains nothing that could - fall directly within that overall subject. (Thus, if the Document - is in part a textbook of mathematics, a Secondary Section may not - explain any mathematics.) The relationship could be a matter of - historical connection with the subject or with related matters, or - of legal, commercial, philosophical, ethical or political position - regarding them. - - The "Invariant Sections" are certain Secondary Sections whose - titles are designated, as being those of Invariant Sections, in - the notice that says that the Document is released under this - License. If a section does not fit the above definition of - Secondary then it is not allowed to be designated as Invariant. - The Document may contain zero Invariant Sections. If the Document - does not identify any Invariant Sections then there are none. - - The "Cover Texts" are certain short passages of text that are - listed, as Front-Cover Texts or Back-Cover Texts, in the notice - that says that the Document is released under this License. A - Front-Cover Text may be at most 5 words, and a Back-Cover Text may - be at most 25 words. - - A "Transparent" copy of the Document means a machine-readable copy, - represented in a format whose specification is available to the - general public, that is suitable for revising the document - straightforwardly with generic text editors or (for images - composed of pixels) generic paint programs or (for drawings) some - widely available drawing editor, and that is suitable for input to - text formatters or for automatic translation to a variety of - formats suitable for input to text formatters. A copy made in an - otherwise Transparent file format whose markup, or absence of - markup, has been arranged to thwart or discourage subsequent - modification by readers is not Transparent. An image format is - not Transparent if used for any substantial amount of text. A - copy that is not "Transparent" is called "Opaque". - - Examples of suitable formats for Transparent copies include plain - ASCII without markup, Texinfo input format, LaTeX input format, - SGML or XML using a publicly available DTD, and - standard-conforming simple HTML, PostScript or PDF designed for - human modification. Examples of transparent image formats include - PNG, XCF and JPG. Opaque formats include proprietary formats that - can be read and edited only by proprietary word processors, SGML or - XML for which the DTD and/or processing tools are not generally - available, and the machine-generated HTML, PostScript or PDF - produced by some word processors for output purposes only. - - The "Title Page" means, for a printed book, the title page itself, - plus such following pages as are needed to hold, legibly, the - material this License requires to appear in the title page. For - works in formats which do not have any title page as such, "Title - Page" means the text near the most prominent appearance of the - work's title, preceding the beginning of the body of the text. - - A section "Entitled XYZ" means a named subunit of the Document - whose title either is precisely XYZ or contains XYZ in parentheses - following text that translates XYZ in another language. (Here XYZ - stands for a specific section name mentioned below, such as - "Acknowledgements", "Dedications", "Endorsements", or "History".) - To "Preserve the Title" of such a section when you modify the - Document means that it remains a section "Entitled XYZ" according - to this definition. - - The Document may include Warranty Disclaimers next to the notice - which states that this License applies to the Document. These - Warranty Disclaimers are considered to be included by reference in - this License, but only as regards disclaiming warranties: any other - implication that these Warranty Disclaimers may have is void and - has no effect on the meaning of this License. - - 2. VERBATIM COPYING - - You may copy and distribute the Document in any medium, either - commercially or noncommercially, provided that this License, the - copyright notices, and the license notice saying this License - applies to the Document are reproduced in all copies, and that you - add no other conditions whatsoever to those of this License. You - may not use technical measures to obstruct or control the reading - or further copying of the copies you make or distribute. However, - you may accept compensation in exchange for copies. If you - distribute a large enough number of copies you must also follow - the conditions in section 3. - - You may also lend copies, under the same conditions stated above, - and you may publicly display copies. - - 3. COPYING IN QUANTITY - - If you publish printed copies (or copies in media that commonly - have printed covers) of the Document, numbering more than 100, and - the Document's license notice requires Cover Texts, you must - enclose the copies in covers that carry, clearly and legibly, all - these Cover Texts: Front-Cover Texts on the front cover, and - Back-Cover Texts on the back cover. Both covers must also clearly - and legibly identify you as the publisher of these copies. The - front cover must present the full title with all words of the - title equally prominent and visible. You may add other material - on the covers in addition. Copying with changes limited to the - covers, as long as they preserve the title of the Document and - satisfy these conditions, can be treated as verbatim copying in - other respects. - - If the required texts for either cover are too voluminous to fit - legibly, you should put the first ones listed (as many as fit - reasonably) on the actual cover, and continue the rest onto - adjacent pages. - - If you publish or distribute Opaque copies of the Document - numbering more than 100, you must either include a - machine-readable Transparent copy along with each Opaque copy, or - state in or with each Opaque copy a computer-network location from - which the general network-using public has access to download - using public-standard network protocols a complete Transparent - copy of the Document, free of added material. If you use the - latter option, you must take reasonably prudent steps, when you - begin distribution of Opaque copies in quantity, to ensure that - this Transparent copy will remain thus accessible at the stated - location until at least one year after the last time you - distribute an Opaque copy (directly or through your agents or - retailers) of that edition to the public. - - It is requested, but not required, that you contact the authors of - the Document well before redistributing any large number of - copies, to give them a chance to provide you with an updated - version of the Document. - - 4. MODIFICATIONS - - You may copy and distribute a Modified Version of the Document - under the conditions of sections 2 and 3 above, provided that you - release the Modified Version under precisely this License, with - the Modified Version filling the role of the Document, thus - licensing distribution and modification of the Modified Version to - whoever possesses a copy of it. In addition, you must do these - things in the Modified Version: - - A. Use in the Title Page (and on the covers, if any) a title - distinct from that of the Document, and from those of - previous versions (which should, if there were any, be listed - in the History section of the Document). You may use the - same title as a previous version if the original publisher of - that version gives permission. - - B. List on the Title Page, as authors, one or more persons or - entities responsible for authorship of the modifications in - the Modified Version, together with at least five of the - principal authors of the Document (all of its principal - authors, if it has fewer than five), unless they release you - from this requirement. - - C. State on the Title page the name of the publisher of the - Modified Version, as the publisher. - - D. Preserve all the copyright notices of the Document. - - E. Add an appropriate copyright notice for your modifications - adjacent to the other copyright notices. - - F. Include, immediately after the copyright notices, a license - notice giving the public permission to use the Modified - Version under the terms of this License, in the form shown in - the Addendum below. - - G. Preserve in that license notice the full lists of Invariant - Sections and required Cover Texts given in the Document's - license notice. - - H. Include an unaltered copy of this License. - - I. Preserve the section Entitled "History", Preserve its Title, - and add to it an item stating at least the title, year, new - authors, and publisher of the Modified Version as given on - the Title Page. If there is no section Entitled "History" in - the Document, create one stating the title, year, authors, - and publisher of the Document as given on its Title Page, - then add an item describing the Modified Version as stated in - the previous sentence. - - J. Preserve the network location, if any, given in the Document - for public access to a Transparent copy of the Document, and - likewise the network locations given in the Document for - previous versions it was based on. These may be placed in - the "History" section. You may omit a network location for a - work that was published at least four years before the - Document itself, or if the original publisher of the version - it refers to gives permission. - - K. For any section Entitled "Acknowledgements" or "Dedications", - Preserve the Title of the section, and preserve in the - section all the substance and tone of each of the contributor - acknowledgements and/or dedications given therein. - - L. Preserve all the Invariant Sections of the Document, - unaltered in their text and in their titles. Section numbers - or the equivalent are not considered part of the section - titles. - - M. Delete any section Entitled "Endorsements". Such a section - may not be included in the Modified Version. - - N. Do not retitle any existing section to be Entitled - "Endorsements" or to conflict in title with any Invariant - Section. - - O. Preserve any Warranty Disclaimers. - - If the Modified Version includes new front-matter sections or - appendices that qualify as Secondary Sections and contain no - material copied from the Document, you may at your option - designate some or all of these sections as invariant. To do this, - add their titles to the list of Invariant Sections in the Modified - Version's license notice. These titles must be distinct from any - other section titles. - - You may add a section Entitled "Endorsements", provided it contains - nothing but endorsements of your Modified Version by various - parties--for example, statements of peer review or that the text - has been approved by an organization as the authoritative - definition of a standard. - - You may add a passage of up to five words as a Front-Cover Text, - and a passage of up to 25 words as a Back-Cover Text, to the end - of the list of Cover Texts in the Modified Version. Only one - passage of Front-Cover Text and one of Back-Cover Text may be - added by (or through arrangements made by) any one entity. If the - Document already includes a cover text for the same cover, - previously added by you or by arrangement made by the same entity - you are acting on behalf of, you may not add another; but you may - replace the old one, on explicit permission from the previous - publisher that added the old one. - - The author(s) and publisher(s) of the Document do not by this - License give permission to use their names for publicity for or to - assert or imply endorsement of any Modified Version. - - 5. COMBINING DOCUMENTS - - You may combine the Document with other documents released under - this License, under the terms defined in section 4 above for - modified versions, provided that you include in the combination - all of the Invariant Sections of all of the original documents, - unmodified, and list them all as Invariant Sections of your - combined work in its license notice, and that you preserve all - their Warranty Disclaimers. - - The combined work need only contain one copy of this License, and - multiple identical Invariant Sections may be replaced with a single - copy. If there are multiple Invariant Sections with the same name - but different contents, make the title of each such section unique - by adding at the end of it, in parentheses, the name of the - original author or publisher of that section if known, or else a - unique number. Make the same adjustment to the section titles in - the list of Invariant Sections in the license notice of the - combined work. - - In the combination, you must combine any sections Entitled - "History" in the various original documents, forming one section - Entitled "History"; likewise combine any sections Entitled - "Acknowledgements", and any sections Entitled "Dedications". You - must delete all sections Entitled "Endorsements." - - 6. COLLECTIONS OF DOCUMENTS - - You may make a collection consisting of the Document and other - documents released under this License, and replace the individual - copies of this License in the various documents with a single copy - that is included in the collection, provided that you follow the - rules of this License for verbatim copying of each of the - documents in all other respects. - - You may extract a single document from such a collection, and - distribute it individually under this License, provided you insert - a copy of this License into the extracted document, and follow - this License in all other respects regarding verbatim copying of - that document. - - 7. AGGREGATION WITH INDEPENDENT WORKS - - A compilation of the Document or its derivatives with other - separate and independent documents or works, in or on a volume of - a storage or distribution medium, is called an "aggregate" if the - copyright resulting from the compilation is not used to limit the - legal rights of the compilation's users beyond what the individual - works permit. When the Document is included an aggregate, this - License does not apply to the other works in the aggregate which - are not themselves derivative works of the Document. - - If the Cover Text requirement of section 3 is applicable to these - copies of the Document, then if the Document is less than one half - of the entire aggregate, the Document's Cover Texts may be placed - on covers that bracket the Document within the aggregate, or the - electronic equivalent of covers if the Document is in electronic - form. Otherwise they must appear on printed covers that bracket - the whole aggregate. - - 8. TRANSLATION - - Translation is considered a kind of modification, so you may - distribute translations of the Document under the terms of section - 4. Replacing Invariant Sections with translations requires special - permission from their copyright holders, but you may include - translations of some or all Invariant Sections in addition to the - original versions of these Invariant Sections. You may include a - translation of this License, and all the license notices in the - Document, and any Warranty Disclaimers, provided that you also - include the original English version of this License and the - original versions of those notices and disclaimers. In case of a - disagreement between the translation and the original version of - this License or a notice or disclaimer, the original version will - prevail. - - If a section in the Document is Entitled "Acknowledgements", - "Dedications", or "History", the requirement (section 4) to - Preserve its Title (section 1) will typically require changing the - actual title. - - 9. TERMINATION - - You may not copy, modify, sublicense, or distribute the Document - except as expressly provided for under this License. Any other - attempt to copy, modify, sublicense or distribute the Document is - void, and will automatically terminate your rights under this - License. However, parties who have received copies, or rights, - from you under this License will not have their licenses - terminated so long as such parties remain in full compliance. - - 10. FUTURE REVISIONS OF THIS LICENSE - - The Free Software Foundation may publish new, revised versions of - the GNU Free Documentation License from time to time. Such new - versions will be similar in spirit to the present version, but may - differ in detail to address new problems or concerns. See - `http://www.gnu.org/copyleft/'. - - Each version of the License is given a distinguishing version - number. If the Document specifies that a particular numbered - version of this License "or any later version" applies to it, you - have the option of following the terms and conditions either of - that specified version or of any later version that has been - published (not as a draft) by the Free Software Foundation. If - the Document does not specify a version number of this License, - you may choose any version ever published (not as a draft) by the - Free Software Foundation. - -ADDENDUM: How to use this License for your documents ----------------------------------------------------- - - To use this License in a document you have written, include a copy of -the License in the document and put the following copyright and license -notices just after the title page: - - Copyright (C) YEAR YOUR NAME. - Permission is granted to copy, distribute and/or modify this document - under the terms of the GNU Free Documentation License, Version 1.2 - or any later version published by the Free Software Foundation; - with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. - A copy of the license is included in the section entitled ``GNU - Free Documentation License''. - - If you have Invariant Sections, Front-Cover Texts and Back-Cover -Texts, replace the "with...Texts." line with this: - - with the Invariant Sections being LIST THEIR TITLES, with - the Front-Cover Texts being LIST, and with the Back-Cover Texts - being LIST. - - If you have Invariant Sections without Cover Texts, or some other -combination of the three, merge those two alternatives to suit the -situation. - - If your document contains nontrivial examples of program code, we -recommend releasing these examples in parallel under your choice of -free software license, such as the GNU General Public License, to -permit their use in free software. - - - -Tag Table: -Node: Top1379 -Node: Command Line Editing1814 -Node: Introduction and Notation2456 -Node: Readline Interaction4075 -Node: Readline Bare Essentials5263 -Node: Readline Movement Commands7045 -Node: Readline Killing Commands8003 -Node: Readline Arguments9914 -Node: Searching10951 -Node: Readline Init File13095 -Node: Readline Init File Syntax14157 -Node: Conditional Init Constructs25521 -Node: Sample Init File28047 -Node: Bindable Readline Commands31232 -Node: Commands For Moving32283 -Node: Commands For History33134 -Node: Commands For Text35994 -Node: Commands For Killing38710 -Node: Numeric Arguments40842 -Node: Commands For Completion41971 -Node: Keyboard Macros43505 -Node: Miscellaneous Commands44066 -Node: Readline vi Mode47417 -Node: Copying This Manual48333 -Node: GNU Free Documentation License48543 - -End Tag Table diff --git a/dep/src/readline/src/doc/rluserman.pdf b/dep/src/readline/src/doc/rluserman.pdf deleted file mode 100644 index 4a2184bf4613fb38e52a408f9bb0ebc4bff62edd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172521 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%0Dp;?>UV~8Hr-txZv4I(N#F!it%BiJCVnL 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

Rj{R5C=;;RIxE4fEx-;=1e6u;Aq$Xf}c!ScG=O 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

iBJ&aYG$d>Kg1OZWY3-dS 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%0D1X6s5W7A@1kJ}sxa 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. -# -# Please send bug reports, etc. to bug-texinfo@gnu.org. -# If possible, please send a copy of the output of the script called with -# the `--debug' option when making a bug report. - -# This string is expanded by rcs automatically when this file is checked out. -rcs_revision='$Revision: 1.14 $' -rcs_version=`set - $rcs_revision; echo $2` -program=`echo $0 | sed -e 's!.*/!!'` -version="texi2dvi (GNU Texinfo 4.5) $rcs_version - -Copyright (C) 2003 Free Software Foundation, Inc. -There is NO warranty. You may redistribute this software -under the terms of the GNU General Public License. -For more information about these matters, see the files named COPYING." - -usage="Usage: $program [OPTION]... FILE... - -Run each Texinfo or LaTeX FILE through TeX in turn until all -cross-references are resolved, building all indices. The directory -containing each FILE is searched for included files. The suffix of FILE -is used to determine its language (LaTeX or Texinfo). - -Makeinfo is used to perform Texinfo macro expansion before running TeX -when needed. - -Operation modes: - -b, --batch no interaction - -c, --clean remove all auxiliary files - -D, --debug turn on shell debugging (set -x) - -h, --help display this help and exit successfully - -o, --output=OFILE leave output in OFILE (implies --clean); - Only one input FILE may be specified in this case - -q, --quiet no output unless errors (implies --batch) - -s, --silent same as --quiet - -v, --version display version information and exit successfully - -V, --verbose report on what is done - -TeX tuning: - -@ use @input instead of \input; for preloaded Texinfo - -e, -E, --expand force macro expansion using makeinfo - -I DIR search DIR for Texinfo files - -l, --language=LANG specify the LANG of FILE (LaTeX or Texinfo) - -p, --pdf use pdftex or pdflatex for processing - -t, --texinfo=CMD insert CMD after @setfilename in copy of input file - multiple values accumulate - -The values of the BIBTEX, LATEX (or PDFLATEX), MAKEINDEX, MAKEINFO, -TEX (or PDFTEX), and TEXINDEX environment variables are used to run -those commands, if they are set. - -Email bug reports to , -general questions and discussion to . -Texinfo home page: http://www.gnu.org/software/texinfo/" - -# Initialize variables for option overriding and otherwise. -# Don't use `unset' since old bourne shells don't have this command. -# Instead, assign them an empty value. -batch=false # eval for batch mode -clean= -debug= -escape='\' -expand= # t for expansion via makeinfo -miincludes= # makeinfo include path -oformat=dvi -oname= # --output -quiet= # by default let the tools' message be displayed -set_language= -textra= -tmpdir=${TMPDIR:-/tmp}/t2d$$ # avoid collisions on 8.3 filesystems. -txincludes= # TEXINPUTS extensions, with trailing colon -txiprereq=19990129 # minimum texinfo.tex version to have macro expansion -verbose=false # echo for verbose mode - -orig_pwd=`pwd` - -# Systems which define $COMSPEC or $ComSpec use semicolons to separate -# directories in TEXINPUTS. -if test -n "$COMSPEC$ComSpec"; then - path_sep=";" -else - path_sep=":" -fi - -# Pacify verbose cds. -CDPATH=${ZSH_VERSION+.}$path_sep - -# In case someone crazy insists on using grep -E. -: ${EGREP=egrep} - -# Save this so we can construct a new TEXINPUTS path for each file. -TEXINPUTS_orig="$TEXINPUTS" -# Unfortunately makeindex does not read TEXINPUTS. -INDEXSTYLE_orig="$INDEXSTYLE" -export TEXINPUTS INDEXSTYLE - -# Push a token among the arguments that will be used to notice when we -# ended options/arguments parsing. -# Use "set dummy ...; shift" rather than 'set - ..." because on -# Solaris set - turns off set -x (but keeps set -e). -# Use ${1+"$@"} rather than "$@" because Digital Unix and Ultrix 4.3 -# still expand "$@" to a single argument (the empty string) rather -# than nothing at all. -arg_sep="$$--$$" -set dummy ${1+"$@"} "$arg_sep"; shift - -# -# Parse command line arguments. -while test x"$1" != x"$arg_sep"; do - - # Handle --option=value by splitting apart and putting back on argv. - case "$1" in - --*=*) - opt=`echo "$1" | sed -e 's/=.*//'` - val=`echo "$1" | sed -e 's/[^=]*=//'` - shift - set dummy "$opt" "$val" ${1+"$@"}; shift - ;; - esac - - # This recognizes --quark as --quiet. So what. - case "$1" in - -@ ) escape=@;; - # Silently and without documentation accept -b and --b[atch] as synonyms. - -b | --b*) batch=eval;; - -q | -s | --q* | --s*) quiet=t; batch=eval;; - -c | --c*) clean=t;; - -D | --d*) debug=t;; - -e | -E | --e*) expand=t;; - -h | --h*) echo "$usage"; exit 0;; - -I | --I*) - shift - miincludes="$miincludes -I $1" - txincludes="$txincludes$1$path_sep" - ;; - -l | --l*) shift; set_language=$1;; - -o | --o*) - shift - clean=t - case "$1" in - /* | ?:/*) oname=$1;; - *) oname="$orig_pwd/$1";; - esac;; - -p | --p*) oformat=pdf;; - -t | --t*) shift; textra="$textra\\ -$1";; - -v | --vers*) echo "$version"; exit 0;; - -V | --verb*) verbose=echo;; - --) # What remains are not options. - shift - while test x"$1" != x"$arg_sep"; do - set dummy ${1+"$@"} "$1"; shift - shift - done - break;; - -*) - echo "$0: Unknown or ambiguous option \`$1'." >&2 - echo "$0: Try \`--help' for more information." >&2 - exit 1;; - *) set dummy ${1+"$@"} "$1"; shift;; - esac - shift -done -# Pop the token -shift - -# Interpret remaining command line args as filenames. -case $# in - 0) - echo "$0: Missing file arguments." >&2 - echo "$0: Try \`--help' for more information." >&2 - exit 2 - ;; - 1) ;; - *) - if test -n "$oname"; then - echo "$0: Can't use option \`--output' with more than one argument." >&2 - exit 2 - fi - ;; -esac - -# Prepare the temporary directory. Remove it at exit, unless debugging. -if test -z "$debug"; then - trap "cd / && rm -rf $tmpdir" 0 1 2 15 -fi - -# Create the temporary directory with strict rights -(umask 077 && mkdir $tmpdir) || exit 1 - -# Prepare the tools we might need. This may be extra work in some -# cases, but improves the readibility of the script. -utildir=$tmpdir/utils -mkdir $utildir || exit 1 - -# A sed script that preprocesses Texinfo sources in order to keep the -# iftex sections only. We want to remove non TeX sections, and -# comment (with `@c texi2dvi') TeX sections so that makeinfo does not -# try to parse them. Nevertheless, while commenting TeX sections, -# don't comment @macro/@end macro so that makeinfo does propagate -# them. Unfortunately makeinfo --iftex --no-ifhtml --no-ifinfo -# doesn't work well enough (yet) to use that, so work around with sed. -comment_iftex_sed=$utildir/comment.sed -cat <$comment_iftex_sed -/^@tex/,/^@end tex/{ - s/^/@c texi2dvi/ -} -/^@iftex/,/^@end iftex/{ - s/^/@c texi2dvi/ - /^@c texi2dvi@macro/,/^@c texi2dvi@end macro/{ - s/^@c texi2dvi// - } -} -/^@html/,/^@end html/{ - s/^/@c (texi2dvi)/ -} -/^@ifhtml/,/^@end ifhtml/{ - s/^/@c (texi2dvi)/ -} -/^@ifnottex/,/^@end ifnottex/{ - s/^/@c (texi2dvi)/ -} -/^@ifinfo/,/^@end ifinfo/{ - /^@node/p - /^@menu/,/^@end menu/p - t - s/^/@c (texi2dvi)/ -} -s/^@ifnotinfo/@c texi2dvi@ifnotinfo/ -s/^@end ifnotinfo/@c texi2dvi@end ifnotinfo/ -EOF -# Uncommenting is simple: Remove any leading `@c texi2dvi'. -uncomment_iftex_sed=$utildir/uncomment.sed -cat <$uncomment_iftex_sed -s/^@c texi2dvi// -EOF - -# A shell script that computes the list of xref files. -# Takes the filename (without extension) of which we look for xref -# files as argument. The index files must be reported last. -get_xref_files=$utildir/get_xref.sh -cat <<\EOF >$get_xref_files -#! /bin/sh - -# Get list of xref files (indexes, tables and lists). -# Find all files having root filename with a two-letter extension, -# saves the ones that are really Texinfo-related files. .?o? catches -# many files: .toc, .log, LaTeX tables and lists, FiXme's .lox, maybe more. -for this_file in "$1".?o? "$1".aux "$1".?? "$1".idx; do - # If file is empty, skip it. - test -s "$this_file" || continue - # If the file is not suitable to be an index or xref file, don't - # process it. The file can't be if its first character is not a - # backslash or single quote. - first_character=`sed -n '1s/^\(.\).*$/\1/p;q' $this_file` - if test "x$first_character" = "x\\" \ - || test "x$first_character" = "x'"; then - xref_files="$xref_files ./$this_file" - fi -done -echo "$xref_files" -EOF -chmod 500 $get_xref_files - -# File descriptor usage: -# 0 standard input -# 1 standard output (--verbose messages) -# 2 standard error -# 3 some systems may open it to /dev/tty -# 4 used on the Kubota Titan -# 5 tools output (turned off by --quiet) - -# Tools' output. If quiet, discard, else redirect to the message flow. -if test "$quiet" = t; then - exec 5>/dev/null -else - exec 5>&1 -fi - -# Enable tracing -test "$debug" = t && set -x - -# -# TeXify files. - -for command_line_filename in ${1+"$@"}; do - $verbose "Processing $command_line_filename ..." - - # If the COMMAND_LINE_FILENAME is not absolute (e.g., --debug.tex), - # prepend `./' in order to avoid that the tools take it as an option. - echo "$command_line_filename" | $EGREP '^(/|[A-z]:/)' >/dev/null \ - || command_line_filename="./$command_line_filename" - - # See if the file exists. If it doesn't we're in trouble since, even - # though the user may be able to reenter a valid filename at the tex - # prompt (assuming they're attending the terminal), this script won't - # be able to find the right xref files and so forth. - if test ! -r "$command_line_filename"; then - echo "$0: Could not read $command_line_filename, skipping." >&2 - continue - fi - - # Get the name of the current directory. We want the full path - # because in clean mode we are in tmp, in which case a relative - # path has no meaning. - filename_dir=`echo $command_line_filename | sed 's!/[^/]*$!!;s!^$!.!'` - filename_dir=`cd "$filename_dir" >/dev/null && pwd` - - # Strip directory part but leave extension. - filename_ext=`basename "$command_line_filename"` - # Strip extension. - filename_noext=`echo "$filename_ext" | sed 's/\.[^.]*$//'` - ext=`echo "$filename_ext" | sed 's/^.*\.//'` - - # _src. Use same basename since we want to generate aux files with - # the same basename as the manual. If --expand, then output the - # macro-expanded file to here, else copy the original file. - tmpdir_src=$tmpdir/src - filename_src=$tmpdir_src/$filename_noext.$ext - - # _xtr. The file with the user's extra commands. - tmpdir_xtr=$tmpdir/xtr - filename_xtr=$tmpdir_xtr/$filename_noext.$ext - - # _bak. Copies of the previous xref files (another round is run if - # they differ from the new one). - tmpdir_bak=$tmpdir/bak - - # Make all those directories and give up if we can't succeed. - mkdir $tmpdir_src $tmpdir_xtr $tmpdir_bak || exit 1 - - # Source file might include additional sources. - # We want `.:$orig_pwd' before anything else. (We'll add `.:' later - # after all other directories have been turned into absolute paths.) - # `.' goes first to ensure that any old .aux, .cps, - # etc. files in ${directory} don't get used in preference to fresher - # files in `.'. Include orig_pwd in case we are in clean mode, where - # we've cd'd to a temp directory. - common="$orig_pwd$path_sep$filename_dir$path_sep$txincludes" - TEXINPUTS="$common$TEXINPUTS_orig" - INDEXSTYLE="$common$INDEXSTYLE_orig" - - # Convert relative paths to absolute paths, so we can run in another - # directory (e.g., in --clean mode, or during the macro-support - # detection.) - # - # Empty path components are meaningful to tex. We rewrite them - # as `EMPTY' so they don't get lost when we split on $path_sep. - TEXINPUTS=`echo $TEXINPUTS |sed 's/^:/EMPTY:/;s/:$/:EMPTY/;s/::/:EMPTY:/g'` - INDEXSTYLE=`echo $INDEXSTYLE |sed 's/^:/EMPTY:/;s/:$/:EMPTY/;s/::/:EMPTY:/g'` - save_IFS=$IFS - IFS=$path_sep - set x $TEXINPUTS; shift - TEXINPUTS=. - for dir - do - case $dir in - EMPTY) - TEXINPUTS=$TEXINPUTS$path_sep - ;; - [\\/]* | ?:[\\/]*) # Absolute paths don't need to be expansed. - TEXINPUTS=$TEXINPUTS$path_sep$dir - ;; - *) - abs=`cd "$dir" && pwd` && TEXINPUTS=$TEXINPUTS$path_sep$abs - ;; - esac - done - set x $INDEXSTYLE; shift - INDEXSTYLE=. - for dir - do - case $dir in - EMPTY) - INDEXSTYLE=$INDEXSTYLE$path_sep - ;; - [\\/]* | ?:[\\/]*) # Absolute paths don't need to be expansed. - INDEXSTYLE=$INDEXSTYLE$path_sep$dir - ;; - *) - abs=`cd "$dir" && pwd` && INDEXSTYLE=$INDEXSTYLE$path_sep$abs - ;; - esac - done - IFS=$save_IFS - - # If the user explicitly specified the language, use that. - # Otherwise, if the first line is \input texinfo, assume it's texinfo. - # Otherwise, guess from the file extension. - if test -n "$set_language"; then - language=$set_language - elif sed 1q "$command_line_filename" | grep 'input texinfo' >/dev/null; then - language=texinfo - else - language= - fi - - # Get the type of the file (latex or texinfo) from the given language - # we just guessed, or from the file extension if not set yet. - case ${language:-$filename_ext} in - [lL]a[tT]e[xX] | *.ltx | *.tex) - # Assume a LaTeX file. LaTeX needs bibtex and uses latex for - # compilation. No makeinfo. - bibtex=${BIBTEX:-bibtex} - makeinfo= # no point in running makeinfo on latex source. - texindex=${MAKEINDEX:-makeindex} - if test $oformat = dvi; then - tex=${LATEX:-latex} - else - tex=${PDFLATEX:-pdflatex} - fi - ;; - - *) - # Assume a Texinfo file. Texinfo files need makeinfo, texindex and tex. - bibtex= - texindex=${TEXINDEX:-texindex} - if test $oformat = dvi; then - tex=${TEX:-tex} - else - tex=${PDFTEX:-pdftex} - fi - # Unless required by the user, makeinfo expansion is wanted only - # if texinfo.tex is too old. - if test "$expand" = t; then - makeinfo=${MAKEINFO:-makeinfo} - else - # Check if texinfo.tex performs macro expansion by looking for - # its version. The version is a date of the form YEAR-MO-DA. - # We don't need to use [0-9] to match the digits since anyway - # the comparison with $txiprereq, a number, will fail with non - # digits. - txiversion_tex=txiversion.tex - echo '\input texinfo.tex @bye' >$tmpdir/$txiversion_tex - # Run in the tmpdir to avoid leaving files. - eval `cd $tmpdir >/dev/null && - $tex $txiversion_tex 2>/dev/null | - sed -n 's/^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$/txiformat=\1 txiversion="\2\3\4"/p'` - $verbose "texinfo.tex preloaded as \`$txiformat', version is \`$txiversion' ..." - if test "$txiprereq" -le "$txiversion" >/dev/null 2>&1; then - makeinfo= - else - makeinfo=${MAKEINFO:-makeinfo} - fi - # As long as we had to run TeX, offer the user this convenience - if test "$txiformat" = Texinfo; then - escape=@ - fi - fi - ;; - esac - - # Expand macro commands in the original source file using Makeinfo. - # Always use `end' footnote style, since the `separate' style - # generates different output (arguably this is a bug in -E). - # Discard main info output, the user asked to run TeX, not makeinfo. - if test -n "$makeinfo"; then - $verbose "Macro-expanding $command_line_filename to $filename_src ..." - sed -f $comment_iftex_sed "$command_line_filename" \ - | $makeinfo --footnote-style=end -I "$filename_dir" $miincludes \ - -o /dev/null --macro-expand=- \ - | sed -f $uncomment_iftex_sed >"$filename_src" - filename_input=$filename_src - fi - - # If makeinfo failed (or was not even run), use the original file as input. - if test $? -ne 0 \ - || test ! -r "$filename_src"; then - $verbose "Reverting to $command_line_filename ..." - filename_input=$filename_dir/$filename_ext - fi - - # Used most commonly for @finalout, @smallbook, etc. - if test -n "$textra"; then - $verbose "Inserting extra commands: $textra" - sed '/^@setfilename/a\ -'"$textra" "$filename_input" >$filename_xtr - filename_input=$filename_xtr - fi - - # If clean mode was specified, then move to the temporary directory. - if test "$clean" = t; then - $verbose "cd $tmpdir_src" - cd "$tmpdir_src" || exit 1 - fi - - while :; do # will break out of loop below - orig_xref_files=`$get_xref_files "$filename_noext"` - - # Save copies of originals for later comparison. - if test -n "$orig_xref_files"; then - $verbose "Backing up xref files: `echo $orig_xref_files | sed 's|\./||g'`" - cp $orig_xref_files $tmpdir_bak - fi - - # Run bibtex on current file. - # - If its input (AUX) exists. - # - If AUX contains both `\bibdata' and `\bibstyle'. - # - If some citations are missing (LOG contains `Citation'). - # or the LOG complains of a missing .bbl - # - # We run bibtex first, because I can see reasons for the indexes - # to change after bibtex is run, but I see no reason for the - # converse. - # - # Don't try to be too smart. Running bibtex only if the bbl file - # exists and is older than the LaTeX file is wrong, since the - # document might include files that have changed. Because there - # can be several AUX (if there are \include's), but a single LOG, - # looking for missing citations in LOG is easier, though we take - # the risk to match false messages. - if test -n "$bibtex" \ - && test -r "$filename_noext.aux" \ - && test -r "$filename_noext.log" \ - && (grep '^\\bibdata[{]' "$filename_noext.aux" \ - && grep '^\\bibstyle[{]' "$filename_noext.aux" \ - && (grep 'Warning:.*Citation.*undefined' "$filename_noext.log" \ - || grep 'No file .*\.bbl\.' "$filename_noext.log")) \ - >/dev/null 2>&1; \ - then - $verbose "Running $bibtex $filename_noext ..." - if $bibtex "$filename_noext" >&5; then :; else - echo "$0: $bibtex exited with bad status, quitting." >&2 - exit 1 - fi - fi - - # What we'll run texindex on -- exclude non-index files. - # Since we know index files are last, it is correct to remove everything - # before .aux and .?o?. But don't really do o - # -- don't match whitespace as . - # Otherwise, if orig_xref_files contains something like - # foo.xo foo.whatever - # the space after the o will get matched. - index_files=`echo "$orig_xref_files" \ - | sed "s!.*\.aux!!g; - s!./$filename_noext\.[^ ]o[^ ]!!g; - s/^[ ]*//;s/[ ]*$//"` - # Run texindex (or makeindex) on current index files. If they - # already exist, and after running TeX a first time the index - # files don't change, then there's no reason to run TeX again. - # But we won't know that if the index files are out of date or - # nonexistent. - if test -n "$texindex" && test -n "$index_files"; then - $verbose "Running $texindex $index_files ..." - if $texindex $index_files 2>&5 1>&2; then :; else - echo "$0: $texindex exited with bad status, quitting." >&2 - exit 1 - fi - fi - - # Finally, run TeX. - # Prevent $ESCAPE from being interpreted by the shell if it happens - # to be `/'. - $batch tex_args="\\${escape}nonstopmode\ \\${escape}input" - cmd="$tex $tex_args $filename_input" - $verbose "Running $cmd ..." - if $cmd >&5; then :; else - echo "$0: $tex exited with bad status, quitting." >&2 - echo "$0: see $filename_noext.log for errors." >&2 - test "$clean" = t \ - && cp "$filename_noext.log" "$orig_pwd" - exit 1 - fi - - - # Decide if looping again is needed. - finished=t - - # LaTeX (and the package changebar) report in the LOG file if it - # should be rerun. This is needed for files included from - # subdirs, since texi2dvi does not try to compare xref files in - # subdirs. Performing xref files test is still good since LaTeX - # does not report changes in xref files. - if grep "Rerun to get" "$filename_noext.log" >/dev/null 2>&1; then - finished= - fi - - # Check if xref files changed. - new_xref_files=`$get_xref_files "$filename_noext"` - $verbose "Original xref files = `echo $orig_xref_files | sed 's|\./||g'`" - $verbose "New xref files = `echo $new_xref_files | sed 's|\./||g'`" - - # If old and new lists don't at least have the same file list, - # then one file or another has definitely changed. - test "x$orig_xref_files" != "x$new_xref_files" && finished= - - # File list is the same. We must compare each file until we find - # a difference. - if test -n "$finished"; then - for this_file in $new_xref_files; do - $verbose "Comparing xref file `echo $this_file | sed 's|\./||g'` ..." - # cmp -s returns nonzero exit status if files differ. - if cmp -s "$this_file" "$tmpdir_bak/$this_file"; then :; else - # We only need to keep comparing until we find one that - # differs, because we'll have to run texindex & tex again no - # matter how many more there might be. - finished= - $verbose "xref file `echo $this_file | sed 's|\./||g'` differed ..." - test "$debug" = t && diff -c "$tmpdir_bak/$this_file" "$this_file" - break - fi - done - fi - - # If finished, exit the loop, else rerun the loop. - test -n "$finished" && break - done - - # If we were in clean mode, compilation was in a tmp directory. - # Copy the DVI (or PDF) file into the directory where the compilation - # has been done. (The temp dir is about to get removed anyway.) - # We also return to the original directory so that - # - the next file is processed in correct conditions - # - the temporary file can be removed - if test -n "$clean"; then - if test -n "$oname"; then - dest=$oname - else - dest=$orig_pwd - fi - $verbose "Copying $oformat file from `pwd` to $dest" - cp -p "./$filename_noext.$oformat" "$dest" - cd / # in case $orig_pwd is on a different drive (for DOS) - cd $orig_pwd || exit 1 - fi - - # Remove temporary files. - if test "x$debug" = "x"; then - $verbose "Removing $tmpdir_src $tmpdir_xtr $tmpdir_bak ..." - cd / - rm -rf $tmpdir_src $tmpdir_xtr $tmpdir_bak - fi -done - -$verbose "$0 done." -exit 0 # exit successfully, not however we ended the loop. diff --git a/dep/src/readline/src/doc/texi2html b/dep/src/readline/src/doc/texi2html deleted file mode 100644 index bdb3bee3343..00000000000 --- a/dep/src/readline/src/doc/texi2html +++ /dev/null @@ -1,5429 +0,0 @@ -#! /usr/bin/perl -'di '; -'ig 00 '; -#+############################################################################## -# -# texi2html: Program to transform Texinfo documents to HTML -# -# Copyright (C) 1999, 2000 Free Software Foundation, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#-############################################################################## - -# This requires perl version 5 or higher -require 5.0; - -#++############################################################################## -# -# NOTE FOR DEBUGGING THIS SCRIPT: -# You can run 'perl texi2html.pl' directly, provided you have -# the environment variable T2H_HOME set to the directory containing -# the texi2html.init file -# -#--############################################################################## - -# CVS version: -# $Id: texi2html.pl,v 1.55 2000/07/27 14:39:41 obachman Exp $ - -# Homepage: -$T2H_HOMEPAGE = < (original author) - Karl Berry - Olaf Bachmann - and many others. -Maintained by: Olaf Bachmann -Send bugs and suggestions to -EOT - -# Version: set in configure.in -$THISVERSION = '1.64'; -$THISPROG = "texi2html $THISVERSION"; # program name and version - -# The man page for this program is included at the end of this file and can be -# viewed using the command 'nroff -man texi2html'. - -# Identity: - -$T2H_TODAY = &pretty_date; # like "20 September 1993" -# the eval prevents this from breaking on system which do not have -# a proper getpwuid implemented -eval { ($T2H_USER = (getpwuid ($<))[6]) =~ s/,.*//;}; # Who am i - -#+++############################################################################ -# # -# Initialization # -# Pasted content of File $(srcdir)/texi2html.init: Default initializations # -# # -#---############################################################################ - -# leave this within comments, and keep the require statement -# This way, you can directly run texi2html.pl, if $ENV{T2H_HOME}/texi2html.init -# exists. - -# -# -*-perl-*- -###################################################################### -# File: texi2html.init -# -# Sets default values for command-line arguments and for various customizable -# procedures -# -# A copy of this file is pasted into the beginning of texi2html by -# 'make texi2html' -# -# Copy this file and make changes to it, if you like. -# Afterwards, either, load it with command-line option -init_file -# -# $Id: texi2html.init,v 1.34 2000/07/27 14:09:02 obachman Exp $ - -###################################################################### -# stuff which can also be set by command-line options -# -# -# Note: values set here, overwrite values set by the command-line -# options before -init_file and might still be overwritten by -# command-line arguments following the -init_file option -# - -# T2H_OPTIONS is a hash whose keys are the (long) names of valid -# command-line options and whose values are a hash with the following keys: -# type ==> one of !|=i|:i|=s|:s (see GetOpt::Long for more info) -# linkage ==> ref to scalar, array, or subroutine (see GetOpt::Long for more info) -# verbose ==> short description of option (displayed by -h) -# noHelp ==> if 1 -> for "not so important options": only print description on -h 1 -# 2 -> for obsolete options: only print description on -h 2 - -$T2H_DEBUG = 0; -$T2H_OPTIONS -> {debug} = -{ - type => '=i', - linkage => \$main::T2H_DEBUG, - verbose => 'output HTML with debuging information', -}; - -$T2H_DOCTYPE = ''; -$T2H_OPTIONS -> {doctype} = -{ - type => '=s', - linkage => \$main::T2H_DOCTYPE, - verbose => 'document type which is output in header of HTML files', - noHelp => 1 -}; - -$T2H_CHECK = 0; -$T2H_OPTIONS -> {check} = -{ - type => '!', - linkage => \$main::T2H_CHECK, - verbose => 'if set, only check files and output all things that may be Texinfo commands', - noHelp => 1 -}; - -# -expand -# if set to "tex" (or, "info") expand @iftex and @tex (or, @ifinfo) sections -# else, neither expand @iftex, @tex, nor @ifinfo sections -$T2H_EXPAND = "info"; -$T2H_OPTIONS -> {expand} = -{ - type => '=s', - linkage => \$T2H_EXPAND, - verbose => 'Expand info|tex|none section of texinfo source', -}; - -# - glossary -#if set, uses section named `Footnotes' for glossary -$T2H_USE_GLOSSARY = 0; -T2H_OPTIONS -> {glossary} = -{ - type => '!', - linkage => \$T2H_USE_GLOSSARY, - verbose => "if set, uses section named `Footnotes' for glossary", - noHelp => 1, -}; - - -# -invisible -# $T2H_INVISIBLE_MARK is the text used to create invisible destination -# anchors for index links (you can for instance use the invisible.xbm -# file shipped with this program). This is a workaround for a known -# bug of many WWW browsers, including netscape. -# For me, it works fine without it -- on the contrary: if there, it -# inserts space between headers and start of text (obachman 3/99) -$T2H_INVISIBLE_MARK = ''; -# $T2H_INVISIBLE_MARK = ' '; -$T2H_OPTIONS -> {invisible} = -{ - type => '=s', - linkage => \$T2H_INVISIBLE_MARK, - verbose => 'use text in invisble anchot', - noHelp => 1, -}; - -# -iso -# if set, ISO8879 characters are used for special symbols (like copyright, etc) -$T2H_USE_ISO = 0; -$T2H_OPTIONS -> {iso} = -{ - type => 'iso', - linkage => \$T2H_USE_ISO, - verbose => 'if set, ISO8879 characters are used for special symbols (like copyright, etc)', - noHelp => 1, -}; - -# -I -# list directories where @include files are searched for (besides the -# directory of the doc file) additional '-I' args add to this list -@T2H_INCLUDE_DIRS = ("."); -$T2H_OPTIONS -> {I} = -{ - type => '=s', - linkage => \@T2H_INCLUDE_DIRS, - verbose => 'append $s to the @include search path', -}; - -# -top_file -# uses file of this name for top-level file -# extension is manipulated appropriately, if necessary. -# If empty, .html is used -# Typically, you would set this to "index.html". -$T2H_TOP_FILE = ''; -$T2H_OPTIONS -> {top_file} = -{ - type => '=s', - linkage => \$T2H_TOP_FILE, - verbose => 'use $s as top file, instead of .html', -}; - - -# -toc_file -# uses file of this name for table of contents file -# extension is manipulated appropriately, if necessary. -# If empty, _toc.html is used -$T2H_TOC_FILE = ''; -$T2H_OPTIONS -> {toc_file} = -{ - type => '=s', - linkage => \$T2H_TOC_FILE, - verbose => 'use $s as ToC file, instead of _toc.html', -}; - -# -frames -# if set, output two additional files which use HTML 4.0 "frames". -$T2H_FRAMES = 0; -$T2H_OPTIONS -> {frames} = -{ - type => '!', - linkage => \$T2H_FRAMES, - verbose => 'output files which use HTML 4.0 frames (experimental)', - noHelp => 1, -}; - - -# -menu | -nomenu -# if set, show the Texinfo menus -$T2H_SHOW_MENU = 1; -$T2H_OPTIONS -> {menu} = -{ - type => '!', - linkage => \$T2H_SHOW_MENU, - verbose => 'ouput Texinfo menus', -}; - -# -number | -nonumber -# if set, number sections and show section names and numbers in references -# and menus -$T2H_NUMBER_SECTIONS = 1; -$T2H_OPTIONS -> {number} = -{ - type => '!', - linkage => \$T2H_NUMBER_SECTIONS, - verbose => 'use numbered sections' -}; - -# if set, and T2H_NUMBER_SECTIONS is set, then use node names in menu -# entries, instead of section names -$T2H_NODE_NAME_IN_MENU = 0; - -# if set and menu entry equals menu descr, then do not print menu descr. -# Likewise, if node name equals entry name, do not print entry name. -$T2H_AVOID_MENU_REDUNDANCY = 1; - -# -split section|chapter|none -# if set to 'section' (resp. 'chapter') create one html file per (sub)section -# (resp. chapter) and separate pages for Top, ToC, Overview, Index, -# Glossary, About. -# otherwise, create monolithic html file which contains whole document -#$T2H_SPLIT = 'section'; -$T2H_SPLIT = ''; -$T2H_OPTIONS -> {split} = -{ - type => '=s', - linkage => \$T2H_SPLIT, - verbose => 'split document on section|chapter else no splitting', -}; - -# -section_navigation|-no-section_navigation -# if set, then navigation panels are printed at the beginning of each section -# and, possibly at the end (depending on whether or not there were more than -# $T2H_WORDS_IN_PAGE words on page -# This is most useful if you do not want to have section navigation -# on -split chapter -$T2H_SECTION_NAVIGATION = 1; -$T2H_OPTIONS -> {sec_nav} = -{ - type => '!', - linkage => \$T2H_SECTION_NAVIGATION, - verbose => 'output navigation panels for each section', -}; - -# -subdir -# if set put result files in this directory -# if not set result files are put into current directory -#$T2H_SUBDIR = 'html'; -$T2H_SUBDIR = ''; -$T2H_OPTIONS -> {subdir} = -{ - type => '=s', - linkage => \$T2H_SUBDIR, - verbose => 'put HTML files in directory $s, instead of $cwd', -}; - -# -short_extn -# If this is set all HTML file will have extension ".htm" instead of -# ".html". This is helpful when shipping the document to PC systems. -$T2H_SHORTEXTN = 0; -$T2H_OPTIONS -> {short_ext} = -{ - type => '!', - linkage => \$T2H_SHORTEXTN, - verbose => 'use "htm" extension for output HTML files', -}; - - -# -prefix -# Set the output file prefix, prepended to all .html, .gif and .pl files. -# By default, this is the basename of the document -$T2H_PREFIX = ''; -$T2H_OPTIONS -> {prefix} = -{ - type => '=s', - linkage => \$T2H_PREFIX, - verbose => 'use as prefix for output files, instead of ', -}; - -# -o filename -# If set, generate monolithic document output html into $filename -$T2H_OUT = ''; -$T2H_OPTIONS -> {out_file} = -{ - type => '=s', - linkage => sub {$main::T2H_OUT = @_[1]; $T2H_SPLIT = '';}, - verbose => 'if set, all HTML output goes into file $s', -}; - -# -short_ref -#if set cross-references are given without section numbers -$T2H_SHORT_REF = ''; -$T2H_OPTIONS -> {short_ref} = -{ - type => '!', - linkage => \$T2H_SHORT_REF, - verbose => 'if set, references are without section numbers', -}; - -# -idx_sum -# if value is set, then for each @prinindex $what -# $docu_name_$what.idx is created which contains lines of the form -# $key\t$ref sorted alphabetically (case matters) -$T2H_IDX_SUMMARY = 0; -$T2H_OPTIONS -> {idx_sum} = -{ - type => '!', - linkage => \$T2H_IDX_SUMMARY, - verbose => 'if set, also output index summary', - noHelp => 1, -}; - -# -verbose -# if set, chatter about what we are doing -$T2H_VERBOSE = ''; -$T2H_OPTIONS -> {Verbose} = -{ - type => '!', - linkage => \$T2H_VERBOSE, - verbose => 'print progress info to stdout', -}; - -# -lang -# For page titles use $T2H_WORDS->{$T2H_LANG}->{...} as title. -# To add a new language, supply list of titles (see $T2H_WORDS below). -# and use ISO 639 language codes (see e.g. perl module Locale-Codes-1.02 -# for definitions) -# Default's to 'en' if not set or no @documentlanguage is specified -$T2H_LANG = ''; -$T2H_OPTIONS -> {lang} = -{ - type => '=s', - linkage => sub {SetDocumentLanguage($_[1])}, - verbose => 'use $s as document language (ISO 639 encoding)', -}; - -# -l2h -# if set, uses latex2html for generation of math content -$T2H_L2H = ''; -$T2H_OPTIONS -> {l2h} = -{ - type => '!', - linkage => \$T2H_L2H, - verbose => 'if set, uses latex2html for @math and @tex', -}; - -###################### -# The following options are only relevant if $T2H_L2H is set -# -# -l2h_l2h -# name/location of latex2html progam -$T2H_L2H_L2H = "latex2html"; -$T2H_OPTIONS -> {l2h_l2h} = -{ - type => '=s', - linkage => \$T2H_L2H_L2H, - verbose => 'program to use for latex2html translation', - noHelp => 1, -}; - -# -l2h_skip -# if set, skips actual call to latex2html tries to reuse previously generated -# content, instead -$T2H_L2H_SKIP = ''; -$T2H_OPTIONS -> {l2h_skip} = -{ - type => '!', - linkage => \$T2H_L2H_SKIP, - verbose => 'if set, tries to reuse previously latex2html output', - noHelp => 1, -}; - -# -l2h_tmp -# if set, l2h uses this directory for temporarary files. The path -# leading to this directory may not contain a dot (i.e., a "."), -# otherwise, l2h will fail -$T2H_L2H_TMP = ''; -$T2H_OPTIONS -> {l2h_tmp} = -{ - type => '=s', - linkage => \$T2H_L2H_TMP, - verbose => 'if set, uses $s as temporary latex2html directory', - noHelp => 1, -}; - -# if set, cleans intermediate files (they all have the prefix $doc_l2h_) -# of l2h -$T2H_L2H_CLEAN = 1; -$T2H_OPTIONS -> {l2h_clean} = -{ - type => '!', - linkage => \$T2H_L2H_CLEAN, - verbose => 'if set, do not keep intermediate latex2html files for later reuse', - noHelp => 1, -}; - -$T2H_OPTIONS -> {D} = -{ - type => '=s', - linkage => sub {$main::value{@_[1]} = 1;}, - verbose => 'equivalent to Texinfo "@set $s 1"', - noHelp => 1, -}; - -$T2H_OPTIONS -> {init_file} = -{ - type => '=s', - linkage => \&LoadInitFile, - verbose => 'load init file $s' -}; - - -############################################################################## -# -# The following can only be set in the init file -# -############################################################################## - -# if set, center @image by default -# otherwise, do not center by default -$T2H_CENTER_IMAGE = 1; - -# used as identation for block enclosing command @example, etc -# If not empty, must be enclosed in -$T2H_EXAMPLE_INDENT_CELL = ' '; -# same as above, only for @small -$T2H_SMALL_EXAMPLE_INDENT_CELL = ' '; -# font size for @small -$T2H_SMALL_FONT_SIZE = '-1'; - -# if non-empty, and no @..heading appeared in Top node, then -# use this as header for top node/section, otherwise use value of -# @settitle or @shorttitle (in that order) -$T2H_TOP_HEADING = ''; - -# if set, use this chapter for 'Index' button, else -# use first chapter whose name matches 'index' (case insensitive) -$T2H_INDEX_CHAPTER = ''; - -# if set and $T2H_SPLIT is set, then split index pages at the next letter -# after they have more than that many entries -$T2H_SPLIT_INDEX = 100; - -# if set (e.g., to index.html) replace hrefs to this file -# (i.e., to index.html) by ./ -$T2H_HREF_DIR_INSTEAD_FILE = ''; - -######################################################################## -# Language dependencies: -# To add a new language extend T2H_WORDS hash and create $T2H_<...>_WORDS hash -# To redefine one word, simply do: -# $T2H_WORDS->{}->{} = 'whatever' in your personal init file. -# -$T2H_WORDS_EN = -{ - # titles of pages - 'ToC_Title' => 'Table of Contents', - 'Overview_Title' => 'Short Table of Contents', - 'Index_Title' => 'Index', - 'About_Title' => 'About this document', - 'Footnotes_Title' => 'Footnotes', - 'See' => 'See', - 'see' => 'see', - 'section' => 'section', -# If necessary, we could extend this as follows: -# # text for buttons -# 'Top_Button' => 'Top', -# 'ToC_Button' => 'Contents', -# 'Overview_Button' => 'Overview', -# 'Index_button' => 'Index', -# 'Back_Button' => 'Back', -# 'FastBack_Button' => 'FastBack', -# 'Prev_Button' => 'Prev', -# 'Up_Button' => 'Up', -# 'Next_Button' => 'Next', -# 'Forward_Button' =>'Forward', -# 'FastWorward_Button' => 'FastForward', -# 'First_Button' => 'First', -# 'Last_Button' => 'Last', -# 'About_Button' => 'About' -}; - -$T2H_WORD_DE = -{ - 'ToC_Title' => 'Inhaltsverzeichniss', - 'Overview_Title' => 'Kurzes Inhaltsverzeichniss', - 'Index_Title' => 'Index', - 'About_Title' => 'Über dieses Dokument', - 'Footnotes_Title' => 'Fußnoten', - 'See' => 'Siehe', - 'see' => 'siehe', - 'section' => 'Abschnitt', -}; - -$T2H_WORD_NL = -{ - 'ToC_Title' => 'Inhoudsopgave', - 'Overview_Title' => 'Korte inhoudsopgave', - 'Index_Title' => 'Index', #Not sure ;-) - 'About_Title' => 'No translation available!', #No translation available! - 'Footnotes_Title' => 'No translation available!', #No translation available! - 'See' => 'Zie', - 'see' => 'zie', - 'section' => 'sectie', -}; - -$T2H_WORD_ES = -{ - 'ToC_Title' => 'índice General', - 'Overview_Title' => 'Resumen del Contenido', - 'Index_Title' => 'Index', #Not sure ;-) - 'About_Title' => 'No translation available!', #No translation available! - 'Footnotes_Title' => 'Fußnoten', - 'See' => 'Véase', - 'see' => 'véase', - 'section' => 'sección', -}; - -$T2H_WORD_NO = -{ - 'ToC_Title' => 'Innholdsfortegnelse', - 'Overview_Title' => 'Kort innholdsfortegnelse', - 'Index_Title' => 'Indeks', #Not sure ;-) - 'About_Title' => 'No translation available!', #No translation available! - 'Footnotes_Title' => 'No translation available!', - 'See' => 'Se', - 'see' => 'se', - 'section' => 'avsnitt', -}; - -$T2H_WORD_PT = -{ - 'ToC_Title' => 'Sumário', - 'Overview_Title' => 'Breve Sumário', - 'Index_Title' => 'Índice', #Not sure ;-) - 'About_Title' => 'No translation available!', #No translation available! - 'Footnotes_Title' => 'No translation available!', - 'See' => 'Veja', - 'see' => 'veja', - 'section' => 'Seção', -}; - -$T2H_WORDS = -{ - 'en' => $T2H_WORDS_EN, - 'de' => $T2H_WORDS_DE, - 'nl' => $T2H_WORDS_NL, - 'es' => $T2H_WORDS_ES, - 'no' => $T2H_WORDS_NO, - 'pt' => $T2H_WORDS_PT -}; - -@MONTH_NAMES_EN = -( - 'January', 'February', 'March', 'April', 'May', - 'June', 'July', 'August', 'September', 'October', - 'November', 'December' -); - -@MONTH_NAMES_DE = -( - 'Januar', 'Februar', 'März', 'April', 'Mai', - 'Juni', 'Juli', 'August', 'September', 'Oktober', - 'November', 'Dezember' -); - -@MONTH_NAMES_NL = -( - 'Januari', 'Februari', 'Maart', 'April', 'Mei', - 'Juni', 'Juli', 'Augustus', 'September', 'Oktober', - 'November', 'December' -); - -@MONTH_NAMES_ES = -( - 'enero', 'febrero', 'marzo', 'abril', 'mayo', - 'junio', 'julio', 'agosto', 'septiembre', 'octubre', - 'noviembre', 'diciembre' -); - -@MONTH_NAMES_NO = -( - - 'januar', 'februar', 'mars', 'april', 'mai', - 'juni', 'juli', 'august', 'september', 'oktober', - 'november', 'desember' -); - -@MONTH_NAMES_PT = -( - 'Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', - 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', - 'Novembro', 'Dezembro' -); - - -$MONTH_NAMES = -{ - 'en' => \@MONTH_NAMES_EN, - 'de' => \@MONTH_NAMES_DE, - 'es' => \@MONTH_NAMES_ES, - 'nl' => \@MONTH_NAMES_NL, - 'no' => \@MONTH_NAMES_NO, - 'pt' => \@MONTH_NAMES_PT -}; -######################################################################## -# Control of Page layout: -# You can make changes of the Page layout at two levels: -# 1.) For small changes, it is often enough to change the value of -# some global string/hash/array variables -# 2.) For larger changes, reimplement one of the T2H_DEFAULT_* routines, -# give them another name, and assign them to the respective -# $T2H_ variable. - -# As a general interface, the hashes T2H_HREF, T2H_NAME, T2H_NODE hold -# href, html-name, node-name of -# This -- current section (resp. html page) -# Top -- top page ($T2H_TOP_FILE) -# Contents -- Table of contents -# Overview -- Short table of contents -# Index -- Index page -# About -- page which explain "navigation buttons" -# First -- first node -# Last -- last node -# -# Whether or not the following hash values are set, depends on the context -# (all values are w.r.t. 'This' section) -# Next -- next node of texinfo -# Prev -- previous node of texinfo -# Up -- up node of texinfo -# Forward -- next node in reading order -# Back -- previous node in reading order -# FastForward -- if leave node, up and next, else next node -# FastBackward-- if leave node, up and prev, else prev node -# -# Furthermore, the following global variabels are set: -# $T2H_THISDOC{title} -- title as set by @setttile -# $T2H_THISDOC{fulltitle} -- full title as set by @title... -# $T2H_THISDOC{subtitle} -- subtitle as set by @subtitle -# $T2H_THISDOC{author} -- author as set by @author -# -# and pointer to arrays of lines which need to be printed by t2h_print_lines -# $T2H_OVERVIEW -- lines of short table of contents -# $T2H_TOC -- lines of table of contents -# $T2H_TOP -- lines of Top texinfo node -# $T2H_THIS_SECTION -- lines of 'This' section - -# -# There are the following subs which control the layout: -# -$T2H_print_section = \&T2H_DEFAULT_print_section; -$T2H_print_Top_header = \&T2H_DEFAULT_print_Top_header; -$T2H_print_Top_footer = \&T2H_DEFAULT_print_Top_footer; -$T2H_print_Top = \&T2H_DEFAULT_print_Top; -$T2H_print_Toc = \&T2H_DEFAULT_print_Toc; -$T2H_print_Overview = \&T2H_DEFAULT_print_Overview; -$T2H_print_Footnotes = \&T2H_DEFAULT_print_Footnotes; -$T2H_print_About = \&T2H_DEFAULT_print_About; -$T2H_print_misc_header = \&T2H_DEFAULT_print_misc_header; -$T2H_print_misc_footer = \&T2H_DEFAULT_print_misc_footer; -$T2H_print_misc = \&T2H_DEFAULT_print_misc; -$T2H_print_chapter_header = \&T2H_DEFAULT_print_chapter_header; -$T2H_print_chapter_footer = \&T2H_DEFAULT_print_chapter_footer; -$T2H_print_page_head = \&T2H_DEFAULT_print_page_head; -$T2H_print_page_foot = \&T2H_DEFAULT_print_page_foot; -$T2H_print_head_navigation = \&T2H_DEFAULT_print_head_navigation; -$T2H_print_foot_navigation = \&T2H_DEFAULT_print_foot_navigation; -$T2H_button_icon_img = \&T2H_DEFAULT_button_icon_img; -$T2H_print_navigation = \&T2H_DEFAULT_print_navigation; -$T2H_about_body = \&T2H_DEFAULT_about_body; -$T2H_print_frame = \&T2H_DEFAULT_print_frame; -$T2H_print_toc_frame = \&T2H_DEFAULT_print_toc_frame; - -######################################################################## -# Layout for html for every sections -# -sub T2H_DEFAULT_print_section -{ - my $fh = shift; - local $T2H_BUTTONS = \@T2H_SECTION_BUTTONS; - &$T2H_print_head_navigation($fh) if $T2H_SECTION_NAVIGATION; - my $nw = t2h_print_lines($fh); - if ($T2H_SPLIT eq 'section' && $T2H_SECTION_NAVIGATION) - { - &$T2H_print_foot_navigation($fh, $nw); - } - else - { - print $fh '


' . "\n"; - } -} - -################################################################### -# Layout of top-page I recommend that you use @ifnothtml, @ifhtml, -# @html within the Top texinfo node to specify content of top-level -# page. -# -# If you enclose everything in @ifnothtml, then title, subtitle, -# author and overview is printed -# T2H_HREF of Next, Prev, Up, Forward, Back are not defined -# if $T2H_SPLIT then Top page is in its own html file -sub T2H_DEFAULT_print_Top_header -{ - &$T2H_print_page_head(@_) if $T2H_SPLIT; - t2h_print_label(@_); # this needs to be called, otherwise no label set - &$T2H_print_head_navigation(@_); -} -sub T2H_DEFAULT_print_Top_footer -{ - &$T2H_print_foot_navigation(@_); - &$T2H_print_page_foot(@_) if $T2H_SPLIT; -} -sub T2H_DEFAULT_print_Top -{ - my $fh = shift; - - # for redefining navigation buttons use: - # local $T2H_BUTTONS = [...]; - # as it is, 'Top', 'Contents', 'Index', 'About' are printed - local $T2H_BUTTONS = \@T2H_MISC_BUTTONS; - &$T2H_print_Top_header($fh); - if ($T2H_THIS_SECTION) - { - # if top-level node has content, then print it with extra header - print $fh "

$T2H_NAME{Top}

" - unless ($T2H_HAS_TOP_HEADING); - t2h_print_lines($fh, $T2H_THIS_SECTION) - } - else - { - # top-level node is fully enclosed in @ifnothtml - # print fulltitle, subtitle, author, Overview - print $fh - "
\n

" . - join("

\n

", split(/\n/, $T2H_THISDOC{fulltitle})) . - "

\n"; - print $fh "

$T2H_THISDOC{subtitle}

\n" if $T2H_THISDOC{subtitle}; - print $fh "$T2H_THISDOC{author}\n" if $T2H_THISDOC{author}; - print $fh < -
-

-

Overview:

-
-EOT - t2h_print_lines($fh, $T2H_OVERVIEW); - print $fh "
\n"; - } - &$T2H_print_Top_footer($fh); -} - -################################################################### -# Layout of Toc, Overview, and Footnotes pages -# By default, we use "normal" layout -# T2H_HREF of Next, Prev, Up, Forward, Back, etc are not defined -# use: local $T2H_BUTTONS = [...] to redefine navigation buttons -sub T2H_DEFAULT_print_Toc -{ - return &$T2H_print_misc(@_); -} -sub T2H_DEFAULT_print_Overview -{ - return &$T2H_print_misc(@_); -} -sub T2H_DEFAULT_print_Footnotes -{ - return &$T2H_print_misc(@_); -} -sub T2H_DEFAULT_print_About -{ - return &$T2H_print_misc(@_); -} - -sub T2H_DEFAULT_print_misc_header -{ - &$T2H_print_page_head(@_) if $T2H_SPLIT; - # this needs to be called, otherwise, no labels are set - t2h_print_label(@_); - &$T2H_print_head_navigation(@_); -} -sub T2H_DEFAULT_print_misc_footer -{ - &$T2H_print_foot_navigation(@_); - &$T2H_print_page_foot(@_) if $T2H_SPLIT; -} -sub T2H_DEFAULT_print_misc -{ - my $fh = shift; - local $T2H_BUTTONS = \@T2H_MISC_BUTTONS; - &$T2H_print_misc_header($fh); - print $fh "

$T2H_NAME{This}

\n"; - t2h_print_lines($fh); - &$T2H_print_misc_footer($fh); -} - -################################################################### -# chapter_header and chapter_footer are only called if -# T2H_SPLIT eq 'chapter' -# chapter_header: after print_page_header, before print_section -# chapter_footer: after print_section of last section, before print_page_footer -# -# If you want to get rid of navigation stuff after each section, -# redefine print_section such that it does not call print_navigation, -# and put print_navigation into print_chapter_header -@T2H_CHAPTER_BUTTONS = - ( - 'FastBack', 'FastForward', ' ', - ' ', ' ', ' ', ' ', - 'Top', 'Contents', 'Index', 'About', - ); - -sub T2H_DEFAULT_print_chapter_header -{ - # nothing to do there, by default - if (! $T2H_SECTION_NAVIGATION) - { - my $fh = shift; - local $T2H_BUTTONS = \@T2H_CHAPTER_BUTTONS; - &$T2H_print_navigation($fh); - print $fh "\n
\n"; - } -} - -sub T2H_DEFAULT_print_chapter_footer -{ - local $T2H_BUTTONS = \@T2H_CHAPTER_BUTTONS; - &$T2H_print_navigation(@_); -} -################################################################### -$T2H_TODAY = &pretty_date; # like "20 September 1993" - -sub pretty_date { - local($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst); - - ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); - $year += ($year < 70) ? 2000 : 1900; - # obachman: Let's do it as the Americans do - return($MONTH_NAMES->{$T2H_LANG}[$mon] . ", " . $mday . " " . $year); -} - - -################################################################### -# Layout of standard header and footer -# - -# Set the default body text, inserted between -###$T2H_BODYTEXT = 'LANG="EN" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"'; -$T2H_BODYTEXT = 'LANG="' . $T2H_LANG . '" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"'; -# text inserted after -$T2H_AFTER_BODY_OPEN = ''; -#text inserted before -$T2H_PRE_BODY_CLOSE = ''; -# this is used in footer -$T2H_ADDRESS = "by $T2H_USER " if $T2H_USER; -$T2H_ADDRESS .= "on $T2H_TODAY"; -# this is added inside after and some META NAME stuff -# can be used for <style> <script>, <meta> tags -$T2H_EXTRA_HEAD = ''; - -sub T2H_DEFAULT_print_page_head -{ - my $fh = shift; - my $longtitle = "$T2H_THISDOC{title}: $T2H_NAME{This}"; - print $fh <<EOT; -<HTML> -$T2H_DOCTYPE -<!-- Created on $T2H_TODAY by $THISPROG --> -<!-- -$T2H_AUTHORS ---> -<HEAD> -<TITLE>$longtitle - - - - - - -$T2H_EXTRA_HEAD - - - -$T2H_AFTER_BODY_OPEN -EOT -} - -sub T2H_DEFAULT_print_page_foot -{ - my $fh = shift; - print $fh < - -This document was generated -$T2H_ADDRESS -using
texi2html -$T2H_PRE_BODY_CLOSE - - -EOT -} - -################################################################### -# Layout of navigation panel - -# if this is set, then a vertical navigation panel is used -$T2H_VERTICAL_HEAD_NAVIGATION = 0; -sub T2H_DEFAULT_print_head_navigation -{ - my $fh = shift; - if ($T2H_VERTICAL_HEAD_NAVIGATION) - { - print $fh < - - -EOT - } - &$T2H_print_navigation($fh, $T2H_VERTICAL_HEAD_NAVIGATION); - if ($T2H_VERTICAL_HEAD_NAVIGATION) - { - print $fh < - -EOT - } - elsif ($T2H_SPLIT eq 'section') - { - print $fh "
\n"; - } -} - -# Specifies the minimum page length required before a navigation panel -# is placed at the bottom of a page (the default is that of latex2html) -# T2H_THIS_WORDS_IN_PAGE holds number of words of current page -$T2H_WORDS_IN_PAGE = 300; -sub T2H_DEFAULT_print_foot_navigation -{ - my $fh = shift; - my $nwords = shift; - if ($T2H_VERTICAL_HEAD_NAVIGATION) - { - print $fh < - - -EOT - } - print $fh "
\n"; - &$T2H_print_navigation($fh) if ($nwords >= $T2H_WORDS_IN_PAGE) -} - -###################################################################### -# navigation panel -# -# specify in this array which "buttons" should appear in which order -# in the navigation panel for sections; use ' ' for empty buttons (space) -@T2H_SECTION_BUTTONS = - ( - 'Back', 'Forward', ' ', 'FastBack', 'Up', 'FastForward', - ' ', ' ', ' ', ' ', - 'Top', 'Contents', 'Index', 'About', - ); - -# buttons for misc stuff -@T2H_MISC_BUTTONS = ('Top', 'Contents', 'Index', 'About'); - -# insert here name of icon images for buttons -# Icons are used, if $T2H_ICONS and resp. value are set -%T2H_ACTIVE_ICONS = - ( - 'Top', '', - 'Contents', '', - 'Overview', '', - 'Index', '', - 'Back', '', - 'FastBack', '', - 'Prev', '', - 'Up', '', - 'Next', '', - 'Forward', '', - 'FastForward', '', - 'About' , '', - 'First', '', - 'Last', '', - ' ', '' - ); - -# insert here name of icon images for these, if button is inactive -%T2H_PASSIVE_ICONS = - ( - 'Top', '', - 'Contents', '', - 'Overview', '', - 'Index', '', - 'Back', '', - 'FastBack', '', - 'Prev', '', - 'Up', '', - 'Next', '', - 'Forward', '', - 'FastForward', '', - 'About', '', - 'First', '', - 'Last', '', - ); - -# how to create IMG tag -sub T2H_DEFAULT_button_icon_img -{ - my $button = shift; - my $icon = shift; - my $name = shift; - return qq{$button: $name}; -} - -# Names of text as alternative for icons -%T2H_NAVIGATION_TEXT = - ( - 'Top', 'Top', - 'Contents', 'Contents', - 'Overview', 'Overview', - 'Index', 'Index', - ' ', '   ', - 'Back', ' < ', - 'FastBack', ' << ', - 'Prev', 'Prev', - 'Up', ' Up ', - 'Next', 'Next', - 'Forward', ' > ', - 'FastForward', ' >> ', - 'About', ' ? ', - 'First', ' |< ', - 'Last', ' >| ' - ); - -sub T2H_DEFAULT_print_navigation -{ - my $fh = shift; - my $vertical = shift; - my $spacing = 1; - print $fh "\n"; - - print $fh "" unless $vertical; - for $button (@$T2H_BUTTONS) - { - print $fh qq{\n} if $vertical; - print $fh qq{\n"; - print $fh "\n" if $vertical; - } - print $fh "" unless $vertical; - print $fh "
}; - - if (ref($button) eq 'CODE') - { - &$button($fh, $vertical); - } - elsif ($button eq ' ') - { # handle space button - print $fh - $T2H_ICONS && $T2H_ACTIVE_ICONS{' '} ? - &$T2H_button_icon_img($button, $T2H_ACTIVE_ICONS{' '}) : - $T2H_NAVIGATION_TEXT{' '}; - next; - } - elsif ($T2H_HREF{$button}) - { # button is active - print $fh - $T2H_ICONS && $T2H_ACTIVE_ICONS{$button} ? # use icon ? - t2h_anchor('', $T2H_HREF{$button}, # yes - &$T2H_button_icon_img($button, - $T2H_ACTIVE_ICONS{$button}, - $T2H_NAME{$button})) - : # use text - "[" . - t2h_anchor('', $T2H_HREF{$button}, $T2H_NAVIGATION_TEXT{$button}) . - "]"; - } - else - { # button is passive - print $fh - $T2H_ICONS && $T2H_PASSIVE_ICONS{$button} ? - &$T2H_button_icon_img($button, - $T2H_PASSIVE_ICONS{$button}, - $T2H_NAME{$button}) : - - "[" . $T2H_NAVIGATION_TEXT{$button} . "]"; - } - print $fh "
\n"; -} - -###################################################################### -# Frames: this is from "Richard Y. Kim" -# Should be improved to be more conforming to other _print* functions - -sub T2H_DEFAULT_print_frame -{ - my $fh = shift; - print $fh < -$T2H_THISDOC{title} - - - - - -EOT -} - -sub T2H_DEFAULT_print_toc_frame -{ - my $fh = shift; - &$T2H_print_page_head($fh); - print $fh <Content -EOT - print $fh map {s/HREF=/target=\"main\" HREF=/; $_;} @stoc_lines; - print $fh "\n"; -} - -###################################################################### -# About page -# - -# T2H_PRE_ABOUT might be a function -$T2H_PRE_ABOUT = <texi2html -

-EOT -$T2H_AFTER_ABOUT = ''; - -sub T2H_DEFAULT_about_body -{ - my $about; - if (ref($T2H_PRE_ABOUT) eq 'CODE') - { - $about = &$T2H_PRE_ABOUT(); - } - else - { - $about = $T2H_PRE_ABOUT; - } - $about .= <

- - - - - - - -EOT - - for $button (@T2H_SECTION_BUTTONS) - { - next if $button eq ' ' || ref($button) eq 'CODE'; - $about .= < - - - - -EOT - } - - $about .= < -

-where the Example assumes that the current position -is at Subsubsection One-Two-Three of a document of -the following structure: -
    -
  • 1. Section One
  • -
      -
    • 1.1 Subsection One-One
    • -
        -
      • ...
      • -
      -
    • 1.2 Subsection One-Two
    • -
        -
      • 1.2.1 Subsubsection One-Two-One -
      • 1.2.2 Subsubsection One-Two-Two -
      • 1.2.3 Subsubsection One-Two-Three     -<== Current Position -
      • 1.2.4 Subsubsection One-Two-Four -
      -
    • 1.3 Subsection One-Three
    • -
        -
      • ...
      • -
      -
    • 1.4 Subsection One-Four
    • -
    -
-$T2H_AFTER_ABOUT -EOT - return $about; -} - - -%T2H_BUTTONS_GOTO = - ( - 'Top', 'cover (top) of document', - 'Contents', 'table of contents', - 'Overview', 'short table of contents', - 'Index', 'concept index', - 'Back', 'previous section in reading order', - 'FastBack', 'previous or up-and-previous section ', - 'Prev', 'previous section same level', - 'Up', 'up section', - 'Next', 'next section same level', - 'Forward', 'next section in reading order', - 'FastForward', 'next or up-and-next section', - 'About' , 'this page', - 'First', 'first section in reading order', - 'Last', 'last section in reading order', - ); - -%T2H_BUTTONS_EXAMPLE = -( - 'Top', '   ', - 'Contents', '   ', - 'Overview', '   ', - 'Index', '   ', - 'Back', '1.2.2', - 'FastBack', '1.1', - 'Prev', '1.2.2', - 'Up', '1.2', - 'Next', '1.2.4', - 'Forward', '1.2.4', - 'FastForward', '1.3', - 'About', '   ', - 'First', '1.', - 'Last', '1.2.4', -); - - -###################################################################### -# from here on, its l2h init stuff -# - -## initialization for latex2html as for Singular manual generation -## obachman 3/99 - -# -# Options controlling Titles, File-Names, Tracing and Sectioning -# -$TITLE = ''; - -$SHORTEXTN = 0; - -$LONG_TITLES = 0; - -$DESTDIR = ''; # should be overwritten by cmd-line argument - -$NO_SUBDIR = 0;# should be overwritten by cmd-line argument - -$PREFIX = ''; # should be overwritten by cmd-line argument - -$AUTO_PREFIX = 0; # this is needed, so that prefix settings are used - -$AUTO_LINK = 0; - -$SPLIT = 0; - -$MAX_LINK_DEPTH = 0; - -$TMP = ''; # should be overwritten by cmd-line argument - -$DEBUG = 0; - -$VERBOSE = 1; - -# -# Options controlling Extensions and Special Features -# -$HTML_VERSION = "3.2"; - -$TEXDEFS = 1; # we absolutely need that - -$EXTERNAL_FILE = ''; - -$SCALABLE_FONTS = 1; - -$NO_SIMPLE_MATH = 1; - -$LOCAL_ICONS = 1; - -$SHORT_INDEX = 0; - -$NO_FOOTNODE = 1; - -$ADDRESS = ''; - -$INFO = ''; - -# -# Switches controlling Image Generation -# -$ASCII_MODE = 0; - -$NOLATEX = 0; - -$EXTERNAL_IMAGES = 0; - -$PS_IMAGES = 0; - -$NO_IMAGES = 0; - -$IMAGES_ONLY = 0; - -$REUSE = 2; - -$ANTI_ALIAS = 1; - -$ANTI_ALIAS_TEXT = 1; - -# -#Switches controlling Navigation Panels -# -$NO_NAVIGATION = 1; -$ADDRESS = ''; -$INFO = 0; # 0 = do not make a "About this document..." section - -# -#Switches for Linking to other documents -# -# actuall -- we don't care - -$MAX_SPLIT_DEPTH = 0; # Stop making separate files at this depth - -$MAX_LINK_DEPTH = 0; # Stop showing child nodes at this depth - -$NOLATEX = 0; # 1 = do not pass unknown environments to Latex - -$EXTERNAL_IMAGES = 0; # 1 = leave the images outside the document - -$ASCII_MODE = 0; # 1 = do not use any icons or internal images - -# 1 = use links to external postscript images rather than inlined bitmap -# images. -$PS_IMAGES = 0; -$SHOW_SECTION_NUMBERS = 0; - -### Other global variables ############################################### -$CHILDLINE = ""; - -# This is the line width measured in pixels and it is used to right justify -# equations and equation arrays; -$LINE_WIDTH = 500; - -# Used in conjunction with AUTO_NAVIGATION -$WORDS_IN_PAGE = 300; - -# Affects ONLY the way accents are processed -$default_language = 'english'; - -# The value of this variable determines how many words to use in each -# title that is added to the navigation panel (see below) -# -$WORDS_IN_NAVIGATION_PANEL_TITLES = 0; - -# This number will determine the size of the equations, special characters, -# and anything which will be converted into an inlined image -# *except* "image generating environments" such as "figure", "table" -# or "minipage". -# Effective values are those greater than 0. -# Sensible values are between 0.1 - 4. -$MATH_SCALE_FACTOR = 1.5; - -# This number will determine the size of -# image generating environments such as "figure", "table" or "minipage". -# Effective values are those greater than 0. -# Sensible values are between 0.1 - 4. -$FIGURE_SCALE_FACTOR = 1.6; - - -# If both of the following two variables are set then the "Up" button -# of the navigation panel in the first node/page of a converted document -# will point to $EXTERNAL_UP_LINK. $EXTERNAL_UP_TITLE should be set -# to some text which describes this external link. -$EXTERNAL_UP_LINK = ""; -$EXTERNAL_UP_TITLE = ""; - -# If this is set then the resulting HTML will look marginally better if viewed -# with Netscape. -$NETSCAPE_HTML = 1; - -# Valid paper sizes are "letter", "legal", "a4","a3","a2" and "a0" -# Paper sizes has no effect other than in the time it takes to create inlined -# images and in whether large images can be created at all ie -# - larger paper sizes *MAY* help with large image problems -# - smaller paper sizes are quicker to handle -$PAPERSIZE = "a4"; - -# Replace "english" with another language in order to tell LaTeX2HTML that you -# want some generated section titles (eg "Table of Contents" or "References") -# to appear in a different language. Currently only "english" and "french" -# is supported but it is very easy to add your own. See the example in the -# file "latex2html.config" -$TITLES_LANGUAGE = "english"; - -1; # This must be the last non-comment line - -# End File texi2html.init -###################################################################### - - -require "$ENV{T2H_HOME}/texi2html.init" - if ($0 =~ /\.pl$/ && - -e "$ENV{T2H_HOME}/texi2html.init" && -r "$ENV{T2H_HOME}/texi2html.init"); - -#+++############################################################################ -# # -# Initialization # -# Pasted content of File $(srcdir)/MySimple.pm: Command-line processing # -# # -#---############################################################################ - -# leave this within comments, and keep the require statement -# This way, you can directly run texi2html.pl, if $ENV{T2H_HOME}/texi2html.init -# exists. - -# -package Getopt::MySimple; - -# Name: -# Getopt::MySimple. -# -# Documentation: -# POD-style (incomplete) documentation is in file MySimple.pod -# -# Tabs: -# 4 spaces || die. -# -# Author: -# Ron Savage rpsavage@ozemail.com.au. -# 1.00 19-Aug-97 Initial version. -# 1.10 13-Oct-97 Add arrays of switches (eg '=s@'). -# 1.20 3-Dec-97 Add 'Help' on a per-switch basis. -# 1.30 11-Dec-97 Change 'Help' to 'verbose'. Make all hash keys lowercase. -# 1.40 10-Nov-98 Change width of help report. Restructure tests. -# 1-Jul-00 Modifications for Texi2html - -# -------------------------------------------------------------------------- -# Locally modified by obachman (Display type instead of env, order by cmp) -# $Id: MySimple.pm,v 1.1 2000/07/03 08:44:13 obachman Exp $ - -# use strict; -# no strict 'refs'; - -use vars qw(@EXPORT @EXPORT_OK @ISA); -use vars qw($fieldWidth $opt $VERSION); - -use Exporter(); -use Getopt::Long; - -@ISA = qw(Exporter); -@EXPORT = qw(); -@EXPORT_OK = qw($opt); # An alias for $self -> {'opt'}. - -# -------------------------------------------------------------------------- - -$fieldWidth = 20; -$VERSION = '1.41'; - -# -------------------------------------------------------------------------- - -sub byOrder -{ - my($self) = @_; - - return uc($a) cmp (uc($b)); -} - -# -------------------------------------------------------------------------- - -sub dumpOptions -{ - my($self) = @_; - - print 'Option', ' ' x ($fieldWidth - length('Option') ), "Value\n"; - - for (sort byOrder keys(%{$self -> {'opt'} }) ) - { - print "-$_", ' ' x ($fieldWidth - (1 + length) ), "${$self->{'opt'} }{$_}\n"; - } - - print "\n"; - -} # End of dumpOptions. - -# -------------------------------------------------------------------------- -# Return: -# 0 -> Error. -# 1 -> Ok. - -sub getOptions -{ - push(@_, 0) if ($#_ == 2); # Default for $ignoreCase is 0. - push(@_, 1) if ($#_ == 3); # Default for $helpThenExit is 1. - - my($self, $default, $helpText, $versionText, - $helpThenExit, $versionThenExit, $ignoreCase) = @_; - - $helpThenExit = 1 unless (defined($helpThenExit)); - $versionThenExit = 1 unless (defined($versionThenExit)); - $ignoreCase = 0 unless (defined($ignoreCase)); - - $self -> {'default'} = $default; - $self -> {'helpText'} = $helpText; - $self -> {'versionText'} = $versionText; - $Getopt::Long::ignorecase = $ignoreCase; - - unless (defined($self -> {'default'}{'help'})) - { - $self -> {'default'}{'help'} = - { - type => ':i', - default => '', - linkage => sub {$self->helpOptions($_[1]); exit (0) if $helpThenExit;}, - verbose => "print help and exit" - }; - } - - unless (defined($self -> {'default'}{'version'})) - { - $self -> {'default'}{'version'} = - { - type => '', - default => '', - linkage => sub {print $self->{'versionText'}; exit (0) if versionTheExit;}, - verbose => "print version and exit" - }; - } - - for (keys(%{$self -> {'default'} }) ) - { - my $type = ${$self -> {'default'} }{$_}{'type'}; - push(@{$self -> {'type'} }, "$_$type"); - $self->{'opt'}->{$_} = ${$self -> {'default'} }{$_}{'linkage'} - if ${$self -> {'default'} }{$_}{'linkage'}; - } - - my($result) = &GetOptions($self -> {'opt'}, @{$self -> {'type'} }); - - return $result unless $result; - - for (keys(%{$self -> {'default'} }) ) - { - if (! defined(${$self -> {'opt'} }{$_})) #{ - { - ${$self -> {'opt'} }{$_} = ${$self -> {'default'} }{$_}{'default'}; - } - } - - $result; -} # End of getOptions. - -# -------------------------------------------------------------------------- - -sub helpOptions -{ - my($self) = shift; - my($noHelp) = shift; - $noHelp = 0 unless $noHelp; - my($optwidth, $typewidth, $defaultwidth, $maxlinewidth, $valind, $valwidth) - = (10, 5, 9, 78, 4, 11); - - print "$self->{'helpText'}" if ($self -> {'helpText'}); - - print ' Option', ' ' x ($optwidth - length('Option') -1 ), - 'Type', ' ' x ($typewidth - length('Type') + 1), - 'Default', ' ' x ($defaultwidth - length('Default') ), - "Description\n"; - - for (sort byOrder keys(%{$self -> {'default'} }) ) - { - my($line, $help, $option, $val); - $option = $_; - next if ${$self->{'default'} }{$_}{'noHelp'} && ${$self->{'default'} }{$_}{'noHelp'} > $noHelp; - $line = " -$_ " . ' ' x ($optwidth - (2 + length) ) . - "${$self->{'default'} }{$_}{'type'} ". - ' ' x ($typewidth - (1+length(${$self -> {'default'} }{$_}{'type'}) )); - - $val = ${$self->{'default'} }{$_}{'linkage'}; - if ($val) - { - if (ref($val) eq 'SCALAR') - { - $val = $$val; - } - else - { - $val = ''; - } - } - else - { - $val = ${$self->{'default'} }{$_}{'default'}; - } - $line .= "$val "; - $line .= ' ' x ($optwidth + $typewidth + $defaultwidth + 1 - length($line)); - - if (defined(${$self -> {'default'} }{$_}{'verbose'}) && - ${$self -> {'default'} }{$_}{'verbose'} ne '') - { - $help = "${$self->{'default'} }{$_}{'verbose'}"; - } - else - { - $help = ' '; - } - if ((length("$line") + length($help)) < $maxlinewidth) - { - print $line , $help, "\n"; - } - else - { - print $line, "\n", ' ' x $valind, $help, "\n"; - } - for $val (sort byOrder keys(%{${$self->{'default'}}{$option}{'values'}})) - { - print ' ' x ($valind + 2); - print $val, ' ', ' ' x ($valwidth - length($val) - 2); - print ${$self->{'default'}}{$option}{'values'}{$val}, "\n"; - } - } - - print <| ! no argument: variable is set to 1 on -foo (or, to 0 on -nofoo) - =s | :s mandatory (or, optional) string argument - =i | :i mandatory (or, optional) integer argument -EOT -} # End of helpOptions. - -#------------------------------------------------------------------- - -sub new -{ - my($class) = @_; - my($self) = {}; - $self -> {'default'} = {}; - $self -> {'helpText'} = ''; - $self -> {'opt'} = {}; - $opt = $self -> {'opt'}; # An alias for $self -> {'opt'}. - $self -> {'type'} = (); - - return bless $self, $class; - -} # End of new. - -# -------------------------------------------------------------------------- - -1; - -# End MySimple.pm - -require "$ENV{T2H_HOME}/MySimple.pm" - if ($0 =~ /\.pl$/ && - -e "$ENV{T2H_HOME}/texi2html.init" && -r "$ENV{T2H_HOME}/texi2html.init"); - -package main; - -#+++############################################################################ -# # -# Constants # -# # -#---############################################################################ - -$DEBUG_TOC = 1; -$DEBUG_INDEX = 2; -$DEBUG_BIB = 4; -$DEBUG_GLOSS = 8; -$DEBUG_DEF = 16; -$DEBUG_HTML = 32; -$DEBUG_USER = 64; -$DEBUG_L2H = 128; - - -$BIBRE = '\[[\w\/-]+\]'; # RE for a bibliography reference -$FILERE = '[\/\w.+-]+'; # RE for a file name -$VARRE = '[^\s\{\}]+'; # RE for a variable name -$NODERE = '[^,:]+'; # RE for a node name -$NODESRE = '[^:]+'; # RE for a list of node names - -$ERROR = "***"; # prefix for errors -$WARN = "**"; # prefix for warnings - - # program home page -$PROTECTTAG = "_ThisIsProtected_"; # tag to recognize protected sections - -$CHAPTEREND = "\n"; # to know where a chpater ends -$SECTIONEND = "\n"; # to know where section ends -$TOPEND = "\n"; # to know where top ends - - - -# -# pre-defined indices -# -$index_properties = -{ - 'c' => { name => 'cp'}, - 'f' => { name => 'fn', code => 1}, - 'v' => { name => 'vr', code => 1}, - 'k' => { name => 'ky', code => 1}, - 'p' => { name => 'pg', code => 1}, - 't' => { name => 'tp', code => 1} -}; - - -%predefined_index = ( - 'cp', 'c', - 'fn', 'f', - 'vr', 'v', - 'ky', 'k', - 'pg', 'p', - 'tp', 't', - ); - -# -# valid indices -# -%valid_index = ( - 'c', 1, - 'f', 1, - 'v', 1, - 'k', 1, - 'p', 1, - 't', 1, - ); - -# -# texinfo section names to level -# -%sec2level = ( - 'top', 0, - 'chapter', 1, - 'unnumbered', 1, - 'majorheading', 1, - 'chapheading', 1, - 'appendix', 1, - 'section', 2, - 'unnumberedsec', 2, - 'heading', 2, - 'appendixsec', 2, - 'appendixsection', 2, - 'subsection', 3, - 'unnumberedsubsec', 3, - 'subheading', 3, - 'appendixsubsec', 3, - 'subsubsection', 4, - 'unnumberedsubsubsec', 4, - 'subsubheading', 4, - 'appendixsubsubsec', 4, - ); - -# -# accent map, TeX command to ISO name -# -%accent_map = ( - '"', 'uml', - '~', 'tilde', - '^', 'circ', - '`', 'grave', - '\'', 'acute', - ); - -# -# texinfo "simple things" (@foo) to HTML ones -# -%simple_map = ( - # cf. makeinfo.c - "*", "
", # HTML+ - " ", " ", - "\t", " ", - "-", "­", # soft hyphen - "\n", "\n", - "|", "", - 'tab', '<\/TD>
Button Name Go to From 1.2.3 go to
-EOT - $about .= - ($T2H_ICONS && $T2H_ACTIVE_ICONS{$button} ? - &$T2H_button_icon_img($button, $T2H_ACTIVE_ICONS{$button}) : - " [" . $T2H_NAVIGATION_TEXT{$button} . "] "); - $about .= < - -$button - -$T2H_BUTTONS_GOTO{$button} - -$T2H_BUTTONS_EXAMPLE{$button} -
', - # spacing commands - ":", "", - "!", "!", - "?", "?", - ".", ".", - "-", "", - ); - -# -# texinfo "things" (@foo{}) to HTML ones -# -%things_map = ( - 'TeX', 'TeX', - 'br', '

', # paragraph break - 'bullet', '*', - 'copyright', '(C)', - 'dots', '...<\/small>', - 'enddots', '....<\/small>', - 'equiv', '==', - 'error', 'error-->', - 'expansion', '==>', - 'minus', '-', - 'point', '-!-', - 'print', '-|', - 'result', '=>', - 'today', $T2H_TODAY, - 'aa', 'å', - 'AA', 'Å', - 'ae', 'æ', - 'oe', 'œ', - 'AE', 'Æ', - 'OE', 'Œ', - 'o', 'ø', - 'O', 'Ø', - 'ss', 'ß', - 'l', '\/l', - 'L', '\/L', - 'exclamdown', '¡', - 'questiondown', '¿', - 'pounds', '£' - ); - -# -# texinfo styles (@foo{bar}) to HTML ones -# -%style_map = ( - 'acronym', '&do_acronym', - 'asis', '', - 'b', 'B', - 'cite', 'CITE', - 'code', 'CODE', - 'command', 'CODE', - 'ctrl', '&do_ctrl', # special case - 'dfn', 'EM', # DFN tag is illegal in the standard - 'dmn', '', # useless - 'email', '&do_email', # insert a clickable email address - 'emph', 'EM', - 'env', 'CODE', - 'file', '"TT', # will put quotes, cf. &apply_style - 'i', 'I', - 'kbd', 'KBD', - 'key', 'KBD', - 'math', '&do_math', - 'option', '"SAMP', # will put quotes, cf. &apply_style - 'r', '', # unsupported - 'samp', '"SAMP', # will put quotes, cf. &apply_style - 'sc', '&do_sc', # special case - 'strong', 'STRONG', - 't', 'TT', - 'titlefont', '', # useless - 'uref', '&do_uref', # insert a clickable URL - 'url', '&do_url', # insert a clickable URL - 'var', 'VAR', - 'w', '', # unsupported - 'H', '&do_accent', - 'dotaccent', '&do_accent', - 'ringaccent','&do_accent', - 'tieaccent', '&do_accent', - 'u','&do_accent', - 'ubaraccent','&do_accent', - 'udotaccent','&do_accent', - 'v', '&do_accent', - ',', '&do_accent', - 'dotless', '&do_accent' - ); - -# -# texinfo format (@foo/@end foo) to HTML ones -# -%format_map = ( - 'quotation', 'BLOCKQUOTE', - # lists - 'itemize', 'UL', - 'enumerate', 'OL', - # poorly supported - 'flushleft', 'PRE', - 'flushright', 'PRE', - ); - -# -# an eval of these $complex_format_map->{what}->[0] yields beginning -# an eval of these $complex_format_map->{what}->[1] yieleds end -$complex_format_map = -{ - example => - [ - q{"$T2H_EXAMPLE_INDENT_CELL
"},
-  q{'
'} - ], - smallexample => - [ - q{"$T2H_SMALL_EXAMPLE_INDENT_CELL
"},
-  q{'
'} - ], - display => - [ - q{"$T2H_EXAMPLE_INDENT_CELL
'},
-  q{'
'} - ], - smalldisplay => - [ - q{"$T2H_SMALL_EXAMPLE_INDENT_CELL
'},
-  q{'
'} - ] -}; - -$complex_format_map->{lisp} = $complex_format_map->{example}; -$complex_format_map->{smalllisp} = $complex_format_map->{smallexample}; -$complex_format_map->{format} = $complex_format_map->{display}; -$complex_format_map->{smallformat} = $complex_format_map->{smalldisplay}; - -# -# texinfo definition shortcuts to real ones -# -%def_map = ( - # basic commands - 'deffn', 0, - 'defvr', 0, - 'deftypefn', 0, - 'deftypevr', 0, - 'defcv', 0, - 'defop', 0, - 'deftp', 0, - # basic x commands - 'deffnx', 0, - 'defvrx', 0, - 'deftypefnx', 0, - 'deftypevrx', 0, - 'defcvx', 0, - 'defopx', 0, - 'deftpx', 0, - # shortcuts - 'defun', 'deffn Function', - 'defmac', 'deffn Macro', - 'defspec', 'deffn {Special Form}', - 'defvar', 'defvr Variable', - 'defopt', 'defvr {User Option}', - 'deftypefun', 'deftypefn Function', - 'deftypevar', 'deftypevr Variable', - 'defivar', 'defcv {Instance Variable}', - 'deftypeivar', 'defcv {Instance Variable}', # NEW: FIXME - 'defmethod', 'defop Method', - 'deftypemethod', 'defop Method', # NEW:FIXME - # x shortcuts - 'defunx', 'deffnx Function', - 'defmacx', 'deffnx Macro', - 'defspecx', 'deffnx {Special Form}', - 'defvarx', 'defvrx Variable', - 'defoptx', 'defvrx {User Option}', - 'deftypefunx', 'deftypefnx Function', - 'deftypevarx', 'deftypevrx Variable', - 'defivarx', 'defcvx {Instance Variable}', - 'defmethodx', 'defopx Method', - ); - -# -# things to skip -# -%to_skip = ( - # comments - 'c', 1, - 'comment', 1, - 'ifnotinfo', 1, - 'ifnottex', 1, - 'ifhtml', 1, - 'end ifhtml', 1, - 'end ifnotinfo', 1, - 'end ifnottex', 1, - # useless - 'detailmenu', 1, - 'direntry', 1, - 'contents', 1, - 'shortcontents', 1, - 'summarycontents', 1, - 'footnotestyle', 1, - 'end ifclear', 1, - 'end ifset', 1, - 'titlepage', 1, - 'end titlepage', 1, - # unsupported commands (formatting) - 'afourpaper', 1, - 'cropmarks', 1, - 'finalout', 1, - 'headings', 1, - 'sp', 1, - 'need', 1, - 'page', 1, - 'setchapternewpage', 1, - 'everyheading', 1, - 'everyfooting', 1, - 'evenheading', 1, - 'evenfooting', 1, - 'oddheading', 1, - 'oddfooting', 1, - 'smallbook', 1, - 'vskip', 1, - 'filbreak', 1, - 'paragraphindent', 1, - # unsupported formats - 'cartouche', 1, - 'end cartouche', 1, - 'group', 1, - 'end group', 1, - ); - -#+++############################################################################ -# # -# Argument parsing, initialisation # -# # -#---############################################################################ - -# -# flush stdout and stderr after every write -# -select(STDERR); -$| = 1; -select(STDOUT); -$| = 1; - - -%value = (); # hold texinfo variables, see also -D -$use_bibliography = 1; -$use_acc = 1; - -# -# called on -init-file -sub LoadInitFile -{ - my $init_file = shift; - # second argument is value of options - $init_file = shift; - if (-f $init_file) - { - print "# reading initialization file from $init_file\n" - if ($T2H_VERBOSE); - require($init_file); - } - else - { - print "$ERROR Error: can't read init file $int_file\n"; - $init_file = ''; - } -} - -# -# called on -lang -sub SetDocumentLanguage -{ - my $lang = shift; - if (! exists($T2H_WORDS->{$lang})) - { - warn "$ERROR: Language specs for '$lang' do not exists. Reverting to '" . - ($T2H_LANG ? T2H_LANG : "en") . "'\n"; - } - else - { - print "# using '$lang' as document language\n" if ($T2H_VERBOSE); - $T2H_LANG = $lang; - } -} - -## -## obsolete cmd line options -## -$T2H_OBSOLETE_OPTIONS -> {'no-section_navigation'} = -{ - type => '!', - linkage => sub {$main::T2H_SECTION_NAVIGATION = 0;}, - verbose => 'obsolete, use -nosec_nav', - noHelp => 2, -}; -$T2H_OBSOLETE_OPTIONS -> {use_acc} = -{ - type => '!', - linkage => \$use_acc, - verbose => 'obsolete', - noHelp => 2 -}; -$T2H_OBSOLETE_OPTIONS -> {expandinfo} = -{ - type => '!', - linkage => sub {$main::T2H_EXPAND = 'info';}, - verbose => 'obsolete, use "-expand info" instead', - noHelp => 2, -}; -$T2H_OBSOLETE_OPTIONS -> {expandtex} = -{ - type => '!', - linkage => sub {$main::T2H_EXPAND = 'tex';}, - verbose => 'obsolete, use "-expand tex" instead', - noHelp => 2, -}; -$T2H_OBSOLETE_OPTIONS -> {monolithic} = -{ - type => '!', - linkage => sub {$main::T2H_SPLIT = '';}, - verbose => 'obsolete, use "-split no" instead', - noHelp => 2 -}; -$T2H_OBSOLETE_OPTIONS -> {split_node} = -{ - type => '!', - linkage => sub{$main::T2H_SPLIT = 'section';}, - verbose => 'obsolete, use "-split section" instead', - noHelp => 2, -}; -$T2H_OBSOLETE_OPTIONS -> {split_chapter} = -{ - type => '!', - linkage => sub{$main::T2H_SPLIT = 'chapter';}, - verbose => 'obsolete, use "-split chapter" instead', - noHelp => 2, -}; -$T2H_OBSOLETE_OPTIONS -> {no_verbose} = -{ - type => '!', - linkage => sub {$main::T2H_VERBOSE = 0;}, - verbose => 'obsolete, use -noverbose instead', - noHelp => 2, -}; -$T2H_OBSOLETE_OPTIONS -> {output_file} = -{ - type => '=s', - linkage => sub {$main::T2H_OUT = @_[1]; $T2H_SPLIT = '';}, - verbose => 'obsolete, use -out_file instead', - noHelp => 2 -}; - -$T2H_OBSOLETE_OPTIONS -> {section_navigation} = -{ - type => '!', - linkage => \$T2H_SECTION_NAVIGATION, - verbose => 'obsolete, use -sec_nav instead', - noHelp => 2, -}; - -$T2H_OBSOLETE_OPTIONS -> {verbose} = -{ - type => '!', - linkage => \$T2H_VERBOSE, - verbose => 'obsolete, use -Verbose instead', - noHelp => 2 -}; - -# read initialzation from $sysconfdir/texi2htmlrc or $HOME/.texi2htmlrc -my $home = $ENV{HOME}; -defined($home) or $home = ''; -foreach $i ('/usr/local/etc/texi2htmlrc', "$home/.texi2htmlrc") { - if (-f $i) { - print "# reading initialization file from $i\n" - if ($T2H_VERBOSE); - require($i); - } -} - - -#+++############################################################################ -# # -# parse command-line options -# # -#---############################################################################ -$T2H_USAGE_TEXT = <getOptions($T2H_OPTIONS, $T2H_USAGE_TEXT, "$THISVERSION\n")) -{ - print $Configure_failed if $Configure_failed; - die $T2H_FAILURE_TEXT; -} - -if (@ARGV > 1) -{ - eval {Getopt::Long::Configure("no_pass_through");}; - if (! $options->getOptions($T2H_OBSOLETE_OPTIONS, $T2H_USAGE_TEXT, "$THISVERSION\n")) - { - print $Configure_failed if $Configure_failed; - die $T2H_FAILURE_TEXT; - } -} - -if ($T2H_CHECK) { - die "Need file to check\n$T2H_FAILURE_TEXT" unless @ARGV > 0; - ✓ - exit; -} - -#+++############################################################################ -# # -# evaluation of cmd line options -# # -#---############################################################################ - -if ($T2H_EXPAND eq 'info') -{ - $to_skip{'ifinfo'} = 1; - $to_skip{'end ifinfo'} = 1; -} -elsif ($T2H_EXPAND eq 'tex') -{ - $to_skip{'iftex'} = 1; - $to_skip{'end iftex'} = 1; - -} - -$T2H_INVISIBLE_MARK = '' if $T2H_INVISIBLE_MARK eq 'xbm'; - -# -# file name buisness -# -die "Need exactly one file to translate\n$T2H_FAILURE_TEXT" unless @ARGV == 1; -$docu = shift(@ARGV); -if ($docu =~ /.*\//) { - chop($docu_dir = $&); - $docu_name = $'; -} else { - $docu_dir = '.'; - $docu_name = $docu; -} -unshift(@T2H_INCLUDE_DIRS, $docu_dir); -$docu_name =~ s/\.te?x(i|info)?$//; # basename of the document -$docu_name = $T2H_PREFIX if ($T2H_PREFIX); - -# subdir -if ($T2H_SUBDIR && ! $T2H_OUT) -{ - $T2H_SUBDIR =~ s|/*$||; - unless (-d "$T2H_SUBDIR" && -w "$T2H_SUBDIR") - { - if ( mkdir($T2H_SUBDIR, oct(755))) - { - print "# created directory $T2H_SUBDIR\n" if ($T2H_VERBOSE); - } - else - { - warn "$ERROR can't create directory $T2H_SUBDIR. Put results into current directory\n"; - $T2H_SUBDIR = ''; - } - } -} - -if ($T2H_SUBDIR && ! $T2H_OUT) -{ - $docu_rdir = "$T2H_SUBDIR/"; - print "# putting result files into directory $docu_rdir\n" if ($T2H_VERBOSE); -} -else -{ - if ($T2H_OUT && $T2H_OUT =~ m|(.*)/|) - { - $docu_rdir = "$1/"; - print "# putting result files into directory $docu_rdir\n" if ($T2H_VERBOSE); - } - else - { - print "# putting result files into current directory \n" if ($T2H_VERBOSE); - $docu_rdir = ''; - } -} - -# extension -if ($T2H_SHORTEXTN) -{ - $docu_ext = "htm"; -} -else -{ - $docu_ext = "html"; -} -if ($T2H_TOP_FILE =~ /\..*$/) -{ - $T2H_TOP_FILE = $`.".$docu_ext"; -} - -# result files -if (! $T2H_OUT && ($T2H_SPLIT =~ /section/i || $T2H_SPLIT =~ /node/i)) -{ - $T2H_SPLIT = 'section'; -} -elsif (! $T2H_OUT && $T2H_SPLIT =~ /chapter/i) -{ - $T2H_SPLIT = 'chapter' -} -else -{ - undef $T2H_SPLIT; -} - -$docu_doc = "$docu_name.$docu_ext"; # document's contents -$docu_doc_file = "$docu_rdir$docu_doc"; -if ($T2H_SPLIT) -{ - $docu_toc = $T2H_TOC_FILE || "${docu_name}_toc.$docu_ext"; # document's table of contents - $docu_stoc = "${docu_name}_ovr.$docu_ext"; # document's short toc - $docu_foot = "${docu_name}_fot.$docu_ext"; # document's footnotes - $docu_about = "${docu_name}_abt.$docu_ext"; # about this document - $docu_top = $T2H_TOP_FILE || $docu_doc; -} -else -{ - if ($T2H_OUT) - { - $docu_doc = $T2H_OUT; - $docu_doc =~ s|.*/||; - } - $docu_toc = $docu_foot = $docu_stoc = $docu_about = $docu_top = $docu_doc; -} - -$docu_toc_file = "$docu_rdir$docu_toc"; -$docu_stoc_file = "$docu_rdir$docu_stoc"; -$docu_foot_file = "$docu_rdir$docu_foot"; -$docu_about_file = "$docu_rdir$docu_about"; -$docu_top_file = "$docu_rdir$docu_top"; - -$docu_frame_file = "$docu_rdir${docu_name}_frame.$docu_ext"; -$docu_toc_frame_file = "$docu_rdir${docu_name}_toc_frame.$docu_ext"; - -# -# variables -# -$value{'html'} = 1; # predefine html (the output format) -$value{'texi2html'} = $THISVERSION; # predefine texi2html (the translator) -# _foo: internal to track @foo -foreach ('_author', '_title', '_subtitle', - '_settitle', '_setfilename', '_shorttitle') { - $value{$_} = ''; # prevent -w warnings -} -%node2sec = (); # node to section name -%sec2node = (); # section to node name -%sec2number = (); # section to number -%number2sec = (); # number to section -%idx2node = (); # index keys to node -%node2href = (); # node to HREF -%node2next = (); # node to next -%node2prev = (); # node to prev -%node2up = (); # node to up -%bib2href = (); # bibliography reference to HREF -%gloss2href = (); # glossary term to HREF -@sections = (); # list of sections -%tag2pro = (); # protected sections - -# -# initial indexes -# -$bib_num = 0; -$foot_num = 0; -$gloss_num = 0; -$idx_num = 0; -$sec_num = 0; -$doc_num = 0; -$html_num = 0; - -# -# can I use ISO8879 characters? (HTML+) -# -if ($T2H_USE_ISO) { - $things_map{'bullet'} = "•"; - $things_map{'copyright'} = "©"; - $things_map{'dots'} = "…"; - $things_map{'equiv'} = "≡"; - $things_map{'expansion'} = "→"; - $things_map{'point'} = "∗"; - $things_map{'result'} = "⇒"; -} - -# -# read texi2html extensions (if any) -# -$extensions = 'texi2html.ext'; # extensions in working directory -if (-f $extensions) { - print "# reading extensions from $extensions\n" if $T2H_VERBOSE; - require($extensions); -} -($progdir = $0) =~ s/[^\/]+$//; -if ($progdir && ($progdir ne './')) { - $extensions = "${progdir}texi2html.ext"; # extensions in texi2html directory - if (-f $extensions) { - print "# reading extensions from $extensions\n" if $T2H_VERBOSE; - require($extensions); - } -} - - -print "# reading from $docu\n" if $T2H_VERBOSE; - -######################################################################### -# -# latex2html stuff -# -# latex2html conversions consist of three stages: -# 1) ToLatex: Put "latex" code into a latex file -# 2) ToHtml: Use latex2html to generate corresponding html code and images -# 3) FromHtml: Extract generated code and images from latex2html run -# - -########################## -# default settings -# - -# defaults for files and names - -sub l2h_Init -{ - local($root) = @_; - - return 0 unless ($root); - - $l2h_name = "${root}_l2h"; - - $l2h_latex_file = "$docu_rdir${l2h_name}.tex"; - $l2h_cache_file = "${docu_rdir}l2h_cache.pm"; - $T2H_L2H_L2H = "latex2html" unless ($T2H_L2H_L2H); - - # destination dir -- generated images are put there, should be the same - # as dir of enclosing html document -- - $l2h_html_file = "$docu_rdir${l2h_name}.html"; - $l2h_prefix = "${l2h_name}_"; - return 1; -} - - -########################## -# -# First stage: Generation of Latex file -# Initialize with: l2h_InitToLatex -# Add content with: l2h_ToLatex($text) --> HTML placeholder comment -# Finish with: l2h_FinishToLatex -# - -$l2h_latex_preample = <$l2h_latex_file")) - { - warn "$ERROR Error l2h: Can't open latex file '$latex_file' for writing\n"; - return 0; - } - print "# l2h: use ${l2h_latex_file} as latex file\n" if ($T2H_VERBOSE); - print L2H_LATEX $l2h_latex_preample; - } - # open database for caching - l2h_InitCache(); - $l2h_latex_count = 0; - $l2h_to_latex_count = 0; - $l2h_cached_count = 0; - return 1; -} - -# print text (1st arg) into latex file (if not already there), return -# HTML commentary which can be later on replaced by the latex2html -# generated text -sub l2h_ToLatex -{ - my($text) = @_; - my($count); - - $l2h_to_latex_count++; - $text =~ s/(\s*)$//; - - # try whether we can cache it - my $cached_text = l2h_FromCache($text); - if ($cached_text) - { - $l2h_cached_count++; - return $cached_text; - } - - # try whether we have text already on things to do - unless ($count = $l2h_to_latex{$text}) - { - $count = $l2h_latex_count; - $l2h_latex_count++; - $l2h_to_latex{$text} = $count; - $l2h_to_latex[$count] = $text; - unless ($T2H_L2H_SKIP) - { - print L2H_LATEX "\\begin{rawhtml}\n"; - print L2H_LATEX "\n"; - print L2H_LATEX "\\end{rawhtml}\n"; - - print L2H_LATEX "$text\n"; - - print L2H_LATEX "\\begin{rawhtml}\n"; - print L2H_LATEX "\n"; - print L2H_LATEX "\\end{rawhtml}\n"; - } - } - return ""; -} - -# print closing into latex file and close it -sub l2h_FinishToLatex -{ - local ($reused); - - $reused = $l2h_to_latex_count - $l2h_latex_count - $l2h_cached_count; - unless ($T2H_L2H_SKIP) - { - print L2H_LATEX $l2h_latex_closing; - close(L2H_LATEX); - } - print "# l2h: finished to latex ($l2h_cached_count cached, $reused reused, $l2h_latex_count contents)\n" if ($T2H_VERBOSE); - unless ($l2h_latex_count) - { - l2h_Finish(); - return 0; - } - return 1; -} - -################################### -# Second stage: Use latex2html to generate corresponding html code and images -# -# l2h_ToHtml([$l2h_latex_file, [$l2h_html_dir]]): -# Call latex2html on $l2h_latex_file -# Put images (prefixed with $l2h_name."_") and html file(s) in $l2h_html_dir -# Return 1, on success -# 0, otherwise -# -sub l2h_ToHtml -{ - local($call, $ext, $root, $dotbug); - - if ($T2H_L2H_SKIP) - { - print "# l2h: skipping latex2html run\n" if ($T2H_VERBOSE); - return 1; - } - - # Check for dot in directory where dvips will work - if ($T2H_L2H_TMP) - { - if ($T2H_L2H_TMP =~ /\./) - { - warn "$ERROR Warning l2h: l2h_tmp dir contains a dot. Use /tmp, instead\n"; - $dotbug = 1; - } - } - else - { - if (&getcwd =~ /\./) - { - warn "$ERROR Warning l2h: current dir contains a dot. Use /tmp as l2h_tmp dir \n"; - $dotbug = 1; - } - } - # fix it, if necessary and hope that it works - $T2H_L2H_TMP = "/tmp" if ($dotbug); - - $call = $T2H_L2H_L2H; - # use init file, if specified - $call = $call . " -init_file " . $init_file if ($init_file && -f $init_file); - # set output dir - $call .= ($docu_rdir ? " -dir $docu_rdir" : " -no_subdir"); - # use l2h_tmp, if specified - $call = $call . " -tmp $T2H_L2H_TMP" if ($T2H_L2H_TMP); - # options we want to be sure of - $call = $call ." -address 0 -info 0 -split 0 -no_navigation -no_auto_link"; - $call = $call ." -prefix ${l2h_prefix} $l2h_latex_file"; - - print "# l2h: executing '$call'\n" if ($T2H_VERBOSE); - if (system($call)) - { - warn "l2h ***Error: '${call}' did not succeed\n"; - return 0; - } - else - { - print "# l2h: latex2html finished successfully\n" if ($T2H_VERBOSE); - return 1; - } -} - -# this is directly pasted over from latex2html -sub getcwd { - local($_) = `pwd`; - - die "'pwd' failed (out of memory?)\n" - unless length; - chop; - $_; -} - - -########################## -# Third stage: Extract generated contents from latex2html run -# Initialize with: l2h_InitFromHtml -# open $l2h_html_file for reading -# reads in contents into array indexed by numbers -# return 1, on success -- 0, otherwise -# Extract Html code with: l2h_FromHtml($text) -# replaces in $text all previosuly inserted comments by generated html code -# returns (possibly changed) $text -# Finish with: l2h_FinishFromHtml -# closes $l2h_html_dir/$l2h_name.".$docu_ext" - -sub l2h_InitFromHtml -{ - local($h_line, $h_content, $count, %l2h_img); - - if (! open(L2H_HTML, "<${l2h_html_file}")) - { - print "$ERROR Error l2h: Can't open ${l2h_html_file} for reading\n"; - return 0; - } - print "# l2h: use ${l2h_html_file} as html file\n" if ($T2H_VERBOSE); - - $l2h_html_count = 0; - - while ($h_line = ) - { - if ($h_line =~ /^/) - { - $count = $1; - $h_content = ""; - while ($h_line = ) - { - if ($h_line =~ /^/) - { - chomp $h_content; - chomp $h_content; - $l2h_html_count++; - $h_content = l2h_ToCache($count, $h_content); - $l2h_from_html[$count] = $h_content; - $h_content = ''; - last; - } - $h_content = $h_content.$h_line; - } - if ($hcontent) - { - print "$ERROR Warning l2h: l2h_end $l2h_name $count not found\n" - if ($T2H_VERBOSE); - close(L2H_HTML); - return 0; - } - } - } - print "# l2h: Got $l2h_html_count of $l2h_latex_count html contents\n" - if ($T2H_VERBOSE); - - close(L2H_HTML); - return 1; -} - -sub l2h_FromHtml -{ - local($text) = @_; - local($done, $to_do, $count); - - $to_do = $text; - - while ($to_do =~ /([^\000]*)([^\000]*)/) - { - $to_do = $1; - $count = $2; - $done = $3.$done; - - $done = "".$done - if ($T2H_DEBUG & $DEBUG_L2H); - - $done = &l2h_ExtractFromHtml($count) . $done; - - $done = "".$done - if ($T2H_DEBUG & $DEBUG_L2H); - } - return $to_do.$done; -} - - -sub l2h_ExtractFromHtml -{ - local($count) = @_; - - return $l2h_from_html[$count] if ($l2h_from_html[$count]); - - if ($count >= 0 && $count < $l2h_latex_count) - { - # now we are in trouble - local($l_l2h, $_); - - $l2h_extract_error++; - print "$ERROR l2h: can't extract content $count from html\n" - if ($T2H_VERBOSE); - # try simple (ordinary) substition (without l2h) - $l_l2h = $T2H_L2H; - $T2H_L2H = 0; - $_ = $l2h_to_latex{$count}; - $_ = &substitute_style($_); - &unprotect_texi; - $_ = "" . $_ - if ($T2H_DEBUG & $DEBUG_L2H); - $T2H_L2H = $l_l2h; - return $_; - } - else - { - # now we have been incorrectly called - $l2h_range_error++; - print "$ERROR l2h: Request of $count content which is out of valide range [0,$l2h_latex_count)\n"; - return "" - if ($T2H_DEBUG & $DEBUG_L2H); - return ""; - } -} - -sub l2h_FinishFromHtml -{ - if ($T2H_VERBOSE) - { - if ($l2h_extract_error + $l2h_range_error) - { - print "# l2h: finished from html ($l2h_extract_error extract and $l2h_range_error errors)\n"; - } - else - { - print "# l2h: finished from html (no errors)\n"; - } - } -} - -sub l2h_Finish -{ - l2h_StoreCache(); - if ($T2H_L2H_CLEAN) - { - print "# l2h: removing temporary files generated by l2h extension\n" - if $T2H_VERBOSE; - while (<"$docu_rdir$l2h_name"*>) - { - unlink $_; - } - } - print "# l2h: Finished\n" if $T2H_VERBOSE; - return 1; -} - -############################## -# stuff for l2h caching -# - -# I tried doing this with a dbm data base, but it did not store all -# keys/values. Hence, I did as latex2html does it -sub l2h_InitCache -{ - if (-r "$l2h_cache_file") - { - my $rdo = do "$l2h_cache_file"; - warn("$ERROR l2h Error: could not load $docu_rdir$l2h_cache_file: $@\n") - unless ($rdo); - } -} - -sub l2h_StoreCache -{ - return unless $l2h_latex_count; - - my ($key, $value); - open(FH, ">$l2h_cache_file") || return warn"$ERROR l2h Error: could not open $docu_rdir$l2h_cache_file for writing: $!\n"; - - - while (($key, $value) = each %l2h_cache) - { - # escape stuff - $key =~ s|/|\\/|g; - $key =~ s|\\\\/|\\/|g; - # weird, a \ at the end of the key results in an error - # maybe this also broke the dbm database stuff - $key =~ s|\\$|\\\\|; - $value =~ s/\|/\\\|/g; - $value =~ s/\\\\\|/\\\|/g; - $value =~ s|\\\\|\\\\\\\\|g; - print FH "\n\$l2h_cache_key = q/$key/;\n"; - print FH "\$l2h_cache{\$l2h_cache_key} = q|$value|;\n"; - } - print FH "1;"; - close(FH); -} - -# return cached html, if it exists for text, and if all pictures -# are there, as well -sub l2h_FromCache -{ - my $text = shift; - my $cached = $l2h_cache{$text}; - if ($cached) - { - while ($cached =~ m/SRC="(.*?)"/g) - { - unless (-e "$docu_rdir$1") - { - return undef; - } - } - return $cached; - } - return undef; -} - -# insert generated html into cache, move away images, -# return transformed html -$maximage = 1; -sub l2h_ToCache -{ - my $count = shift; - my $content = shift; - my @images = ($content =~ /SRC="(.*?)"/g); - my ($src, $dest); - - for $src (@images) - { - $dest = $l2h_img{$src}; - unless ($dest) - { - my $ext; - if ($src =~ /.*\.(.*)$/ && $1 ne $docu_ext) - { - $ext = $1; - } - else - { - warn "$ERROR: L2h image $src has invalid extension\n"; - next; - } - while (-e "$docu_rdir${docu_name}_$maximage.$ext") { $maximage++;} - $dest = "${docu_name}_$maximage.$ext"; - system("cp -f $docu_rdir$src $docu_rdir$dest"); - $l2h_img{$src} = $dest; - unlink "$docu_rdir$src" unless ($DEBUG & DEBUG_L2H); - } - $content =~ s/$src/$dest/g; - } - $l2h_cache{$l2h_to_latex[$count]} = $content; - return $content; -} - - -#+++############################################################################ -# # -# Pass 1: read source, handle command, variable, simple substitution # -# # -#---############################################################################ - -@lines = (); # whole document -@toc_lines = (); # table of contents -@stoc_lines = (); # table of contents -$curlevel = 0; # current level in TOC -$node = ''; # current node name -$node_next = ''; # current node next name -$node_prev = ''; # current node prev name -$node_up = ''; # current node up name -$in_table = 0; # am I inside a table -$table_type = ''; # type of table ('', 'f', 'v', 'multi') -@tables = (); # nested table support -$in_bibliography = 0; # am I inside a bibliography -$in_glossary = 0; # am I inside a glossary -$in_top = 0; # am I inside the top node -$has_top = 0; # did I see a top node? -$has_top_command = 0; # did I see @top for automatic pointers? -$in_pre = 0; # am I inside a preformatted section -$in_list = 0; # am I inside a list -$in_html = 0; # am I inside an HTML section -$first_line = 1; # is it the first line -$dont_html = 0; # don't protect HTML on this line -$deferred_ref = ''; # deferred reference for indexes -@html_stack = (); # HTML elements stack -$html_element = ''; # current HTML element -&html_reset; -%macros = (); # macros - -# init l2h -$T2H_L2H = &l2h_Init($docu_name) if ($T2H_L2H); -$T2H_L2H = &l2h_InitToLatex if ($T2H_L2H); - -# build code for simple substitutions -# the maps used (%simple_map and %things_map) MUST be aware of this -# watch out for regexps, / and escaped characters! -$subst_code = ''; -foreach (keys(%simple_map)) { - ($re = $_) =~ s/(\W)/\\$1/g; # protect regexp chars - $subst_code .= "s/\\\@$re/$simple_map{$_}/g;\n"; -} -foreach (keys(%things_map)) { - $subst_code .= "s/\\\@$_\\{\\}/$things_map{$_}/g;\n"; -} -if ($use_acc) { - # accentuated characters - foreach (keys(%accent_map)) { - if ($_ eq "`") { - $subst_code .= "s/$;3"; - } elsif ($_ eq "'") { - $subst_code .= "s/$;4"; - } else { - $subst_code .= "s/\\\@\\$_"; - } - $subst_code .= "([a-z])/&\${1}$accent_map{$_};/gi;\n"; - } -} -eval("sub simple_substitutions { $subst_code }"); - -&init_input; -INPUT_LINE: while ($_ = &next_line) { - # - # remove \input on the first lines only - # - if ($first_line) { - next if /^\\input/; - $first_line = 0; - } - # non-@ substitutions cf. texinfmt.el - # - # parse texinfo tags - # - $tag = ''; - $end_tag = ''; - if (/^\s*\@end\s+(\w+)\b/) { - $end_tag = $1; - } elsif (/^\s*\@(\w+)\b/) { - $tag = $1; - } - # - # handle @html / @end html - # - if ($in_html) { - if ($end_tag eq 'html') { - $in_html = 0; - } else { - $tag2pro{$in_html} .= $_; - } - next; - } elsif ($tag eq 'html') { - $in_html = $PROTECTTAG . ++$html_num; - push(@lines, $in_html); - next; - } - - # - # try to remove inlined comments - # syntax from tex-mode.el comment-start-skip - # - s/((^|[^\@])(\@\@)*)\@c(omment | |\{|$).*/$1/; - -# Sometimes I use @c right at the end of a line ( to suppress the line feed ) -# s/((^|[^\@])(\@\@)*)\@c(omment)?$/$1/; -# s/((^|[^\@])(\@\@)*)\@c(omment)? .*/$1/; -# s/(.*)\@c{.*?}(.*)/$1$2/; -# s/(.*)\@comment{.*?}(.*)/$1$2/; -# s/^(.*)\@c /$1/; -# s/^(.*)\@comment /$1/; - - ############################################################# - # value substitution before macro expansion, so that - # it works in macro arguments - s/\@value{($VARRE)}/$value{$1}/eg; - - ############################################################# - # macro substitution - while (/\@(\w+)/g) - { - if (exists($macros->{$1})) - { - my $before = $`; - my $name = $1; - my $after = $'; - my @args; - my $args; - if ($after =~ /^\s*{(.*?[^\\])}(.*)/) - { - $args = $1; - $after = $2; - } - elsif (@{$macros->{$name}->{Args}} == 1) - { - $args = $after; - $args =~ s/^\s*//; - $args =~ s/\s*$//; - $after = ''; - } - $args =~ s|\\\\|\\|g; - $args =~ s|\\{|{|g; - $args =~ s|\\}|}|g; - if (@{$macros->{$name}->{Args}} > 1) - { - $args =~ s/(^|[^\\]),/$1$;/g ; - $args =~ s|\\,|,|g; - @args = split(/$;\s*/, $args) if (@{$macros->{$name}->{Args}} > 1); - } - else - { - $args =~ s|\\,|,|g; - @args = ($args); - } - my $macrobody = $macros->{$name}->{Body}; - for ($i=0; $i<=$#args; $i++) - { - $macrobody =~ s|\\$macros->{$name}->{Args}->[$i]\\|$args[$i]|g; - } - $macrobody =~ s|\\\\|\\|g; - $_ = $before . $macrobody . $after; - unshift @input_spool, map {$_ = $_."\n"} split(/\n/, $_); - next INPUT_LINE; - } - } # - - - # - # try to skip the line - # - if ($end_tag) { - $in_titlepage = 0 if $end_tag eq 'titlepage'; - next if $to_skip{"end $end_tag"}; - } elsif ($tag) { - $in_titlepage = 1 if $tag eq 'titlepage'; - next if $to_skip{$tag}; - last if $tag eq 'bye'; - } - if ($in_top) { - # parsing the top node - if ($tag eq 'node' || - ($sec2level{$tag} && $tag !~ /unnumbered/ && $tag !~ /heading/)) - { - # no more in top - $in_top = 0; - push(@lines, $TOPEND); - } - } - unless ($in_pre) { - s/``/\"/g; - s/''/\"/g; - s/([\w ])---([\w ])/$1--$2/g; - } - # - # analyze the tag - # - if ($tag) { - # skip lines - &skip_until($tag), next if $tag eq 'ignore'; - &skip_until($tag), next if $tag eq 'ifnothtml'; - if ($tag eq 'ifinfo') - { - &skip_until($tag), next unless $T2H_EXPAND eq 'info'; - } - if ($tag eq 'iftex') - { - &skip_until($tag), next unless $T2H_EXPAND eq 'tex'; - } - if ($tag eq 'tex') - { - # add to latex2html file - if ($T2H_EXPAND eq 'tex' && $T2H_L2H && ! $in_pre) - { - # add space to the end -- tex(i2dvi) does this, as well - push(@lines, &l2h_ToLatex(&string_until($tag) . " ")); - } - else - { - &skip_until($tag); - } - next; - } - if ($tag eq 'titlepage') - { - next; - } - # handle special tables - if ($tag =~ /^(|f|v|multi)table$/) { - $table_type = $1; - $tag = 'table'; - } - # special cases - if ($tag eq 'top' || ($tag eq 'node' && /^\@node\s+top\s*,/i)) { - $in_top = 1; - $has_top = 1; - $has_top_command = 1 if $tag eq 'top'; - @lines = (); # ignore all lines before top (title page garbage) - next; - } elsif ($tag eq 'node') { - if ($in_top) - { - $in_top = 0; - push(@lines, $TOPEND); - } - warn "$ERROR Bad node line: $_" unless $_ =~ /^\@node\s$NODESRE$/o; - # request of "Richard Y. Kim" - s/^\@node\s+//; - $_ = &protect_html($_); # if node contains '&' for instance - ($node, $node_next, $node_prev, $node_up) = split(/,/); - &normalise_node($node); - &normalise_node($node_next); - &normalise_node($node_prev); - &normalise_node($node_up); - $node =~ /\"/ ? - push @lines, &html_debug("\n", __LINE__) : - push @lines, &html_debug("\n", __LINE__); - next; - } elsif ($tag eq 'include') { - if (/^\@include\s+($FILERE)\s*$/o) { - $file = LocateIncludeFile($1); - if ($file && -e $file) { - &open($file); - print "# including $file\n" if $T2H_VERBOSE; - } else { - warn "$ERROR Can't find $1, skipping"; - } - } else { - warn "$ERROR Bad include line: $_"; - } - next; - } elsif ($tag eq 'ifclear') { - if (/^\@ifclear\s+($VARRE)\s*$/o) { - next unless defined($value{$1}); - &skip_until($tag); - } else { - warn "$ERROR Bad ifclear line: $_"; - } - next; - } elsif ($tag eq 'ifset') { - if (/^\@ifset\s+($VARRE)\s*$/o) { - next if defined($value{$1}); - &skip_until($tag); - } else { - warn "$ERROR Bad ifset line: $_"; - } - next; - } elsif ($tag eq 'menu') { - unless ($T2H_SHOW_MENU) { - &skip_until($tag); - next; - } - &html_push_if($tag); - push(@lines, &html_debug('', __LINE__)); - } elsif ($format_map{$tag}) { - $in_pre = 1 if $format_map{$tag} eq 'PRE'; - &html_push_if($format_map{$tag}); - push(@lines, &html_debug('', __LINE__)); - $in_list++ if $format_map{$tag} eq 'UL' || $format_map{$tag} eq 'OL' ; -# push(@lines, &debug("

\n", __LINE__)) -# if $tag =~ /example/i; - # sunshine@sunshineco.com:
bla
looks better than - #
\nbla
(at least on NeXTstep browser - push(@lines, &debug("<$format_map{$tag}>" . - ($in_pre ? '' : "\n"), __LINE__)); - next; - } - elsif (exists $complex_format_map->{$tag}) - { - my $start = eval $complex_format_map->{$tag}->[0]; - if ($@) - { - print "$ERROR: eval of complex_format_map->{$tag}->[0] $complex_format_map->{$tag}->[0]: $@"; - $start = '
'
-	  }
-	  $in_pre = 1 if $start =~ /
\n", __LINE__));
-		    &html_push_if('TABLE');
-		} else {
-		    push(@lines, &debug("
\n", __LINE__)); - &html_push_if('DL'); - } - push(@lines, &html_debug('', __LINE__)); - } else { - warn "$ERROR Bad table line: $_"; - } - next; - } - elsif ($tag eq 'synindex' || $tag eq 'syncodeindex') - { - if (/^\@$tag\s+(\w+)\s+(\w+)\s*$/) - { - my $from = $1; - my $to = $2; - my $prefix_from = IndexName2Prefix($from); - my $prefix_to = IndexName2Prefix($to); - - warn("$ERROR unknown from index name $from ind syn*index line: $_"), next - unless $prefix_from; - warn("$ERROR unknown to index name $to ind syn*index line: $_"), next - unless $prefix_to; - - if ($tag eq 'syncodeindex') - { - $index_properties->{$prefix_to}->{'from_code'}->{$prefix_from} = 1; - } - else - { - $index_properties->{$prefix_to}->{'from'}->{$prefix_from} = 1; - } - } - else - { - warn "$ERROR Bad syn*index line: $_"; - } - next; - } - elsif ($tag eq 'defindex' || $tag eq 'defcodeindex') - { - if (/^\@$tag\s+(\w+)\s*$/) - { - my $name = $1; - $index_properties->{$name}->{name} = $name; - $index_properties->{$name}->{code} = 1 if $tag eq 'defcodeindex'; - } - else - { - warn "$ERROR Bad defindex line: $_"; - } - next; - } - elsif (/^\@printindex/) - { - push (@lines, "$_"); - next; - } - elsif ($tag eq 'sp') { - push(@lines, &debug("

\n", __LINE__)); - next; - } elsif ($tag eq 'center') { - push(@lines, &debug("

\n", __LINE__)); - s/\@center//; - } elsif ($tag eq 'setref') { - &protect_html; # if setref contains '&' for instance - if (/^\@$tag\s*{($NODERE)}\s*$/) { - $setref = $1; - $setref =~ s/\s+/ /g; # normalize - $setref =~ s/ $//; - $node2sec{$setref} = $name; - $sec2node{$name} = $setref; - $node2href{$setref} = "$docu_doc#$docid"; - } else { - warn "$ERROR Bad setref line: $_"; - } - next; - } elsif ($tag eq 'lowersections') { - local ($sec, $level); - while (($sec, $level) = each %sec2level) { - $sec2level{$sec} = $level + 1; - } - next; - } elsif ($tag eq 'raisesections') { - local ($sec, $level); - while (($sec, $level) = each %sec2level) { - $sec2level{$sec} = $level - 1; - } - next; - } - elsif ($tag eq 'macro' || $tag eq 'rmacro') - { - if (/^\@$tag\s*(\w+)\s*(.*)/) - { - my $name = $1; - my @args; - @args = split(/\s*,\s*/ , $1) - if ($2 =~ /^\s*{(.*)}\s*/); - - $macros->{$name}->{Args} = \@args; - $macros->{$name}->{Body} = ''; - while (($_ = &next_line) && $_ !~ /\@end $tag/) - { - $macros->{$name}->{Body} .= $_; - } - die "ERROR: No closing '\@end $tag' found for macro definition of '$name'\n" - unless (/\@end $tag/); - chomp $macros->{$name}->{Body}; - } - else - { - warn "$ERROR: Bad macro defintion $_" - } - next; - } - elsif ($tag eq 'unmacro') - { - delete $macros->{$1} if (/^\@unmacro\s*(\w+)/); - next; - } - elsif ($tag eq 'documentlanguage') - { - SetDocumentLanguage($1) if (!$T2H_LANG && /documentlanguage\s*(\w+)/); - } - elsif (defined($def_map{$tag})) { - if ($def_map{$tag}) { - s/^\@$tag\s+//; - $tag = $def_map{$tag}; - $_ = "\@$tag $_"; - $tag =~ s/\s.*//; - } - } elsif (defined($user_sub{$tag})) { - s/^\@$tag\s+//; - $sub = $user_sub{$tag}; - print "# user $tag = $sub, arg: $_" if $T2H_DEBUG & $DEBUG_USER; - if (defined(&$sub)) { - chop($_); - &$sub($_); - } else { - warn "$ERROR Bad user sub for $tag: $sub\n"; - } - next; - } - if (defined($def_map{$tag})) { - s/^\@$tag\s+//; - if ($tag =~ /x$/) { - # extra definition line - $tag = $`; - $is_extra = 1; - } else { - $is_extra = 0; - } - while (/\{([^\{\}]*)\}/) { - # this is a {} construct - ($before, $contents, $after) = ($`, $1, $'); - # protect spaces - $contents =~ s/\s+/$;9/g; - # restore $_ protecting {} - $_ = "$before$;7$contents$;8$after"; - } - @args = split(/\s+/, &protect_html($_)); - foreach (@args) { - s/$;9/ /g; # unprotect spaces - s/$;7/\{/g; # ... { - s/$;8/\}/g; # ... } - } - $type = shift(@args); - $type =~ s/^\{(.*)\}$/$1/; - print "# def ($tag): {$type} ", join(', ', @args), "\n" - if $T2H_DEBUG & $DEBUG_DEF; - $type .= ':'; # it's nicer like this - my $name = shift(@args); - $name =~ s/^\{(.*)\}$/$1/; - if ($is_extra) { - $_ = &debug("
", __LINE__); - } else { - $_ = &debug("
\n
", __LINE__); - } - if ($tag eq 'deffn' || $tag eq 'defvr' || $tag eq 'deftp') { - $_ .= "$type $name"; - $_ .= " @args" if @args; - } elsif ($tag eq 'deftypefn' || $tag eq 'deftypevr' - || $tag eq 'defcv' || $tag eq 'defop') { - $ftype = $name; - $name = shift(@args); - $name =~ s/^\{(.*)\}$/$1/; - $_ .= "$type $ftype $name"; - $_ .= " @args" if @args; - } else { - warn "$ERROR Unknown definition type: $tag\n"; - $_ .= "$type $name"; - $_ .= " @args" if @args; - } - $_ .= &debug("\n
", __LINE__); - $name = &unprotect_html($name); - if ($tag eq 'deffn' || $tag eq 'deftypefn') { - EnterIndexEntry('f', $name, $docu_doc, $section, \@lines); -# unshift(@input_spool, "\@findex $name\n"); - } elsif ($tag eq 'defop') { - EnterIndexEntry('f', "$name on $ftype", $docu_doc, $section, \@lines); -# unshift(@input_spool, "\@findex $name on $ftype\n"); - } elsif ($tag eq 'defvr' || $tag eq 'deftypevr' || $tag eq 'defcv') { - EnterIndexEntry('v', $name, $docu_doc, $section, \@lines); -# unshift(@input_spool, "\@vindex $name\n"); - } else { - EnterIndexEntry('t', $name, $docu_doc, $section, \@lines); -# unshift(@input_spool, "\@tindex $name\n"); - } - $dont_html = 1; - } - } elsif ($end_tag) { - if ($format_map{$end_tag}) { - $in_pre = 0 if $format_map{$end_tag} eq 'PRE'; - $in_list-- if $format_map{$end_tag} eq 'UL' || $format_map{$end_tag} eq 'OL' ; - &html_pop_if('P'); - &html_pop_if('LI'); - &html_pop_if(); - push(@lines, &debug("\n", __LINE__)); - push(@lines, &html_debug('', __LINE__)); - } - elsif (exists $complex_format_map->{$end_tag}) - { - my $end = eval $complex_format_map->{$end_tag}->[1]; - if ($@) - { - print "$ERROR: eval of complex_format_map->{$end_tag}->[1] $complex_format_map->{$end_tag}->[0]: $@"; - $end = '
' - } - $in_pre = 0 if $end =~ m|
|; - push(@lines, html_debug($end, __LINE__)); - } elsif ($end_tag =~ /^(|f|v|multi)table$/) { - unless (@tables) { - warn "$ERROR \@end $end_tag without \@*table\n"; - next; - } - &html_pop_if('P'); - ($table_type, $in_table) = split($;, shift(@tables)); - unless ($1 eq $table_type) { - warn "$ERROR \@end $end_tag without matching \@$end_tag\n"; - next; - } - if ($table_type eq "multi") { - push(@lines, "
\n"); - &html_pop_if('TR'); - } else { - push(@lines, "\n"); - &html_pop_if('DD'); - } - &html_pop_if(); - if (@tables) { - ($table_type, $in_table) = split($;, $tables[0]); - } else { - $in_table = 0; - } - } elsif (defined($def_map{$end_tag})) { - push(@lines, &debug("\n", __LINE__)); - } elsif ($end_tag eq 'menu') { - &html_pop_if(); - push(@lines, $_); # must keep it for pass 2 - } - next; - } - ############################################################# - # anchor insertion - while (/\@anchor\s*\{(.*?)\}/) - { - $_ = $`.$'; - my $anchor = $1; - $anchor = &normalise_node($anchor); - push @lines, &html_debug("\n"); - $node2href{$anchor} = "$docu_doc#$anchor"; - next INPUT_LINE if $_ =~ /^\s*$/; - } - - ############################################################# - # index entry generation, after value substitutions - if (/^\@(\w+?)index\s+/) - { - EnterIndexEntry($1, $', $docu_doc, $section, \@lines); - next; - } - # - # protect texi and HTML things - &protect_texi; - $_ = &protect_html($_) unless $dont_html; - $dont_html = 0; - # substitution (unsupported things) - s/^\@exdent\s+//g; - s/\@noindent\s+//g; - s/\@refill\s+//g; - # other substitutions - &simple_substitutions; - s/\@footnote\{/\@footnote$docu_doc\{/g; # mark footnotes, cf. pass 4 - # - # analyze the tag again - # - if ($tag) { - if (defined($sec2level{$tag}) && $sec2level{$tag} > 0) { - if (/^\@$tag\s+(.+)$/) { - $name = $1; - $name = &normalise_node($name); - $level = $sec2level{$tag}; - # check for index - $first_index_chapter = $name - if ($level == 1 && !$first_index_chapter && - $name =~ /index/i); - if ($in_top && /heading/){ - $T2H_HAS_TOP_HEADING = 1; - $_ = &debug("$name\n", __LINE__); - &html_push_if('body'); - print "# top heading, section $name, level $level\n" - if $T2H_DEBUG & $DEBUG_TOC; - } - else - { - unless (/^\@\w*heading/) - { - unless (/^\@unnumbered/) - { - my $number = &update_sec_num($tag, $level); - $name = $number. ' ' . $name if $T2H_NUMBER_SECTIONS; - $sec2number{$name} = $number; - $number2sec{$number} = $name; - } - if (defined($toplevel)) - { - push @lines, ($level==$toplevel ? $CHAPTEREND : $SECTIONEND); - } - else - { - # first time we see a "section" - unless ($level == 1) - { - warn "$WARN The first section found is not of level 1: $_"; - } - $toplevel = $level; - } - push(@sections, $name); - next_doc() if ($T2H_SPLIT eq 'section' || - $T2H_SPLIT && $level == $toplevel); - } - $sec_num++; - $docid = "SEC$sec_num"; - $tocid = (/^\@\w*heading/ ? undef : "TOC$sec_num"); - # check biblio and glossary - $in_bibliography = ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*bibliography$/i); - $in_glossary = ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*glossary$/i); - # check node - if ($node) - { - warn "$ERROR Duplicate node found: $node\n" - if ($node2sec{$node}); - } - else - { - $name .= ' ' while ($node2sec{$name}); - $node = $name; - } - $name .= ' ' while ($sec2node{$name}); - $section = $name; - $node2sec{$node} = $name; - $sec2node{$name} = $node; - $node2href{$node} = "$docu_doc#$docid"; - $node2next{$node} = $node_next; - $node2prev{$node} = $node_prev; - $node2up{$node} = $node_up; - print "# node $node, section $name, level $level\n" - if $T2H_DEBUG & $DEBUG_TOC; - - $node = ''; - $node_next = ''; - $node_prev = ''; - $node_next = ''; - if ($tocid) - { - # update TOC - while ($level > $curlevel) { - $curlevel++; - push(@toc_lines, "
    \n"); - } - while ($level < $curlevel) { - $curlevel--; - push(@toc_lines, "
\n"); - } - $_ = &t2h_anchor($tocid, "$docu_doc#$docid", $name, 1); - $_ = &substitute_style($_); - push(@stoc_lines, "$_
\n") if ($level == 1); - if ($T2H_NUMBER_SECTIONS) - { - push(@toc_lines, $_ . "
\n") - } - else - { - push(@toc_lines, "
  • " . $_ ."
  • "); - } - } - else - { - push(@lines, &html_debug("\n", - __LINE__)); - } - # update DOC - push(@lines, &html_debug('', __LINE__)); - &html_reset; - $_ = " $name \n\n"; - $_ = &debug($_, __LINE__); - push(@lines, &html_debug('', __LINE__)); - } - # update DOC - foreach $line (split(/\n+/, $_)) { - push(@lines, "$line\n"); - } - next; - } else { - warn "$ERROR Bad section line: $_"; - } - } else { - # track variables - $value{$1} = Unprotect_texi($2), next if /^\@set\s+($VARRE)\s+(.*)$/o; - delete $value{$1}, next if /^\@clear\s+($VARRE)\s*$/o; - # store things - $value{'_shorttitle'} = Unprotect_texi($1), next if /^\@shorttitle\s+(.*)$/; - $value{'_setfilename'} = Unprotect_texi($1), next if /^\@setfilename\s+(.*)$/; - $value{'_settitle'} = Unprotect_texi($1), next if /^\@settitle\s+(.*)$/; - $value{'_author'} .= Unprotect_texi($1)."\n", next if /^\@author\s+(.*)$/; - $value{'_subtitle'} .= Unprotect_texi($1)."\n", next if /^\@subtitle\s+(.*)$/; - $value{'_title'} .= Unprotect_texi($1)."\n", next if /^\@title\s+(.*)$/; - - # list item - if (/^\s*\@itemx?\s+/) { - $what = $'; - $what =~ s/\s+$//; - if ($in_bibliography && $use_bibliography) { - if ($what =~ /^$BIBRE$/o) { - $id = 'BIB' . ++$bib_num; - $bib2href{$what} = "$docu_doc#$id"; - print "# found bibliography for '$what' id $id\n" - if $T2H_DEBUG & $DEBUG_BIB; - $what = &t2h_anchor($id, '', $what); - } - } elsif ($in_glossary && $T2H_USE_GLOSSARY) { - $id = 'GLOSS' . ++$gloss_num; - $entry = $what; - $entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/; - $gloss2href{$entry} = "$docu_doc#$id"; - print "# found glossary for '$entry' id $id\n" - if $T2H_DEBUG & $DEBUG_GLOSS; - $what = &t2h_anchor($id, '', $what); - } - elsif ($in_table && ($table_type eq 'f' || $table_type eq 'v')) - { - EnterIndexEntry($table_type, $what, $docu_doc, $section, \@lines); - } - &html_pop_if('P'); - if ($html_element eq 'DL' || $html_element eq 'DD') { - if ($things_map{$in_table} && !$what) { - # special case to allow @table @bullet for instance - push(@lines, &debug("
    $things_map{$in_table}\n", __LINE__)); - } else { - push(@lines, &debug("
    \@$in_table\{$what\}\n", __LINE__)); - } - push(@lines, "
    "); - &html_push('DD') unless $html_element eq 'DD'; - if ($table_type) { # add also an index - unshift(@input_spool, "\@${table_type}index $what\n"); - } - } elsif ($html_element eq 'TABLE') { - push(@lines, &debug("$what\n", __LINE__)); - &html_push('TR'); - } elsif ($html_element eq 'TR') { - push(@lines, &debug("\n", __LINE__)); - push(@lines, &debug("$what\n", __LINE__)); - } else { - push(@lines, &debug("
  • $what\n", __LINE__)); - &html_push('LI') unless $html_element eq 'LI'; - } - push(@lines, &html_debug('', __LINE__)); - if ($deferred_ref) { - push(@lines, &debug("$deferred_ref\n", __LINE__)); - $deferred_ref = ''; - } - next; - } elsif (/^\@tab\s+(.*)$/) { - push(@lines, "$1\n"); - next; - } - } - } - # paragraph separator - if ($_ eq "\n" && ! $in_pre) { - next if $#lines >= 0 && $lines[$#lines] eq "\n"; - if ($html_element eq 'P') { - push (@lines, &debug("

    \n", __LINE__)); - } -# else -# { -# push(@lines, "

    \n"); -# $_ = &debug("

    \n", __LINE__); -# } - elsif ($html_element eq 'body' || $html_element eq 'BLOCKQUOTE' || $html_element eq 'DD' || $html_element eq 'LI') - { - &html_push('P'); - push(@lines, &debug("

    \n", __LINE__)); - } - } - # otherwise - push(@lines, $_) unless $in_titlepage; - push(@lines, &debug("

  • \n", __LINE__)) if ($tag eq 'center'); -} - -# finish TOC -$level = 0; -while ($level < $curlevel) { - $curlevel--; - push(@toc_lines, "\n"); -} - -print "# end of pass 1\n" if $T2H_VERBOSE; - -SetDocumentLanguage('en') unless ($T2H_LANG); -#+++############################################################################ -# # -# Stuff related to Index generation # -# # -#---############################################################################ - -sub EnterIndexEntry -{ - my $prefix = shift; - my $key = shift; - my $docu_doc = shift; - my $section = shift; - my $lines = shift; - local $_; - - warn "$ERROR Undefined index command: $_", next - unless (exists ($index_properties->{$prefix})); - $key =~ s/\s+$//; - $_ = $key; - &protect_texi; - $key = $_; - $_ = &protect_html($_); - my $html_key = substitute_style($_); - my $id; - $key = remove_style($key); - $key = remove_things($key); - $_ = $key; - &unprotect_texi; - $key = $_; - while (exists $index->{$prefix}->{$key}) {$key .= ' '}; - if ($lines->[$#lines] =~ /^$/) - { - $id = $1; - } - else - { - $id = 'IDX' . ++$idx_num; - push(@$lines, &t2h_anchor($id, '', $T2H_INVISIBLE_MARK, !$in_pre)); - } - $index->{$prefix}->{$key}->{html_key} = $html_key; - $index->{$prefix}->{$key}->{section} = $section; - $index->{$prefix}->{$key}->{href} = "$docu_doc#$id"; - print "# found ${prefix}index for '$key' with id $id\n" - if $T2H_DEBUG & $DEBUG_INDEX; -} - -sub IndexName2Prefix -{ - my $name = shift; - my $prefix; - - for $prefix (keys %$index_properties) - { - return $prefix if ($index_properties->{$prefix}->{name} eq $name); - } - return undef; -} - -sub GetIndexEntries -{ - my $normal = shift; - my $code = shift; - my ($entries, $prefix, $key) = ({}); - - for $prefix (keys %$normal) - { - for $key (keys %{$index->{$prefix}}) - { - $entries->{$key} = {%{$index->{$prefix}->{$key}}}; - } - } - - if (defined($code)) - { - for $prefix (keys %$code) - { - unless (exists $normal->{$keys}) - { - for $key (keys %{$index->{$prefix}}) - { - $entries->{$key} = {%{$index->{$prefix}->{$key}}}; - $entries->{$key}->{html_key} = "$entries->{$key}->{html_key}"; - } - } - } - } - return $entries; -} - -sub byAlpha -{ - if ($a =~ /^[A-Za-z]/) - { - if ($b =~ /^[A-Za-z]/) - { - return lc($a) cmp lc($b); - } - else - { - return 1; - } - } - elsif ($b =~ /^[A-Za-z]/) - { - return -1; - } - else - { - return lc($a) cmp lc($b); - } -} - -sub GetIndexPages -{ - my $entries = shift; - my (@Letters, $key); - my ($EntriesByLetter, $Pages, $page) = ({}, [], {}); - my @keys = sort byAlpha keys %$entries; - - for $key (@keys) - { - push @{$EntriesByLetter->{uc(substr($key,0, 1))}} , $entries->{$key}; - } - @Letters = sort byAlpha keys %$EntriesByLetter; - - $T2H_SPLIT_INDEX = 0 unless ($T2H_SPLIT); - - unless ($T2H_SPLIT_INDEX) - { - $page->{First} = $Letters[0]; - $page->{Last} = $Letters[$#Letters]; - $page->{Letters} = \@Letters; - $page->{EntriesByLetter} = $EntriesByLetter; - push @$Pages, $page; - return $Pages; - } - - if ($T2H_SPLIT_INDEX =~ /^\d+$/) - { - my $i = 0; - my ($prev_letter, $letter); - $page->{First} = $Letters[0]; - for $letter (@Letters) - { - if ($i > $T2H_SPLIT_INDEX) - { - $page->{Last} = $prev_letter; - push @$Pages, {%$page}; - $page->{Letters} = []; - $page->{EntriesByLetter} = {}; - $page->{First} = $letter; - $i=0; - } - push @{$page->{Letters}}, $letter; - $page->{EntriesByLetter}->{$letter} = [@{$EntriesByLetter->{$letter}}]; - $i += scalar(@{$EntriesByLetter->{$letter}}); - $prev_letter = $letter; - } - $page->{Last} = $Letters[$#Letters]; - push @$Pages, {%$page}; - } - return $Pages; -} - -sub GetIndexSummary -{ - my $first_page = shift; - my $Pages = shift; - my $name = shift; - my ($page, $letter, $summary, $i, $l1, $l2, $l); - - $i = 0; - $summary = '
    Jump to:   '; - - for $page ($first_page, @$Pages) - { - for $letter (@{$page->{Letters}}) - { - $l = t2h_anchor('', "$page->{href}#${name}_$letter", "$letter", - 0, 'style="text-decoration:none"') . "\n   \n"; - - if ($letter =~ /^[A-Za-z]/) - { - $l2 .= $l; - } - else - { - $l1 .= $l; - } - } - } - $summary .= $l1 . "
    \n" if ($l1); - $summary .= $l2 . '

    '; - return $summary; -} - -sub PrintIndexPage -{ - my $lines = shift; - my $summary = shift; - my $page = shift; - my $name = shift; - - push @$lines, $summary; - - push @$lines , <

    - - - -EOT - - for $letter (@{$page->{Letters}}) - { - push @$lines, "\n"; - for $entry (@{$page->{EntriesByLetter}->{$letter}}) - { - push @$lines, - "\n"; - } - push @$lines, "\n"; - } - push @$lines, "
    Index Entry Section

    $letter
    " . - t2h_anchor('', $entry->{href}, $entry->{html_key}) . - "" . - t2h_anchor('', sec_href($entry->{section}), clean_name($entry->{section})) . - "

    "; - push @$lines, $summary; -} - -sub PrintIndex -{ - my $lines = shift; - my $name = shift; - my $section = shift; - $section = 'Top' unless $section; - my $prefix = IndexName2Prefix($name); - - warn ("$ERROR printindex: bad index name: $name"), return - unless $prefix; - - if ($index_properties->{$prefix}->{code}) - { - $index_properties->{$prefix}->{from_code}->{$prefix} = 1; - } - else - { - $index_properties->{$prefix}->{from}->{$prefix}= 1; - } - - my $Entries = GetIndexEntries($index_properties->{$prefix}->{from}, - $index_properties->{$prefix}->{from_code}); - return unless %$Entries; - - if ($T2H_IDX_SUMMARY) - { - my $key; - open(FHIDX, ">$docu_rdir$docu_name" . "_$name.idx") - || die "Can't open > $docu_rdir$docu_name" . "_$name.idx for writing: $!\n"; - print "# writing $name index summary in $docu_rdir$docu_name" . "_$name.idx...\n" if $T2H_VERBOSE; - - for $key (sort keys %$Entries) - { - print FHIDX "$key\t$Entries->{$key}->{href}\n"; - } - } - - my $Pages = GetIndexPages($Entries); - my $page; - my $first_page = shift @$Pages; - my $sec_name = $section; - # remove section number - $sec_name =~ s/.*? // if $sec_name =~ /^([A-Z]|\d+)\./; - - ($first_page->{href} = sec_href($section)) =~ s/\#.*$//; - # Update tree structure of document - if (@$Pages) - { - my $sec; - my @after; - - while (@sections && $sections[$#sections] ne $section) - { - unshift @after, pop @sections; - } - - for $page (@$Pages) - { - my $node = ($page->{First} ne $page->{Last} ? - "$sec_name: $page->{First} -- $page->{Last}" : - "$sec_name: $page->{First}"); - push @sections, $node; - $node2sec{$node} = $node; - $sec2node{$node} = $node; - $node2up{$node} = $section; - $page->{href} = next_doc(); - $page->{name} = $node; - $node2href{$node} = $page->{href}; - if ($prev_node) - { - $node2next{$prev_node} = $node; - $node2prev{$node} = $prev_node; - } - $prev_node = $node; - } - push @sections, @after; - } - - my $summary = GetIndexSummary($first_page, $Pages, $name); - PrintIndexPage($lines, $summary, $first_page, $name); - for $page (@$Pages) - { - push @$lines, ($T2H_SPLIT eq 'chapter' ? $CHAPTEREND : $SECTIONEND); - push @$lines, "

    $page->{name}

    \n"; - PrintIndexPage($lines, $summary, $page, $name); - } -} - - -#+++############################################################################ -# # -# Pass 2/3: handle style, menu, index, cross-reference # -# # -#---############################################################################ - -@lines2 = (); # whole document (2nd pass) -@lines3 = (); # whole document (3rd pass) -$in_menu = 0; # am I inside a menu - -while (@lines) { - $_ = shift(@lines); - # - # special case (protected sections) - # - if (/^$PROTECTTAG/o) { - push(@lines2, $_); - next; - } - # - # menu - # - if (/^\@menu\b/) - { - $in_menu = 1; - $in_menu_listing = 1; - push(@lines2, &debug("
    \n", __LINE__)); - next; - } - if (/^\@end\s+menu\b/) - { - if ($in_menu_listing) - { - push(@lines2, &debug("
    \n", __LINE__)); - } - else - { - push(@lines2, &debug("\n", __LINE__)); - } - $in_menu = 0; - $in_menu_listing = 0; - next; - } - if ($in_menu) - { - my ($node, $name, $descr); - if (/^\*\s+($NODERE)::/o) - { - $node = $1; - $descr = $'; - } - elsif (/^\*\s+(.+):\s+([^\t,\.\n]+)[\t,\.\n]/) - { - $name = $1; - $node = $2; - $descr = $'; - } - elsif (/^\*/) - { - warn "$ERROR Bad menu line: $_"; - } - else - { - if ($in_menu_listing) - { - $in_menu_listing = 0; - push(@lines2, &debug("\n", __LINE__)); - } - # should be like verbatim -- preseve spaces, etc - s/ /\ /g; - $_ .= "
    \n"; - push(@lines2, $_); - } - if ($node) - { - if (! $in_menu_listing) - { - $in_menu_listing = 1; - push(@lines2, &debug("\n", __LINE__)); - } - # look for continuation - while ($lines[0] =~ /^\s+\w+/) - { - $descr .= shift(@lines); - } - &menu_entry($node, $name, $descr); - } - next; - } - # - # printindex - # - PrintIndex(\@lines2, $2, $1), next - if (/^\@printindex\s+(\w+)/); - # - # simple style substitutions - # - $_ = &substitute_style($_); - # - # xref - # - while (/\@(x|px|info|)ref{([^{}]+)(}?)/) { - # note: Texinfo may accept other characters - ($type, $nodes, $full) = ($1, $2, $3); - ($before, $after) = ($`, $'); - if (! $full && $after) { - warn "$ERROR Bad xref (no ending } on line): $_"; - $_ = "$before$;0${type}ref\{$nodes$after"; - next; # while xref - } - if ($type eq 'x') { - $type = "$T2H_WORDS->{$T2H_LANG}->{'See'} "; - } elsif ($type eq 'px') { - $type = "$T2H_WORDS->{$T2H_LANG}->{'see'} "; - } elsif ($type eq 'info') { - $type = "$T2H_WORDS->{$T2H_LANG}->{'See'} Info"; - } else { - $type = ''; - } - unless ($full) { - $next = shift(@lines); - $next = &substitute_style($next); - chop($nodes); # remove final newline - if ($next =~ /\}/) { # split on 2 lines - $nodes .= " $`"; - $after = $'; - } else { - $nodes .= " $next"; - $next = shift(@lines); - $next = &substitute_style($next); - chop($nodes); - if ($next =~ /\}/) { # split on 3 lines - $nodes .= " $`"; - $after = $'; - } else { - warn "$ERROR Bad xref (no ending }): $_"; - $_ = "$before$;0xref\{$nodes$after"; - unshift(@lines, $next); - next; # while xref - } - } - } - $nodes =~ s/\s+/ /g; # remove useless spaces - @args = split(/\s*,\s*/, $nodes); - $node = $args[0]; # the node is always the first arg - $node = &normalise_node($node); - $sec = $args[2] || $args[1] || $node2sec{$node}; - $href = $node2href{$node}; - if (@args == 5) { # reference to another manual - $sec = $args[2] || $node; - $man = $args[4] || $args[3]; - $_ = "${before}${type}$T2H_WORDS->{$T2H_LANG}->{'section'} `$sec' in \@cite{$man}$after"; - } elsif ($type =~ /Info/) { # inforef - warn "$ERROR Wrong number of arguments: $_" unless @args == 3; - ($nn, $_, $in) = @args; - $_ = "${before}${type} file `$in', node `$nn'$after"; - } elsif ($sec && $href && ! $T2H_SHORT_REF) { - $_ = "${before}${type}"; - $_ .= "$T2H_WORDS->{$T2H_LANG}->{'section'} " if ${type}; - $_ .= &t2h_anchor('', $href, $sec) . $after; - } - elsif ($href) - { - $_ = "${before}${type} " . - &t2h_anchor('', $href, $args[2] || $args[1] || $node) . - $after; - } - else { - warn "$ERROR Undefined node ($node): $_"; - $_ = "$before$;0xref{$nodes}$after"; - } - } - - # replace images - s[\@image\s*{(.+?)}] - { - my @args = split (/\s*,\s*/, $1); - my $base = $args[0]; - my $image = - LocateIncludeFile("$base.png") || - LocateIncludeFile("$base.jpg") || - LocateIncludeFile("$base.gif"); - warn "$ERROR no image file for $base: $_" unless ($image && -e $image); - "\"$base\""; - ($T2H_CENTER_IMAGE ? - "
    \"$base\"
    " : - "\"$base\""); - }eg; - - # - # try to guess bibliography references or glossary terms - # - unless (/^/) { - $done .= $pre . &t2h_anchor('', $href, $what); - } else { - $done .= "$pre$what"; - } - $_ = $post; - } - $_ = $done . $_; - } - if ($T2H_USE_GLOSSARY) { - $done = ''; - while (/\b\w+\b/) { - ($pre, $what, $post) = ($`, $&, $'); - $entry = $what; - $entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/; - $href = $gloss2href{$entry}; - if (defined($href) && $post !~ /^[^<]*<\/A>/) { - $done .= $pre . &t2h_anchor('', $href, $what); - } else { - $done .= "$pre$what"; - } - $_ = $post; - } - $_ = $done . $_; - } - } - # otherwise - push(@lines2, $_); -} -print "# end of pass 2\n" if $T2H_VERBOSE; - -# -# split style substitutions -# -while (@lines2) { - $_ = shift(@lines2); - # - # special case (protected sections) - # - if (/^$PROTECTTAG/o) { - push(@lines3, $_); - next; - } - # - # split style substitutions - # - $old = ''; - while ($old ne $_) { - $old = $_; - if (/\@(\w+)\{/) { - ($before, $style, $after) = ($`, $1, $'); - if (defined($style_map{$style})) { - $_ = $after; - $text = ''; - $after = ''; - $failed = 1; - while (@lines2) { - if (/\}/) { - $text .= $`; - $after = $'; - $failed = 0; - last; - } else { - $text .= $_; - $_ = shift(@lines2); - } - } - if ($failed) { - die "* Bad syntax (\@$style) after: $before\n"; - } else { - $text = &apply_style($style, $text); - $_ = "$before$text$after"; - } - } - } - } - # otherwise - push(@lines3, $_); -} -print "# end of pass 3\n" if $T2H_VERBOSE; - -#+++############################################################################ -# # -# Pass 4: foot notes, final cleanup # -# # -#---############################################################################ - -@foot_lines = (); # footnotes -@doc_lines = (); # final document -$end_of_para = 0; # true if last line is

    - -while (@lines3) { - $_ = shift(@lines3); - # - # special case (protected sections) - # - if (/^$PROTECTTAG/o) { - push(@doc_lines, $_); - $end_of_para = 0; - next; - } - # - # footnotes - # - while (/\@footnote([^\{\s]+)\{/) { - ($before, $d, $after) = ($`, $1, $'); - $_ = $after; - $text = ''; - $after = ''; - $failed = 1; - while (@lines3) { - if (/\}/) { - $text .= $`; - $after = $'; - $failed = 0; - last; - } else { - $text .= $_; - $_ = shift(@lines3); - } - } - if ($failed) { - die "* Bad syntax (\@footnote) after: $before\n"; - } else { - $foot_num++; - $docid = "DOCF$foot_num"; - $footid = "FOOT$foot_num"; - $foot = "($foot_num)"; - push(@foot_lines, "

    " . &t2h_anchor($footid, "$d#$docid", $foot) . "

    \n"); - $text = "

    $text" unless $text =~ /^\s*

    /; - push(@foot_lines, "$text\n"); - $_ = $before . &t2h_anchor($docid, "$docu_foot#$footid", $foot) . $after; - } - } - # - # remove unnecessary

    - # - if (/^\s*

    \s*$/) { - next if $end_of_para++; - } else { - $end_of_para = 0; - } - # otherwise - push(@doc_lines, $_); -} - -print "# end of pass 4\n" if $T2H_VERBOSE; - -#+++############################################################################ -# # -# Pass 5: print things # -# # -#---############################################################################ - -$T2H_L2H = &l2h_FinishToLatex if ($T2H_L2H); -$T2H_L2H = &l2h_ToHtml if ($T2H_L2H); -$T2H_L2H = &l2h_InitFromHtml if ($T2H_L2H); - -# fix node2up, node2prev, node2next, if desired -if ($has_top_command) -{ - for $section (keys %sec2number) - { - $node = $sec2node{$section}; - $node2up{$node} = Sec2UpNode($section) unless $node2up{$node}; - $node2prev{$node} = Sec2PrevNode($section) unless $node2prev{$node}; - $node2next{$node} = Sec2NextNode($section) unless $node2next{$node}; - } -} - -# prepare %T2H_THISDOC -$T2H_THISDOC{fulltitle} = $value{'_title'} || $value{'_settitle'} || "Untitled Document"; -$T2H_THISDOC{title} = $value{'_settitle'} || $T2H_THISDOC{fulltitle}; -$T2H_THISDOC{author} = $value{'_author'}; -$T2H_THISDOC{subtitle} = $value{'_subtitle'}; -$T2H_THISDOC{shorttitle} = $value{'_shorttitle'}; -for $key (keys %T2H_THISDOC) -{ - $_ = &substitute_style($T2H_THISDOC{$key}); - &unprotect_texi; - s/\s*$//; - $T2H_THISDOC{$key} = $_; -} - -# if no sections, then simply print document as is -unless (@sections) -{ - print "# Writing content into $docu_top_file \n" if $T2H_VERBOSE; - open(FILE, "> $docu_top_file") - || die "$ERROR: Can't open $docu_top_file for writing: $!\n"; - - &$T2H_print_page_head(\*FILE); - $T2H_THIS_SECTION = \@doc_lines; - t2h_print_lines(\*FILE); - &$T2H_print_foot_navigation(\*FILE); - &$T2H_print_page_foot(\*FILE); - close(FILE); - goto Finish; -} - -# initialize $T2H_HREF, $T2H_NAME -%T2H_HREF = - ( - 'First' , sec_href($sections[0]), - 'Last', sec_href($sections[$#sections]), - 'About', $docu_about. '#SEC_About', - ); - -# prepare TOC, OVERVIEW, TOP -$T2H_TOC = \@toc_lines; -$T2H_OVERVIEW = \@stoc_lines; -if ($has_top) -{ - while (1) - { - $_ = shift @doc_lines; - last if /$TOPEND/; - push @$T2H_TOP, $_; - } - $T2H_HREF{'Top'} = $docu_top . '#SEC_Top'; -} -else -{ - $T2H_HREF{'Top'} = $T2H_HREF{First}; -} - -$node2href{Top} = $T2H_HREF{Top}; -$T2H_HREF{Contents} = $docu_toc.'#SEC_Contents' if @toc_lines; -$T2H_HREF{Overview} = $docu_stoc.'#SEC_OVERVIEW' if @stoc_lines; - -# settle on index -if ($T2H_INDEX_CHAPTER) -{ - $T2H_HREF{Index} = $node2href{normalise_node($T2H_INDEX_CHAPTER)}; - warn "$ERROR T2H_INDEX_CHAPTER '$T2H_INDEX_CHAPTER' not found\n" - unless $T2H_HREF{Index}; -} -if (! $T2H_HREF{Index} && $first_index_chapter) -{ - $T2H_INDEX_CHAPTER = $first_index_chapter; - $T2H_HREF{Index} = $node2href{$T2H_INDEX_CHAPTER}; -} - -print "# Using '" . clean_name($T2H_INDEX_CHAPTER) . "' as index page\n" - if ($T2H_VERBOSE && $T2H_HREF{Index}); - -%T2H_NAME = - ( - 'First', clean_name($sec2node{$sections[0]}), - 'Last', clean_name($sec2node{$sections[$#sections]}), - 'About', $T2H_WORDS->{$T2H_LANG}->{'About_Title'}, - 'Contents', $T2H_WORDS->{$T2H_LANG}->{'ToC_Title'}, - 'Overview', $T2H_WORDS->{$T2H_LANG}->{'Overview_Title'}, - 'Index' , clean_name($T2H_INDEX_CHAPTER), - 'Top', clean_name($T2H_TOP_HEADING || $T2H_THISDOC{'title'} || $T2H_THISDOC{'shorttitle'}), - ); - -############################################################################# -# print frame and frame toc file -# -if ( $T2H_FRAMES ) -{ - open(FILE, "> $docu_frame_file") - || die "$ERROR: Can't open $docu_frame_file for writing: $!\n"; - print "# Creating frame in $docu_frame_file ...\n" if $T2H_VERBOSE; - &$T2H_print_frame(\*FILE); - close(FILE); - - open(FILE, "> $docu_toc_frame_file") - || die "$ERROR: Can't open $docu_toc_frame_file for writing: $!\n"; - print "# Creating toc frame in $docu_frame_file ...\n" if $T2H_VERBOSE; - &$T2H_print_toc_frame(\*FILE); - close(FILE); -} - - -############################################################################# -# print Top -# -open(FILE, "> $docu_top_file") - || die "$ERROR: Can't open $docu_top_file for writing: $!\n"; -&$T2H_print_page_head(\*FILE) unless ($T2H_SPLIT); - -if ($has_top) -{ - print "# Creating Top in $docu_top_file ...\n" if $T2H_VERBOSE; - $T2H_THIS_SECTION = $T2H_TOP; - $T2H_HREF{This} = $T2H_HREF{Top}; - $T2H_NAME{This} = $T2H_NAME{Top}; - &$T2H_print_Top(\*FILE); -} - -close(FILE) if $T2H_SPLIT; - -############################################################################# -# Print sections -# -$T2H_NODE{Forward} = $sec2node{$sections[0]}; -$T2H_NAME{Forward} = &clean_name($sec2node{$sections[0]}); -$T2H_HREF{Forward} = sec_href($sections[0]); -$T2H_NODE{This} = 'Top'; -$T2H_NAME{This} = $T2H_NAME{Top}; -$T2H_HREF{This} = $T2H_HREF{Top}; -if ($T2H_SPLIT) -{ - print "# writing " . scalar(@sections) . - " sections in $docu_rdir$docu_name"."_[1..$doc_num]" - if $T2H_VERBOSE; - $previous = ($T2H_SPLIT eq 'chapter' ? $CHAPTEREND : $SECTIONEND); - undef $FH; - $doc_num = 0; -} -else -{ - print "# writing " . scalar(@sections) . " sections in $docu_top_file ..." - if $T2H_VERBOSE; - $FH = \*FILE; - $previous = ''; -} - -$counter = 0; -# loop through sections -while ($section = shift(@sections)) -{ - if ($T2H_SPLIT && ($T2H_SPLIT eq 'section' || $previous eq $CHAPTEREND)) - { - if ($FH) - { - #close previous page - &$T2H_print_chapter_footer($FH) if $T2H_SPLIT eq 'chapter'; - &$T2H_print_page_foot($FH); - close($FH); - undef $FH; - } - } - $T2H_NAME{Back} = $T2H_NAME{This}; - $T2H_HREF{Back} = $T2H_HREF{This}; - $T2H_NODE{Back} = $T2H_NODE{This}; - $T2H_NAME{This} = $T2H_NAME{Forward}; - $T2H_HREF{This} = $T2H_HREF{Forward}; - $T2H_NODE{This} = $T2H_NODE{Forward}; - if ($sections[0]) - { - $T2H_NODE{Forward} = $sec2node{$sections[0]}; - $T2H_NAME{Forward} = &clean_name($T2H_NODE{Forward}); - $T2H_HREF{Forward} = sec_href($sections[0]); - } - else - { - undef $T2H_HREF{Forward}, $T2H_NODE{Forward}, $T2H_NAME{Forward}; - } - - $node = $node2up{$T2H_NODE{This}}; - $T2H_HREF{Up} = $node2href{$node}; - if ($T2H_HREF{Up} eq $T2H_HREF{This} || ! $T2H_HREF{Up}) - { - $T2H_NAME{Up} = $T2H_NAME{Top}; - $T2H_HREF{Up} = $T2H_HREF{Top}; - $T2H_NODE{Up} = 'Up'; - } - else - { - $T2H_NAME{Up} = &clean_name($node); - $T2H_NODE{Up} = $node; - } - - $node = $T2H_NODE{This}; - $node = $node2prev{$node}; - $T2H_NAME{Prev} = &clean_name($node); - $T2H_HREF{Prev} = $node2href{$node}; - $T2H_NODE{Prev} = $node; - - $node = $T2H_NODE{This}; - if ($node2up{$node} && $node2up{$node} ne 'Top'&& - ($node2prev{$node} eq $T2H_NODE{Back} || ! $node2prev{$node})) - { - $node = $node2up{$node}; - while ($node && $node ne $node2up{$node} && ! $node2prev{$node}) - { - $node = $node2up{$node}; - } - $node = $node2prev{$node} - unless $node2up{$node} eq 'Top' || ! $node2up{$node}; - } - else - { - $node = $node2prev{$node}; - } - $T2H_NAME{FastBack} = &clean_name($node); - $T2H_HREF{FastBack} = $node2href{$node}; - $T2H_NODE{FastBack} = $node; - - $node = $T2H_NODE{This}; - $node = $node2next{$node}; - $T2H_NAME{Next} = &clean_name($node); - $T2H_HREF{Next} = $node2href{$node}; - $T2H_NODE{Next} = $node; - - $node = $T2H_NODE{This}; - if ($node2up{$node} && $node2up{$node} ne 'Top'&& - ($node2next{$node} eq $T2H_NODE{Forward} || ! $node2next{$node})) - { - $node = $node2up{$node}; - while ($node && $node ne $node2up{$node} && ! $node2next{$node}) - { - $node = $node2up{$node}; - } - } - $node = $node2next{$node}; - $T2H_NAME{FastForward} = &clean_name($node); - $T2H_HREF{FastForward} = $node2href{$node}; - $T2H_NODE{FastForward} = $node; - - if (! defined($FH)) - { - my $file = $T2H_HREF{This}; - $file =~ s/\#.*$//; - open(FILE, "> $docu_rdir$file") || - die "$ERROR: Can't open $docu_rdir$file for writing: $!\n"; - $FH = \*FILE; - &$T2H_print_page_head($FH); - t2h_print_label($FH); - &$T2H_print_chapter_header($FH) if $T2H_SPLIT eq 'chapter'; - } - else - { - t2h_print_label($FH); - } - - $T2H_THIS_SECTION = []; - while (@doc_lines) { - $_ = shift(@doc_lines); - last if ($_ eq $SECTIONEND || $_ eq $CHAPTEREND); - push(@$T2H_THIS_SECTION, $_); - } - $previous = $_; - &$T2H_print_section($FH); - - if ($T2H_VERBOSE) - { - $counter++; - print "." if $counter =~ /00$/; - } -} -if ($T2H_SPLIT) -{ - &$T2H_print_chapter_footer($FH) if $T2H_SPLIT eq 'chapter'; - &$T2H_print_page_foot($FH); - close($FH); -} -print "\n" if $T2H_VERBOSE; - -############################################################################# -# Print ToC, Overview, Footnotes -# -undef $T2H_HREF{Prev}; -undef $T2H_HREF{Next}; -undef $T2H_HREF{Back}; -undef $T2H_HREF{Forward}; -undef $T2H_HREF{Up}; - -if (@foot_lines) -{ - print "# writing Footnotes in $docu_foot_file...\n" if $T2H_VERBOSE; - open (FILE, "> $docu_foot_file") || die "$ERROR: Can't open $docu_foot_file for writing: $!\n" - if $T2H_SPLIT; - $T2H_HREF{This} = $docu_foot; - $T2H_NAME{This} = $T2H_WORDS->{$T2H_LANG}->{'Footnotes_Title'}; - $T2H_THIS_SECTION = \@foot_lines; - &$T2H_print_Footnotes(\*FILE); - close(FILE) if $T2H_SPLIT; -} - -if (@toc_lines) -{ - print "# writing Toc in $docu_toc_file...\n" if $T2H_VERBOSE; - open (FILE, "> $docu_toc_file") || die "$ERROR: Can't open $docu_toc_file for writing: $!\n" - if $T2H_SPLIT; - $T2H_HREF{This} = $T2H_HREF{Contents}; - $T2H_NAME{This} = $T2H_NAME{Contents}; - $T2H_THIS_SECTION = \@toc_lines; - &$T2H_print_Toc(\*FILE); - close(FILE) if $T2H_SPLIT; -} - -if (@stoc_lines) -{ - print "# writing Overview in $docu_stoc_file...\n" if $T2H_VERBOSE; - open (FILE, "> $docu_stoc_file") || die "$ERROR: Can't open $docu_stoc_file for writing: $!\n" - if $T2H_SPLIT; - - $T2H_HREF{This} = $T2H_HREF{Overview}; - $T2H_NAME{This} = $T2H_NAME{Overview}; - $T2H_THIS_SECTION = \@stoc_lines; - unshift @$T2H_THIS_SECTION, "

    \n"; - push @$T2H_THIS_SECTION, "\n
    \n"; - &$T2H_print_Overview(\*FILE); - close(FILE) if $T2H_SPLIT; -} - -if ($about_body = &$T2H_about_body()) -{ - print "# writing About in $docu_about_file...\n" if $T2H_VERBOSE; - open (FILE, "> $docu_about_file") || die "$ERROR: Can't open $docu_about_file for writing: $!\n" - if $T2H_SPLIT; - - $T2H_HREF{This} = $T2H_HREF{About}; - $T2H_NAME{This} = $T2H_NAME{About}; - $T2H_THIS_SECTION = [$about_body]; - &$T2H_print_About(\*FILE); - close(FILE) if $T2H_SPLIT; -} - -unless ($T2H_SPLIT) -{ - &$T2H_print_page_foot(\*FILE); - close (FILE); -} - -Finish: -&l2h_FinishFromHtml if ($T2H_L2H); -&l2h_Finish if($T2H_L2H); -print "# that's all folks\n" if $T2H_VERBOSE; - -exit(0); - -#+++############################################################################ -# # -# Low level functions # -# # -#---############################################################################ - -sub LocateIncludeFile -{ - my $file = shift; - my $dir; - - return $file if (-e $file && -r $file); - foreach $dir (@T2H_INCLUDE_DIRS) - { - return "$dir/$file" if (-e "$dir/$file" && -r "$dir/$file"); - } - return undef; -} - -sub clean_name -{ - local ($_); - $_ = &remove_style($_[0]); - &unprotect_texi; - return $_; -} - -sub update_sec_num { - local($name, $level) = @_; - my $ret; - - $level--; # here we start at 0 - if ($name =~ /^appendix/ || defined(@appendix_sec_num)) { - # appendix style - if (defined(@appendix_sec_num)) { - &incr_sec_num($level, @appendix_sec_num); - } else { - @appendix_sec_num = ('A', 0, 0, 0); - } - $ret = join('.', @appendix_sec_num[0..$level]); - } else { - # normal style - if (defined(@normal_sec_num)) - { - &incr_sec_num($level, @normal_sec_num); - } - else - { - @normal_sec_num = (1, 0, 0, 0); - } - $ret = join('.', @normal_sec_num[0..$level]); - } - - $ret .= "." if $level == 0; - return $ret; -} - -sub incr_sec_num { - local($level, $l); - $level = shift(@_); - $_[$level]++; - foreach $l ($level+1 .. 3) { - $_[$l] = 0; - } -} - -sub Sec2UpNode -{ - my $sec = shift; - my $num = $sec2number{$sec}; - - return '' unless $num; - return 'Top' unless $num =~ /\.\d+/; - $num =~ s/\.[^\.]*$//; - $num = $num . '.' unless $num =~ /\./; - return $sec2node{$number2sec{$num}}; -} - -sub Sec2PrevNode -{ - my $sec = shift; - my $num = $sec2number{$sec}; - my ($i, $post); - - if ($num =~ /(\w+)(\.$|$)/) - { - $num = $`; - $i = $1; - $post = $2; - if ($i eq 'A') - { - $i = $normal_sec_num[0]; - } - elsif ($i ne '1') - { - # unfortunately, -- operator is not magical - $i = chr(ord($i) + 1); - } - else - { - return ''; - } - return $sec2node{$number2sec{$num . $i . $post}} - } - return ''; -} - -sub Sec2NextNode -{ - my $sec = shift; - my $num = $sec2number{$sec}; - my $i; - - if ($num =~ /(\w+)(\.$|$)/) - { - $num = $`; - $i = $1; - $post = $2; - if ($post eq '.' && $i eq $normal_sec_num[0]) - { - $i = 'A'; - } - else - { - $i++; - } - return $sec2node{$number2sec{$num . $i . $post}} - } - return ''; -} - -sub check { - local($_, %seen, %context, $before, $match, $after); - - while (<>) { - if (/\@(\*|\.|\:|\@|\{|\})/) { - $seen{$&}++; - $context{$&} .= "> $_" if $T2H_VERBOSE; - $_ = "$`XX$'"; - redo; - } - if (/\@(\w+)/) { - ($before, $match, $after) = ($`, $&, $'); - if ($before =~ /\b[\w-]+$/ && $after =~ /^[\w-.]*\b/) { # e-mail address - $seen{'e-mail address'}++; - $context{'e-mail address'} .= "> $_" if $T2H_VERBOSE; - } else { - $seen{$match}++; - $context{$match} .= "> $_" if $T2H_VERBOSE; - } - $match =~ s/^\@/X/; - $_ = "$before$match$after"; - redo; - } - } - - foreach (sort(keys(%seen))) { - if ($T2H_VERBOSE) { - print "$_\n"; - print $context{$_}; - } else { - print "$_ ($seen{$_})\n"; - } - } -} - -sub open { - local($name) = @_; - - ++$fh_name; - if (open($fh_name, $name)) { - unshift(@fhs, $fh_name); - } else { - warn "$ERROR Can't read file $name: $!\n"; - } -} - -sub init_input { - @fhs = (); # hold the file handles to read - @input_spool = (); # spooled lines to read - $fh_name = 'FH000'; - &open($docu); -} - -sub next_line { - local($fh, $line); - - if (@input_spool) { - $line = shift(@input_spool); - return($line); - } - while (@fhs) { - $fh = $fhs[0]; - $line = <$fh>; - return($line) if $line; - close($fh); - shift(@fhs); - } - return(undef); -} - -# used in pass 1, use &next_line -sub skip_until { - local($tag) = @_; - local($_); - - while ($_ = &next_line) { - return if /^\@end\s+$tag\s*$/; - } - die "* Failed to find '$tag' after: " . $lines[$#lines]; -} - -# used in pass 1 for l2h use &next_line -sub string_until { - local($tag) = @_; - local($_, $string); - - while ($_ = &next_line) { - return $string if /^\@end\s+$tag\s*$/; -# $_ =~ s/hbox/mbox/g; - $string = $string.$_; - } - die "* Failed to find '$tag' after: " . $lines[$#lines]; -} - -# -# HTML stacking to have a better HTML output -# - -sub html_reset { - @html_stack = ('html'); - $html_element = 'body'; -} - -sub html_push { - local($what) = @_; - push(@html_stack, $html_element); - $html_element = $what; -} - -sub html_push_if { - local($what) = @_; - push(@html_stack, $html_element) - if ($html_element && $html_element ne 'P'); - $html_element = $what; -} - -sub html_pop { - $html_element = pop(@html_stack); -} - -sub html_pop_if { - local($elt); - - if (@_) { - foreach $elt (@_) { - if ($elt eq $html_element) { - $html_element = pop(@html_stack) if @html_stack; - last; - } - } - } else { - $html_element = pop(@html_stack) if @html_stack; - } -} - -sub html_debug { - local($what, $line) = @_; - if ($T2H_DEBUG & $DEBUG_HTML) - { - $what = "\n" unless $what; - return("$what") - } - return($what); -} - -# to debug the output... -sub debug { - local($what, $line) = @_; - return("$what") - if $T2H_DEBUG & $DEBUG_HTML; - return($what); -} - -sub SimpleTexi2Html -{ - local $_ = $_[0]; - &protect_texi; - &protect_html; - $_ = substitute_style($_); - $_[0] = $_; -} - -sub normalise_node { - local $_ = $_[0]; - s/\s+/ /g; - s/ $//; - s/^ //; - &protect_texi; - &protect_html; - $_ = substitute_style($_); - $_[0] = $_; -} - -sub menu_entry -{ - my ($node, $name, $descr) = @_; - my ($href, $entry); - - &normalise_node($node); - $href = $node2href{$node}; - if ($href) - { - $descr =~ s/^\s+//; - $descr =~ s/\s*$//; - $descr = SimpleTexi2Html($descr); - if ($T2H_NUMBER_SECTIONS && !$T2H_NODE_NAME_IN_MENU && $node2sec{$node}) - { - $entry = $node2sec{$node}; - $name = ''; - } - else - { - &normalise_node($name); - $entry = ($name && ($name ne $node || ! $T2H_AVOID_MENU_REDUNDANCY) - ? "$name : $node" : $node); - } - - if ($T2H_AVOID_MENU_REDUNDANCY && $descr) - { - my $clean_entry = $entry; - $clean_entry =~ s/^.*? // if ($clean_entry =~ /^([A-Z]|\d+)\.[\d\.]* /); - $clean_entry =~ s/[^\w]//g; - my $clean_descr = $descr; - $clean_descr =~ s/[^\w]//g; - $descr = '' if ($clean_entry eq $clean_descr) - } - push(@lines2,&debug('
    \n", __LINE__)); - } - elsif ($node =~ /^\(.*\)\w+/) - { - push(@lines2,&debug('\n", __LINE__)) - } - else - { - warn "$ERROR Undefined node of menu_entry ($node): $_"; - } -} - -sub do_ctrl { "^$_[0]" } - -sub do_email { - local($addr, $text) = split(/,\s*/, $_[0]); - - $text = $addr unless $text; - &t2h_anchor('', "mailto:$addr", $text); -} - -sub do_sc -{ - # l2h does this much better - return &l2h_ToLatex("{\\sc ".&unprotect_html($_[0])."}") if ($T2H_L2H); - return "\U$_[0]\E"; -} - -sub do_math -{ - return &l2h_ToLatex("\$".&unprotect_html($_[0])."\$") if ($T2H_L2H); - return "".$text.""; -} - -sub do_uref { - local($url, $text, $only_text) = split(/,\s*/, $_[0]); - - $text = $only_text if $only_text; - $text = $url unless $text; - &t2h_anchor('', $url, $text); -} - -sub do_url { &t2h_anchor('', $_[0], $_[0]) } - -sub do_acronym -{ - return '' . $_[0] . ''; -} - -sub do_accent -{ - return "&$_[0]acute;" if $_[1] eq 'H'; - return "$_[0]." if $_[1] eq 'dotaccent'; - return "$_[0]*" if $_[1] eq 'ringaccent'; - return "$_[0]".'[' if $_[1] eq 'tieaccent'; - return "$_[0]".'(' if $_[1] eq 'u'; - return "$_[0]_" if $_[1] eq 'ubaraccent'; - return ".$_[0]" if $_[1] eq 'udotaccent'; - return "$_[0]<" if $_[1] eq 'v'; - return "&$_[0]cedil;" if $_[1] eq ','; - return "$_[0]" if $_[1] eq 'dotless'; - return undef; -} - -sub apply_style { - local($texi_style, $text) = @_; - local($style); - - $style = $style_map{$texi_style}; - if (defined($style)) { # known style - if ($style =~ /^\"/) { # add quotes - $style = $'; - $text = "\`$text\'"; - } - if ($style =~ /^\&/) { # custom - $style = $'; - $text = &$style($text, $texi_style); - } elsif ($style) { # good style - $text = "<$style>$text"; - } else { # no style - } - } else { # unknown style - $text = undef; - } - return($text); -} - -# remove Texinfo styles -sub remove_style { - local($_) = @_; - 1 while(s/\@\w+{([^\{\}]+)}/$1/g); - return($_); -} - -sub remove_things -{ - local ($_) = @_; - s|\@(\w+)\{\}|$1|g; - return $_; -} - -sub substitute_style { - local($_) = @_; - local($changed, $done, $style, $text); - - &simple_substitutions; - $changed = 1; - while ($changed) { - $changed = 0; - $done = ''; - while (/\@(\w+){([^\{\}]+)}/ || /\@(,){([^\{\}]+)}/) { - $text = &apply_style($1, $2); - if ($text) { - $_ = "$`$text$'"; - $changed = 1; - } else { - $done .= "$`\@$1"; - $_ = "{$2}$'"; - } - } - $_ = $done . $_; - } - return($_); -} - -sub t2h_anchor { - local($name, $href, $text, $newline, $extra_attribs) = @_; - local($result); - - $result = " - $what =~ s/\&/\&\#38;/g; - $what =~ s/\/\&\#62;/g; - # restore anything in quotes - # this fixes my problem where I had: - # < IMG SRC="leftarrow.gif" ALT="<--" > but what if I wanted < in my ALT text ?? - # maybe byte stuffing or some other technique should be used. - $what =~ s/\"([^\&]+)\&\#60;(.*)\"/"$1<$2"/g; - $what =~ s/\"([^\&]+)\&\#62;(.*)\"/"$1>$2"/g; - $what =~ s/\"([^\&]+)\&\#38;(.*)\"/"$1&$2"/g; - # but recognize some HTML things - $what =~ s/\&\#60;\/A\&\#62;/<\/A>/g; # - $what =~ s/\&\#60;A ([^\&]+)\&\#62;//g; # - $what =~ s/\&\#60;IMG ([^\&]+)\&\#62;//g; # - return($what); -} - -sub unprotect_texi { - s/$;0/\@/go; - s/$;1/\{/go; - s/$;2/\}/go; - s/$;3/\`/go; - s/$;4/\'/go; -} - -sub Unprotect_texi -{ - local $_ = shift; - &unprotect_texi; - return($_); -} - -sub unprotect_html { - local($what) = @_; - $what =~ s/\&\#38;/\&/g; - $what =~ s/\&\#60;/\/g; - return($what); -} - -sub t2h_print_label -{ - my $fh = shift; - my $href = shift || $T2H_HREF{This}; - $href =~ s/.*#(.*)$/$1/; - print $fh qq{\n}; -} - -############################################################################## - - # These next few lines are legal in both Perl and nroff. - -.00 ; # finish .ig - -'di \" finish diversion--previous line must be blank -.nr nl 0-1 \" fake up transition to first page again -.nr % 0 \" start at page 1 -'; __END__ ############# From here on it's a standard manual page ############ -.so /usr/local/man/man1/texi2html.1 diff --git a/dep/src/readline/src/doc/texinfo.tex b/dep/src/readline/src/doc/texinfo.tex deleted file mode 100644 index 555a07707ab..00000000000 --- a/dep/src/readline/src/doc/texinfo.tex +++ /dev/null @@ -1,6688 +0,0 @@ -% texinfo.tex -- TeX macros to handle Texinfo files. -% -% Load plain if necessary, i.e., if running under initex. -\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi -% -\def\texinfoversion{2003-02-03.16} -% -% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, -% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. -% -% This texinfo.tex file is free software; you can redistribute it and/or -% modify it under the terms of the GNU General Public License as -% published by the Free Software Foundation; either version 2, or (at -% your option) any later version. -% -% This texinfo.tex file is distributed in the hope that it will be -% useful, but WITHOUT ANY WARRANTY; without even the implied warranty -% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -% General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this texinfo.tex file; see the file COPYING. If not, write -% to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -% Boston, MA 02111-1307, USA. -% -% In other words, you are welcome to use, share and improve this program. -% You are forbidden to forbid anyone else to use, share and improve -% what you give them. Help stamp out software-hoarding! -% -% Please try the latest version of texinfo.tex before submitting bug -% reports; you can get the latest version from: -% ftp://ftp.gnu.org/gnu/texinfo/texinfo.tex -% (and all GNU mirrors, see http://www.gnu.org/order/ftp.html) -% ftp://tug.org/tex/texinfo.tex -% (and all CTAN mirrors, see http://www.ctan.org), -% and /home/gd/gnu/doc/texinfo.tex on the GNU machines. -% -% The GNU Texinfo home page is http://www.gnu.org/software/texinfo. -% -% The texinfo.tex in any given Texinfo distribution could well be out -% of date, so if that's what you're using, please check. -% -% Send bug reports to bug-texinfo@gnu.org. Please include including a -% complete document in each bug report with which we can reproduce the -% problem. Patches are, of course, greatly appreciated. -% -% To process a Texinfo manual with TeX, it's most reliable to use the -% texi2dvi shell script that comes with the distribution. For a simple -% manual foo.texi, however, you can get away with this: -% tex foo.texi -% texindex foo.?? -% tex foo.texi -% tex foo.texi -% dvips foo.dvi -o # or whatever; this makes foo.ps. -% The extra TeX runs get the cross-reference information correct. -% Sometimes one run after texindex suffices, and sometimes you need more -% than two; texi2dvi does it as many times as necessary. -% -% It is possible to adapt texinfo.tex for other languages, to some -% extent. You can get the existing language-specific files from the -% full Texinfo distribution. - -\message{Loading texinfo [version \texinfoversion]:} - -% If in a .fmt file, print the version number -% and turn on active characters that we couldn't do earlier because -% they might have appeared in the input file name. -\everyjob{\message{[Texinfo version \texinfoversion]}% - \catcode`+=\active \catcode`\_=\active} - -\message{Basics,} -\chardef\other=12 - -% We never want plain's outer \+ definition in Texinfo. -% For @tex, we can use \tabalign. -\let\+ = \relax - -% Save some parts of plain tex whose names we will redefine. -\let\ptexb=\b -\let\ptexbullet=\bullet -\let\ptexc=\c -\let\ptexcomma=\, -\let\ptexdot=\. -\let\ptexdots=\dots -\let\ptexend=\end -\let\ptexequiv=\equiv -\let\ptexexclam=\! -\let\ptexgtr=> -\let\ptexhat=^ -\let\ptexi=\i -\let\ptexlbrace=\{ -\let\ptexless=< -\let\ptexplus=+ -\let\ptexrbrace=\} -\let\ptexstar=\* -\let\ptext=\t - -% If this character appears in an error message or help string, it -% starts a new line in the output. -\newlinechar = `^^J - -% Set up fixed words for English if not already set. -\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi -\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi -\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi -\ifx\putwordin\undefined \gdef\putwordin{in}\fi -\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi -\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi -\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi -\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi -\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi -\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi -\ifx\putwordof\undefined \gdef\putwordof{of}\fi -\ifx\putwordon\undefined \gdef\putwordon{on}\fi -\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi -\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi -\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi -\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi -\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi -\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi -\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi -% -\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi -\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi -\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi -\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi -\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi -\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi -\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi -\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi -\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi -\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi -\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi -\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi -% -\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi -\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi -\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi -\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi -\ifx\putwordDeftypevar\undefined\gdef\putwordDeftypevar{Variable}\fi -\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi -\ifx\putwordDeftypefun\undefined\gdef\putwordDeftypefun{Function}\fi - -% In some macros, we cannot use the `\? notation---the left quote is -% in some cases the escape char. -\chardef\colonChar = `\: -\chardef\commaChar = `\, -\chardef\dotChar = `\. -\chardef\equalChar = `\= -\chardef\exclamChar= `\! -\chardef\questChar = `\? -\chardef\semiChar = `\; -\chardef\spaceChar = `\ % -\chardef\underChar = `\_ - -% Ignore a token. -% -\def\gobble#1{} - -% True if #1 is the empty string, i.e., called like `\ifempty{}'. -% -\def\ifempty#1{\ifemptyx #1\emptymarkA\emptymarkB}% -\def\ifemptyx#1#2\emptymarkB{\ifx #1\emptymarkA}% - -% Hyphenation fixes. -\hyphenation{ap-pen-dix} -\hyphenation{mini-buf-fer mini-buf-fers} -\hyphenation{eshell} -\hyphenation{white-space} - -% Margin to add to right of even pages, to left of odd pages. -\newdimen\bindingoffset -\newdimen\normaloffset -\newdimen\pagewidth \newdimen\pageheight - -% Sometimes it is convenient to have everything in the transcript file -% and nothing on the terminal. We don't just call \tracingall here, -% since that produces some useless output on the terminal. We also make -% some effort to order the tracing commands to reduce output in the log -% file; cf. trace.sty in LaTeX. -% -\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% -\def\loggingall{% - \tracingstats2 - \tracingpages1 - \tracinglostchars2 % 2 gives us more in etex - \tracingparagraphs1 - \tracingoutput1 - \tracingmacros2 - \tracingrestores1 - \showboxbreadth\maxdimen \showboxdepth\maxdimen - \ifx\eTeXversion\undefined\else % etex gives us more logging - \tracingscantokens1 - \tracingifs1 - \tracinggroups1 - \tracingnesting2 - \tracingassigns1 - \fi - \tracingcommands3 % 3 gives us more in etex - \errorcontextlines\maxdimen -}% - -% add check for \lastpenalty to plain's definitions. If the last thing -% we did was a \nobreak, we don't want to insert more space. -% -\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount - \removelastskip\penalty-50\smallskip\fi\fi} -\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount - \removelastskip\penalty-100\medskip\fi\fi} -\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount - \removelastskip\penalty-200\bigskip\fi\fi} - -% For @cropmarks command. -% Do @cropmarks to get crop marks. -% -\newif\ifcropmarks -\let\cropmarks = \cropmarkstrue -% -% Dimensions to add cropmarks at corners. -% Added by P. A. MacKay, 12 Nov. 1986 -% -\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines -\newdimen\cornerlong \cornerlong=1pc -\newdimen\cornerthick \cornerthick=.3pt -\newdimen\topandbottommargin \topandbottommargin=.75in - -% Main output routine. -\chardef\PAGE = 255 -\output = {\onepageout{\pagecontents\PAGE}} - -\newbox\headlinebox -\newbox\footlinebox - -% \onepageout takes a vbox as an argument. Note that \pagecontents -% does insertions, but you have to call it yourself. -\def\onepageout#1{% - \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi - % - \ifodd\pageno \advance\hoffset by \bindingoffset - \else \advance\hoffset by -\bindingoffset\fi - % - % Do this outside of the \shipout so @code etc. will be expanded in - % the headline as they should be, not taken literally (outputting ''code). - \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% - \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% - % - {% - % Have to do this stuff outside the \shipout because we want it to - % take effect in \write's, yet the group defined by the \vbox ends - % before the \shipout runs. - % - \escapechar = `\\ % use backslash in output files. - \indexdummies % don't expand commands in the output. - \normalturnoffactive % \ in index entries must not stay \, e.g., if - % the page break happens to be in the middle of an example. - \shipout\vbox{% - % Do this early so pdf references go to the beginning of the page. - \ifpdfmakepagedest \pdfmkdest{\the\pageno} \fi - % - \ifcropmarks \vbox to \outervsize\bgroup - \hsize = \outerhsize - \vskip-\topandbottommargin - \vtop to0pt{% - \line{\ewtop\hfil\ewtop}% - \nointerlineskip - \line{% - \vbox{\moveleft\cornerthick\nstop}% - \hfill - \vbox{\moveright\cornerthick\nstop}% - }% - \vss}% - \vskip\topandbottommargin - \line\bgroup - \hfil % center the page within the outer (page) hsize. - \ifodd\pageno\hskip\bindingoffset\fi - \vbox\bgroup - \fi - % - \unvbox\headlinebox - \pagebody{#1}% - \ifdim\ht\footlinebox > 0pt - % Only leave this space if the footline is nonempty. - % (We lessened \vsize for it in \oddfootingxxx.) - % The \baselineskip=24pt in plain's \makefootline has no effect. - \vskip 2\baselineskip - \unvbox\footlinebox - \fi - % - \ifcropmarks - \egroup % end of \vbox\bgroup - \hfil\egroup % end of (centering) \line\bgroup - \vskip\topandbottommargin plus1fill minus1fill - \boxmaxdepth = \cornerthick - \vbox to0pt{\vss - \line{% - \vbox{\moveleft\cornerthick\nsbot}% - \hfill - \vbox{\moveright\cornerthick\nsbot}% - }% - \nointerlineskip - \line{\ewbot\hfil\ewbot}% - }% - \egroup % \vbox from first cropmarks clause - \fi - }% end of \shipout\vbox - }% end of group with \normalturnoffactive - \advancepageno - \ifnum\outputpenalty>-20000 \else\dosupereject\fi -} - -\newinsert\margin \dimen\margin=\maxdimen - -\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} -{\catcode`\@ =11 -\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi -% marginal hacks, juha@viisa.uucp (Juha Takala) -\ifvoid\margin\else % marginal info is present - \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi -\dimen@=\dp#1 \unvbox#1 -\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi -\ifr@ggedbottom \kern-\dimen@ \vfil \fi} -} - -% Here are the rules for the cropmarks. Note that they are -% offset so that the space between them is truly \outerhsize or \outervsize -% (P. A. MacKay, 12 November, 1986) -% -\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} -\def\nstop{\vbox - {\hrule height\cornerthick depth\cornerlong width\cornerthick}} -\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} -\def\nsbot{\vbox - {\hrule height\cornerlong depth\cornerthick width\cornerthick}} - -% Parse an argument, then pass it to #1. The argument is the rest of -% the input line (except we remove a trailing comment). #1 should be a -% macro which expects an ordinary undelimited TeX argument. -% -\def\parsearg#1{% - \let\next = #1% - \begingroup - \obeylines - \futurelet\temp\parseargx -} - -% If the next token is an obeyed space (from an @example environment or -% the like), remove it and recurse. Otherwise, we're done. -\def\parseargx{% - % \obeyedspace is defined far below, after the definition of \sepspaces. - \ifx\obeyedspace\temp - \expandafter\parseargdiscardspace - \else - \expandafter\parseargline - \fi -} - -% Remove a single space (as the delimiter token to the macro call). -{\obeyspaces % - \gdef\parseargdiscardspace {\futurelet\temp\parseargx}} - -{\obeylines % - \gdef\parseargline#1^^M{% - \endgroup % End of the group started in \parsearg. - % - % First remove any @c comment, then any @comment. - % Result of each macro is put in \toks0. - \argremovec #1\c\relax % - \expandafter\argremovecomment \the\toks0 \comment\relax % - % - % Call the caller's macro, saved as \next in \parsearg. - \expandafter\next\expandafter{\the\toks0}% - }% -} - -% Since all \c{,omment} does is throw away the argument, we can let TeX -% do that for us. The \relax here is matched by the \relax in the call -% in \parseargline; it could be more or less anything, its purpose is -% just to delimit the argument to the \c. -\def\argremovec#1\c#2\relax{\toks0 = {#1}} -\def\argremovecomment#1\comment#2\relax{\toks0 = {#1}} - -% \argremovec{,omment} might leave us with trailing spaces, though; e.g., -% @end itemize @c foo -% will have two active spaces as part of the argument with the -% `itemize'. Here we remove all active spaces from #1, and assign the -% result to \toks0. -% -% This loses if there are any *other* active characters besides spaces -% in the argument -- _ ^ +, for example -- since they get expanded. -% Fortunately, Texinfo does not define any such commands. (If it ever -% does, the catcode of the characters in questionwill have to be changed -% here.) But this means we cannot call \removeactivespaces as part of -% \argremovec{,omment}, since @c uses \parsearg, and thus the argument -% that \parsearg gets might well have any character at all in it. -% -\def\removeactivespaces#1{% - \begingroup - \ignoreactivespaces - \edef\temp{#1}% - \global\toks0 = \expandafter{\temp}% - \endgroup -} - -% Change the active space to expand to nothing. -% -\begingroup - \obeyspaces - \gdef\ignoreactivespaces{\obeyspaces\let =\empty} -\endgroup - - -\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} - -%% These are used to keep @begin/@end levels from running away -%% Call \inENV within environments (after a \begingroup) -\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi} -\def\ENVcheck{% -\ifENV\errmessage{Still within an environment; press RETURN to continue} -\endgroup\fi} % This is not perfect, but it should reduce lossage - -% @begin foo is the same as @foo, for now. -\newhelp\EMsimple{Press RETURN to continue.} - -\outer\def\begin{\parsearg\beginxxx} - -\def\beginxxx #1{% -\expandafter\ifx\csname #1\endcsname\relax -{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else -\csname #1\endcsname\fi} - -% @end foo executes the definition of \Efoo. -% -\def\end{\parsearg\endxxx} -\def\endxxx #1{% - \removeactivespaces{#1}% - \edef\endthing{\the\toks0}% - % - \expandafter\ifx\csname E\endthing\endcsname\relax - \expandafter\ifx\csname \endthing\endcsname\relax - % There's no \foo, i.e., no ``environment'' foo. - \errhelp = \EMsimple - \errmessage{Undefined command `@end \endthing'}% - \else - \unmatchedenderror\endthing - \fi - \else - % Everything's ok; the right environment has been started. - \csname E\endthing\endcsname - \fi -} - -% There is an environment #1, but it hasn't been started. Give an error. -% -\def\unmatchedenderror#1{% - \errhelp = \EMsimple - \errmessage{This `@end #1' doesn't have a matching `@#1'}% -} - -% Define the control sequence \E#1 to give an unmatched @end error. -% -\def\defineunmatchedend#1{% - \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}% -} - - -%% Simple single-character @ commands - -% @@ prints an @ -% Kludge this until the fonts are right (grr). -\def\@{{\tt\char64}} - -% This is turned off because it was never documented -% and you can use @w{...} around a quote to suppress ligatures. -%% Define @` and @' to be the same as ` and ' -%% but suppressing ligatures. -%\def\`{{`}} -%\def\'{{'}} - -% Used to generate quoted braces. -\def\mylbrace {{\tt\char123}} -\def\myrbrace {{\tt\char125}} -\let\{=\mylbrace -\let\}=\myrbrace -\begingroup - % Definitions to produce \{ and \} commands for indices, - % and @{ and @} for the aux file. - \catcode`\{ = \other \catcode`\} = \other - \catcode`\[ = 1 \catcode`\] = 2 - \catcode`\! = 0 \catcode`\\ = \other - !gdef!lbracecmd[\{]% - !gdef!rbracecmd[\}]% - !gdef!lbraceatcmd[@{]% - !gdef!rbraceatcmd[@}]% -!endgroup - -% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent -% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. -\let\, = \c -\let\dotaccent = \. -\def\ringaccent#1{{\accent23 #1}} -\let\tieaccent = \t -\let\ubaraccent = \b -\let\udotaccent = \d - -% Other special characters: @questiondown @exclamdown -% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. -\def\questiondown{?`} -\def\exclamdown{!`} - -% Dotless i and dotless j, used for accents. -\def\imacro{i} -\def\jmacro{j} -\def\dotless#1{% - \def\temp{#1}% - \ifx\temp\imacro \ptexi - \else\ifx\temp\jmacro \j - \else \errmessage{@dotless can be used only with i or j}% - \fi\fi -} - -% Be sure we're in horizontal mode when doing a tie, since we make space -% equivalent to this in @example-like environments. Otherwise, a space -% at the beginning of a line will start with \penalty -- and -% since \penalty is valid in vertical mode, we'd end up putting the -% penalty on the vertical list instead of in the new paragraph. -{\catcode`@ = 11 - % Avoid using \@M directly, because that causes trouble - % if the definition is written into an index file. - \global\let\tiepenalty = \@M - \gdef\tie{\leavevmode\penalty\tiepenalty\ } -} - -% @: forces normal size whitespace following. -\def\:{\spacefactor=1000 } - -% @* forces a line break. -\def\*{\hfil\break\hbox{}\ignorespaces} - -% @. is an end-of-sentence period. -\def\.{.\spacefactor=3000 } - -% @! is an end-of-sentence bang. -\def\!{!\spacefactor=3000 } - -% @? is an end-of-sentence query. -\def\?{?\spacefactor=3000 } - -% @w prevents a word break. Without the \leavevmode, @w at the -% beginning of a paragraph, when TeX is still in vertical mode, would -% produce a whole line of output instead of starting the paragraph. -\def\w#1{\leavevmode\hbox{#1}} - -% @group ... @end group forces ... to be all on one page, by enclosing -% it in a TeX vbox. We use \vtop instead of \vbox to construct the box -% to keep its height that of a normal line. According to the rules for -% \topskip (p.114 of the TeXbook), the glue inserted is -% max (\topskip - \ht (first item), 0). If that height is large, -% therefore, no glue is inserted, and the space between the headline and -% the text is small, which looks bad. -% -% Another complication is that the group might be very large. This can -% cause the glue on the previous page to be unduly stretched, because it -% does not have much material. In this case, it's better to add an -% explicit \vfill so that the extra space is at the bottom. The -% threshold for doing this is if the group is more than \vfilllimit -% percent of a page (\vfilllimit can be changed inside of @tex). -% -\newbox\groupbox -\def\vfilllimit{0.7} -% -\def\group{\begingroup - \ifnum\catcode13=\active \else - \errhelp = \groupinvalidhelp - \errmessage{@group invalid in context where filling is enabled}% - \fi - % - % The \vtop we start below produces a box with normal height and large - % depth; thus, TeX puts \baselineskip glue before it, and (when the - % next line of text is done) \lineskip glue after it. (See p.82 of - % the TeXbook.) Thus, space below is not quite equal to space - % above. But it's pretty close. - \def\Egroup{% - \egroup % End the \vtop. - % \dimen0 is the vertical size of the group's box. - \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox - % \dimen2 is how much space is left on the page (more or less). - \dimen2 = \pageheight \advance\dimen2 by -\pagetotal - % if the group doesn't fit on the current page, and it's a big big - % group, force a page break. - \ifdim \dimen0 > \dimen2 - \ifdim \pagetotal < \vfilllimit\pageheight - \page - \fi - \fi - \copy\groupbox - \endgroup % End the \group. - }% - % - \setbox\groupbox = \vtop\bgroup - % We have to put a strut on the last line in case the @group is in - % the midst of an example, rather than completely enclosing it. - % Otherwise, the interline space between the last line of the group - % and the first line afterwards is too small. But we can't put the - % strut in \Egroup, since there it would be on a line by itself. - % Hence this just inserts a strut at the beginning of each line. - \everypar = {\strut}% - % - % Since we have a strut on every line, we don't need any of TeX's - % normal interline spacing. - \offinterlineskip - % - % OK, but now we have to do something about blank - % lines in the input in @example-like environments, which normally - % just turn into \lisppar, which will insert no space now that we've - % turned off the interline space. Simplest is to make them be an - % empty paragraph. - \ifx\par\lisppar - \edef\par{\leavevmode \par}% - % - % Reset ^^M's definition to new definition of \par. - \obeylines - \fi - % - % Do @comment since we are called inside an environment such as - % @example, where each end-of-line in the input causes an - % end-of-line in the output. We don't want the end-of-line after - % the `@group' to put extra space in the output. Since @group - % should appear on a line by itself (according to the Texinfo - % manual), we don't worry about eating any user text. - \comment -} -% -% TeX puts in an \escapechar (i.e., `@') at the beginning of the help -% message, so this ends up printing `@group can only ...'. -% -\newhelp\groupinvalidhelp{% -group can only be used in environments such as @example,^^J% -where each line of input produces a line of output.} - -% @need space-in-mils -% forces a page break if there is not space-in-mils remaining. - -\newdimen\mil \mil=0.001in - -\def\need{\parsearg\needx} - -% Old definition--didn't work. -%\def\needx #1{\par % -%% This method tries to make TeX break the page naturally -%% if the depth of the box does not fit. -%{\baselineskip=0pt% -%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak -%\prevdepth=-1000pt -%}} - -\def\needx#1{% - % Ensure vertical mode, so we don't make a big box in the middle of a - % paragraph. - \par - % - % If the @need value is less than one line space, it's useless. - \dimen0 = #1\mil - \dimen2 = \ht\strutbox - \advance\dimen2 by \dp\strutbox - \ifdim\dimen0 > \dimen2 - % - % Do a \strut just to make the height of this box be normal, so the - % normal leading is inserted relative to the preceding line. - % And a page break here is fine. - \vtop to #1\mil{\strut\vfil}% - % - % TeX does not even consider page breaks if a penalty added to the - % main vertical list is 10000 or more. But in order to see if the - % empty box we just added fits on the page, we must make it consider - % page breaks. On the other hand, we don't want to actually break the - % page after the empty box. So we use a penalty of 9999. - % - % There is an extremely small chance that TeX will actually break the - % page at this \penalty, if there are no other feasible breakpoints in - % sight. (If the user is using lots of big @group commands, which - % almost-but-not-quite fill up a page, TeX will have a hard time doing - % good page breaking, for example.) However, I could not construct an - % example where a page broke at this \penalty; if it happens in a real - % document, then we can reconsider our strategy. - \penalty9999 - % - % Back up by the size of the box, whether we did a page break or not. - \kern -#1\mil - % - % Do not allow a page break right after this kern. - \nobreak - \fi -} - -% @br forces paragraph break - -\let\br = \par - -% @dots{} output an ellipsis using the current font. -% We do .5em per period so that it has the same spacing in a typewriter -% font as three actual period characters. -% -\def\dots{% - \leavevmode - \hbox to 1.5em{% - \hskip 0pt plus 0.25fil minus 0.25fil - .\hss.\hss.% - \hskip 0pt plus 0.5fil minus 0.5fil - }% -} - -% @enddots{} is an end-of-sentence ellipsis. -% -\def\enddots{% - \leavevmode - \hbox to 2em{% - \hskip 0pt plus 0.25fil minus 0.25fil - .\hss.\hss.\hss.% - \hskip 0pt plus 0.5fil minus 0.5fil - }% - \spacefactor=3000 -} - - -% @page forces the start of a new page -% -\def\page{\par\vfill\supereject} - -% @exdent text.... -% outputs text on separate line in roman font, starting at standard page margin - -% This records the amount of indent in the innermost environment. -% That's how much \exdent should take out. -\newskip\exdentamount - -% This defn is used inside fill environments such as @defun. -\def\exdent{\parsearg\exdentyyy} -\def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}} - -% This defn is used inside nofill environments such as @example. -\def\nofillexdent{\parsearg\nofillexdentyyy} -\def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount -\leftline{\hskip\leftskip{\rm#1}}}} - -% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current -% paragraph. For more general purposes, use the \margin insertion -% class. WHICH is `l' or `r'. -% -\newskip\inmarginspacing \inmarginspacing=1cm -\def\strutdepth{\dp\strutbox} -% -\def\doinmargin#1#2{\strut\vadjust{% - \nobreak - \kern-\strutdepth - \vtop to \strutdepth{% - \baselineskip=\strutdepth - \vss - % if you have multiple lines of stuff to put here, you'll need to - % make the vbox yourself of the appropriate size. - \ifx#1l% - \llap{\ignorespaces #2\hskip\inmarginspacing}% - \else - \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% - \fi - \null - }% -}} -\def\inleftmargin{\doinmargin l} -\def\inrightmargin{\doinmargin r} -% -% @inmargin{TEXT [, RIGHT-TEXT]} -% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; -% else use TEXT for both). -% -\def\inmargin#1{\parseinmargin #1,,\finish} -\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. - \setbox0 = \hbox{\ignorespaces #2}% - \ifdim\wd0 > 0pt - \def\lefttext{#1}% have both texts - \def\righttext{#2}% - \else - \def\lefttext{#1}% have only one text - \def\righttext{#1}% - \fi - % - \ifodd\pageno - \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin - \else - \def\temp{\inleftmargin\lefttext}% - \fi - \temp -} - -% @include file insert text of that file as input. -% Allow normal characters that we make active in the argument (a file name). -\def\include{\begingroup - \catcode`\\=\other - \catcode`~=\other - \catcode`^=\other - \catcode`_=\other - \catcode`|=\other - \catcode`<=\other - \catcode`>=\other - \catcode`+=\other - \parsearg\includezzz} -% Restore active chars for included file. -\def\includezzz#1{\endgroup\begingroup - % Read the included file in a group so nested @include's work. - \def\thisfile{#1}% - \let\value=\expandablevalue - \input\thisfile -\endgroup} - -\def\thisfile{} - -% @center line -% outputs that line, centered. -% -\def\center{\parsearg\docenter} -\def\docenter#1{{% - \ifhmode \hfil\break \fi - \advance\hsize by -\leftskip - \advance\hsize by -\rightskip - \line{\hfil \ignorespaces#1\unskip \hfil}% - \ifhmode \break \fi -}} - -% @sp n outputs n lines of vertical space - -\def\sp{\parsearg\spxxx} -\def\spxxx #1{\vskip #1\baselineskip} - -% @comment ...line which is ignored... -% @c is the same as @comment -% @ignore ... @end ignore is another way to write a comment - -\def\comment{\begingroup \catcode`\^^M=\other% -\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% -\commentxxx} -{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} - -\let\c=\comment - -% @paragraphindent NCHARS -% We'll use ems for NCHARS, close enough. -% We cannot implement @paragraphindent asis, though. -% -\def\asisword{asis} % no translation, these are keywords -\def\noneword{none} -% -\def\paragraphindent{\parsearg\doparagraphindent} -\def\doparagraphindent#1{% - \def\temp{#1}% - \ifx\temp\asisword - \else - \ifx\temp\noneword - \defaultparindent = 0pt - \else - \defaultparindent = #1em - \fi - \fi - \parindent = \defaultparindent -} - -% @exampleindent NCHARS -% We'll use ems for NCHARS like @paragraphindent. -% It seems @exampleindent asis isn't necessary, but -% I preserve it to make it similar to @paragraphindent. -\def\exampleindent{\parsearg\doexampleindent} -\def\doexampleindent#1{% - \def\temp{#1}% - \ifx\temp\asisword - \else - \ifx\temp\noneword - \lispnarrowing = 0pt - \else - \lispnarrowing = #1em - \fi - \fi -} - -% @asis just yields its argument. Used with @table, for example. -% -\def\asis#1{#1} - -% @math outputs its argument in math mode. -% We don't use $'s directly in the definition of \math because we need -% to set catcodes according to plain TeX first, to allow for subscripts, -% superscripts, special math chars, etc. -% -\let\implicitmath = $%$ font-lock fix -% -% One complication: _ usually means subscripts, but it could also mean -% an actual _ character, as in @math{@var{some_variable} + 1}. So make -% _ within @math be active (mathcode "8000), and distinguish by seeing -% if the current family is \slfam, which is what @var uses. -% -{\catcode\underChar = \active -\gdef\mathunderscore{% - \catcode\underChar=\active - \def_{\ifnum\fam=\slfam \_\else\sb\fi}% -}} -% -% Another complication: we want \\ (and @\) to output a \ character. -% FYI, plain.tex uses \\ as a temporary control sequence (why?), but -% this is not advertised and we don't care. Texinfo does not -% otherwise define @\. -% -% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. -\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} -% -\def\math{% - \tex - \mathcode`\_="8000 \mathunderscore - \let\\ = \mathbackslash - \mathactive - \implicitmath\finishmath} -\def\finishmath#1{#1\implicitmath\Etex} - -% Some active characters (such as <) are spaced differently in math. -% We have to reset their definitions in case the @math was an -% argument to a command which set the catcodes (such as @item or @section). -% -{ - \catcode`^ = \active - \catcode`< = \active - \catcode`> = \active - \catcode`+ = \active - \gdef\mathactive{% - \let^ = \ptexhat - \let< = \ptexless - \let> = \ptexgtr - \let+ = \ptexplus - } -} - -% @bullet and @minus need the same treatment as @math, just above. -\def\bullet{\implicitmath\ptexbullet\implicitmath} -\def\minus{\implicitmath-\implicitmath} - -% @refill is a no-op. -\let\refill=\relax - -% If working on a large document in chapters, it is convenient to -% be able to disable indexing, cross-referencing, and contents, for test runs. -% This is done with @novalidate (before @setfilename). -% -\newif\iflinks \linkstrue % by default we want the aux files. -\let\novalidate = \linksfalse - -% @setfilename is done at the beginning of every texinfo file. -% So open here the files we need to have open while reading the input. -% This makes it possible to make a .fmt file for texinfo. -\def\setfilename{% - \iflinks - \readauxfile - \fi % \openindices needs to do some work in any case. - \openindices - \fixbackslash % Turn off hack to swallow `\input texinfo'. - \global\let\setfilename=\comment % Ignore extra @setfilename cmds. - % - % If texinfo.cnf is present on the system, read it. - % Useful for site-wide @afourpaper, etc. - % Just to be on the safe side, close the input stream before the \input. - \openin 1 texinfo.cnf - \ifeof1 \let\temp=\relax \else \def\temp{\input texinfo.cnf }\fi - \closein1 - \temp - % - \comment % Ignore the actual filename. -} - -% Called from \setfilename. -% -\def\openindices{% - \newindex{cp}% - \newcodeindex{fn}% - \newcodeindex{vr}% - \newcodeindex{tp}% - \newcodeindex{ky}% - \newcodeindex{pg}% -} - -% @bye. -\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} - - -\message{pdf,} -% adobe `portable' document format -\newcount\tempnum -\newcount\lnkcount -\newtoks\filename -\newcount\filenamelength -\newcount\pgn -\newtoks\toksA -\newtoks\toksB -\newtoks\toksC -\newtoks\toksD -\newbox\boxA -\newcount\countA -\newif\ifpdf -\newif\ifpdfmakepagedest - -\ifx\pdfoutput\undefined - \pdffalse - \let\pdfmkdest = \gobble - \let\pdfurl = \gobble - \let\endlink = \relax - \let\linkcolor = \relax - \let\pdfmakeoutlines = \relax -\else - \pdftrue - \pdfoutput = 1 - \input pdfcolor - \def\dopdfimage#1#2#3{% - \def\imagewidth{#2}% - \def\imageheight{#3}% - % without \immediate, pdftex seg faults when the same image is - % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) - \ifnum\pdftexversion < 14 - \immediate\pdfimage - \else - \immediate\pdfximage - \fi - \ifx\empty\imagewidth\else width \imagewidth \fi - \ifx\empty\imageheight\else height \imageheight \fi - \ifnum\pdftexversion<13 - #1.pdf% - \else - {#1.pdf}% - \fi - \ifnum\pdftexversion < 14 \else - \pdfrefximage \pdflastximage - \fi} - \def\pdfmkdest#1{{\normalturnoffactive \pdfdest name{#1} xyz}} - \def\pdfmkpgn#1{#1} - \let\linkcolor = \Blue % was Cyan, but that seems light? - \def\endlink{\Black\pdfendlink} - % Adding outlines to PDF; macros for calculating structure of outlines - % come from Petr Olsak - \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% - \else \csname#1\endcsname \fi} - \def\advancenumber#1{\tempnum=\expnumber{#1}\relax - \advance\tempnum by1 - \expandafter\xdef\csname#1\endcsname{\the\tempnum}} - \def\pdfmakeoutlines{{% - \openin 1 \jobname.toc - \ifeof 1\else\begingroup - \closein 1 - % Thanh's hack / proper braces in bookmarks - \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace - \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace - % - \def\chapentry ##1##2##3{} - \def\secentry ##1##2##3##4{\advancenumber{chap##2}} - \def\subsecentry ##1##2##3##4##5{\advancenumber{sec##2.##3}} - \def\subsubsecentry ##1##2##3##4##5##6{\advancenumber{subsec##2.##3.##4}} - \let\appendixentry = \chapentry - \let\unnumbchapentry = \chapentry - \let\unnumbsecentry = \secentry - \let\unnumbsubsecentry = \subsecentry - \let\unnumbsubsubsecentry = \subsubsecentry - \input \jobname.toc - \def\chapentry ##1##2##3{% - \pdfoutline goto name{\pdfmkpgn{##3}}count-\expnumber{chap##2}{##1}} - \def\secentry ##1##2##3##4{% - \pdfoutline goto name{\pdfmkpgn{##4}}count-\expnumber{sec##2.##3}{##1}} - \def\subsecentry ##1##2##3##4##5{% - \pdfoutline goto name{\pdfmkpgn{##5}}count-\expnumber{subsec##2.##3.##4}{##1}} - \def\subsubsecentry ##1##2##3##4##5##6{% - \pdfoutline goto name{\pdfmkpgn{##6}}{##1}} - \let\appendixentry = \chapentry - \let\unnumbchapentry = \chapentry - \let\unnumbsecentry = \secentry - \let\unnumbsubsecentry = \subsecentry - \let\unnumbsubsubsecentry = \subsubsecentry - % - % Make special characters normal for writing to the pdf file. - % - \indexnofonts - \let\tt=\relax - \turnoffactive - \input \jobname.toc - \endgroup\fi - }} - \def\makelinks #1,{% - \def\params{#1}\def\E{END}% - \ifx\params\E - \let\nextmakelinks=\relax - \else - \let\nextmakelinks=\makelinks - \ifnum\lnkcount>0,\fi - \picknum{#1}% - \startlink attr{/Border [0 0 0]} - goto name{\pdfmkpgn{\the\pgn}}% - \linkcolor #1% - \advance\lnkcount by 1% - \endlink - \fi - \nextmakelinks - } - \def\picknum#1{\expandafter\pn#1} - \def\pn#1{% - \def\p{#1}% - \ifx\p\lbrace - \let\nextpn=\ppn - \else - \let\nextpn=\ppnn - \def\first{#1} - \fi - \nextpn - } - \def\ppn#1{\pgn=#1\gobble} - \def\ppnn{\pgn=\first} - \def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,} - \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} - \def\skipspaces#1{\def\PP{#1}\def\D{|}% - \ifx\PP\D\let\nextsp\relax - \else\let\nextsp\skipspaces - \ifx\p\space\else\addtokens{\filename}{\PP}% - \advance\filenamelength by 1 - \fi - \fi - \nextsp} - \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax} - \ifnum\pdftexversion < 14 - \let \startlink \pdfannotlink - \else - \let \startlink \pdfstartlink - \fi - \def\pdfurl#1{% - \begingroup - \normalturnoffactive\def\@{@}% - \let\value=\expandablevalue - \leavevmode\Red - \startlink attr{/Border [0 0 0]}% - user{/Subtype /Link /A << /S /URI /URI (#1) >>}% - % #1 - \endgroup} - \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} - \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} - \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} - \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} - \def\maketoks{% - \expandafter\poptoks\the\toksA|ENDTOKS| - \ifx\first0\adn0 - \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 - \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 - \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 - \else - \ifnum0=\countA\else\makelink\fi - \ifx\first.\let\next=\done\else - \let\next=\maketoks - \addtokens{\toksB}{\the\toksD} - \ifx\first,\addtokens{\toksB}{\space}\fi - \fi - \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi - \next} - \def\makelink{\addtokens{\toksB}% - {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} - \def\pdflink#1{% - \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} - \linkcolor #1\endlink} - \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} -\fi % \ifx\pdfoutput - - -\message{fonts,} -% Font-change commands. - -% Texinfo sort of supports the sans serif font style, which plain TeX does not. -% So we set up a \sf analogous to plain's \rm, etc. -\newfam\sffam -\def\sf{\fam=\sffam \tensf} -\let\li = \sf % Sometimes we call it \li, not \sf. - -% We don't need math for this one. -\def\ttsl{\tenttsl} - -% Default leading. -\newdimen\textleading \textleading = 13.2pt - -% Set the baselineskip to #1, and the lineskip and strut size -% correspondingly. There is no deep meaning behind these magic numbers -% used as factors; they just match (closely enough) what Knuth defined. -% -\def\lineskipfactor{.08333} -\def\strutheightpercent{.70833} -\def\strutdepthpercent {.29167} -% -\def\setleading#1{% - \normalbaselineskip = #1\relax - \normallineskip = \lineskipfactor\normalbaselineskip - \normalbaselines - \setbox\strutbox =\hbox{% - \vrule width0pt height\strutheightpercent\baselineskip - depth \strutdepthpercent \baselineskip - }% -} - -% Set the font macro #1 to the font named #2, adding on the -% specified font prefix (normally `cm'). -% #3 is the font's design size, #4 is a scale factor -\def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4} - -% Use cm as the default font prefix. -% To specify the font prefix, you must define \fontprefix -% before you read in texinfo.tex. -\ifx\fontprefix\undefined -\def\fontprefix{cm} -\fi -% Support font families that don't use the same naming scheme as CM. -\def\rmshape{r} -\def\rmbshape{bx} %where the normal face is bold -\def\bfshape{b} -\def\bxshape{bx} -\def\ttshape{tt} -\def\ttbshape{tt} -\def\ttslshape{sltt} -\def\itshape{ti} -\def\itbshape{bxti} -\def\slshape{sl} -\def\slbshape{bxsl} -\def\sfshape{ss} -\def\sfbshape{ss} -\def\scshape{csc} -\def\scbshape{csc} - -\newcount\mainmagstep -\ifx\bigger\relax - % not really supported. - \mainmagstep=\magstep1 - \setfont\textrm\rmshape{12}{1000} - \setfont\texttt\ttshape{12}{1000} -\else - \mainmagstep=\magstephalf - \setfont\textrm\rmshape{10}{\mainmagstep} - \setfont\texttt\ttshape{10}{\mainmagstep} -\fi -% Instead of cmb10, you may want to use cmbx10. -% cmbx10 is a prettier font on its own, but cmb10 -% looks better when embedded in a line with cmr10 -% (in Bob's opinion). -\setfont\textbf\bfshape{10}{\mainmagstep} -\setfont\textit\itshape{10}{\mainmagstep} -\setfont\textsl\slshape{10}{\mainmagstep} -\setfont\textsf\sfshape{10}{\mainmagstep} -\setfont\textsc\scshape{10}{\mainmagstep} -\setfont\textttsl\ttslshape{10}{\mainmagstep} -\font\texti=cmmi10 scaled \mainmagstep -\font\textsy=cmsy10 scaled \mainmagstep - -% A few fonts for @defun, etc. -\setfont\defbf\bxshape{10}{\magstep1} %was 1314 -\setfont\deftt\ttshape{10}{\magstep1} -\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf} - -% Fonts for indices, footnotes, small examples (9pt). -\setfont\smallrm\rmshape{9}{1000} -\setfont\smalltt\ttshape{9}{1000} -\setfont\smallbf\bfshape{10}{900} -\setfont\smallit\itshape{9}{1000} -\setfont\smallsl\slshape{9}{1000} -\setfont\smallsf\sfshape{9}{1000} -\setfont\smallsc\scshape{10}{900} -\setfont\smallttsl\ttslshape{10}{900} -\font\smalli=cmmi9 -\font\smallsy=cmsy9 - -% Fonts for small examples (8pt). -\setfont\smallerrm\rmshape{8}{1000} -\setfont\smallertt\ttshape{8}{1000} -\setfont\smallerbf\bfshape{10}{800} -\setfont\smallerit\itshape{8}{1000} -\setfont\smallersl\slshape{8}{1000} -\setfont\smallersf\sfshape{8}{1000} -\setfont\smallersc\scshape{10}{800} -\setfont\smallerttsl\ttslshape{10}{800} -\font\smalleri=cmmi8 -\font\smallersy=cmsy8 - -% Fonts for title page: -\setfont\titlerm\rmbshape{12}{\magstep3} -\setfont\titleit\itbshape{10}{\magstep4} -\setfont\titlesl\slbshape{10}{\magstep4} -\setfont\titlett\ttbshape{12}{\magstep3} -\setfont\titlettsl\ttslshape{10}{\magstep4} -\setfont\titlesf\sfbshape{17}{\magstep1} -\let\titlebf=\titlerm -\setfont\titlesc\scbshape{10}{\magstep4} -\font\titlei=cmmi12 scaled \magstep3 -\font\titlesy=cmsy10 scaled \magstep4 -\def\authorrm{\secrm} -\def\authortt{\sectt} - -% Chapter (and unnumbered) fonts (17.28pt). -\setfont\chaprm\rmbshape{12}{\magstep2} -\setfont\chapit\itbshape{10}{\magstep3} -\setfont\chapsl\slbshape{10}{\magstep3} -\setfont\chaptt\ttbshape{12}{\magstep2} -\setfont\chapttsl\ttslshape{10}{\magstep3} -\setfont\chapsf\sfbshape{17}{1000} -\let\chapbf=\chaprm -\setfont\chapsc\scbshape{10}{\magstep3} -\font\chapi=cmmi12 scaled \magstep2 -\font\chapsy=cmsy10 scaled \magstep3 - -% Section fonts (14.4pt). -\setfont\secrm\rmbshape{12}{\magstep1} -\setfont\secit\itbshape{10}{\magstep2} -\setfont\secsl\slbshape{10}{\magstep2} -\setfont\sectt\ttbshape{12}{\magstep1} -\setfont\secttsl\ttslshape{10}{\magstep2} -\setfont\secsf\sfbshape{12}{\magstep1} -\let\secbf\secrm -\setfont\secsc\scbshape{10}{\magstep2} -\font\seci=cmmi12 scaled \magstep1 -\font\secsy=cmsy10 scaled \magstep2 - -% Subsection fonts (13.15pt). -\setfont\ssecrm\rmbshape{12}{\magstephalf} -\setfont\ssecit\itbshape{10}{1315} -\setfont\ssecsl\slbshape{10}{1315} -\setfont\ssectt\ttbshape{12}{\magstephalf} -\setfont\ssecttsl\ttslshape{10}{1315} -\setfont\ssecsf\sfbshape{12}{\magstephalf} -\let\ssecbf\ssecrm -\setfont\ssecsc\scbshape{10}{\magstep1} -\font\sseci=cmmi12 scaled \magstephalf -\font\ssecsy=cmsy10 scaled 1315 -% The smallcaps and symbol fonts should actually be scaled \magstep1.5, -% but that is not a standard magnification. - -% In order for the font changes to affect most math symbols and letters, -% we have to define the \textfont of the standard families. Since -% texinfo doesn't allow for producing subscripts and superscripts except -% in the main text, we don't bother to reset \scriptfont and -% \scriptscriptfont (which would also require loading a lot more fonts). -% -\def\resetmathfonts{% - \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy - \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf - \textfont\ttfam=\tentt \textfont\sffam=\tensf -} - -% The font-changing commands redefine the meanings of \tenSTYLE, instead -% of just \STYLE. We do this so that font changes will continue to work -% in math mode, where it is the current \fam that is relevant in most -% cases, not the current font. Plain TeX does \def\bf{\fam=\bffam -% \tenbf}, for example. By redefining \tenbf, we obviate the need to -% redefine \bf itself. -\def\textfonts{% - \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl - \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc - \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl - \resetmathfonts \setleading{\textleading}} -\def\titlefonts{% - \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl - \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc - \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy - \let\tenttsl=\titlettsl - \resetmathfonts \setleading{25pt}} -\def\titlefont#1{{\titlefonts\rm #1}} -\def\chapfonts{% - \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl - \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc - \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl - \resetmathfonts \setleading{19pt}} -\def\secfonts{% - \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl - \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc - \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl - \resetmathfonts \setleading{16pt}} -\def\subsecfonts{% - \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl - \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc - \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl - \resetmathfonts \setleading{15pt}} -\let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf? -\def\smallfonts{% - \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl - \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc - \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy - \let\tenttsl=\smallttsl - \resetmathfonts \setleading{10.5pt}} -\def\smallerfonts{% - \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl - \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc - \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy - \let\tenttsl=\smallerttsl - \resetmathfonts \setleading{9.5pt}} - -% Set the fonts to use with the @small... environments. -\let\smallexamplefonts = \smallfonts - -% About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample -% can fit this many characters: -% 8.5x11=86 smallbook=72 a4=90 a5=69 -% If we use \smallerfonts (8pt), then we can fit this many characters: -% 8.5x11=90+ smallbook=80 a4=90+ a5=77 -% For me, subjectively, the few extra characters that fit aren't worth -% the additional smallness of 8pt. So I'm making the default 9pt. -% -% By the way, for comparison, here's what fits with @example (10pt): -% 8.5x11=71 smallbook=60 a4=75 a5=58 -% -% I wish we used A4 paper on this side of the Atlantic. -% -% --karl, 24jan03. - - -% Set up the default fonts, so we can use them for creating boxes. -% -\textfonts - -% Define these so they can be easily changed for other fonts. -\def\angleleft{$\langle$} -\def\angleright{$\rangle$} - -% Count depth in font-changes, for error checks -\newcount\fontdepth \fontdepth=0 - -% Fonts for short table of contents. -\setfont\shortcontrm\rmshape{12}{1000} -\setfont\shortcontbf\bxshape{12}{1000} -\setfont\shortcontsl\slshape{12}{1000} -\setfont\shortconttt\ttshape{12}{1000} - -%% Add scribe-like font environments, plus @l for inline lisp (usually sans -%% serif) and @ii for TeX italic - -% \smartitalic{ARG} outputs arg in italics, followed by an italic correction -% unless the following character is such as not to need one. -\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi} -\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx} -\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx} - -\let\i=\smartitalic -\let\var=\smartslanted -\let\dfn=\smartslanted -\let\emph=\smartitalic -\let\cite=\smartslanted - -\def\b#1{{\bf #1}} -\let\strong=\b - -% We can't just use \exhyphenpenalty, because that only has effect at -% the end of a paragraph. Restore normal hyphenation at the end of the -% group within which \nohyphenation is presumably called. -% -\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} -\def\restorehyphenation{\hyphenchar\font = `- } - -% Set sfcode to normal for the chars that usually have another value. -% Can't use plain's \frenchspacing because it uses the `\x notation, and -% sometimes \x has an active definition that messes things up. -% -\catcode`@=11 - \def\frenchspacing{% - \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m - \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m - } -\catcode`@=\other - -\def\t#1{% - {\tt \rawbackslash \frenchspacing #1}% - \null -} -\let\ttfont=\t -\def\samp#1{`\tclose{#1}'\null} -\setfont\keyrm\rmshape{8}{1000} -\font\keysy=cmsy9 -\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% - \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% - \vbox{\hrule\kern-0.4pt - \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% - \kern-0.4pt\hrule}% - \kern-.06em\raise0.4pt\hbox{\angleright}}}} -% The old definition, with no lozenge: -%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null} -\def\ctrl #1{{\tt \rawbackslash \hat}#1} - -% @file, @option are the same as @samp. -\let\file=\samp -\let\option=\samp - -% @code is a modification of @t, -% which makes spaces the same size as normal in the surrounding text. -\def\tclose#1{% - {% - % Change normal interword space to be same as for the current font. - \spaceskip = \fontdimen2\font - % - % Switch to typewriter. - \tt - % - % But `\ ' produces the large typewriter interword space. - \def\ {{\spaceskip = 0pt{} }}% - % - % Turn off hyphenation. - \nohyphenation - % - \rawbackslash - \frenchspacing - #1% - }% - \null -} - -% We *must* turn on hyphenation at `-' and `_' in \code. -% Otherwise, it is too hard to avoid overfull hboxes -% in the Emacs manual, the Library manual, etc. - -% Unfortunately, TeX uses one parameter (\hyphenchar) to control -% both hyphenation at - and hyphenation within words. -% We must therefore turn them both off (\tclose does that) -% and arrange explicitly to hyphenate at a dash. -% -- rms. -{ - \catcode`\-=\active - \catcode`\_=\active - % - \global\def\code{\begingroup - \catcode`\-=\active \let-\codedash - \catcode`\_=\active \let_\codeunder - \codex - } - % - % If we end up with any active - characters when handling the index, - % just treat them as a normal -. - \global\def\indexbreaks{\catcode`\-=\active \let-\realdash} -} - -\def\realdash{-} -\def\codedash{-\discretionary{}{}{}} -\def\codeunder{% - % this is all so @math{@code{var_name}+1} can work. In math mode, _ - % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) - % will therefore expand the active definition of _, which is us - % (inside @code that is), therefore an endless loop. - \ifusingtt{\ifmmode - \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. - \else\normalunderscore \fi - \discretionary{}{}{}}% - {\_}% -} -\def\codex #1{\tclose{#1}\endgroup} - -% @kbd is like @code, except that if the argument is just one @key command, -% then @kbd has no effect. - -% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), -% `example' (@kbd uses ttsl only inside of @example and friends), -% or `code' (@kbd uses normal tty font always). -\def\kbdinputstyle{\parsearg\kbdinputstylexxx} -\def\kbdinputstylexxx#1{% - \def\arg{#1}% - \ifx\arg\worddistinct - \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% - \else\ifx\arg\wordexample - \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% - \else\ifx\arg\wordcode - \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% - \else - \errhelp = \EMsimple - \errmessage{Unknown @kbdinputstyle `\arg'}% - \fi\fi\fi -} -\def\worddistinct{distinct} -\def\wordexample{example} -\def\wordcode{code} - -% Default is `distinct.' -\kbdinputstyle distinct - -\def\xkey{\key} -\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% -\ifx\one\xkey\ifx\threex\three \key{#2}% -\else{\tclose{\kbdfont\look}}\fi -\else{\tclose{\kbdfont\look}}\fi} - -% For @url, @env, @command quotes seem unnecessary, so use \code. -\let\url=\code -\let\env=\code -\let\command=\code - -% @uref (abbreviation for `urlref') takes an optional (comma-separated) -% second argument specifying the text to display and an optional third -% arg as text to display instead of (rather than in addition to) the url -% itself. First (mandatory) arg is the url. Perhaps eventually put in -% a hypertex \special here. -% -\def\uref#1{\douref #1,,,\finish} -\def\douref#1,#2,#3,#4\finish{\begingroup - \unsepspaces - \pdfurl{#1}% - \setbox0 = \hbox{\ignorespaces #3}% - \ifdim\wd0 > 0pt - \unhbox0 % third arg given, show only that - \else - \setbox0 = \hbox{\ignorespaces #2}% - \ifdim\wd0 > 0pt - \ifpdf - \unhbox0 % PDF: 2nd arg given, show only it - \else - \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url - \fi - \else - \code{#1}% only url given, so show it - \fi - \fi - \endlink -\endgroup} - -% rms does not like angle brackets --karl, 17may97. -% So now @email is just like @uref, unless we are pdf. -% -%\def\email#1{\angleleft{\tt #1}\angleright} -\ifpdf - \def\email#1{\doemail#1,,\finish} - \def\doemail#1,#2,#3\finish{\begingroup - \unsepspaces - \pdfurl{mailto:#1}% - \setbox0 = \hbox{\ignorespaces #2}% - \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi - \endlink - \endgroup} -\else - \let\email=\uref -\fi - -% Check if we are currently using a typewriter font. Since all the -% Computer Modern typewriter fonts have zero interword stretch (and -% shrink), and it is reasonable to expect all typewriter fonts to have -% this property, we can check that font parameter. -% -\def\ifmonospace{\ifdim\fontdimen3\font=0pt } - -% Typeset a dimension, e.g., `in' or `pt'. The only reason for the -% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. -% -\def\dmn#1{\thinspace #1} - -\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par} - -% @l was never documented to mean ``switch to the Lisp font'', -% and it is not used as such in any manual I can find. We need it for -% Polish suppressed-l. --karl, 22sep96. -%\def\l#1{{\li #1}\null} - -% Explicit font changes: @r, @sc, undocumented @ii. -\def\r#1{{\rm #1}} % roman font -\def\sc#1{{\smallcaps#1}} % smallcaps font -\def\ii#1{{\it #1}} % italic font - -% @acronym downcases the argument and prints in smallcaps. -\def\acronym#1{{\smallcaps \lowercase{#1}}} - -% @pounds{} is a sterling sign. -\def\pounds{{\it\$}} - - -\message{page headings,} - -\newskip\titlepagetopglue \titlepagetopglue = 1.5in -\newskip\titlepagebottomglue \titlepagebottomglue = 2pc - -% First the title page. Must do @settitle before @titlepage. -\newif\ifseenauthor -\newif\iffinishedtitlepage - -% Do an implicit @contents or @shortcontents after @end titlepage if the -% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. -% -\newif\ifsetcontentsaftertitlepage - \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue -\newif\ifsetshortcontentsaftertitlepage - \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue - -\def\shorttitlepage{\parsearg\shorttitlepagezzz} -\def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% - \endgroup\page\hbox{}\page} - -\def\titlepage{\begingroup \parindent=0pt \textfonts - \let\subtitlerm=\tenrm - \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}% - % - \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines - \let\tt=\authortt}% - % - % Leave some space at the very top of the page. - \vglue\titlepagetopglue - % - % Now you can print the title using @title. - \def\title{\parsearg\titlezzz}% - \def\titlezzz##1{\leftline{\titlefonts\rm ##1} - % print a rule at the page bottom also. - \finishedtitlepagefalse - \vskip4pt \hrule height 4pt width \hsize \vskip4pt}% - % No rule at page bottom unless we print one at the top with @title. - \finishedtitlepagetrue - % - % Now you can put text using @subtitle. - \def\subtitle{\parsearg\subtitlezzz}% - \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}% - % - % @author should come last, but may come many times. - \def\author{\parsearg\authorzzz}% - \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi - {\authorfont \leftline{##1}}}% - % - % Most title ``pages'' are actually two pages long, with space - % at the top of the second. We don't want the ragged left on the second. - \let\oldpage = \page - \def\page{% - \iffinishedtitlepage\else - \finishtitlepage - \fi - \oldpage - \let\page = \oldpage - \hbox{}}% -% \def\page{\oldpage \hbox{}} -} - -\def\Etitlepage{% - \iffinishedtitlepage\else - \finishtitlepage - \fi - % It is important to do the page break before ending the group, - % because the headline and footline are only empty inside the group. - % If we use the new definition of \page, we always get a blank page - % after the title page, which we certainly don't want. - \oldpage - \endgroup - % - % Need this before the \...aftertitlepage checks so that if they are - % in effect the toc pages will come out with page numbers. - \HEADINGSon - % - % If they want short, they certainly want long too. - \ifsetshortcontentsaftertitlepage - \shortcontents - \contents - \global\let\shortcontents = \relax - \global\let\contents = \relax - \fi - % - \ifsetcontentsaftertitlepage - \contents - \global\let\contents = \relax - \global\let\shortcontents = \relax - \fi -} - -\def\finishtitlepage{% - \vskip4pt \hrule height 2pt width \hsize - \vskip\titlepagebottomglue - \finishedtitlepagetrue -} - -%%% Set up page headings and footings. - -\let\thispage=\folio - -\newtoks\evenheadline % headline on even pages -\newtoks\oddheadline % headline on odd pages -\newtoks\evenfootline % footline on even pages -\newtoks\oddfootline % footline on odd pages - -% Now make Tex use those variables -\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline - \else \the\evenheadline \fi}} -\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline - \else \the\evenfootline \fi}\HEADINGShook} -\let\HEADINGShook=\relax - -% Commands to set those variables. -% For example, this is what @headings on does -% @evenheading @thistitle|@thispage|@thischapter -% @oddheading @thischapter|@thispage|@thistitle -% @evenfooting @thisfile|| -% @oddfooting ||@thisfile - -\def\evenheading{\parsearg\evenheadingxxx} -\def\oddheading{\parsearg\oddheadingxxx} -\def\everyheading{\parsearg\everyheadingxxx} - -\def\evenfooting{\parsearg\evenfootingxxx} -\def\oddfooting{\parsearg\oddfootingxxx} -\def\everyfooting{\parsearg\everyfootingxxx} - -{\catcode`\@=0 % - -\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish} -\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{% -\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} - -\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish} -\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{% -\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} - -\gdef\everyheadingxxx#1{\oddheadingxxx{#1}\evenheadingxxx{#1}}% - -\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish} -\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{% -\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} - -\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish} -\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{% - \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% - % - % Leave some space for the footline. Hopefully ok to assume - % @evenfooting will not be used by itself. - \global\advance\pageheight by -\baselineskip - \global\advance\vsize by -\baselineskip -} - -\gdef\everyfootingxxx#1{\oddfootingxxx{#1}\evenfootingxxx{#1}} -% -}% unbind the catcode of @. - -% @headings double turns headings on for double-sided printing. -% @headings single turns headings on for single-sided printing. -% @headings off turns them off. -% @headings on same as @headings double, retained for compatibility. -% @headings after turns on double-sided headings after this page. -% @headings doubleafter turns on double-sided headings after this page. -% @headings singleafter turns on single-sided headings after this page. -% By default, they are off at the start of a document, -% and turned `on' after @end titlepage. - -\def\headings #1 {\csname HEADINGS#1\endcsname} - -\def\HEADINGSoff{ -\global\evenheadline={\hfil} \global\evenfootline={\hfil} -\global\oddheadline={\hfil} \global\oddfootline={\hfil}} -\HEADINGSoff -% When we turn headings on, set the page number to 1. -% For double-sided printing, put current file name in lower left corner, -% chapter name on inside top of right hand pages, document -% title on inside top of left hand pages, and page numbers on outside top -% edge of all pages. -\def\HEADINGSdouble{ -\global\pageno=1 -\global\evenfootline={\hfil} -\global\oddfootline={\hfil} -\global\evenheadline={\line{\folio\hfil\thistitle}} -\global\oddheadline={\line{\thischapter\hfil\folio}} -\global\let\contentsalignmacro = \chapoddpage -} -\let\contentsalignmacro = \chappager - -% For single-sided printing, chapter title goes across top left of page, -% page number on top right. -\def\HEADINGSsingle{ -\global\pageno=1 -\global\evenfootline={\hfil} -\global\oddfootline={\hfil} -\global\evenheadline={\line{\thischapter\hfil\folio}} -\global\oddheadline={\line{\thischapter\hfil\folio}} -\global\let\contentsalignmacro = \chappager -} -\def\HEADINGSon{\HEADINGSdouble} - -\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} -\let\HEADINGSdoubleafter=\HEADINGSafter -\def\HEADINGSdoublex{% -\global\evenfootline={\hfil} -\global\oddfootline={\hfil} -\global\evenheadline={\line{\folio\hfil\thistitle}} -\global\oddheadline={\line{\thischapter\hfil\folio}} -\global\let\contentsalignmacro = \chapoddpage -} - -\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} -\def\HEADINGSsinglex{% -\global\evenfootline={\hfil} -\global\oddfootline={\hfil} -\global\evenheadline={\line{\thischapter\hfil\folio}} -\global\oddheadline={\line{\thischapter\hfil\folio}} -\global\let\contentsalignmacro = \chappager -} - -% Subroutines used in generating headings -% This produces Day Month Year style of output. -% Only define if not already defined, in case a txi-??.tex file has set -% up a different format (e.g., txi-cs.tex does this). -\ifx\today\undefined -\def\today{% - \number\day\space - \ifcase\month - \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr - \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug - \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec - \fi - \space\number\year} -\fi - -% @settitle line... specifies the title of the document, for headings. -% It generates no output of its own. -\def\thistitle{\putwordNoTitle} -\def\settitle{\parsearg\settitlezzz} -\def\settitlezzz #1{\gdef\thistitle{#1}} - - -\message{tables,} -% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x). - -% default indentation of table text -\newdimen\tableindent \tableindent=.8in -% default indentation of @itemize and @enumerate text -\newdimen\itemindent \itemindent=.3in -% margin between end of table item and start of table text. -\newdimen\itemmargin \itemmargin=.1in - -% used internally for \itemindent minus \itemmargin -\newdimen\itemmax - -% Note @table, @vtable, and @vtable define @item, @itemx, etc., with -% these defs. -% They also define \itemindex -% to index the item name in whatever manner is desired (perhaps none). - -\newif\ifitemxneedsnegativevskip - -\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} - -\def\internalBitem{\smallbreak \parsearg\itemzzz} -\def\internalBitemx{\itemxpar \parsearg\itemzzz} - -\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz} -\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz} - -\def\internalBkitem{\smallbreak \parsearg\kitemzzz} -\def\internalBkitemx{\itemxpar \parsearg\kitemzzz} - -\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}% - \itemzzz {#1}} - -\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}% - \itemzzz {#1}} - -\def\itemzzz #1{\begingroup % - \advance\hsize by -\rightskip - \advance\hsize by -\tableindent - \setbox0=\hbox{\itemfont{#1}}% - \itemindex{#1}% - \nobreak % This prevents a break before @itemx. - % - % If the item text does not fit in the space we have, put it on a line - % by itself, and do not allow a page break either before or after that - % line. We do not start a paragraph here because then if the next - % command is, e.g., @kindex, the whatsit would get put into the - % horizontal list on a line by itself, resulting in extra blank space. - \ifdim \wd0>\itemmax - % - % Make this a paragraph so we get the \parskip glue and wrapping, - % but leave it ragged-right. - \begingroup - \advance\leftskip by-\tableindent - \advance\hsize by\tableindent - \advance\rightskip by0pt plus1fil - \leavevmode\unhbox0\par - \endgroup - % - % We're going to be starting a paragraph, but we don't want the - % \parskip glue -- logically it's part of the @item we just started. - \nobreak \vskip-\parskip - % - % Stop a page break at the \parskip glue coming up. (Unfortunately - % we can't prevent a possible page break at the following - % \baselineskip glue.) However, if what follows is an environment - % such as @example, there will be no \parskip glue; then - % the negative vskip we just would cause the example and the item to - % crash together. So we use this bizarre value of 10001 as a signal - % to \aboveenvbreak to insert \parskip glue after all. - % (Possibly there are other commands that could be followed by - % @example which need the same treatment, but not section titles; or - % maybe section titles are the only special case and they should be - % penalty 10001...) - \penalty 10001 - \endgroup - \itemxneedsnegativevskipfalse - \else - % The item text fits into the space. Start a paragraph, so that the - % following text (if any) will end up on the same line. - \noindent - % Do this with kerns and \unhbox so that if there is a footnote in - % the item text, it can migrate to the main vertical list and - % eventually be printed. - \nobreak\kern-\tableindent - \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 - \unhbox0 - \nobreak\kern\dimen0 - \endgroup - \itemxneedsnegativevskiptrue - \fi -} - -\def\item{\errmessage{@item while not in a table}} -\def\itemx{\errmessage{@itemx while not in a table}} -\def\kitem{\errmessage{@kitem while not in a table}} -\def\kitemx{\errmessage{@kitemx while not in a table}} -\def\xitem{\errmessage{@xitem while not in a table}} -\def\xitemx{\errmessage{@xitemx while not in a table}} - -% Contains a kludge to get @end[description] to work. -\def\description{\tablez{\dontindex}{1}{}{}{}{}} - -% @table, @ftable, @vtable. -\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex} -{\obeylines\obeyspaces% -\gdef\tablex #1^^M{% -\tabley\dontindex#1 \endtabley}} - -\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex} -{\obeylines\obeyspaces% -\gdef\ftablex #1^^M{% -\tabley\fnitemindex#1 \endtabley -\def\Eftable{\endgraf\afterenvbreak\endgroup}% -\let\Etable=\relax}} - -\def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex} -{\obeylines\obeyspaces% -\gdef\vtablex #1^^M{% -\tabley\vritemindex#1 \endtabley -\def\Evtable{\endgraf\afterenvbreak\endgroup}% -\let\Etable=\relax}} - -\def\dontindex #1{} -\def\fnitemindex #1{\doind {fn}{\code{#1}}}% -\def\vritemindex #1{\doind {vr}{\code{#1}}}% - -{\obeyspaces % -\gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup% -\tablez{#1}{#2}{#3}{#4}{#5}{#6}}} - -\def\tablez #1#2#3#4#5#6{% -\aboveenvbreak % -\begingroup % -\def\Edescription{\Etable}% Necessary kludge. -\let\itemindex=#1% -\ifnum 0#3>0 \advance \leftskip by #3\mil \fi % -\ifnum 0#4>0 \tableindent=#4\mil \fi % -\ifnum 0#5>0 \advance \rightskip by #5\mil \fi % -\def\itemfont{#2}% -\itemmax=\tableindent % -\advance \itemmax by -\itemmargin % -\advance \leftskip by \tableindent % -\exdentamount=\tableindent -\parindent = 0pt -\parskip = \smallskipamount -\ifdim \parskip=0pt \parskip=2pt \fi% -\def\Etable{\endgraf\afterenvbreak\endgroup}% -\let\item = \internalBitem % -\let\itemx = \internalBitemx % -\let\kitem = \internalBkitem % -\let\kitemx = \internalBkitemx % -\let\xitem = \internalBxitem % -\let\xitemx = \internalBxitemx % -} - -% This is the counter used by @enumerate, which is really @itemize - -\newcount \itemno - -\def\itemize{\parsearg\itemizezzz} - -\def\itemizezzz #1{% - \begingroup % ended by the @end itemize - \itemizey {#1}{\Eitemize} -} - -\def\itemizey #1#2{% -\aboveenvbreak % -\itemmax=\itemindent % -\advance \itemmax by -\itemmargin % -\advance \leftskip by \itemindent % -\exdentamount=\itemindent -\parindent = 0pt % -\parskip = \smallskipamount % -\ifdim \parskip=0pt \parskip=2pt \fi% -\def#2{\endgraf\afterenvbreak\endgroup}% -\def\itemcontents{#1}% -\let\item=\itemizeitem} - -% \splitoff TOKENS\endmark defines \first to be the first token in -% TOKENS, and \rest to be the remainder. -% -\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% - -% Allow an optional argument of an uppercase letter, lowercase letter, -% or number, to specify the first label in the enumerated list. No -% argument is the same as `1'. -% -\def\enumerate{\parsearg\enumeratezzz} -\def\enumeratezzz #1{\enumeratey #1 \endenumeratey} -\def\enumeratey #1 #2\endenumeratey{% - \begingroup % ended by the @end enumerate - % - % If we were given no argument, pretend we were given `1'. - \def\thearg{#1}% - \ifx\thearg\empty \def\thearg{1}\fi - % - % Detect if the argument is a single token. If so, it might be a - % letter. Otherwise, the only valid thing it can be is a number. - % (We will always have one token, because of the test we just made. - % This is a good thing, since \splitoff doesn't work given nothing at - % all -- the first parameter is undelimited.) - \expandafter\splitoff\thearg\endmark - \ifx\rest\empty - % Only one token in the argument. It could still be anything. - % A ``lowercase letter'' is one whose \lccode is nonzero. - % An ``uppercase letter'' is one whose \lccode is both nonzero, and - % not equal to itself. - % Otherwise, we assume it's a number. - % - % We need the \relax at the end of the \ifnum lines to stop TeX from - % continuing to look for a . - % - \ifnum\lccode\expandafter`\thearg=0\relax - \numericenumerate % a number (we hope) - \else - % It's a letter. - \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax - \lowercaseenumerate % lowercase letter - \else - \uppercaseenumerate % uppercase letter - \fi - \fi - \else - % Multiple tokens in the argument. We hope it's a number. - \numericenumerate - \fi -} - -% An @enumerate whose labels are integers. The starting integer is -% given in \thearg. -% -\def\numericenumerate{% - \itemno = \thearg - \startenumeration{\the\itemno}% -} - -% The starting (lowercase) letter is in \thearg. -\def\lowercaseenumerate{% - \itemno = \expandafter`\thearg - \startenumeration{% - % Be sure we're not beyond the end of the alphabet. - \ifnum\itemno=0 - \errmessage{No more lowercase letters in @enumerate; get a bigger - alphabet}% - \fi - \char\lccode\itemno - }% -} - -% The starting (uppercase) letter is in \thearg. -\def\uppercaseenumerate{% - \itemno = \expandafter`\thearg - \startenumeration{% - % Be sure we're not beyond the end of the alphabet. - \ifnum\itemno=0 - \errmessage{No more uppercase letters in @enumerate; get a bigger - alphabet} - \fi - \char\uccode\itemno - }% -} - -% Call itemizey, adding a period to the first argument and supplying the -% common last two arguments. Also subtract one from the initial value in -% \itemno, since @item increments \itemno. -% -\def\startenumeration#1{% - \advance\itemno by -1 - \itemizey{#1.}\Eenumerate\flushcr -} - -% @alphaenumerate and @capsenumerate are abbreviations for giving an arg -% to @enumerate. -% -\def\alphaenumerate{\enumerate{a}} -\def\capsenumerate{\enumerate{A}} -\def\Ealphaenumerate{\Eenumerate} -\def\Ecapsenumerate{\Eenumerate} - -% Definition of @item while inside @itemize. - -\def\itemizeitem{% -\advance\itemno by 1 -{\let\par=\endgraf \smallbreak}% -\ifhmode \errmessage{In hmode at itemizeitem}\fi -{\parskip=0in \hskip 0pt -\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}% -\vadjust{\penalty 1200}}% -\flushcr} - -% @multitable macros -% Amy Hendrickson, 8/18/94, 3/6/96 -% -% @multitable ... @end multitable will make as many columns as desired. -% Contents of each column will wrap at width given in preamble. Width -% can be specified either with sample text given in a template line, -% or in percent of \hsize, the current width of text on page. - -% Table can continue over pages but will only break between lines. - -% To make preamble: -% -% Either define widths of columns in terms of percent of \hsize: -% @multitable @columnfractions .25 .3 .45 -% @item ... -% -% Numbers following @columnfractions are the percent of the total -% current hsize to be used for each column. You may use as many -% columns as desired. - - -% Or use a template: -% @multitable {Column 1 template} {Column 2 template} {Column 3 template} -% @item ... -% using the widest term desired in each column. -% -% For those who want to use more than one line's worth of words in -% the preamble, break the line within one argument and it -% will parse correctly, i.e., -% -% @multitable {Column 1 template} {Column 2 template} {Column 3 -% template} -% Not: -% @multitable {Column 1 template} {Column 2 template} -% {Column 3 template} - -% Each new table line starts with @item, each subsequent new column -% starts with @tab. Empty columns may be produced by supplying @tab's -% with nothing between them for as many times as empty columns are needed, -% ie, @tab@tab@tab will produce two empty columns. - -% @item, @tab, @multitable or @end multitable do not need to be on their -% own lines, but it will not hurt if they are. - -% Sample multitable: - -% @multitable {Column 1 template} {Column 2 template} {Column 3 template} -% @item first col stuff @tab second col stuff @tab third col -% @item -% first col stuff -% @tab -% second col stuff -% @tab -% third col -% @item first col stuff @tab second col stuff -% @tab Many paragraphs of text may be used in any column. -% -% They will wrap at the width determined by the template. -% @item@tab@tab This will be in third column. -% @end multitable - -% Default dimensions may be reset by user. -% @multitableparskip is vertical space between paragraphs in table. -% @multitableparindent is paragraph indent in table. -% @multitablecolmargin is horizontal space to be left between columns. -% @multitablelinespace is space to leave between table items, baseline -% to baseline. -% 0pt means it depends on current normal line spacing. -% -\newskip\multitableparskip -\newskip\multitableparindent -\newdimen\multitablecolspace -\newskip\multitablelinespace -\multitableparskip=0pt -\multitableparindent=6pt -\multitablecolspace=12pt -\multitablelinespace=0pt - -% Macros used to set up halign preamble: -% -\let\endsetuptable\relax -\def\xendsetuptable{\endsetuptable} -\let\columnfractions\relax -\def\xcolumnfractions{\columnfractions} -\newif\ifsetpercent - -% #1 is the part of the @columnfraction before the decimal point, which -% is presumably either 0 or the empty string (but we don't check, we -% just throw it away). #2 is the decimal part, which we use as the -% percent of \hsize for this column. -\def\pickupwholefraction#1.#2 {% - \global\advance\colcount by 1 - \expandafter\xdef\csname col\the\colcount\endcsname{.#2\hsize}% - \setuptable -} - -\newcount\colcount -\def\setuptable#1{% - \def\firstarg{#1}% - \ifx\firstarg\xendsetuptable - \let\go = \relax - \else - \ifx\firstarg\xcolumnfractions - \global\setpercenttrue - \else - \ifsetpercent - \let\go\pickupwholefraction - \else - \global\advance\colcount by 1 - \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a - % separator; typically that is always in the input, anyway. - \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% - \fi - \fi - \ifx\go\pickupwholefraction - % Put the argument back for the \pickupwholefraction call, so - % we'll always have a period there to be parsed. - \def\go{\pickupwholefraction#1}% - \else - \let\go = \setuptable - \fi% - \fi - \go -} - -% @multitable ... @end multitable definitions: -% -\def\multitable{\parsearg\dotable} -\def\dotable#1{\bgroup - \vskip\parskip - \let\item=\crcrwithfootnotes - % A \tab used to include \hskip1sp. But then the space in a template - % line is not enough. That is bad. So let's go back to just & until - % we encounter the problem it was intended to solve again. --karl, - % nathan@acm.org, 20apr99. - \let\tab=&% - \let\startfootins=\startsavedfootnote - \tolerance=9500 - \hbadness=9500 - \setmultitablespacing - \parskip=\multitableparskip - \parindent=\multitableparindent - \overfullrule=0pt - \global\colcount=0 - \def\Emultitable{% - \global\setpercentfalse - \crcrwithfootnotes\crcr - \egroup\egroup - }% - % - % To parse everything between @multitable and @item: - \setuptable#1 \endsetuptable - % - % \everycr will reset column counter, \colcount, at the end of - % each line. Every column entry will cause \colcount to advance by one. - % The table preamble - % looks at the current \colcount to find the correct column width. - \everycr{\noalign{% - % - % \filbreak%% keeps underfull box messages off when table breaks over pages. - % Maybe so, but it also creates really weird page breaks when the table - % breaks over pages. Wouldn't \vfil be better? Wait until the problem - % manifests itself, so it can be fixed for real --karl. - \global\colcount=0\relax}}% - % - % This preamble sets up a generic column definition, which will - % be used as many times as user calls for columns. - % \vtop will set a single line and will also let text wrap and - % continue for many paragraphs if desired. - \halign\bgroup&\global\advance\colcount by 1\relax - \multistrut\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname - % - % In order to keep entries from bumping into each other - % we will add a \leftskip of \multitablecolspace to all columns after - % the first one. - % - % If a template has been used, we will add \multitablecolspace - % to the width of each template entry. - % - % If the user has set preamble in terms of percent of \hsize we will - % use that dimension as the width of the column, and the \leftskip - % will keep entries from bumping into each other. Table will start at - % left margin and final column will justify at right margin. - % - % Make sure we don't inherit \rightskip from the outer environment. - \rightskip=0pt - \ifnum\colcount=1 - % The first column will be indented with the surrounding text. - \advance\hsize by\leftskip - \else - \ifsetpercent \else - % If user has not set preamble in terms of percent of \hsize - % we will advance \hsize by \multitablecolspace. - \advance\hsize by \multitablecolspace - \fi - % In either case we will make \leftskip=\multitablecolspace: - \leftskip=\multitablecolspace - \fi - % Ignoring space at the beginning and end avoids an occasional spurious - % blank line, when TeX decides to break the line at the space before the - % box from the multistrut, so the strut ends up on a line by itself. - % For example: - % @multitable @columnfractions .11 .89 - % @item @code{#} - % @tab Legal holiday which is valid in major parts of the whole country. - % Is automatically provided with highlighting sequences respectively marking - % characters. - \noindent\ignorespaces##\unskip\multistrut}\cr -} - -\def\setmultitablespacing{% test to see if user has set \multitablelinespace. -% If so, do nothing. If not, give it an appropriate dimension based on -% current baselineskip. -\ifdim\multitablelinespace=0pt -\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip -\global\advance\multitablelinespace by-\ht0 -%% strut to put in table in case some entry doesn't have descenders, -%% to keep lines equally spaced -\let\multistrut = \strut -\else -%% FIXME: what is \box0 supposed to be? -\gdef\multistrut{\vrule height\multitablelinespace depth\dp0 -width0pt\relax} \fi -%% Test to see if parskip is larger than space between lines of -%% table. If not, do nothing. -%% If so, set to same dimension as multitablelinespace. -\ifdim\multitableparskip>\multitablelinespace -\global\multitableparskip=\multitablelinespace -\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller - %% than skip between lines in the table. -\fi% -\ifdim\multitableparskip=0pt -\global\multitableparskip=\multitablelinespace -\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller - %% than skip between lines in the table. -\fi} - -% In case a @footnote appears inside an alignment, save the footnote -% text to a box and make the \insert when a row of the table is -% finished. Otherwise, the insertion is lost, it never migrates to the -% main vertical list. --kasal, 22jan03. -% -\newbox\savedfootnotes -% -% \dotable \let's \startfootins to this, so that \dofootnote will call -% it instead of starting the insertion right away. -\def\startsavedfootnote{% - \global\setbox\savedfootnotes = \vbox\bgroup - \unvbox\savedfootnotes -} -\def\crcrwithfootnotes{% - \crcr - \ifvoid\savedfootnotes \else - \noalign{\insert\footins{\box\savedfootnotes}}% - \fi -} - -\message{conditionals,} -% Prevent errors for section commands. -% Used in @ignore and in failing conditionals. -\def\ignoresections{% - \let\chapter=\relax - \let\unnumbered=\relax - \let\top=\relax - \let\unnumberedsec=\relax - \let\unnumberedsection=\relax - \let\unnumberedsubsec=\relax - \let\unnumberedsubsection=\relax - \let\unnumberedsubsubsec=\relax - \let\unnumberedsubsubsection=\relax - \let\section=\relax - \let\subsec=\relax - \let\subsubsec=\relax - \let\subsection=\relax - \let\subsubsection=\relax - \let\appendix=\relax - \let\appendixsec=\relax - \let\appendixsection=\relax - \let\appendixsubsec=\relax - \let\appendixsubsection=\relax - \let\appendixsubsubsec=\relax - \let\appendixsubsubsection=\relax - \let\contents=\relax - \let\smallbook=\relax - \let\titlepage=\relax -} - -% Used in nested conditionals, where we have to parse the Texinfo source -% and so want to turn off most commands, in case they are used -% incorrectly. -% -% We use \empty instead of \relax for the @def... commands, so that \end -% doesn't throw an error. For instance: -% @ignore -% @deffn ... -% @end deffn -% @end ignore -% -% The @end deffn is going to get expanded, because we're trying to allow -% nested conditionals. But we don't want to expand the actual @deffn, -% since it might be syntactically correct and intended to be ignored. -% Since \end checks for \relax, using \empty does not cause an error. -% -\def\ignoremorecommands{% - \let\defcodeindex = \relax - \let\defcv = \empty - \let\defcvx = \empty - \let\Edefcv = \empty - \let\deffn = \empty - \let\deffnx = \empty - \let\Edeffn = \empty - \let\defindex = \relax - \let\defivar = \empty - \let\defivarx = \empty - \let\Edefivar = \empty - \let\defmac = \empty - \let\defmacx = \empty - \let\Edefmac = \empty - \let\defmethod = \empty - \let\defmethodx = \empty - \let\Edefmethod = \empty - \let\defop = \empty - \let\defopx = \empty - \let\Edefop = \empty - \let\defopt = \empty - \let\defoptx = \empty - \let\Edefopt = \empty - \let\defspec = \empty - \let\defspecx = \empty - \let\Edefspec = \empty - \let\deftp = \empty - \let\deftpx = \empty - \let\Edeftp = \empty - \let\deftypefn = \empty - \let\deftypefnx = \empty - \let\Edeftypefn = \empty - \let\deftypefun = \empty - \let\deftypefunx = \empty - \let\Edeftypefun = \empty - \let\deftypeivar = \empty - \let\deftypeivarx = \empty - \let\Edeftypeivar = \empty - \let\deftypemethod = \empty - \let\deftypemethodx = \empty - \let\Edeftypemethod = \empty - \let\deftypeop = \empty - \let\deftypeopx = \empty - \let\Edeftypeop = \empty - \let\deftypevar = \empty - \let\deftypevarx = \empty - \let\Edeftypevar = \empty - \let\deftypevr = \empty - \let\deftypevrx = \empty - \let\Edeftypevr = \empty - \let\defun = \empty - \let\defunx = \empty - \let\Edefun = \empty - \let\defvar = \empty - \let\defvarx = \empty - \let\Edefvar = \empty - \let\defvr = \empty - \let\defvrx = \empty - \let\Edefvr = \empty - \let\clear = \relax - \let\down = \relax - \let\evenfooting = \relax - \let\evenheading = \relax - \let\everyfooting = \relax - \let\everyheading = \relax - \let\headings = \relax - \let\include = \relax - \let\item = \relax - \let\lowersections = \relax - \let\oddfooting = \relax - \let\oddheading = \relax - \let\printindex = \relax - \let\pxref = \relax - \let\raisesections = \relax - \let\ref = \relax - \let\set = \relax - \let\setchapternewpage = \relax - \let\setchapterstyle = \relax - \let\settitle = \relax - \let\up = \relax - \let\verbatiminclude = \relax - \let\xref = \relax -} - -% Ignore @ignore, @ifhtml, @ifinfo, and the like. -% -\def\direntry{\doignore{direntry}} -\def\documentdescriptionword{documentdescription} -\def\documentdescription{\doignore{documentdescription}} -\def\html{\doignore{html}} -\def\ifhtml{\doignore{ifhtml}} -\def\ifinfo{\doignore{ifinfo}} -\def\ifnottex{\doignore{ifnottex}} -\def\ifplaintext{\doignore{ifplaintext}} -\def\ifxml{\doignore{ifxml}} -\def\ignore{\doignore{ignore}} -\def\menu{\doignore{menu}} -\def\xml{\doignore{xml}} - -% @dircategory CATEGORY -- specify a category of the dir file -% which this file should belong to. Ignore this in TeX. -\let\dircategory = \comment - -% Ignore text until a line `@end #1'. -% -\def\doignore#1{\begingroup - % Don't complain about control sequences we have declared \outer. - \ignoresections - % - % Define a command to swallow text until we reach `@end #1'. - % This @ is a catcode 12 token (that is the normal catcode of @ in - % this texinfo.tex file). We change the catcode of @ below to match. - \long\def\doignoretext##1@end #1{\enddoignore}% - % - % Make sure that spaces turn into tokens that match what \doignoretext wants. - \catcode\spaceChar = 10 - % - % Ignore braces, too, so mismatched braces don't cause trouble. - \catcode`\{ = 9 - \catcode`\} = 9 - % - % We must not have @c interpreted as a control sequence. - \catcode`\@ = 12 - % - \def\ignoreword{#1}% - \ifx\ignoreword\documentdescriptionword - % The c kludge breaks documentdescription, since - % `documentdescription' contains a `c'. Means not everything will - % be ignored inside @documentdescription, but oh well... - \else - % Make the letter c a comment character so that the rest of the line - % will be ignored. This way, the document can have (for example) - % @c @end ifinfo - % and the @end ifinfo will be properly ignored. - % (We've just changed @ to catcode 12.) - \catcode`\c = 14 - \fi - % - % And now expand the command defined above. - \doignoretext -} - -% What we do to finish off ignored text. -% -\def\enddoignore{\endgroup\ignorespaces}% - -\newif\ifwarnedobs\warnedobsfalse -\def\obstexwarn{% - \ifwarnedobs\relax\else - % We need to warn folks that they may have trouble with TeX 3.0. - % This uses \immediate\write16 rather than \message to get newlines. - \immediate\write16{} - \immediate\write16{WARNING: for users of Unix TeX 3.0!} - \immediate\write16{This manual trips a bug in TeX version 3.0 (tex hangs).} - \immediate\write16{If you are running another version of TeX, relax.} - \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.} - \immediate\write16{ Then upgrade your TeX installation if you can.} - \immediate\write16{ (See ftp://ftp.gnu.org/non-gnu/TeX.README.)} - \immediate\write16{If you are stuck with version 3.0, run the} - \immediate\write16{ script ``tex3patch'' from the Texinfo distribution} - \immediate\write16{ to use a workaround.} - \immediate\write16{} - \global\warnedobstrue - \fi -} - -% **In TeX 3.0, setting text in \nullfont hangs tex. For a -% workaround (which requires the file ``dummy.tfm'' to be installed), -% uncomment the following line: -%%%%%\font\nullfont=dummy\let\obstexwarn=\relax - -% Ignore text, except that we keep track of conditional commands for -% purposes of nesting, up to an `@end #1' command. -% -\def\nestedignore#1{% - \obstexwarn - % We must actually expand the ignored text to look for the @end - % command, so that nested ignore constructs work. Thus, we put the - % text into a \vbox and then do nothing with the result. To minimize - % the chance of memory overflow, we follow the approach outlined on - % page 401 of the TeXbook. - % - \setbox0 = \vbox\bgroup - % Don't complain about control sequences we have declared \outer. - \ignoresections - % - % Define `@end #1' to end the box, which will in turn undefine the - % @end command again. - \expandafter\def\csname E#1\endcsname{\egroup\ignorespaces}% - % - % We are going to be parsing Texinfo commands. Most cause no - % trouble when they are used incorrectly, but some commands do - % complicated argument parsing or otherwise get confused, so we - % undefine them. - % - % We can't do anything about stray @-signs, unfortunately; - % they'll produce `undefined control sequence' errors. - \ignoremorecommands - % - % Set the current font to be \nullfont, a TeX primitive, and define - % all the font commands to also use \nullfont. We don't use - % dummy.tfm, as suggested in the TeXbook, because some sites - % might not have that installed. Therefore, math mode will still - % produce output, but that should be an extremely small amount of - % stuff compared to the main input. - % - \nullfont - \let\tenrm=\nullfont \let\tenit=\nullfont \let\tensl=\nullfont - \let\tenbf=\nullfont \let\tentt=\nullfont \let\smallcaps=\nullfont - \let\tensf=\nullfont - % Similarly for index fonts. - \let\smallrm=\nullfont \let\smallit=\nullfont \let\smallsl=\nullfont - \let\smallbf=\nullfont \let\smalltt=\nullfont \let\smallsc=\nullfont - \let\smallsf=\nullfont - % Similarly for smallexample fonts. - \let\smallerrm=\nullfont \let\smallerit=\nullfont \let\smallersl=\nullfont - \let\smallerbf=\nullfont \let\smallertt=\nullfont \let\smallersc=\nullfont - \let\smallersf=\nullfont - % - % Don't complain when characters are missing from the fonts. - \tracinglostchars = 0 - % - % Don't bother to do space factor calculations. - \frenchspacing - % - % Don't report underfull hboxes. - \hbadness = 10000 - % - % Do minimal line-breaking. - \pretolerance = 10000 - % - % Do not execute instructions in @tex. - \def\tex{\doignore{tex}}% - % Do not execute macro definitions. - % `c' is a comment character, so the word `macro' will get cut off. - \def\macro{\doignore{ma}}% -} - -% @set VAR sets the variable VAR to an empty value. -% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. -% -% Since we want to separate VAR from REST-OF-LINE (which might be -% empty), we can't just use \parsearg; we have to insert a space of our -% own to delimit the rest of the line, and then take it out again if we -% didn't need it. Make sure the catcode of space is correct to avoid -% losing inside @example, for instance. -% -\def\set{\begingroup\catcode` =10 - \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR. - \parsearg\setxxx} -\def\setxxx#1{\setyyy#1 \endsetyyy} -\def\setyyy#1 #2\endsetyyy{% - \def\temp{#2}% - \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty - \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted. - \fi - \endgroup -} -% Can't use \xdef to pre-expand #2 and save some time, since \temp or -% \next or other control sequences that we've defined might get us into -% an infinite loop. Consider `@set foo @cite{bar}'. -\def\setzzz#1#2 \endsetzzz{\expandafter\gdef\csname SET#1\endcsname{#2}} - -% @clear VAR clears (i.e., unsets) the variable VAR. -% -\def\clear{\parsearg\clearxxx} -\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax} - -% @value{foo} gets the text saved in variable foo. -{ - \catcode`\_ = \active - % - % We might end up with active _ or - characters in the argument if - % we're called from @code, as @code{@value{foo-bar_}}. So \let any - % such active characters to their normal equivalents. - \gdef\value{\begingroup - \catcode`\-=\other \catcode`\_=\other - \indexbreaks \let_\normalunderscore - \valuexxx} -} -\def\valuexxx#1{\expandablevalue{#1}\endgroup} - -% We have this subroutine so that we can handle at least some @value's -% properly in indexes (we \let\value to this in \indexdummies). Ones -% whose names contain - or _ still won't work, but we can't do anything -% about that. The command has to be fully expandable (if the variable -% is set), since the result winds up in the index file. This means that -% if the variable's value contains other Texinfo commands, it's almost -% certain it will fail (although perhaps we could fix that with -% sufficient work to do a one-level expansion on the result, instead of -% complete). -% -\def\expandablevalue#1{% - \expandafter\ifx\csname SET#1\endcsname\relax - {[No value for ``#1'']}% - \message{Variable `#1', used in @value, is not set.}% - \else - \csname SET#1\endcsname - \fi -} - -% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined -% with @set. -% -\def\ifset{\parsearg\doifset} -\def\doifset#1{% - \expandafter\ifx\csname SET#1\endcsname\relax - \let\next=\ifsetfail - \else - \let\next=\ifsetsucceed - \fi - \next -} -\def\ifsetsucceed{\conditionalsucceed{ifset}} -\def\ifsetfail{\nestedignore{ifset}} -\defineunmatchedend{ifset} - -% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been -% defined with @set, or has been undefined with @clear. -% -\def\ifclear{\parsearg\doifclear} -\def\doifclear#1{% - \expandafter\ifx\csname SET#1\endcsname\relax - \let\next=\ifclearsucceed - \else - \let\next=\ifclearfail - \fi - \next -} -\def\ifclearsucceed{\conditionalsucceed{ifclear}} -\def\ifclearfail{\nestedignore{ifclear}} -\defineunmatchedend{ifclear} - -% @iftex, @ifnothtml, @ifnotinfo, @ifnotplaintext always succeed; we -% read the text following, through the first @end iftex (etc.). Make -% `@end iftex' (etc.) valid only after an @iftex. -% -\def\iftex{\conditionalsucceed{iftex}} -\def\ifnothtml{\conditionalsucceed{ifnothtml}} -\def\ifnotinfo{\conditionalsucceed{ifnotinfo}} -\def\ifnotplaintext{\conditionalsucceed{ifnotplaintext}} -\defineunmatchedend{iftex} -\defineunmatchedend{ifnothtml} -\defineunmatchedend{ifnotinfo} -\defineunmatchedend{ifnotplaintext} - -% True conditional. Since \set globally defines its variables, we can -% just start and end a group (to keep the @end definition undefined at -% the outer level). -% -\def\conditionalsucceed#1{\begingroup - \expandafter\def\csname E#1\endcsname{\endgroup}% -} - -% @defininfoenclose. -\let\definfoenclose=\comment - - -\message{indexing,} -% Index generation facilities - -% Define \newwrite to be identical to plain tex's \newwrite -% except not \outer, so it can be used within \newindex. -{\catcode`\@=11 -\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}} - -% \newindex {foo} defines an index named foo. -% It automatically defines \fooindex such that -% \fooindex ...rest of line... puts an entry in the index foo. -% It also defines \fooindfile to be the number of the output channel for -% the file that accumulates this index. The file's extension is foo. -% The name of an index should be no more than 2 characters long -% for the sake of vms. -% -\def\newindex#1{% - \iflinks - \expandafter\newwrite \csname#1indfile\endcsname - \openout \csname#1indfile\endcsname \jobname.#1 % Open the file - \fi - \expandafter\xdef\csname#1index\endcsname{% % Define @#1index - \noexpand\doindex{#1}} -} - -% @defindex foo == \newindex{foo} -% -\def\defindex{\parsearg\newindex} - -% Define @defcodeindex, like @defindex except put all entries in @code. -% -\def\defcodeindex{\parsearg\newcodeindex} -% -\def\newcodeindex#1{% - \iflinks - \expandafter\newwrite \csname#1indfile\endcsname - \openout \csname#1indfile\endcsname \jobname.#1 - \fi - \expandafter\xdef\csname#1index\endcsname{% - \noexpand\docodeindex{#1}}% -} - - -% @synindex foo bar makes index foo feed into index bar. -% Do this instead of @defindex foo if you don't want it as a separate index. -% -% @syncodeindex foo bar similar, but put all entries made for index foo -% inside @code. -% -\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} -\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} - -% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), -% #3 the target index (bar). -\def\dosynindex#1#2#3{% - % Only do \closeout if we haven't already done it, else we'll end up - % closing the target index. - \expandafter \ifx\csname donesynindex#2\endcsname \undefined - % The \closeout helps reduce unnecessary open files; the limit on the - % Acorn RISC OS is a mere 16 files. - \expandafter\closeout\csname#2indfile\endcsname - \expandafter\let\csname\donesynindex#2\endcsname = 1 - \fi - % redefine \fooindfile: - \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname - \expandafter\let\csname#2indfile\endcsname=\temp - % redefine \fooindex: - \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% -} - -% Define \doindex, the driver for all \fooindex macros. -% Argument #1 is generated by the calling \fooindex macro, -% and it is "foo", the name of the index. - -% \doindex just uses \parsearg; it calls \doind for the actual work. -% This is because \doind is more useful to call from other macros. - -% There is also \dosubind {index}{topic}{subtopic} -% which makes an entry in a two-level index such as the operation index. - -\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} -\def\singleindexer #1{\doind{\indexname}{#1}} - -% like the previous two, but they put @code around the argument. -\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} -\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} - -% Take care of Texinfo commands that can appear in an index entry. -% Since there are some commands we want to expand, and others we don't, -% we have to laboriously prevent expansion for those that we don't. -% -\def\indexdummies{% - \def\@{@}% change to @@ when we switch to @ as escape char in index files. - \def\ {\realbackslash\space }% - % Need these in case \tex is in effect and \{ is a \delimiter again. - % But can't use \lbracecmd and \rbracecmd because texindex assumes - % braces and backslashes are used only as delimiters. - \let\{ = \mylbrace - \let\} = \myrbrace - % - % \definedummyword defines \#1 as \realbackslash #1\space, thus - % effectively preventing its expansion. This is used only for control - % words, not control letters, because the \space would be incorrect - % for control characters, but is needed to separate the control word - % from whatever follows. - % - % For control letters, we have \definedummyletter, which omits the - % space. - % - % These can be used both for control words that take an argument and - % those that do not. If it is followed by {arg} in the input, then - % that will dutifully get written to the index (or wherever). - % - \def\definedummyword##1{% - \expandafter\def\csname ##1\endcsname{\realbackslash ##1\space}% - }% - \def\definedummyletter##1{% - \expandafter\def\csname ##1\endcsname{\realbackslash ##1}% - }% - % - % Do the redefinitions. - \commondummies -} - -% For the aux file, @ is the escape character. So we want to redefine -% everything using @ instead of \realbackslash. When everything uses -% @, this will be simpler. -% -\def\atdummies{% - \def\@{@@}% - \def\ {@ }% - \let\{ = \lbraceatcmd - \let\} = \rbraceatcmd - % - % (See comments in \indexdummies.) - \def\definedummyword##1{% - \expandafter\def\csname ##1\endcsname{@##1\space}% - }% - \def\definedummyletter##1{% - \expandafter\def\csname ##1\endcsname{@##1}% - }% - % - % Do the redefinitions. - \commondummies -} - -% Called from \indexdummies and \atdummies. \definedummyword and -% \definedummyletter must be defined first. -% -\def\commondummies{% - % - \normalturnoffactive - % - % Control letters and accents. - \definedummyletter{_}% - \definedummyletter{,}% - \definedummyletter{"}% - \definedummyletter{`}% - \definedummyletter{'}% - \definedummyletter{^}% - \definedummyletter{~}% - \definedummyletter{=}% - \definedummyword{u}% - \definedummyword{v}% - \definedummyword{H}% - \definedummyword{dotaccent}% - \definedummyword{ringaccent}% - \definedummyword{tieaccent}% - \definedummyword{ubaraccent}% - \definedummyword{udotaccent}% - \definedummyword{dotless}% - % - % Other non-English letters. - \definedummyword{AA}% - \definedummyword{AE}% - \definedummyword{L}% - \definedummyword{OE}% - \definedummyword{O}% - \definedummyword{aa}% - \definedummyword{ae}% - \definedummyword{l}% - \definedummyword{oe}% - \definedummyword{o}% - \definedummyword{ss}% - % - % Although these internal commands shouldn't show up, sometimes they do. - \definedummyword{bf}% - \definedummyword{gtr}% - \definedummyword{hat}% - \definedummyword{less}% - \definedummyword{sf}% - \definedummyword{sl}% - \definedummyword{tclose}% - \definedummyword{tt}% - % - % Texinfo font commands. - \definedummyword{b}% - \definedummyword{i}% - \definedummyword{r}% - \definedummyword{sc}% - \definedummyword{t}% - % - \definedummyword{TeX}% - \definedummyword{acronym}% - \definedummyword{cite}% - \definedummyword{code}% - \definedummyword{command}% - \definedummyword{dfn}% - \definedummyword{dots}% - \definedummyword{emph}% - \definedummyword{env}% - \definedummyword{file}% - \definedummyword{kbd}% - \definedummyword{key}% - \definedummyword{math}% - \definedummyword{option}% - \definedummyword{samp}% - \definedummyword{strong}% - \definedummyword{uref}% - \definedummyword{url}% - \definedummyword{var}% - \definedummyword{w}% - % - % Assorted special characters. - \definedummyword{bullet}% - \definedummyword{copyright}% - \definedummyword{dots}% - \definedummyword{enddots}% - \definedummyword{equiv}% - \definedummyword{error}% - \definedummyword{expansion}% - \definedummyword{minus}% - \definedummyword{pounds}% - \definedummyword{point}% - \definedummyword{print}% - \definedummyword{result}% - % - % Handle some cases of @value -- where the variable name does not - % contain - or _, and the value does not contain any - % (non-fully-expandable) commands. - \let\value = \expandablevalue - % - % Normal spaces, not active ones. - \unsepspaces - % - % No macro expansion. - \turnoffmacros -} - -% If an index command is used in an @example environment, any spaces -% therein should become regular spaces in the raw index file, not the -% expansion of \tie (\leavevmode \penalty \@M \ ). -{\obeyspaces - \gdef\unsepspaces{\obeyspaces\let =\space}} - - -% \indexnofonts is used when outputting the strings to sort the index -% by, and when constructing control sequence names. It eliminates all -% control sequences and just writes whatever the best ASCII sort string -% would be for a given command (usually its argument). -% -\def\indexdummytex{TeX} -\def\indexdummydots{...} -% -\def\indexnofonts{% - \def\ { }% - \def\@{@}% - % how to handle braces? - \def\_{\normalunderscore}% - % - \let\,=\asis - \let\"=\asis - \let\`=\asis - \let\'=\asis - \let\^=\asis - \let\~=\asis - \let\==\asis - \let\u=\asis - \let\v=\asis - \let\H=\asis - \let\dotaccent=\asis - \let\ringaccent=\asis - \let\tieaccent=\asis - \let\ubaraccent=\asis - \let\udotaccent=\asis - \let\dotless=\asis - % - % Other non-English letters. - \def\AA{AA}% - \def\AE{AE}% - \def\L{L}% - \def\OE{OE}% - \def\O{O}% - \def\aa{aa}% - \def\ae{ae}% - \def\l{l}% - \def\oe{oe}% - \def\o{o}% - \def\ss{ss}% - \def\exclamdown{!}% - \def\questiondown{?}% - % - % Don't no-op \tt, since it isn't a user-level command - % and is used in the definitions of the active chars like <, >, |, etc. - % Likewise with the other plain tex font commands. - %\let\tt=\asis - % - % Texinfo font commands. - \let\b=\asis - \let\i=\asis - \let\r=\asis - \let\sc=\asis - \let\t=\asis - % - \let\TeX=\indexdummytex - \let\acronym=\asis - \let\cite=\asis - \let\code=\asis - \let\command=\asis - \let\dfn=\asis - \let\dots=\indexdummydots - \let\emph=\asis - \let\env=\asis - \let\file=\asis - \let\kbd=\asis - \let\key=\asis - \let\math=\asis - \let\option=\asis - \let\samp=\asis - \let\strong=\asis - \let\uref=\asis - \let\url=\asis - \let\var=\asis - \let\w=\asis -} - -\let\indexbackslash=0 %overridden during \printindex. -\let\SETmarginindex=\relax % put index entries in margin (undocumented)? - -% For \ifx comparisons. -\def\emptymacro{\empty} - -% Most index entries go through here, but \dosubind is the general case. -% -\def\doind#1#2{\dosubind{#1}{#2}\empty} - -% Workhorse for all \fooindexes. -% #1 is name of index, #2 is stuff to put there, #3 is subentry -- -% \empty if called from \doind, as we usually are. The main exception -% is with defuns, which call us directly. -% -\def\dosubind#1#2#3{% - % Put the index entry in the margin if desired. - \ifx\SETmarginindex\relax\else - \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}% - \fi - {% - \count255=\lastpenalty - {% - \indexdummies % Must do this here, since \bf, etc expand at this stage - \escapechar=`\\ - {% - \let\folio = 0% We will expand all macros now EXCEPT \folio. - \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now - % so it will be output as is; and it will print as backslash. - % - % The main index entry text. - \toks0 = {#2}% - % - % If third arg is present, precede it with space in sort key. - \def\thirdarg{#3}% - \ifx\thirdarg\emptymacro \else - % If the third (subentry) arg is present, add it to the index - % line to write. - \toks0 = \expandafter{\the\toks0 \space #3}% - \fi - % - % Process the index entry with all font commands turned off, to - % get the string to sort by. - {\indexnofonts - \edef\temp{\the\toks0}% need full expansion - \xdef\indexsorttmp{\temp}% - }% - % - % Set up the complete index entry, with both the sort key and - % the original text, including any font commands. We write - % three arguments to \entry to the .?? file (four in the - % subentry case), texindex reduces to two when writing the .??s - % sorted result. - \edef\temp{% - \write\csname#1indfile\endcsname{% - \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}% - }% - % - % If a skip is the last thing on the list now, preserve it - % by backing up by \lastskip, doing the \write, then inserting - % the skip again. Otherwise, the whatsit generated by the - % \write will make \lastskip zero. The result is that sequences - % like this: - % @end defun - % @tindex whatever - % @defun ... - % will have extra space inserted, because the \medbreak in the - % start of the @defun won't see the skip inserted by the @end of - % the previous defun. - % - % But don't do any of this if we're not in vertical mode. We - % don't want to do a \vskip and prematurely end a paragraph. - % - % Avoid page breaks due to these extra skips, too. - % - \iflinks - \ifvmode - \skip0 = \lastskip - \ifdim\lastskip = 0pt \else \nobreak\vskip-\skip0 \fi - \fi - % - \temp % do the write - % - \ifvmode \ifdim\skip0 = 0pt \else \nobreak\vskip\skip0 \fi \fi - \fi - }% - }% - \penalty\count255 - }% -} - -% The index entry written in the file actually looks like -% \entry {sortstring}{page}{topic} -% or -% \entry {sortstring}{page}{topic}{subtopic} -% The texindex program reads in these files and writes files -% containing these kinds of lines: -% \initial {c} -% before the first topic whose initial is c -% \entry {topic}{pagelist} -% for a topic that is used without subtopics -% \primary {topic} -% for the beginning of a topic that is used with subtopics -% \secondary {subtopic}{pagelist} -% for each subtopic. - -% Define the user-accessible indexing commands -% @findex, @vindex, @kindex, @cindex. - -\def\findex {\fnindex} -\def\kindex {\kyindex} -\def\cindex {\cpindex} -\def\vindex {\vrindex} -\def\tindex {\tpindex} -\def\pindex {\pgindex} - -\def\cindexsub {\begingroup\obeylines\cindexsub} -{\obeylines % -\gdef\cindexsub "#1" #2^^M{\endgroup % -\dosubind{cp}{#2}{#1}}} - -% Define the macros used in formatting output of the sorted index material. - -% @printindex causes a particular index (the ??s file) to get printed. -% It does not print any chapter heading (usually an @unnumbered). -% -\def\printindex{\parsearg\doprintindex} -\def\doprintindex#1{\begingroup - \dobreak \chapheadingskip{10000}% - % - \smallfonts \rm - \tolerance = 9500 - \indexbreaks - % - % See if the index file exists and is nonempty. - % Change catcode of @ here so that if the index file contains - % \initial {@} - % as its first line, TeX doesn't complain about mismatched braces - % (because it thinks @} is a control sequence). - \catcode`\@ = 11 - \openin 1 \jobname.#1s - \ifeof 1 - % \enddoublecolumns gets confused if there is no text in the index, - % and it loses the chapter title and the aux file entries for the - % index. The easiest way to prevent this problem is to make sure - % there is some text. - \putwordIndexNonexistent - \else - % - % If the index file exists but is empty, then \openin leaves \ifeof - % false. We have to make TeX try to read something from the file, so - % it can discover if there is anything in it. - \read 1 to \temp - \ifeof 1 - \putwordIndexIsEmpty - \else - % Index files are almost Texinfo source, but we use \ as the escape - % character. It would be better to use @, but that's too big a change - % to make right now. - \def\indexbackslash{\rawbackslashxx}% - \catcode`\\ = 0 - \escapechar = `\\ - \begindoublecolumns - \input \jobname.#1s - \enddoublecolumns - \fi - \fi - \closein 1 -\endgroup} - -% These macros are used by the sorted index file itself. -% Change them to control the appearance of the index. - -\def\initial#1{{% - % Some minor font changes for the special characters. - \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt - % - % Remove any glue we may have, we'll be inserting our own. - \removelastskip - % - % We like breaks before the index initials, so insert a bonus. - \penalty -300 - % - % Typeset the initial. Making this add up to a whole number of - % baselineskips increases the chance of the dots lining up from column - % to column. It still won't often be perfect, because of the stretch - % we need before each entry, but it's better. - % - % No shrink because it confuses \balancecolumns. - \vskip 1.67\baselineskip plus .5\baselineskip - \leftline{\secbf #1}% - \vskip .33\baselineskip plus .1\baselineskip - % - % Do our best not to break after the initial. - \nobreak -}} - -% This typesets a paragraph consisting of #1, dot leaders, and then #2 -% flush to the right margin. It is used for index and table of contents -% entries. The paragraph is indented by \leftskip. -% -\def\entry#1#2{\begingroup - % - % Start a new paragraph if necessary, so our assignments below can't - % affect previous text. - \par - % - % Do not fill out the last line with white space. - \parfillskip = 0in - % - % No extra space above this paragraph. - \parskip = 0in - % - % Do not prefer a separate line ending with a hyphen to fewer lines. - \finalhyphendemerits = 0 - % - % \hangindent is only relevant when the entry text and page number - % don't both fit on one line. In that case, bob suggests starting the - % dots pretty far over on the line. Unfortunately, a large - % indentation looks wrong when the entry text itself is broken across - % lines. So we use a small indentation and put up with long leaders. - % - % \hangafter is reset to 1 (which is the value we want) at the start - % of each paragraph, so we need not do anything with that. - \hangindent = 2em - % - % When the entry text needs to be broken, just fill out the first line - % with blank space. - \rightskip = 0pt plus1fil - % - % A bit of stretch before each entry for the benefit of balancing columns. - \vskip 0pt plus1pt - % - % Start a ``paragraph'' for the index entry so the line breaking - % parameters we've set above will have an effect. - \noindent - % - % Insert the text of the index entry. TeX will do line-breaking on it. - #1% - % The following is kludged to not output a line of dots in the index if - % there are no page numbers. The next person who breaks this will be - % cursed by a Unix daemon. - \def\tempa{{\rm }}% - \def\tempb{#2}% - \edef\tempc{\tempa}% - \edef\tempd{\tempb}% - \ifx\tempc\tempd\ \else% - % - % If we must, put the page number on a line of its own, and fill out - % this line with blank space. (The \hfil is overwhelmed with the - % fill leaders glue in \indexdotfill if the page number does fit.) - \hfil\penalty50 - \null\nobreak\indexdotfill % Have leaders before the page number. - % - % The `\ ' here is removed by the implicit \unskip that TeX does as - % part of (the primitive) \par. Without it, a spurious underfull - % \hbox ensues. - \ifpdf - \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. - \else - \ #2% The page number ends the paragraph. - \fi - \fi% - \par -\endgroup} - -% Like \dotfill except takes at least 1 em. -\def\indexdotfill{\cleaders - \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill} - -\def\primary #1{\line{#1\hfil}} - -\newskip\secondaryindent \secondaryindent=0.5cm -\def\secondary#1#2{{% - \parfillskip=0in - \parskip=0in - \hangindent=1in - \hangafter=1 - \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill - \ifpdf - \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. - \else - #2 - \fi - \par -}} - -% Define two-column mode, which we use to typeset indexes. -% Adapted from the TeXbook, page 416, which is to say, -% the manmac.tex format used to print the TeXbook itself. -\catcode`\@=11 - -\newbox\partialpage -\newdimen\doublecolumnhsize - -\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns - % Grab any single-column material above us. - \output = {% - % - % Here is a possibility not foreseen in manmac: if we accumulate a - % whole lot of material, we might end up calling this \output - % routine twice in a row (see the doublecol-lose test, which is - % essentially a couple of indexes with @setchapternewpage off). In - % that case we just ship out what is in \partialpage with the normal - % output routine. Generally, \partialpage will be empty when this - % runs and this will be a no-op. See the indexspread.tex test case. - \ifvoid\partialpage \else - \onepageout{\pagecontents\partialpage}% - \fi - % - \global\setbox\partialpage = \vbox{% - % Unvbox the main output page. - \unvbox\PAGE - \kern-\topskip \kern\baselineskip - }% - }% - \eject % run that output routine to set \partialpage - % - % Use the double-column output routine for subsequent pages. - \output = {\doublecolumnout}% - % - % Change the page size parameters. We could do this once outside this - % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 - % format, but then we repeat the same computation. Repeating a couple - % of assignments once per index is clearly meaningless for the - % execution time, so we may as well do it in one place. - % - % First we halve the line length, less a little for the gutter between - % the columns. We compute the gutter based on the line length, so it - % changes automatically with the paper format. The magic constant - % below is chosen so that the gutter has the same value (well, +-<1pt) - % as it did when we hard-coded it. - % - % We put the result in a separate register, \doublecolumhsize, so we - % can restore it in \pagesofar, after \hsize itself has (potentially) - % been clobbered. - % - \doublecolumnhsize = \hsize - \advance\doublecolumnhsize by -.04154\hsize - \divide\doublecolumnhsize by 2 - \hsize = \doublecolumnhsize - % - % Double the \vsize as well. (We don't need a separate register here, - % since nobody clobbers \vsize.) - \vsize = 2\vsize -} - -% The double-column output routine for all double-column pages except -% the last. -% -\def\doublecolumnout{% - \splittopskip=\topskip \splitmaxdepth=\maxdepth - % Get the available space for the double columns -- the normal - % (undoubled) page height minus any material left over from the - % previous page. - \dimen@ = \vsize - \divide\dimen@ by 2 - \advance\dimen@ by -\ht\partialpage - % - % box0 will be the left-hand column, box2 the right. - \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ - \onepageout\pagesofar - \unvbox255 - \penalty\outputpenalty -} -% -% Re-output the contents of the output page -- any previous material, -% followed by the two boxes we just split, in box0 and box2. -\def\pagesofar{% - \unvbox\partialpage - % - \hsize = \doublecolumnhsize - \wd0=\hsize \wd2=\hsize - \hbox to\pagewidth{\box0\hfil\box2}% -} -% -% All done with double columns. -\def\enddoublecolumns{% - \output = {% - % Split the last of the double-column material. Leave it on the - % current page, no automatic page break. - \balancecolumns - % - % If we end up splitting too much material for the current page, - % though, there will be another page break right after this \output - % invocation ends. Having called \balancecolumns once, we do not - % want to call it again. Therefore, reset \output to its normal - % definition right away. (We hope \balancecolumns will never be - % called on to balance too much material, but if it is, this makes - % the output somewhat more palatable.) - \global\output = {\onepageout{\pagecontents\PAGE}}% - }% - \eject - \endgroup % started in \begindoublecolumns - % - % \pagegoal was set to the doubled \vsize above, since we restarted - % the current page. We're now back to normal single-column - % typesetting, so reset \pagegoal to the normal \vsize (after the - % \endgroup where \vsize got restored). - \pagegoal = \vsize -} -% -% Called at the end of the double column material. -\def\balancecolumns{% - \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. - \dimen@ = \ht0 - \advance\dimen@ by \topskip - \advance\dimen@ by-\baselineskip - \divide\dimen@ by 2 % target to split to - %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% - \splittopskip = \topskip - % Loop until we get a decent breakpoint. - {% - \vbadness = 10000 - \loop - \global\setbox3 = \copy0 - \global\setbox1 = \vsplit3 to \dimen@ - \ifdim\ht3>\dimen@ - \global\advance\dimen@ by 1pt - \repeat - }% - %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% - \setbox0=\vbox to\dimen@{\unvbox1}% - \setbox2=\vbox to\dimen@{\unvbox3}% - % - \pagesofar -} -\catcode`\@ = \other - - -\message{sectioning,} -% Chapters, sections, etc. - -\newcount\chapno -\newcount\secno \secno=0 -\newcount\subsecno \subsecno=0 -\newcount\subsubsecno \subsubsecno=0 - -% This counter is funny since it counts through charcodes of letters A, B, ... -\newcount\appendixno \appendixno = `\@ -% \def\appendixletter{\char\the\appendixno} -% We do the following for the sake of pdftex, which needs the actual -% letter in the expansion, not just typeset. -\def\appendixletter{% - \ifnum\appendixno=`A A% - \else\ifnum\appendixno=`B B% - \else\ifnum\appendixno=`C C% - \else\ifnum\appendixno=`D D% - \else\ifnum\appendixno=`E E% - \else\ifnum\appendixno=`F F% - \else\ifnum\appendixno=`G G% - \else\ifnum\appendixno=`H H% - \else\ifnum\appendixno=`I I% - \else\ifnum\appendixno=`J J% - \else\ifnum\appendixno=`K K% - \else\ifnum\appendixno=`L L% - \else\ifnum\appendixno=`M M% - \else\ifnum\appendixno=`N N% - \else\ifnum\appendixno=`O O% - \else\ifnum\appendixno=`P P% - \else\ifnum\appendixno=`Q Q% - \else\ifnum\appendixno=`R R% - \else\ifnum\appendixno=`S S% - \else\ifnum\appendixno=`T T% - \else\ifnum\appendixno=`U U% - \else\ifnum\appendixno=`V V% - \else\ifnum\appendixno=`W W% - \else\ifnum\appendixno=`X X% - \else\ifnum\appendixno=`Y Y% - \else\ifnum\appendixno=`Z Z% - % The \the is necessary, despite appearances, because \appendixletter is - % expanded while writing the .toc file. \char\appendixno is not - % expandable, thus it is written literally, thus all appendixes come out - % with the same letter (or @) in the toc without it. - \else\char\the\appendixno - \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi - \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} - -% Each @chapter defines this as the name of the chapter. -% page headings and footings can use it. @section does likewise. -\def\thischapter{} -\def\thissection{} - -\newcount\absseclevel % used to calculate proper heading level -\newcount\secbase\secbase=0 % @raise/lowersections modify this count - -% @raisesections: treat @section as chapter, @subsection as section, etc. -\def\raisesections{\global\advance\secbase by -1} -\let\up=\raisesections % original BFox name - -% @lowersections: treat @chapter as section, @section as subsection, etc. -\def\lowersections{\global\advance\secbase by 1} -\let\down=\lowersections % original BFox name - -% Choose a numbered-heading macro -% #1 is heading level if unmodified by @raisesections or @lowersections -% #2 is text for heading -\def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 -\ifcase\absseclevel - \chapterzzz{#2} -\or - \seczzz{#2} -\or - \numberedsubseczzz{#2} -\or - \numberedsubsubseczzz{#2} -\else - \ifnum \absseclevel<0 - \chapterzzz{#2} - \else - \numberedsubsubseczzz{#2} - \fi -\fi -} - -% like \numhead, but chooses appendix heading levels -\def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 -\ifcase\absseclevel - \appendixzzz{#2} -\or - \appendixsectionzzz{#2} -\or - \appendixsubseczzz{#2} -\or - \appendixsubsubseczzz{#2} -\else - \ifnum \absseclevel<0 - \appendixzzz{#2} - \else - \appendixsubsubseczzz{#2} - \fi -\fi -} - -% like \numhead, but chooses numberless heading levels -\def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 -\ifcase\absseclevel - \unnumberedzzz{#2} -\or - \unnumberedseczzz{#2} -\or - \unnumberedsubseczzz{#2} -\or - \unnumberedsubsubseczzz{#2} -\else - \ifnum \absseclevel<0 - \unnumberedzzz{#2} - \else - \unnumberedsubsubseczzz{#2} - \fi -\fi -} - -% @chapter, @appendix, @unnumbered. -\def\thischaptername{No Chapter Title} -\outer\def\chapter{\parsearg\chapteryyy} -\def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz -\def\chapterzzz #1{% - \secno=0 \subsecno=0 \subsubsecno=0 - \global\advance \chapno by 1 \message{\putwordChapter\space \the\chapno}% - \chapmacro {#1}{\the\chapno}% - \gdef\thissection{#1}% - \gdef\thischaptername{#1}% - % We don't substitute the actual chapter name into \thischapter - % because we don't want its macros evaluated now. - \xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}% - \writetocentry{chap}{#1}{{\the\chapno}} - \donoderef - \global\let\section = \numberedsec - \global\let\subsection = \numberedsubsec - \global\let\subsubsection = \numberedsubsubsec -} - -% we use \chapno to avoid indenting back -\def\appendixbox#1{% - \setbox0 = \hbox{\putwordAppendix{} \the\chapno}% - \hbox to \wd0{#1\hss}} - -\outer\def\appendix{\parsearg\appendixyyy} -\def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz -\def\appendixzzz #1{% - \secno=0 \subsecno=0 \subsubsecno=0 - \global\advance \appendixno by 1 - \message{\putwordAppendix\space \appendixletter}% - \chapmacro {#1}{\appendixbox{\putwordAppendix{} \appendixletter}}% - \gdef\thissection{#1}% - \gdef\thischaptername{#1}% - \xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}% - \writetocentry{appendix}{#1}{{\appendixletter}} - \appendixnoderef - \global\let\section = \appendixsec - \global\let\subsection = \appendixsubsec - \global\let\subsubsection = \appendixsubsubsec -} - -% @centerchap is like @unnumbered, but the heading is centered. -\outer\def\centerchap{\parsearg\centerchapyyy} -\def\centerchapyyy #1{{\let\unnumbchapmacro=\centerchapmacro \unnumberedyyy{#1}}} - -% @top is like @unnumbered. -\outer\def\top{\parsearg\unnumberedyyy} - -\outer\def\unnumbered{\parsearg\unnumberedyyy} -\def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz -\def\unnumberedzzz #1{% - \secno=0 \subsecno=0 \subsubsecno=0 - % - % This used to be simply \message{#1}, but TeX fully expands the - % argument to \message. Therefore, if #1 contained @-commands, TeX - % expanded them. For example, in `@unnumbered The @cite{Book}', TeX - % expanded @cite (which turns out to cause errors because \cite is meant - % to be executed, not expanded). - % - % Anyway, we don't want the fully-expanded definition of @cite to appear - % as a result of the \message, we just want `@cite' itself. We use - % \the to achieve this: TeX expands \the only once, - % simply yielding the contents of . (We also do this for - % the toc entries.) - \toks0 = {#1}\message{(\the\toks0)}% - % - \unnumbchapmacro {#1}% - \gdef\thischapter{#1}\gdef\thissection{#1}% - \writetocentry{unnumbchap}{#1}{{\the\chapno}} - \unnumbnoderef - \global\let\section = \unnumberedsec - \global\let\subsection = \unnumberedsubsec - \global\let\subsubsection = \unnumberedsubsubsec -} - -% Sections. -\outer\def\numberedsec{\parsearg\secyyy} -\def\secyyy #1{\numhead1{#1}} % normally calls seczzz -\def\seczzz #1{% - \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % - \gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}% - \writetocentry{sec}{#1}{{\the\chapno}{\the\secno}} - \donoderef - \nobreak -} - -\outer\def\appendixsection{\parsearg\appendixsecyyy} -\outer\def\appendixsec{\parsearg\appendixsecyyy} -\def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz -\def\appendixsectionzzz #1{% - \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % - \gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}% - \writetocentry{sec}{#1}{{\appendixletter}{\the\secno}} - \appendixnoderef - \nobreak -} - -\outer\def\unnumberedsec{\parsearg\unnumberedsecyyy} -\def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz -\def\unnumberedseczzz #1{% - \plainsecheading {#1}\gdef\thissection{#1}% - \writetocentry{unnumbsec}{#1}{{\the\chapno}{\the\secno}} - \unnumbnoderef - \nobreak -} - -% Subsections. -\outer\def\numberedsubsec{\parsearg\numberedsubsecyyy} -\def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz -\def\numberedsubseczzz #1{% - \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % - \subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}% - \writetocentry{subsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}} - \donoderef - \nobreak -} - -\outer\def\appendixsubsec{\parsearg\appendixsubsecyyy} -\def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz -\def\appendixsubseczzz #1{% - \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % - \subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}% - \writetocentry{subsec}{#1}{{\appendixletter}{\the\secno}{\the\subsecno}} - \appendixnoderef - \nobreak -} - -\outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy} -\def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz -\def\unnumberedsubseczzz #1{% - \plainsubsecheading {#1}\gdef\thissection{#1}% - \writetocentry{unnumbsubsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}} - \unnumbnoderef - \nobreak -} - -% Subsubsections. -\outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy} -\def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz -\def\numberedsubsubseczzz #1{% - \gdef\thissection{#1}\global\advance \subsubsecno by 1 % - \subsubsecheading {#1} - {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}% - \writetocentry{subsubsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}} - \donoderef - \nobreak -} - -\outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy} -\def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz -\def\appendixsubsubseczzz #1{% - \gdef\thissection{#1}\global\advance \subsubsecno by 1 % - \subsubsecheading {#1} - {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}% - \writetocentry{subsubsec}{#1}{{\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}} - \appendixnoderef - \nobreak -} - -\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy} -\def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz -\def\unnumberedsubsubseczzz #1{% - \plainsubsubsecheading {#1}\gdef\thissection{#1}% - \writetocentry{unnumbsubsubsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}} - \unnumbnoderef - \nobreak -} - -% These are variants which are not "outer", so they can appear in @ifinfo. -% Actually, they should now be obsolete; ordinary section commands should work. -\def\infotop{\parsearg\unnumberedzzz} -\def\infounnumbered{\parsearg\unnumberedzzz} -\def\infounnumberedsec{\parsearg\unnumberedseczzz} -\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz} -\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz} - -\def\infoappendix{\parsearg\appendixzzz} -\def\infoappendixsec{\parsearg\appendixseczzz} -\def\infoappendixsubsec{\parsearg\appendixsubseczzz} -\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz} - -\def\infochapter{\parsearg\chapterzzz} -\def\infosection{\parsearg\sectionzzz} -\def\infosubsection{\parsearg\subsectionzzz} -\def\infosubsubsection{\parsearg\subsubsectionzzz} - -% These macros control what the section commands do, according -% to what kind of chapter we are in (ordinary, appendix, or unnumbered). -% Define them by default for a numbered chapter. -\global\let\section = \numberedsec -\global\let\subsection = \numberedsubsec -\global\let\subsubsection = \numberedsubsubsec - -% Define @majorheading, @heading and @subheading - -% NOTE on use of \vbox for chapter headings, section headings, and such: -% 1) We use \vbox rather than the earlier \line to permit -% overlong headings to fold. -% 2) \hyphenpenalty is set to 10000 because hyphenation in a -% heading is obnoxious; this forbids it. -% 3) Likewise, headings look best if no \parindent is used, and -% if justification is not attempted. Hence \raggedright. - - -\def\majorheading{\parsearg\majorheadingzzz} -\def\majorheadingzzz #1{% - {\advance\chapheadingskip by 10pt \chapbreak }% - {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt\raggedright - \rm #1\hfill}}\bigskip \par\penalty 200} - -\def\chapheading{\parsearg\chapheadingzzz} -\def\chapheadingzzz #1{\chapbreak % - {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt\raggedright - \rm #1\hfill}}\bigskip \par\penalty 200} - -% @heading, @subheading, @subsubheading. -\def\heading{\parsearg\plainsecheading} -\def\subheading{\parsearg\plainsubsecheading} -\def\subsubheading{\parsearg\plainsubsubsecheading} - -% These macros generate a chapter, section, etc. heading only -% (including whitespace, linebreaking, etc. around it), -% given all the information in convenient, parsed form. - -%%% Args are the skip and penalty (usually negative) -\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} - -\def\setchapterstyle #1 {\csname CHAPF#1\endcsname} - -%%% Define plain chapter starts, and page on/off switching for it -% Parameter controlling skip before chapter headings (if needed) - -\newskip\chapheadingskip - -\def\chapbreak{\dobreak \chapheadingskip {-4000}} -\def\chappager{\par\vfill\supereject} -\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi} - -\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} - -\def\CHAPPAGoff{% -\global\let\contentsalignmacro = \chappager -\global\let\pchapsepmacro=\chapbreak -\global\let\pagealignmacro=\chappager} - -\def\CHAPPAGon{% -\global\let\contentsalignmacro = \chappager -\global\let\pchapsepmacro=\chappager -\global\let\pagealignmacro=\chappager -\global\def\HEADINGSon{\HEADINGSsingle}} - -\def\CHAPPAGodd{ -\global\let\contentsalignmacro = \chapoddpage -\global\let\pchapsepmacro=\chapoddpage -\global\let\pagealignmacro=\chapoddpage -\global\def\HEADINGSon{\HEADINGSdouble}} - -\CHAPPAGon - -\def\CHAPFplain{ -\global\let\chapmacro=\chfplain -\global\let\unnumbchapmacro=\unnchfplain -\global\let\centerchapmacro=\centerchfplain} - -% Plain chapter opening. -% #1 is the text, #2 the chapter number or empty if unnumbered. -\def\chfplain#1#2{% - \pchapsepmacro - {% - \chapfonts \rm - \def\chapnum{#2}% - \setbox0 = \hbox{#2\ifx\chapnum\empty\else\enspace\fi}% - \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright - \hangindent = \wd0 \centerparametersmaybe - \unhbox0 #1\par}% - }% - \nobreak\bigskip % no page break after a chapter title - \nobreak -} - -% Plain opening for unnumbered. -\def\unnchfplain#1{\chfplain{#1}{}} - -% @centerchap -- centered and unnumbered. -\let\centerparametersmaybe = \relax -\def\centerchfplain#1{{% - \def\centerparametersmaybe{% - \advance\rightskip by 3\rightskip - \leftskip = \rightskip - \parfillskip = 0pt - }% - \chfplain{#1}{}% -}} - -\CHAPFplain % The default - -\def\unnchfopen #1{% -\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt\raggedright - \rm #1\hfill}}\bigskip \par\nobreak -} - -\def\chfopen #1#2{\chapoddpage {\chapfonts -\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% -\par\penalty 5000 % -} - -\def\centerchfopen #1{% -\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt - \hfill {\rm #1}\hfill}}\bigskip \par\nobreak -} - -\def\CHAPFopen{ -\global\let\chapmacro=\chfopen -\global\let\unnumbchapmacro=\unnchfopen -\global\let\centerchapmacro=\centerchfopen} - - -% Section titles. -\newskip\secheadingskip -\def\secheadingbreak{\dobreak \secheadingskip {-1000}} -\def\secheading#1#2#3{\sectionheading{sec}{#2.#3}{#1}} -\def\plainsecheading#1{\sectionheading{sec}{}{#1}} - -% Subsection titles. -\newskip \subsecheadingskip -\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}} -\def\subsecheading#1#2#3#4{\sectionheading{subsec}{#2.#3.#4}{#1}} -\def\plainsubsecheading#1{\sectionheading{subsec}{}{#1}} - -% Subsubsection titles. -\let\subsubsecheadingskip = \subsecheadingskip -\let\subsubsecheadingbreak = \subsecheadingbreak -\def\subsubsecheading#1#2#3#4#5{\sectionheading{subsubsec}{#2.#3.#4.#5}{#1}} -\def\plainsubsubsecheading#1{\sectionheading{subsubsec}{}{#1}} - - -% Print any size section title. -% -% #1 is the section type (sec/subsec/subsubsec), #2 is the section -% number (maybe empty), #3 the text. -\def\sectionheading#1#2#3{% - {% - \expandafter\advance\csname #1headingskip\endcsname by \parskip - \csname #1headingbreak\endcsname - }% - {% - % Switch to the right set of fonts. - \csname #1fonts\endcsname \rm - % - % Only insert the separating space if we have a section number. - \def\secnum{#2}% - \setbox0 = \hbox{#2\ifx\secnum\empty\else\enspace\fi}% - % - \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright - \hangindent = \wd0 % zero if no section number - \unhbox0 #3}% - }% - % Add extra space after the heading -- either a line space or a - % paragraph space, whichever is more. (Some people like to set - % \parskip to large values for some reason.) Don't allow stretch, though. - \nobreak - \ifdim\parskip>\normalbaselineskip - \kern\parskip - \else - \kern\normalbaselineskip - \fi - \nobreak -} - - -\message{toc,} -% Table of contents. -\newwrite\tocfile - -% Write an entry to the toc file, opening it if necessary. -% Called from @chapter, etc. We supply {\folio} at the end of the -% argument, which will end up as the last argument to the \...entry macro. -% -% Usage: \writetocentry{chap}{The Name of The Game}{{\the\chapno}} -% We open the .toc file for writing here instead of at @setfilename (or -% any other fixed time) so that @contents can be anywhere in the document. -% -\newif\iftocfileopened -\def\writetocentry#1#2#3{% - \iftocfileopened\else - \immediate\openout\tocfile = \jobname.toc - \global\tocfileopenedtrue - \fi - % - \iflinks - \toks0 = {#2}% - \edef\temp{\write\tocfile{\realbackslash #1entry{\the\toks0}#3{\folio}}}% - \temp - \fi - % - % Tell \shipout to create a page destination if we're doing pdf, which - % will be the target of the links in the table of contents. We can't - % just do it on every page because the title pages are numbered 1 and - % 2 (the page numbers aren't printed), and so are the first two pages - % of the document. Thus, we'd have two destinations named `1', and - % two named `2'. - \ifpdf \pdfmakepagedesttrue \fi -} - -\newskip\contentsrightmargin \contentsrightmargin=1in -\newcount\savepageno -\newcount\lastnegativepageno \lastnegativepageno = -1 - -% Finish up the main text and prepare to read what we've written -% to \tocfile. -% -\def\startcontents#1{% - % If @setchapternewpage on, and @headings double, the contents should - % start on an odd page, unlike chapters. Thus, we maintain - % \contentsalignmacro in parallel with \pagealignmacro. - % From: Torbjorn Granlund - \contentsalignmacro - \immediate\closeout\tocfile - % - % Don't need to put `Contents' or `Short Contents' in the headline. - % It is abundantly clear what they are. - \unnumbchapmacro{#1}\def\thischapter{}% - \savepageno = \pageno - \begingroup % Set up to handle contents files properly. - \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11 - % We can't do this, because then an actual ^ in a section - % title fails, e.g., @chapter ^ -- exponentiation. --karl, 9jul97. - %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi - \raggedbottom % Worry more about breakpoints than the bottom. - \advance\hsize by -\contentsrightmargin % Don't use the full line length. - % - % Roman numerals for page numbers. - \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi -} - - -% Normal (long) toc. -\def\contents{% - \startcontents{\putwordTOC}% - \openin 1 \jobname.toc - \ifeof 1 \else - \closein 1 - \input \jobname.toc - \fi - \vfill \eject - \contentsalignmacro % in case @setchapternewpage odd is in effect - \pdfmakeoutlines - \endgroup - \lastnegativepageno = \pageno - \global\pageno = \savepageno -} - -% And just the chapters. -\def\summarycontents{% - \startcontents{\putwordShortTOC}% - % - \let\chapentry = \shortchapentry - \let\appendixentry = \shortappendixentry - \let\unnumbchapentry = \shortunnumberedentry - % We want a true roman here for the page numbers. - \secfonts - \let\rm=\shortcontrm \let\bf=\shortcontbf - \let\sl=\shortcontsl \let\tt=\shortconttt - \rm - \hyphenpenalty = 10000 - \advance\baselineskip by 1pt % Open it up a little. - \def\secentry ##1##2##3##4{} - \def\subsecentry ##1##2##3##4##5{} - \def\subsubsecentry ##1##2##3##4##5##6{} - \let\unnumbsecentry = \secentry - \let\unnumbsubsecentry = \subsecentry - \let\unnumbsubsubsecentry = \subsubsecentry - \openin 1 \jobname.toc - \ifeof 1 \else - \closein 1 - \input \jobname.toc - \fi - \vfill \eject - \contentsalignmacro % in case @setchapternewpage odd is in effect - \endgroup - \lastnegativepageno = \pageno - \global\pageno = \savepageno -} -\let\shortcontents = \summarycontents - -\ifpdf - \pdfcatalog{/PageMode /UseOutlines}% -\fi - -% These macros generate individual entries in the table of contents. -% The first argument is the chapter or section name. -% The last argument is the page number. -% The arguments in between are the chapter number, section number, ... - -% Chapters, in the main contents. -\def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}} -% -% Chapters, in the short toc. -% See comments in \dochapentry re vbox and related settings. -\def\shortchapentry#1#2#3{% - \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#3\egroup}% -} - -% Appendices, in the main contents. -\def\appendixentry#1#2#3{% - \dochapentry{\appendixbox{\putwordAppendix{} #2}\labelspace#1}{#3}} -% -% Appendices, in the short toc. -\let\shortappendixentry = \shortchapentry - -% Typeset the label for a chapter or appendix for the short contents. -% The arg is, e.g., `Appendix A' for an appendix, or `3' for a chapter. -% We could simplify the code here by writing out an \appendixentry -% command in the toc file for appendices, instead of using \chapentry -% for both, but it doesn't seem worth it. -% -\newdimen\shortappendixwidth -% -\def\shortchaplabel#1{% - % This space should be enough, since a single number is .5em, and the - % widest letter (M) is 1em, at least in the Computer Modern fonts. - % But use \hss just in case. - % (This space doesn't include the extra space that gets added after - % the label; that gets put in by \shortchapentry above.) - \dimen0 = 1em - \hbox to \dimen0{#1\hss}% -} - -% Unnumbered chapters. -\def\unnumbchapentry#1#2#3{\dochapentry{#1}{#3}} -\def\shortunnumberedentry#1#2#3{\tocentry{#1}{\doshortpageno\bgroup#3\egroup}} - -% Sections. -\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}} -\def\unnumbsecentry#1#2#3#4{\dosecentry{#1}{#4}} - -% Subsections. -\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}} -\def\unnumbsubsecentry#1#2#3#4#5{\dosubsecentry{#1}{#5}} - -% And subsubsections. -\def\subsubsecentry#1#2#3#4#5#6{% - \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}} -\def\unnumbsubsubsecentry#1#2#3#4#5#6{\dosubsubsecentry{#1}{#6}} - -% This parameter controls the indentation of the various levels. -\newdimen\tocindent \tocindent = 3pc - -% Now for the actual typesetting. In all these, #1 is the text and #2 is the -% page number. -% -% If the toc has to be broken over pages, we want it to be at chapters -% if at all possible; hence the \penalty. -\def\dochapentry#1#2{% - \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip - \begingroup - \chapentryfonts - \tocentry{#1}{\dopageno\bgroup#2\egroup}% - \endgroup - \nobreak\vskip .25\baselineskip plus.1\baselineskip -} - -\def\dosecentry#1#2{\begingroup - \secentryfonts \leftskip=\tocindent - \tocentry{#1}{\dopageno\bgroup#2\egroup}% -\endgroup} - -\def\dosubsecentry#1#2{\begingroup - \subsecentryfonts \leftskip=2\tocindent - \tocentry{#1}{\dopageno\bgroup#2\egroup}% -\endgroup} - -\def\dosubsubsecentry#1#2{\begingroup - \subsubsecentryfonts \leftskip=3\tocindent - \tocentry{#1}{\dopageno\bgroup#2\egroup}% -\endgroup} - -% Final typesetting of a toc entry; we use the same \entry macro as for -% the index entries, but we want to suppress hyphenation here. (We -% can't do that in the \entry macro, since index entries might consist -% of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.) -\def\tocentry#1#2{\begingroup - \vskip 0pt plus1pt % allow a little stretch for the sake of nice page breaks - % Do not use \turnoffactive in these arguments. Since the toc is - % typeset in cmr, characters such as _ would come out wrong; we - % have to do the usual translation tricks. - \entry{#1}{#2}% -\endgroup} - -% Space between chapter (or whatever) number and the title. -\def\labelspace{\hskip1em \relax} - -\def\dopageno#1{{\rm #1}} -\def\doshortpageno#1{{\rm #1}} - -\def\chapentryfonts{\secfonts \rm} -\def\secentryfonts{\textfonts} -\let\subsecentryfonts = \textfonts -\let\subsubsecentryfonts = \textfonts - - -\message{environments,} -% @foo ... @end foo. - -% @point{}, @result{}, @expansion{}, @print{}, @equiv{}. -% -% Since these characters are used in examples, it should be an even number of -% \tt widths. Each \tt character is 1en, so two makes it 1em. -% -\def\point{$\star$} -\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} -\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}} -\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} -\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}} - -% The @error{} command. -% Adapted from the TeXbook's \boxit. -% -\newbox\errorbox -% -{\tentt \global\dimen0 = 3em}% Width of the box. -\dimen2 = .55pt % Thickness of rules -% The text. (`r' is open on the right, `e' somewhat less so on the left.) -\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt} -% -\global\setbox\errorbox=\hbox to \dimen0{\hfil - \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. - \advance\hsize by -2\dimen2 % Rules. - \vbox{ - \hrule height\dimen2 - \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. - \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. - \kern3pt\vrule width\dimen2}% Space to right. - \hrule height\dimen2} - \hfil} -% -\def\error{\leavevmode\lower.7ex\copy\errorbox} - -% @tex ... @end tex escapes into raw Tex temporarily. -% One exception: @ is still an escape character, so that @end tex works. -% But \@ or @@ will get a plain tex @ character. - -\def\tex{\begingroup - \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 - \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 - \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie - \catcode `\%=14 - \catcode `\+=\other - \catcode `\"=\other - \catcode `\==\other - \catcode `\|=\other - \catcode `\<=\other - \catcode `\>=\other - \escapechar=`\\ - % - \let\b=\ptexb - \let\bullet=\ptexbullet - \let\c=\ptexc - \let\,=\ptexcomma - \let\.=\ptexdot - \let\dots=\ptexdots - \let\equiv=\ptexequiv - \let\!=\ptexexclam - \let\i=\ptexi - \let\{=\ptexlbrace - \let\+=\tabalign - \let\}=\ptexrbrace - \let\*=\ptexstar - \let\t=\ptext - % - \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% - \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% - \def\@{@}% -\let\Etex=\endgroup} - -% Define @lisp ... @end lisp. -% @lisp does a \begingroup so it can rebind things, -% including the definition of @end lisp (which normally is erroneous). - -% Amount to narrow the margins by for @lisp. -\newskip\lispnarrowing \lispnarrowing=0.4in - -% This is the definition that ^^M gets inside @lisp, @example, and other -% such environments. \null is better than a space, since it doesn't -% have any width. -\def\lisppar{\null\endgraf} - -% Make each space character in the input produce a normal interword -% space in the output. Don't allow a line break at this space, as this -% is used only in environments like @example, where each line of input -% should produce a line of output anyway. -% -{\obeyspaces % -\gdef\sepspaces{\obeyspaces\let =\tie}} - -% Define \obeyedspace to be our active space, whatever it is. This is -% for use in \parsearg. -{\sepspaces% -\global\let\obeyedspace= } - -% This space is always present above and below environments. -\newskip\envskipamount \envskipamount = 0pt - -% Make spacing and below environment symmetrical. We use \parskip here -% to help in doing that, since in @example-like environments \parskip -% is reset to zero; thus the \afterenvbreak inserts no space -- but the -% start of the next paragraph will insert \parskip. -% -\def\aboveenvbreak{{% - % =10000 instead of <10000 because of a special case in \itemzzz, q.v. - \ifnum \lastpenalty=10000 \else - \advance\envskipamount by \parskip - \endgraf - \ifdim\lastskip<\envskipamount - \removelastskip - % it's not a good place to break if the last penalty was \nobreak - % or better ... - \ifnum\lastpenalty>10000 \else \penalty-50 \fi - \vskip\envskipamount - \fi - \fi -}} - -\let\afterenvbreak = \aboveenvbreak - -% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins. -\let\nonarrowing=\relax - -% @cartouche ... @end cartouche: draw rectangle w/rounded corners around -% environment contents. -\font\circle=lcircle10 -\newdimen\circthick -\newdimen\cartouter\newdimen\cartinner -\newskip\normbskip\newskip\normpskip\newskip\normlskip -\circthick=\fontdimen8\circle -% -\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth -\def\ctr{{\hskip 6pt\circle\char'010}} -\def\cbl{{\circle\char'012\hskip -6pt}} -\def\cbr{{\hskip 6pt\circle\char'011}} -\def\carttop{\hbox to \cartouter{\hskip\lskip - \ctl\leaders\hrule height\circthick\hfil\ctr - \hskip\rskip}} -\def\cartbot{\hbox to \cartouter{\hskip\lskip - \cbl\leaders\hrule height\circthick\hfil\cbr - \hskip\rskip}} -% -\newskip\lskip\newskip\rskip - -\def\cartouche{% -\par % can't be in the midst of a paragraph. -\begingroup - \lskip=\leftskip \rskip=\rightskip - \leftskip=0pt\rightskip=0pt %we want these *outside*. - \cartinner=\hsize \advance\cartinner by-\lskip - \advance\cartinner by-\rskip - \cartouter=\hsize - \advance\cartouter by 18.4pt % allow for 3pt kerns on either -% side, and for 6pt waste from -% each corner char, and rule thickness - \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip - % Flag to tell @lisp, etc., not to narrow margin. - \let\nonarrowing=\comment - \vbox\bgroup - \baselineskip=0pt\parskip=0pt\lineskip=0pt - \carttop - \hbox\bgroup - \hskip\lskip - \vrule\kern3pt - \vbox\bgroup - \hsize=\cartinner - \kern3pt - \begingroup - \baselineskip=\normbskip - \lineskip=\normlskip - \parskip=\normpskip - \vskip -\parskip -\def\Ecartouche{% - \endgroup - \kern3pt - \egroup - \kern3pt\vrule - \hskip\rskip - \egroup - \cartbot - \egroup -\endgroup -}} - - -% This macro is called at the beginning of all the @example variants, -% inside a group. -\def\nonfillstart{% - \aboveenvbreak - \inENV % This group ends at the end of the body - \hfuzz = 12pt % Don't be fussy - \sepspaces % Make spaces be word-separators rather than space tokens. - \let\par = \lisppar % don't ignore blank lines - \obeylines % each line of input is a line of output - \parskip = 0pt - \parindent = 0pt - \emergencystretch = 0pt % don't try to avoid overfull boxes - % @cartouche defines \nonarrowing to inhibit narrowing - % at next level down. - \ifx\nonarrowing\relax - \advance \leftskip by \lispnarrowing - \exdentamount=\lispnarrowing - \let\exdent=\nofillexdent - \let\nonarrowing=\relax - \fi -} - -% Define the \E... control sequence only if we are inside the particular -% environment, so the error checking in \end will work. -% -% To end an @example-like environment, we first end the paragraph (via -% \afterenvbreak's vertical glue), and then the group. That way we keep -% the zero \parskip that the environments set -- \parskip glue will be -% inserted at the beginning of the next paragraph in the document, after -% the environment. -% -\def\nonfillfinish{\afterenvbreak\endgroup} - -% @lisp: indented, narrowed, typewriter font. -\def\lisp{\begingroup - \nonfillstart - \let\Elisp = \nonfillfinish - \tt - \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. - \gobble % eat return -} - -% @example: Same as @lisp. -\def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp} - -% @smallexample and @smalllisp: use smaller fonts. -% Originally contributed by Pavel@xerox. -\def\smalllisp{\begingroup - \def\Esmalllisp{\nonfillfinish\endgroup}% - \def\Esmallexample{\nonfillfinish\endgroup}% - \smallexamplefonts - \lisp -} -\let\smallexample = \smalllisp - - -% @display: same as @lisp except keep current font. -% -\def\display{\begingroup - \nonfillstart - \let\Edisplay = \nonfillfinish - \gobble -} -% -% @smalldisplay: @display plus smaller fonts. -% -\def\smalldisplay{\begingroup - \def\Esmalldisplay{\nonfillfinish\endgroup}% - \smallexamplefonts \rm - \display -} - -% @format: same as @display except don't narrow margins. -% -\def\format{\begingroup - \let\nonarrowing = t - \nonfillstart - \let\Eformat = \nonfillfinish - \gobble -} -% -% @smallformat: @format plus smaller fonts. -% -\def\smallformat{\begingroup - \def\Esmallformat{\nonfillfinish\endgroup}% - \smallexamplefonts \rm - \format -} - -% @flushleft (same as @format). -% -\def\flushleft{\begingroup \def\Eflushleft{\nonfillfinish\endgroup}\format} - -% @flushright. -% -\def\flushright{\begingroup - \let\nonarrowing = t - \nonfillstart - \let\Eflushright = \nonfillfinish - \advance\leftskip by 0pt plus 1fill - \gobble -} - - -% @quotation does normal linebreaking (hence we can't use \nonfillstart) -% and narrows the margins. -% -\def\quotation{% - \begingroup\inENV %This group ends at the end of the @quotation body - {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip - \parindent=0pt - % We have retained a nonzero parskip for the environment, since we're - % doing normal filling. So to avoid extra space below the environment... - \def\Equotation{\parskip = 0pt \nonfillfinish}% - % - % @cartouche defines \nonarrowing to inhibit narrowing at next level down. - \ifx\nonarrowing\relax - \advance\leftskip by \lispnarrowing - \advance\rightskip by \lispnarrowing - \exdentamount = \lispnarrowing - \let\nonarrowing = \relax - \fi -} - - -% LaTeX-like @verbatim...@end verbatim and @verb{...} -% If we want to allow any as delimiter, -% we need the curly braces so that makeinfo sees the @verb command, eg: -% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org -% -% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. -% -% [Knuth] p.344; only we need to do the other characters Texinfo sets -% active too. Otherwise, they get lost as the first character on a -% verbatim line. -\def\dospecials{% - \do\ \do\\\do\{\do\}\do\$\do\&% - \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% - \do\<\do\>\do\|\do\@\do+\do\"% -} -% -% [Knuth] p. 380 -\def\uncatcodespecials{% - \def\do##1{\catcode`##1=12}\dospecials} -% -% [Knuth] pp. 380,381,391 -% Disable Spanish ligatures ?` and !` of \tt font -\begingroup - \catcode`\`=\active\gdef`{\relax\lq} -\endgroup -% -% Setup for the @verb command. -% -% Eight spaces for a tab -\begingroup - \catcode`\^^I=\active - \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} -\endgroup -% -\def\setupverb{% - \tt % easiest (and conventionally used) font for verbatim - \def\par{\leavevmode\endgraf}% - \catcode`\`=\active - \tabeightspaces - % Respect line breaks, - % print special symbols as themselves, and - % make each space count - % must do in this order: - \obeylines \uncatcodespecials \sepspaces -} - -% Setup for the @verbatim environment -% -% Real tab expansion -\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount -% -\def\starttabbox{\setbox0=\hbox\bgroup} -\begingroup - \catcode`\^^I=\active - \gdef\tabexpand{% - \catcode`\^^I=\active - \def^^I{\leavevmode\egroup - \dimen0=\wd0 % the width so far, or since the previous tab - \divide\dimen0 by\tabw - \multiply\dimen0 by\tabw % compute previous multiple of \tabw - \advance\dimen0 by\tabw % advance to next multiple of \tabw - \wd0=\dimen0 \box0 \starttabbox - }% - } -\endgroup -\def\setupverbatim{% - % Easiest (and conventionally used) font for verbatim - \tt - \def\par{\leavevmode\egroup\box0\endgraf}% - \catcode`\`=\active - \tabexpand - % Respect line breaks, - % print special symbols as themselves, and - % make each space count - % must do in this order: - \obeylines \uncatcodespecials \sepspaces - \everypar{\starttabbox}% -} - -% Do the @verb magic: verbatim text is quoted by unique -% delimiter characters. Before first delimiter expect a -% right brace, after last delimiter expect closing brace: -% -% \def\doverb'{'#1'}'{#1} -% -% [Knuth] p. 382; only eat outer {} -\begingroup - \catcode`[=1\catcode`]=2\catcode`\{=12\catcode`\}=12 - \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] -\endgroup -% -\def\verb{\begingroup\setupverb\doverb} -% -% -% Do the @verbatim magic: define the macro \doverbatim so that -% the (first) argument ends when '@end verbatim' is reached, ie: -% -% \def\doverbatim#1@end verbatim{#1} -% -% For Texinfo it's a lot easier than for LaTeX, -% because texinfo's \verbatim doesn't stop at '\end{verbatim}': -% we need not redefine '\', '{' and '}'. -% -% Inspired by LaTeX's verbatim command set [latex.ltx] -%% Include LaTeX hack for completeness -- never know -%% \begingroup -%% \catcode`|=0 \catcode`[=1 -%% \catcode`]=2\catcode`\{=12\catcode`\}=12\catcode`\ =\active -%% \catcode`\\=12|gdef|doverbatim#1@end verbatim[ -%% #1|endgroup|def|Everbatim[]|end[verbatim]] -%% |endgroup -% -\begingroup - \catcode`\ =\active - \obeylines % - % ignore everything up to the first ^^M, that's the newline at the end - % of the @verbatim input line itself. Otherwise we get an extra blank - % line in the output. - \gdef\doverbatim#1^^M#2@end verbatim{#2\end{verbatim}}% -\endgroup -% -\def\verbatim{% - \def\Everbatim{\nonfillfinish\endgroup}% - \begingroup - \nonfillstart - \advance\leftskip by -\defbodyindent - \begingroup\setupverbatim\doverbatim -} - -% @verbatiminclude FILE - insert text of file in verbatim environment. -% -% Allow normal characters that we make active in the argument (a file name). -\def\verbatiminclude{% - \begingroup - \catcode`\\=\other - \catcode`~=\other - \catcode`^=\other - \catcode`_=\other - \catcode`|=\other - \catcode`<=\other - \catcode`>=\other - \catcode`+=\other - \parsearg\doverbatiminclude -} -\def\setupverbatiminclude{% - \begingroup - \nonfillstart - \advance\leftskip by -\defbodyindent - \begingroup\setupverbatim -} -% -\def\doverbatiminclude#1{% - % Restore active chars for included file. - \endgroup - \begingroup - \let\value=\expandablevalue - \def\thisfile{#1}% - \expandafter\expandafter\setupverbatiminclude\input\thisfile - \endgroup - \nonfillfinish - \endgroup -} - -% @copying ... @end copying. -% Save the text away for @insertcopying later. Many commands won't be -% allowed in this context, but that's ok. -% -% We save the uninterpreted tokens, rather than creating a box. -% Saving the text in a box would be much easier, but then all the -% typesetting commands (@smallbook, font changes, etc.) have to be done -% beforehand -- and a) we want @copying to be done first in the source -% file; b) letting users define the frontmatter in as flexible order as -% possible is very desirable. -% -\def\copying{\begingroup - % Define a command to swallow text until we reach `@end copying'. - % \ is the escape char in this texinfo.tex file, so it is the - % delimiter for the command; @ will be the escape char when we read - % it, but that doesn't matter. - \long\def\docopying##1\end copying{\gdef\copyingtext{##1}\enddocopying}% - % - % We must preserve ^^M's in the input file; see \insertcopying below. - \catcode`\^^M = \active - \docopying -} - -% What we do to finish off the copying text. -% -\def\enddocopying{\endgroup\ignorespaces} - -% @insertcopying. Here we must play games with ^^M's. On the one hand, -% we need them to delimit commands such as `@end quotation', so they -% must be active. On the other hand, we certainly don't want every -% end-of-line to be a \par, as would happen with the normal active -% definition of ^^M. On the third hand, two ^^M's in a row should still -% generate a \par. -% -% Our approach is to make ^^M insert a space and a penalty1 normally; -% then it can also check if \lastpenalty=1. If it does, then manually -% do \par. -% -% This messes up the normal definitions of @c[omment], so we redefine -% it. Similarly for @ignore. (These commands are used in the gcc -% manual for man page generation.) -% -% Seems pretty fragile, most line-oriented commands will presumably -% fail, but for the limited use of getting the copying text (which -% should be quite simple) inserted, we can hope it's ok. -% -{\catcode`\^^M=\active % -\gdef\insertcopying{\begingroup % - \parindent = 0pt % looks wrong on title page - \def^^M{% - \ifnum \lastpenalty=1 % - \par % - \else % - \space \penalty 1 % - \fi % - }% - % - % Fix @c[omment] for catcode 13 ^^M's. - \def\c##1^^M{\ignorespaces}% - \let\comment = \c % - % - % Don't bother jumping through all the hoops that \doignore does, it - % would be very hard since the catcodes are already set. - \long\def\ignore##1\end ignore{\ignorespaces}% - % - \copyingtext % -\endgroup}% -} - -\message{defuns,} -% @defun etc. - -% Allow user to change definition object font (\df) internally -\def\setdeffont#1 {\csname DEF#1\endcsname} - -\newskip\defbodyindent \defbodyindent=.4in -\newskip\defargsindent \defargsindent=50pt -\newskip\deflastargmargin \deflastargmargin=18pt - -\newcount\parencount - -% We want ()&[] to print specially on the defun line. -% -\def\activeparens{% - \catcode`\(=\active \catcode`\)=\active - \catcode`\&=\active - \catcode`\[=\active \catcode`\]=\active -} - -% Make control sequences which act like normal parenthesis chars. -\let\lparen = ( \let\rparen = ) - -{\activeparens % Now, smart parens don't turn on until &foo (see \amprm) - -% Be sure that we always have a definition for `(', etc. For example, -% if the fn name has parens in it, \boldbrax will not be in effect yet, -% so TeX would otherwise complain about undefined control sequence. -\global\let(=\lparen \global\let)=\rparen -\global\let[=\lbrack \global\let]=\rbrack - -\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 } -\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} -% This is used to turn on special parens -% but make & act ordinary (given that it's active). -\gdef\boldbraxnoamp{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb\let&=\ampnr} - -% Definitions of (, ) and & used in args for functions. -% This is the definition of ( outside of all parentheses. -\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested - \global\advance\parencount by 1 -} -% -% This is the definition of ( when already inside a level of parens. -\gdef\opnested{\char`\(\global\advance\parencount by 1 } -% -\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0. - % also in that case restore the outer-level definition of (. - \ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi - \global\advance \parencount by -1 } -% If we encounter &foo, then turn on ()-hacking afterwards -\gdef\amprm#1 {{\rm\}\let(=\oprm \let)=\clrm\ } -% -\gdef\normalparens{\boldbrax\let&=\ampnr} -} % End of definition inside \activeparens -%% These parens (in \boldbrax) actually are a little bolder than the -%% contained text. This is especially needed for [ and ] -\def\opnr{{\sf\char`\(}\global\advance\parencount by 1 } -\def\clnr{{\sf\char`\)}\global\advance\parencount by -1 } -\let\ampnr = \& -\def\lbrb{{\bf\char`\[}} -\def\rbrb{{\bf\char`\]}} - -% Active &'s sneak into the index arguments, so make sure it's defined. -{ - \catcode`& = \active - \global\let& = \ampnr -} - -% \defname, which formats the name of the @def (not the args). -% #1 is the function name. -% #2 is the type of definition, such as "Function". -% -\def\defname#1#2{% - % How we'll output the type name. Putting it in brackets helps - % distinguish it from the body text that may end up on the next line - % just below it. - \ifempty{#2}% - \def\defnametype{}% - \else - \def\defnametype{[\rm #2]}% - \fi - % - % Get the values of \leftskip and \rightskip as they were outside the @def... - \dimen2=\leftskip - \advance\dimen2 by -\defbodyindent - % - % Figure out values for the paragraph shape. - \setbox0=\hbox{\hskip \deflastargmargin{\defnametype}}% - \dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line - \dimen1=\hsize \advance \dimen1 by -\defargsindent % size for continuations - \parshape 2 0in \dimen0 \defargsindent \dimen1 - % - % Output arg 2 ("Function" or some such) but stuck inside a box of - % width 0 so it does not interfere with linebreaking. - \noindent - % - {% Adjust \hsize to exclude the ambient margins, - % so that \rightline will obey them. - \advance \hsize by -\dimen2 - \dimen3 = 0pt % was -1.25pc - \rlap{\rightline{\defnametype\kern\dimen3}}% - }% - % - % Allow all lines to be underfull without complaint: - \tolerance=10000 \hbadness=10000 - \advance\leftskip by -\defbodyindent - \exdentamount=\defbodyindent - {\df #1}\enskip % output function name - % \defunargs will be called next to output the arguments, if any. -} - -% Common pieces to start any @def... -% #1 is the \E... control sequence to end the definition (which we define). -% #2 is the \...x control sequence (which our caller defines). -% #3 is the control sequence to process the header, such as \defunheader. -% -\def\parsebodycommon#1#2#3{% - \begingroup\inENV - % If there are two @def commands in a row, we'll have a \nobreak, - % which is there to keep the function description together with its - % header. But if there's nothing but headers, we want to allow a - % break after all. Check for penalty 10002 (inserted by - % \defargscommonending) instead of 10000, since the sectioning - % commands insert a \penalty10000, and we don't want to allow a break - % between a section heading and a defun. - \ifnum\lastpenalty=10002 \penalty0 \fi - \medbreak - % - % Define the \E... end token that this defining construct specifies - % so that it will exit this group. - \def#1{\endgraf\endgroup\medbreak}% - % - \parindent=0in - \advance\leftskip by \defbodyindent - \exdentamount=\defbodyindent -} - -% Common part of the \...x definitions. -% -\def\defxbodycommon{% - % As with \parsebodycommon above, allow line break if we have multiple - % x headers in a row. It's not a great place, though. - \ifnum\lastpenalty=10000 \penalty1000 \fi - % - \begingroup\obeylines -} - -% Process body of @defun, @deffn, @defmac, etc. -% -\def\defparsebody#1#2#3{% - \parsebodycommon{#1}{#2}{#3}% - \def#2{\defxbodycommon \activeparens \spacesplit#3}% - \catcode\equalChar=\active - \begingroup\obeylines\activeparens - \spacesplit#3% -} - -% #1, #2, #3 are the common arguments (see \parsebodycommon above). -% #4, delimited by the space, is the class name. -% -\def\defmethparsebody#1#2#3#4 {% - \parsebodycommon{#1}{#2}{#3}% - \def#2##1 {\defxbodycommon \activeparens \spacesplit{#3{##1}}}% - \begingroup\obeylines\activeparens - % The \empty here prevents misinterpretation of a construct such as - % @deffn {whatever} {Enharmonic comma} - % See comments at \deftpparsebody, although in our case we don't have - % to remove the \empty afterwards, since it is empty. - \spacesplit{#3{#4}}\empty -} - -% Used for @deftypemethod and @deftypeivar. -% #1, #2, #3 are the common arguments (see \defparsebody). -% #4, delimited by a space, is the class name. -% #5 is the method's return type. -% -\def\deftypemethparsebody#1#2#3#4 #5 {% - \parsebodycommon{#1}{#2}{#3}% - \def#2##1 ##2 {\defxbodycommon \activeparens \spacesplit{#3{##1}{##2}}}% - \begingroup\obeylines\activeparens - \spacesplit{#3{#4}{#5}}% -} - -% Used for @deftypeop. The change from \deftypemethparsebody is an -% extra argument at the beginning which is the `category', instead of it -% being the hardwired string `Method' or `Instance Variable'. We have -% to account for this both in the \...x definition and in parsing the -% input at hand. Thus also need a control sequence (passed as #5) for -% the \E... definition to assign the category name to. -% -\def\deftypeopparsebody#1#2#3#4#5 #6 {% - \parsebodycommon{#1}{#2}{#3}% - \def#2##1 ##2 ##3 {\def#4{##1}% - \defxbodycommon \activeparens \spacesplit{#3{##2}{##3}}}% - \begingroup\obeylines\activeparens - \spacesplit{#3{#5}{#6}}% -} - -% For @defop. -\def\defopparsebody #1#2#3#4#5 {% - \parsebodycommon{#1}{#2}{#3}% - \def#2##1 ##2 {\def#4{##1}% - \defxbodycommon \activeparens \spacesplit{#3{##2}}}% - \begingroup\obeylines\activeparens - \spacesplit{#3{#5}}% -} - -% These parsing functions are similar to the preceding ones -% except that they do not make parens into active characters. -% These are used for "variables" since they have no arguments. -% -\def\defvarparsebody #1#2#3{% - \parsebodycommon{#1}{#2}{#3}% - \def#2{\defxbodycommon \spacesplit#3}% - \catcode\equalChar=\active - \begingroup\obeylines - \spacesplit#3% -} - -% @defopvar. -\def\defopvarparsebody #1#2#3#4#5 {% - \parsebodycommon{#1}{#2}{#3}% - \def#2##1 ##2 {\def#4{##1}% - \defxbodycommon \spacesplit{#3{##2}}}% - \begingroup\obeylines - \spacesplit{#3{#5}}% -} - -\def\defvrparsebody#1#2#3#4 {% - \parsebodycommon{#1}{#2}{#3}% - \def#2##1 {\defxbodycommon \spacesplit{#3{##1}}}% - \begingroup\obeylines - \spacesplit{#3{#4}}% -} - -% This loses on `@deftp {Data Type} {struct termios}' -- it thinks the -% type is just `struct', because we lose the braces in `{struct -% termios}' when \spacesplit reads its undelimited argument. Sigh. -% \let\deftpparsebody=\defvrparsebody -% -% So, to get around this, we put \empty in with the type name. That -% way, TeX won't find exactly `{...}' as an undelimited argument, and -% won't strip off the braces. -% -\def\deftpparsebody #1#2#3#4 {% - \parsebodycommon{#1}{#2}{#3}% - \def#2##1 {\defxbodycommon \spacesplit{#3{##1}}}% - \begingroup\obeylines - \spacesplit{\parsetpheaderline{#3{#4}}}\empty -} - -% Fine, but then we have to eventually remove the \empty *and* the -% braces (if any). That's what this does. -% -\def\removeemptybraces\empty#1\relax{#1} - -% After \spacesplit has done its work, this is called -- #1 is the final -% thing to call, #2 the type name (which starts with \empty), and #3 -% (which might be empty) the arguments. -% -\def\parsetpheaderline#1#2#3{% - #1{\removeemptybraces#2\relax}{#3}% -}% - -% Split up #2 (the rest of the input line) at the first space token. -% call #1 with two arguments: -% the first is all of #2 before the space token, -% the second is all of #2 after that space token. -% If #2 contains no space token, all of it is passed as the first arg -% and the second is passed as empty. -% -{\obeylines % - \gdef\spacesplit#1#2^^M{\endgroup\spacesplitx{#1}#2 \relax\spacesplitx}% - \long\gdef\spacesplitx#1#2 #3#4\spacesplitx{% - \ifx\relax #3% - #1{#2}{}% - \else % - #1{#2}{#3#4}% - \fi}% -} - -% Define @defun. - -% This is called to end the arguments processing for all the @def... commands. -% -\def\defargscommonending{% - \interlinepenalty = 10000 - \advance\rightskip by 0pt plus 1fil - \endgraf - \nobreak\vskip -\parskip - \penalty 10002 % signal to \parsebodycommon. -} - -% This expands the args and terminates the paragraph they comprise. -% -\def\defunargs#1{\functionparens \sl -% Expand, preventing hyphenation at `-' chars. -% Note that groups don't affect changes in \hyphenchar. -% Set the font temporarily and use \font in case \setfont made \tensl a macro. -{\tensl\hyphenchar\font=0}% -#1% -{\tensl\hyphenchar\font=45}% -\ifnum\parencount=0 \else \errmessage{Unbalanced parentheses in @def}\fi% - \defargscommonending -} - -\def\deftypefunargs #1{% -% Expand, preventing hyphenation at `-' chars. -% Note that groups don't affect changes in \hyphenchar. -% Use \boldbraxnoamp, not \functionparens, so that & is not special. -\boldbraxnoamp -\tclose{#1}% avoid \code because of side effects on active chars - \defargscommonending -} - -% Do complete processing of one @defun or @defunx line already parsed. - -% @deffn Command forward-char nchars - -\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader} - -\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}% -\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup % -\catcode\equalChar=\other % Turn off change made in \defparsebody -} - -% @defun == @deffn Function - -\def\defun{\defparsebody\Edefun\defunx\defunheader} - -\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index -\begingroup\defname {#1}{\putwordDeffunc}% -\defunargs {#2}\endgroup % -\catcode\equalChar=\other % Turn off change made in \defparsebody -} - -% @deftypefun int foobar (int @var{foo}, float @var{bar}) - -\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader} - -% #1 is the data type. #2 is the name and args. -\def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax} -% #1 is the data type, #2 the name, #3 the args. -\def\deftypefunheaderx #1#2 #3\relax{% -\doind {fn}{\code{#2}}% Make entry in function index -\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypefun}% -\deftypefunargs {#3}\endgroup % -\catcode\equalChar=\other % Turn off change made in \defparsebody -} - -% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar}) - -\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader} - -% \defheaderxcond#1\relax$.$ -% puts #1 in @code, followed by a space, but does nothing if #1 is null. -\def\defheaderxcond#1#2$.${\ifx#1\relax\else\code{#1#2} \fi} - -% #1 is the classification. #2 is the data type. #3 is the name and args. -\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax} -% #1 is the classification, #2 the data type, #3 the name, #4 the args. -\def\deftypefnheaderx #1#2#3 #4\relax{% -\doind {fn}{\code{#3}}% Make entry in function index -\begingroup -\normalparens % notably, turn off `&' magic, which prevents -% at least some C++ text from working -\defname {\defheaderxcond#2\relax$.$#3}{#1}% -\deftypefunargs {#4}\endgroup % -\catcode\equalChar=\other % Turn off change made in \defparsebody -} - -% @defmac == @deffn Macro - -\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader} - -\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index -\begingroup\defname {#1}{\putwordDefmac}% -\defunargs {#2}\endgroup % -\catcode\equalChar=\other % Turn off change made in \defparsebody -} - -% @defspec == @deffn Special Form - -\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader} - -\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index -\begingroup\defname {#1}{\putwordDefspec}% -\defunargs {#2}\endgroup % -\catcode\equalChar=\other % Turn off change made in \defparsebody -} - -% @defop CATEGORY CLASS OPERATION ARG... -% -\def\defop #1 {\def\defoptype{#1}% -\defopparsebody\Edefop\defopx\defopheader\defoptype} -% -\def\defopheader#1#2#3{% - \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% function index entry - \begingroup - \defname{#2}{\defoptype\ \putwordon\ #1}% - \defunargs{#3}% - \endgroup -} - -% @deftypeop CATEGORY CLASS TYPE OPERATION ARG... -% -\def\deftypeop #1 {\def\deftypeopcategory{#1}% - \deftypeopparsebody\Edeftypeop\deftypeopx\deftypeopheader - \deftypeopcategory} -% -% #1 is the class name, #2 the data type, #3 the operation name, #4 the args. -\def\deftypeopheader#1#2#3#4{% - \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index - \begingroup - \defname{\defheaderxcond#2\relax$.$#3} - {\deftypeopcategory\ \putwordon\ \code{#1}}% - \deftypefunargs{#4}% - \endgroup -} - -% @deftypemethod CLASS TYPE METHOD ARG... -% -\def\deftypemethod{% - \deftypemethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader} -% -% #1 is the class name, #2 the data type, #3 the method name, #4 the args. -\def\deftypemethodheader#1#2#3#4{% - \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index - \begingroup - \defname{\defheaderxcond#2\relax$.$#3}{\putwordMethodon\ \code{#1}}% - \deftypefunargs{#4}% - \endgroup -} - -% @deftypeivar CLASS TYPE VARNAME -% -\def\deftypeivar{% - \deftypemethparsebody\Edeftypeivar\deftypeivarx\deftypeivarheader} -% -% #1 is the class name, #2 the data type, #3 the variable name. -\def\deftypeivarheader#1#2#3{% - \dosubind{vr}{\code{#3}}{\putwordof\ \code{#1}}% entry in variable index - \begingroup - \defname{\defheaderxcond#2\relax$.$#3} - {\putwordInstanceVariableof\ \code{#1}}% - \defvarargs{#3}% - \endgroup -} - -% @defmethod == @defop Method -% -\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader} -% -% #1 is the class name, #2 the method name, #3 the args. -\def\defmethodheader#1#2#3{% - \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% entry in function index - \begingroup - \defname{#2}{\putwordMethodon\ \code{#1}}% - \defunargs{#3}% - \endgroup -} - -% @defcv {Class Option} foo-class foo-flag - -\def\defcv #1 {\def\defcvtype{#1}% -\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype} - -\def\defcvarheader #1#2#3{% - \dosubind{vr}{\code{#2}}{\putwordof\ \code{#1}}% variable index entry - \begingroup - \defname{#2}{\defcvtype\ \putwordof\ #1}% - \defvarargs{#3}% - \endgroup -} - -% @defivar CLASS VARNAME == @defcv {Instance Variable} CLASS VARNAME -% -\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader} -% -\def\defivarheader#1#2#3{% - \dosubind{vr}{\code{#2}}{\putwordof\ \code{#1}}% entry in var index - \begingroup - \defname{#2}{\putwordInstanceVariableof\ #1}% - \defvarargs{#3}% - \endgroup -} - -% @defvar -% First, define the processing that is wanted for arguments of @defvar. -% This is actually simple: just print them in roman. -% This must expand the args and terminate the paragraph they make up -\def\defvarargs #1{\normalparens #1% - \defargscommonending -} - -% @defvr Counter foo-count - -\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader} - -\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}% -\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup} - -% @defvar == @defvr Variable - -\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader} - -\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index -\begingroup\defname {#1}{\putwordDefvar}% -\defvarargs {#2}\endgroup % -} - -% @defopt == @defvr {User Option} - -\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader} - -\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index -\begingroup\defname {#1}{\putwordDefopt}% -\defvarargs {#2}\endgroup % -} - -% @deftypevar int foobar - -\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader} - -% #1 is the data type. #2 is the name, perhaps followed by text that -% is actually part of the data type, which should not be put into the index. -\def\deftypevarheader #1#2{% -\dovarind#2 \relax% Make entry in variables index -\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypevar}% - \defargscommonending -\endgroup} -\def\dovarind#1 #2\relax{\doind{vr}{\code{#1}}} - -% @deftypevr {Global Flag} int enable - -\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader} - -\def\deftypevrheader #1#2#3{\dovarind#3 \relax% -\begingroup\defname {\defheaderxcond#2\relax$.$#3}{#1} - \defargscommonending -\endgroup} - -% Now define @deftp -% Args are printed in bold, a slight difference from @defvar. - -\def\deftpargs #1{\bf \defvarargs{#1}} - -% @deftp Class window height width ... - -\def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader} - -\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}% -\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup} - -% These definitions are used if you use @defunx (etc.) -% anywhere other than immediately after a @defun or @defunx. -% -\def\defcvx#1 {\errmessage{@defcvx in invalid context}} -\def\deffnx#1 {\errmessage{@deffnx in invalid context}} -\def\defivarx#1 {\errmessage{@defivarx in invalid context}} -\def\defmacx#1 {\errmessage{@defmacx in invalid context}} -\def\defmethodx#1 {\errmessage{@defmethodx in invalid context}} -\def\defoptx #1 {\errmessage{@defoptx in invalid context}} -\def\defopx#1 {\errmessage{@defopx in invalid context}} -\def\defspecx#1 {\errmessage{@defspecx in invalid context}} -\def\deftpx#1 {\errmessage{@deftpx in invalid context}} -\def\deftypefnx#1 {\errmessage{@deftypefnx in invalid context}} -\def\deftypefunx#1 {\errmessage{@deftypefunx in invalid context}} -\def\deftypeivarx#1 {\errmessage{@deftypeivarx in invalid context}} -\def\deftypemethodx#1 {\errmessage{@deftypemethodx in invalid context}} -\def\deftypeopx#1 {\errmessage{@deftypeopx in invalid context}} -\def\deftypevarx#1 {\errmessage{@deftypevarx in invalid context}} -\def\deftypevrx#1 {\errmessage{@deftypevrx in invalid context}} -\def\defunx#1 {\errmessage{@defunx in invalid context}} -\def\defvarx#1 {\errmessage{@defvarx in invalid context}} -\def\defvrx#1 {\errmessage{@defvrx in invalid context}} - - -\message{macros,} -% @macro. - -% To do this right we need a feature of e-TeX, \scantokens, -% which we arrange to emulate with a temporary file in ordinary TeX. -\ifx\eTeXversion\undefined - \newwrite\macscribble - \def\scanmacro#1{% - \begingroup \newlinechar`\^^M - % Undo catcode changes of \startcontents and \doprintindex - \catcode`\@=0 \catcode`\\=\other \escapechar=`\@ - % Append \endinput to make sure that TeX does not see the ending newline. - \toks0={#1\endinput}% - \immediate\openout\macscribble=\jobname.tmp - \immediate\write\macscribble{\the\toks0}% - \immediate\closeout\macscribble - \let\xeatspaces\eatspaces - \input \jobname.tmp - \endgroup -} -\else -\def\scanmacro#1{% -\begingroup \newlinechar`\^^M -% Undo catcode changes of \startcontents and \doprintindex -\catcode`\@=0 \catcode`\\=\other \escapechar=`\@ -\let\xeatspaces\eatspaces\scantokens{#1\endinput}\endgroup} -\fi - -\newcount\paramno % Count of parameters -\newtoks\macname % Macro name -\newif\ifrecursive % Is it recursive? -\def\macrolist{} % List of all defined macros in the form - % \do\macro1\do\macro2... - -% Utility routines. -% Thisdoes \let #1 = #2, except with \csnames. -\def\cslet#1#2{% -\expandafter\expandafter -\expandafter\let -\expandafter\expandafter -\csname#1\endcsname -\csname#2\endcsname} - -% Trim leading and trailing spaces off a string. -% Concepts from aro-bend problem 15 (see CTAN). -{\catcode`\@=11 -\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} -\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} -\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} -\def\unbrace#1{#1} -\unbrace{\gdef\trim@@@ #1 } #2@{#1} -} - -% Trim a single trailing ^^M off a string. -{\catcode`\^^M=\other \catcode`\Q=3% -\gdef\eatcr #1{\eatcra #1Q^^MQ}% -\gdef\eatcra#1^^MQ{\eatcrb#1Q}% -\gdef\eatcrb#1Q#2Q{#1}% -} - -% Macro bodies are absorbed as an argument in a context where -% all characters are catcode 10, 11 or 12, except \ which is active -% (as in normal texinfo). It is necessary to change the definition of \. - -% It's necessary to have hard CRs when the macro is executed. This is -% done by making ^^M (\endlinechar) catcode 12 when reading the macro -% body, and then making it the \newlinechar in \scanmacro. - -\def\macrobodyctxt{% - \catcode`\~=\other - \catcode`\^=\other - \catcode`\_=\other - \catcode`\|=\other - \catcode`\<=\other - \catcode`\>=\other - \catcode`\+=\other - \catcode`\{=\other - \catcode`\}=\other - \catcode`\@=\other - \catcode`\^^M=\other - \usembodybackslash} - -\def\macroargctxt{% - \catcode`\~=\other - \catcode`\^=\other - \catcode`\_=\other - \catcode`\|=\other - \catcode`\<=\other - \catcode`\>=\other - \catcode`\+=\other - \catcode`\@=\other - \catcode`\\=\other} - -% \mbodybackslash is the definition of \ in @macro bodies. -% It maps \foo\ => \csname macarg.foo\endcsname => #N -% where N is the macro parameter number. -% We define \csname macarg.\endcsname to be \realbackslash, so -% \\ in macro replacement text gets you a backslash. - -{\catcode`@=0 @catcode`@\=@active - @gdef@usembodybackslash{@let\=@mbodybackslash} - @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} -} -\expandafter\def\csname macarg.\endcsname{\realbackslash} - -\def\macro{\recursivefalse\parsearg\macroxxx} -\def\rmacro{\recursivetrue\parsearg\macroxxx} - -\def\macroxxx#1{% - \getargs{#1}% now \macname is the macname and \argl the arglist - \ifx\argl\empty % no arguments - \paramno=0% - \else - \expandafter\parsemargdef \argl;% - \fi - \if1\csname ismacro.\the\macname\endcsname - \message{Warning: redefining \the\macname}% - \else - \expandafter\ifx\csname \the\macname\endcsname \relax - \else \errmessage{Macro name \the\macname\space already defined}\fi - \global\cslet{macsave.\the\macname}{\the\macname}% - \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% - % Add the macroname to \macrolist - \toks0 = \expandafter{\macrolist\do}% - \xdef\macrolist{\the\toks0 - \expandafter\noexpand\csname\the\macname\endcsname}% - \fi - \begingroup \macrobodyctxt - \ifrecursive \expandafter\parsermacbody - \else \expandafter\parsemacbody - \fi} - -\def\unmacro{\parsearg\dounmacro} -\def\dounmacro#1{% - \if1\csname ismacro.#1\endcsname - \global\cslet{#1}{macsave.#1}% - \global\expandafter\let \csname ismacro.#1\endcsname=0% - % Remove the macro name from \macrolist: - \begingroup - \expandafter\let\csname#1\endcsname \relax - \let\do\unmacrodo - \xdef\macrolist{\macrolist}% - \endgroup - \else - \errmessage{Macro #1 not defined}% - \fi -} - -% Called by \do from \dounmacro on each macro. The idea is to omit any -% macro definitions that have been changed to \relax. -% -\def\unmacrodo#1{% - \ifx#1\relax - % remove this - \else - \noexpand\do \noexpand #1% - \fi -} - -% This makes use of the obscure feature that if the last token of a -% is #, then the preceding argument is delimited by -% an opening brace, and that opening brace is not consumed. -\def\getargs#1{\getargsxxx#1{}} -\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} -\def\getmacname #1 #2\relax{\macname={#1}} -\def\getmacargs#1{\def\argl{#1}} - -% Parse the optional {params} list. Set up \paramno and \paramlist -% so \defmacro knows what to do. Define \macarg.blah for each blah -% in the params list, to be ##N where N is the position in that list. -% That gets used by \mbodybackslash (above). - -% We need to get `macro parameter char #' into several definitions. -% The technique used is stolen from LaTeX: let \hash be something -% unexpandable, insert that wherever you need a #, and then redefine -% it to # just before using the token list produced. -% -% The same technique is used to protect \eatspaces till just before -% the macro is used. - -\def\parsemargdef#1;{\paramno=0\def\paramlist{}% - \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,} -\def\parsemargdefxxx#1,{% - \if#1;\let\next=\relax - \else \let\next=\parsemargdefxxx - \advance\paramno by 1% - \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname - {\xeatspaces{\hash\the\paramno}}% - \edef\paramlist{\paramlist\hash\the\paramno,}% - \fi\next} - -% These two commands read recursive and nonrecursive macro bodies. -% (They're different since rec and nonrec macros end differently.) - -\long\def\parsemacbody#1@end macro% -{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% -\long\def\parsermacbody#1@end rmacro% -{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% - -% This defines the macro itself. There are six cases: recursive and -% nonrecursive macros of zero, one, and many arguments. -% Much magic with \expandafter here. -% \xdef is used so that macro definitions will survive the file -% they're defined in; @include reads the file inside a group. -\def\defmacro{% - \let\hash=##% convert placeholders to macro parameter chars - \ifrecursive - \ifcase\paramno - % 0 - \expandafter\xdef\csname\the\macname\endcsname{% - \noexpand\scanmacro{\temp}}% - \or % 1 - \expandafter\xdef\csname\the\macname\endcsname{% - \bgroup\noexpand\macroargctxt - \noexpand\braceorline - \expandafter\noexpand\csname\the\macname xxx\endcsname}% - \expandafter\xdef\csname\the\macname xxx\endcsname##1{% - \egroup\noexpand\scanmacro{\temp}}% - \else % many - \expandafter\xdef\csname\the\macname\endcsname{% - \bgroup\noexpand\macroargctxt - \noexpand\csname\the\macname xx\endcsname}% - \expandafter\xdef\csname\the\macname xx\endcsname##1{% - \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% - \expandafter\expandafter - \expandafter\xdef - \expandafter\expandafter - \csname\the\macname xxx\endcsname - \paramlist{\egroup\noexpand\scanmacro{\temp}}% - \fi - \else - \ifcase\paramno - % 0 - \expandafter\xdef\csname\the\macname\endcsname{% - \noexpand\norecurse{\the\macname}% - \noexpand\scanmacro{\temp}\egroup}% - \or % 1 - \expandafter\xdef\csname\the\macname\endcsname{% - \bgroup\noexpand\macroargctxt - \noexpand\braceorline - \expandafter\noexpand\csname\the\macname xxx\endcsname}% - \expandafter\xdef\csname\the\macname xxx\endcsname##1{% - \egroup - \noexpand\norecurse{\the\macname}% - \noexpand\scanmacro{\temp}\egroup}% - \else % many - \expandafter\xdef\csname\the\macname\endcsname{% - \bgroup\noexpand\macroargctxt - \expandafter\noexpand\csname\the\macname xx\endcsname}% - \expandafter\xdef\csname\the\macname xx\endcsname##1{% - \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% - \expandafter\expandafter - \expandafter\xdef - \expandafter\expandafter - \csname\the\macname xxx\endcsname - \paramlist{% - \egroup - \noexpand\norecurse{\the\macname}% - \noexpand\scanmacro{\temp}\egroup}% - \fi - \fi} - -\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} - -% \braceorline decides whether the next nonwhitespace character is a -% {. If so it reads up to the closing }, if not, it reads the whole -% line. Whatever was read is then fed to the next control sequence -% as an argument (by \parsebrace or \parsearg) -\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx} -\def\braceorlinexxx{% - \ifx\nchar\bgroup\else - \expandafter\parsearg - \fi \next} - -% We mant to disable all macros during \shipout so that they are not -% expanded by \write. -\def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}% - \edef\next{\macrolist}\expandafter\endgroup\next} - - -% @alias. -% We need some trickery to remove the optional spaces around the equal -% sign. Just make them active and then expand them all to nothing. -\def\alias{\begingroup\obeyspaces\parsearg\aliasxxx} -\def\aliasxxx #1{\aliasyyy#1\relax} -\def\aliasyyy #1=#2\relax{\ignoreactivespaces -\edef\next{\global\let\expandafter\noexpand\csname#1\endcsname=% - \expandafter\noexpand\csname#2\endcsname}% -\expandafter\endgroup\next} - - -\message{cross references,} -% @xref etc. - -\newwrite\auxfile - -\newif\ifhavexrefs % True if xref values are known. -\newif\ifwarnedxrefs % True if we warned once that they aren't known. - -% @inforef is relatively simple. -\def\inforef #1{\inforefzzz #1,,,,**} -\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, - node \samp{\ignorespaces#1{}}} - -% @node's job is to define \lastnode. -\def\node{\ENVcheck\parsearg\nodezzz} -\def\nodezzz#1{\nodexxx [#1,]} -\def\nodexxx[#1,#2]{\gdef\lastnode{#1}} -\let\nwnode=\node -\let\lastnode=\relax - -% The sectioning commands (@chapter, etc.) call these. -\def\donoderef{% - \ifx\lastnode\relax\else - \expandafter\expandafter\expandafter\setref{\lastnode}% - {Ysectionnumberandtype}% - \global\let\lastnode=\relax - \fi -} -\def\unnumbnoderef{% - \ifx\lastnode\relax\else - \expandafter\expandafter\expandafter\setref{\lastnode}{Ynothing}% - \global\let\lastnode=\relax - \fi -} -\def\appendixnoderef{% - \ifx\lastnode\relax\else - \expandafter\expandafter\expandafter\setref{\lastnode}% - {Yappendixletterandtype}% - \global\let\lastnode=\relax - \fi -} - - -% @anchor{NAME} -- define xref target at arbitrary point. -% -\newcount\savesfregister -\gdef\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} -\gdef\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} -\gdef\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} - -% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an -% anchor), namely NAME-title (the corresponding @chapter/etc. name), -% NAME-pg (the page number), and NAME-snt (section number and type). -% Called from \foonoderef. -% -% We have to set \indexdummies so commands such as @code in a section -% title aren't expanded. It would be nicer not to expand the titles in -% the first place, but there's so many layers that that is hard to do. -% -% Likewise, use \turnoffactive so that punctuation chars such as underscore -% and backslash work in node names. -% -\def\setref#1#2{{% - \atdummies - \pdfmkdest{#1}% - % - \turnoffactive - \dosetq{#1-title}{Ytitle}% - \dosetq{#1-pg}{Ypagenumber}% - \dosetq{#1-snt}{#2}% -}} - -% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is -% the node name, #2 the name of the Info cross-reference, #3 the printed -% node name, #4 the name of the Info file, #5 the name of the printed -% manual. All but the node name can be omitted. -% -\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} -\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} -\def\ref#1{\xrefX[#1,,,,,,,]} -\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup - \unsepspaces - \def\printedmanual{\ignorespaces #5}% - \def\printednodename{\ignorespaces #3}% - \setbox1=\hbox{\printedmanual}% - \setbox0=\hbox{\printednodename}% - \ifdim \wd0 = 0pt - % No printed node name was explicitly given. - \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax - % Use the node name inside the square brackets. - \def\printednodename{\ignorespaces #1}% - \else - % Use the actual chapter/section title appear inside - % the square brackets. Use the real section title if we have it. - \ifdim \wd1 > 0pt - % It is in another manual, so we don't have it. - \def\printednodename{\ignorespaces #1}% - \else - \ifhavexrefs - % We know the real title if we have the xref values. - \def\printednodename{\refx{#1-title}{}}% - \else - % Otherwise just copy the Info node name. - \def\printednodename{\ignorespaces #1}% - \fi% - \fi - \fi - \fi - % - % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not - % insert empty discretionaries after hyphens, which means that it will - % not find a line break at a hyphen in a node names. Since some manuals - % are best written with fairly long node names, containing hyphens, this - % is a loss. Therefore, we give the text of the node name again, so it - % is as if TeX is seeing it for the first time. - \ifpdf - \leavevmode - \getfilename{#4}% - {\turnoffactive \otherbackslash - \ifnum\filenamelength>0 - \startlink attr{/Border [0 0 0]}% - goto file{\the\filename.pdf} name{#1}% - \else - \startlink attr{/Border [0 0 0]}% - goto name{#1}% - \fi - }% - \linkcolor - \fi - % - \ifdim \wd1 > 0pt - \putwordsection{} ``\printednodename'' \putwordin{} \cite{\printedmanual}% - \else - % _ (for example) has to be the character _ for the purposes of the - % control sequence corresponding to the node, but it has to expand - % into the usual \leavevmode...\vrule stuff for purposes of - % printing. So we \turnoffactive for the \refx-snt, back on for the - % printing, back off for the \refx-pg. - {\turnoffactive \otherbackslash - % Only output a following space if the -snt ref is nonempty; for - % @unnumbered and @anchor, it won't be. - \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% - \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi - }% - % [mynode], - [\printednodename],\space - % page 3 - \turnoffactive \otherbackslash \putwordpage\tie\refx{#1-pg}{}% - \fi - \endlink -\endgroup} - -% \dosetq is called from \setref to do the actual \write (\iflinks). -% -\def\dosetq#1#2{% - {\let\folio=0% - \edef\next{\write\auxfile{\internalsetq{#1}{#2}}}% - \iflinks \next \fi - }% -} - -% \internalsetq{foo}{page} expands into -% CHARACTERS @xrdef{foo}{...expansion of \page...} -\def\internalsetq#1#2{@xrdef{#1}{\csname #2\endcsname}} - -% Things to be expanded by \internalsetq. -% -\def\Ypagenumber{\folio} -\def\Ytitle{\thissection} -\def\Ynothing{} -\def\Ysectionnumberandtype{% - \ifnum\secno=0 - \putwordChapter@tie \the\chapno - \else \ifnum\subsecno=0 - \putwordSection@tie \the\chapno.\the\secno - \else \ifnum\subsubsecno=0 - \putwordSection@tie \the\chapno.\the\secno.\the\subsecno - \else - \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno - \fi\fi\fi -} - -\def\Yappendixletterandtype{% - \ifnum\secno=0 - \putwordAppendix@tie @char\the\appendixno{}% - \else \ifnum\subsecno=0 - \putwordSection@tie @char\the\appendixno.\the\secno - \else \ifnum\subsubsecno=0 - \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno - \else - \putwordSection@tie - @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno - \fi\fi\fi -} - -% Use TeX 3.0's \inputlineno to get the line number, for better error -% messages, but if we're using an old version of TeX, don't do anything. -% -\ifx\inputlineno\thisisundefined - \let\linenumber = \empty % Pre-3.0. -\else - \def\linenumber{\the\inputlineno:\space} -\fi - -% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. -% If its value is nonempty, SUFFIX is output afterward. -% -\def\refx#1#2{% - {% - \indexnofonts - \otherbackslash - \expandafter\global\expandafter\let\expandafter\thisrefX - \csname X#1\endcsname - }% - \ifx\thisrefX\relax - % If not defined, say something at least. - \angleleft un\-de\-fined\angleright - \iflinks - \ifhavexrefs - \message{\linenumber Undefined cross reference `#1'.}% - \else - \ifwarnedxrefs\else - \global\warnedxrefstrue - \message{Cross reference values unknown; you must run TeX again.}% - \fi - \fi - \fi - \else - % It's defined, so just use it. - \thisrefX - \fi - #2% Output the suffix in any case. -} - -% This is the macro invoked by entries in the aux file. -% -\def\xrdef#1{\expandafter\gdef\csname X#1\endcsname} - -% Read the last existing aux file, if any. No error if none exists. -\def\readauxfile{\begingroup - \catcode`\^^@=\other - \catcode`\^^A=\other - \catcode`\^^B=\other - \catcode`\^^C=\other - \catcode`\^^D=\other - \catcode`\^^E=\other - \catcode`\^^F=\other - \catcode`\^^G=\other - \catcode`\^^H=\other - \catcode`\^^K=\other - \catcode`\^^L=\other - \catcode`\^^N=\other - \catcode`\^^P=\other - \catcode`\^^Q=\other - \catcode`\^^R=\other - \catcode`\^^S=\other - \catcode`\^^T=\other - \catcode`\^^U=\other - \catcode`\^^V=\other - \catcode`\^^W=\other - \catcode`\^^X=\other - \catcode`\^^Z=\other - \catcode`\^^[=\other - \catcode`\^^\=\other - \catcode`\^^]=\other - \catcode`\^^^=\other - \catcode`\^^_=\other - % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. - % in xref tags, i.e., node names. But since ^^e4 notation isn't - % supported in the main text, it doesn't seem desirable. Furthermore, - % that is not enough: for node names that actually contain a ^ - % character, we would end up writing a line like this: 'xrdef {'hat - % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first - % argument, and \hat is not an expandable control sequence. It could - % all be worked out, but why? Either we support ^^ or we don't. - % - % The other change necessary for this was to define \auxhat: - % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter - % and then to call \auxhat in \setq. - % - \catcode`\^=\other - % - % Special characters. Should be turned off anyway, but... - \catcode`\~=\other - \catcode`\[=\other - \catcode`\]=\other - \catcode`\"=\other - \catcode`\_=\other - \catcode`\|=\other - \catcode`\<=\other - \catcode`\>=\other - \catcode`\$=\other - \catcode`\#=\other - \catcode`\&=\other - \catcode`\%=\other - \catcode`+=\other % avoid \+ for paranoia even though we've turned it off - % - % Make the characters 128-255 be printing characters - {% - \count 1=128 - \def\loop{% - \catcode\count 1=\other - \advance\count 1 by 1 - \ifnum \count 1<256 \loop \fi - }% - }% - % - % Turn off \ as an escape so we do not lose on - % entries which were dumped with control sequences in their names. - % For example, @xrdef{$\leq $-fun}{page ...} made by @defun ^^ - % Reference to such entries still does not work the way one would wish, - % but at least they do not bomb out when the aux file is read in. - \catcode`\\=\other - % - % @ is our escape character in .aux files. - \catcode`\{=1 - \catcode`\}=2 - \catcode`\@=0 - % - \openin 1 \jobname.aux - \ifeof 1 \else - \closein 1 - \input \jobname.aux - \global\havexrefstrue - \global\warnedobstrue - \fi - % Open the new aux file. TeX will close it automatically at exit. - \openout\auxfile=\jobname.aux -\endgroup} - - -% Footnotes. - -\newcount \footnoteno - -% The trailing space in the following definition for supereject is -% vital for proper filling; pages come out unaligned when you do a -% pagealignmacro call if that space before the closing brace is -% removed. (Generally, numeric constants should always be followed by a -% space to prevent strange expansion errors.) -\def\supereject{\par\penalty -20000\footnoteno =0 } - -% @footnotestyle is meaningful for info output only. -\let\footnotestyle=\comment - -\let\ptexfootnote=\footnote - -{\catcode `\@=11 -% -% Auto-number footnotes. Otherwise like plain. -\gdef\footnote{% - \global\advance\footnoteno by \@ne - \edef\thisfootno{$^{\the\footnoteno}$}% - % - % In case the footnote comes at the end of a sentence, preserve the - % extra spacing after we do the footnote number. - \let\@sf\empty - \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi - % - % Remove inadvertent blank space before typesetting the footnote number. - \unskip - \thisfootno\@sf - \dofootnote -}% - -% Don't bother with the trickery in plain.tex to not require the -% footnote text as a parameter. Our footnotes don't need to be so general. -% -% Oh yes, they do; otherwise, @ifset and anything else that uses -% \parseargline fail inside footnotes because the tokens are fixed when -% the footnote is read. --karl, 16nov96. -% -% The start of the footnote looks usually like this: -\gdef\startfootins{\insert\footins\bgroup} -% -% ... but this macro is redefined inside @multitable. -% -\gdef\dofootnote{% - \startfootins - % We want to typeset this text as a normal paragraph, even if the - % footnote reference occurs in (for example) a display environment. - % So reset some parameters. - \hsize=\pagewidth - \interlinepenalty\interfootnotelinepenalty - \splittopskip\ht\strutbox % top baseline for broken footnotes - \splitmaxdepth\dp\strutbox - \floatingpenalty\@MM - \leftskip\z@skip - \rightskip\z@skip - \spaceskip\z@skip - \xspaceskip\z@skip - \parindent\defaultparindent - % - \smallfonts \rm - % - % Because we use hanging indentation in footnotes, a @noindent appears - % to exdent this text, so make it be a no-op. makeinfo does not use - % hanging indentation so @noindent can still be needed within footnote - % text after an @example or the like (not that this is good style). - \let\noindent = \relax - % - % Hang the footnote text off the number. Use \everypar in case the - % footnote extends for more than one paragraph. - \everypar = {\hang}% - \textindent{\thisfootno}% - % - % Don't crash into the line above the footnote text. Since this - % expands into a box, it must come within the paragraph, lest it - % provide a place where TeX can split the footnote. - \footstrut - \futurelet\next\fo@t -} -}%end \catcode `\@=11 - -% @| inserts a changebar to the left of the current line. It should -% surround any changed text. This approach does *not* work if the -% change spans more than two lines of output. To handle that, we would -% have adopt a much more difficult approach (putting marks into the main -% vertical list for the beginning and end of each change). -% -\def\|{% - % \vadjust can only be used in horizontal mode. - \leavevmode - % - % Append this vertical mode material after the current line in the output. - \vadjust{% - % We want to insert a rule with the height and depth of the current - % leading; that is exactly what \strutbox is supposed to record. - \vskip-\baselineskip - % - % \vadjust-items are inserted at the left edge of the type. So - % the \llap here moves out into the left-hand margin. - \llap{% - % - % For a thicker or thinner bar, change the `1pt'. - \vrule height\baselineskip width1pt - % - % This is the space between the bar and the text. - \hskip 12pt - }% - }% -} - -% For a final copy, take out the rectangles -% that mark overfull boxes (in case you have decided -% that the text looks ok even though it passes the margin). -% -\def\finalout{\overfullrule=0pt} - -% @image. We use the macros from epsf.tex to support this. -% If epsf.tex is not installed and @image is used, we complain. -% -% Check for and read epsf.tex up front. If we read it only at @image -% time, we might be inside a group, and then its definitions would get -% undone and the next image would fail. -\openin 1 = epsf.tex -\ifeof 1 \else - \closein 1 - % Do not bother showing banner with epsf.tex v2.7k (available in - % doc/epsf.tex and on ctan). - \def\epsfannounce{\toks0 = }% - \input epsf.tex -\fi -% -% We will only complain once about lack of epsf.tex. -\newif\ifwarnednoepsf -\newhelp\noepsfhelp{epsf.tex must be installed for images to - work. It is also included in the Texinfo distribution, or you can get - it from ftp://tug.org/tex/epsf.tex.} -% -\def\image#1{% - \ifx\epsfbox\undefined - \ifwarnednoepsf \else - \errhelp = \noepsfhelp - \errmessage{epsf.tex not found, images will be ignored}% - \global\warnednoepsftrue - \fi - \else - \imagexxx #1,,,,,\finish - \fi -} -% -% Arguments to @image: -% #1 is (mandatory) image filename; we tack on .eps extension. -% #2 is (optional) width, #3 is (optional) height. -% #4 is (ignored optional) html alt text. -% #5 is (ignored optional) extension. -% #6 is just the usual extra ignored arg for parsing this stuff. -\newif\ifimagevmode -\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup - \catcode`\^^M = 5 % in case we're inside an example - \normalturnoffactive % allow _ et al. in names - % If the image is by itself, center it. - \ifvmode - \imagevmodetrue - \nobreak\bigskip - % Usually we'll have text after the image which will insert - % \parskip glue, so insert it here too to equalize the space - % above and below. - \nobreak\vskip\parskip - \nobreak - \line\bgroup\hss - \fi - % - % Output the image. - \ifpdf - \dopdfimage{#1}{#2}{#3}% - \else - % \epsfbox itself resets \epsf?size at each figure. - \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi - \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi - \epsfbox{#1.eps}% - \fi - % - \ifimagevmode \hss \egroup \bigbreak \fi % space after the image -\endgroup} - - -\message{localization,} -% and i18n. - -% @documentlanguage is usually given very early, just after -% @setfilename. If done too late, it may not override everything -% properly. Single argument is the language abbreviation. -% It would be nice if we could set up a hyphenation file here. -% -\def\documentlanguage{\parsearg\dodocumentlanguage} -\def\dodocumentlanguage#1{% - \tex % read txi-??.tex file in plain TeX. - % Read the file if it exists. - \openin 1 txi-#1.tex - \ifeof1 - \errhelp = \nolanghelp - \errmessage{Cannot read language file txi-#1.tex}% - \let\temp = \relax - \else - \def\temp{\input txi-#1.tex }% - \fi - \temp - \endgroup -} -\newhelp\nolanghelp{The given language definition file cannot be found or -is empty. Maybe you need to install it? In the current directory -should work if nowhere else does.} - - -% @documentencoding should change something in TeX eventually, most -% likely, but for now just recognize it. -\let\documentencoding = \comment - - -% Page size parameters. -% -\newdimen\defaultparindent \defaultparindent = 15pt - -\chapheadingskip = 15pt plus 4pt minus 2pt -\secheadingskip = 12pt plus 3pt minus 2pt -\subsecheadingskip = 9pt plus 2pt minus 2pt - -% Prevent underfull vbox error messages. -\vbadness = 10000 - -% Don't be so finicky about underfull hboxes, either. -\hbadness = 2000 - -% Following George Bush, just get rid of widows and orphans. -\widowpenalty=10000 -\clubpenalty=10000 - -% Use TeX 3.0's \emergencystretch to help line breaking, but if we're -% using an old version of TeX, don't do anything. We want the amount of -% stretch added to depend on the line length, hence the dependence on -% \hsize. We call this whenever the paper size is set. -% -\def\setemergencystretch{% - \ifx\emergencystretch\thisisundefined - % Allow us to assign to \emergencystretch anyway. - \def\emergencystretch{\dimen0}% - \else - \emergencystretch = .15\hsize - \fi -} - -% Parameters in order: 1) textheight; 2) textwidth; 3) voffset; -% 4) hoffset; 5) binding offset; 6) topskip; 7) physical page height; 8) -% physical page width. -% -% We also call \setleading{\textleading}, so the caller should define -% \textleading. The caller should also set \parskip. -% -\def\internalpagesizes#1#2#3#4#5#6#7#8{% - \voffset = #3\relax - \topskip = #6\relax - \splittopskip = \topskip - % - \vsize = #1\relax - \advance\vsize by \topskip - \outervsize = \vsize - \advance\outervsize by 2\topandbottommargin - \pageheight = \vsize - % - \hsize = #2\relax - \outerhsize = \hsize - \advance\outerhsize by 0.5in - \pagewidth = \hsize - % - \normaloffset = #4\relax - \bindingoffset = #5\relax - % - \ifpdf - \pdfpageheight #7\relax - \pdfpagewidth #8\relax - \fi - % - \setleading{\textleading} - % - \parindent = \defaultparindent - \setemergencystretch -} - -% @letterpaper (the default). -\def\letterpaper{{\globaldefs = 1 - \parskip = 3pt plus 2pt minus 1pt - \textleading = 13.2pt - % - % If page is nothing but text, make it come out even. - \internalpagesizes{46\baselineskip}{6in}% - {\voffset}{.25in}% - {\bindingoffset}{36pt}% - {11in}{8.5in}% -}} - -% Use @smallbook to reset parameters for 7x9.5 (or so) format. -\def\smallbook{{\globaldefs = 1 - \parskip = 2pt plus 1pt - \textleading = 12pt - % - \internalpagesizes{7.5in}{5in}% - {\voffset}{.25in}% - {\bindingoffset}{16pt}% - {9.25in}{7in}% - % - \lispnarrowing = 0.3in - \tolerance = 700 - \hfuzz = 1pt - \contentsrightmargin = 0pt - \defbodyindent = .5cm -}} - -% Use @afourpaper to print on European A4 paper. -\def\afourpaper{{\globaldefs = 1 - \parskip = 3pt plus 2pt minus 1pt - \textleading = 13.2pt - % - % Double-side printing via postscript on Laserjet 4050 - % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. - % To change the settings for a different printer or situation, adjust - % \normaloffset until the front-side and back-side texts align. Then - % do the same for \bindingoffset. You can set these for testing in - % your texinfo source file like this: - % @tex - % \global\normaloffset = -6mm - % \global\bindingoffset = 10mm - % @end tex - \internalpagesizes{51\baselineskip}{160mm} - {\voffset}{\hoffset}% - {\bindingoffset}{44pt}% - {297mm}{210mm}% - % - \tolerance = 700 - \hfuzz = 1pt - \contentsrightmargin = 0pt - \defbodyindent = 5mm -}} - -% Use @afivepaper to print on European A5 paper. -% From romildo@urano.iceb.ufop.br, 2 July 2000. -% He also recommends making @example and @lisp be small. -\def\afivepaper{{\globaldefs = 1 - \parskip = 2pt plus 1pt minus 0.1pt - \textleading = 12.5pt - % - \internalpagesizes{160mm}{120mm}% - {\voffset}{\hoffset}% - {\bindingoffset}{8pt}% - {210mm}{148mm}% - % - \lispnarrowing = 0.2in - \tolerance = 800 - \hfuzz = 1.2pt - \contentsrightmargin = 0pt - \defbodyindent = 2mm - \tableindent = 12mm -}} - -% A specific text layout, 24x15cm overall, intended for A4 paper. -\def\afourlatex{{\globaldefs = 1 - \afourpaper - \internalpagesizes{237mm}{150mm}% - {\voffset}{4.6mm}% - {\bindingoffset}{7mm}% - {297mm}{210mm}% - % - % Must explicitly reset to 0 because we call \afourpaper. - \globaldefs = 0 -}} - -% Use @afourwide to print on A4 paper in landscape format. -\def\afourwide{{\globaldefs = 1 - \afourpaper - \internalpagesizes{241mm}{165mm}% - {\voffset}{-2.95mm}% - {\bindingoffset}{7mm}% - {297mm}{210mm}% - \globaldefs = 0 -}} - -% @pagesizes TEXTHEIGHT[,TEXTWIDTH] -% Perhaps we should allow setting the margins, \topskip, \parskip, -% and/or leading, also. Or perhaps we should compute them somehow. -% -\def\pagesizes{\parsearg\pagesizesxxx} -\def\pagesizesxxx#1{\pagesizesyyy #1,,\finish} -\def\pagesizesyyy#1,#2,#3\finish{{% - \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi - \globaldefs = 1 - % - \parskip = 3pt plus 2pt minus 1pt - \setleading{\textleading}% - % - \dimen0 = #1 - \advance\dimen0 by \voffset - % - \dimen2 = \hsize - \advance\dimen2 by \normaloffset - % - \internalpagesizes{#1}{\hsize}% - {\voffset}{\normaloffset}% - {\bindingoffset}{44pt}% - {\dimen0}{\dimen2}% -}} - -% Set default to letter. -% -\letterpaper - - -\message{and turning on texinfo input format.} - -% Define macros to output various characters with catcode for normal text. -\catcode`\"=\other -\catcode`\~=\other -\catcode`\^=\other -\catcode`\_=\other -\catcode`\|=\other -\catcode`\<=\other -\catcode`\>=\other -\catcode`\+=\other -\catcode`\$=\other -\def\normaldoublequote{"} -\def\normaltilde{~} -\def\normalcaret{^} -\def\normalunderscore{_} -\def\normalverticalbar{|} -\def\normalless{<} -\def\normalgreater{>} -\def\normalplus{+} -\def\normaldollar{$}%$ font-lock fix - -% This macro is used to make a character print one way in ttfont -% where it can probably just be output, and another way in other fonts, -% where something hairier probably needs to be done. -% -% #1 is what to print if we are indeed using \tt; #2 is what to print -% otherwise. Since all the Computer Modern typewriter fonts have zero -% interword stretch (and shrink), and it is reasonable to expect all -% typewriter fonts to have this, we can check that font parameter. -% -\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} - -% Same as above, but check for italic font. Actually this also catches -% non-italic slanted fonts since it is impossible to distinguish them from -% italic fonts. But since this is only used by $ and it uses \sl anyway -% this is not a problem. -\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} - -% Turn off all special characters except @ -% (and those which the user can use as if they were ordinary). -% Most of these we simply print from the \tt font, but for some, we can -% use math or other variants that look better in normal text. - -\catcode`\"=\active -\def\activedoublequote{{\tt\char34}} -\let"=\activedoublequote -\catcode`\~=\active -\def~{{\tt\char126}} -\chardef\hat=`\^ -\catcode`\^=\active -\def^{{\tt \hat}} - -\catcode`\_=\active -\def_{\ifusingtt\normalunderscore\_} -% Subroutine for the previous macro. -\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } - -\catcode`\|=\active -\def|{{\tt\char124}} -\chardef \less=`\< -\catcode`\<=\active -\def<{{\tt \less}} -\chardef \gtr=`\> -\catcode`\>=\active -\def>{{\tt \gtr}} -\catcode`\+=\active -\def+{{\tt \char 43}} -\catcode`\$=\active -\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix - -% Set up an active definition for =, but don't enable it most of the time. -{\catcode`\==\active -\global\def={{\tt \char 61}}} - -\catcode`+=\active -\catcode`\_=\active - -% If a .fmt file is being used, characters that might appear in a file -% name cannot be active until we have parsed the command line. -% So turn them off again, and have \everyjob (or @setfilename) turn them on. -% \otherifyactive is called near the end of this file. -\def\otherifyactive{\catcode`+=\other \catcode`\_=\other} - -\catcode`\@=0 - -% \rawbackslashxx outputs one backslash character in current font, -% as in \char`\\. -\global\chardef\rawbackslashxx=`\\ - -% \rawbackslash defines an active \ to do \rawbackslashxx. -% \otherbackslash defines an active \ to be a literal `\' character with -% catcode other. -{\catcode`\\=\active - @gdef@rawbackslash{@let\=@rawbackslashxx} - @gdef@otherbackslash{@let\=@realbackslash} -} - -% \realbackslash is an actual character `\' with catcode other. -{\catcode`\\=\other @gdef@realbackslash{\}} - -% \normalbackslash outputs one backslash in fixed width font. -\def\normalbackslash{{\tt\rawbackslashxx}} - -\catcode`\\=\active - -% Used sometimes to turn off (effectively) the active characters -% even after parsing them. -@def@turnoffactive{% - @let"=@normaldoublequote - @let\=@realbackslash - @let~=@normaltilde - @let^=@normalcaret - @let_=@normalunderscore - @let|=@normalverticalbar - @let<=@normalless - @let>=@normalgreater - @let+=@normalplus - @let$=@normaldollar %$ font-lock fix -} - -% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of -% the literal character `\'. (Thus, \ is not expandable when this is in -% effect.) -% -@def@normalturnoffactive{@turnoffactive @let\=@normalbackslash} - -% Make _ and + \other characters, temporarily. -% This is canceled by @fixbackslash. -@otherifyactive - -% If a .fmt file is being used, we don't want the `\input texinfo' to show up. -% That is what \eatinput is for; after that, the `\' should revert to printing -% a backslash. -% -@gdef@eatinput input texinfo{@fixbackslash} -@global@let\ = @eatinput - -% On the other hand, perhaps the file did not have a `\input texinfo'. Then -% the first `\{ in the file would cause an error. This macro tries to fix -% that, assuming it is called before the first `\' could plausibly occur. -% Also back turn on active characters that might appear in the input -% file name, in case not using a pre-dumped format. -% -@gdef@fixbackslash{% - @ifx\@eatinput @let\ = @normalbackslash @fi - @catcode`+=@active - @catcode`@_=@active -} - -% Say @foo, not \foo, in error messages. -@escapechar = `@@ - -% These look ok in all fonts, so just make them not special. -@catcode`@& = @other -@catcode`@# = @other -@catcode`@% = @other - -@c Set initial fonts. -@textfonts -@rm - - -@c Local variables: -@c eval: (add-hook 'write-file-hooks 'time-stamp) -@c page-delimiter: "^\\\\message" -@c time-stamp-start: "def\\\\texinfoversion{" -@c time-stamp-format: "%:y-%02m-%02d.%02H" -@c time-stamp-end: "}" -@c End: diff --git a/dep/src/readline/src/doc/version.texi b/dep/src/readline/src/doc/version.texi deleted file mode 100644 index 0beb27609f5..00000000000 --- a/dep/src/readline/src/doc/version.texi +++ /dev/null @@ -1,10 +0,0 @@ -@ignore -Copyright (C) 1988-2004 Free Software Foundation, Inc. -@end ignore - -@set EDITION 5.0 -@set VERSION 5.0 -@set UPDATED 28 January 2004 -@set UPDATED-MONTH January 2004 - -@set LASTCHANGE Wed Jan 28 15:46:54 EST 2004 diff --git a/dep/src/readline/src/emacs_keymap.c b/dep/src/readline/src/emacs_keymap.c deleted file mode 100644 index ca9d1343b65..00000000000 --- a/dep/src/readline/src/emacs_keymap.c +++ /dev/null @@ -1,873 +0,0 @@ -/* emacs_keymap.c -- the keymap for emacs_mode in readline (). */ - -/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#if !defined (BUFSIZ) -#include -#endif /* !BUFSIZ */ - -#include "readline.h" - -/* An array of function pointers, one for each possible key. - If the type byte is ISKMAP, then the pointer is the address of - a keymap. */ - -KEYMAP_ENTRY_ARRAY emacs_standard_keymap = { - - /* Control keys. */ - { ISFUNC, rl_set_mark }, /* Control-@ */ - { ISFUNC, rl_beg_of_line }, /* Control-a */ - { ISFUNC, rl_backward_char }, /* Control-b */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-c */ - { ISFUNC, rl_delete }, /* Control-d */ - { ISFUNC, rl_end_of_line }, /* Control-e */ - { ISFUNC, rl_forward_char }, /* Control-f */ - { ISFUNC, rl_abort }, /* Control-g */ - { ISFUNC, rl_rubout }, /* Control-h */ - { ISFUNC, rl_complete }, /* Control-i */ - { ISFUNC, rl_newline }, /* Control-j */ - { ISFUNC, rl_kill_line }, /* Control-k */ - { ISFUNC, rl_clear_screen }, /* Control-l */ - { ISFUNC, rl_newline }, /* Control-m */ - { ISFUNC, rl_get_next_history }, /* Control-n */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-o */ - { ISFUNC, rl_get_previous_history }, /* Control-p */ - { ISFUNC, rl_quoted_insert }, /* Control-q */ - { ISFUNC, rl_reverse_search_history }, /* Control-r */ - { ISFUNC, rl_forward_search_history }, /* Control-s */ - { ISFUNC, rl_transpose_chars }, /* Control-t */ - { ISFUNC, rl_unix_line_discard }, /* Control-u */ - { ISFUNC, rl_quoted_insert }, /* Control-v */ - { ISFUNC, rl_unix_word_rubout }, /* Control-w */ - { ISKMAP, (rl_command_func_t *)emacs_ctlx_keymap }, /* Control-x */ - { ISFUNC, rl_yank }, /* Control-y */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-z */ - { ISKMAP, (rl_command_func_t *)emacs_meta_keymap }, /* Control-[ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-\ */ - { ISFUNC, rl_char_search }, /* Control-] */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-^ */ - { ISFUNC, rl_undo_command }, /* Control-_ */ - - /* The start of printing characters. */ - { ISFUNC, rl_insert }, /* SPACE */ - { ISFUNC, rl_insert }, /* ! */ - { ISFUNC, rl_insert }, /* " */ - { ISFUNC, rl_insert }, /* # */ - { ISFUNC, rl_insert }, /* $ */ - { ISFUNC, rl_insert }, /* % */ - { ISFUNC, rl_insert }, /* & */ - { ISFUNC, rl_insert }, /* ' */ - { ISFUNC, rl_insert }, /* ( */ - { ISFUNC, rl_insert }, /* ) */ - { ISFUNC, rl_insert }, /* * */ - { ISFUNC, rl_insert }, /* + */ - { ISFUNC, rl_insert }, /* , */ - { ISFUNC, rl_insert }, /* - */ - { ISFUNC, rl_insert }, /* . */ - { ISFUNC, rl_insert }, /* / */ - - /* Regular digits. */ - { ISFUNC, rl_insert }, /* 0 */ - { ISFUNC, rl_insert }, /* 1 */ - { ISFUNC, rl_insert }, /* 2 */ - { ISFUNC, rl_insert }, /* 3 */ - { ISFUNC, rl_insert }, /* 4 */ - { ISFUNC, rl_insert }, /* 5 */ - { ISFUNC, rl_insert }, /* 6 */ - { ISFUNC, rl_insert }, /* 7 */ - { ISFUNC, rl_insert }, /* 8 */ - { ISFUNC, rl_insert }, /* 9 */ - - /* A little more punctuation. */ - { ISFUNC, rl_insert }, /* : */ - { ISFUNC, rl_insert }, /* ; */ - { ISFUNC, rl_insert }, /* < */ - { ISFUNC, rl_insert }, /* = */ - { ISFUNC, rl_insert }, /* > */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* @ */ - - /* Uppercase alphabet. */ - { ISFUNC, rl_insert }, /* A */ - { ISFUNC, rl_insert }, /* B */ - { ISFUNC, rl_insert }, /* C */ - { ISFUNC, rl_insert }, /* D */ - { ISFUNC, rl_insert }, /* E */ - { ISFUNC, rl_insert }, /* F */ - { ISFUNC, rl_insert }, /* G */ - { ISFUNC, rl_insert }, /* H */ - { ISFUNC, rl_insert }, /* I */ - { ISFUNC, rl_insert }, /* J */ - { ISFUNC, rl_insert }, /* K */ - { ISFUNC, rl_insert }, /* L */ - { ISFUNC, rl_insert }, /* M */ - { ISFUNC, rl_insert }, /* N */ - { ISFUNC, rl_insert }, /* O */ - { ISFUNC, rl_insert }, /* P */ - { ISFUNC, rl_insert }, /* Q */ - { ISFUNC, rl_insert }, /* R */ - { ISFUNC, rl_insert }, /* S */ - { ISFUNC, rl_insert }, /* T */ - { ISFUNC, rl_insert }, /* U */ - { ISFUNC, rl_insert }, /* V */ - { ISFUNC, rl_insert }, /* W */ - { ISFUNC, rl_insert }, /* X */ - { ISFUNC, rl_insert }, /* Y */ - { ISFUNC, rl_insert }, /* Z */ - - /* Some more punctuation. */ - { ISFUNC, rl_insert }, /* [ */ - { ISFUNC, rl_insert }, /* \ */ - { ISFUNC, rl_insert }, /* ] */ - { ISFUNC, rl_insert }, /* ^ */ - { ISFUNC, rl_insert }, /* _ */ - { ISFUNC, rl_insert }, /* ` */ - - /* Lowercase alphabet. */ - { ISFUNC, rl_insert }, /* a */ - { ISFUNC, rl_insert }, /* b */ - { ISFUNC, rl_insert }, /* c */ - { ISFUNC, rl_insert }, /* d */ - { ISFUNC, rl_insert }, /* e */ - { ISFUNC, rl_insert }, /* f */ - { ISFUNC, rl_insert }, /* g */ - { ISFUNC, rl_insert }, /* h */ - { ISFUNC, rl_insert }, /* i */ - { ISFUNC, rl_insert }, /* j */ - { ISFUNC, rl_insert }, /* k */ - { ISFUNC, rl_insert }, /* l */ - { ISFUNC, rl_insert }, /* m */ - { ISFUNC, rl_insert }, /* n */ - { ISFUNC, rl_insert }, /* o */ - { ISFUNC, rl_insert }, /* p */ - { ISFUNC, rl_insert }, /* q */ - { ISFUNC, rl_insert }, /* r */ - { ISFUNC, rl_insert }, /* s */ - { ISFUNC, rl_insert }, /* t */ - { ISFUNC, rl_insert }, /* u */ - { ISFUNC, rl_insert }, /* v */ - { ISFUNC, rl_insert }, /* w */ - { ISFUNC, rl_insert }, /* x */ - { ISFUNC, rl_insert }, /* y */ - { ISFUNC, rl_insert }, /* z */ - - /* Final punctuation. */ - { ISFUNC, rl_insert }, /* { */ - { ISFUNC, rl_insert }, /* | */ - { ISFUNC, rl_insert }, /* } */ - { ISFUNC, rl_insert }, /* ~ */ - { ISFUNC, rl_rubout }, /* RUBOUT */ - -#if KEYMAP_SIZE > 128 - /* Pure 8-bit characters (128 - 159). - These might be used in some - character sets. */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - - /* ISO Latin-1 characters (160 - 255) */ - { ISFUNC, rl_insert }, /* No-break space */ - { ISFUNC, rl_insert }, /* Inverted exclamation mark */ - { ISFUNC, rl_insert }, /* Cent sign */ - { ISFUNC, rl_insert }, /* Pound sign */ - { ISFUNC, rl_insert }, /* Currency sign */ - { ISFUNC, rl_insert }, /* Yen sign */ - { ISFUNC, rl_insert }, /* Broken bar */ - { ISFUNC, rl_insert }, /* Section sign */ - { ISFUNC, rl_insert }, /* Diaeresis */ - { ISFUNC, rl_insert }, /* Copyright sign */ - { ISFUNC, rl_insert }, /* Feminine ordinal indicator */ - { ISFUNC, rl_insert }, /* Left pointing double angle quotation mark */ - { ISFUNC, rl_insert }, /* Not sign */ - { ISFUNC, rl_insert }, /* Soft hyphen */ - { ISFUNC, rl_insert }, /* Registered sign */ - { ISFUNC, rl_insert }, /* Macron */ - { ISFUNC, rl_insert }, /* Degree sign */ - { ISFUNC, rl_insert }, /* Plus-minus sign */ - { ISFUNC, rl_insert }, /* Superscript two */ - { ISFUNC, rl_insert }, /* Superscript three */ - { ISFUNC, rl_insert }, /* Acute accent */ - { ISFUNC, rl_insert }, /* Micro sign */ - { ISFUNC, rl_insert }, /* Pilcrow sign */ - { ISFUNC, rl_insert }, /* Middle dot */ - { ISFUNC, rl_insert }, /* Cedilla */ - { ISFUNC, rl_insert }, /* Superscript one */ - { ISFUNC, rl_insert }, /* Masculine ordinal indicator */ - { ISFUNC, rl_insert }, /* Right pointing double angle quotation mark */ - { ISFUNC, rl_insert }, /* Vulgar fraction one quarter */ - { ISFUNC, rl_insert }, /* Vulgar fraction one half */ - { ISFUNC, rl_insert }, /* Vulgar fraction three quarters */ - { ISFUNC, rl_insert }, /* Inverted questionk mark */ - { ISFUNC, rl_insert }, /* Latin capital letter a with grave */ - { ISFUNC, rl_insert }, /* Latin capital letter a with acute */ - { ISFUNC, rl_insert }, /* Latin capital letter a with circumflex */ - { ISFUNC, rl_insert }, /* Latin capital letter a with tilde */ - { ISFUNC, rl_insert }, /* Latin capital letter a with diaeresis */ - { ISFUNC, rl_insert }, /* Latin capital letter a with ring above */ - { ISFUNC, rl_insert }, /* Latin capital letter ae */ - { ISFUNC, rl_insert }, /* Latin capital letter c with cedilla */ - { ISFUNC, rl_insert }, /* Latin capital letter e with grave */ - { ISFUNC, rl_insert }, /* Latin capital letter e with acute */ - { ISFUNC, rl_insert }, /* Latin capital letter e with circumflex */ - { ISFUNC, rl_insert }, /* Latin capital letter e with diaeresis */ - { ISFUNC, rl_insert }, /* Latin capital letter i with grave */ - { ISFUNC, rl_insert }, /* Latin capital letter i with acute */ - { ISFUNC, rl_insert }, /* Latin capital letter i with circumflex */ - { ISFUNC, rl_insert }, /* Latin capital letter i with diaeresis */ - { ISFUNC, rl_insert }, /* Latin capital letter eth (Icelandic) */ - { ISFUNC, rl_insert }, /* Latin capital letter n with tilde */ - { ISFUNC, rl_insert }, /* Latin capital letter o with grave */ - { ISFUNC, rl_insert }, /* Latin capital letter o with acute */ - { ISFUNC, rl_insert }, /* Latin capital letter o with circumflex */ - { ISFUNC, rl_insert }, /* Latin capital letter o with tilde */ - { ISFUNC, rl_insert }, /* Latin capital letter o with diaeresis */ - { ISFUNC, rl_insert }, /* Multiplication sign */ - { ISFUNC, rl_insert }, /* Latin capital letter o with stroke */ - { ISFUNC, rl_insert }, /* Latin capital letter u with grave */ - { ISFUNC, rl_insert }, /* Latin capital letter u with acute */ - { ISFUNC, rl_insert }, /* Latin capital letter u with circumflex */ - { ISFUNC, rl_insert }, /* Latin capital letter u with diaeresis */ - { ISFUNC, rl_insert }, /* Latin capital letter Y with acute */ - { ISFUNC, rl_insert }, /* Latin capital letter thorn (Icelandic) */ - { ISFUNC, rl_insert }, /* Latin small letter sharp s (German) */ - { ISFUNC, rl_insert }, /* Latin small letter a with grave */ - { ISFUNC, rl_insert }, /* Latin small letter a with acute */ - { ISFUNC, rl_insert }, /* Latin small letter a with circumflex */ - { ISFUNC, rl_insert }, /* Latin small letter a with tilde */ - { ISFUNC, rl_insert }, /* Latin small letter a with diaeresis */ - { ISFUNC, rl_insert }, /* Latin small letter a with ring above */ - { ISFUNC, rl_insert }, /* Latin small letter ae */ - { ISFUNC, rl_insert }, /* Latin small letter c with cedilla */ - { ISFUNC, rl_insert }, /* Latin small letter e with grave */ - { ISFUNC, rl_insert }, /* Latin small letter e with acute */ - { ISFUNC, rl_insert }, /* Latin small letter e with circumflex */ - { ISFUNC, rl_insert }, /* Latin small letter e with diaeresis */ - { ISFUNC, rl_insert }, /* Latin small letter i with grave */ - { ISFUNC, rl_insert }, /* Latin small letter i with acute */ - { ISFUNC, rl_insert }, /* Latin small letter i with circumflex */ - { ISFUNC, rl_insert }, /* Latin small letter i with diaeresis */ - { ISFUNC, rl_insert }, /* Latin small letter eth (Icelandic) */ - { ISFUNC, rl_insert }, /* Latin small letter n with tilde */ - { ISFUNC, rl_insert }, /* Latin small letter o with grave */ - { ISFUNC, rl_insert }, /* Latin small letter o with acute */ - { ISFUNC, rl_insert }, /* Latin small letter o with circumflex */ - { ISFUNC, rl_insert }, /* Latin small letter o with tilde */ - { ISFUNC, rl_insert }, /* Latin small letter o with diaeresis */ - { ISFUNC, rl_insert }, /* Division sign */ - { ISFUNC, rl_insert }, /* Latin small letter o with stroke */ - { ISFUNC, rl_insert }, /* Latin small letter u with grave */ - { ISFUNC, rl_insert }, /* Latin small letter u with acute */ - { ISFUNC, rl_insert }, /* Latin small letter u with circumflex */ - { ISFUNC, rl_insert }, /* Latin small letter u with diaeresis */ - { ISFUNC, rl_insert }, /* Latin small letter y with acute */ - { ISFUNC, rl_insert }, /* Latin small letter thorn (Icelandic) */ - { ISFUNC, rl_insert } /* Latin small letter y with diaeresis */ -#endif /* KEYMAP_SIZE > 128 */ -}; - -KEYMAP_ENTRY_ARRAY emacs_meta_keymap = { - - /* Meta keys. Just like above, but the high bit is set. */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-@ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-a */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-b */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-c */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-d */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-e */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-f */ - { ISFUNC, rl_abort }, /* Meta-Control-g */ - { ISFUNC, rl_backward_kill_word }, /* Meta-Control-h */ - { ISFUNC, rl_tab_insert }, /* Meta-Control-i */ - { ISFUNC, rl_vi_editing_mode }, /* Meta-Control-j */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-k */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-l */ - { ISFUNC, rl_vi_editing_mode }, /* Meta-Control-m */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-n */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-o */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-p */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-q */ - { ISFUNC, rl_revert_line }, /* Meta-Control-r */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-s */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-t */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-u */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-v */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-w */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-x */ - { ISFUNC, rl_yank_nth_arg }, /* Meta-Control-y */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-z */ - - { ISFUNC, rl_complete }, /* Meta-Control-[ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-\ */ - { ISFUNC, rl_backward_char_search }, /* Meta-Control-] */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-^ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-_ */ - - /* The start of printing characters. */ - { ISFUNC, rl_set_mark }, /* Meta-SPACE */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-! */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-" */ - { ISFUNC, rl_insert_comment }, /* Meta-# */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-$ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-% */ - { ISFUNC, rl_tilde_expand }, /* Meta-& */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-' */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-( */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-) */ - { ISFUNC, rl_insert_completions }, /* Meta-* */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-+ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-, */ - { ISFUNC, rl_digit_argument }, /* Meta-- */ - { ISFUNC, rl_yank_last_arg}, /* Meta-. */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-/ */ - - /* Regular digits. */ - { ISFUNC, rl_digit_argument }, /* Meta-0 */ - { ISFUNC, rl_digit_argument }, /* Meta-1 */ - { ISFUNC, rl_digit_argument }, /* Meta-2 */ - { ISFUNC, rl_digit_argument }, /* Meta-3 */ - { ISFUNC, rl_digit_argument }, /* Meta-4 */ - { ISFUNC, rl_digit_argument }, /* Meta-5 */ - { ISFUNC, rl_digit_argument }, /* Meta-6 */ - { ISFUNC, rl_digit_argument }, /* Meta-7 */ - { ISFUNC, rl_digit_argument }, /* Meta-8 */ - { ISFUNC, rl_digit_argument }, /* Meta-9 */ - - /* A little more punctuation. */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-: */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-; */ - { ISFUNC, rl_beginning_of_history }, /* Meta-< */ - { ISFUNC, rl_possible_completions }, /* Meta-= */ - { ISFUNC, rl_end_of_history }, /* Meta-> */ - { ISFUNC, rl_possible_completions }, /* Meta-? */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-@ */ - - /* Uppercase alphabet. */ - { ISFUNC, rl_do_lowercase_version }, /* Meta-A */ - { ISFUNC, rl_do_lowercase_version }, /* Meta-B */ - { ISFUNC, rl_do_lowercase_version }, /* Meta-C */ - { ISFUNC, rl_do_lowercase_version }, /* Meta-D */ - { ISFUNC, rl_do_lowercase_version }, /* Meta-E */ - { ISFUNC, rl_do_lowercase_version }, /* Meta-F */ - { ISFUNC, rl_do_lowercase_version }, /* Meta-G */ - { ISFUNC, rl_do_lowercase_version }, /* Meta-H */ - { ISFUNC, rl_do_lowercase_version }, /* Meta-I */ - { ISFUNC, rl_do_lowercase_version }, /* Meta-J */ - { ISFUNC, rl_do_lowercase_version }, /* Meta-K */ - { ISFUNC, rl_do_lowercase_version }, /* Meta-L */ - { ISFUNC, rl_do_lowercase_version }, /* Meta-M */ - { ISFUNC, rl_do_lowercase_version }, /* Meta-N */ - { ISFUNC, rl_do_lowercase_version }, /* Meta-O */ - { ISFUNC, rl_do_lowercase_version }, /* Meta-P */ - { ISFUNC, rl_do_lowercase_version }, /* Meta-Q */ - { ISFUNC, rl_do_lowercase_version }, /* Meta-R */ - { ISFUNC, rl_do_lowercase_version }, /* Meta-S */ - { ISFUNC, rl_do_lowercase_version }, /* Meta-T */ - { ISFUNC, rl_do_lowercase_version }, /* Meta-U */ - { ISFUNC, rl_do_lowercase_version }, /* Meta-V */ - { ISFUNC, rl_do_lowercase_version }, /* Meta-W */ - { ISFUNC, rl_do_lowercase_version }, /* Meta-X */ - { ISFUNC, rl_do_lowercase_version }, /* Meta-Y */ - { ISFUNC, rl_do_lowercase_version }, /* Meta-Z */ - - /* Some more punctuation. */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-[ */ /* was rl_arrow_keys */ - { ISFUNC, rl_delete_horizontal_space }, /* Meta-\ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-] */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-^ */ - { ISFUNC, rl_yank_last_arg }, /* Meta-_ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-` */ - - /* Lowercase alphabet. */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-a */ - { ISFUNC, rl_backward_word }, /* Meta-b */ - { ISFUNC, rl_capitalize_word }, /* Meta-c */ - { ISFUNC, rl_kill_word }, /* Meta-d */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-e */ - { ISFUNC, rl_forward_word }, /* Meta-f */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-g */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-h */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-i */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-j */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-k */ - { ISFUNC, rl_downcase_word }, /* Meta-l */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-m */ - { ISFUNC, rl_noninc_forward_search }, /* Meta-n */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-o */ /* was rl_arrow_keys */ - { ISFUNC, rl_noninc_reverse_search }, /* Meta-p */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-q */ - { ISFUNC, rl_revert_line }, /* Meta-r */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-s */ - { ISFUNC, rl_transpose_words }, /* Meta-t */ - { ISFUNC, rl_upcase_word }, /* Meta-u */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-v */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-w */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-x */ - { ISFUNC, rl_yank_pop }, /* Meta-y */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-z */ - - /* Final punctuation. */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-{ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-| */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-} */ - { ISFUNC, rl_tilde_expand }, /* Meta-~ */ - { ISFUNC, rl_backward_kill_word }, /* Meta-rubout */ - -#if KEYMAP_SIZE > 128 - /* Undefined keys. */ - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 } -#endif /* KEYMAP_SIZE > 128 */ -}; - -KEYMAP_ENTRY_ARRAY emacs_ctlx_keymap = { - - /* Control keys. */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-@ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-a */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-b */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-c */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-d */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-e */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-f */ - { ISFUNC, rl_abort }, /* Control-g */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-h */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-i */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-j */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-k */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-l */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-m */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-n */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-o */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-p */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-q */ - { ISFUNC, rl_re_read_init_file }, /* Control-r */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-s */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-t */ - { ISFUNC, rl_undo_command }, /* Control-u */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-v */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-w */ - { ISFUNC, rl_exchange_point_and_mark }, /* Control-x */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-y */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-z */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-[ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-\ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-] */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-^ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-_ */ - - /* The start of printing characters. */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* SPACE */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* ! */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* " */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* # */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* $ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* % */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* & */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* ' */ - { ISFUNC, rl_start_kbd_macro }, /* ( */ - { ISFUNC, rl_end_kbd_macro }, /* ) */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* * */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* + */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* , */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* - */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* . */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* / */ - - /* Regular digits. */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* 0 */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* 1 */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* 2 */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* 3 */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* 4 */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* 5 */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* 6 */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* 7 */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* 8 */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* 9 */ - - /* A little more punctuation. */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* : */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* ; */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* < */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* = */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* > */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* ? */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* @ */ - - /* Uppercase alphabet. */ - { ISFUNC, rl_do_lowercase_version }, /* A */ - { ISFUNC, rl_do_lowercase_version }, /* B */ - { ISFUNC, rl_do_lowercase_version }, /* C */ - { ISFUNC, rl_do_lowercase_version }, /* D */ - { ISFUNC, rl_do_lowercase_version }, /* E */ - { ISFUNC, rl_do_lowercase_version }, /* F */ - { ISFUNC, rl_do_lowercase_version }, /* G */ - { ISFUNC, rl_do_lowercase_version }, /* H */ - { ISFUNC, rl_do_lowercase_version }, /* I */ - { ISFUNC, rl_do_lowercase_version }, /* J */ - { ISFUNC, rl_do_lowercase_version }, /* K */ - { ISFUNC, rl_do_lowercase_version }, /* L */ - { ISFUNC, rl_do_lowercase_version }, /* M */ - { ISFUNC, rl_do_lowercase_version }, /* N */ - { ISFUNC, rl_do_lowercase_version }, /* O */ - { ISFUNC, rl_do_lowercase_version }, /* P */ - { ISFUNC, rl_do_lowercase_version }, /* Q */ - { ISFUNC, rl_do_lowercase_version }, /* R */ - { ISFUNC, rl_do_lowercase_version }, /* S */ - { ISFUNC, rl_do_lowercase_version }, /* T */ - { ISFUNC, rl_do_lowercase_version }, /* U */ - { ISFUNC, rl_do_lowercase_version }, /* V */ - { ISFUNC, rl_do_lowercase_version }, /* W */ - { ISFUNC, rl_do_lowercase_version }, /* X */ - { ISFUNC, rl_do_lowercase_version }, /* Y */ - { ISFUNC, rl_do_lowercase_version }, /* Z */ - - /* Some more punctuation. */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* [ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* \ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* ] */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* ^ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* _ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* ` */ - - /* Lowercase alphabet. */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* a */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* b */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* c */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* d */ - { ISFUNC, rl_call_last_kbd_macro }, /* e */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* f */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* g */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* h */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* i */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* j */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* k */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* l */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* m */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* n */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* o */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* p */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* q */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* r */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* s */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* t */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* u */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* v */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* w */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* x */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* y */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* z */ - - /* Final punctuation. */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* { */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* | */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* } */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* ~ */ - { ISFUNC, rl_backward_kill_line }, /* RUBOUT */ - -#if KEYMAP_SIZE > 128 - /* Undefined keys. */ - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 } -#endif /* KEYMAP_SIZE > 128 */ -}; diff --git a/dep/src/readline/src/examples/Inputrc b/dep/src/readline/src/examples/Inputrc deleted file mode 100644 index d7fdb42efaa..00000000000 --- a/dep/src/readline/src/examples/Inputrc +++ /dev/null @@ -1,81 +0,0 @@ -# My ~/.inputrc file is in -*- text -*- for easy editing with Emacs. -# -# Notice the various bindings which are conditionalized depending -# on which program is running, or what terminal is active. -# - -# Copyright (C) 1989-2002 Free Software Foundation, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. - -# In all programs, all terminals, make sure this is bound. -"\C-x\C-r": re-read-init-file - -# Hp terminals (and some others) have ugly default behaviour for C-h. -"\C-h": backward-delete-char -"\e\C-h": backward-kill-word -"\C-xd": dump-functions - -# In xterm windows, make the arrow keys do the right thing. -$if TERM=xterm -"\e[A": previous-history -"\e[B": next-history -"\e[C": forward-char -"\e[D": backward-char - -# alternate arrow key prefix -"\eOA": previous-history -"\eOB": next-history -"\eOC": forward-char -"\eOD": backward-char - -# Under Xterm in Bash, we bind local Function keys to do something useful. -$if Bash -"\e[11~": "Function Key 1" -"\e[12~": "Function Key 2" -"\e[13~": "Function Key 3" -"\e[14~": "Function Key 4" -"\e[15~": "Function Key 5" - -# I know the following escape sequence numbers are 1 greater than -# the function key. Don't ask me why, I didn't design the xterm terminal. -"\e[17~": "Function Key 6" -"\e[18~": "Function Key 7" -"\e[19~": "Function Key 8" -"\e[20~": "Function Key 9" -"\e[21~": "Function Key 10" -$endif -$endif - -# For Bash, all terminals, add some Bash specific hacks. -$if Bash -"\C-xv": show-bash-version -"\C-x\C-e": shell-expand-line - -# Here is one for editing my path. -"\C-xp": "$PATH\C-x\C-e\C-e\"\C-aPATH=\":\C-b" - -# Make C-x r read my mail in emacs. -# "\C-xr": "emacs -f rmail\C-j" -$endif - -# For FTP, different hacks: -$if Ftp -"\C-xg": "get \M-?" -"\C-xt": "put \M-?" -"\M-.": yank-last-arg -$endif - -" ": self-insert diff --git a/dep/src/readline/src/examples/Makefile.in b/dep/src/readline/src/examples/Makefile.in deleted file mode 100644 index f1b24342b2a..00000000000 --- a/dep/src/readline/src/examples/Makefile.in +++ /dev/null @@ -1,104 +0,0 @@ -# -# This is the Makefile for the readline examples subdirectory. -# -# Copyright (C) 1994 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. -RL_LIBRARY_VERSION = @LIBVERSION@ - -SHELL = @MAKE_SHELL@ -RM = rm -f - -srcdir = @srcdir@ -VPATH = .:@srcdir@ -top_srcdir = @top_srcdir@ -BUILD_DIR = . - -# Support an alternate destination root directory for package building -DESTDIR = - -DEFS = @DEFS@ -CC = @CC@ -CFLAGS = @CFLAGS@ -LOCAL_CFLAGS = @LOCAL_CFLAGS@ -DREADLINE_LIBRARY -DRL_LIBRARY_VERSION='"$(RL_LIBRARY_VERSION)"' -CPPFLAGS = @CPPFLAGS@ - -INCLUDES = -I$(srcdir) -I$(top_srcdir) -I.. - -CCFLAGS = $(DEFS) $(LOCAL_CFLAGS) $(CPPFLAGS) $(INCLUDES) $(CFLAGS) -LDFLAGS = -g -L.. @LDFLAGS@ - -READLINE_LIB = ../libreadline.a -HISTORY_LIB = ../libhistory.a - -TERMCAP_LIB = @TERMCAP_LIB@ - -.c.o: - ${RM} $@ - $(CC) $(CCFLAGS) -c $< - -EXECUTABLES = fileman rltest rl rlcat rlversion histexamp -OBJECTS = fileman.o rltest.o rl.o rlcat.o rlversion.o histexamp.o - -all: $(EXECUTABLES) -everything: all rlfe - -rl: rl.o $(READLINE_LIB) - $(CC) $(LDFLAGS) -o $@ rl.o -lreadline $(TERMCAP_LIB) - -rlcat: rlcat.o $(READLINE_LIB) - $(CC) $(LDFLAGS) -o $@ rlcat.o -lreadline $(TERMCAP_LIB) - -fileman: fileman.o $(READLINE_LIB) - $(CC) $(LDFLAGS) -o $@ fileman.o -lreadline $(TERMCAP_LIB) - -rltest: rltest.o $(READLINE_LIB) - $(CC) $(LDFLAGS) -o $@ rltest.o -lreadline $(TERMCAP_LIB) - -rlversion: rlversion.o $(READLINE_LIB) - $(CC) $(LDFLAGS) -o $@ rlversion.o -lreadline $(TERMCAP_LIB) - -histexamp: histexamp.o $(HISTORY_LIB) - $(CC) $(LDFLAGS) -o $@ histexamp.o -lhistory $(TERMCAP_LIB) - -clean mostlyclean: - $(RM) $(OBJECTS) - $(RM) $(EXECUTABLES) *.exe - $(RM) rlfe.o rlfe - -distclean maintainer-clean: clean - $(RM) Makefile - -fileman.o: fileman.c -rltest.o: rltest.c -rl.o: rl.c -rlversion.o: rlversion.c -histexamp.o: histexamp.c - -fileman.o: $(top_srcdir)/readline.h -rltest.o: $(top_srcdir)/readline.h -rl.o: $(top_srcdir)/readline.h -rlversion.o: $(top_srcdir)/readline.h -histexamp.o: $(top_srcdir)/history.h - -# Stuff for Per Bothner's `rlfe' program - -rlfe: rlfe.o $(READLINE_LIB) $(HISTORY_LIB) - $(CC) $(LDFLAGS) -o $@ rlfe.o -lreadline -lhistory ${TERMCAP_LIB} - -rlfe.o: rlfe.c - -rlfe.o: $(top_srcdir)/readline.h -rlfe.o: $(top_srcdir)/history.h diff --git a/dep/src/readline/src/examples/excallback.c b/dep/src/readline/src/examples/excallback.c deleted file mode 100644 index 3d4bb189c69..00000000000 --- a/dep/src/readline/src/examples/excallback.c +++ /dev/null @@ -1,188 +0,0 @@ -/* -From: Jeff Solomon -Date: Fri, 9 Apr 1999 10:13:27 -0700 (PDT) -To: chet@po.cwru.edu -Subject: new readline example -Message-ID: <14094.12094.527305.199695@mrclean.Stanford.EDU> - -Chet, - -I've been using readline 4.0. Specifically, I've been using the perl -version Term::ReadLine::Gnu. It works great. - -Anyway, I've been playing around the alternate interface and I wanted -to contribute a little C program, callback.c, to you that you could -use as an example of the alternate interface in the /examples -directory of the readline distribution. - -My example shows how, using the alternate interface, you can -interactively change the prompt (which is very nice imo). Also, I -point out that you must roll your own terminal setting when using the -alternate interface because readline depreps (using your parlance) the -terminal while in the user callback. I try to demostrate what I mean -with an example. I've included the program below. - -To compile, I just put the program in the examples directory and made -the appropriate changes to the EXECUTABLES and OBJECTS line and added -an additional target 'callback'. - -I compiled on my Sun Solaris2.6 box using Sun's cc. - -Let me know what you think. - -Jeff -*/ - -#if defined (HAVE_CONFIG_H) -#include -#endif - -#include -#include - -#ifdef HAVE_UNISTD_H -#include -#endif - -#include /* xxx - should make this more general */ - -#ifdef READLINE_LIBRARY -# include "readline.h" -#else -# include -#endif - -/* This little examples demonstrates the alternate interface to using readline. - * In the alternate interface, the user maintains control over program flow and - * only calls readline when STDIN is readable. Using the alternate interface, - * you can do anything else while still using readline (like talking to a - * network or another program) without blocking. - * - * Specifically, this program highlights two importants features of the - * alternate interface. The first is the ability to interactively change the - * prompt, which can't be done using the regular interface since rl_prompt is - * read-only. - * - * The second feature really highlights a subtle point when using the alternate - * interface. That is, readline will not alter the terminal when inside your - * callback handler. So let's so, your callback executes a user command that - * takes a non-trivial amount of time to complete (seconds). While your - * executing the command, the user continues to type keystrokes and expects them - * to be re-echoed on the new prompt when it returns. Unfortunately, the default - * terminal configuration doesn't do this. After the prompt returns, the user - * must hit one additional keystroke and then will see all of his previous - * keystrokes. To illustrate this, compile and run this program. Type "sleep" at - * the prompt and then type "bar" before the prompt returns (you have 3 - * seconds). Notice how "bar" is re-echoed on the prompt after the prompt - * returns? This is what you expect to happen. Now comment out the 4 lines below - * the line that says COMMENT LINE BELOW. Recompile and rerun the program and do - * the same thing. When the prompt returns, you should not see "bar". Now type - * "f", see how "barf" magically appears? This behavior is un-expected and not - * desired. - */ - -void process_line(char *line); -int change_prompt(void); -char *get_prompt(void); - -int prompt = 1; -char prompt_buf[40], line_buf[256]; -tcflag_t old_lflag; -cc_t old_vtime; -struct termios term; - -int -main() -{ - fd_set fds; - - /* Adjust the terminal slightly before the handler is installed. Disable - * canonical mode processing and set the input character time flag to be - * non-blocking. - */ - if( tcgetattr(STDIN_FILENO, &term) < 0 ) { - perror("tcgetattr"); - exit(1); - } - old_lflag = term.c_lflag; - old_vtime = term.c_cc[VTIME]; - term.c_lflag &= ~ICANON; - term.c_cc[VTIME] = 1; - /* COMMENT LINE BELOW - see above */ - if( tcsetattr(STDIN_FILENO, TCSANOW, &term) < 0 ) { - perror("tcsetattr"); - exit(1); - } - - rl_add_defun("change-prompt", change_prompt, CTRL('t')); - rl_callback_handler_install(get_prompt(), process_line); - - while(1) { - FD_ZERO(&fds); - FD_SET(fileno(stdin), &fds); - - if( select(FD_SETSIZE, &fds, NULL, NULL, NULL) < 0) { - perror("select"); - exit(1); - } - - if( FD_ISSET(fileno(stdin), &fds) ) { - rl_callback_read_char(); - } - } -} - -void -process_line(char *line) -{ - if( line == NULL ) { - fprintf(stderr, "\n", line); - - /* reset the old terminal setting before exiting */ - term.c_lflag = old_lflag; - term.c_cc[VTIME] = old_vtime; - if( tcsetattr(STDIN_FILENO, TCSANOW, &term) < 0 ) { - perror("tcsetattr"); - exit(1); - } - exit(0); - } - - if( strcmp(line, "sleep") == 0 ) { - sleep(3); - } else { - fprintf(stderr, "|%s|\n", line); - } - - free (line); -} - -int -change_prompt(void) -{ - /* toggle the prompt variable */ - prompt = !prompt; - - /* save away the current contents of the line */ - strcpy(line_buf, rl_line_buffer); - - /* install a new handler which will change the prompt and erase the current line */ - rl_callback_handler_install(get_prompt(), process_line); - - /* insert the old text on the new line */ - rl_insert_text(line_buf); - - /* redraw the current line - this is an undocumented function. It invokes the - * redraw-current-line command. - */ - rl_refresh_line(0, 0); -} - -char * -get_prompt(void) -{ - /* The prompts can even be different lengths! */ - sprintf(prompt_buf, "%s", - prompt ? "Hit ctrl-t to toggle prompt> " : "Pretty cool huh?> "); - return prompt_buf; -} diff --git a/dep/src/readline/src/examples/fileman.c b/dep/src/readline/src/examples/fileman.c deleted file mode 100644 index 340eee739f6..00000000000 --- a/dep/src/readline/src/examples/fileman.c +++ /dev/null @@ -1,485 +0,0 @@ -/* Copyright (C) 1987-2002 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -/* fileman.c -- A tiny application which demonstrates how to use the - GNU Readline library. This application interactively allows users - to manipulate files and their modes. */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#ifdef HAVE_SYS_FILE_H -# include -#endif -#include - -#ifdef HAVE_UNISTD_H -# include -#endif - -#include -#include -#include - -#if defined (HAVE_STRING_H) -# include -#else /* !HAVE_STRING_H */ -# include -#endif /* !HAVE_STRING_H */ - -#ifdef HAVE_STDLIB_H -# include -#endif - -#ifdef READLINE_LIBRARY -# include "readline.h" -# include "history.h" -#else -# include -# include -#endif - -extern char *xmalloc (); - -/* The names of functions that actually do the manipulation. */ -int com_list PARAMS((char *)); -int com_view PARAMS((char *)); -int com_rename PARAMS((char *)); -int com_stat PARAMS((char *)); -int com_pwd PARAMS((char *)); -int com_delete PARAMS((char *)); -int com_help PARAMS((char *)); -int com_cd PARAMS((char *)); -int com_quit PARAMS((char *)); - -/* A structure which contains information on the commands this program - can understand. */ - -typedef struct { - char *name; /* User printable name of the function. */ - rl_icpfunc_t *func; /* Function to call to do the job. */ - char *doc; /* Documentation for this function. */ -} COMMAND; - -COMMAND commands[] = { - { "cd", com_cd, "Change to directory DIR" }, - { "delete", com_delete, "Delete FILE" }, - { "help", com_help, "Display this text" }, - { "?", com_help, "Synonym for `help'" }, - { "list", com_list, "List files in DIR" }, - { "ls", com_list, "Synonym for `list'" }, - { "pwd", com_pwd, "Print the current working directory" }, - { "quit", com_quit, "Quit using Fileman" }, - { "rename", com_rename, "Rename FILE to NEWNAME" }, - { "stat", com_stat, "Print out statistics on FILE" }, - { "view", com_view, "View the contents of FILE" }, - { (char *)NULL, (rl_icpfunc_t *)NULL, (char *)NULL } -}; - -/* Forward declarations. */ -char *stripwhite (); -COMMAND *find_command (); - -/* The name of this program, as taken from argv[0]. */ -char *progname; - -/* When non-zero, this global means the user is done using this program. */ -int done; - -char * -dupstr (s) - char *s; -{ - char *r; - - r = xmalloc (strlen (s) + 1); - strcpy (r, s); - return (r); -} - -main (argc, argv) - int argc; - char **argv; -{ - char *line, *s; - - progname = argv[0]; - - initialize_readline (); /* Bind our completer. */ - - /* Loop reading and executing lines until the user quits. */ - for ( ; done == 0; ) - { - line = readline ("FileMan: "); - - if (!line) - break; - - /* Remove leading and trailing whitespace from the line. - Then, if there is anything left, add it to the history list - and execute it. */ - s = stripwhite (line); - - if (*s) - { - add_history (s); - execute_line (s); - } - - free (line); - } - exit (0); -} - -/* Execute a command line. */ -int -execute_line (line) - char *line; -{ - register int i; - COMMAND *command; - char *word; - - /* Isolate the command word. */ - i = 0; - while (line[i] && whitespace (line[i])) - i++; - word = line + i; - - while (line[i] && !whitespace (line[i])) - i++; - - if (line[i]) - line[i++] = '\0'; - - command = find_command (word); - - if (!command) - { - fprintf (stderr, "%s: No such command for FileMan.\n", word); - return (-1); - } - - /* Get argument to command, if any. */ - while (whitespace (line[i])) - i++; - - word = line + i; - - /* Call the function. */ - return ((*(command->func)) (word)); -} - -/* Look up NAME as the name of a command, and return a pointer to that - command. Return a NULL pointer if NAME isn't a command name. */ -COMMAND * -find_command (name) - char *name; -{ - register int i; - - for (i = 0; commands[i].name; i++) - if (strcmp (name, commands[i].name) == 0) - return (&commands[i]); - - return ((COMMAND *)NULL); -} - -/* Strip whitespace from the start and end of STRING. Return a pointer - into STRING. */ -char * -stripwhite (string) - char *string; -{ - register char *s, *t; - - for (s = string; whitespace (*s); s++) - ; - - if (*s == 0) - return (s); - - t = s + strlen (s) - 1; - while (t > s && whitespace (*t)) - t--; - *++t = '\0'; - - return s; -} - -/* **************************************************************** */ -/* */ -/* Interface to Readline Completion */ -/* */ -/* **************************************************************** */ - -char *command_generator PARAMS((const char *, int)); -char **fileman_completion PARAMS((const char *, int, int)); - -/* Tell the GNU Readline library how to complete. We want to try to complete - on command names if this is the first word in the line, or on filenames - if not. */ -initialize_readline () -{ - /* Allow conditional parsing of the ~/.inputrc file. */ - rl_readline_name = "FileMan"; - - /* Tell the completer that we want a crack first. */ - rl_attempted_completion_function = fileman_completion; -} - -/* Attempt to complete on the contents of TEXT. START and END bound the - region of rl_line_buffer that contains the word to complete. TEXT is - the word to complete. We can use the entire contents of rl_line_buffer - in case we want to do some simple parsing. Return the array of matches, - or NULL if there aren't any. */ -char ** -fileman_completion (text, start, end) - const char *text; - int start, end; -{ - char **matches; - - matches = (char **)NULL; - - /* If this word is at the start of the line, then it is a command - to complete. Otherwise it is the name of a file in the current - directory. */ - if (start == 0) - matches = rl_completion_matches (text, command_generator); - - return (matches); -} - -/* Generator function for command completion. STATE lets us know whether - to start from scratch; without any state (i.e. STATE == 0), then we - start at the top of the list. */ -char * -command_generator (text, state) - const char *text; - int state; -{ - static int list_index, len; - char *name; - - /* If this is a new word to complete, initialize now. This includes - saving the length of TEXT for efficiency, and initializing the index - variable to 0. */ - if (!state) - { - list_index = 0; - len = strlen (text); - } - - /* Return the next name which partially matches from the command list. */ - while (name = commands[list_index].name) - { - list_index++; - - if (strncmp (name, text, len) == 0) - return (dupstr(name)); - } - - /* If no names matched, then return NULL. */ - return ((char *)NULL); -} - -/* **************************************************************** */ -/* */ -/* FileMan Commands */ -/* */ -/* **************************************************************** */ - -/* String to pass to system (). This is for the LIST, VIEW and RENAME - commands. */ -static char syscom[1024]; - -/* List the file(s) named in arg. */ -com_list (arg) - char *arg; -{ - if (!arg) - arg = ""; - - sprintf (syscom, "ls -FClg %s", arg); - return (system (syscom)); -} - -com_view (arg) - char *arg; -{ - if (!valid_argument ("view", arg)) - return 1; - -#if defined (__MSDOS__) - /* more.com doesn't grok slashes in pathnames */ - sprintf (syscom, "less %s", arg); -#else - sprintf (syscom, "more %s", arg); -#endif - return (system (syscom)); -} - -com_rename (arg) - char *arg; -{ - too_dangerous ("rename"); - return (1); -} - -com_stat (arg) - char *arg; -{ - struct stat finfo; - - if (!valid_argument ("stat", arg)) - return (1); - - if (stat (arg, &finfo) == -1) - { - perror (arg); - return (1); - } - - printf ("Statistics for `%s':\n", arg); - - printf ("%s has %d link%s, and is %d byte%s in length.\n", - arg, - finfo.st_nlink, - (finfo.st_nlink == 1) ? "" : "s", - finfo.st_size, - (finfo.st_size == 1) ? "" : "s"); - printf ("Inode Last Change at: %s", ctime (&finfo.st_ctime)); - printf (" Last access at: %s", ctime (&finfo.st_atime)); - printf (" Last modified at: %s", ctime (&finfo.st_mtime)); - return (0); -} - -com_delete (arg) - char *arg; -{ - too_dangerous ("delete"); - return (1); -} - -/* Print out help for ARG, or for all of the commands if ARG is - not present. */ -com_help (arg) - char *arg; -{ - register int i; - int printed = 0; - - for (i = 0; commands[i].name; i++) - { - if (!*arg || (strcmp (arg, commands[i].name) == 0)) - { - printf ("%s\t\t%s.\n", commands[i].name, commands[i].doc); - printed++; - } - } - - if (!printed) - { - printf ("No commands match `%s'. Possibilties are:\n", arg); - - for (i = 0; commands[i].name; i++) - { - /* Print in six columns. */ - if (printed == 6) - { - printed = 0; - printf ("\n"); - } - - printf ("%s\t", commands[i].name); - printed++; - } - - if (printed) - printf ("\n"); - } - return (0); -} - -/* Change to the directory ARG. */ -com_cd (arg) - char *arg; -{ - if (chdir (arg) == -1) - { - perror (arg); - return 1; - } - - com_pwd (""); - return (0); -} - -/* Print out the current working directory. */ -com_pwd (ignore) - char *ignore; -{ - char dir[1024], *s; - - s = getcwd (dir, sizeof(dir) - 1); - if (s == 0) - { - printf ("Error getting pwd: %s\n", dir); - return 1; - } - - printf ("Current directory is %s\n", dir); - return 0; -} - -/* The user wishes to quit using this program. Just set DONE non-zero. */ -com_quit (arg) - char *arg; -{ - done = 1; - return (0); -} - -/* Function which tells you that you can't do this. */ -too_dangerous (caller) - char *caller; -{ - fprintf (stderr, - "%s: Too dangerous for me to distribute. Write it yourself.\n", - caller); -} - -/* Return non-zero if ARG is a valid argument for CALLER, else print - an error message and return zero. */ -int -valid_argument (caller, arg) - char *caller, *arg; -{ - if (!arg || !*arg) - { - fprintf (stderr, "%s: Argument required.\n", caller); - return (0); - } - - return (1); -} diff --git a/dep/src/readline/src/examples/histexamp.c b/dep/src/readline/src/examples/histexamp.c deleted file mode 100644 index e875e6547bd..00000000000 --- a/dep/src/readline/src/examples/histexamp.c +++ /dev/null @@ -1,122 +0,0 @@ -/* Copyright (C) 1987-2002 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#include - -#ifdef READLINE_LIBRARY -# include "history.h" -#else -# include -#endif - -main (argc, argv) - int argc; - char **argv; -{ - char line[1024], *t; - int len, done; - - line[0] = 0; - done = 0; - - using_history (); - while (!done) - { - printf ("history$ "); - fflush (stdout); - t = fgets (line, sizeof (line) - 1, stdin); - if (t && *t) - { - len = strlen (t); - if (t[len - 1] == '\n') - t[len - 1] = '\0'; - } - - if (!t) - strcpy (line, "quit"); - - if (line[0]) - { - char *expansion; - int result; - - using_history (); - - result = history_expand (line, &expansion); - if (result) - fprintf (stderr, "%s\n", expansion); - - if (result < 0 || result == 2) - { - free (expansion); - continue; - } - - add_history (expansion); - strncpy (line, expansion, sizeof (line) - 1); - free (expansion); - } - - if (strcmp (line, "quit") == 0) - done = 1; - else if (strcmp (line, "save") == 0) - write_history ("history_file"); - else if (strcmp (line, "read") == 0) - read_history ("history_file"); - else if (strcmp (line, "list") == 0) - { - register HIST_ENTRY **the_list; - register int i; - time_t tt; - char timestr[128]; - - the_list = history_list (); - if (the_list) - for (i = 0; the_list[i]; i++) - { - tt = history_get_time (the_list[i]); - if (tt) - strftime (timestr, sizeof (timestr), "%a %R", localtime(&tt)); - else - strcpy (timestr, "??"); - printf ("%d: %s: %s\n", i + history_base, timestr, the_list[i]->line); - } - } - else if (strncmp (line, "delete", 6) == 0) - { - int which; - if ((sscanf (line + 6, "%d", &which)) == 1) - { - HIST_ENTRY *entry = remove_history (which); - if (!entry) - fprintf (stderr, "No such entry %d\n", which); - else - { - free (entry->line); - free (entry); - } - } - else - { - fprintf (stderr, "non-numeric arg given to `delete'\n"); - } - } - } -} diff --git a/dep/src/readline/src/examples/manexamp.c b/dep/src/readline/src/examples/manexamp.c deleted file mode 100644 index 9c6cf2c76c6..00000000000 --- a/dep/src/readline/src/examples/manexamp.c +++ /dev/null @@ -1,112 +0,0 @@ -/* manexamp.c -- The examples which appear in the documentation are here. */ - -/* Copyright (C) 1987-2002 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#include -#include - -/* **************************************************************** */ -/* */ -/* How to Emulate gets () */ -/* */ -/* **************************************************************** */ - -/* A static variable for holding the line. */ -static char *line_read = (char *)NULL; - -/* Read a string, and return a pointer to it. Returns NULL on EOF. */ -char * -rl_gets () -{ - /* If the buffer has already been allocated, return the memory - to the free pool. */ - if (line_read) - { - free (line_read); - line_read = (char *)NULL; - } - - /* Get a line from the user. */ - line_read = readline (""); - - /* If the line has any text in it, save it on the history. */ - if (line_read && *line_read) - add_history (line_read); - - return (line_read); -} - -/* **************************************************************** */ -/* */ -/* Writing a Function to be Called by Readline. */ -/* */ -/* **************************************************************** */ - -/* Invert the case of the COUNT following characters. */ -invert_case_line (count, key) - int count, key; -{ - register int start, end; - - start = rl_point; - - if (count < 0) - { - direction = -1; - count = -count; - } - else - direction = 1; - - /* Find the end of the range to modify. */ - end = start + (count * direction); - - /* Force it to be within range. */ - if (end > rl_end) - end = rl_end; - else if (end < 0) - end = -1; - - if (start > end) - { - int temp = start; - start = end; - end = temp; - } - - if (start == end) - return; - - /* Tell readline that we are modifying the line, so save the undo - information. */ - rl_modifying (start, end); - - for (; start != end; start += direction) - { - if (_rl_uppercase_p (rl_line_buffer[start])) - rl_line_buffer[start] = _rl_to_lower (rl_line_buffer[start]); - else if (_rl_lowercase_p (rl_line_buffer[start])) - rl_line_buffer[start] = _rl_to_upper (rl_line_buffer[start]); - } - - /* Move point to on top of the last character changed. */ - rl_point = end - direction; -} diff --git a/dep/src/readline/src/examples/readlinebuf.h b/dep/src/readline/src/examples/readlinebuf.h deleted file mode 100644 index a8af52cedf4..00000000000 --- a/dep/src/readline/src/examples/readlinebuf.h +++ /dev/null @@ -1,139 +0,0 @@ -/******************************************************************************* - * $Revision: 1.2 $ - * $Date: 2001/09/11 06:19:36 $ - * $Author: vyzo $ - * - * Contents: A streambuf which uses the GNU readline library for line I/O - * (c) 2001 by Dimitris Vyzovitis [vyzo@media.mit.edu] - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the Free - * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA - * - ******************************************************************************/ - -#ifndef _READLINEBUF_H_ -#define _READLINEBUF_H_ - -#include -#include -#include -#include -#include - -#include -#include - -#if (defined __GNUC__) && (__GNUC__ < 3) -#include -#else -#include -using std::streamsize; -using std::streambuf; -#endif - -class readlinebuf : public streambuf { -public: -#if (defined __GNUC__) && (__GNUC__ < 3) - typedef char char_type; - typedef int int_type; - typedef streampos pos_type; - typedef streamoff off_type; -#endif - static const int_type eof = EOF; // this is -1 - static const int_type not_eof = 0; - -private: - const char* prompt_; - bool history_; - char* line_; - int low_; - int high_; - -protected: - - virtual int_type showmanyc() const { return high_ - low_; } - - virtual streamsize xsgetn( char_type* buf, streamsize n ) { - int rd = n > (high_ - low_)? (high_ - low_) : n; - memcpy( buf, line_, rd ); - low_ += rd; - - if ( rd < n ) { - low_ = high_ = 0; - free( line_ ); // free( NULL ) is a noop - line_ = readline( prompt_ ); - if ( line_ ) { - high_ = strlen( line_ ); - if ( history_ && high_ ) add_history( line_ ); - rd += xsgetn( buf + rd, n - rd ); - } - } - - return rd; - } - - virtual int_type underflow() { - if ( high_ == low_ ) { - low_ = high_ = 0; - free( line_ ); // free( NULL ) is a noop - line_ = readline( prompt_ ); - if ( line_ ) { - high_ = strlen( line_ ); - if ( history_ && high_ ) add_history( line_ ); - } - } - - if ( low_ < high_ ) return line_[low_]; - else return eof; - } - - virtual int_type uflow() { - int_type c = underflow(); - if ( c != eof ) ++low_; - return c; - } - - virtual int_type pbackfail( int_type c = eof ) { - if ( low_ > 0 ) --low_; - else if ( c != eof ) { - if ( high_ > 0 ) { - char* nl = (char*)realloc( line_, high_ + 1 ); - if ( nl ) { - line_ = (char*)memcpy( nl + 1, line_, high_ ); - high_ += 1; - line_[0] = char( c ); - } else return eof; - } else { - assert( !line_ ); - line_ = (char*)malloc( sizeof( char ) ); - *line_ = char( c ); - high_ = 1; - } - } else return eof; - - return not_eof; - } - -public: - readlinebuf( const char* prompt = NULL, bool history = true ) - : prompt_( prompt ), history_( history ), - line_( NULL ), low_( 0 ), high_( 0 ) { - setbuf( 0, 0 ); - } - - -}; - -#endif diff --git a/dep/src/readline/src/examples/rl-fgets.c b/dep/src/readline/src/examples/rl-fgets.c deleted file mode 100644 index 5512b94ab23..00000000000 --- a/dep/src/readline/src/examples/rl-fgets.c +++ /dev/null @@ -1,374 +0,0 @@ -/* -Date: Tue, 16 Mar 2004 19:38:40 -0800 -From: Harold Levy -Subject: fgets(stdin) --> readline() redirector -To: chet@po.cwru.edu - -Hi Chet, - -Here is something you may find useful enough to include in the readline -distribution. It is a shared library that redirects calls to fgets(stdin) -to readline() via LD_PRELOAD, and it supports a custom prompt and list of -command names. Many people have asked me for this file, so I thought I'd -pass it your way in hope of just including it with readline to begin with. - -Best Regards, - --Harold -*/ - -/****************************************************************************** -******************************************************************************* - - FILE NAME: fgets.c TARGET: libfgets.so - AUTHOR: Harold Levy VERSION: 1.0 - hlevy@synopsys.com - - ABSTRACT: Customize fgets() behavior via LD_PRELOAD in the following ways: - - -- If fgets(stdin) is called, redirect to GNU readline() to obtain - command-line editing, file-name completion, history, etc. - - -- A list of commands for command-name completion can be configured by - setting the environment-variable FGETS_COMMAND_FILE to a file containing - the list of commands to be used. - - -- Command-line editing with readline() works best when the prompt string - is known; you can set this with the FGETS_PROMPT environment variable. - - -- There special strings that libfgets will interpret as internal commands: - - _fgets_reset_ reset the command list - - _fgets_dump_ dump status - - _fgets_debug_ toggle debug messages - - HOW TO BUILD: Here are examples of how to build libfgets.so on various - platforms; you will have to add -I and -L flags to configure access to - the readline header and library files. - - (32-bit builds with gcc) - AIX: gcc -fPIC fgets.c -shared -o libfgets.so -lc -ldl -lreadline -ltermcap - HP-UX: gcc -fPIC fgets.c -shared -o libfgets.so -lc -ldld -lreadline - Linux: gcc -fPIC fgets.c -shared -o libfgets.so -lc -ldl -lreadline - SunOS: gcc -fPIC fgets.c -shared -o libfgets.so -lc -ldl -lgen -lreadline - - (64-bit builds without gcc) - SunOS: SUNWspro/bin/cc -D_LARGEFILE64_SOURCE=1 -xtarget=ultra -xarch=v9 \ - -KPIC fgets.c -Bdynamic -lc -ldl -lgen -ltermcap -lreadline - - HOW TO USE: Different operating systems have different levels of support - for the LD_PRELOAD concept. The generic method for 32-bit platforms is to - put libtermcap.so, libfgets.so, and libreadline.so (with absolute paths) - in the LD_PRELOAD environment variable, and to put their parent directories - in the LD_LIBRARY_PATH environment variable. Unfortunately there is no - generic method for 64-bit platforms; e.g. for 64-bit SunOS, you would have - to build both 32-bit and 64-bit libfgets and libreadline libraries, and - use the LD_FLAGS_32 and LD_FLAGS_64 environment variables with preload and - library_path configurations (a mix of 32-bit and 64-bit calls are made under - 64-bit SunOS). - - EXAMPLE WRAPPER: Here is an example shell script wrapper around the - program "foo" that uses fgets() for command-line input: - - #!/bin/csh - #### replace this with the libtermcap.so directory: - set dir1 = "/usr/lib" - #### replace this with the libfgets.so directory: - set dir2 = "/usr/fgets" - #### replace this with the libreadline.so directory: - set dir3 = "/usr/local/lib" - set lib1 = "${dir1}/libtermcap.so" - set lib2 = "${dir2}/libfgets.so" - set lib3 = "${dir3}/libreadline.so" - if ( "${?LD_PRELOAD}" ) then - setenv LD_PRELOAD "${lib1}:${lib2}:${lib3}:${LD_PRELOAD}" - else - setenv LD_PRELOAD "${lib1}:${lib2}:${lib3}" - endif - if ( "${?LD_LIBRARY_PATH}" ) then - setenv LD_LIBRARY_PATH "${dir1}:${dir2}:${dir3}:${LD_LIBRARY_PATH}" - else - setenv LD_LIBRARY_PATH "${dir1}:${dir2}:${dir3}" - endif - setenv FGETS_COMMAND_FILE "${dir2}/foo.commands" - setenv FGETS_PROMPT "foo> " - exec "foo" $* - - Copyright (C)2003-2004 Harold Levy. - - This code links to the GNU readline library, and as such is bound by the - terms of the GNU General Public License as published by the Free Software - Foundation, either version 2 or (at your option) any later version. - - The GNU General Public License is often shipped with GNU software, and is - generally kept in a file called COPYING or LICENSE. If you do not have a - copy of the license, write to the Free Software Foundation, 59 Temple Place, - Suite 330, Boston, MA 02111 USA. - - This program is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - details. - -******************************************************************************* -******************************************************************************/ - - - -#include -#include -#include -#include -#include - -#include -#include - - - -/* for dynamically connecting to the native fgets() */ -#if defined(RTLD_NEXT) -#define REAL_LIBC RTLD_NEXT -#else -#define REAL_LIBC ((void *) -1L) -#endif -typedef char * ( * fgets_t ) ( char * s, int n, FILE * stream ) ; - - - -/* private data */ -/* -- writeable data is stored in the shared library's data segment - -- every process that uses the shared library gets a private memory copy of - its entire data segment - -- static data in the shared library is not copied to the application - -- only read-only (i.e. 'const') data is stored in the shared library's - text segment -*/ -static char ** my_fgets_names = NULL ; -static int my_fgets_number_of_names = 0 ; -static int my_fgets_debug_flag = 0 ; - - - -/* invoked with _fgets_reset_ */ -static void -my_fgets_reset ( - void -) { - if ( my_fgets_names && (my_fgets_number_of_names > 0) ) { - int i ; - if ( my_fgets_debug_flag ) { - printf ( "libfgets: removing command list\n" ) ; - } - for ( i = 0 ; i < my_fgets_number_of_names ; i ++ ) { - if ( my_fgets_names[i] ) free ( my_fgets_names[i] ) ; - } - free ( my_fgets_names ) ; - } - my_fgets_names = NULL ; - my_fgets_number_of_names = 0 ; -} - - - -/* invoked with _fgets_dump_ */ -static void -my_fgets_dump ( - void -) { - char * s ; - printf ( "\n" ) ; - s = getenv ( "FGETS_PROMPT" ) ; - printf ( "FGETS_PROMPT = %s\n", s ? s : "" ) ; - s = getenv ( "FGETS_COMMAND_FILE" ) ; - printf ( "FGETS_COMMAND_FILE = %s\n", s ? s : "" ) ; - printf ( "debug flag = %d\n", my_fgets_debug_flag ) ; - printf ( "#commands = %d\n", my_fgets_number_of_names ) ; - if ( my_fgets_debug_flag ) { - if ( my_fgets_names && (my_fgets_number_of_names > 0) ) { - int i ; - for ( i = 0 ; i < my_fgets_number_of_names ; i ++ ) { - printf ( "%s\n", my_fgets_names[i] ) ; - } - } - } - printf ( "\n" ) ; -} - - - -/* invoked with _fgets_debug_ */ -static void -my_fgets_debug_toggle ( - void -) { - my_fgets_debug_flag = my_fgets_debug_flag ? 0 : 1 ; - if ( my_fgets_debug_flag ) { - printf ( "libfgets: debug flag = %d\n", my_fgets_debug_flag ) ; - } -} - - - -/* read the command list if needed, return the i-th name */ -static char * -my_fgets_lookup ( - int index -) { - if ( (! my_fgets_names) || (! my_fgets_number_of_names) ) { - char * fname ; - FILE * fp ; - fgets_t _fgets ; - int i ; - char buf1[256], buf2[256] ; - fname = getenv ( "FGETS_COMMAND_FILE" ) ; - if ( ! fname ) { - if ( my_fgets_debug_flag ) { - printf ( "libfgets: empty or unset FGETS_COMMAND_FILE\n" ) ; - } - return NULL ; - } - fp = fopen ( fname, "r" ) ; - if ( ! fp ) { - if ( my_fgets_debug_flag ) { - printf ( "libfgets: cannot open '%s' for reading\n", fname ) ; - } - return NULL ; - } - _fgets = (fgets_t) dlsym ( REAL_LIBC, "fgets" ) ; - if ( ! _fgets ) { - fprintf ( stderr, - "libfgets: failed to dynamically link to native fgets()\n" - ) ; - return NULL ; - } - for ( i = 0 ; _fgets(buf1,255,fp) ; i ++ ) ; - if ( ! i ) { fclose(fp) ; return NULL ; } - my_fgets_names = (char**) calloc ( i, sizeof(char*) ) ; - rewind ( fp ) ; - i = 0 ; - while ( _fgets(buf1,255,fp) ) { - buf1[255] = 0 ; - if ( 1 == sscanf(buf1,"%s",buf2) ) { - my_fgets_names[i] = strdup(buf2) ; - i ++ ; - } - } - fclose ( fp ) ; - my_fgets_number_of_names = i ; - if ( my_fgets_debug_flag ) { - printf ( "libfgets: successfully read %d commands\n", i ) ; - } - } - if ( index < my_fgets_number_of_names ) { - return my_fgets_names[index] ; - } else { - return NULL ; - } -} - - - -/* generate a list of partial name matches for readline() */ -static char * -my_fgets_generator ( - const char * text, - int state -) -{ - static int list_index, len ; - char * name ; - if ( ! state ) { - list_index = 0 ; - len = strlen ( text ) ; - } - while ( ( name = my_fgets_lookup(list_index) ) ) { - list_index ++ ; - if ( ! strncmp ( name, text, len ) ) { - return ( strdup ( name ) ) ; - } - } - return ( NULL ) ; -} - - - -/* partial name completion callback for readline() */ -static char ** -my_fgets_completion ( - const char * text, - int start, - int end -) -{ - char ** matches ; - matches = NULL ; - if ( ! start ) { - matches = rl_completion_matches ( text, my_fgets_generator ) ; - } - return ( matches ) ; -} - - - -/* fgets() intercept */ -char * -fgets ( - char * s, - int n, - FILE * stream -) -{ - if ( ! s ) return NULL ; - if ( stream == stdin ) { - char * prompt ; - char * my_fgets_line ; - rl_already_prompted = 1 ; - rl_attempted_completion_function = my_fgets_completion ; - rl_catch_signals = 1 ; - rl_catch_sigwinch = 1 ; - rl_set_signals () ; - prompt = getenv ( "FGETS_PROMPT" ) ; - for ( - my_fgets_line = 0 ; ! my_fgets_line ; my_fgets_line=readline(prompt) - ) ; - if ( ! strncmp(my_fgets_line, "_fgets_reset_", 13) ) { - my_fgets_reset () ; - free ( my_fgets_line ) ; - strcpy ( s, "\n" ) ; - return ( s ) ; - } - if ( ! strncmp(my_fgets_line, "_fgets_dump_", 12) ) { - my_fgets_dump () ; - free ( my_fgets_line ) ; - strcpy ( s, "\n" ) ; - return ( s ) ; - } - if ( ! strncmp(my_fgets_line, "_fgets_debug_", 13) ) { - my_fgets_debug_toggle () ; - free ( my_fgets_line ) ; - strcpy ( s, "\n" ) ; - return ( s ) ; - } - (void) strncpy ( s, my_fgets_line, n-1 ) ; - (void) strcat ( s, "\n" ) ; - if ( *my_fgets_line ) add_history ( my_fgets_line ) ; - free ( my_fgets_line ) ; - return ( s ) ; - } else { - static fgets_t _fgets ; - _fgets = (fgets_t) dlsym ( REAL_LIBC, "fgets" ) ; - if ( ! _fgets ) { - fprintf ( stderr, - "libfgets: failed to dynamically link to native fgets()\n" - ) ; - strcpy ( s, "\n" ) ; - return ( s ) ; - } - return ( - _fgets ( s, n, stream ) - ) ; - } -} diff --git a/dep/src/readline/src/examples/rl.c b/dep/src/readline/src/examples/rl.c deleted file mode 100644 index 08d01be9c6f..00000000000 --- a/dep/src/readline/src/examples/rl.c +++ /dev/null @@ -1,151 +0,0 @@ -/* - * rl - command-line interface to read a line from the standard input - * (or another fd) using readline. - * - * usage: rl [-p prompt] [-u unit] [-d default] [-n nchars] - */ - -/* Copyright (C) 1987-2002 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#include -#include -#include "posixstat.h" - -#if defined (READLINE_LIBRARY) -# include "readline.h" -# include "history.h" -#else -# include -# include -#endif - -extern int optind; -extern char *optarg; - -#if !defined (strchr) && !defined (__STDC__) && !defined (_WIN32) -extern char *strrchr(); -#endif - -static char *progname; -static char *deftext; - -static int -set_deftext () -{ - if (deftext) - { - rl_insert_text (deftext); - deftext = (char *)NULL; - rl_startup_hook = (rl_hook_func_t *)NULL; - } - return 0; -} - -static void -usage() -{ - fprintf (stderr, "%s: usage: %s [-p prompt] [-u unit] [-d default] [-n nchars]\n", - progname, progname); -} - -int -main (argc, argv) - int argc; - char **argv; -{ - char *temp, *prompt; - struct stat sb; - int opt, fd, nch; - FILE *ifp; - - progname = strrchr(argv[0], '/'); - if (progname == 0) - progname = argv[0]; - else - progname++; - - /* defaults */ - prompt = "readline$ "; - fd = nch = 0; - deftext = (char *)0; - - while ((opt = getopt(argc, argv, "p:u:d:n:")) != EOF) - { - switch (opt) - { - case 'p': - prompt = optarg; - break; - case 'u': - fd = atoi(optarg); - if (fd < 0) - { - fprintf (stderr, "%s: bad file descriptor `%s'\n", progname, optarg); - exit (2); - } - break; - case 'd': - deftext = optarg; - break; - case 'n': - nch = atoi(optarg); - if (nch < 0) - { - fprintf (stderr, "%s: bad value for -n: `%s'\n", progname, optarg); - exit (2); - } - break; - default: - usage (); - exit (2); - } - } - - if (fd != 0) - { - if (fstat (fd, &sb) < 0) - { - fprintf (stderr, "%s: %d: bad file descriptor\n", progname, fd); - exit (1); - } - ifp = fdopen (fd, "r"); - rl_instream = ifp; - } - - if (deftext && *deftext) - rl_startup_hook = set_deftext; - - if (nch > 0) - rl_num_chars_to_read = nch; - - temp = readline (prompt); - - /* Test for EOF. */ - if (temp == 0) - exit (1); - - printf ("%s\n", temp); - exit (0); -} diff --git a/dep/src/readline/src/examples/rlcat.c b/dep/src/readline/src/examples/rlcat.c deleted file mode 100644 index 176b9f44b68..00000000000 --- a/dep/src/readline/src/examples/rlcat.c +++ /dev/null @@ -1,174 +0,0 @@ -/* - * rlcat - cat(1) using readline - * - * usage: rlcat - */ - -/* Copyright (C) 1987-2002 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#ifdef HAVE_UNISTD_H -# include -#endif - -#include -#include "posixstat.h" - -#include -#include -#include -#include - -#ifndef errno -extern int errno; -#endif - -#if defined (READLINE_LIBRARY) -# include "readline.h" -# include "history.h" -#else -# include -# include -#endif - -extern int optind; -extern char *optarg; - -static int stdcat(); - -static char *progname; -static int vflag; - -static void -usage() -{ - fprintf (stderr, "%s: usage: %s [-vEVN] [filename]\n", progname, progname); -} - -int -main (argc, argv) - int argc; - char **argv; -{ - char *temp; - int opt, Vflag, Nflag; - - progname = strrchr(argv[0], '/'); - if (progname == 0) - progname = argv[0]; - else - progname++; - - vflag = Vflag = Nflag = 0; - while ((opt = getopt(argc, argv, "vEVN")) != EOF) - { - switch (opt) - { - case 'v': - vflag = 1; - break; - case 'V': - Vflag = 1; - break; - case 'E': - Vflag = 0; - break; - case 'N': - Nflag = 1; - break; - default: - usage (); - exit (2); - } - } - - argc -= optind; - argv += optind; - - if (isatty(0) == 0 || argc || Nflag) - return stdcat(argc, argv); - - rl_variable_bind ("editing-mode", Vflag ? "vi" : "emacs"); - while (temp = readline ("")) - { - if (*temp) - add_history (temp); - printf ("%s\n", temp); - } - - return (ferror (stdout)); -} - -static int -fcopy(fp) - FILE *fp; -{ - int c; - char *x; - - while ((c = getc(fp)) != EOF) - { - if (vflag && isascii ((unsigned char)c) && isprint((unsigned char)c) == 0) - { - x = rl_untranslate_keyseq (c); - if (fputs (x, stdout) != 0) - return 1; - } - else if (putchar (c) == EOF) - return 1; - } - return (ferror (stdout)); -} - -int -stdcat (argc, argv) - int argc; - char **argv; -{ - int i, fd, r; - char *s; - FILE *fp; - - if (argc == 0) - return (fcopy(stdin)); - - for (i = 0, r = 1; i < argc; i++) - { - if (*argv[i] == '-' && argv[i][1] == 0) - fp = stdin; - else - { - fp = fopen (argv[i], "r"); - if (fp == 0) - { - fprintf (stderr, "%s: %s: cannot open: %s\n", progname, argv[i], strerror(errno)); - continue; - } - } - r = fcopy (fp); - if (fp != stdin) - fclose(fp); - } - return r; -} diff --git a/dep/src/readline/src/examples/rlfe.c b/dep/src/readline/src/examples/rlfe.c deleted file mode 100644 index d634d7ce878..00000000000 --- a/dep/src/readline/src/examples/rlfe.c +++ /dev/null @@ -1,1042 +0,0 @@ -/* A front-end using readline to "cook" input lines for Kawa. - * - * Copyright (C) 1999 Per Bothner - * - * This front-end program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * Some code from Johnson & Troan: "Linux Application Development" - * (Addison-Wesley, 1998) was used directly or for inspiration. - */ - -/* PROBLEMS/TODO: - * - * Only tested under Linux; needs to be ported. - * - * When running mc -c under the Linux console, mc does not recognize - * mouse clicks, which mc does when not running under fep. - * - * Pasting selected text containing tabs is like hitting the tab character, - * which invokes readline completion. We don't want this. I don't know - * if this is fixable without integrating fep into a terminal emulator. - * - * Echo suppression is a kludge, but can only be avoided with better kernel - * support: We need a tty mode to disable "real" echoing, while still - * letting the inferior think its tty driver to doing echoing. - * Stevens's book claims SCR$ and BSD4.3+ have TIOCREMOTE. - * - * The latest readline may have some hooks we can use to avoid having - * to back up the prompt. - * - * Desirable readline feature: When in cooked no-echo mode (e.g. password), - * echo characters are they are types with '*', but remove them when done. - * - * A synchronous output while we're editing an input line should be - * inserted in the output view *before* the input line, so that the - * lines being edited (with the prompt) float at the end of the input. - * - * A "page mode" option to emulate more/less behavior: At each page of - * output, pause for a user command. This required parsing the output - * to keep track of line lengths. It also requires remembering the - * output, if we want an option to scroll back, which suggests that - * this should be integrated with a terminal emulator like xterm. - */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef READLINE_LIBRARY -# include "readline.h" -# include "history.h" -#else -# include -# include -#endif - -#ifndef COMMAND -#define COMMAND "/bin/sh" -#endif -#ifndef COMMAND_ARGS -#define COMMAND_ARGS COMMAND -#endif - -#ifndef HAVE_MEMMOVE -#ifndef memmove -# if __GNUC__ > 1 -# define memmove(d, s, n) __builtin_memcpy(d, s, n) -# else -# define memmove(d, s, n) memcpy(d, s, n) -# endif -#else -# define memmove(d, s, n) memcpy(d, s, n) -#endif -#endif - -#define APPLICATION_NAME "Rlfe" - -#ifndef errno -extern int errno; -#endif - -extern int optind; -extern char *optarg; - -static char *progname; -static char *progversion; - -static int in_from_inferior_fd; -static int out_to_inferior_fd; - -/* Unfortunately, we cannot safely display echo from the inferior process. - The reason is that the echo bit in the pty is "owned" by the inferior, - and if we try to turn it off, we could confuse the inferior. - Thus, when echoing, we get echo twice: First readline echoes while - we're actually editing. Then we send the line to the inferior, and the - terminal driver send back an extra echo. - The work-around is to remember the input lines, and when we see that - line come back, we supress the output. - A better solution (supposedly available on SVR4) would be a smarter - terminal driver, with more flags ... */ -#define ECHO_SUPPRESS_MAX 1024 -char echo_suppress_buffer[ECHO_SUPPRESS_MAX]; -int echo_suppress_start = 0; -int echo_suppress_limit = 0; - -/* #define DEBUG */ - -static FILE *logfile = NULL; - -#ifdef DEBUG -FILE *debugfile = NULL; -#define DPRINT0(FMT) (fprintf(debugfile, FMT), fflush(debugfile)) -#define DPRINT1(FMT, V1) (fprintf(debugfile, FMT, V1), fflush(debugfile)) -#define DPRINT2(FMT, V1, V2) (fprintf(debugfile, FMT, V1, V2), fflush(debugfile)) -#else -#define DPRINT0(FMT) /* Do nothing */ -#define DPRINT1(FMT, V1) /* Do nothing */ -#define DPRINT2(FMT, V1, V2) /* Do nothing */ -#endif - -struct termios orig_term; - -static int rlfe_directory_completion_hook __P((char **)); -static int rlfe_directory_rewrite_hook __P((char **)); -static char *rlfe_filename_completion_function __P((const char *, int)); - -/* Pid of child process. */ -static pid_t child = -1; - -static void -sig_child (int signo) -{ - int status; - wait (&status); - DPRINT0 ("(Child process died.)\n"); - tcsetattr(STDIN_FILENO, TCSANOW, &orig_term); - exit (0); -} - -volatile int propagate_sigwinch = 0; - -/* sigwinch_handler - * propagate window size changes from input file descriptor to - * master side of pty. - */ -void sigwinch_handler(int signal) { - propagate_sigwinch = 1; -} - -/* get_master_pty() takes a double-indirect character pointer in which - * to put a slave name, and returns an integer file descriptor. - * If it returns < 0, an error has occurred. - * Otherwise, it has returned the master pty file descriptor, and fills - * in *name with the name of the corresponding slave pty. - * Once the slave pty has been opened, you are responsible to free *name. - */ - -int get_master_pty(char **name) { - int i, j; - /* default to returning error */ - int master = -1; - - /* create a dummy name to fill in */ - *name = strdup("/dev/ptyXX"); - - /* search for an unused pty */ - for (i=0; i<16 && master <= 0; i++) { - for (j=0; j<16 && master <= 0; j++) { - (*name)[5] = 'p'; - (*name)[8] = "pqrstuvwxyzPQRST"[i]; - (*name)[9] = "0123456789abcdef"[j]; - /* open the master pty */ - if ((master = open(*name, O_RDWR)) < 0) { - if (errno == ENOENT) { - /* we are out of pty devices */ - free (*name); - return (master); - } - } - else { - /* By substituting a letter, we change the master pty - * name into the slave pty name. - */ - (*name)[5] = 't'; - if (access(*name, R_OK|W_OK) != 0) - { - close(master); - master = -1; - } - } - } - } - if ((master < 0) && (i == 16) && (j == 16)) { - /* must have tried every pty unsuccessfully */ - free (*name); - return (master); - } - - (*name)[5] = 't'; - - return (master); -} - -/* get_slave_pty() returns an integer file descriptor. - * If it returns < 0, an error has occurred. - * Otherwise, it has returned the slave file descriptor. - */ - -int get_slave_pty(char *name) { - struct group *gptr; - gid_t gid; - int slave = -1; - - /* chown/chmod the corresponding pty, if possible. - * This will only work if the process has root permissions. - * Alternatively, write and exec a small setuid program that - * does just this. - */ - if ((gptr = getgrnam("tty")) != 0) { - gid = gptr->gr_gid; - } else { - /* if the tty group does not exist, don't change the - * group on the slave pty, only the owner - */ - gid = -1; - } - - /* Note that we do not check for errors here. If this is code - * where these actions are critical, check for errors! - */ - chown(name, getuid(), gid); - /* This code only makes the slave read/writeable for the user. - * If this is for an interactive shell that will want to - * receive "write" and "wall" messages, OR S_IWGRP into the - * second argument below. - */ - chmod(name, S_IRUSR|S_IWUSR); - - /* open the corresponding slave pty */ - slave = open(name, O_RDWR); - return (slave); -} - -/* Certain special characters, such as ctrl/C, we want to pass directly - to the inferior, rather than letting readline handle them. */ - -static char special_chars[20]; -static int special_chars_count; - -static void -add_special_char(int ch) -{ - if (ch != 0) - special_chars[special_chars_count++] = ch; -} - -static int eof_char; - -static int -is_special_char(int ch) -{ - int i; -#if 0 - if (ch == eof_char && rl_point == rl_end) - return 1; -#endif - for (i = special_chars_count; --i >= 0; ) - if (special_chars[i] == ch) - return 1; - return 0; -} - -static char buf[1024]; -/* buf[0 .. buf_count-1] is the what has been emitted on the current line. - It is used as the readline prompt. */ -static int buf_count = 0; - -int num_keys = 0; - -static void -null_prep_terminal (int meta) -{ -} - -static void -null_deprep_terminal () -{ -} - -char pending_special_char; - -static void -line_handler (char *line) -{ - if (line == NULL) - { - char buf[1]; - DPRINT0("saw eof!\n"); - buf[0] = '\004'; /* ctrl/d */ - write (out_to_inferior_fd, buf, 1); - } - else - { - static char enter[] = "\r"; - /* Send line to inferior: */ - int length = strlen (line); - if (length > ECHO_SUPPRESS_MAX-2) - { - echo_suppress_start = 0; - echo_suppress_limit = 0; - } - else - { - if (echo_suppress_limit + length > ECHO_SUPPRESS_MAX - 2) - { - if (echo_suppress_limit - echo_suppress_start + length - <= ECHO_SUPPRESS_MAX - 2) - { - memmove (echo_suppress_buffer, - echo_suppress_buffer + echo_suppress_start, - echo_suppress_limit - echo_suppress_start); - echo_suppress_limit -= echo_suppress_start; - echo_suppress_start = 0; - } - else - { - echo_suppress_limit = 0; - } - echo_suppress_start = 0; - } - memcpy (echo_suppress_buffer + echo_suppress_limit, - line, length); - echo_suppress_limit += length; - echo_suppress_buffer[echo_suppress_limit++] = '\r'; - echo_suppress_buffer[echo_suppress_limit++] = '\n'; - } - write (out_to_inferior_fd, line, length); - if (pending_special_char == 0) - { - write (out_to_inferior_fd, enter, sizeof(enter)-1); - if (*line) - add_history (line); - } - free (line); - } - rl_callback_handler_remove (); - buf_count = 0; - num_keys = 0; - if (pending_special_char != 0) - { - write (out_to_inferior_fd, &pending_special_char, 1); - pending_special_char = 0; - } -} - -/* Value of rl_getc_function. - Use this because readline should read from stdin, not rl_instream, - points to the pty (so readline has monitor its terminal modes). */ - -int -my_rl_getc (FILE *dummy) -{ - int ch = rl_getc (stdin); - if (is_special_char (ch)) - { - pending_special_char = ch; - return '\r'; - } - return ch; -} - -static void -usage() -{ - fprintf (stderr, "%s: usage: %s [-l filename] [-a] [-n appname] [-hv] [command [arguments...]]\n", - progname, progname); -} - -int -main(int argc, char** argv) -{ - char *path; - int i, append; - int master; - char *name, *logfname, *appname; - int in_from_tty_fd; - struct sigaction act; - struct winsize ws; - struct termios t; - int maxfd; - fd_set in_set; - static char empty_string[1] = ""; - char *prompt = empty_string; - int ioctl_err = 0; - - if ((progname = strrchr (argv[0], '/')) == 0) - progname = argv[0]; - else - progname++; - progversion = RL_LIBRARY_VERSION; - - append = 0; - appname = APPLICATION_NAME; - logfname = (char *)NULL; - - while ((i = getopt (argc, argv, "ahl:n:v")) != EOF) - { - switch (i) - { - case 'l': - logfname = optarg; - break; - case 'n': - appname = optarg; - break; - case 'a': - append = 1; - break; - case 'h': - usage (); - exit (0); - case 'v': - fprintf (stderr, "%s version %s\n", progname, progversion); - exit (0); - default: - usage (); - exit (2); - } - } - - argc -= optind; - argv += optind; - - if (logfname) - { - logfile = fopen (logfname, append ? "a" : "w"); - if (logfile == 0) - fprintf (stderr, "%s: warning: could not open log file %s: %s\n", - progname, logfname, strerror (errno)); - } - - rl_readline_name = appname; - -#ifdef DEBUG - debugfile = fopen("LOG", "w"); -#endif - - if ((master = get_master_pty(&name)) < 0) - { - perror("ptypair: could not open master pty"); - exit(1); - } - - DPRINT1("pty name: '%s'\n", name); - - /* set up SIGWINCH handler */ - act.sa_handler = sigwinch_handler; - sigemptyset(&(act.sa_mask)); - act.sa_flags = 0; - if (sigaction(SIGWINCH, &act, NULL) < 0) - { - perror("ptypair: could not handle SIGWINCH "); - exit(1); - } - - if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) < 0) - { - perror("ptypair: could not get window size"); - exit(1); - } - - if ((child = fork()) < 0) - { - perror("cannot fork"); - exit(1); - } - - if (child == 0) - { - int slave; /* file descriptor for slave pty */ - - /* We are in the child process */ - close(master); - -#ifdef TIOCSCTTY - if ((slave = get_slave_pty(name)) < 0) - { - perror("ptypair: could not open slave pty"); - exit(1); - } - free(name); -#endif - - /* We need to make this process a session group leader, because - * it is on a new PTY, and things like job control simply will - * not work correctly unless there is a session group leader - * and process group leader (which a session group leader - * automatically is). This also disassociates us from our old - * controlling tty. - */ - if (setsid() < 0) - { - perror("could not set session leader"); - } - - /* Tie us to our new controlling tty. */ -#ifdef TIOCSCTTY - if (ioctl(slave, TIOCSCTTY, NULL)) - { - perror("could not set new controlling tty"); - } -#else - if ((slave = get_slave_pty(name)) < 0) - { - perror("ptypair: could not open slave pty"); - exit(1); - } - free(name); -#endif - - /* make slave pty be standard in, out, and error */ - dup2(slave, STDIN_FILENO); - dup2(slave, STDOUT_FILENO); - dup2(slave, STDERR_FILENO); - - /* at this point the slave pty should be standard input */ - if (slave > 2) - { - close(slave); - } - - /* Try to restore window size; failure isn't critical */ - if (ioctl(STDOUT_FILENO, TIOCSWINSZ, &ws) < 0) - { - perror("could not restore window size"); - } - - /* now start the shell */ - { - static char* command_args[] = { COMMAND_ARGS, NULL }; - if (argc < 1) - execvp(COMMAND, command_args); - else - execvp(argv[0], &argv[0]); - } - - /* should never be reached */ - exit(1); - } - - /* parent */ - signal (SIGCHLD, sig_child); - free(name); - - /* Note that we only set termios settings for standard input; - * the master side of a pty is NOT a tty. - */ - tcgetattr(STDIN_FILENO, &orig_term); - - t = orig_term; - eof_char = t.c_cc[VEOF]; - /* add_special_char(t.c_cc[VEOF]);*/ - add_special_char(t.c_cc[VINTR]); - add_special_char(t.c_cc[VQUIT]); - add_special_char(t.c_cc[VSUSP]); -#if defined (VDISCARD) - add_special_char(t.c_cc[VDISCARD]); -#endif - -#if 0 - t.c_lflag |= (ICANON | ISIG | ECHO | ECHOCTL | ECHOE | \ - ECHOK | ECHOKE | ECHONL | ECHOPRT ); -#else - t.c_lflag &= ~(ICANON | ISIG | ECHO | ECHOCTL | ECHOE | \ - ECHOK | ECHOKE | ECHONL | ECHOPRT ); -#endif - t.c_iflag |= IGNBRK; - t.c_cc[VMIN] = 1; - t.c_cc[VTIME] = 0; - tcsetattr(STDIN_FILENO, TCSANOW, &t); - in_from_inferior_fd = master; - out_to_inferior_fd = master; - rl_instream = fdopen (master, "r"); - rl_getc_function = my_rl_getc; - - rl_prep_term_function = null_prep_terminal; - rl_deprep_term_function = null_deprep_terminal; - rl_callback_handler_install (prompt, line_handler); - -#if 1 - rl_directory_completion_hook = rlfe_directory_completion_hook; - rl_completion_entry_function = rlfe_filename_completion_function; -#else - rl_directory_rewrite_hook = rlfe_directory_rewrite_hook; -#endif - - in_from_tty_fd = STDIN_FILENO; - FD_ZERO (&in_set); - maxfd = in_from_inferior_fd > in_from_tty_fd ? in_from_inferior_fd - : in_from_tty_fd; - for (;;) - { - int num; - FD_SET (in_from_inferior_fd, &in_set); - FD_SET (in_from_tty_fd, &in_set); - - num = select(maxfd+1, &in_set, NULL, NULL, NULL); - - if (propagate_sigwinch) - { - struct winsize ws; - if (ioctl (STDIN_FILENO, TIOCGWINSZ, &ws) >= 0) - { - ioctl (master, TIOCSWINSZ, &ws); - } - propagate_sigwinch = 0; - continue; - } - - if (num <= 0) - { - perror ("select"); - exit (-1); - } - if (FD_ISSET (in_from_tty_fd, &in_set)) - { - extern int readline_echoing_p; - struct termios term_master; - int do_canon = 1; - int ioctl_ret; - - DPRINT1("[tty avail num_keys:%d]\n", num_keys); - - /* If we can't get tty modes for the master side of the pty, we - can't handle non-canonical-mode programs. Always assume the - master is in canonical echo mode if we can't tell. */ - ioctl_ret = tcgetattr(master, &term_master); - - if (ioctl_ret >= 0) - { - DPRINT2 ("echo:%d, canon:%d\n", - (term_master.c_lflag & ECHO) != 0, - (term_master.c_lflag & ICANON) != 0); - do_canon = (term_master.c_lflag & ICANON) != 0; - readline_echoing_p = (term_master.c_lflag & ECHO) != 0; - } - else - { - if (ioctl_err == 0) - DPRINT1("tcgetattr on master fd failed: errno = %d\n", errno); - ioctl_err = 1; - } - - if (do_canon == 0 && num_keys == 0) - { - char ch[10]; - int count = read (STDIN_FILENO, ch, sizeof(ch)); - write (out_to_inferior_fd, ch, count); - } - else - { - if (num_keys == 0) - { - int i; - /* Re-install callback handler for new prompt. */ - if (prompt != empty_string) - free (prompt); - prompt = malloc (buf_count + 1); - if (prompt == NULL) - prompt = empty_string; - else - { - memcpy (prompt, buf, buf_count); - prompt[buf_count] = '\0'; - DPRINT1("New prompt '%s'\n", prompt); -#if 0 /* ifdef HAVE_RL_ALREADY_PROMPTED -- doesn't work */ - rl_already_prompted = buf_count > 0; -#else - if (buf_count > 0) - write (1, "\r", 1); -#endif - } - rl_callback_handler_install (prompt, line_handler); - } - num_keys++; - rl_callback_read_char (); - } - } - else /* input from inferior. */ - { - int i; - int count; - int old_count; - if (buf_count > (sizeof(buf) >> 2)) - buf_count = 0; - count = read (in_from_inferior_fd, buf+buf_count, - sizeof(buf) - buf_count); - if (count <= 0) - { - DPRINT0 ("(Connection closed by foreign host.)\n"); - tcsetattr(STDIN_FILENO, TCSANOW, &orig_term); - exit (0); - } - old_count = buf_count; - - /* Do some minimal carriage return translation and backspace - processing before logging the input line. */ - if (logfile) - { -#ifndef __GNUC__ - char *b; -#else - char b[count + 1]; -#endif - int i, j; - -#ifndef __GNUC__ - b = malloc (count + 1); - if (b) { -#endif - for (i = 0; i < count; i++) - b[i] = buf[buf_count + i]; - b[i] = '\0'; - for (i = j = 0; i <= count; i++) - { - if (b[i] == '\r') - { - if (b[i+1] != '\n') - b[j++] = '\n'; - } - else if (b[i] == '\b') - { - if (i) - j--; - } - else - b[j++] = b[i]; - } - fprintf (logfile, "%s", b); - -#ifndef __GNUC__ - free (b); - } -#endif - } - - /* Look for any pending echo that we need to suppress. */ - while (echo_suppress_start < echo_suppress_limit - && count > 0 - && buf[buf_count] == echo_suppress_buffer[echo_suppress_start]) - { - count--; - buf_count++; - echo_suppress_start++; - } - - /* Write to the terminal anything that was not suppressed. */ - if (count > 0) - write (1, buf + buf_count, count); - - /* Finally, look for a prompt candidate. - * When we get around to going input (from the keyboard), - * we will consider the prompt to be anything since the last - * line terminator. So we need to save that text in the - * initial part of buf. However, anything before the - * most recent end-of-line is not interesting. */ - buf_count += count; -#if 1 - for (i = buf_count; --i >= old_count; ) -#else - for (i = buf_count - 1; i-- >= buf_count - count; ) -#endif - { - if (buf[i] == '\n' || buf[i] == '\r') - { - i++; - memmove (buf, buf+i, buf_count - i); - buf_count -= i; - break; - } - } - DPRINT2("-> i: %d, buf_count: %d\n", i, buf_count); - } - } -} - -/* - * - * FILENAME COMPLETION FOR RLFE - * - */ - -#ifndef PATH_MAX -# define PATH_MAX 1024 -#endif - -#define DIRSEP '/' -#define ISDIRSEP(x) ((x) == '/') -#define PATHSEP(x) (ISDIRSEP(x) || (x) == 0) - -#define DOT_OR_DOTDOT(x) \ - ((x)[0] == '.' && (PATHSEP((x)[1]) || \ - ((x)[1] == '.' && PATHSEP((x)[2])))) - -#define FREE(x) if (x) free(x) - -#define STRDUP(s, x) do { \ - s = strdup (x);\ - if (s == 0) \ - return ((char *)NULL); \ - } while (0) - -static int -get_inferior_cwd (path, psize) - char *path; - size_t psize; -{ - int n; - static char procfsbuf[PATH_MAX] = { '\0' }; - - if (procfsbuf[0] == '\0') - sprintf (procfsbuf, "/proc/%d/cwd", (int)child); - n = readlink (procfsbuf, path, psize); - if (n < 0) - return n; - if (n > psize) - return -1; - path[n] = '\0'; - return n; -} - -static int -rlfe_directory_rewrite_hook (dirnamep) - char **dirnamep; -{ - char *ldirname, cwd[PATH_MAX], *retdir, *ld; - int n, ldlen; - - ldirname = *dirnamep; - - if (*ldirname == '/') - return 0; - - n = get_inferior_cwd (cwd, sizeof(cwd) - 1); - if (n < 0) - return 0; - if (n == 0) /* current directory */ - { - cwd[0] = '.'; - cwd[1] = '\0'; - n = 1; - } - - /* Minimally canonicalize ldirname by removing leading `./' */ - for (ld = ldirname; *ld; ) - { - if (ISDIRSEP (ld[0])) - ld++; - else if (ld[0] == '.' && PATHSEP(ld[1])) - ld++; - else - break; - } - ldlen = (ld && *ld) ? strlen (ld) : 0; - - retdir = (char *)malloc (n + ldlen + 3); - if (retdir == 0) - return 0; - if (ldlen) - sprintf (retdir, "%s/%s", cwd, ld); - else - strcpy (retdir, cwd); - free (ldirname); - - *dirnamep = retdir; - - DPRINT1("rl_directory_rewrite_hook returns %s\n", retdir); - return 1; -} - -/* Translate *DIRNAMEP to be relative to the inferior's CWD. Leave a trailing - slash on the result. */ -static int -rlfe_directory_completion_hook (dirnamep) - char **dirnamep; -{ - char *ldirname, *retdir; - int n, ldlen; - - ldirname = *dirnamep; - - if (*ldirname == '/') - return 0; - - n = rlfe_directory_rewrite_hook (dirnamep); - if (n == 0) - return 0; - - ldirname = *dirnamep; - ldlen = (ldirname && *ldirname) ? strlen (ldirname) : 0; - - if (ldlen == 0 || ldirname[ldlen - 1] != '/') - { - retdir = (char *)malloc (ldlen + 3); - if (retdir == 0) - return 0; - if (ldlen) - strcpy (retdir, ldirname); - else - retdir[ldlen++] = '.'; - retdir[ldlen] = '/'; - retdir[ldlen+1] = '\0'; - free (ldirname); - - *dirnamep = retdir; - } - - DPRINT1("rl_directory_completion_hook returns %s\n", retdir); - return 1; -} - -static char * -rlfe_filename_completion_function (text, state) - const char *text; - int state; -{ - static DIR *directory; - static char *filename = (char *)NULL; - static char *dirname = (char *)NULL, *ud = (char *)NULL; - static int flen, udlen; - char *temp; - struct dirent *dentry; - - if (state == 0) - { - if (directory) - { - closedir (directory); - directory = 0; - } - FREE (dirname); - FREE (filename); - FREE (ud); - - if (text && *text) - STRDUP (filename, text); - else - { - filename = malloc(1); - if (filename == 0) - return ((char *)NULL); - filename[0] = '\0'; - } - dirname = (text && *text) ? strdup (text) : strdup ("."); - if (dirname == 0) - return ((char *)NULL); - - temp = strrchr (dirname, '/'); - if (temp) - { - strcpy (filename, ++temp); - *temp = '\0'; - } - else - { - dirname[0] = '.'; - dirname[1] = '\0'; - } - - STRDUP (ud, dirname); - udlen = strlen (ud); - - rlfe_directory_completion_hook (&dirname); - - directory = opendir (dirname); - flen = strlen (filename); - - rl_filename_completion_desired = 1; - } - - dentry = 0; - while (directory && (dentry = readdir (directory))) - { - if (flen == 0) - { - if (DOT_OR_DOTDOT(dentry->d_name) == 0) - break; - } - else - { - if ((dentry->d_name[0] == filename[0]) && - (strlen (dentry->d_name) >= flen) && - (strncmp (filename, dentry->d_name, flen) == 0)) - break; - } - } - - if (dentry == 0) - { - if (directory) - { - closedir (directory); - directory = 0; - } - FREE (dirname); - FREE (filename); - FREE (ud); - dirname = filename = ud = 0; - return ((char *)NULL); - } - - if (ud == 0 || (ud[0] == '.' && ud[1] == '\0')) - temp = strdup (dentry->d_name); - else - { - temp = malloc (1 + udlen + strlen (dentry->d_name)); - strcpy (temp, ud); - strcpy (temp + udlen, dentry->d_name); - } - return (temp); -} diff --git a/dep/src/readline/src/examples/rltest.c b/dep/src/readline/src/examples/rltest.c deleted file mode 100644 index 99f083b2b9c..00000000000 --- a/dep/src/readline/src/examples/rltest.c +++ /dev/null @@ -1,87 +0,0 @@ -/* **************************************************************** */ -/* */ -/* Testing Readline */ -/* */ -/* **************************************************************** */ - -/* Copyright (C) 1987-2002 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#if defined (HAVE_CONFIG_H) -#include -#endif - -#include -#include - -#ifdef READLINE_LIBRARY -# include "readline.h" -# include "history.h" -#else -# include -# include -#endif - -extern HIST_ENTRY **history_list (); - -main () -{ - char *temp, *prompt; - int done; - - temp = (char *)NULL; - prompt = "readline$ "; - done = 0; - - while (!done) - { - temp = readline (prompt); - - /* Test for EOF. */ - if (!temp) - exit (1); - - /* If there is anything on the line, print it and remember it. */ - if (*temp) - { - fprintf (stderr, "%s\r\n", temp); - add_history (temp); - } - - /* Check for `command' that we handle. */ - if (strcmp (temp, "quit") == 0) - done = 1; - - if (strcmp (temp, "list") == 0) - { - HIST_ENTRY **list; - register int i; - - list = history_list (); - if (list) - { - for (i = 0; list[i]; i++) - fprintf (stderr, "%d: %s\r\n", i, list[i]->line); - } - } - free (temp); - } - exit (0); -} diff --git a/dep/src/readline/src/examples/rlversion.c b/dep/src/readline/src/examples/rlversion.c deleted file mode 100644 index 53949d1e3b7..00000000000 --- a/dep/src/readline/src/examples/rlversion.c +++ /dev/null @@ -1,43 +0,0 @@ -/* - * rlversion -- print out readline's version number - */ - -/* Copyright (C) 1987-2002 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#include -#include -#include "posixstat.h" - -#ifdef READLINE_LIBRARY -# include "readline.h" -#else -# include -#endif - -main() -{ - printf ("%s\n", rl_library_version ? rl_library_version : "unknown"); - exit (0); -} diff --git a/dep/src/readline/src/funmap.c b/dep/src/readline/src/funmap.c deleted file mode 100644 index c68fa63a6b7..00000000000 --- a/dep/src/readline/src/funmap.c +++ /dev/null @@ -1,256 +0,0 @@ -/* funmap.c -- attach names to functions. */ - -/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ -#define READLINE_LIBRARY - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#if !defined (BUFSIZ) -#include -#endif /* BUFSIZ */ - -#if defined (HAVE_STDLIB_H) -# include -#else -# include "ansi_stdlib.h" -#endif /* HAVE_STDLIB_H */ - -#include "rlconf.h" -#include "readline.h" - -#include "xmalloc.h" - -#if defined (__STDC__) || defined (_WIN32) -typedef int QSFUNC (const void *, const void *); -#else -typedef int QSFUNC (); -#endif - -READLINE_DLL_IMPEXP int _rl_qsort_string_compare PARAMS((char **, char **)); - -FUNMAP **funmap; -static int funmap_size; -static int funmap_entry; - -/* After initializing the function map, this is the index of the first - program specific function. */ -int funmap_program_specific_entry_start; -#ifdef READLINE_DLL_IMPEXP -# undef READLINE_DLL_IMPEXP -#endif /* READLINE_DLL_IMPEXP */ -static FUNMAP default_funmap[] = { - { "abort", rl_abort }, - { "accept-line", rl_newline }, - { "arrow-key-prefix", rl_arrow_keys }, - { "backward-byte", rl_backward_byte }, - { "backward-char", rl_backward_char }, - { "backward-delete-char", rl_rubout }, - { "backward-kill-line", rl_backward_kill_line }, - { "backward-kill-word", rl_backward_kill_word }, - { "backward-word", rl_backward_word }, - { "beginning-of-history", rl_beginning_of_history }, - { "beginning-of-line", rl_beg_of_line }, - { "call-last-kbd-macro", rl_call_last_kbd_macro }, - { "capitalize-word", rl_capitalize_word }, - { "character-search", rl_char_search }, - { "character-search-backward", rl_backward_char_search }, - { "clear-screen", rl_clear_screen }, - { "complete", rl_complete }, - { "copy-backward-word", rl_copy_backward_word }, - { "copy-forward-word", rl_copy_forward_word }, - { "copy-region-as-kill", rl_copy_region_to_kill }, - { "delete-char", rl_delete }, - { "delete-char-or-list", rl_delete_or_show_completions }, - { "delete-horizontal-space", rl_delete_horizontal_space }, - { "digit-argument", rl_digit_argument }, - { "do-lowercase-version", rl_do_lowercase_version }, - { "downcase-word", rl_downcase_word }, - { "dump-functions", rl_dump_functions }, - { "dump-macros", rl_dump_macros }, - { "dump-variables", rl_dump_variables }, - { "emacs-editing-mode", rl_emacs_editing_mode }, - { "end-kbd-macro", rl_end_kbd_macro }, - { "end-of-history", rl_end_of_history }, - { "end-of-line", rl_end_of_line }, - { "exchange-point-and-mark", rl_exchange_point_and_mark }, - { "forward-backward-delete-char", rl_rubout_or_delete }, - { "forward-byte", rl_forward_byte }, - { "forward-char", rl_forward_char }, - { "forward-search-history", rl_forward_search_history }, - { "forward-word", rl_forward_word }, - { "history-search-backward", rl_history_search_backward }, - { "history-search-forward", rl_history_search_forward }, - { "insert-comment", rl_insert_comment }, - { "insert-completions", rl_insert_completions }, - { "kill-whole-line", rl_kill_full_line }, - { "kill-line", rl_kill_line }, - { "kill-region", rl_kill_region }, - { "kill-word", rl_kill_word }, - { "menu-complete", rl_menu_complete }, - { "next-history", rl_get_next_history }, - { "non-incremental-forward-search-history", rl_noninc_forward_search }, - { "non-incremental-reverse-search-history", rl_noninc_reverse_search }, - { "non-incremental-forward-search-history-again", rl_noninc_forward_search_again }, - { "non-incremental-reverse-search-history-again", rl_noninc_reverse_search_again }, - { "overwrite-mode", rl_overwrite_mode }, -#if defined (__CYGWIN__) || defined (_WIN32) - { "paste-from-clipboard", rl_paste_from_clipboard }, -#endif - { "possible-completions", rl_possible_completions }, - { "previous-history", rl_get_previous_history }, - { "quoted-insert", rl_quoted_insert }, - { "re-read-init-file", rl_re_read_init_file }, - { "redraw-current-line", rl_refresh_line}, - { "reverse-search-history", rl_reverse_search_history }, - { "revert-line", rl_revert_line }, - { "self-insert", rl_insert }, - { "set-mark", rl_set_mark }, - { "start-kbd-macro", rl_start_kbd_macro }, - { "tab-insert", rl_tab_insert }, - { "tilde-expand", rl_tilde_expand }, - { "transpose-chars", rl_transpose_chars }, - { "transpose-words", rl_transpose_words }, - { "tty-status", rl_tty_status }, - { "undo", rl_undo_command }, - { "universal-argument", rl_universal_argument }, - { "unix-filename-rubout", rl_unix_filename_rubout }, - { "unix-line-discard", rl_unix_line_discard }, - { "unix-word-rubout", rl_unix_word_rubout }, - { "upcase-word", rl_upcase_word }, - { "yank", rl_yank }, - { "yank-last-arg", rl_yank_last_arg }, - { "yank-nth-arg", rl_yank_nth_arg }, - { "yank-pop", rl_yank_pop }, - -#if defined (VI_MODE) - { "vi-append-eol", rl_vi_append_eol }, - { "vi-append-mode", rl_vi_append_mode }, - { "vi-arg-digit", rl_vi_arg_digit }, - { "vi-back-to-indent", rl_vi_back_to_indent }, - { "vi-bWord", rl_vi_bWord }, - { "vi-bword", rl_vi_bword }, - { "vi-change-case", rl_vi_change_case }, - { "vi-change-char", rl_vi_change_char }, - { "vi-change-to", rl_vi_change_to }, - { "vi-char-search", rl_vi_char_search }, - { "vi-column", rl_vi_column }, - { "vi-complete", rl_vi_complete }, - { "vi-delete", rl_vi_delete }, - { "vi-delete-to", rl_vi_delete_to }, - { "vi-eWord", rl_vi_eWord }, - { "vi-editing-mode", rl_vi_editing_mode }, - { "vi-end-word", rl_vi_end_word }, - { "vi-eof-maybe", rl_vi_eof_maybe }, - { "vi-eword", rl_vi_eword }, - { "vi-fWord", rl_vi_fWord }, - { "vi-fetch-history", rl_vi_fetch_history }, - { "vi-first-print", rl_vi_first_print }, - { "vi-fword", rl_vi_fword }, - { "vi-goto-mark", rl_vi_goto_mark }, - { "vi-insert-beg", rl_vi_insert_beg }, - { "vi-insertion-mode", rl_vi_insertion_mode }, - { "vi-match", rl_vi_match }, - { "vi-movement-mode", rl_vi_movement_mode }, - { "vi-next-word", rl_vi_next_word }, - { "vi-overstrike", rl_vi_overstrike }, - { "vi-overstrike-delete", rl_vi_overstrike_delete }, - { "vi-prev-word", rl_vi_prev_word }, - { "vi-put", rl_vi_put }, - { "vi-redo", rl_vi_redo }, - { "vi-replace", rl_vi_replace }, - { "vi-search", rl_vi_search }, - { "vi-search-again", rl_vi_search_again }, - { "vi-set-mark", rl_vi_set_mark }, - { "vi-subst", rl_vi_subst }, - { "vi-tilde-expand", rl_vi_tilde_expand }, - { "vi-yank-arg", rl_vi_yank_arg }, - { "vi-yank-to", rl_vi_yank_to }, -#endif /* VI_MODE */ - - {(char *)NULL, (rl_command_func_t *)NULL } -}; - -int -rl_add_funmap_entry (name, function) - const char *name; - rl_command_func_t *function; -{ - if (funmap_entry + 2 >= funmap_size) - { - funmap_size += 64; - funmap = (FUNMAP **)xrealloc (funmap, funmap_size * sizeof (FUNMAP *)); - } - - funmap[funmap_entry] = (FUNMAP *)xmalloc (sizeof (FUNMAP)); - funmap[funmap_entry]->name = name; - funmap[funmap_entry]->function = function; - - funmap[++funmap_entry] = (FUNMAP *)NULL; - return funmap_entry; -} - -static int funmap_initialized; - -/* Make the funmap contain all of the default entries. */ -void -rl_initialize_funmap () -{ - register int i; - - if (funmap_initialized) - return; - - for (i = 0; default_funmap[i].name; i++) - rl_add_funmap_entry (default_funmap[i].name, default_funmap[i].function); - - funmap_initialized = 1; - funmap_program_specific_entry_start = i; -} - -/* Produce a NULL terminated array of known function names. The array - is sorted. The array itself is allocated, but not the strings inside. - You should free () the array when you done, but not the pointrs. */ -const char ** -rl_funmap_names () -{ - const char **result; - int result_size, result_index; - - /* Make sure that the function map has been initialized. */ - rl_initialize_funmap (); - - for (result_index = result_size = 0, result = (const char **)NULL; funmap[result_index]; result_index++) - { - if (result_index + 2 > result_size) - { - result_size += 20; - result = (const char **)xrealloc (result, result_size * sizeof (char *)); - } - - result[result_index] = funmap[result_index]->name; - result[result_index + 1] = (char *)NULL; - } - - qsort (result, result_index, sizeof (char *), (QSFUNC *)_rl_qsort_string_compare); - return (result); -} diff --git a/dep/src/readline/src/histexpand.c b/dep/src/readline/src/histexpand.c deleted file mode 100644 index 220ff59270d..00000000000 --- a/dep/src/readline/src/histexpand.c +++ /dev/null @@ -1,1591 +0,0 @@ -/* histexpand.c -- history expansion. */ - -/* Copyright (C) 1989-2004 Free Software Foundation, Inc. - - This file contains the GNU History Library (the Library), a set of - routines for managing the text of previously typed lines. - - The Library is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - The Library is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#define READLINE_LIBRARY - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#include - -#if defined (HAVE_STDLIB_H) -# include -#else -# include "ansi_stdlib.h" -#endif /* HAVE_STDLIB_H */ - -#if defined (HAVE_UNISTD_H) -# ifndef _MINIX -# include -# endif -# include -#endif - -#include "rlmbutil.h" - -#include "history.h" -#include "histlib.h" - -#include "rlshell.h" -#include "xmalloc.h" - -#define HISTORY_WORD_DELIMITERS " \t\n;&()|<>" -#define HISTORY_QUOTE_CHARACTERS "\"'`" - -#define slashify_in_quotes "\\`\"$" - -typedef int _hist_search_func_t PARAMS((const char *, int)); - -extern int rl_byte_oriented; /* declared in mbutil.c */ - -static char error_pointer; - -static char *subst_lhs; -static char *subst_rhs; -static int subst_lhs_len; -static int subst_rhs_len; - -static char *get_history_word_specifier PARAMS((char *, char *, int *)); -static char *history_find_word PARAMS((char *, int)); -static int history_tokenize_word PARAMS((const char *, int)); -static char *history_substring PARAMS((const char *, int, int)); - -static char *quote_breaks PARAMS((char *)); - -/* Variables exported by this file. */ -/* The character that represents the start of a history expansion - request. This is usually `!'. */ -char history_expansion_char = '!'; - -/* The character that invokes word substitution if found at the start of - a line. This is usually `^'. */ -char history_subst_char = '^'; - -/* During tokenization, if this character is seen as the first character - of a word, then it, and all subsequent characters upto a newline are - ignored. For a Bourne shell, this should be '#'. Bash special cases - the interactive comment character to not be a comment delimiter. */ -char history_comment_char = '\0'; - -/* The list of characters which inhibit the expansion of text if found - immediately following history_expansion_char. */ -char *history_no_expand_chars = " \t\n\r="; - -/* If set to a non-zero value, single quotes inhibit history expansion. - The default is 0. */ -int history_quotes_inhibit_expansion = 0; - -/* Used to split words by history_tokenize_internal. */ -char *history_word_delimiters = HISTORY_WORD_DELIMITERS; - -/* If set, this points to a function that is called to verify that a - particular history expansion should be performed. */ -rl_linebuf_func_t *history_inhibit_expansion_function; - -/* **************************************************************** */ -/* */ -/* History Expansion */ -/* */ -/* **************************************************************** */ - -/* Hairy history expansion on text, not tokens. This is of general - use, and thus belongs in this library. */ - -/* The last string searched for by a !?string? search. */ -static char *search_string; - -/* The last string matched by a !?string? search. */ -static char *search_match; - -/* Return the event specified at TEXT + OFFSET modifying OFFSET to - point to after the event specifier. Just a pointer to the history - line is returned; NULL is returned in the event of a bad specifier. - You pass STRING with *INDEX equal to the history_expansion_char that - begins this specification. - DELIMITING_QUOTE is a character that is allowed to end the string - specification for what to search for in addition to the normal - characters `:', ` ', `\t', `\n', and sometimes `?'. - So you might call this function like: - line = get_history_event ("!echo:p", &index, 0); */ -char * -get_history_event (string, caller_index, delimiting_quote) - const char *string; - int *caller_index; - int delimiting_quote; -{ - register int i; - register char c; - HIST_ENTRY *entry; - int which, sign, local_index, substring_okay; - _hist_search_func_t *search_func; - char *temp; - - /* The event can be specified in a number of ways. - - !! the previous command - !n command line N - !-n current command-line minus N - !str the most recent command starting with STR - !?str[?] - the most recent command containing STR - - All values N are determined via HISTORY_BASE. */ - - i = *caller_index; - - if (string[i] != history_expansion_char) - return ((char *)NULL); - - /* Move on to the specification. */ - i++; - - sign = 1; - substring_okay = 0; - -#define RETURN_ENTRY(e, w) \ - return ((e = history_get (w)) ? e->line : (char *)NULL) - - /* Handle !! case. */ - if (string[i] == history_expansion_char) - { - i++; - which = history_base + (history_length - 1); - *caller_index = i; - RETURN_ENTRY (entry, which); - } - - /* Hack case of numeric line specification. */ - if (string[i] == '-') - { - sign = -1; - i++; - } - - if (_rl_digit_p (string[i])) - { - /* Get the extent of the digits and compute the value. */ - for (which = 0; _rl_digit_p (string[i]); i++) - which = (which * 10) + _rl_digit_value (string[i]); - - *caller_index = i; - - if (sign < 0) - which = (history_length + history_base) - which; - - RETURN_ENTRY (entry, which); - } - - /* This must be something to search for. If the spec begins with - a '?', then the string may be anywhere on the line. Otherwise, - the string must be found at the start of a line. */ - if (string[i] == '?') - { - substring_okay++; - i++; - } - - /* Only a closing `?' or a newline delimit a substring search string. */ - for (local_index = i; c = string[i]; i++) -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - { - int v; - mbstate_t ps; - - memset (&ps, 0, sizeof (mbstate_t)); - /* These produce warnings because we're passing a const string to a - function that takes a non-const string. */ - _rl_adjust_point ((char *)string, i, &ps); - if ((v = _rl_get_char_len ((char *)string + i, &ps)) > 1) - { - i += v - 1; - continue; - } - } - else -#endif /* HANDLE_MULTIBYTE */ - if ((!substring_okay && (whitespace (c) || c == ':' || - (history_search_delimiter_chars && member (c, history_search_delimiter_chars)) || - string[i] == delimiting_quote)) || - string[i] == '\n' || - (substring_okay && string[i] == '?')) - break; - - which = i - local_index; - temp = (char *)xmalloc (1 + which); - if (which) - strncpy (temp, string + local_index, which); - temp[which] = '\0'; - - if (substring_okay && string[i] == '?') - i++; - - *caller_index = i; - -#define FAIL_SEARCH() \ - do { \ - history_offset = history_length; free (temp) ; return (char *)NULL; \ - } while (0) - - /* If there is no search string, try to use the previous search string, - if one exists. If not, fail immediately. */ - if (*temp == '\0' && substring_okay) - { - if (search_string) - { - free (temp); - temp = savestring (search_string); - } - else - FAIL_SEARCH (); - } - - search_func = substring_okay ? history_search : history_search_prefix; - while (1) - { - local_index = (*search_func) (temp, -1); - - if (local_index < 0) - FAIL_SEARCH (); - - if (local_index == 0 || substring_okay) - { - entry = current_history (); - history_offset = history_length; - - /* If this was a substring search, then remember the - string that we matched for word substitution. */ - if (substring_okay) - { - FREE (search_string); - search_string = temp; - - FREE (search_match); - search_match = history_find_word (entry->line, local_index); - } - else - free (temp); - - return (entry->line); - } - - if (history_offset) - history_offset--; - else - FAIL_SEARCH (); - } -#undef FAIL_SEARCH -#undef RETURN_ENTRY -} - -/* Function for extracting single-quoted strings. Used for inhibiting - history expansion within single quotes. */ - -/* Extract the contents of STRING as if it is enclosed in single quotes. - SINDEX, when passed in, is the offset of the character immediately - following the opening single quote; on exit, SINDEX is left pointing - to the closing single quote. */ -static void -hist_string_extract_single_quoted (string, sindex) - char *string; - int *sindex; -{ - register int i; - - for (i = *sindex; string[i] && string[i] != '\''; i++) - ; - - *sindex = i; -} - -static char * -quote_breaks (s) - char *s; -{ - register char *p, *r; - char *ret; - int len = 3; - - for (p = s; p && *p; p++, len++) - { - if (*p == '\'') - len += 3; - else if (whitespace (*p) || *p == '\n') - len += 2; - } - - r = ret = (char *)xmalloc (len); - *r++ = '\''; - for (p = s; p && *p; ) - { - if (*p == '\'') - { - *r++ = '\''; - *r++ = '\\'; - *r++ = '\''; - *r++ = '\''; - p++; - } - else if (whitespace (*p) || *p == '\n') - { - *r++ = '\''; - *r++ = *p++; - *r++ = '\''; - } - else - *r++ = *p++; - } - *r++ = '\''; - *r = '\0'; - return ret; -} - -static char * -hist_error(s, start, current, errtype) - char *s; - int start, current, errtype; -{ - char *temp; - const char *emsg; - int ll, elen; - - ll = current - start; - - switch (errtype) - { - case EVENT_NOT_FOUND: - emsg = "event not found"; - elen = 15; - break; - case BAD_WORD_SPEC: - emsg = "bad word specifier"; - elen = 18; - break; - case SUBST_FAILED: - emsg = "substitution failed"; - elen = 19; - break; - case BAD_MODIFIER: - emsg = "unrecognized history modifier"; - elen = 29; - break; - case NO_PREV_SUBST: - emsg = "no previous substitution"; - elen = 24; - break; - default: - emsg = "unknown expansion error"; - elen = 23; - break; - } - - temp = (char *)xmalloc (ll + elen + 3); - strncpy (temp, s + start, ll); - temp[ll] = ':'; - temp[ll + 1] = ' '; - strcpy (temp + ll + 2, emsg); - return (temp); -} - -/* Get a history substitution string from STR starting at *IPTR - and return it. The length is returned in LENPTR. - - A backslash can quote the delimiter. If the string is the - empty string, the previous pattern is used. If there is - no previous pattern for the lhs, the last history search - string is used. - - If IS_RHS is 1, we ignore empty strings and set the pattern - to "" anyway. subst_lhs is not changed if the lhs is empty; - subst_rhs is allowed to be set to the empty string. */ - -static char * -get_subst_pattern (str, iptr, delimiter, is_rhs, lenptr) - char *str; - int *iptr, delimiter, is_rhs, *lenptr; -{ - register int si, i, j, k; - char *s; -#if defined (HANDLE_MULTIBYTE) - mbstate_t ps; -#endif - - s = (char *)NULL; - i = *iptr; - -#if defined (HANDLE_MULTIBYTE) - memset (&ps, 0, sizeof (mbstate_t)); - _rl_adjust_point (str, i, &ps); -#endif - - for (si = i; str[si] && str[si] != delimiter; si++) -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - { - int v; - if ((v = _rl_get_char_len (str + si, &ps)) > 1) - si += v - 1; - else if (str[si] == '\\' && str[si + 1] == delimiter) - si++; - } - else -#endif /* HANDLE_MULTIBYTE */ - if (str[si] == '\\' && str[si + 1] == delimiter) - si++; - - if (si > i || is_rhs) - { - s = (char *)xmalloc (si - i + 1); - for (j = 0, k = i; k < si; j++, k++) - { - /* Remove a backslash quoting the search string delimiter. */ - if (str[k] == '\\' && str[k + 1] == delimiter) - k++; - s[j] = str[k]; - } - s[j] = '\0'; - if (lenptr) - *lenptr = j; - } - - i = si; - if (str[i]) - i++; - *iptr = i; - - return s; -} - -static void -postproc_subst_rhs () -{ - char *new; - int i, j, new_size; - - new = (char *)xmalloc (new_size = subst_rhs_len + subst_lhs_len); - for (i = j = 0; i < subst_rhs_len; i++) - { - if (subst_rhs[i] == '&') - { - if (j + subst_lhs_len >= new_size) - new = (char *)xrealloc (new, (new_size = new_size * 2 + subst_lhs_len)); - strcpy (new + j, subst_lhs); - j += subst_lhs_len; - } - else - { - /* a single backslash protects the `&' from lhs interpolation */ - if (subst_rhs[i] == '\\' && subst_rhs[i + 1] == '&') - i++; - if (j >= new_size) - new = (char *)xrealloc (new, new_size *= 2); - new[j++] = subst_rhs[i]; - } - } - new[j] = '\0'; - free (subst_rhs); - subst_rhs = new; - subst_rhs_len = j; -} - -/* Expand the bulk of a history specifier starting at STRING[START]. - Returns 0 if everything is OK, -1 if an error occurred, and 1 - if the `p' modifier was supplied and the caller should just print - the returned string. Returns the new index into string in - *END_INDEX_PTR, and the expanded specifier in *RET_STRING. */ -static int -history_expand_internal (string, start, end_index_ptr, ret_string, current_line) - char *string; - int start, *end_index_ptr; - char **ret_string; - char *current_line; /* for !# */ -{ - int i, n, starting_index; - int substitute_globally, subst_bywords, want_quotes, print_only; - char *event, *temp, *result, *tstr, *t, c, *word_spec; - int result_len; -#if defined (HANDLE_MULTIBYTE) - mbstate_t ps; - - memset (&ps, 0, sizeof (mbstate_t)); -#endif - - result = (char *)xmalloc (result_len = 128); - - i = start; - - /* If it is followed by something that starts a word specifier, - then !! is implied as the event specifier. */ - - if (member (string[i + 1], ":$*%^")) - { - char fake_s[3]; - int fake_i = 0; - i++; - fake_s[0] = fake_s[1] = history_expansion_char; - fake_s[2] = '\0'; - event = get_history_event (fake_s, &fake_i, 0); - } - else if (string[i + 1] == '#') - { - i += 2; - event = current_line; - } - else - { - int quoted_search_delimiter = 0; - - /* If the character before this `!' is a double or single - quote, then this expansion takes place inside of the - quoted string. If we have to search for some text ("!foo"), - allow the delimiter to end the search string. */ -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - { - int c, l; - l = _rl_find_prev_mbchar (string, i, MB_FIND_ANY); - c = string[l]; - /* XXX - original patch had i - 1 ??? If i == 0 it would fail. */ - if (i && (c == '\'' || c == '"')) - quoted_search_delimiter = c; - } - else -#endif /* HANDLE_MULTIBYTE */ - if (i && (string[i - 1] == '\'' || string[i - 1] == '"')) - quoted_search_delimiter = string[i - 1]; - - event = get_history_event (string, &i, quoted_search_delimiter); - } - - if (event == 0) - { - *ret_string = hist_error (string, start, i, EVENT_NOT_FOUND); - free (result); - return (-1); - } - - /* If a word specifier is found, then do what that requires. */ - starting_index = i; - word_spec = get_history_word_specifier (string, event, &i); - - /* There is no such thing as a `malformed word specifier'. However, - it is possible for a specifier that has no match. In that case, - we complain. */ - if (word_spec == (char *)&error_pointer) - { - *ret_string = hist_error (string, starting_index, i, BAD_WORD_SPEC); - free (result); - return (-1); - } - - /* If no word specifier, than the thing of interest was the event. */ - temp = word_spec ? savestring (word_spec) : savestring (event); - FREE (word_spec); - - /* Perhaps there are other modifiers involved. Do what they say. */ - want_quotes = substitute_globally = subst_bywords = print_only = 0; - starting_index = i; - - while (string[i] == ':') - { - c = string[i + 1]; - - if (c == 'g' || c == 'a') - { - substitute_globally = 1; - i++; - c = string[i + 1]; - } - else if (c == 'G') - { - subst_bywords = 1; - i++; - c = string[i + 1]; - } - - switch (c) - { - default: - *ret_string = hist_error (string, i+1, i+2, BAD_MODIFIER); - free (result); - free (temp); - return -1; - - case 'q': - want_quotes = 'q'; - break; - - case 'x': - want_quotes = 'x'; - break; - - /* :p means make this the last executed line. So we - return an error state after adding this line to the - history. */ - case 'p': - print_only++; - break; - - /* :t discards all but the last part of the pathname. */ - case 't': - tstr = strrchr (temp, '/'); - if (tstr) - { - tstr++; - t = savestring (tstr); - free (temp); - temp = t; - } - break; - - /* :h discards the last part of a pathname. */ - case 'h': - tstr = strrchr (temp, '/'); - if (tstr) - *tstr = '\0'; - break; - - /* :r discards the suffix. */ - case 'r': - tstr = strrchr (temp, '.'); - if (tstr) - *tstr = '\0'; - break; - - /* :e discards everything but the suffix. */ - case 'e': - tstr = strrchr (temp, '.'); - if (tstr) - { - t = savestring (tstr); - free (temp); - temp = t; - } - break; - - /* :s/this/that substitutes `that' for the first - occurrence of `this'. :gs/this/that substitutes `that' - for each occurrence of `this'. :& repeats the last - substitution. :g& repeats the last substitution - globally. */ - - case '&': - case 's': - { - char *new_event; - int delimiter, failed, si, l_temp, ws, we; - - if (c == 's') - { - if (i + 2 < (int)strlen (string)) - { -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - { - _rl_adjust_point (string, i + 2, &ps); - if (_rl_get_char_len (string + i + 2, &ps) > 1) - delimiter = 0; - else - delimiter = string[i + 2]; - } - else -#endif /* HANDLE_MULTIBYTE */ - delimiter = string[i + 2]; - } - else - break; /* no search delimiter */ - - i += 3; - - t = get_subst_pattern (string, &i, delimiter, 0, &subst_lhs_len); - /* An empty substitution lhs with no previous substitution - uses the last search string as the lhs. */ - if (t) - { - FREE (subst_lhs); - subst_lhs = t; - } - else if (!subst_lhs) - { - if (search_string && *search_string) - { - subst_lhs = savestring (search_string); - subst_lhs_len = (int)strlen (subst_lhs); - } - else - { - subst_lhs = (char *) NULL; - subst_lhs_len = 0; - } - } - - FREE (subst_rhs); - subst_rhs = get_subst_pattern (string, &i, delimiter, 1, &subst_rhs_len); - - /* If `&' appears in the rhs, it's supposed to be replaced - with the lhs. */ - if (member ('&', subst_rhs)) - postproc_subst_rhs (); - } - else - i += 2; - - /* If there is no lhs, the substitution can't succeed. */ - if (subst_lhs_len == 0) - { - *ret_string = hist_error (string, starting_index, i, NO_PREV_SUBST); - free (result); - free (temp); - return -1; - } - - l_temp = (int)strlen (temp); - /* Ignore impossible cases. */ - if (subst_lhs_len > l_temp) - { - *ret_string = hist_error (string, starting_index, i, SUBST_FAILED); - free (result); - free (temp); - return (-1); - } - - /* Find the first occurrence of THIS in TEMP. */ - /* Substitute SUBST_RHS for SUBST_LHS in TEMP. There are three - cases to consider: - - 1. substitute_globally == subst_bywords == 0 - 2. substitute_globally == 1 && subst_bywords == 0 - 3. substitute_globally == 0 && subst_bywords == 1 - - In the first case, we substitute for the first occurrence only. - In the second case, we substitute for every occurrence. - In the third case, we tokenize into words and substitute the - first occurrence of each word. */ - - si = we = 0; - for (failed = 1; (si + subst_lhs_len) <= l_temp; si++) - { - /* First skip whitespace and find word boundaries if - we're past the end of the word boundary we found - the last time. */ - if (subst_bywords && si > we) - { - for (; temp[si] && whitespace (temp[si]); si++) - ; - ws = si; - we = history_tokenize_word (temp, si); - } - - if (STREQN (temp+si, subst_lhs, subst_lhs_len)) - { - int len = subst_rhs_len - subst_lhs_len + l_temp; - new_event = (char *)xmalloc (1 + len); - strncpy (new_event, temp, si); - strncpy (new_event + si, subst_rhs, subst_rhs_len); - strncpy (new_event + si + subst_rhs_len, - temp + si + subst_lhs_len, - l_temp - (si + subst_lhs_len)); - new_event[len] = '\0'; - free (temp); - temp = new_event; - - failed = 0; - - if (substitute_globally) - { - /* Reported to fix a bug that causes it to skip every - other match when matching a single character. Was - si += subst_rhs_len previously. */ - si += subst_rhs_len - 1; - l_temp = (int)strlen (temp); - substitute_globally++; - continue; - } - else if (subst_bywords) - { - si = we; - l_temp = (int)strlen (temp); - continue; - } - else - break; - } - } - - if (substitute_globally > 1) - { - substitute_globally = 0; - continue; /* don't want to increment i */ - } - - if (failed == 0) - continue; /* don't want to increment i */ - - *ret_string = hist_error (string, starting_index, i, SUBST_FAILED); - free (result); - free (temp); - return (-1); - } - } - i += 2; - } - /* Done with modfiers. */ - /* Believe it or not, we have to back the pointer up by one. */ - --i; - - if (want_quotes) - { - char *x; - - if (want_quotes == 'q') - x = sh_single_quote (temp); - else if (want_quotes == 'x') - x = quote_breaks (temp); - else - x = savestring (temp); - - free (temp); - temp = x; - } - - n = (int)strlen (temp); - if (n >= result_len) - result = (char *)xrealloc (result, n + 2); - strcpy (result, temp); - free (temp); - - *end_index_ptr = i; - *ret_string = result; - return (print_only); -} - -/* Expand the string STRING, placing the result into OUTPUT, a pointer - to a string. Returns: - - -1) If there was an error in expansion. - 0) If no expansions took place (or, if the only change in - the text was the de-slashifying of the history expansion - character) - 1) If expansions did take place - 2) If the `p' modifier was given and the caller should print the result - - If an error ocurred in expansion, then OUTPUT contains a descriptive - error message. */ - -#define ADD_STRING(s) \ - do \ - { \ - int sl = (int)strlen (s); \ - j += sl; \ - if (j >= result_len) \ - { \ - while (j >= result_len) \ - result_len += 128; \ - result = (char *)xrealloc (result, result_len); \ - } \ - strcpy (result + j - sl, s); \ - } \ - while (0) - -#define ADD_CHAR(c) \ - do \ - { \ - if (j >= result_len - 1) \ - result = (char *)xrealloc (result, result_len += 64); \ - result[j++] = c; \ - result[j] = '\0'; \ - } \ - while (0) - -int -history_expand (hstring, output) - char *hstring; - char **output; -{ - register int j; - int i, r, l, passc, cc, modified, eindex, only_printing, dquote; - char *string; - - /* The output string, and its length. */ - int result_len; - char *result; - -#if defined (HANDLE_MULTIBYTE) - char mb[MB_LEN_MAX]; - mbstate_t ps; -#endif - - /* Used when adding the string. */ - char *temp; - - if (output == 0) - return 0; - - /* Setting the history expansion character to 0 inhibits all - history expansion. */ - if (history_expansion_char == 0) - { - *output = savestring (hstring); - return (0); - } - - /* Prepare the buffer for printing error messages. */ - result = (char *)xmalloc (result_len = 256); - result[0] = '\0'; - - only_printing = modified = 0; - l = (int)strlen (hstring); - - /* Grovel the string. Only backslash and single quotes can quote the - history escape character. We also handle arg specifiers. */ - - /* Before we grovel forever, see if the history_expansion_char appears - anywhere within the text. */ - - /* The quick substitution character is a history expansion all right. That - is to say, "^this^that^" is equivalent to "!!:s^this^that^", and in fact, - that is the substitution that we do. */ - if (hstring[0] == history_subst_char) - { - string = (char *)xmalloc (l + 5); - - string[0] = string[1] = history_expansion_char; - string[2] = ':'; - string[3] = 's'; - strcpy (string + 4, hstring); - l += 4; - } - else - { -#if defined (HANDLE_MULTIBYTE) - memset (&ps, 0, sizeof (mbstate_t)); -#endif - - string = hstring; - /* If not quick substitution, still maybe have to do expansion. */ - - /* `!' followed by one of the characters in history_no_expand_chars - is NOT an expansion. */ - for (i = dquote = 0; string[i]; i++) - { -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - { - int v; - v = _rl_get_char_len (string + i, &ps); - if (v > 1) - { - i += v - 1; - continue; - } - } -#endif /* HANDLE_MULTIBYTE */ - - cc = string[i + 1]; - /* The history_comment_char, if set, appearing at the beginning - of a word signifies that the rest of the line should not have - history expansion performed on it. - Skip the rest of the line and break out of the loop. */ - if (history_comment_char && string[i] == history_comment_char && - (i == 0 || member (string[i - 1], history_word_delimiters))) - { - while (string[i]) - i++; - break; - } - else if (string[i] == history_expansion_char) - { - if (!cc || member (cc, history_no_expand_chars)) - continue; - /* If the calling application has set - history_inhibit_expansion_function to a function that checks - for special cases that should not be history expanded, - call the function and skip the expansion if it returns a - non-zero value. */ - else if (history_inhibit_expansion_function && - (*history_inhibit_expansion_function) (string, i)) - continue; - else - break; - } - /* Shell-like quoting: allow backslashes to quote double quotes - inside a double-quoted string. */ - else if (dquote && string[i] == '\\' && cc == '"') - i++; - /* More shell-like quoting: if we're paying attention to single - quotes and letting them quote the history expansion character, - then we need to pay attention to double quotes, because single - quotes are not special inside double-quoted strings. */ - else if (history_quotes_inhibit_expansion && string[i] == '"') - { - dquote = 1 - dquote; - } - else if (dquote == 0 && history_quotes_inhibit_expansion && string[i] == '\'') - { - /* If this is bash, single quotes inhibit history expansion. */ - i++; - hist_string_extract_single_quoted (string, &i); - } - else if (history_quotes_inhibit_expansion && string[i] == '\\') - { - /* If this is bash, allow backslashes to quote single - quotes and the history expansion character. */ - if (cc == '\'' || cc == history_expansion_char) - i++; - } - - } - - if (string[i] != history_expansion_char) - { - free (result); - *output = savestring (string); - return (0); - } - } - - /* Extract and perform the substitution. */ - for (passc = dquote = i = j = 0; i < l; i++) - { - int tchar = string[i]; - - if (passc) - { - passc = 0; - ADD_CHAR (tchar); - continue; - } - -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - { - int k, c; - - c = tchar; - memset (mb, 0, sizeof (mb)); - for (k = 0; k < MB_LEN_MAX; k++) - { - mb[k] = (char)c; - memset (&ps, 0, sizeof (mbstate_t)); - if (_rl_get_char_len (mb, &ps) == -2) - c = string[++i]; - else - break; - } - if (strlen (mb) > 1) - { - ADD_STRING (mb); - break; - } - } -#endif /* HANDLE_MULTIBYTE */ - - if (tchar == history_expansion_char) - tchar = -3; - else if (tchar == history_comment_char) - tchar = -2; - - switch (tchar) - { - default: - ADD_CHAR (string[i]); - break; - - case '\\': - passc++; - ADD_CHAR (tchar); - break; - - case '"': - dquote = 1 - dquote; - ADD_CHAR (tchar); - break; - - case '\'': - { - /* If history_quotes_inhibit_expansion is set, single quotes - inhibit history expansion. */ - if (dquote == 0 && history_quotes_inhibit_expansion) - { - int quote, slen; - - quote = i++; - hist_string_extract_single_quoted (string, &i); - - slen = i - quote + 2; - temp = (char *)xmalloc (slen); - strncpy (temp, string + quote, slen); - temp[slen - 1] = '\0'; - ADD_STRING (temp); - free (temp); - } - else - ADD_CHAR (string[i]); - break; - } - - case -2: /* history_comment_char */ - if (i == 0 || member (string[i - 1], history_word_delimiters)) - { - temp = (char *)xmalloc (l - i + 1); - strcpy (temp, string + i); - ADD_STRING (temp); - free (temp); - i = l; - } - else - ADD_CHAR (string[i]); - break; - - case -3: /* history_expansion_char */ - cc = string[i + 1]; - - /* If the history_expansion_char is followed by one of the - characters in history_no_expand_chars, then it is not a - candidate for expansion of any kind. */ - if (member (cc, history_no_expand_chars)) - { - ADD_CHAR (string[i]); - break; - } - -#if defined (NO_BANG_HASH_MODIFIERS) - /* There is something that is listed as a `word specifier' in csh - documentation which means `the expanded text to this point'. - That is not a word specifier, it is an event specifier. If we - don't want to allow modifiers with `!#', just stick the current - output line in again. */ - if (cc == '#') - { - if (result) - { - temp = (char *)xmalloc (1 + strlen (result)); - strcpy (temp, result); - ADD_STRING (temp); - free (temp); - } - i++; - break; - } -#endif - - r = history_expand_internal (string, i, &eindex, &temp, result); - if (r < 0) - { - *output = temp; - free (result); - if (string != hstring) - free (string); - return -1; - } - else - { - if (temp) - { - modified++; - if (*temp) - ADD_STRING (temp); - free (temp); - } - only_printing = r == 1; - i = eindex; - } - break; - } - } - - *output = result; - if (string != hstring) - free (string); - - if (only_printing) - { -#if 0 - add_history (result); -#endif - return (2); - } - - return (modified != 0); -} - -/* Return a consed string which is the word specified in SPEC, and found - in FROM. NULL is returned if there is no spec. The address of - ERROR_POINTER is returned if the word specified cannot be found. - CALLER_INDEX is the offset in SPEC to start looking; it is updated - to point to just after the last character parsed. */ -static char * -get_history_word_specifier (spec, from, caller_index) - char *spec, *from; - int *caller_index; -{ - register int i = *caller_index; - int first, last; - int expecting_word_spec = 0; - char *result; - - /* The range of words to return doesn't exist yet. */ - first = last = 0; - result = (char *)NULL; - - /* If we found a colon, then this *must* be a word specification. If - it isn't, then it is an error. */ - if (spec[i] == ':') - { - i++; - expecting_word_spec++; - } - - /* Handle special cases first. */ - - /* `%' is the word last searched for. */ - if (spec[i] == '%') - { - *caller_index = i + 1; - return (search_match ? savestring (search_match) : savestring ("")); - } - - /* `*' matches all of the arguments, but not the command. */ - if (spec[i] == '*') - { - *caller_index = i + 1; - result = history_arg_extract (1, '$', from); - return (result ? result : savestring ("")); - } - - /* `$' is last arg. */ - if (spec[i] == '$') - { - *caller_index = i + 1; - return (history_arg_extract ('$', '$', from)); - } - - /* Try to get FIRST and LAST figured out. */ - - if (spec[i] == '-') - first = 0; - else if (spec[i] == '^') - { - first = 1; - i++; - } - else if (_rl_digit_p (spec[i]) && expecting_word_spec) - { - for (first = 0; _rl_digit_p (spec[i]); i++) - first = (first * 10) + _rl_digit_value (spec[i]); - } - else - return ((char *)NULL); /* no valid `first' for word specifier */ - - if (spec[i] == '^' || spec[i] == '*') - { - last = (spec[i] == '^') ? 1 : '$'; /* x* abbreviates x-$ */ - i++; - } - else if (spec[i] != '-') - last = first; - else - { - i++; - - if (_rl_digit_p (spec[i])) - { - for (last = 0; _rl_digit_p (spec[i]); i++) - last = (last * 10) + _rl_digit_value (spec[i]); - } - else if (spec[i] == '$') - { - i++; - last = '$'; - } -#if 0 - else if (!spec[i] || spec[i] == ':') - /* check against `:' because there could be a modifier separator */ -#else - else - /* csh seems to allow anything to terminate the word spec here, - leaving it as an abbreviation. */ -#endif - last = -1; /* x- abbreviates x-$ omitting word `$' */ - } - - *caller_index = i; - - if (last >= first || last == '$' || last < 0) - result = history_arg_extract (first, last, from); - - return (result ? result : (char *)&error_pointer); -} - -/* Extract the args specified, starting at FIRST, and ending at LAST. - The args are taken from STRING. If either FIRST or LAST is < 0, - then make that arg count from the right (subtract from the number of - tokens, so that FIRST = -1 means the next to last token on the line). - If LAST is `$' the last arg from STRING is used. */ -char * -history_arg_extract (first, last, string) - int first, last; - const char *string; -{ - register int i, len; - char *result; - size_t size, offset; - char **list; - - /* XXX - think about making history_tokenize return a struct array, - each struct in array being a string and a length to avoid the - calls to strlen below. */ - if ((list = history_tokenize (string)) == NULL) - return ((char *)NULL); - - for (len = 0; list[len]; len++) - ; - - if (last < 0) - last = len + last - 1; - - if (first < 0) - first = len + first - 1; - - if (last == '$') - last = len - 1; - - if (first == '$') - first = len - 1; - - last++; - - if (first >= len || last > len || first < 0 || last < 0 || first > last) - result = ((char *)NULL); - else - { - for (size = 0, i = first; i < last; i++) - size += strlen (list[i]) + 1; - result = (char *)xmalloc (size + 1); - result[0] = '\0'; - - for (i = first, offset = 0; i < last; i++) - { - strcpy (result + offset, list[i]); - offset += strlen (list[i]); - if (i + 1 < last) - { - result[offset++] = ' '; - result[offset] = 0; - } - } - } - - for (i = 0; i < len; i++) - free (list[i]); - free (list); - - return (result); -} - -static int -history_tokenize_word (string, ind) - const char *string; - int ind; -{ - register int i; - int delimiter; - - i = ind; - delimiter = 0; - - if (member (string[i], "()\n")) - { - i++; - return i; - } - - if (member (string[i], "<>;&|$")) - { - int peek = string[i + 1]; - - if (peek == string[i] && peek != '$') - { - if (peek == '<' && string[i + 2] == '-') - i++; - i += 2; - return i; - } - else - { - if ((peek == '&' && (string[i] == '>' || string[i] == '<')) || - (peek == '>' && string[i] == '&') || - (peek == '(' && (string[i] == '>' || string[i] == '<')) || /* ) */ - (peek == '(' && string[i] == '$')) /* ) */ - { - i += 2; - return i; - } - } - - if (string[i] != '$') - { - i++; - return i; - } - } - - /* Get word from string + i; */ - - if (member (string[i], HISTORY_QUOTE_CHARACTERS)) - delimiter = string[i++]; - - for (; string[i]; i++) - { - if (string[i] == '\\' && string[i + 1] == '\n') - { - i++; - continue; - } - - if (string[i] == '\\' && delimiter != '\'' && - (delimiter != '"' || member (string[i], slashify_in_quotes))) - { - i++; - continue; - } - - if (delimiter && string[i] == delimiter) - { - delimiter = 0; - continue; - } - - if (!delimiter && (member (string[i], history_word_delimiters))) - break; - - if (!delimiter && member (string[i], HISTORY_QUOTE_CHARACTERS)) - delimiter = string[i]; - } - - return i; -} - -static char * -history_substring (string, start, end) - const char *string; - int start, end; -{ - register int len; - register char *result; - - len = end - start; - result = (char *)xmalloc (len + 1); - strncpy (result, string + start, len); - result[len] = '\0'; - return result; -} - -/* Parse STRING into tokens and return an array of strings. If WIND is - not -1 and INDP is not null, we also want the word surrounding index - WIND. The position in the returned array of strings is returned in - *INDP. */ -static char ** -history_tokenize_internal (string, wind, indp) - const char *string; - int wind, *indp; -{ - char **result; - register int i, start, result_index, size; - - /* If we're searching for a string that's not part of a word (e.g., " "), - make sure we set *INDP to a reasonable value. */ - if (indp && wind != -1) - *indp = -1; - - /* Get a token, and stuff it into RESULT. The tokens are split - exactly where the shell would split them. */ - for (i = result_index = size = 0, result = (char **)NULL; string[i]; ) - { - /* Skip leading whitespace. */ - for (; string[i] && whitespace (string[i]); i++) - ; - if (string[i] == 0 || string[i] == history_comment_char) - return (result); - - start = i; - - i = history_tokenize_word (string, start); - - /* If we have a non-whitespace delimiter character (which would not be - skipped by the loop above), use it and any adjacent delimiters to - make a separate field. Any adjacent white space will be skipped the - next time through the loop. */ - if (i == start && history_word_delimiters) - { - i++; - while (string[i] && member (string[i], history_word_delimiters)) - i++; - } - - /* If we are looking for the word in which the character at a - particular index falls, remember it. */ - if (indp && wind != -1 && wind >= start && wind < i) - *indp = result_index; - - if (result_index + 2 >= size) - result = (char **)xrealloc (result, ((size += 10) * sizeof (char *))); - - result[result_index++] = history_substring (string, start, i); - result[result_index] = (char *)NULL; - } - - return (result); -} - -/* Return an array of tokens, much as the shell might. The tokens are - parsed out of STRING. */ -char ** -history_tokenize (string) - const char *string; -{ - return (history_tokenize_internal (string, -1, (int *)NULL)); -} - -/* Find and return the word which contains the character at index IND - in the history line LINE. Used to save the word matched by the - last history !?string? search. */ -static char * -history_find_word (line, ind) - char *line; - int ind; -{ - char **words, *s; - int i, wind; - - words = history_tokenize_internal (line, ind, &wind); - if (wind == -1 || words == 0) - return ((char *)NULL); - s = words[wind]; - for (i = 0; i < wind; i++) - free (words[i]); - for (i = wind + 1; words[i]; i++) - free (words[i]); - free (words); - return s; -} diff --git a/dep/src/readline/src/histfile.c b/dep/src/readline/src/histfile.c deleted file mode 100644 index 78023498b0f..00000000000 --- a/dep/src/readline/src/histfile.c +++ /dev/null @@ -1,556 +0,0 @@ -/* histfile.c - functions to manipulate the history file. */ - -/* Copyright (C) 1989-2003 Free Software Foundation, Inc. - - This file contains the GNU History Library (the Library), a set of - routines for managing the text of previously typed lines. - - The Library is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - The Library is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -/* The goal is to make the implementation transparent, so that you - don't have to know what data types are used, just what functions - you can call. I think I have done that. */ - -#define READLINE_LIBRARY - -#if defined (__TANDEM) -# include -#endif - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#include - -#include -#if ! defined (_MINIX) && defined (HAVE_SYS_FILE_H) -# include -#endif -#include "posixstat.h" -#include - -#if defined (HAVE_STDLIB_H) -# include -#else -# include "ansi_stdlib.h" -#endif /* HAVE_STDLIB_H */ - -#if defined (HAVE_UNISTD_H) -# include -#endif - -#if defined (__EMX__) || defined (__CYGWIN__) || defined (__MINW32__) -# undef HAVE_MMAP -#endif - -#ifdef HISTORY_USE_MMAP -# include - -# ifdef MAP_FILE -# define MAP_RFLAGS (MAP_FILE|MAP_PRIVATE) -# define MAP_WFLAGS (MAP_FILE|MAP_SHARED) -# else -# define MAP_RFLAGS MAP_PRIVATE -# define MAP_WFLAGS MAP_SHARED -# endif - -# ifndef MAP_FAILED -# define MAP_FAILED ((void *)-1) -# endif - -#endif /* HISTORY_USE_MMAP */ - -#ifdef _WIN32 -#include -#endif - -/* If we're compiling for __EMX__ (OS/2) or __CYGWIN__ (cygwin32 environment - on win 95/98/nt), we want to open files with O_BINARY mode so that there - is no \n -> \r\n conversion performed. On other systems, we don't want to - mess around with O_BINARY at all, so we ensure that it's defined to 0. */ -#if defined (__EMX__) || defined (__CYGWIN__) || defined (_WIN32) -# ifndef O_BINARY -# define O_BINARY 0 -# endif -#else /* !__EMX__ && !__CYGWIN__ && !_WIN32 */ -# undef O_BINARY -# define O_BINARY 0 -#endif /* !__EMX__ && !__CYGWIN__ && !_WIN32 */ - -#include -#if !defined (errno) -extern int errno; -#endif /* !errno */ - -#include "history.h" -#include "histlib.h" - -#include "rlshell.h" -#include "xmalloc.h" - -/* If non-zero, we write timestamps to the history file in history_do_write() */ -int history_write_timestamps = 0; - -/* Does S look like the beginning of a history timestamp entry? Placeholder - for more extensive tests. */ -#define HIST_TIMESTAMP_START(s) (*(s) == history_comment_char) - -#ifdef _WIN32 -#include "rldefs.h" -#endif - -/* Return the string that should be used in the place of this - filename. This only matters when you don't specify the - filename to read_history (), or write_history (). */ -static char * -history_filename (filename) - const char *filename; -{ - char *return_val; - const char *home; - size_t home_len; - - return_val = filename ? savestring (filename) : (char *)NULL; - - if (return_val) - return (return_val); - - home = sh_get_env_value ("HOME"); - - if (home == 0) - { -#if defined (_WIN32) && defined (INITFILES_IN_REGISTRY) - return_val = _rl_get_user_registry_string (READLINE_REGKEY, HISTFILE_REGVAL); - if (return_val) - return (return_val); - free (return_val); -#endif /* _WIN32 ... */ - home = "."; - home_len = 1; - } - else - home_len = strlen (home); - - return_val = (char *)xmalloc (2 + home_len + 8); /* strlen(".history") == 8 */ - strcpy (return_val, home); - return_val[home_len] = '/'; -#if defined (__MSDOS__) - strcpy (return_val + home_len + 1, "_history"); -#else - strcpy (return_val + home_len + 1, ".history"); -#endif - - return (return_val); -} - -/* Add the contents of FILENAME to the history list, a line at a time. - If FILENAME is NULL, then read from ~/.history. Returns 0 if - successful, or errno if not. */ -int -read_history (filename) - const char *filename; -{ - return (read_history_range (filename, 0, -1)); -} - -/* Read a range of lines from FILENAME, adding them to the history list. - Start reading at the FROM'th line and end at the TO'th. If FROM - is zero, start at the beginning. If TO is less than FROM, read - until the end of the file. If FILENAME is NULL, then read from - ~/.history. Returns 0 if successful, or errno if not. */ -int -read_history_range (filename, from, to) - const char *filename; - int from, to; -{ - register char *line_start, *line_end, *p; - char *input, *buffer, *bufend, *last_ts; - int file, current_line, chars_read; - struct stat finfo; - size_t file_size; -#if defined (EFBIG) - int overflow_errno = EFBIG; -#elif defined (EOVERFLOW) - int overflow_errno = EOVERFLOW; -#else - int overflow_errno = EIO; -#endif - - buffer = last_ts = (char *)NULL; - input = history_filename (filename); - file = open (input, O_RDONLY|O_BINARY, 0666); - - if ((file < 0) || (fstat (file, &finfo) == -1)) - goto error_and_exit; - - file_size = (size_t)finfo.st_size; - - /* check for overflow on very large files */ - if (file_size != finfo.st_size || file_size + 1 < file_size) - { - errno = overflow_errno; - goto error_and_exit; - } - -#ifdef HISTORY_USE_MMAP - /* We map read/write and private so we can change newlines to NULs without - affecting the underlying object. */ - buffer = (char *)mmap (0, file_size, PROT_READ|PROT_WRITE, MAP_RFLAGS, file, 0); - if ((void *)buffer == MAP_FAILED) - { - errno = overflow_errno; - goto error_and_exit; - } - chars_read = file_size; -#else - buffer = (char *)malloc (file_size + 1); - if (buffer == 0) - { - errno = overflow_errno; - goto error_and_exit; - } - - chars_read = read (file, buffer, (int)file_size); -#endif - if (chars_read < 0) - { - error_and_exit: - if (errno != 0) - chars_read = errno; - else - chars_read = EIO; - if (file >= 0) - close (file); - - FREE (input); -#ifndef HISTORY_USE_MMAP - FREE (buffer); -#endif - - return (chars_read); - } - - close (file); - - /* Set TO to larger than end of file if negative. */ - if (to < 0) - to = chars_read; - - /* Start at beginning of file, work to end. */ - bufend = buffer + chars_read; - current_line = 0; - - /* Skip lines until we are at FROM. */ - for (line_start = line_end = buffer; line_end < bufend && current_line < from; line_end++) - if (*line_end == '\n') - { - p = line_end + 1; - /* If we see something we think is a timestamp, continue with this - line. We should check more extensively here... */ - if (HIST_TIMESTAMP_START(p) == 0) - current_line++; - line_start = p; - } - - /* If there are lines left to gobble, then gobble them now. */ - for (line_end = line_start; line_end < bufend; line_end++) - if (*line_end == '\n') - { - *line_end = '\0'; - - if (*line_start) - { - if (HIST_TIMESTAMP_START(line_start) == 0) - { - add_history (line_start); - if (last_ts) - { - add_history_time (last_ts); - last_ts = NULL; - } - } - else - { - last_ts = line_start; - current_line--; - } - } - - current_line++; - - if (current_line >= to) - break; - - line_start = line_end + 1; - } - - FREE (input); -#ifndef HISTORY_USE_MMAP - FREE (buffer); -#else - munmap (buffer, file_size); -#endif - - return (0); -} - -/* Truncate the history file FNAME, leaving only LINES trailing lines. - If FNAME is NULL, then use ~/.history. Returns 0 on success, errno - on failure. */ -int -history_truncate_file (fname, lines) - const char *fname; - int lines; -{ - char *buffer, *filename, *bp, *bp1; /* bp1 == bp+1 */ - int file, chars_read, rv; - struct stat finfo; - size_t file_size; - - buffer = (char *)NULL; - filename = history_filename (fname); - file = open (filename, O_RDONLY|O_BINARY, 0666); - rv = 0; - - /* Don't try to truncate non-regular files. */ - if (file == -1 || fstat (file, &finfo) == -1) - { - rv = errno; - if (file != -1) - close (file); - goto truncate_exit; - } - - if (S_ISREG (finfo.st_mode) == 0) - { - close (file); -#ifdef EFTYPE - rv = EFTYPE; -#else - rv = EINVAL; -#endif - goto truncate_exit; - } - - file_size = (size_t)finfo.st_size; - - /* check for overflow on very large files */ - if (file_size != finfo.st_size || file_size + 1 < file_size) - { - close (file); -#if defined (EFBIG) - rv = errno = EFBIG; -#elif defined (EOVERFLOW) - rv = errno = EOVERFLOW; -#else - rv = errno = EINVAL; -#endif - goto truncate_exit; - } - - buffer = (char *)malloc (file_size + 1); - if (buffer == 0) - { - close (file); - goto truncate_exit; - } - - chars_read = read (file, buffer, (int)file_size); - close (file); - - if (chars_read <= 0) - { - rv = (chars_read < 0) ? errno : 0; - goto truncate_exit; - } - - /* Count backwards from the end of buffer until we have passed - LINES lines. bp1 is set funny initially. But since bp[1] can't - be a comment character (since it's off the end) and *bp can't be - both a newline and the history comment character, it should be OK. */ - for (bp1 = bp = buffer + chars_read - 1; lines && bp > buffer; bp--) - { - if (*bp == '\n' && HIST_TIMESTAMP_START(bp1) == 0) - lines--; - bp1 = bp; - } - - /* If this is the first line, then the file contains exactly the - number of lines we want to truncate to, so we don't need to do - anything. It's the first line if we don't find a newline between - the current value of i and 0. Otherwise, write from the start of - this line until the end of the buffer. */ - for ( ; bp > buffer; bp--) - { - if (*bp == '\n' && HIST_TIMESTAMP_START(bp1) == 0) - { - bp++; - break; - } - bp1 = bp; - } - - /* Write only if there are more lines in the file than we want to - truncate to. */ - if (bp > buffer && ((file = open (filename, O_WRONLY|O_TRUNC|O_BINARY, 0600)) != -1)) - { - write (file, bp, chars_read - (int)(bp - buffer)); - -#if defined (__BEOS__) - /* BeOS ignores O_TRUNC. */ - ftruncate (file, chars_read - (bp - buffer)); -#endif - - close (file); - } - - truncate_exit: - - FREE (buffer); - - free (filename); - return rv; -} - -/* Workhorse function for writing history. Writes NELEMENT entries - from the history list to FILENAME. OVERWRITE is non-zero if you - wish to replace FILENAME with the entries. */ -static int -history_do_write (filename, nelements, overwrite) - const char *filename; - int nelements, overwrite; -{ - register int i; - char *output; - int file, mode, rv; -#ifdef HISTORY_USE_MMAP - size_t cursize; - - mode = overwrite ? O_RDWR|O_CREAT|O_TRUNC|O_BINARY : O_RDWR|O_APPEND|O_BINARY; -#else - mode = overwrite ? O_WRONLY|O_CREAT|O_TRUNC|O_BINARY : O_WRONLY|O_APPEND|O_BINARY; -#endif - output = history_filename (filename); - rv = 0; - - if ((file = open (output, mode, 0600)) == -1) - { - FREE (output); - return (errno); - } - -#ifdef HISTORY_USE_MMAP - cursize = overwrite ? 0 : lseek (file, 0, SEEK_END); -#endif - - if (nelements > history_length) - nelements = history_length; - - /* Build a buffer of all the lines to write, and write them in one syscall. - Suggested by Peter Ho (peter@robosts.oxford.ac.uk). */ - { - HIST_ENTRY **the_history; /* local */ - register size_t j; - size_t buffer_size; - char *buffer; - - the_history = history_list (); - /* Calculate the total number of bytes to write. */ - for (buffer_size = 0, i = history_length - nelements; i < history_length; i++) -#if 0 - buffer_size += 2 + HISTENT_BYTES (the_history[i]); -#else - { - if (history_write_timestamps && the_history[i]->timestamp && the_history[i]->timestamp[0]) - buffer_size += strlen (the_history[i]->timestamp) + 1; - buffer_size += strlen (the_history[i]->line) + 1; - } -#endif - - /* Allocate the buffer, and fill it. */ -#ifdef HISTORY_USE_MMAP - if (ftruncate (file, buffer_size+cursize) == -1) - goto mmap_error; - buffer = (char *)mmap (0, buffer_size, PROT_READ|PROT_WRITE, MAP_WFLAGS, file, cursize); - if ((void *)buffer == MAP_FAILED) - { -mmap_error: - rv = errno; - FREE (output); - close (file); - return rv; - } -#else - buffer = (char *)malloc (buffer_size); - if (buffer == 0) - { - rv = errno; - FREE (output); - close (file); - return rv; - } -#endif - - for (j = 0, i = history_length - nelements; i < history_length; i++) - { - if (history_write_timestamps && the_history[i]->timestamp && the_history[i]->timestamp[0]) - { - strcpy (buffer + j, the_history[i]->timestamp); - j += strlen (the_history[i]->timestamp); - buffer[j++] = '\n'; - } - strcpy (buffer + j, the_history[i]->line); - j += strlen (the_history[i]->line); - buffer[j++] = '\n'; - } - -#ifdef HISTORY_USE_MMAP - if (msync (buffer, buffer_size, 0) != 0 || munmap (buffer, buffer_size) != 0) - rv = errno; -#else - if (write (file, buffer, (int)buffer_size) < 0) - rv = errno; - free (buffer); -#endif - } - - close (file); - - FREE (output); - - return (rv); -} - -/* Append NELEMENT entries to FILENAME. The entries appended are from - the end of the list minus NELEMENTs up to the end of the list. */ -int -append_history (nelements, filename) - int nelements; - const char *filename; -{ - return (history_do_write (filename, nelements, HISTORY_APPEND)); -} - -/* Overwrite FILENAME with the current history. If FILENAME is NULL, - then write the history list to ~/.history. Values returned - are as in read_history ().*/ -int -write_history (filename) - const char *filename; -{ - return (history_do_write (filename, history_length, HISTORY_OVERWRITE)); -} diff --git a/dep/src/readline/src/histlib.h b/dep/src/readline/src/histlib.h deleted file mode 100644 index c39af71814c..00000000000 --- a/dep/src/readline/src/histlib.h +++ /dev/null @@ -1,82 +0,0 @@ -/* histlib.h -- internal definitions for the history library. */ -/* Copyright (C) 1989, 1992 Free Software Foundation, Inc. - - This file contains the GNU History Library (the Library), a set of - routines for managing the text of previously typed lines. - - The Library is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - The Library is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#if !defined (_HISTLIB_H_) -#define _HISTLIB_H_ - -#if defined (HAVE_STRING_H) -# include -#else -# include -#endif /* !HAVE_STRING_H */ - -#if !defined (STREQ) -#define STREQ(a, b) (((a)[0] == (b)[0]) && (strcmp ((a), (b)) == 0)) -#define STREQN(a, b, n) (((n) == 0) ? (1) \ - : ((a)[0] == (b)[0]) && (strncmp ((a), (b), (n)) == 0)) -#endif - -#ifndef savestring -#define savestring(x) strcpy (xmalloc (1 + strlen (x)), (x)) -#endif - -#ifndef whitespace -#define whitespace(c) (((c) == ' ') || ((c) == '\t')) -#endif - -#ifndef _rl_digit_p -#define _rl_digit_p(c) ((c) >= '0' && (c) <= '9') -#endif - -#ifndef _rl_digit_value -#define _rl_digit_value(c) ((c) - '0') -#endif - -#ifndef member -# ifndef strchr -extern char *strchr (); -# endif -#define member(c, s) ((c) ? ((char *)strchr ((s), (c)) != (char *)NULL) : 0) -#endif - -#ifndef FREE -# define FREE(x) if (x) free (x) -#endif - -/* Possible history errors passed to hist_error. */ -#define EVENT_NOT_FOUND 0 -#define BAD_WORD_SPEC 1 -#define SUBST_FAILED 2 -#define BAD_MODIFIER 3 -#define NO_PREV_SUBST 4 - -/* Possible definitions for history starting point specification. */ -#define ANCHORED_SEARCH 1 -#define NON_ANCHORED_SEARCH 0 - -/* Possible definitions for what style of writing the history file we want. */ -#define HISTORY_APPEND 0 -#define HISTORY_OVERWRITE 1 - -/* Some variable definitions shared across history source files. */ -extern int history_offset; - -#endif /* !_HISTLIB_H_ */ diff --git a/dep/src/readline/src/history.c b/dep/src/readline/src/history.c deleted file mode 100644 index f7e8a54f303..00000000000 --- a/dep/src/readline/src/history.c +++ /dev/null @@ -1,443 +0,0 @@ -/* history.c -- standalone history library */ - -/* Copyright (C) 1989-2003 Free Software Foundation, Inc. - - This file contains the GNU History Library (the Library), a set of - routines for managing the text of previously typed lines. - - The Library is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - The Library is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -/* The goal is to make the implementation transparent, so that you - don't have to know what data types are used, just what functions - you can call. I think I have done that. */ -#define READLINE_LIBRARY - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#include - -#if defined (HAVE_STDLIB_H) -# include -#else -# include "ansi_stdlib.h" -#endif /* HAVE_STDLIB_H */ - -#if defined (HAVE_UNISTD_H) -# ifdef _MINIX -# include -# endif -# include -#endif - -#include "history.h" -#include "histlib.h" - -#include "xmalloc.h" - -/* The number of slots to increase the_history by. */ -#define DEFAULT_HISTORY_GROW_SIZE 50 - -static char *hist_inittime PARAMS((void)); - -/* **************************************************************** */ -/* */ -/* History Functions */ -/* */ -/* **************************************************************** */ - -/* An array of HIST_ENTRY. This is where we store the history. */ -static HIST_ENTRY **the_history = (HIST_ENTRY **)NULL; - -/* Non-zero means that we have enforced a limit on the amount of - history that we save. */ -static int history_stifled; - -/* The current number of slots allocated to the input_history. */ -static int history_size; - -/* If HISTORY_STIFLED is non-zero, then this is the maximum number of - entries to remember. */ -int history_max_entries; -int max_input_history; /* backwards compatibility */ - -/* The current location of the interactive history pointer. Just makes - life easier for outside callers. */ -int history_offset; - -/* The number of strings currently stored in the history list. */ -int history_length; - -/* The logical `base' of the history array. It defaults to 1. */ -int history_base = 1; - -/* Return the current HISTORY_STATE of the history. */ -HISTORY_STATE * -history_get_history_state () -{ - HISTORY_STATE *state; - - state = (HISTORY_STATE *)xmalloc (sizeof (HISTORY_STATE)); - state->entries = the_history; - state->offset = history_offset; - state->length = history_length; - state->size = history_size; - state->flags = 0; - if (history_stifled) - state->flags |= HS_STIFLED; - - return (state); -} - -/* Set the state of the current history array to STATE. */ -void -history_set_history_state (state) - HISTORY_STATE *state; -{ - the_history = state->entries; - history_offset = state->offset; - history_length = state->length; - history_size = state->size; - if (state->flags & HS_STIFLED) - history_stifled = 1; -} - -/* Begin a session in which the history functions might be used. This - initializes interactive variables. */ -void -using_history () -{ - history_offset = history_length; -} - -/* Return the number of bytes that the primary history entries are using. - This just adds up the lengths of the_history->lines and the associated - timestamps. */ -int -history_total_bytes () -{ - register int i, result; - - for (i = result = 0; the_history && the_history[i]; i++) - result += (int)(HISTENT_BYTES (the_history[i])); - - return (result); -} - -/* Returns the magic number which says what history element we are - looking at now. In this implementation, it returns history_offset. */ -int -where_history () -{ - return (history_offset); -} - -/* Make the current history item be the one at POS, an absolute index. - Returns zero if POS is out of range, else non-zero. */ -int -history_set_pos (pos) - int pos; -{ - if (pos > history_length || pos < 0 || !the_history) - return (0); - history_offset = pos; - return (1); -} - -/* Return the current history array. The caller has to be carefull, since this - is the actual array of data, and could be bashed or made corrupt easily. - The array is terminated with a NULL pointer. */ -HIST_ENTRY ** -history_list () -{ - return (the_history); -} - -/* Return the history entry at the current position, as determined by - history_offset. If there is no entry there, return a NULL pointer. */ -HIST_ENTRY * -current_history () -{ - return ((history_offset == history_length) || the_history == 0) - ? (HIST_ENTRY *)NULL - : the_history[history_offset]; -} - -/* Back up history_offset to the previous history entry, and return - a pointer to that entry. If there is no previous entry then return - a NULL pointer. */ -HIST_ENTRY * -previous_history () -{ - return history_offset ? the_history[--history_offset] : (HIST_ENTRY *)NULL; -} - -/* Move history_offset forward to the next history entry, and return - a pointer to that entry. If there is no next entry then return a - NULL pointer. */ -HIST_ENTRY * -next_history () -{ - return (history_offset == history_length) ? (HIST_ENTRY *)NULL : the_history[++history_offset]; -} - -/* Return the history entry which is logically at OFFSET in the history array. - OFFSET is relative to history_base. */ -HIST_ENTRY * -history_get (offset) - int offset; -{ - int local_index; - - local_index = offset - history_base; - return (local_index >= history_length || local_index < 0 || !the_history) - ? (HIST_ENTRY *)NULL - : the_history[local_index]; -} - -time_t -history_get_time (hist) - HIST_ENTRY *hist; -{ - char *ts; - time_t t; - - if (hist == 0 || hist->timestamp == 0) - return 0; - ts = hist->timestamp; - if (ts[0] != history_comment_char) - return 0; - t = (time_t) atol (ts + 1); /* XXX - should use strtol() here */ - return t; -} - -static char * -hist_inittime () -{ - time_t t; - char ts[64], *ret; - - t = (time_t) time ((time_t *)0); -#if defined (HAVE_VSNPRINTF) /* assume snprintf if vsnprintf exists */ - snprintf (ts, sizeof (ts) - 1, "X%lu", (unsigned long) t); -#else - sprintf (ts, "X%lu", (unsigned long) t); -#endif - ret = savestring (ts); - ret[0] = history_comment_char; - - return ret; -} - -/* Place STRING at the end of the history list. The data field - is set to NULL. */ -void -add_history (string) - const char *string; -{ - HIST_ENTRY *temp; - - if (history_stifled && (history_length == history_max_entries)) - { - register int i; - - /* If the history is stifled, and history_length is zero, - and it equals history_max_entries, we don't save items. */ - if (history_length == 0) - return; - - /* If there is something in the slot, then remove it. */ - if (the_history[0]) - (void) free_history_entry (the_history[0]); - - /* Copy the rest of the entries, moving down one slot. */ - for (i = 0; i < history_length; i++) - the_history[i] = the_history[i + 1]; - - history_base++; - } - else - { - if (history_size == 0) - { - history_size = DEFAULT_HISTORY_GROW_SIZE; - the_history = (HIST_ENTRY **)xmalloc (history_size * sizeof (HIST_ENTRY *)); - history_length = 1; - } - else - { - if (history_length == (history_size - 1)) - { - history_size += DEFAULT_HISTORY_GROW_SIZE; - the_history = (HIST_ENTRY **) - xrealloc (the_history, history_size * sizeof (HIST_ENTRY *)); - } - history_length++; - } - } - - temp = (HIST_ENTRY *)xmalloc (sizeof (HIST_ENTRY)); - temp->line = savestring (string); - temp->data = (char *)NULL; - - temp->timestamp = hist_inittime (); - - the_history[history_length] = (HIST_ENTRY *)NULL; - the_history[history_length - 1] = temp; -} - -/* Change the time stamp of the most recent history entry to STRING. */ -void -add_history_time (string) - const char *string; -{ - HIST_ENTRY *hs; - - hs = the_history[history_length - 1]; - FREE (hs->timestamp); - hs->timestamp = savestring (string); -} - -/* Free HIST and return the data so the calling application can free it - if necessary and desired. */ -histdata_t -free_history_entry (hist) - HIST_ENTRY *hist; -{ - histdata_t x; - - if (hist == 0) - return ((histdata_t) 0); - FREE (hist->line); - FREE (hist->timestamp); - x = hist->data; - free (hist); - return (x); -} - -/* Make the history entry at WHICH have LINE and DATA. This returns - the old entry so you can dispose of the data. In the case of an - invalid WHICH, a NULL pointer is returned. */ -HIST_ENTRY * -replace_history_entry (which, line, data) - int which; - const char *line; - histdata_t data; -{ - HIST_ENTRY *temp, *old_value; - - if (which >= history_length) - return ((HIST_ENTRY *)NULL); - - temp = (HIST_ENTRY *)xmalloc (sizeof (HIST_ENTRY)); - old_value = the_history[which]; - - temp->line = savestring (line); - temp->data = data; - temp->timestamp = savestring (old_value->timestamp); - the_history[which] = temp; - - return (old_value); -} - -/* Remove history element WHICH from the history. The removed - element is returned to you so you can free the line, data, - and containing structure. */ -HIST_ENTRY * -remove_history (which) - int which; -{ - HIST_ENTRY *return_value; - register int i; - - if (which >= history_length || !history_length) - return_value = (HIST_ENTRY *)NULL; - else - { - return_value = the_history[which]; - - for (i = which; i < history_length; i++) - the_history[i] = the_history[i + 1]; - - history_length--; - } - - return (return_value); -} - -/* Stifle the history list, remembering only MAX number of lines. */ -void -stifle_history (max) - int max; -{ - register int i, j; - - if (max < 0) - max = 0; - - if (history_length > max) - { - /* This loses because we cannot free the data. */ - for (i = 0, j = history_length - max; i < j; i++) - free_history_entry (the_history[i]); - - history_base = i; - for (j = 0, i = history_length - max; j < max; i++, j++) - the_history[j] = the_history[i]; - the_history[j] = (HIST_ENTRY *)NULL; - history_length = j; - } - - history_stifled = 1; - max_input_history = history_max_entries = max; -} - -/* Stop stifling the history. This returns the previous maximum - number of history entries. The value is positive if the history - was stifled, negative if it wasn't. */ -int -unstifle_history () -{ - if (history_stifled) - { - history_stifled = 0; - return (history_max_entries); - } - else - return (-history_max_entries); -} - -int -history_is_stifled () -{ - return (history_stifled); -} - -void -clear_history () -{ - register int i; - - /* This loses because we cannot free the data. */ - for (i = 0; i < history_length; i++) - { - free_history_entry (the_history[i]); - the_history[i] = (HIST_ENTRY *)NULL; - } - - history_offset = history_length = 0; -} diff --git a/dep/src/readline/src/histsearch.c b/dep/src/readline/src/histsearch.c deleted file mode 100644 index 81b9b9e8c2b..00000000000 --- a/dep/src/readline/src/histsearch.c +++ /dev/null @@ -1,195 +0,0 @@ -/* histsearch.c -- searching the history list. */ - -/* Copyright (C) 1989, 1992 Free Software Foundation, Inc. - - This file contains the GNU History Library (the Library), a set of - routines for managing the text of previously typed lines. - - The Library is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - The Library is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#define READLINE_LIBRARY - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#include -#if defined (HAVE_STDLIB_H) -# include -#else -# include "ansi_stdlib.h" -#endif /* HAVE_STDLIB_H */ - -#if defined (HAVE_UNISTD_H) -# ifdef _MINIX -# include -# endif -# include -#endif - -#include "history.h" -#include "histlib.h" - -/* The list of alternate characters that can delimit a history search - string. */ -char *history_search_delimiter_chars = (char *)NULL; - -static int history_search_internal PARAMS((const char *, int, int)); - -/* Search the history for STRING, starting at history_offset. - If DIRECTION < 0, then the search is through previous entries, else - through subsequent. If ANCHORED is non-zero, the string must - appear at the beginning of a history line, otherwise, the string - may appear anywhere in the line. If the string is found, then - current_history () is the history entry, and the value of this - function is the offset in the line of that history entry that the - string was found in. Otherwise, nothing is changed, and a -1 is - returned. */ - -static int -history_search_internal (string, direction, anchored) - const char *string; - int direction, anchored; -{ - register int i, reverse; - register char *line; - register int line_index; - int string_len; - HIST_ENTRY **the_history; /* local */ - - i = history_offset; - reverse = (direction < 0); - - /* Take care of trivial cases first. */ - if (string == 0 || *string == '\0') - return (-1); - - if (!history_length || ((i >= history_length) && !reverse)) - return (-1); - - if (reverse && (i >= history_length)) - i = history_length - 1; - -#define NEXT_LINE() do { if (reverse) i--; else i++; } while (0) - - the_history = history_list (); - string_len = (int)strlen (string); - while (1) - { - /* Search each line in the history list for STRING. */ - - /* At limit for direction? */ - if ((reverse && i < 0) || (!reverse && i == history_length)) - return (-1); - - line = the_history[i]->line; - line_index = (int)strlen (line); - - /* If STRING is longer than line, no match. */ - if (string_len > line_index) - { - NEXT_LINE (); - continue; - } - - /* Handle anchored searches first. */ - if (anchored == ANCHORED_SEARCH) - { - if (STREQN (string, line, string_len)) - { - history_offset = i; - return (0); - } - - NEXT_LINE (); - continue; - } - - /* Do substring search. */ - if (reverse) - { - line_index -= string_len; - - while (line_index >= 0) - { - if (STREQN (string, line + line_index, string_len)) - { - history_offset = i; - return (line_index); - } - line_index--; - } - } - else - { - register int limit; - - limit = line_index - string_len + 1; - line_index = 0; - - while (line_index < limit) - { - if (STREQN (string, line + line_index, string_len)) - { - history_offset = i; - return (line_index); - } - line_index++; - } - } - NEXT_LINE (); - } -} - -/* Do a non-anchored search for STRING through the history in DIRECTION. */ -int -history_search (string, direction) - const char *string; - int direction; -{ - return (history_search_internal (string, direction, NON_ANCHORED_SEARCH)); -} - -/* Do an anchored search for string through the history in DIRECTION. */ -int -history_search_prefix (string, direction) - const char *string; - int direction; -{ - return (history_search_internal (string, direction, ANCHORED_SEARCH)); -} - -/* Search for STRING in the history list. DIR is < 0 for searching - backwards. POS is an absolute index into the history list at - which point to begin searching. */ -int -history_search_pos (string, dir, pos) - const char *string; - int dir, pos; -{ - int ret, old; - - old = where_history (); - history_set_pos (pos); - if (history_search (string, dir) == -1) - { - history_set_pos (old); - return (-1); - } - ret = where_history (); - history_set_pos (old); - return ret; -} diff --git a/dep/src/readline/src/input.c b/dep/src/readline/src/input.c deleted file mode 100644 index 606bc60ba19..00000000000 --- a/dep/src/readline/src/input.c +++ /dev/null @@ -1,788 +0,0 @@ -/* input.c -- character input functions for readline. */ - -/* Copyright (C) 1994 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ -#define READLINE_LIBRARY - -#if defined (__TANDEM) -# include -#endif - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#include -#include -#if defined (HAVE_SYS_FILE_H) -# include -#endif /* HAVE_SYS_FILE_H */ - -#if defined (HAVE_UNISTD_H) -# include -#endif /* HAVE_UNISTD_H */ - -#if defined (HAVE_STDLIB_H) -# include -#else -# include "ansi_stdlib.h" -#endif /* HAVE_STDLIB_H */ - -#if defined (HAVE_SELECT) -# if !defined (HAVE_SYS_SELECT_H) || !defined (M_UNIX) -# include -# endif -#endif /* HAVE_SELECT */ -#if defined (HAVE_SYS_SELECT_H) -# include -#endif - -#if defined (FIONREAD_IN_SYS_IOCTL) -# include -#endif - -#include -#include - -#if !defined (errno) -extern int errno; -#endif /* !errno */ - -/* System-specific feature definitions and include files. */ -#include "rldefs.h" -#include "rlmbutil.h" - -/* Some standard library routines. */ -#include "readline.h" - -#include "rlprivate.h" -#include "rlshell.h" -#include "xmalloc.h" - -/* What kind of non-blocking I/O do we have? */ -#if !defined (O_NDELAY) && defined (O_NONBLOCK) -# define O_NDELAY O_NONBLOCK /* Posix style */ -#endif - -/* Non-null means it is a pointer to a function to run while waiting for - character input. */ -rl_hook_func_t *rl_event_hook = (rl_hook_func_t *)NULL; - -rl_getc_func_t *rl_getc_function = rl_getc; - -static int _keyboard_input_timeout = 100000; /* 0.1 seconds; it's in usec */ - -static int ibuffer_space PARAMS((void)); -static int rl_get_char PARAMS((int *)); -static int rl_gather_tyi PARAMS((void)); - -/* **************************************************************** */ -/* */ -/* Character Input Buffering */ -/* */ -/* **************************************************************** */ - -static int pop_index, push_index; -static unsigned char ibuffer[512]; -static int ibuffer_len = sizeof (ibuffer) - 1; - -#define any_typein (push_index != pop_index) - -int -_rl_any_typein () -{ - return any_typein; -} - -/* Return the amount of space available in the buffer for stuffing - characters. */ -static int -ibuffer_space () -{ - if (pop_index > push_index) - return (pop_index - push_index - 1); - else - return (ibuffer_len - (push_index - pop_index)); -} - -/* Get a key from the buffer of characters to be read. - Return the key in KEY. - Result is KEY if there was a key, or 0 if there wasn't. */ -static int -rl_get_char (key) - int *key; -{ - if (push_index == pop_index) - return (0); - - *key = ibuffer[pop_index++]; - - if (pop_index >= ibuffer_len) - pop_index = 0; - - return (1); -} - -/* Stuff KEY into the *front* of the input buffer. - Returns non-zero if successful, zero if there is - no space left in the buffer. */ -int -_rl_unget_char (key) - int key; -{ - if (ibuffer_space ()) - { - pop_index--; - if (pop_index < 0) - pop_index = ibuffer_len - 1; - ibuffer[pop_index] = key; - return (1); - } - return (0); -} - -int -_rl_pushed_input_available () -{ - return (push_index != pop_index); -} - -#ifndef _WIN32 -/* If a character is available to be read, then read it and stuff it into - IBUFFER. Otherwise, just return. Returns number of characters read - (0 if none available) and -1 on error (EIO). */ -static int -rl_gather_tyi () -{ - int tty; - register int tem, result; - int chars_avail, k; - char input; -#if defined(HAVE_SELECT) - fd_set readfds, exceptfds; - struct timeval timeout; -#endif - - tty = fileno (rl_instream); - -#if defined (HAVE_SELECT) - FD_ZERO (&readfds); - FD_ZERO (&exceptfds); - FD_SET (tty, &readfds); - FD_SET (tty, &exceptfds); - timeout.tv_sec = 0; - timeout.tv_usec = _keyboard_input_timeout; - result = select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout); - if (result <= 0) - return 0; /* Nothing to read. */ -#endif - - result = -1; -#if defined (FIONREAD) - errno = 0; - result = ioctl (tty, FIONREAD, &chars_avail); - if (result == -1 && errno == EIO) - return -1; -#endif - -#if defined (O_NDELAY) - if (result == -1) - { - tem = fcntl (tty, F_GETFL, 0); - - fcntl (tty, F_SETFL, (tem | O_NDELAY)); - chars_avail = read (tty, &input, 1); - - fcntl (tty, F_SETFL, tem); - if (chars_avail == -1 && errno == EAGAIN) - return 0; - if (chars_avail == 0) /* EOF */ - { - rl_stuff_char (EOF); - return (0); - } - } -#endif /* O_NDELAY */ - - /* If there's nothing available, don't waste time trying to read - something. */ - if (chars_avail <= 0) - return 0; - - tem = ibuffer_space (); - - if (chars_avail > tem) - chars_avail = tem; - - /* One cannot read all of the available input. I can only read a single - character at a time, or else programs which require input can be - thwarted. If the buffer is larger than one character, I lose. - Damn! */ - if (tem < ibuffer_len) - chars_avail = 0; - - if (result != -1) - { - while (chars_avail--) - { - k = (*rl_getc_function) (rl_instream); - rl_stuff_char (k); - if (k == NEWLINE || k == RETURN) - break; - } - } - else - { - if (chars_avail) - rl_stuff_char (input); - } - - return 1; -} -#endif /* !_WIN32 */ - -int -rl_set_keyboard_input_timeout (u) - int u; -{ - int o; - - o = _keyboard_input_timeout; - if (u > 0) - _keyboard_input_timeout = u; - return (o); -} - -#ifndef _WIN32 -/* Is there input available to be read on the readline input file - descriptor? Only works if the system has select(2) or FIONREAD. - Uses the value of _keyboard_input_timeout as the timeout; if another - readline function wants to specify a timeout and not leave it up to - the user, it should use _rl_input_queued(timeout_value_in_microseconds) - instead. */ -int -_rl_input_available () -{ -#if defined(HAVE_SELECT) - fd_set readfds, exceptfds; - struct timeval timeout; -#endif -#if !defined (HAVE_SELECT) && defined(FIONREAD) - int chars_avail; -#endif - int tty; - - tty = fileno (rl_instream); - -#if defined (HAVE_SELECT) - FD_ZERO (&readfds); - FD_ZERO (&exceptfds); - FD_SET (tty, &readfds); - FD_SET (tty, &exceptfds); - timeout.tv_sec = 0; - timeout.tv_usec = _keyboard_input_timeout; - return (select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout) > 0); -#else - -#if defined (FIONREAD) - if (ioctl (tty, FIONREAD, &chars_avail) == 0) - return (chars_avail); -#endif - -#endif - - return 0; -} -#endif /* !_WIN32 */ - -int -_rl_input_queued (t) - int t; -{ - int old_timeout, r; - - old_timeout = rl_set_keyboard_input_timeout (t); - r = _rl_input_available (); - rl_set_keyboard_input_timeout (old_timeout); - return r; -} - -void -_rl_insert_typein (c) - int c; -{ - int key, t, i; - char *string; - - i = key = 0; - string = (char *)xmalloc (ibuffer_len + 1); - string[i++] = (char) c; - - while ((t = rl_get_char (&key)) && - _rl_keymap[key].type == ISFUNC && - _rl_keymap[key].function == rl_insert) - string[i++] = key; - - if (t) - _rl_unget_char (key); - - string[i] = '\0'; - rl_insert_text (string); - free (string); -} - -/* Add KEY to the buffer of characters to be read. Returns 1 if the - character was stuffed correctly; 0 otherwise. */ -int -rl_stuff_char (key) - int key; -{ - if (ibuffer_space () == 0) - return 0; - - if (key == EOF) - { - key = NEWLINE; - rl_pending_input = EOF; - RL_SETSTATE (RL_STATE_INPUTPENDING); - } - ibuffer[push_index++] = key; - if (push_index >= ibuffer_len) - push_index = 0; - - return 1; -} - -/* Make C be the next command to be executed. */ -int -rl_execute_next (c) - int c; -{ - rl_pending_input = c; - RL_SETSTATE (RL_STATE_INPUTPENDING); - return 0; -} - -/* Clear any pending input pushed with rl_execute_next() */ -int -rl_clear_pending_input () -{ - rl_pending_input = 0; - RL_UNSETSTATE (RL_STATE_INPUTPENDING); - return 0; -} - -/* **************************************************************** */ -/* */ -/* Character Input */ -/* */ -/* **************************************************************** */ - -/* Read a key, including pending input. */ -int -rl_read_key () -{ - int c; - - rl_key_sequence_length++; - - if (rl_pending_input) - { - c = rl_pending_input; - rl_clear_pending_input (); - } - else - { - /* If input is coming from a macro, then use that. */ - if (c = _rl_next_macro_key ()) - return (c); - - /* If the user has an event function, then call it periodically. */ - if (rl_event_hook) - { - while (rl_event_hook && rl_get_char (&c) == 0) - { - (*rl_event_hook) (); - if (rl_done) /* XXX - experimental */ - return ('\n'); - if (rl_gather_tyi () < 0) /* XXX - EIO */ - { - rl_done = 1; - return ('\n'); - } - } - } - else - { - if (rl_get_char (&c) == 0) - c = (*rl_getc_function) (rl_instream); - } - } - - return (c); -} - -#ifndef _WIN32 -int -rl_getc (stream) - FILE *stream; -{ - int result; - unsigned char c; - - while (1) - { - result = read (fileno (stream), &c, sizeof (unsigned char)); - - if (result == sizeof (unsigned char)) - return (c); - - /* If zero characters are returned, then the file that we are - reading from is empty! Return EOF in that case. */ - if (result == 0) - return (EOF); - -#if defined (__BEOS__) - if (errno == EINTR) - continue; -#endif - -#if defined (EWOULDBLOCK) -# define X_EWOULDBLOCK EWOULDBLOCK -#else -# define X_EWOULDBLOCK -99 -#endif - -#if defined (EAGAIN) -# define X_EAGAIN EAGAIN -#else -# define X_EAGAIN -99 -#endif - - if (errno == X_EWOULDBLOCK || errno == X_EAGAIN) - { - if (sh_unset_nodelay_mode (fileno (stream)) < 0) - return (EOF); - continue; - } - -#undef X_EWOULDBLOCK -#undef X_EAGAIN - - /* If the error that we received was SIGINT, then try again, - this is simply an interrupted system call to read (). - Otherwise, some error ocurred, also signifying EOF. */ - if (errno != EINTR) - return (EOF); - } -} - -#else /* _WIN32 */ - -#include -#include -#include -#include - -#define EXT_PREFIX 0x1f8 - -#define KEV irec.Event.KeyEvent /* to make life easier */ -#define KST irec.Event.KeyEvent.dwControlKeyState - -static int pending_key = 0; -static int pending_count = 0; -static int pending_prefix = 0; - -extern int _rl_last_c_pos; /* imported from display.c */ -extern int _rl_last_v_pos; -extern int rl_dispatching; /* imported from readline.c */ -extern int rl_point; -extern int rl_done; -extern int rl_visible_prompt_length; -extern int _rl_screenwidth; /* imported from terminal.c */ - -extern int haveConsole; /* imported from rltty.c */ -extern HANDLE hStdout, hStdin; -extern COORD rlScreenOrigin, rlScreenEnd; -extern int rlScreenStart, rlScreenMax; -static void MouseEventProc(MOUSE_EVENT_RECORD kev); - -int rl_getc (stream) - FILE *stream; -{ - if ( pending_count ) - { - --pending_count; - if ( pending_prefix && (pending_count & 1) ) - return pending_prefix; - else - return pending_key; - } - - while ( 1 ) - { - if (WaitForSingleObject(hStdin, WAIT_FOR_INPUT) != WAIT_OBJECT_0) - { - if ( rl_done ) - return( 0 ); - else - continue; - } - if ( haveConsole & FOR_INPUT ) - { - INPUT_RECORD irec; - - DWORD dwNumberOfEventsRead = 0; - BOOL success = ReadConsoleInput (hStdin, &irec, 1, &dwNumberOfEventsRead); - if (!success || dwNumberOfEventsRead == 0) - return EOF; - - switch(irec.EventType) - { - case KEY_EVENT: - if (KEV.bKeyDown && - ((KEV.wVirtualKeyCode < VK_SHIFT) || - (KEV.wVirtualKeyCode > VK_MENU))) - { - pending_count = KEV.wRepeatCount; - pending_prefix = 0; - pending_key = KEV.uChar.AsciiChar & 0xff; - - if (KST & ENHANCED_KEY) - { -#define CTRL_TO_ASCII(c) ((c) - 'a' + 1) - switch (KEV.wVirtualKeyCode) - { - case VK_HOME: - pending_key = CTRL_TO_ASCII ('a'); - break; - case VK_END: - pending_key = CTRL_TO_ASCII ('e'); - break; - case VK_LEFT: - pending_key = CTRL_TO_ASCII ('b'); - break; - case VK_RIGHT: - pending_key = CTRL_TO_ASCII ('f'); - break; - case VK_UP: - pending_key = CTRL_TO_ASCII ('p'); - break; - case VK_DOWN: - pending_key = CTRL_TO_ASCII ('n'); - break; - case VK_DELETE: - pending_key = CTRL_TO_ASCII ('d'); - break; - } - } - - if (KST & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED)) - pending_prefix = VK_ESCAPE; - - if (pending_prefix) - pending_count = (pending_count << 1) - 1; - - /* Ascii direct */ - if (pending_key) - pending_count--; - - if (pending_prefix) - return pending_prefix; - return pending_key; - } - break; - case MOUSE_EVENT: - if ( (haveConsole & FOR_OUTPUT) && !rl_dispatching ) - MouseEventProc(irec.Event.MouseEvent); - default: - break; - } - } - else - { - char key = 0; - DWORD dwNumberOfBytesRead = 0; - BOOL success = ReadFile(hStdin, &key, 1, &dwNumberOfBytesRead, NULL); - if (!success || dwNumberOfBytesRead == 0) - return EOF; - - return key; - } - } -} - -void MouseEventProc(MOUSE_EVENT_RECORD mev) -{ - static DWORD lastButtonState, cstat_flags; - static COORD lastButtonPos, src_down_pos; - -#define RLPOS_CHANGED 1 -#define SELECT_START 2 - - switch (mev.dwEventFlags ) - { - case 0 : /* change in button state */ - - /* Cursor setting: - LEFT_BUTTON_PRESSED sets cursor anywhere on the screen, - thereafter, any change in button state will clipp the cursor - position to the readline range if there has been no cursor - movement. Otherwhise the cursor is reset to its old position. - */ - if (mev.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) - { - if (lastButtonState == 0) - { - src_down_pos = mev.dwMousePosition; - cstat_flags |= RLPOS_CHANGED | SELECT_START; - SetConsoleCursorPosition(hStdout, mev.dwMousePosition); - } - } - else - { - if (cstat_flags & RLPOS_CHANGED) - { - if ( (mev.dwMousePosition.X == src_down_pos.X) - && (mev.dwMousePosition.Y == src_down_pos.Y) ) - { - int linear_pos = (int)mev.dwMousePosition.Y * _rl_screenwidth - + (int)mev.dwMousePosition.X; - if (linear_pos < rlScreenStart + rl_visible_prompt_length) - { - linear_pos = rlScreenStart + rl_visible_prompt_length; - mev.dwMousePosition.X = rlScreenOrigin.X + rl_visible_prompt_length; - mev.dwMousePosition.Y = rlScreenOrigin.Y; - } - if (linear_pos > rlScreenMax) - { - linear_pos = rlScreenMax; - mev.dwMousePosition = rlScreenEnd; - } - rl_point = linear_pos - rlScreenStart - rl_visible_prompt_length; - _rl_last_c_pos = mev.dwMousePosition.X - rlScreenOrigin.X; - _rl_last_v_pos = mev.dwMousePosition.Y - rlScreenOrigin.Y; - } - else - { - mev.dwMousePosition.X = rlScreenOrigin.X + _rl_last_c_pos; - mev.dwMousePosition.Y = rlScreenOrigin.Y + _rl_last_v_pos; - } - SetConsoleCursorPosition(hStdout, mev.dwMousePosition); - cstat_flags &= !RLPOS_CHANGED; - } - } - lastButtonState = mev.dwButtonState; - lastButtonPos = mev.dwMousePosition; - break; - case MOUSE_MOVED: /* the most frequent event */ - default: - break; - } -} - -int _rl_input_available () -{ - if (isatty (fileno (rl_instream))) - return (kbhit()); - return 0; -} - -static int rl_gather_tyi () -{ - int count = 0; - while (isatty (fileno (rl_instream)) && kbhit () && ibuffer_space ()) - { - rl_stuff_char ((*rl_getc_function) (rl_instream)); - count++; - } - return count; -} -#endif /* _WIN32 */ - -#if defined (HANDLE_MULTIBYTE) -/* read multibyte char */ -int -_rl_read_mbchar (mbchar, size) - char *mbchar; - int size; -{ - int mb_len = 0; - size_t mbchar_bytes_length; - wchar_t wc; - mbstate_t ps, ps_back; - - memset(&ps, 0, sizeof (mbstate_t)); - memset(&ps_back, 0, sizeof (mbstate_t)); - - while (mb_len < size) - { - RL_SETSTATE(RL_STATE_MOREINPUT); - mbchar[mb_len++] = rl_read_key (); - RL_UNSETSTATE(RL_STATE_MOREINPUT); - - mbchar_bytes_length = mbrtowc (&wc, mbchar, mb_len, &ps); - if (mbchar_bytes_length == (size_t)(-1)) - break; /* invalid byte sequence for the current locale */ - else if (mbchar_bytes_length == (size_t)(-2)) - { - /* shorted bytes */ - ps = ps_back; - continue; - } - else if (mbchar_bytes_length > (size_t)(0)) - break; - } - - return mb_len; -} - -/* Read a multibyte-character string whose first character is FIRST into - the buffer MB of length MBLEN. Returns the last character read, which - may be FIRST. Used by the search functions, among others. Very similar - to _rl_read_mbchar. */ -int -_rl_read_mbstring (first, mb, mblen) - int first; - char *mb; - int mblen; -{ - int i, c; - mbstate_t ps; - - c = first; - memset (mb, 0, mblen); - for (i = 0; i < mblen; i++) - { - mb[i] = (char)c; - memset (&ps, 0, sizeof (mbstate_t)); - if (_rl_get_char_len (mb, &ps) == -2) - { - /* Read more for multibyte character */ - RL_SETSTATE (RL_STATE_MOREINPUT); - c = rl_read_key (); - RL_UNSETSTATE (RL_STATE_MOREINPUT); - } - else - break; - } - return c; -} -#endif /* HANDLE_MULTIBYTE */ diff --git a/dep/src/readline/src/isearch.c b/dep/src/readline/src/isearch.c deleted file mode 100644 index e74b54fbd62..00000000000 --- a/dep/src/readline/src/isearch.c +++ /dev/null @@ -1,560 +0,0 @@ -/* **************************************************************** */ -/* */ -/* I-Search and Searching */ -/* */ -/* **************************************************************** */ - -/* Copyright (C) 1987-2002 Free Software Foundation, Inc. - - This file contains the Readline Library (the Library), a set of - routines for providing Emacs style line input to programs that ask - for it. - - The Library is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - The Library is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ -#define READLINE_LIBRARY - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#include - -#include - -#if defined (HAVE_UNISTD_H) -# include -#endif - -#if defined (HAVE_STDLIB_H) -# include -#else -# include "ansi_stdlib.h" -#endif - -#include "rldefs.h" -#include "rlmbutil.h" - -#include "readline.h" -#include "history.h" - -#include "rlprivate.h" -#include "xmalloc.h" - -/* Variables exported to other files in the readline library. */ -char *_rl_isearch_terminators = (char *)NULL; - -/* Variables imported from other files in the readline library. */ -extern HIST_ENTRY *_rl_saved_line_for_history; - -/* Forward declarations */ -static int rl_search_history PARAMS((int, int)); - -/* Last line found by the current incremental search, so we don't `find' - identical lines many times in a row. */ -static char *prev_line_found; - -/* Last search string and its length. */ -static char *last_isearch_string; -static int last_isearch_string_len; - -static char *default_isearch_terminators = "\033\012"; - -/* Search backwards through the history looking for a string which is typed - interactively. Start with the current line. */ -int -rl_reverse_search_history (sign, key) - int sign, key; -{ - return (rl_search_history (-sign, key)); -} - -/* Search forwards through the history looking for a string which is typed - interactively. Start with the current line. */ -int -rl_forward_search_history (sign, key) - int sign, key; -{ - return (rl_search_history (sign, key)); -} - -/* Display the current state of the search in the echo-area. - SEARCH_STRING contains the string that is being searched for, - DIRECTION is zero for forward, or 1 for reverse, - WHERE is the history list number of the current line. If it is - -1, then this line is the starting one. */ -static void -rl_display_search (search_string, reverse_p, where) - char *search_string; - int reverse_p, where; -{ - char *message; - size_t msglen, searchlen; - - searchlen = (search_string && *search_string) ? strlen (search_string) : 0; - - message = (char *)xmalloc (searchlen + 33); - msglen = 0; - -#if defined (NOTDEF) - if (where != -1) - { - sprintf (message, "[%d]", where + history_base); - msglen = strlen (message); - } -#endif /* NOTDEF */ - - message[msglen++] = '('; - - if (reverse_p) - { - strcpy (message + msglen, "reverse-"); - msglen += 8; - } - - strcpy (message + msglen, "i-search)`"); - msglen += 10; - - if (search_string) - { - strcpy (message + msglen, search_string); - msglen += searchlen; - } - - strcpy (message + msglen, "': "); - - rl_message ("%s", message); - free (message); - (*rl_redisplay_function) (); -} - -/* Search through the history looking for an interactively typed string. - This is analogous to i-search. We start the search in the current line. - DIRECTION is which direction to search; >= 0 means forward, < 0 means - backwards. */ -static int -rl_search_history (direction, invoking_key) - int direction, invoking_key; -{ - /* The string that the user types in to search for. */ - char *search_string; - - /* The current length of SEARCH_STRING. */ - int search_string_index; - - /* The amount of space that SEARCH_STRING has allocated to it. */ - int search_string_size; - - /* The list of lines to search through. */ - char **lines, *allocated_line; - - /* The length of LINES. */ - int hlen; - - /* Where we get LINES from. */ - HIST_ENTRY **hlist; - - register int i; - int orig_point, orig_mark, orig_line, last_found_line; - int c, found, failed, sline_len; - int n, wstart, wlen; -#if defined (HANDLE_MULTIBYTE) - char mb[MB_LEN_MAX]; -#endif - - /* The line currently being searched. */ - char *sline; - - /* Offset in that line. */ - int line_index; - - /* Non-zero if we are doing a reverse search. */ - int reverse; - - /* The list of characters which terminate the search, but are not - subsequently executed. If the variable isearch-terminators has - been set, we use that value, otherwise we use ESC and C-J. */ - char *isearch_terminators; - - RL_SETSTATE(RL_STATE_ISEARCH); - orig_point = rl_point; - orig_mark = rl_mark; - last_found_line = orig_line = where_history (); - reverse = direction < 0; - hlist = history_list (); - allocated_line = (char *)NULL; - - isearch_terminators = _rl_isearch_terminators ? _rl_isearch_terminators - : default_isearch_terminators; - - /* Create an arrary of pointers to the lines that we want to search. */ - rl_maybe_replace_line (); - i = 0; - if (hlist) - for (i = 0; hlist[i]; i++); - - /* Allocate space for this many lines, +1 for the current input line, - and remember those lines. */ - lines = (char **)xmalloc ((1 + (hlen = i)) * sizeof (char *)); - for (i = 0; i < hlen; i++) - lines[i] = hlist[i]->line; - - if (_rl_saved_line_for_history) - lines[i] = _rl_saved_line_for_history->line; - else - { - /* Keep track of this so we can free it. */ - allocated_line = (char *)xmalloc (1 + strlen (rl_line_buffer)); - strcpy (allocated_line, &rl_line_buffer[0]); - lines[i] = allocated_line; - } - - hlen++; - - /* The line where we start the search. */ - i = orig_line; - - rl_save_prompt (); - - /* Initialize search parameters. */ - search_string = (char *)xmalloc (search_string_size = 128); - *search_string = '\0'; - search_string_index = 0; - prev_line_found = (char *)0; /* XXX */ - - /* Normalize DIRECTION into 1 or -1. */ - direction = (direction >= 0) ? 1 : -1; - - rl_display_search (search_string, reverse, -1); - - sline = rl_line_buffer; - sline_len = (int)strlen (sline); - line_index = rl_point; - - found = failed = 0; - for (;;) - { - rl_command_func_t *f = (rl_command_func_t *)NULL; - - /* Read a key and decide how to proceed. */ - RL_SETSTATE(RL_STATE_MOREINPUT); - c = rl_read_key (); - RL_UNSETSTATE(RL_STATE_MOREINPUT); - -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - c = _rl_read_mbstring (c, mb, MB_LEN_MAX); -#endif - - /* Translate the keys we do something with to opcodes. */ - if (c >= 0 && _rl_keymap[c].type == ISFUNC) - { - f = _rl_keymap[c].function; - - if (f == rl_reverse_search_history) - c = reverse ? -1 : -2; - else if (f == rl_forward_search_history) - c = !reverse ? -1 : -2; - else if (f == rl_rubout) - c = -3; - else if (c == CTRL ('G')) - c = -4; - else if (c == CTRL ('W')) /* XXX */ - c = -5; - else if (c == CTRL ('Y')) /* XXX */ - c = -6; - } - - /* The characters in isearch_terminators (set from the user-settable - variable isearch-terminators) are used to terminate the search but - not subsequently execute the character as a command. The default - value is "\033\012" (ESC and C-J). */ - if (strchr (isearch_terminators, c)) - { - /* ESC still terminates the search, but if there is pending - input or if input arrives within 0.1 seconds (on systems - with select(2)) it is used as a prefix character - with rl_execute_next. WATCH OUT FOR THIS! This is intended - to allow the arrow keys to be used like ^F and ^B are used - to terminate the search and execute the movement command. - XXX - since _rl_input_available depends on the application- - settable keyboard timeout value, this could alternatively - use _rl_input_queued(100000) */ - if (c == ESC && _rl_input_available ()) - rl_execute_next (ESC); - break; - } - -#define ENDSRCH_CHAR(c) \ - ((CTRL_CHAR (c) || META_CHAR (c) || (c) == RUBOUT) && ((c) != CTRL ('G'))) - -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - { - if (c >= 0 && strlen (mb) == 1 && ENDSRCH_CHAR (c)) - { - /* This sets rl_pending_input to c; it will be picked up the next - time rl_read_key is called. */ - rl_execute_next (c); - break; - } - } - else -#endif - if (c >= 0 && ENDSRCH_CHAR (c)) - { - /* This sets rl_pending_input to c; it will be picked up the next - time rl_read_key is called. */ - rl_execute_next (c); - break; - } - - switch (c) - { - case -1: - if (search_string_index == 0) - { - if (last_isearch_string) - { - search_string_size = 64 + last_isearch_string_len; - search_string = (char *)xrealloc (search_string, search_string_size); - strcpy (search_string, last_isearch_string); - search_string_index = last_isearch_string_len; - rl_display_search (search_string, reverse, -1); - break; - } - continue; - } - else if (reverse) - --line_index; - else if (line_index != sline_len) - ++line_index; - else - rl_ding (); - break; - - /* switch directions */ - case -2: - direction = -direction; - reverse = direction < 0; - break; - - /* delete character from search string. */ - case -3: /* C-H, DEL */ - /* This is tricky. To do this right, we need to keep a - stack of search positions for the current search, with - sentinels marking the beginning and end. But this will - do until we have a real isearch-undo. */ - if (search_string_index == 0) - rl_ding (); - else - search_string[--search_string_index] = '\0'; - - break; - - case -4: /* C-G */ - rl_replace_line (lines[orig_line], 0); - rl_point = orig_point; - rl_mark = orig_mark; - rl_restore_prompt(); - rl_clear_message (); - if (allocated_line) - free (allocated_line); - free (lines); - RL_UNSETSTATE(RL_STATE_ISEARCH); - return 0; - - case -5: /* C-W */ - /* skip over portion of line we already matched */ - wstart = rl_point + search_string_index; - if (wstart >= rl_end) - { - rl_ding (); - break; - } - - /* if not in a word, move to one. */ - if (rl_alphabetic(rl_line_buffer[wstart]) == 0) - { - rl_ding (); - break; - } - n = wstart; - while (n < rl_end && rl_alphabetic(rl_line_buffer[n])) - n++; - wlen = n - wstart + 1; - if (search_string_index + wlen + 1 >= search_string_size) - { - search_string_size += wlen + 1; - search_string = (char *)xrealloc (search_string, search_string_size); - } - for (; wstart < n; wstart++) - search_string[search_string_index++] = rl_line_buffer[wstart]; - search_string[search_string_index] = '\0'; - break; - - case -6: /* C-Y */ - /* skip over portion of line we already matched */ - wstart = rl_point + search_string_index; - if (wstart >= rl_end) - { - rl_ding (); - break; - } - n = rl_end - wstart + 1; - if (search_string_index + n + 1 >= search_string_size) - { - search_string_size += n + 1; - search_string = (char *)xrealloc (search_string, search_string_size); - } - for (n = wstart; n < rl_end; n++) - search_string[search_string_index++] = rl_line_buffer[n]; - search_string[search_string_index] = '\0'; - break; - - default: - /* Add character to search string and continue search. */ - if (search_string_index + 2 >= search_string_size) - { - search_string_size += 128; - search_string = (char *)xrealloc (search_string, search_string_size); - } -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - { - int j, l; - for (j = 0, l = strlen (mb); j < l; ) - search_string[search_string_index++] = mb[j++]; - } - else -#endif - search_string[search_string_index++] = c; - search_string[search_string_index] = '\0'; - break; - } - - for (found = failed = 0;;) - { - int limit = sline_len - search_string_index + 1; - - /* Search the current line. */ - while (reverse ? (line_index >= 0) : (line_index < limit)) - { - if (STREQN (search_string, sline + line_index, search_string_index)) - { - found++; - break; - } - else - line_index += direction; - } - if (found) - break; - - /* Move to the next line, but skip new copies of the line - we just found and lines shorter than the string we're - searching for. */ - do - { - /* Move to the next line. */ - i += direction; - - /* At limit for direction? */ - if (reverse ? (i < 0) : (i == hlen)) - { - failed++; - break; - } - - /* We will need these later. */ - sline = lines[i]; - sline_len = (int)strlen (sline); - } - while ((prev_line_found && STREQ (prev_line_found, lines[i])) || - (search_string_index > sline_len)); - - if (failed) - break; - - /* Now set up the line for searching... */ - line_index = reverse ? sline_len - search_string_index : 0; - } - - if (failed) - { - /* We cannot find the search string. Ding the bell. */ - rl_ding (); - i = last_found_line; - continue; /* XXX - was break */ - } - - /* We have found the search string. Just display it. But don't - actually move there in the history list until the user accepts - the location. */ - if (found) - { - prev_line_found = lines[i]; - rl_replace_line (lines[i], 0); - rl_point = line_index; - last_found_line = i; - rl_display_search (search_string, reverse, (i == orig_line) ? -1 : i); - } - } - - /* The searching is over. The user may have found the string that she - was looking for, or else she may have exited a failing search. If - LINE_INDEX is -1, then that shows that the string searched for was - not found. We use this to determine where to place rl_point. */ - - /* First put back the original state. */ - strcpy (rl_line_buffer, lines[orig_line]); - - rl_restore_prompt (); - - /* Save the search string for possible later use. */ - FREE (last_isearch_string); - last_isearch_string = search_string; - last_isearch_string_len = search_string_index; - - if (last_found_line < orig_line) - rl_get_previous_history (orig_line - last_found_line, 0); - else - rl_get_next_history (last_found_line - orig_line, 0); - - /* If the string was not found, put point at the end of the last matching - line. If last_found_line == orig_line, we didn't find any matching - history lines at all, so put point back in its original position. */ - if (line_index < 0) - { - if (last_found_line == orig_line) - line_index = orig_point; - else - line_index = (int)strlen (rl_line_buffer); - rl_mark = orig_mark; - } - - rl_point = line_index; - /* Don't worry about where to put the mark here; rl_get_previous_history - and rl_get_next_history take care of it. */ - - rl_clear_message (); - - FREE (allocated_line); - free (lines); - - RL_UNSETSTATE(RL_STATE_ISEARCH); - - return 0; -} diff --git a/dep/src/readline/src/keymaps.c b/dep/src/readline/src/keymaps.c deleted file mode 100644 index 70d0cc08d3f..00000000000 --- a/dep/src/readline/src/keymaps.c +++ /dev/null @@ -1,149 +0,0 @@ -/* keymaps.c -- Functions and keymaps for the GNU Readline library. */ - -/* Copyright (C) 1988,1989 Free Software Foundation, Inc. - - This file is part of GNU Readline, a library for reading lines - of text with interactive input and history editing. - - Readline is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2, or (at your option) any - later version. - - Readline is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Readline; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ -#define READLINE_LIBRARY - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#if defined (HAVE_STDLIB_H) -# include -#else -# include "ansi_stdlib.h" -#endif /* HAVE_STDLIB_H */ - -#include /* for FILE * definition for readline.h */ - -#include "readline.h" -#include "rlconf.h" - -#include "emacs_keymap.c" - -#if defined (VI_MODE) -#include "vi_keymap.c" -#endif - -#include "xmalloc.h" - -/* **************************************************************** */ -/* */ -/* Functions for manipulating Keymaps. */ -/* */ -/* **************************************************************** */ - - -/* Return a new, empty keymap. - Free it with free() when you are done. */ -Keymap -rl_make_bare_keymap () -{ - register int i; - Keymap keymap = (Keymap)xmalloc (KEYMAP_SIZE * sizeof (KEYMAP_ENTRY)); - - for (i = 0; i < KEYMAP_SIZE; i++) - { - keymap[i].type = ISFUNC; - keymap[i].function = (rl_command_func_t *)NULL; - } - -#if 0 - for (i = 'A'; i < ('Z' + 1); i++) - { - keymap[i].type = ISFUNC; - keymap[i].function = rl_do_lowercase_version; - } -#endif - - return (keymap); -} - -/* Return a new keymap which is a copy of MAP. */ -Keymap -rl_copy_keymap (map) - Keymap map; -{ - register int i; - Keymap temp; - - temp = rl_make_bare_keymap (); - for (i = 0; i < KEYMAP_SIZE; i++) - { - temp[i].type = map[i].type; - temp[i].function = map[i].function; - } - return (temp); -} - -/* Return a new keymap with the printing characters bound to rl_insert, - the uppercase Meta characters bound to run their lowercase equivalents, - and the Meta digits bound to produce numeric arguments. */ -Keymap -rl_make_keymap () -{ - register int i; - Keymap newmap; - - newmap = rl_make_bare_keymap (); - - /* All ASCII printing characters are self-inserting. */ - for (i = ' '; i < 127; i++) - newmap[i].function = rl_insert; - - newmap[TAB].function = rl_insert; - newmap[RUBOUT].function = rl_rubout; /* RUBOUT == 127 */ - newmap[CTRL('H')].function = rl_rubout; - -#if KEYMAP_SIZE > 128 - /* Printing characters in ISO Latin-1 and some 8-bit character sets. */ - for (i = 128; i < 256; i++) - newmap[i].function = rl_insert; -#endif /* KEYMAP_SIZE > 128 */ - - return (newmap); -} - -/* Free the storage associated with MAP. */ -void -rl_discard_keymap (map) - Keymap map; -{ - int i; - - if (!map) - return; - - for (i = 0; i < KEYMAP_SIZE; i++) - { - switch (map[i].type) - { - case ISFUNC: - break; - - case ISKMAP: - rl_discard_keymap ((Keymap)map[i].function); - break; - - case ISMACR: - free ((char *)map[i].function); - break; - } - } -} diff --git a/dep/src/readline/src/kill.c b/dep/src/readline/src/kill.c deleted file mode 100644 index f20c0065aaa..00000000000 --- a/dep/src/readline/src/kill.c +++ /dev/null @@ -1,693 +0,0 @@ -/* kill.c -- kill ring management. */ - -/* Copyright (C) 1994 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ -#define READLINE_LIBRARY - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#include - -#if defined (HAVE_UNISTD_H) -# include /* for _POSIX_VERSION */ -#endif /* HAVE_UNISTD_H */ - -#if defined (HAVE_STDLIB_H) -# include -#else -# include "ansi_stdlib.h" -#endif /* HAVE_STDLIB_H */ - -#include - -/* System-specific feature definitions and include files. */ -#include "rldefs.h" - -/* Some standard library routines. */ -#include "readline.h" -#include "history.h" - -#include "rlprivate.h" -#include "xmalloc.h" - -/* **************************************************************** */ -/* */ -/* Killing Mechanism */ -/* */ -/* **************************************************************** */ - -/* What we assume for a max number of kills. */ -#define DEFAULT_MAX_KILLS 10 - -/* The real variable to look at to find out when to flush kills. */ -static int rl_max_kills = DEFAULT_MAX_KILLS; - -/* Where to store killed text. */ -static char **rl_kill_ring = (char **)NULL; - -/* Where we are in the kill ring. */ -static int rl_kill_index; - -/* How many slots we have in the kill ring. */ -static int rl_kill_ring_length; - -static int _rl_copy_to_kill_ring PARAMS((char *, int)); -static int region_kill_internal PARAMS((int)); -static int _rl_copy_word_as_kill PARAMS((int, int)); -static int rl_yank_nth_arg_internal PARAMS((int, int, int)); - -/* How to say that you only want to save a certain amount - of kill material. */ -int -rl_set_retained_kills (num) - int num; -{ - return 0; -} - -/* Add TEXT to the kill ring, allocating a new kill ring slot as necessary. - This uses TEXT directly, so the caller must not free it. If APPEND is - non-zero, and the last command was a kill, the text is appended to the - current kill ring slot, otherwise prepended. */ -static int -_rl_copy_to_kill_ring (text, append) - char *text; - int append; -{ - char *old, *new; - int slot; - - /* First, find the slot to work with. */ - if (_rl_last_command_was_kill == 0) - { - /* Get a new slot. */ - if (rl_kill_ring == 0) - { - /* If we don't have any defined, then make one. */ - rl_kill_ring = (char **) - xmalloc (((rl_kill_ring_length = 1) + 1) * sizeof (char *)); - rl_kill_ring[slot = 0] = (char *)NULL; - } - else - { - /* We have to add a new slot on the end, unless we have - exceeded the max limit for remembering kills. */ - slot = rl_kill_ring_length; - if (slot == rl_max_kills) - { - register int i; - free (rl_kill_ring[0]); - for (i = 0; i < slot; i++) - rl_kill_ring[i] = rl_kill_ring[i + 1]; - } - else - { - slot = rl_kill_ring_length += 1; - rl_kill_ring = (char **)xrealloc (rl_kill_ring, slot * sizeof (char *)); - } - rl_kill_ring[--slot] = (char *)NULL; - } - } - else - slot = rl_kill_ring_length - 1; - - /* If the last command was a kill, prepend or append. */ - if (_rl_last_command_was_kill && rl_editing_mode != vi_mode) - { - old = rl_kill_ring[slot]; - new = (char *)xmalloc (1 + strlen (old) + strlen (text)); - - if (append) - { - strcpy (new, old); - strcat (new, text); - } - else - { - strcpy (new, text); - strcat (new, old); - } - free (old); - free (text); - rl_kill_ring[slot] = new; - } - else - rl_kill_ring[slot] = text; - - rl_kill_index = slot; - return 0; -} - -/* The way to kill something. This appends or prepends to the last - kill, if the last command was a kill command. if FROM is less - than TO, then the text is appended, otherwise prepended. If the - last command was not a kill command, then a new slot is made for - this kill. */ -int -rl_kill_text (from, to) - int from, to; -{ - char *text; - - /* Is there anything to kill? */ - if (from == to) - { - _rl_last_command_was_kill++; - return 0; - } - - text = rl_copy_text (from, to); - - /* Delete the copied text from the line. */ - rl_delete_text (from, to); - - _rl_copy_to_kill_ring (text, from < to); - - _rl_last_command_was_kill++; - return 0; -} - -/* Now REMEMBER! In order to do prepending or appending correctly, kill - commands always make rl_point's original position be the FROM argument, - and rl_point's extent be the TO argument. */ - -/* **************************************************************** */ -/* */ -/* Killing Commands */ -/* */ -/* **************************************************************** */ - -/* Delete the word at point, saving the text in the kill ring. */ -int -rl_kill_word (count, key) - int count, key; -{ - int orig_point; - - if (count < 0) - return (rl_backward_kill_word (-count, key)); - else - { - orig_point = rl_point; - rl_forward_word (count, key); - - if (rl_point != orig_point) - rl_kill_text (orig_point, rl_point); - - rl_point = orig_point; - if (rl_editing_mode == emacs_mode) - rl_mark = rl_point; - } - return 0; -} - -/* Rubout the word before point, placing it on the kill ring. */ -int -rl_backward_kill_word (count, ignore) - int count, ignore; -{ - int orig_point; - - if (count < 0) - return (rl_kill_word (-count, ignore)); - else - { - orig_point = rl_point; - rl_backward_word (count, ignore); - - if (rl_point != orig_point) - rl_kill_text (orig_point, rl_point); - - if (rl_editing_mode == emacs_mode) - rl_mark = rl_point; - } - return 0; -} - -/* Kill from here to the end of the line. If DIRECTION is negative, kill - back to the line start instead. */ -int -rl_kill_line (direction, ignore) - int direction, ignore; -{ - int orig_point; - - if (direction < 0) - return (rl_backward_kill_line (1, ignore)); - else - { - orig_point = rl_point; - rl_end_of_line (1, ignore); - if (orig_point != rl_point) - rl_kill_text (orig_point, rl_point); - rl_point = orig_point; - if (rl_editing_mode == emacs_mode) - rl_mark = rl_point; - } - return 0; -} - -/* Kill backwards to the start of the line. If DIRECTION is negative, kill - forwards to the line end instead. */ -int -rl_backward_kill_line (direction, ignore) - int direction, ignore; -{ - int orig_point; - - if (direction < 0) - return (rl_kill_line (1, ignore)); - else - { - if (!rl_point) - rl_ding (); - else - { - orig_point = rl_point; - rl_beg_of_line (1, ignore); - if (rl_point != orig_point) - rl_kill_text (orig_point, rl_point); - if (rl_editing_mode == emacs_mode) - rl_mark = rl_point; - } - } - return 0; -} - -/* Kill the whole line, no matter where point is. */ -int -rl_kill_full_line (count, ignore) - int count, ignore; -{ - rl_begin_undo_group (); - rl_point = 0; - rl_kill_text (rl_point, rl_end); - rl_mark = 0; - rl_end_undo_group (); - return 0; -} - -/* The next two functions mimic unix line editing behaviour, except they - save the deleted text on the kill ring. This is safer than not saving - it, and since we have a ring, nobody should get screwed. */ - -/* This does what C-w does in Unix. We can't prevent people from - using behaviour that they expect. */ -int -rl_unix_word_rubout (count, key) - int count, key; -{ - int orig_point; - - if (rl_point == 0) - rl_ding (); - else - { - orig_point = rl_point; - if (count <= 0) - count = 1; - - while (count--) - { - while (rl_point && whitespace (rl_line_buffer[rl_point - 1])) - rl_point--; - - while (rl_point && (whitespace (rl_line_buffer[rl_point - 1]) == 0)) - rl_point--; - } - - rl_kill_text (orig_point, rl_point); - if (rl_editing_mode == emacs_mode) - rl_mark = rl_point; - } - - return 0; -} - -/* This deletes one filename component in a Unix pathname. That is, it - deletes backward to directory separator (`/') or whitespace. */ -int -rl_unix_filename_rubout (count, key) - int count, key; -{ - int orig_point, c; - - if (rl_point == 0) - rl_ding (); - else - { - orig_point = rl_point; - if (count <= 0) - count = 1; - - while (count--) - { - c = rl_line_buffer[rl_point - 1]; - while (rl_point && (whitespace (c) || c == '/')) - { - rl_point--; - c = rl_line_buffer[rl_point - 1]; - } - - while (rl_point && (whitespace (c) == 0) && c != '/') - { - rl_point--; - c = rl_line_buffer[rl_point - 1]; - } - } - - rl_kill_text (orig_point, rl_point); - if (rl_editing_mode == emacs_mode) - rl_mark = rl_point; - } - - return 0; -} - -/* Here is C-u doing what Unix does. You don't *have* to use these - key-bindings. We have a choice of killing the entire line, or - killing from where we are to the start of the line. We choose the - latter, because if you are a Unix weenie, then you haven't backspaced - into the line at all, and if you aren't, then you know what you are - doing. */ -int -rl_unix_line_discard (count, key) - int count, key; -{ - if (rl_point == 0) - rl_ding (); - else - { - rl_kill_text (rl_point, 0); - rl_point = 0; - if (rl_editing_mode == emacs_mode) - rl_mark = rl_point; - } - return 0; -} - -/* Copy the text in the `region' to the kill ring. If DELETE is non-zero, - delete the text from the line as well. */ -static int -region_kill_internal (delete) - int delete; -{ - char *text; - - if (rl_mark != rl_point) - { - text = rl_copy_text (rl_point, rl_mark); - if (delete) - rl_delete_text (rl_point, rl_mark); - _rl_copy_to_kill_ring (text, rl_point < rl_mark); - } - - _rl_last_command_was_kill++; - return 0; -} - -/* Copy the text in the region to the kill ring. */ -int -rl_copy_region_to_kill (count, ignore) - int count, ignore; -{ - return (region_kill_internal (0)); -} - -/* Kill the text between the point and mark. */ -int -rl_kill_region (count, ignore) - int count, ignore; -{ - int r, npoint; - - npoint = (rl_point < rl_mark) ? rl_point : rl_mark; - r = region_kill_internal (1); - _rl_fix_point (1); - rl_point = npoint; - return r; -} - -/* Copy COUNT words to the kill ring. DIR says which direction we look - to find the words. */ -static int -_rl_copy_word_as_kill (count, dir) - int count, dir; -{ - int om, op, r; - - om = rl_mark; - op = rl_point; - - if (dir > 0) - rl_forward_word (count, 0); - else - rl_backward_word (count, 0); - - rl_mark = rl_point; - - if (dir > 0) - rl_backward_word (count, 0); - else - rl_forward_word (count, 0); - - r = region_kill_internal (0); - - rl_mark = om; - rl_point = op; - - return r; -} - -int -rl_copy_forward_word (count, key) - int count, key; -{ - if (count < 0) - return (rl_copy_backward_word (-count, key)); - - return (_rl_copy_word_as_kill (count, 1)); -} - -int -rl_copy_backward_word (count, key) - int count, key; -{ - if (count < 0) - return (rl_copy_forward_word (-count, key)); - - return (_rl_copy_word_as_kill (count, -1)); -} - -/* Yank back the last killed text. This ignores arguments. */ -int -rl_yank (count, ignore) - int count, ignore; -{ - if (rl_kill_ring == 0) - { - _rl_abort_internal (); - return -1; - } - - _rl_set_mark_at_pos (rl_point); - rl_insert_text (rl_kill_ring[rl_kill_index]); - return 0; -} - -/* If the last command was yank, or yank_pop, and the text just - before point is identical to the current kill item, then - delete that text from the line, rotate the index down, and - yank back some other text. */ -int -rl_yank_pop (count, key) - int count, key; -{ - int l, n; - - if (((rl_last_func != rl_yank_pop) && (rl_last_func != rl_yank)) || - !rl_kill_ring) - { - _rl_abort_internal (); - return -1; - } - - l = (int)strlen (rl_kill_ring[rl_kill_index]); - n = rl_point - l; - if (n >= 0 && STREQN (rl_line_buffer + n, rl_kill_ring[rl_kill_index], l)) - { - rl_delete_text (n, rl_point); - rl_point = n; - rl_kill_index--; - if (rl_kill_index < 0) - rl_kill_index = rl_kill_ring_length - 1; - rl_yank (1, 0); - return 0; - } - else - { - _rl_abort_internal (); - return -1; - } -} - -/* Yank the COUNTh argument from the previous history line, skipping - HISTORY_SKIP lines before looking for the `previous line'. */ -static int -rl_yank_nth_arg_internal (count, ignore, history_skip) - int count, ignore, history_skip; -{ - register HIST_ENTRY *entry; - char *arg; - int i, pos; - - pos = where_history (); - - if (history_skip) - { - for (i = 0; i < history_skip; i++) - entry = previous_history (); - } - - entry = previous_history (); - - history_set_pos (pos); - - if (entry == 0) - { - rl_ding (); - return -1; - } - - arg = history_arg_extract (count, count, entry->line); - if (!arg || !*arg) - { - rl_ding (); - return -1; - } - - rl_begin_undo_group (); - - _rl_set_mark_at_pos (rl_point); - -#if defined (VI_MODE) - /* Vi mode always inserts a space before yanking the argument, and it - inserts it right *after* rl_point. */ - if (rl_editing_mode == vi_mode) - { - rl_vi_append_mode (1, ignore); - rl_insert_text (" "); - } -#endif /* VI_MODE */ - - rl_insert_text (arg); - free (arg); - - rl_end_undo_group (); - return 0; -} - -/* Yank the COUNTth argument from the previous history line. */ -int -rl_yank_nth_arg (count, ignore) - int count, ignore; -{ - return (rl_yank_nth_arg_internal (count, ignore, 0)); -} - -/* Yank the last argument from the previous history line. This `knows' - how rl_yank_nth_arg treats a count of `$'. With an argument, this - behaves the same as rl_yank_nth_arg. */ -int -rl_yank_last_arg (count, key) - int count, key; -{ - static int history_skip = 0; - static int explicit_arg_p = 0; - static int count_passed = 1; - static int direction = 1; - static int undo_needed = 0; - int retval; - - if (rl_last_func != rl_yank_last_arg) - { - history_skip = 0; - explicit_arg_p = rl_explicit_arg; - count_passed = count; - direction = 1; - } - else - { - if (undo_needed) - rl_do_undo (); - if (count < 1) - direction = -direction; - history_skip += direction; - if (history_skip < 0) - history_skip = 0; - } - - if (explicit_arg_p) - retval = rl_yank_nth_arg_internal (count_passed, key, history_skip); - else - retval = rl_yank_nth_arg_internal ('$', key, history_skip); - - undo_needed = retval == 0; - return retval; -} - -/* A special paste command for users of Cygnus's cygwin32. */ -#if defined (__CYGWIN__) || defined (_WIN32) -#include - -int -rl_paste_from_clipboard (count, key) - int count, key; -{ - char *data, *ptr; - size_t len; - - if (OpenClipboard (NULL) == 0) - return (0); - - data = (char *)GetClipboardData (CF_TEXT); - if (data) - { - ptr = strchr (data, '\r'); - if (ptr) - { - len = ptr - data; - ptr = (char *)xmalloc (len + 1); - ptr[len] = '\0'; - strncpy (ptr, data, len); - } - else - ptr = data; - _rl_set_mark_at_pos (rl_point); - rl_insert_text (ptr); - if (ptr != data) - free (ptr); - CloseClipboard (); - } - return (0); -} -#endif /* __CYGWIN__ */ diff --git a/dep/src/readline/src/macro.c b/dep/src/readline/src/macro.c deleted file mode 100644 index b73c3af9aa4..00000000000 --- a/dep/src/readline/src/macro.c +++ /dev/null @@ -1,262 +0,0 @@ -/* macro.c -- keyboard macros for readline. */ - -/* Copyright (C) 1994 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ -#define READLINE_LIBRARY - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#include - -#if defined (HAVE_UNISTD_H) -# include /* for _POSIX_VERSION */ -#endif /* HAVE_UNISTD_H */ - -#if defined (HAVE_STDLIB_H) -# include -#else -# include "ansi_stdlib.h" -#endif /* HAVE_STDLIB_H */ - -#include - -/* System-specific feature definitions and include files. */ -#include "rldefs.h" - -/* Some standard library routines. */ -#include "readline.h" -#include "history.h" - -#include "rlprivate.h" -#include "xmalloc.h" - -/* **************************************************************** */ -/* */ -/* Hacking Keyboard Macros */ -/* */ -/* **************************************************************** */ - -/* The currently executing macro string. If this is non-zero, - then it is a malloc ()'ed string where input is coming from. */ -char *rl_executing_macro = (char *)NULL; - -/* The offset in the above string to the next character to be read. */ -static int executing_macro_index; - -/* The current macro string being built. Characters get stuffed - in here by add_macro_char (). */ -static char *current_macro = (char *)NULL; - -/* The size of the buffer allocated to current_macro. */ -static int current_macro_size; - -/* The index at which characters are being added to current_macro. */ -static int current_macro_index; - -/* A structure used to save nested macro strings. - It is a linked list of string/index for each saved macro. */ -struct saved_macro { - struct saved_macro *next; - char *string; - int sindex; -}; - -/* The list of saved macros. */ -static struct saved_macro *macro_list = (struct saved_macro *)NULL; - -/* Set up to read subsequent input from STRING. - STRING is free ()'ed when we are done with it. */ -void -_rl_with_macro_input (string) - char *string; -{ - _rl_push_executing_macro (); - rl_executing_macro = string; - executing_macro_index = 0; - RL_SETSTATE(RL_STATE_MACROINPUT); -} - -/* Return the next character available from a macro, or 0 if - there are no macro characters. */ -int -_rl_next_macro_key () -{ - if (rl_executing_macro == 0) - return (0); - - if (rl_executing_macro[executing_macro_index] == 0) - { - _rl_pop_executing_macro (); - return (_rl_next_macro_key ()); - } - - return (rl_executing_macro[executing_macro_index++]); -} - -/* Save the currently executing macro on a stack of saved macros. */ -void -_rl_push_executing_macro () -{ - struct saved_macro *saver; - - saver = (struct saved_macro *)xmalloc (sizeof (struct saved_macro)); - saver->next = macro_list; - saver->sindex = executing_macro_index; - saver->string = rl_executing_macro; - - macro_list = saver; -} - -/* Discard the current macro, replacing it with the one - on the top of the stack of saved macros. */ -void -_rl_pop_executing_macro () -{ - struct saved_macro *macro; - - FREE (rl_executing_macro); - rl_executing_macro = (char *)NULL; - executing_macro_index = 0; - - if (macro_list) - { - macro = macro_list; - rl_executing_macro = macro_list->string; - executing_macro_index = macro_list->sindex; - macro_list = macro_list->next; - free (macro); - } - - if (rl_executing_macro == 0) - RL_UNSETSTATE(RL_STATE_MACROINPUT); -} - -/* Add a character to the macro being built. */ -void -_rl_add_macro_char (c) - int c; -{ - if (current_macro_index + 1 >= current_macro_size) - { - if (current_macro == 0) - current_macro = (char *)xmalloc (current_macro_size = 25); - else - current_macro = (char *)xrealloc (current_macro, current_macro_size += 25); - } - - current_macro[current_macro_index++] = c; - current_macro[current_macro_index] = '\0'; -} - -void -_rl_kill_kbd_macro () -{ - if (current_macro) - { - free (current_macro); - current_macro = (char *) NULL; - } - current_macro_size = current_macro_index = 0; - - FREE (rl_executing_macro); - rl_executing_macro = (char *) NULL; - executing_macro_index = 0; - - RL_UNSETSTATE(RL_STATE_MACRODEF); -} - -/* Begin defining a keyboard macro. - Keystrokes are recorded as they are executed. - End the definition with rl_end_kbd_macro (). - If a numeric argument was explicitly typed, then append this - definition to the end of the existing macro, and start by - re-executing the existing macro. */ -int -rl_start_kbd_macro (ignore1, ignore2) - int ignore1, ignore2; -{ - if (RL_ISSTATE (RL_STATE_MACRODEF)) - { - _rl_abort_internal (); - return -1; - } - - if (rl_explicit_arg) - { - if (current_macro) - _rl_with_macro_input (savestring (current_macro)); - } - else - current_macro_index = 0; - - RL_SETSTATE(RL_STATE_MACRODEF); - return 0; -} - -/* Stop defining a keyboard macro. - A numeric argument says to execute the macro right now, - that many times, counting the definition as the first time. */ -int -rl_end_kbd_macro (count, ignore) - int count, ignore; -{ - if (RL_ISSTATE (RL_STATE_MACRODEF) == 0) - { - _rl_abort_internal (); - return -1; - } - - current_macro_index -= rl_key_sequence_length - 1; - current_macro[current_macro_index] = '\0'; - - RL_UNSETSTATE(RL_STATE_MACRODEF); - - return (rl_call_last_kbd_macro (--count, 0)); -} - -/* Execute the most recently defined keyboard macro. - COUNT says how many times to execute it. */ -int -rl_call_last_kbd_macro (count, ignore) - int count, ignore; -{ - if (current_macro == 0) - _rl_abort_internal (); - - if (RL_ISSTATE (RL_STATE_MACRODEF)) - { - rl_ding (); /* no recursive macros */ - current_macro[--current_macro_index] = '\0'; /* erase this char */ - return 0; - } - - while (count--) - _rl_with_macro_input (savestring (current_macro)); - return 0; -} - -void -rl_push_macro_input (macro) - char *macro; -{ - _rl_with_macro_input (macro); -} diff --git a/dep/src/readline/src/mbutil.c b/dep/src/readline/src/mbutil.c deleted file mode 100644 index 9a8f17c0f74..00000000000 --- a/dep/src/readline/src/mbutil.c +++ /dev/null @@ -1,348 +0,0 @@ -/* mbutil.c -- readline multibyte character utility functions */ - -/* Copyright (C) 2001-2004 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ -#define READLINE_LIBRARY - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#include -#include -#include "posixjmp.h" - -#if defined (HAVE_UNISTD_H) -# include /* for _POSIX_VERSION */ -#endif /* HAVE_UNISTD_H */ - -#if defined (HAVE_STDLIB_H) -# include -#else -# include "ansi_stdlib.h" -#endif /* HAVE_STDLIB_H */ - -#include -#include - -/* System-specific feature definitions and include files. */ -#include "rldefs.h" -#include "rlmbutil.h" - -#if defined (TIOCSTAT_IN_SYS_IOCTL) -# include -#endif /* TIOCSTAT_IN_SYS_IOCTL */ - -/* Some standard library routines. */ -#include "readline.h" - -#include "rlprivate.h" -#include "xmalloc.h" - -/* Declared here so it can be shared between the readline and history - libraries. */ -#if defined (HANDLE_MULTIBYTE) -int rl_byte_oriented = 0; -#else -int rl_byte_oriented = 1; -#endif - -/* **************************************************************** */ -/* */ -/* Multibyte Character Utility Functions */ -/* */ -/* **************************************************************** */ - -#if defined(HANDLE_MULTIBYTE) - -static int -_rl_find_next_mbchar_internal (string, seed, count, find_non_zero) - char *string; - int seed, count, find_non_zero; -{ - size_t tmp = 0; - mbstate_t ps; - int point = 0; - wchar_t wc; - - memset(&ps, 0, sizeof (mbstate_t)); - if (seed < 0) - seed = 0; - if (count <= 0) - return seed; - - point = seed + _rl_adjust_point(string, seed, &ps); - /* if this is true, means that seed was not pointed character - started byte. So correct the point and consume count */ - if (seed < point) - count--; - - while (count > 0) - { - tmp = mbrtowc (&wc, string+point, strlen(string + point), &ps); - if (MB_INVALIDCH ((size_t)tmp)) - { - /* invalid bytes. asume a byte represents a character */ - point++; - count--; - /* reset states. */ - memset(&ps, 0, sizeof(mbstate_t)); - } - else if (MB_NULLWCH (tmp)) - break; /* found wide '\0' */ - else - { - /* valid bytes */ - point += tmp; - if (find_non_zero) - { - if (wcwidth (wc) == 0) - continue; - else - count--; - } - else - count--; - } - } - - if (find_non_zero) - { - tmp = mbrtowc (&wc, string + point, strlen (string + point), &ps); - while (wcwidth (wc) == 0) - { - point += tmp; - tmp = mbrtowc (&wc, string + point, strlen (string + point), &ps); - if (tmp == (size_t)(0) || tmp == (size_t)(-1) || tmp == (size_t)(-2)) - break; - } - } - return point; -} - -static int -_rl_find_prev_mbchar_internal (string, seed, find_non_zero) - char *string; - int seed, find_non_zero; -{ - mbstate_t ps; - int prev, non_zero_prev, point, length; - size_t tmp; - wchar_t wc; - - memset(&ps, 0, sizeof(mbstate_t)); - length = strlen(string); - - if (seed < 0) - return 0; - else if (length < seed) - return length; - - prev = non_zero_prev = point = 0; - while (point < seed) - { - tmp = mbrtowc (&wc, string + point, length - point, &ps); - if (MB_INVALIDCH ((size_t)tmp)) - { - /* in this case, bytes are invalid or shorted to compose - multibyte char, so assume that the first byte represents - a single character anyway. */ - tmp = 1; - /* clear the state of the byte sequence, because - in this case effect of mbstate is undefined */ - memset(&ps, 0, sizeof (mbstate_t)); - - /* Since we're assuming that this byte represents a single - non-zero-width character, don't forget about it. */ - prev = point; - } - else if (MB_NULLWCH (tmp)) - break; /* Found '\0' char. Can this happen? */ - else - { - if (find_non_zero) - { - if (wcwidth (wc) != 0) - prev = point; - } - else - prev = point; - } - - point += tmp; - } - - return prev; -} - -/* return the number of bytes parsed from the multibyte sequence starting - at src, if a non-L'\0' wide character was recognized. It returns 0, - if a L'\0' wide character was recognized. It returns (size_t)(-1), - if an invalid multibyte sequence was encountered. It returns (size_t)(-2) - if it couldn't parse a complete multibyte character. */ -int -_rl_get_char_len (src, ps) - char *src; - mbstate_t *ps; -{ - size_t tmp; - - tmp = mbrlen((const char *)src, (size_t)strlen (src), ps); - if (tmp == (size_t)(-2)) - { - /* shorted to compose multibyte char */ - if (ps) - memset (ps, 0, sizeof(mbstate_t)); - return -2; - } - else if (tmp == (size_t)(-1)) - { - /* invalid to compose multibyte char */ - /* initialize the conversion state */ - if (ps) - memset (ps, 0, sizeof(mbstate_t)); - return -1; - } - else if (tmp == (size_t)0) - return 0; - else - return (int)tmp; -} - -/* compare the specified two characters. If the characters matched, - return 1. Otherwise return 0. */ -int -_rl_compare_chars (buf1, pos1, ps1, buf2, pos2, ps2) - char *buf1; - int pos1; - mbstate_t *ps1; - char *buf2; - int pos2; - mbstate_t *ps2; -{ - int i, w1, w2; - - if ((w1 = _rl_get_char_len (&buf1[pos1], ps1)) <= 0 || - (w2 = _rl_get_char_len (&buf2[pos2], ps2)) <= 0 || - (w1 != w2) || - (buf1[pos1] != buf2[pos2])) - return 0; - - for (i = 1; i < w1; i++) - if (buf1[pos1+i] != buf2[pos2+i]) - return 0; - - return 1; -} - -/* adjust pointed byte and find mbstate of the point of string. - adjusted point will be point <= adjusted_point, and returns - differences of the byte(adjusted_point - point). - if point is invalied (point < 0 || more than string length), - it returns -1 */ -int -_rl_adjust_point(string, point, ps) - char *string; - int point; - mbstate_t *ps; -{ - size_t tmp = 0; - int length; - int pos = 0; - - length = strlen(string); - if (point < 0) - return -1; - if (length < point) - return -1; - - while (pos < point) - { - tmp = mbrlen (string + pos, length - pos, ps); - if (MB_INVALIDCH ((size_t)tmp)) - { - /* in this case, bytes are invalid or shorted to compose - multibyte char, so assume that the first byte represents - a single character anyway. */ - pos++; - /* clear the state of the byte sequence, because - in this case effect of mbstate is undefined */ - if (ps) - memset (ps, 0, sizeof (mbstate_t)); - } - else if (MB_NULLWCH (tmp)) - pos++; - else - pos += tmp; - } - - return (pos - point); -} - -int -_rl_is_mbchar_matched (string, seed, end, mbchar, length) - char *string; - int seed, end; - char *mbchar; - int length; -{ - int i; - - if ((end - seed) < length) - return 0; - - for (i = 0; i < length; i++) - if (string[seed + i] != mbchar[i]) - return 0; - return 1; -} -#endif /* HANDLE_MULTIBYTE */ - -/* Find next `count' characters started byte point of the specified seed. - If flags is MB_FIND_NONZERO, we look for non-zero-width multibyte - characters. */ -#undef _rl_find_next_mbchar -int -_rl_find_next_mbchar (string, seed, count, flags) - char *string; - int seed, count, flags; -{ -#if defined (HANDLE_MULTIBYTE) - return _rl_find_next_mbchar_internal (string, seed, count, flags); -#else - return (seed + count); -#endif -} - -/* Find previous character started byte point of the specified seed. - Returned point will be point <= seed. If flags is MB_FIND_NONZERO, - we look for non-zero-width multibyte characters. */ -#undef _rl_find_prev_mbchar -int -_rl_find_prev_mbchar (string, seed, flags) - char *string; - int seed, flags; -{ -#if defined (HANDLE_MULTIBYTE) - return _rl_find_prev_mbchar_internal (string, seed, flags); -#else - return ((seed == 0) ? seed : seed - 1); -#endif -} diff --git a/dep/src/readline/src/misc.c b/dep/src/readline/src/misc.c deleted file mode 100644 index ab1e1337fd3..00000000000 --- a/dep/src/readline/src/misc.c +++ /dev/null @@ -1,508 +0,0 @@ -/* misc.c -- miscellaneous bindable readline functions. */ - -/* Copyright (C) 1987-2004 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ -#define READLINE_LIBRARY - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#if defined (HAVE_UNISTD_H) -# include -#endif /* HAVE_UNISTD_H */ - -#if defined (HAVE_STDLIB_H) -# include -#else -# include "ansi_stdlib.h" -#endif /* HAVE_STDLIB_H */ - -#if defined (HAVE_LOCALE_H) -# include -#endif - -#include - -/* System-specific feature definitions and include files. */ -#include "rldefs.h" -#include "rlmbutil.h" - -/* Some standard library routines. */ -#include "readline.h" -#include "history.h" - -#include "rlprivate.h" -#include "rlshell.h" -#include "xmalloc.h" - -static int rl_digit_loop PARAMS((void)); -static void _rl_history_set_point PARAMS((void)); - -/* Forward declarations used in this file */ -void _rl_free_history_entry PARAMS((HIST_ENTRY *)); - -/* If non-zero, rl_get_previous_history and rl_get_next_history attempt - to preserve the value of rl_point from line to line. */ -int _rl_history_preserve_point = 0; - -/* Saved target point for when _rl_history_preserve_point is set. Special - value of -1 means that point is at the end of the line. */ -int _rl_history_saved_point = -1; - -/* **************************************************************** */ -/* */ -/* Numeric Arguments */ -/* */ -/* **************************************************************** */ - -/* Handle C-u style numeric args, as well as M--, and M-digits. */ -static int -rl_digit_loop () -{ - int key, c, sawminus, sawdigits; - - rl_save_prompt (); - - RL_SETSTATE(RL_STATE_NUMERICARG); - sawminus = sawdigits = 0; - while (1) - { - if (rl_numeric_arg > 1000000) - { - sawdigits = rl_explicit_arg = rl_numeric_arg = 0; - rl_ding (); - rl_restore_prompt (); - rl_clear_message (); - RL_UNSETSTATE(RL_STATE_NUMERICARG); - return 1; - } - rl_message ("(arg: %d) ", rl_arg_sign * rl_numeric_arg); - RL_SETSTATE(RL_STATE_MOREINPUT); - key = c = rl_read_key (); - RL_UNSETSTATE(RL_STATE_MOREINPUT); - - if (c < 0) - { - _rl_abort_internal (); - return -1; - } - - /* If we see a key bound to `universal-argument' after seeing digits, - it ends the argument but is otherwise ignored. */ - if (_rl_keymap[c].type == ISFUNC && - _rl_keymap[c].function == rl_universal_argument) - { - if (sawdigits == 0) - { - rl_numeric_arg *= 4; - continue; - } - else - { - RL_SETSTATE(RL_STATE_MOREINPUT); - key = rl_read_key (); - RL_UNSETSTATE(RL_STATE_MOREINPUT); - rl_restore_prompt (); - rl_clear_message (); - RL_UNSETSTATE(RL_STATE_NUMERICARG); - return (_rl_dispatch (key, _rl_keymap)); - } - } - - c = UNMETA (c); - - if (_rl_digit_p (c)) - { - rl_numeric_arg = rl_explicit_arg ? (rl_numeric_arg * 10) + c - '0' : c - '0'; - sawdigits = rl_explicit_arg = 1; - } - else if (c == '-' && rl_explicit_arg == 0) - { - rl_numeric_arg = sawminus = 1; - rl_arg_sign = -1; - } - else - { - /* Make M-- command equivalent to M--1 command. */ - if (sawminus && rl_numeric_arg == 1 && rl_explicit_arg == 0) - rl_explicit_arg = 1; - rl_restore_prompt (); - rl_clear_message (); - RL_UNSETSTATE(RL_STATE_NUMERICARG); - return (_rl_dispatch (key, _rl_keymap)); - } - } - - /*NOTREACHED*/ -} - -/* Add the current digit to the argument in progress. */ -int -rl_digit_argument (ignore, key) - int ignore, key; -{ - rl_execute_next (key); - return (rl_digit_loop ()); -} - -/* What to do when you abort reading an argument. */ -int -rl_discard_argument () -{ - rl_ding (); - rl_clear_message (); - _rl_init_argument (); - return 0; -} - -/* Create a default argument. */ -int -_rl_init_argument () -{ - rl_numeric_arg = rl_arg_sign = 1; - rl_explicit_arg = 0; - return 0; -} - -/* C-u, universal argument. Multiply the current argument by 4. - Read a key. If the key has nothing to do with arguments, then - dispatch on it. If the key is the abort character then abort. */ -int -rl_universal_argument (count, key) - int count, key; -{ - rl_numeric_arg *= 4; - return (rl_digit_loop ()); -} - -/* **************************************************************** */ -/* */ -/* History Utilities */ -/* */ -/* **************************************************************** */ - -/* We already have a history library, and that is what we use to control - the history features of readline. This is our local interface to - the history mechanism. */ - -/* While we are editing the history, this is the saved - version of the original line. */ -HIST_ENTRY *_rl_saved_line_for_history = (HIST_ENTRY *)NULL; - -/* Set the history pointer back to the last entry in the history. */ -void -_rl_start_using_history () -{ - using_history (); - if (_rl_saved_line_for_history) - _rl_free_history_entry (_rl_saved_line_for_history); - - _rl_saved_line_for_history = (HIST_ENTRY *)NULL; -} - -/* Free the contents (and containing structure) of a HIST_ENTRY. */ -void -_rl_free_history_entry (entry) - HIST_ENTRY *entry; -{ - if (entry == 0) - return; - if (entry->line) - free (entry->line); - free (entry); -} - -/* Perhaps put back the current line if it has changed. */ -int -rl_maybe_replace_line () -{ - HIST_ENTRY *temp; - - temp = current_history (); - /* If the current line has changed, save the changes. */ - if (temp && ((UNDO_LIST *)(temp->data) != rl_undo_list)) - { - temp = replace_history_entry (where_history (), rl_line_buffer, (histdata_t)rl_undo_list); - free (temp->line); - free (temp); - } - return 0; -} - -/* Restore the _rl_saved_line_for_history if there is one. */ -int -rl_maybe_unsave_line () -{ - if (_rl_saved_line_for_history) - { - /* Can't call with `1' because rl_undo_list might point to an undo - list from a history entry, as in rl_replace_from_history() below. */ - rl_replace_line (_rl_saved_line_for_history->line, 0); - rl_undo_list = (UNDO_LIST *)_rl_saved_line_for_history->data; - _rl_free_history_entry (_rl_saved_line_for_history); - _rl_saved_line_for_history = (HIST_ENTRY *)NULL; - rl_point = rl_end; /* rl_replace_line sets rl_end */ - } - else - rl_ding (); - return 0; -} - -/* Save the current line in _rl_saved_line_for_history. */ -int -rl_maybe_save_line () -{ - if (_rl_saved_line_for_history == 0) - { - _rl_saved_line_for_history = (HIST_ENTRY *)xmalloc (sizeof (HIST_ENTRY)); - _rl_saved_line_for_history->line = savestring (rl_line_buffer); - _rl_saved_line_for_history->data = (char *)rl_undo_list; - } - else if (STREQ (rl_line_buffer, _rl_saved_line_for_history->line) == 0) - { - free (_rl_saved_line_for_history->line); - _rl_saved_line_for_history->line = savestring (rl_line_buffer); - _rl_saved_line_for_history->data = (char *)rl_undo_list; /* XXX possible memleak */ - } - - return 0; -} - -int -_rl_free_saved_history_line () -{ - if (_rl_saved_line_for_history) - { - _rl_free_history_entry (_rl_saved_line_for_history); - _rl_saved_line_for_history = (HIST_ENTRY *)NULL; - } - return 0; -} - -static void -_rl_history_set_point () -{ - rl_point = (_rl_history_preserve_point && _rl_history_saved_point != -1) - ? _rl_history_saved_point - : rl_end; - if (rl_point > rl_end) - rl_point = rl_end; - -#if defined (VI_MODE) - if (rl_editing_mode == vi_mode && _rl_keymap != vi_insertion_keymap) - rl_point = 0; -#endif /* VI_MODE */ - - if (rl_editing_mode == emacs_mode) - rl_mark = (rl_point == rl_end ? 0 : rl_end); -} - -void -rl_replace_from_history (entry, flags) - HIST_ENTRY *entry; - int flags; /* currently unused */ -{ - /* Can't call with `1' because rl_undo_list might point to an undo list - from a history entry, just like we're setting up here. */ - rl_replace_line (entry->line, 0); - rl_undo_list = (UNDO_LIST *)entry->data; - rl_point = rl_end; - rl_mark = 0; - -#if defined (VI_MODE) - if (rl_editing_mode == vi_mode) - { - rl_point = 0; - rl_mark = rl_end; - } -#endif -} - -/* **************************************************************** */ -/* */ -/* History Commands */ -/* */ -/* **************************************************************** */ - -/* Meta-< goes to the start of the history. */ -int -rl_beginning_of_history (count, key) - int count, key; -{ - return (rl_get_previous_history (1 + where_history (), key)); -} - -/* Meta-> goes to the end of the history. (The current line). */ -int -rl_end_of_history (count, key) - int count, key; -{ - rl_maybe_replace_line (); - using_history (); - rl_maybe_unsave_line (); - return 0; -} - -/* Move down to the next history line. */ -int -rl_get_next_history (count, key) - int count, key; -{ - HIST_ENTRY *temp; - - if (count < 0) - return (rl_get_previous_history (-count, key)); - - if (count == 0) - return 0; - - rl_maybe_replace_line (); - - /* either not saved by rl_newline or at end of line, so set appropriately. */ - if (_rl_history_saved_point == -1 && (rl_point || rl_end)) - _rl_history_saved_point = (rl_point == rl_end) ? -1 : rl_point; - - temp = (HIST_ENTRY *)NULL; - while (count) - { - temp = next_history (); - if (!temp) - break; - --count; - } - - if (temp == 0) - rl_maybe_unsave_line (); - else - { - rl_replace_from_history (temp, 0); - _rl_history_set_point (); - } - return 0; -} - -/* Get the previous item out of our interactive history, making it the current - line. If there is no previous history, just ding. */ -int -rl_get_previous_history (count, key) - int count, key; -{ - HIST_ENTRY *old_temp, *temp; - - if (count < 0) - return (rl_get_next_history (-count, key)); - - if (count == 0) - return 0; - - /* either not saved by rl_newline or at end of line, so set appropriately. */ - if (_rl_history_saved_point == -1 && (rl_point || rl_end)) - _rl_history_saved_point = (rl_point == rl_end) ? -1 : rl_point; - - /* If we don't have a line saved, then save this one. */ - rl_maybe_save_line (); - - /* If the current line has changed, save the changes. */ - rl_maybe_replace_line (); - - temp = old_temp = (HIST_ENTRY *)NULL; - while (count) - { - temp = previous_history (); - if (temp == 0) - break; - - old_temp = temp; - --count; - } - - /* If there was a large argument, and we moved back to the start of the - history, that is not an error. So use the last value found. */ - if (!temp && old_temp) - temp = old_temp; - - if (temp == 0) - rl_ding (); - else - { - rl_replace_from_history (temp, 0); - _rl_history_set_point (); - } - - return 0; -} - -/* **************************************************************** */ -/* */ -/* Editing Modes */ -/* */ -/* **************************************************************** */ -/* How to toggle back and forth between editing modes. */ -int -rl_vi_editing_mode (count, key) - int count, key; -{ -#if defined (VI_MODE) - _rl_set_insert_mode (RL_IM_INSERT, 1); /* vi mode ignores insert mode */ - rl_editing_mode = vi_mode; - rl_vi_insertion_mode (1, key); -#endif /* VI_MODE */ - - return 0; -} - -int -rl_emacs_editing_mode (count, key) - int count, key; -{ - rl_editing_mode = emacs_mode; - _rl_set_insert_mode (RL_IM_INSERT, 1); /* emacs mode default is insert mode */ - _rl_keymap = emacs_standard_keymap; - return 0; -} - -/* Function for the rest of the library to use to set insert/overwrite mode. */ -void -_rl_set_insert_mode (im, force) - int im, force; -{ -#ifdef CURSOR_MODE - _rl_set_cursor (im, force); -#endif - - rl_insert_mode = im; -} - -/* Toggle overwrite mode. A positive explicit argument selects overwrite - mode. A negative or zero explicit argument selects insert mode. */ -int -rl_overwrite_mode (count, key) - int count, key; -{ - if (rl_explicit_arg == 0) - _rl_set_insert_mode (rl_insert_mode ^ 1, 0); - else if (count > 0) - _rl_set_insert_mode (RL_IM_OVERWRITE, 0); - else - _rl_set_insert_mode (RL_IM_INSERT, 0); - - return 0; -} diff --git a/dep/src/readline/src/msvc/config.h b/dep/src/readline/src/msvc/config.h deleted file mode 100644 index 0cee62b331d..00000000000 --- a/dep/src/readline/src/msvc/config.h +++ /dev/null @@ -1,218 +0,0 @@ -/* config.h. Generated by configure. */ -/* config.h.in. Maintained by hand. */ - -/* Define NO_MULTIBYTE_SUPPORT to not compile in support for multibyte - characters, even if the OS supports them. */ -/* #undef NO_MULTIBYTE_SUPPORT */ - -/* Define if on MINIX. */ -/* #undef _MINIX */ - -/* Define as the return type of signal handlers (int or void). */ -#define RETSIGTYPE void - -#define VOID_SIGHANDLER 1 - -/* Characteristics of the compiler. */ -/* #undef const */ - -/* #undef size_t */ - -/* #undef ssize_t */ - -#define PROTOTYPES 1 - -/* #undef __CHAR_UNSIGNED__ */ - -/* Define if the `S_IS*' macros in do not work properly. */ -/* #undef STAT_MACROS_BROKEN */ - -/* Define if you have the isascii function. */ -#define HAVE_ISASCII 1 - -/* Define if you have the isxdigit function. */ -#define HAVE_ISXDIGIT 1 - -/* Define if you have the lstat function. */ -/* #undef HAVE_LSTAT */ - -/* Define if you have the mbrlen function. */ -#define HAVE_MBRLEN 1 - -/* Define if you have the mbrtowc function. */ -#define HAVE_MBRTOWC 1 - -/* Define if you have the mbsrtowcs function. */ -#define HAVE_MBSRTOWCS 1 - -/* Define if you have the memmove function. */ -#define HAVE_MEMMOVE 1 - -/* Define if you have the putenv function. */ -#define HAVE_PUTENV 1 - -/* Define if you have the select function. */ -/* #undef HAVE_SELECT */ - -/* Define if you have the setenv function. */ -#define HAVE_SETENV 1 - -/* Define if you have the setlocale function. */ -#define HAVE_SETLOCALE 1 - -/* Define if you have the strcasecmp function. */ -/* #undef HAVE_STRCASECMP */ - -/* Define if you have the strcoll function. */ -#define HAVE_STRCOLL 1 - -/* #undef STRCOLL_BROKEN */ - -/* Define if you have the strpbrk function. */ -#define HAVE_STRPBRK 1 - -/* Define if you have the tcgetattr function. */ -#define HAVE_TCGETATTR 1 - -/* Define if you have the vsnprintf function. */ -#define HAVE_VSNPRINTF 1 - -/* Define if you have the wctomb function. */ -#define HAVE_WCTOMB 1 - -/* Define if you have the wcwidth function. */ -/* #undef HAVE_WCWIDTH */ - -#define STDC_HEADERS 1 - -/* Define if you have the header file. */ -/* #undef HAVE_DIRENT_H */ - -/* Define if you have the header file. */ -#define HAVE_LANGINFO_H 1 - -/* Define if you have the header file. */ -#define HAVE_LIMITS_H 1 - -/* Define if you have the header file. */ -#define HAVE_LOCALE_H 1 - -/* Define if you have the header file. */ -#define HAVE_MEMORY_H 1 - -/* Define if you have the header file. */ -/* #undef HAVE_NDIR_H */ - -/* Define if you have the header file. */ -#define HAVE_STDARG_H 1 - -/* Define if you have the header file. */ -#define HAVE_STDLIB_H 1 - -/* Define if you have the header file. */ -#define HAVE_STRING_H 1 - -/* Define if you have the header file. */ -/* #undef HAVE_STRINGS_H */ - -/* Define if you have the header file. */ -/* #undef HAVE_SYS_DIR_H */ - -/* Define if you have the header file. */ -/* #undef HAVE_SYS_FILE_H */ - -/* Define if you have the header file. */ -/* #undef HAVE_SYS_NDIR_H */ - -/* Define if you have the header file. */ -/* #undef HAVE_SYS_PTE_H */ - -/* Define if you have the header file. */ -/* #undef HAVE_SYS_PTEM_H */ - -/* Define if you have the header file. */ -/* #undef HAVE_SYS_SELECT_H */ - -/* Define if you have the header file. */ -/* #undef HAVE_SYS_STREAM_H */ - -/* Define if you have the header file. */ -/* #undef HAVE_TERMCAP_H */ - -/* Define if you have the header file. */ -/* #undef HAVE_TERMIO_H */ - -/* Define if you have the header file. */ -#define HAVE_TERMIOS_H 1 - -/* Define if you have the header file. */ -/* #undef HAVE_UNISTD_H */ - -/* Define if you have the header file. */ -/* #undef HAVE_VARARGS_H */ - -/* Define if you have the header file. */ -#define HAVE_WCHAR_H 1 - -/* Define if you have the header file. */ -#define HAVE_WCTYPE_H 1 - -#define HAVE_MBSTATE_T 1 - -/* Define if you have and nl_langinfo(CODESET). */ -#define HAVE_LANGINFO_CODESET 1 - -/* Definitions pulled in from aclocal.m4. */ -#define VOID_SIGHANDLER 1 - -/* #undef GWINSZ_IN_SYS_IOCTL */ - -#define STRUCT_WINSIZE_IN_SYS_IOCTL 1 - -/* #undef STRUCT_WINSIZE_IN_TERMIOS */ - -/* #undef TIOCSTAT_IN_SYS_IOCTL */ - -/* #undef FIONREAD_IN_SYS_IOCTL */ - -/* #undef SPEED_T_IN_SYS_TYPES */ - -#define HAVE_GETPW_DECLS 1 - -/* #undef STRUCT_DIRENT_HAS_D_INO */ - -/* #undef STRUCT_DIRENT_HAS_D_FILENO */ - -/* #undef HAVE_BSD_SIGNALS */ - -/* #undef HAVE_POSIX_SIGNALS */ - -/* #undef HAVE_USG_SIGHOLD */ - -/* #undef MUST_REINSTALL_SIGHANDLERS */ - -/* #undef HAVE_POSIX_SIGSETJMP */ - -/* #undef CTYPE_NON_ASCII */ - -/* modify settings or make new ones based on what autoconf tells us. */ - -/* Ultrix botches type-ahead when switching from canonical to - non-canonical mode, at least through version 4.3 */ -#if !defined (HAVE_TERMIOS_H) || !defined (HAVE_TCGETATTR) || defined (ultrix) -# define TERMIOS_MISSING -#endif - -#if defined (STRCOLL_BROKEN) -# define HAVE_STRCOLL 1 -#endif - -#if defined (__STDC__) && defined (HAVE_STDARG_H) || defined (_WIN32) -# define PREFER_STDARG -# define USE_VARARGS -#else -# if defined (HAVE_VARARGS_H) -# define PREFER_VARARGS -# define USE_VARARGS -# endif -#endif diff --git a/dep/src/readline/src/nls.c b/dep/src/readline/src/nls.c deleted file mode 100644 index 3aaa8ab3a64..00000000000 --- a/dep/src/readline/src/nls.c +++ /dev/null @@ -1,254 +0,0 @@ -/* nls.c -- skeletal internationalization code. */ - -/* Copyright (C) 1996 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ -#define READLINE_LIBRARY - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#include - -#include - -#if defined (HAVE_UNISTD_H) -# include -#endif /* HAVE_UNISTD_H */ - -#if defined (HAVE_STDLIB_H) -# include -#else -# include "ansi_stdlib.h" -#endif /* HAVE_STDLIB_H */ - -#if defined (HAVE_LOCALE_H) -# include -#endif - -#include - -#include "rldefs.h" -#include "readline.h" -#include "rlshell.h" -#include "rlprivate.h" - -#if !defined (HAVE_SETLOCALE) -/* A list of legal values for the LANG or LC_CTYPE environment variables. - If a locale name in this list is the value for the LC_ALL, LC_CTYPE, - or LANG environment variable (using the first of those with a value), - readline eight-bit mode is enabled. */ -static char *legal_lang_values[] = -{ - "iso88591", - "iso88592", - "iso88593", - "iso88594", - "iso88595", - "iso88596", - "iso88597", - "iso88598", - "iso88599", - "iso885910", - "koi8r", - 0 -}; - -static char *normalize_codeset PARAMS((char *)); -static char *find_codeset PARAMS((char *, size_t *)); -#endif /* !HAVE_SETLOCALE */ - -static char *_rl_get_locale_var PARAMS((const char *)); - -static char * -_rl_get_locale_var (v) - const char *v; -{ - char *lspec; - - lspec = sh_get_env_value ("LC_ALL"); - if (lspec == 0 || *lspec == 0) - lspec = sh_get_env_value (v); - if (lspec == 0 || *lspec == 0) - lspec = sh_get_env_value ("LANG"); - - return lspec; -} - -/* Check for LC_ALL, LC_CTYPE, and LANG and use the first with a value - to decide the defaults for 8-bit character input and output. Returns - 1 if we set eight-bit mode. */ -int -_rl_init_eightbit () -{ -/* If we have setlocale(3), just check the current LC_CTYPE category - value, and go into eight-bit mode if it's not C or POSIX. */ -#if defined (HAVE_SETLOCALE) - char *lspec, *t; - - /* Set the LC_CTYPE locale category from environment variables. */ - lspec = _rl_get_locale_var ("LC_CTYPE"); - /* Since _rl_get_locale_var queries the right environment variables, - we query the current locale settings with setlocale(), and, if - that doesn't return anything, we set lspec to the empty string to - force the subsequent call to setlocale() to define the `native' - environment. */ - if (lspec == 0 || *lspec == 0) - lspec = setlocale (LC_CTYPE, (char *)NULL); - if (lspec == 0) - lspec = ""; - t = setlocale (LC_CTYPE, lspec); - -#ifndef _WIN32 - if (t && *t && (t[0] != 'C' || t[1]) && (STREQ (t, "POSIX") == 0)) - { - _rl_meta_flag = 1; - _rl_convert_meta_chars_to_ascii = 0; - _rl_output_meta_chars = 1; - return (1); - } - else -#endif - return (0); - -#else /* !HAVE_SETLOCALE */ - char *lspec, *t; - int i; - - /* We don't have setlocale. Finesse it. Check the environment for the - appropriate variables and set eight-bit mode if they have the right - values. */ - lspec = _rl_get_locale_var ("LC_CTYPE"); - - if (lspec == 0 || (t = normalize_codeset (lspec)) == 0) - return (0); - for (i = 0; t && legal_lang_values[i]; i++) - if (STREQ (t, legal_lang_values[i])) - { - _rl_meta_flag = 1; - _rl_convert_meta_chars_to_ascii = 0; - _rl_output_meta_chars = 1; - break; - } - free (t); - return (legal_lang_values[i] ? 1 : 0); - -#endif /* !HAVE_SETLOCALE */ -} - -#if !defined (HAVE_SETLOCALE) -static char * -normalize_codeset (codeset) - char *codeset; -{ - size_t namelen, i; - int len, all_digits; - char *wp, *retval; - - codeset = find_codeset (codeset, &namelen); - - if (codeset == 0) - return (codeset); - - all_digits = 1; - for (len = 0, i = 0; i < namelen; i++) - { - if (ISALNUM ((unsigned char)codeset[i])) - { - len++; - all_digits &= _rl_digit_p (codeset[i]); - } - } - - retval = (char *)malloc ((all_digits ? 3 : 0) + len + 1); - if (retval == 0) - return ((char *)0); - - wp = retval; - /* Add `iso' to beginning of an all-digit codeset */ - if (all_digits) - { - *wp++ = 'i'; - *wp++ = 's'; - *wp++ = 'o'; - } - - for (i = 0; i < namelen; i++) - if (ISALPHA ((unsigned char)codeset[i])) - *wp++ = _rl_to_lower (codeset[i]); - else if (_rl_digit_p (codeset[i])) - *wp++ = codeset[i]; - *wp = '\0'; - - return retval; -} - -/* Isolate codeset portion of locale specification. */ -static char * -find_codeset (name, lenp) - char *name; - size_t *lenp; -{ - char *cp, *language, *result; - - cp = language = name; - result = (char *)0; - - while (*cp && *cp != '_' && *cp != '@' && *cp != '+' && *cp != ',') - cp++; - - /* This does not make sense: language has to be specified. As - an exception we allow the variable to contain only the codeset - name. Perhaps there are funny codeset names. */ - if (language == cp) - { - *lenp = strlen (language); - result = language; - } - else - { - /* Next is the territory. */ - if (*cp == '_') - do - ++cp; - while (*cp && *cp != '.' && *cp != '@' && *cp != '+' && *cp != ',' && *cp != '_'); - - /* Now, finally, is the codeset. */ - result = cp; - if (*cp == '.') - do - ++cp; - while (*cp && *cp != '@'); - - if (cp - result > 2) - { - result++; - *lenp = cp - result; - } - else - { - *lenp = strlen (language); - result = language; - } - } - - return result; -} -#endif /* !HAVE_SETLOCALE */ diff --git a/dep/src/readline/src/parens.c b/dep/src/readline/src/parens.c deleted file mode 100644 index 9e5d57c064b..00000000000 --- a/dep/src/readline/src/parens.c +++ /dev/null @@ -1,205 +0,0 @@ -/* parens.c -- Implementation of matching parentheses feature. */ - -/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ -#define READLINE_LIBRARY - -#if defined (__TANDEM) -# include -#endif - -#include "rlconf.h" - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#include -#include - -#if defined (HAVE_UNISTD_H) -# include -#endif - -#if defined (FD_SET) && !defined (HAVE_SELECT) -# define HAVE_SELECT -#endif - -#ifdef _WIN32 -# define WIN32_LEAN_AND_MEAN 1 -# include -#endif - -#if defined (HAVE_SELECT) -# include -#endif /* HAVE_SELECT */ -#if defined (HAVE_SYS_SELECT_H) -# include -#endif - -#if defined (HAVE_STRING_H) -# include -#else /* !HAVE_STRING_H */ -# include -#endif /* !HAVE_STRING_H */ - -#if !defined (strchr) && !defined (__STDC__) && !defined (_WIN32) -extern char *strchr (), *strrchr (); -#endif /* !strchr && !__STDC__ */ - -#include "readline.h" -#include "rlprivate.h" - -static int find_matching_open PARAMS((char *, int, int)); - -/* Non-zero means try to blink the matching open parenthesis when the - close parenthesis is inserted. */ -#if defined (HAVE_SELECT) || defined (_WIN32) -int rl_blink_matching_paren = 1; -#else /* !HAVE_SELECT */ -int rl_blink_matching_paren = 0; -#endif /* !HAVE_SELECT */ - -static int _paren_blink_usec = 500000; - -/* Change emacs_standard_keymap to have bindings for paren matching when - ON_OR_OFF is 1, change them back to self_insert when ON_OR_OFF == 0. */ -void -_rl_enable_paren_matching (on_or_off) - int on_or_off; -{ - if (on_or_off) - { /* ([{ */ - rl_bind_key_in_map (')', rl_insert_close, emacs_standard_keymap); - rl_bind_key_in_map (']', rl_insert_close, emacs_standard_keymap); - rl_bind_key_in_map ('}', rl_insert_close, emacs_standard_keymap); - } - else - { /* ([{ */ - rl_bind_key_in_map (')', rl_insert, emacs_standard_keymap); - rl_bind_key_in_map (']', rl_insert, emacs_standard_keymap); - rl_bind_key_in_map ('}', rl_insert, emacs_standard_keymap); - } -} - -int -rl_set_paren_blink_timeout (u) - int u; -{ - int o; - - o = _paren_blink_usec; - if (u > 0) - _paren_blink_usec = u; - return (o); -} - -int -rl_insert_close (count, invoking_key) - int count, invoking_key; -{ - if (rl_explicit_arg || !rl_blink_matching_paren) - _rl_insert_char (count, invoking_key); - else - { -#if defined (HAVE_SELECT) - int orig_point, match_point, ready; - struct timeval timer; - fd_set readfds; - - _rl_insert_char (1, invoking_key); - (*rl_redisplay_function) (); - match_point = - find_matching_open (rl_line_buffer, rl_point - 2, invoking_key); - - /* Emacs might message or ring the bell here, but I don't. */ - if (match_point < 0) - return -1; - - FD_ZERO (&readfds); - FD_SET (fileno (rl_instream), &readfds); - timer.tv_sec = 0; - timer.tv_usec = _paren_blink_usec; - - orig_point = rl_point; - rl_point = match_point; - (*rl_redisplay_function) (); - ready = select (1, &readfds, (fd_set *)NULL, (fd_set *)NULL, &timer); - rl_point = orig_point; -#elif defined (_WIN32) - int orig_point, match_point, ready; - - rl_insert (1, invoking_key); - (*rl_redisplay_function) (); - match_point = - find_matching_open (rl_line_buffer, rl_point - 2, invoking_key); - - /* Emacs might message or ring the bell here, but I don't. */ - if (match_point < 0) - return -1; - - orig_point = rl_point; - rl_point = match_point; - (*rl_redisplay_function) (); - ready = (WaitForSingleObject (GetStdHandle(STD_INPUT_HANDLE), 500) == WAIT_OBJECT_0); - rl_point = orig_point; -#else /* !_WIN32 */ - rl_insert (count, invoking_key); -#endif /* !HAVE_SELECT */ - } - return 0; -} - -static int -find_matching_open (string, from, closer) - char *string; - int from, closer; -{ - register int i; - int opener, level, delimiter; - - switch (closer) - { - case ']': opener = '['; break; - case '}': opener = '{'; break; - case ')': opener = '('; break; - default: - return (-1); - } - - level = 1; /* The closer passed in counts as 1. */ - delimiter = 0; /* Delimited state unknown. */ - - for (i = from; i > -1; i--) - { - if (delimiter && (string[i] == delimiter)) - delimiter = 0; - else if (rl_basic_quote_characters && strchr (rl_basic_quote_characters, string[i])) - delimiter = string[i]; - else if (!delimiter && (string[i] == closer)) - level++; - else if (!delimiter && (string[i] == opener)) - level--; - - if (!level) - break; - } - return (i); -} diff --git a/dep/src/readline/src/posixdir.h b/dep/src/readline/src/posixdir.h deleted file mode 100644 index 5677a77330d..00000000000 --- a/dep/src/readline/src/posixdir.h +++ /dev/null @@ -1,71 +0,0 @@ -/* posixdir.h -- Posix directory reading includes and defines. */ - -/* Copyright (C) 1987,1991 Free Software Foundation, Inc. - - This file is part of GNU Bash, the Bourne Again SHell. - - Bash is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - Bash is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with Bash; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -/* This file should be included instead of or . */ - -#if !defined (_POSIXDIR_H_) -#define _POSIXDIR_H_ - -#if defined (HAVE_DIRENT_H) -# include -# if defined (HAVE_STRUCT_DIRENT_D_NAMLEN) -# define D_NAMLEN(d) ((d)->d_namlen) -# else -# define D_NAMLEN(d) (strlen ((d)->d_name)) -# endif /* !HAVE_STRUCT_DIRENT_D_NAMLEN */ -# define FILENAME(d) ((d)->d_name) -#else -# if defined (HAVE_SYS_NDIR_H) -# include -# endif -# if defined (HAVE_SYS_DIR_H) -# include -# endif -# if defined (HAVE_NDIR_H) -# include -# endif -# if !defined (dirent) -# define dirent direct -# endif /* !dirent */ -# define D_NAMLEN(d) ((d)->d_namlen) -# define FILENAME(d) ((d)->d_name) -#endif /* !HAVE_DIRENT_H */ - -#if defined (_WIN32) -# undef FILENAME -# define FILENAME(d) (d).cFileName -# define closedir(dir) FindClose (dir) -# undef D_NAMLEN -# define D_NAMLEN(d) strlen (d.cFileName) -#endif - -#if defined (HAVE_STRUCT_DIRENT_D_INO) && !defined (HAVE_STRUCT_DIRENT_D_FILENO) -# define d_fileno d_ino -#endif - -#if defined (_POSIX_SOURCE) && (!defined (HAVE_STRUCT_DIRENT_D_INO) || defined (BROKEN_DIRENT_D_INO)) -/* Posix does not require that the d_ino field be present, and some - systems do not provide it. */ -# define REAL_DIR_ENTRY(dp) 1 -#else -# define REAL_DIR_ENTRY(dp) (dp->d_ino != 0) -#endif /* _POSIX_SOURCE */ - -#endif /* !_POSIXDIR_H_ */ diff --git a/dep/src/readline/src/posixjmp.h b/dep/src/readline/src/posixjmp.h deleted file mode 100644 index b52aa00332b..00000000000 --- a/dep/src/readline/src/posixjmp.h +++ /dev/null @@ -1,40 +0,0 @@ -/* posixjmp.h -- wrapper for setjmp.h with changes for POSIX systems. */ - -/* Copyright (C) 1987,1991 Free Software Foundation, Inc. - - This file is part of GNU Bash, the Bourne Again SHell. - - Bash is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - Bash is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with Bash; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#ifndef _POSIXJMP_H_ -#define _POSIXJMP_H_ - -#include - -/* This *must* be included *after* config.h */ - -#if defined (HAVE_POSIX_SIGSETJMP) -# define procenv_t sigjmp_buf -# if !defined (__OPENNT) -# undef setjmp -# define setjmp(x) sigsetjmp((x), 1) -# undef longjmp -# define longjmp(x, n) siglongjmp((x), (n)) -# endif /* !__OPENNT */ -#else -# define procenv_t jmp_buf -#endif - -#endif /* _POSIXJMP_H_ */ diff --git a/dep/src/readline/src/posixstat.h b/dep/src/readline/src/posixstat.h deleted file mode 100644 index c93b52887e9..00000000000 --- a/dep/src/readline/src/posixstat.h +++ /dev/null @@ -1,142 +0,0 @@ -/* posixstat.h -- Posix stat(2) definitions for systems that - don't have them. */ - -/* Copyright (C) 1987,1991 Free Software Foundation, Inc. - - This file is part of GNU Bash, the Bourne Again SHell. - - Bash is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - Bash is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with Bash; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -/* This file should be included instead of . - It relies on the local sys/stat.h to work though. */ -#if !defined (_POSIXSTAT_H_) -#define _POSIXSTAT_H_ - -#include - -#if defined (STAT_MACROS_BROKEN) -# undef S_ISBLK -# undef S_ISCHR -# undef S_ISDIR -# undef S_ISFIFO -# undef S_ISREG -# undef S_ISLNK -#endif /* STAT_MACROS_BROKEN */ - -/* These are guaranteed to work only on isc386 */ -#if !defined (S_IFDIR) && !defined (S_ISDIR) -# define S_IFDIR 0040000 -#endif /* !S_IFDIR && !S_ISDIR */ -#if !defined (S_IFMT) -# define S_IFMT 0170000 -#endif /* !S_IFMT */ - -/* Posix 1003.1 5.6.1.1 file types */ - -/* Some Posix-wannabe systems define _S_IF* macros instead of S_IF*, but - do not provide the S_IS* macros that Posix requires. */ - -#if defined (_S_IFMT) && !defined (S_IFMT) -#define S_IFMT _S_IFMT -#endif -#if defined (_S_IFIFO) && !defined (S_IFIFO) -#define S_IFIFO _S_IFIFO -#endif -#if defined (_S_IFCHR) && !defined (S_IFCHR) -#define S_IFCHR _S_IFCHR -#endif -#if defined (_S_IFDIR) && !defined (S_IFDIR) -#define S_IFDIR _S_IFDIR -#endif -#if defined (_S_IFBLK) && !defined (S_IFBLK) -#define S_IFBLK _S_IFBLK -#endif -#if defined (_S_IFREG) && !defined (S_IFREG) -#define S_IFREG _S_IFREG -#endif -#if defined (_S_IFLNK) && !defined (S_IFLNK) -#define S_IFLNK _S_IFLNK -#endif -#if defined (_S_IFSOCK) && !defined (S_IFSOCK) -#define S_IFSOCK _S_IFSOCK -#endif - -/* Test for each symbol individually and define the ones necessary (some - systems claiming Posix compatibility define some but not all). */ - -#if defined (S_IFBLK) && !defined (S_ISBLK) -#define S_ISBLK(m) (((m)&S_IFMT) == S_IFBLK) /* block device */ -#endif - -#if defined (S_IFCHR) && !defined (S_ISCHR) -#define S_ISCHR(m) (((m)&S_IFMT) == S_IFCHR) /* character device */ -#endif - -#if defined (S_IFDIR) && !defined (S_ISDIR) -#define S_ISDIR(m) (((m)&S_IFMT) == S_IFDIR) /* directory */ -#endif - -#if defined (S_IFREG) && !defined (S_ISREG) -#define S_ISREG(m) (((m)&S_IFMT) == S_IFREG) /* file */ -#endif - -#if defined (S_IFIFO) && !defined (S_ISFIFO) -#define S_ISFIFO(m) (((m)&S_IFMT) == S_IFIFO) /* fifo - named pipe */ -#endif - -#if defined (S_IFLNK) && !defined (S_ISLNK) -#define S_ISLNK(m) (((m)&S_IFMT) == S_IFLNK) /* symbolic link */ -#endif - -#if defined (S_IFSOCK) && !defined (S_ISSOCK) -#define S_ISSOCK(m) (((m)&S_IFMT) == S_IFSOCK) /* socket */ -#endif - -/* - * POSIX 1003.1 5.6.1.2 File Modes - */ - -#if !defined (S_IRWXU) -# if !defined (S_IREAD) -# define S_IREAD 00400 -# define S_IWRITE 00200 -# define S_IEXEC 00100 -# endif /* S_IREAD */ - -# if !defined (S_IRUSR) -# define S_IRUSR S_IREAD /* read, owner */ -# define S_IWUSR S_IWRITE /* write, owner */ -# define S_IXUSR S_IEXEC /* execute, owner */ - -# define S_IRGRP (S_IREAD >> 3) /* read, group */ -# define S_IWGRP (S_IWRITE >> 3) /* write, group */ -# define S_IXGRP (S_IEXEC >> 3) /* execute, group */ - -# define S_IROTH (S_IREAD >> 6) /* read, other */ -# define S_IWOTH (S_IWRITE >> 6) /* write, other */ -# define S_IXOTH (S_IEXEC >> 6) /* execute, other */ -# endif /* !S_IRUSR */ - -# define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR) -# define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP) -# define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH) -#endif /* !S_IRWXU */ - -/* These are non-standard, but are used in builtins.c$symbolic_umask() */ -#define S_IRUGO (S_IRUSR | S_IRGRP | S_IROTH) -#define S_IWUGO (S_IWUSR | S_IWGRP | S_IWOTH) -#define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH) - -#endif /* _POSIXSTAT_H_ */ diff --git a/dep/src/readline/src/readline.c b/dep/src/readline/src/readline.c deleted file mode 100644 index 6b2fd80719d..00000000000 --- a/dep/src/readline/src/readline.c +++ /dev/null @@ -1,1001 +0,0 @@ -/* readline.c -- a general facility for reading lines of input - with emacs style editing and completion. */ - -/* Copyright (C) 1987-2002 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ -#define READLINE_LIBRARY - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#include -#include "posixstat.h" -#include -#if defined (HAVE_SYS_FILE_H) -# include -#endif /* HAVE_SYS_FILE_H */ - -#if defined (HAVE_UNISTD_H) -# include -#endif /* HAVE_UNISTD_H */ - -#if defined (HAVE_STDLIB_H) -# include -#else -# include "ansi_stdlib.h" -#endif /* HAVE_STDLIB_H */ - -#if defined (HAVE_LOCALE_H) -# include -#endif - -#include -#include "posixjmp.h" - -/* System-specific feature definitions and include files. */ -#include "rldefs.h" -#include "rlmbutil.h" - -#if defined (__EMX__) -# define INCL_DOSPROCESS -# include -#endif /* __EMX__ */ - -/* Some standard library routines. */ -#include "readline.h" -#include "history.h" - -#include "rlprivate.h" -#include "rlshell.h" -#include "xmalloc.h" - -#ifndef RL_LIBRARY_VERSION -# define RL_LIBRARY_VERSION "5.0" -#endif - -#ifndef RL_READLINE_VERSION -# define RL_READLINE_VERSION 0x0500 -#endif - -extern void _rl_free_history_entry PARAMS((HIST_ENTRY *)); - -/* Forward declarations used in this file. */ -static char *readline_internal PARAMS((void)); -static void readline_initialize_everything PARAMS((void)); - -static void bind_arrow_keys_internal PARAMS((Keymap)); -static void bind_arrow_keys PARAMS((void)); - -static void readline_default_bindings PARAMS((void)); -static void reset_default_bindings PARAMS((void)); - -/* **************************************************************** */ -/* */ -/* Line editing input utility */ -/* */ -/* **************************************************************** */ - -const char *rl_library_version = RL_LIBRARY_VERSION; - -int rl_readline_version = RL_READLINE_VERSION; - -/* True if this is `real' readline as opposed to some stub substitute. */ -int rl_gnu_readline_p = 1; - -/* A pointer to the keymap that is currently in use. - By default, it is the standard emacs keymap. */ -Keymap _rl_keymap = emacs_standard_keymap; - -/* The current style of editing. */ -int rl_editing_mode = emacs_mode; - -/* The current insert mode: input (the default) or overwrite */ -int rl_insert_mode = RL_IM_DEFAULT; - -/* Non-zero if we called this function from _rl_dispatch(). It's present - so functions can find out whether they were called from a key binding - or directly from an application. */ -int rl_dispatching; - -/* Non-zero if the previous command was a kill command. */ -int _rl_last_command_was_kill = 0; - -/* The current value of the numeric argument specified by the user. */ -int rl_numeric_arg = 1; - -/* Non-zero if an argument was typed. */ -int rl_explicit_arg = 0; - -/* Temporary value used while generating the argument. */ -int rl_arg_sign = 1; - -/* Non-zero means we have been called at least once before. */ -static int rl_initialized; - -#if 0 -/* If non-zero, this program is running in an EMACS buffer. */ -static int running_in_emacs; -#endif - -/* Flags word encapsulating the current readline state. */ -int rl_readline_state = RL_STATE_NONE; - -/* The current offset in the current input line. */ -int rl_point; - -/* Mark in the current input line. */ -int rl_mark; - -/* Length of the current input line. */ -int rl_end; - -/* Make this non-zero to return the current input_line. */ -int rl_done; - -/* The last function executed by readline. */ -rl_command_func_t *rl_last_func = (rl_command_func_t *)NULL; - -/* Top level environment for readline_internal (). */ -procenv_t readline_top_level; - -/* The streams we interact with. */ -FILE *_rl_in_stream, *_rl_out_stream; - -/* The names of the streams that we do input and output to. */ -FILE *rl_instream = (FILE *)NULL; -FILE *rl_outstream = (FILE *)NULL; - -/* Non-zero means echo characters as they are read. Defaults to no echo; - set to 1 if there is a controlling terminal, we can get its attributes, - and the attributes include `echo'. Look at rltty.c:prepare_terminal_settings - for the code that sets it. */ -int readline_echoing_p = 0; - -/* Current prompt. */ -char *rl_prompt = (char *)NULL; -int rl_visible_prompt_length = 0; - -/* Set to non-zero by calling application if it has already printed rl_prompt - and does not want readline to do it the first time. */ -int rl_already_prompted = 0; - -/* The number of characters read in order to type this complete command. */ -int rl_key_sequence_length = 0; - -/* If non-zero, then this is the address of a function to call just - before readline_internal_setup () prints the first prompt. */ -rl_hook_func_t *rl_startup_hook = (rl_hook_func_t *)NULL; - -/* If non-zero, this is the address of a function to call just before - readline_internal_setup () returns and readline_internal starts - reading input characters. */ -rl_hook_func_t *rl_pre_input_hook = (rl_hook_func_t *)NULL; - -/* What we use internally. You should always refer to RL_LINE_BUFFER. */ -static char *the_line; - -/* The character that can generate an EOF. Really read from - the terminal driver... just defaulted here. */ -int _rl_eof_char = CTRL ('D'); - -/* Non-zero makes this the next keystroke to read. */ -int rl_pending_input = 0; - -/* Pointer to a useful terminal name. */ -const char *rl_terminal_name = (const char *)NULL; - -/* Non-zero means to always use horizontal scrolling in line display. */ -int _rl_horizontal_scroll_mode = 0; - -/* Non-zero means to display an asterisk at the starts of history lines - which have been modified. */ -int _rl_mark_modified_lines = 0; - -/* The style of `bell' notification preferred. This can be set to NO_BELL, - AUDIBLE_BELL, or VISIBLE_BELL. */ -int _rl_bell_preference = AUDIBLE_BELL; - -/* String inserted into the line by rl_insert_comment (). */ -char *_rl_comment_begin; - -/* Keymap holding the function currently being executed. */ -Keymap rl_executing_keymap; - -/* Non-zero means to erase entire line, including prompt, on empty input lines. */ -int rl_erase_empty_line = 0; - -/* Non-zero means to read only this many characters rather than up to a - character bound to accept-line. */ -int rl_num_chars_to_read; - -/* Line buffer and maintenence. */ -char *rl_line_buffer = (char *)NULL; -int rl_line_buffer_len = 0; - -/* Forward declarations used by the display, termcap, and history code. */ - -/* **************************************************************** */ -/* */ -/* `Forward' declarations */ -/* */ -/* **************************************************************** */ - -/* Non-zero means do not parse any lines other than comments and - parser directives. */ -unsigned char _rl_parsing_conditionalized_out = 0; - -/* Non-zero means to convert characters with the meta bit set to - escape-prefixed characters so we can indirect through - emacs_meta_keymap or vi_escape_keymap. */ -int _rl_convert_meta_chars_to_ascii = 1; - -/* Non-zero means to output characters with the meta bit set directly - rather than as a meta-prefixed escape sequence. */ -int _rl_output_meta_chars = 0; - -/* **************************************************************** */ -/* */ -/* Top Level Functions */ -/* */ -/* **************************************************************** */ - -/* Non-zero means treat 0200 bit in terminal input as Meta bit. */ -int _rl_meta_flag = 0; /* Forward declaration */ - -/* Set up the prompt and expand it. Called from readline() and - rl_callback_handler_install (). */ -int -rl_set_prompt (prompt) - const char *prompt; -{ - FREE (rl_prompt); - rl_prompt = prompt ? savestring (prompt) : (char *)NULL; - - rl_visible_prompt_length = rl_expand_prompt (rl_prompt); - return 0; -} - -/* Read a line of input. Prompt with PROMPT. An empty PROMPT means - none. A return value of NULL means that EOF was encountered. */ -char * -readline (prompt) - const char *prompt; -{ - char *value; - - /* If we are at EOF return a NULL string. */ - if (rl_pending_input == EOF) - { - rl_clear_pending_input (); - return ((char *)NULL); - } - - rl_set_prompt (prompt); - - rl_initialize (); - (*rl_prep_term_function) (_rl_meta_flag); - -#if defined (HANDLE_SIGNALS) - rl_set_signals (); -#endif - - value = readline_internal (); - (*rl_deprep_term_function) (); - -#if defined (HANDLE_SIGNALS) - rl_clear_signals (); -#endif - - return (value); -} - -#if defined (READLINE_CALLBACKS) -# define STATIC_CALLBACK -#else -# define STATIC_CALLBACK static -#endif - -STATIC_CALLBACK void -readline_internal_setup () -{ - char *nprompt; - - _rl_in_stream = rl_instream; - _rl_out_stream = rl_outstream; - - if (rl_startup_hook) - (*rl_startup_hook) (); - - /* If we're not echoing, we still want to at least print a prompt, because - rl_redisplay will not do it for us. If the calling application has a - custom redisplay function, though, let that function handle it. */ - if (readline_echoing_p == 0 && rl_redisplay_function == rl_redisplay) - { - if (rl_prompt && rl_already_prompted == 0) - { - nprompt = _rl_strip_prompt (rl_prompt); - fprintf (_rl_out_stream, "%s", nprompt); - fflush (_rl_out_stream); - free (nprompt); - } - } - else - { - if (rl_prompt && rl_already_prompted) - rl_on_new_line_with_prompt (); - else - rl_on_new_line (); - (*rl_redisplay_function) (); - } - -#if defined (VI_MODE) - if (rl_editing_mode == vi_mode) - rl_vi_insertion_mode (1, 'i'); -#endif /* VI_MODE */ - - if (rl_pre_input_hook) - (*rl_pre_input_hook) (); -} - -STATIC_CALLBACK char * -readline_internal_teardown (eof) - int eof; -{ - char *temp; - HIST_ENTRY *entry; - - /* Restore the original of this history line, iff the line that we - are editing was originally in the history, AND the line has changed. */ - entry = current_history (); - - if (entry && rl_undo_list) - { - temp = savestring (the_line); - rl_revert_line (1, 0); - entry = replace_history_entry (where_history (), the_line, (histdata_t)NULL); - _rl_free_history_entry (entry); - - strcpy (the_line, temp); - free (temp); - } - - /* At any rate, it is highly likely that this line has an undo list. Get - rid of it now. */ - if (rl_undo_list) - rl_free_undo_list (); - - /* Restore normal cursor, if available. */ - _rl_set_insert_mode (RL_IM_INSERT, 0); - - return (eof ? (char *)NULL : savestring (the_line)); -} - -STATIC_CALLBACK int -#if defined (READLINE_CALLBACKS) -readline_internal_char () -#else -readline_internal_charloop () -#endif -{ - static int lastc, eof_found; - int c, code, lk; - - lastc = -1; - eof_found = 0; - -#if !defined (READLINE_CALLBACKS) - while (rl_done == 0) - { -#endif - lk = _rl_last_command_was_kill; - - code = setjmp (readline_top_level); - - if (code) - (*rl_redisplay_function) (); - - if (rl_pending_input == 0) - { - /* Then initialize the argument and number of keys read. */ - _rl_init_argument (); - rl_key_sequence_length = 0; - } - - RL_SETSTATE(RL_STATE_READCMD); - c = rl_read_key (); - RL_UNSETSTATE(RL_STATE_READCMD); - - /* EOF typed to a non-blank line is a . */ - if (c == EOF && rl_end) - c = NEWLINE; - - /* The character _rl_eof_char typed to blank line, and not as the - previous character is interpreted as EOF. */ - if (((c == _rl_eof_char && lastc != c) || c == EOF) && !rl_end) - { -#if defined (READLINE_CALLBACKS) - RL_SETSTATE(RL_STATE_DONE); - return (rl_done = 1); -#else - eof_found = 1; - break; -#endif - } - - lastc = c; - _rl_dispatch ((unsigned char)c, _rl_keymap); - - /* If there was no change in _rl_last_command_was_kill, then no kill - has taken place. Note that if input is pending we are reading - a prefix command, so nothing has changed yet. */ - if (rl_pending_input == 0 && lk == _rl_last_command_was_kill) - _rl_last_command_was_kill = 0; - -#if defined (VI_MODE) - /* In vi mode, when you exit insert mode, the cursor moves back - over the previous character. We explicitly check for that here. */ - if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap) - rl_vi_check (); -#endif /* VI_MODE */ - - if (rl_num_chars_to_read && rl_end >= rl_num_chars_to_read) - { - (*rl_redisplay_function) (); - rl_newline (1, '\n'); - } - - if (rl_done == 0) - (*rl_redisplay_function) (); - - /* If the application writer has told us to erase the entire line if - the only character typed was something bound to rl_newline, do so. */ - if (rl_erase_empty_line && rl_done && rl_last_func == rl_newline && - rl_point == 0 && rl_end == 0) - _rl_erase_entire_line (); - -#if defined (READLINE_CALLBACKS) - return 0; -#else - } - - return (eof_found); -#endif -} - -#if defined (READLINE_CALLBACKS) -static int -readline_internal_charloop () -{ - int eof = 1; - - while (rl_done == 0) - eof = readline_internal_char (); - return (eof); -} -#endif /* READLINE_CALLBACKS */ - -/* Read a line of input from the global rl_instream, doing output on - the global rl_outstream. - If rl_prompt is non-null, then that is our prompt. */ -static char * -readline_internal () -{ - int eof; - - readline_internal_setup (); - eof = readline_internal_charloop (); - return (readline_internal_teardown (eof)); -} - -void -_rl_init_line_state () -{ - rl_point = rl_end = rl_mark = 0; - the_line = rl_line_buffer; - the_line[0] = 0; -} - -void -_rl_set_the_line () -{ - the_line = rl_line_buffer; -} - -/* Do the command associated with KEY in MAP. - If the associated command is really a keymap, then read - another key, and dispatch into that map. */ -int -_rl_dispatch (key, map) - register int key; - Keymap map; -{ - return _rl_dispatch_subseq (key, map, 0); -} - -int -_rl_dispatch_subseq (key, map, got_subseq) - register int key; - Keymap map; - int got_subseq; -{ - int r, newkey; - char *macro; - rl_command_func_t *func; - - if (META_CHAR (key) && _rl_convert_meta_chars_to_ascii) - { - if (map[ESC].type == ISKMAP) - { - if (RL_ISSTATE (RL_STATE_MACRODEF)) - _rl_add_macro_char (ESC); - map = FUNCTION_TO_KEYMAP (map, ESC); - key = UNMETA (key); - rl_key_sequence_length += 2; - return (_rl_dispatch (key, map)); - } - else - rl_ding (); - return 0; - } - - if (RL_ISSTATE (RL_STATE_MACRODEF)) - _rl_add_macro_char (key); - - r = 0; - switch (map[key].type) - { - case ISFUNC: - func = map[key].function; - if (func) - { - /* Special case rl_do_lowercase_version (). */ - if (func == rl_do_lowercase_version) - return (_rl_dispatch (_rl_to_lower (key), map)); - - rl_executing_keymap = map; - -#if 0 - _rl_suppress_redisplay = (map[key].function == rl_insert) && _rl_input_available (); -#endif - - rl_dispatching = 1; - RL_SETSTATE(RL_STATE_DISPATCHING); - r = (*map[key].function)(rl_numeric_arg * rl_arg_sign, key); - RL_UNSETSTATE(RL_STATE_DISPATCHING); - rl_dispatching = 0; - - /* If we have input pending, then the last command was a prefix - command. Don't change the state of rl_last_func. Otherwise, - remember the last command executed in this variable. */ - if (rl_pending_input == 0 && map[key].function != rl_digit_argument) - rl_last_func = map[key].function; - } - else if (map[ANYOTHERKEY].function) - { - /* OK, there's no function bound in this map, but there is a - shadow function that was overridden when the current keymap - was created. Return -2 to note that. */ - _rl_unget_char (key); - return -2; - } - else if (got_subseq) - { - /* Return -1 to note that we're in a subsequence, but we don't - have a matching key, nor was one overridden. This means - we need to back up the recursion chain and find the last - subsequence that is bound to a function. */ - _rl_unget_char (key); - return -1; - } - else - { - _rl_abort_internal (); - return -1; - } - break; - - case ISKMAP: - if (map[key].function != 0) - { -#if defined (VI_MODE) - /* The only way this test will be true is if a subsequence has been - bound starting with ESC, generally the arrow keys. What we do is - check whether there's input in the queue, which there generally - will be if an arrow key has been pressed, and, if there's not, - just dispatch to (what we assume is) rl_vi_movement_mode right - away. This is essentially an input test with a zero timeout. */ - if (rl_editing_mode == vi_mode && key == ESC && map == vi_insertion_keymap - && _rl_input_queued (0) == 0) - return (_rl_dispatch (ANYOTHERKEY, FUNCTION_TO_KEYMAP (map, key))); -#endif - - rl_key_sequence_length++; - - if (key == ESC) - RL_SETSTATE(RL_STATE_METANEXT); - RL_SETSTATE(RL_STATE_MOREINPUT); - newkey = rl_read_key (); - RL_UNSETSTATE(RL_STATE_MOREINPUT); - if (key == ESC) - RL_UNSETSTATE(RL_STATE_METANEXT); - - if (newkey < 0) - { - _rl_abort_internal (); - return -1; - } - - r = _rl_dispatch_subseq (newkey, FUNCTION_TO_KEYMAP (map, key), got_subseq || map[ANYOTHERKEY].function); - - if (r == -2) - /* We didn't match anything, and the keymap we're indexed into - shadowed a function previously bound to that prefix. Call - the function. The recursive call to _rl_dispatch_subseq has - already taken care of pushing any necessary input back onto - the input queue with _rl_unget_char. */ - { -#if 0 - r = _rl_dispatch (ANYOTHERKEY, FUNCTION_TO_KEYMAP (map, key)); -#else - /* XXX - experimental code -- might never be executed. Save - for later. */ - Keymap m = FUNCTION_TO_KEYMAP (map, key); - int type = m[ANYOTHERKEY].type; - func = m[ANYOTHERKEY].function; - if (type == ISFUNC && func == rl_do_lowercase_version) - r = _rl_dispatch (_rl_to_lower (key), map); - else - r = _rl_dispatch (ANYOTHERKEY, m); -#endif - } - else if (r && map[ANYOTHERKEY].function) - { - /* We didn't match (r is probably -1), so return something to - tell the caller that it should try ANYOTHERKEY for an - overridden function. */ - _rl_unget_char (key); - return -2; - } - else if (r && got_subseq) - { - /* OK, back up the chain. */ - _rl_unget_char (key); - return -1; - } - } - else - { - _rl_abort_internal (); - return -1; - } - break; - - case ISMACR: - if (map[key].function != 0) - { - macro = savestring ((char *)map[key].function); - _rl_with_macro_input (macro); - return 0; - } - break; - } -#if defined (VI_MODE) - if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap && - key != ANYOTHERKEY && - _rl_vi_textmod_command (key)) - _rl_vi_set_last (key, rl_numeric_arg, rl_arg_sign); -#endif - return (r); -} - -/* **************************************************************** */ -/* */ -/* Initializations */ -/* */ -/* **************************************************************** */ - -/* Initialize readline (and terminal if not already). */ -int -rl_initialize () -{ - /* If we have never been called before, initialize the - terminal and data structures. */ - if (!rl_initialized) - { - RL_SETSTATE(RL_STATE_INITIALIZING); - readline_initialize_everything (); - RL_UNSETSTATE(RL_STATE_INITIALIZING); - rl_initialized++; - RL_SETSTATE(RL_STATE_INITIALIZED); - } - - /* Initalize the current line information. */ - _rl_init_line_state (); - - /* We aren't done yet. We haven't even gotten started yet! */ - rl_done = 0; - RL_UNSETSTATE(RL_STATE_DONE); - - /* Tell the history routines what is going on. */ - _rl_start_using_history (); - - /* Make the display buffer match the state of the line. */ - rl_reset_line_state (); - - /* No such function typed yet. */ - rl_last_func = (rl_command_func_t *)NULL; - - /* Parsing of key-bindings begins in an enabled state. */ - _rl_parsing_conditionalized_out = 0; - -#if defined (VI_MODE) - if (rl_editing_mode == vi_mode) - _rl_vi_initialize_line (); -#endif - - /* Each line starts in insert mode (the default). */ - _rl_set_insert_mode (RL_IM_DEFAULT, 1); - - return 0; -} - -#if 0 -#if defined (__EMX__) -static void -_emx_build_environ () -{ - TIB *tibp; - PIB *pibp; - char *t, **tp; - int c; - - DosGetInfoBlocks (&tibp, &pibp); - t = pibp->pib_pchenv; - for (c = 1; *t; c++) - t += strlen (t) + 1; - tp = environ = (char **)xmalloc ((c + 1) * sizeof (char *)); - t = pibp->pib_pchenv; - while (*t) - { - *tp++ = t; - t += strlen (t) + 1; - } - *tp = 0; -} -#endif /* __EMX__ */ -#endif - -/* Initialize the entire state of the world. */ -static void -readline_initialize_everything () -{ -#if 0 -#if defined (__EMX__) - if (environ == 0) - _emx_build_environ (); -#endif -#endif - -#if 0 - /* Find out if we are running in Emacs -- UNUSED. */ - running_in_emacs = sh_get_env_value ("EMACS") != (char *)0; -#endif - - /* Set up input and output if they are not already set up. */ - if (!rl_instream) - rl_instream = stdin; - - if (!rl_outstream) - rl_outstream = stdout; - - /* Bind _rl_in_stream and _rl_out_stream immediately. These values - may change, but they may also be used before readline_internal () - is called. */ - _rl_in_stream = rl_instream; - _rl_out_stream = rl_outstream; - - /* Allocate data structures. */ - if (rl_line_buffer == 0) - rl_line_buffer = (char *)xmalloc (rl_line_buffer_len = DEFAULT_BUFFER_SIZE); - - /* Initialize the terminal interface. */ - if (rl_terminal_name == 0) - rl_terminal_name = sh_get_env_value ("TERM"); - _rl_init_terminal_io (rl_terminal_name); - - /* Bind tty characters to readline functions. */ - readline_default_bindings (); - - /* Initialize the function names. */ - rl_initialize_funmap (); - - /* Decide whether we should automatically go into eight-bit mode. */ - _rl_init_eightbit (); - - /* Read in the init file. */ - rl_read_init_file ((char *)NULL); - - /* XXX */ - if (_rl_horizontal_scroll_mode && _rl_term_autowrap) - { - _rl_screenwidth--; - _rl_screenchars -= _rl_screenheight; - } - - /* Override the effect of any `set keymap' assignments in the - inputrc file. */ - rl_set_keymap_from_edit_mode (); - - /* Try to bind a common arrow key prefix, if not already bound. */ - bind_arrow_keys (); - - /* Enable the meta key, if this terminal has one. */ - if (_rl_enable_meta) - _rl_enable_meta_key (); - - /* If the completion parser's default word break characters haven't - been set yet, then do so now. */ - if (rl_completer_word_break_characters == (char *)NULL) - rl_completer_word_break_characters = (char *)rl_basic_word_break_characters; -} - -/* If this system allows us to look at the values of the regular - input editing characters, then bind them to their readline - equivalents, iff the characters are not bound to keymaps. */ -static void -readline_default_bindings () -{ - rl_tty_set_default_bindings (_rl_keymap); -} - -/* Reset the default bindings for the terminal special characters we're - interested in back to rl_insert and read the new ones. */ -static void -reset_default_bindings () -{ - rl_tty_unset_default_bindings (_rl_keymap); - rl_tty_set_default_bindings (_rl_keymap); -} - -/* Bind some common arrow key sequences in MAP. */ -static void -bind_arrow_keys_internal (map) - Keymap map; -{ - Keymap xkeymap; - - xkeymap = _rl_keymap; - _rl_keymap = map; - -#if defined (__MSDOS__) - rl_bind_keyseq_if_unbound ("\033[0A", rl_get_previous_history); - rl_bind_keyseq_if_unbound ("\033[0B", rl_backward_char); - rl_bind_keyseq_if_unbound ("\033[0C", rl_forward_char); - rl_bind_keyseq_if_unbound ("\033[0D", rl_get_next_history); -#endif - - rl_bind_keyseq_if_unbound ("\033[A", rl_get_previous_history); - rl_bind_keyseq_if_unbound ("\033[B", rl_get_next_history); - rl_bind_keyseq_if_unbound ("\033[C", rl_forward_char); - rl_bind_keyseq_if_unbound ("\033[D", rl_backward_char); - rl_bind_keyseq_if_unbound ("\033[H", rl_beg_of_line); - rl_bind_keyseq_if_unbound ("\033[F", rl_end_of_line); - - rl_bind_keyseq_if_unbound ("\033OA", rl_get_previous_history); - rl_bind_keyseq_if_unbound ("\033OB", rl_get_next_history); - rl_bind_keyseq_if_unbound ("\033OC", rl_forward_char); - rl_bind_keyseq_if_unbound ("\033OD", rl_backward_char); - rl_bind_keyseq_if_unbound ("\033OH", rl_beg_of_line); - rl_bind_keyseq_if_unbound ("\033OF", rl_end_of_line); - - _rl_keymap = xkeymap; -} - -/* Try and bind the common arrow key prefixes after giving termcap and - the inputrc file a chance to bind them and create `real' keymaps - for the arrow key prefix. */ -static void -bind_arrow_keys () -{ - bind_arrow_keys_internal (emacs_standard_keymap); - -#if defined (VI_MODE) - bind_arrow_keys_internal (vi_movement_keymap); - bind_arrow_keys_internal (vi_insertion_keymap); -#endif -} - -/* **************************************************************** */ -/* */ -/* Saving and Restoring Readline's state */ -/* */ -/* **************************************************************** */ - -int -rl_save_state (sp) - struct readline_state *sp; -{ - if (sp == 0) - return -1; - - sp->point = rl_point; - sp->end = rl_end; - sp->mark = rl_mark; - sp->buffer = rl_line_buffer; - sp->buflen = rl_line_buffer_len; - sp->ul = rl_undo_list; - sp->prompt = rl_prompt; - - sp->rlstate = rl_readline_state; - sp->done = rl_done; - sp->kmap = _rl_keymap; - - sp->lastfunc = rl_last_func; - sp->insmode = rl_insert_mode; - sp->edmode = rl_editing_mode; - sp->kseqlen = rl_key_sequence_length; - sp->inf = rl_instream; - sp->outf = rl_outstream; - sp->pendingin = rl_pending_input; - sp->macro = rl_executing_macro; - - sp->catchsigs = rl_catch_signals; -#ifdef SIGWINCH - sp->catchsigwinch = rl_catch_sigwinch; -#endif /* SIGWINCH */ - return (0); -} - -int -rl_restore_state (sp) - struct readline_state *sp; -{ - if (sp == 0) - return -1; - - rl_point = sp->point; - rl_end = sp->end; - rl_mark = sp->mark; - the_line = rl_line_buffer = sp->buffer; - rl_line_buffer_len = sp->buflen; - rl_undo_list = sp->ul; - rl_prompt = sp->prompt; - - rl_readline_state = sp->rlstate; - rl_done = sp->done; - _rl_keymap = sp->kmap; - - rl_last_func = sp->lastfunc; - rl_insert_mode = sp->insmode; - rl_editing_mode = sp->edmode; - rl_key_sequence_length = sp->kseqlen; - rl_instream = sp->inf; - rl_outstream = sp->outf; - rl_pending_input = sp->pendingin; - rl_executing_macro = sp->macro; - - rl_catch_signals = sp->catchsigs; -#ifdef SIGWINCH - rl_catch_sigwinch = sp->catchsigwinch; -#endif /* SIGWINCH */ - - return (0); -} diff --git a/dep/src/readline/src/rlconf.h b/dep/src/readline/src/rlconf.h deleted file mode 100644 index c651fd8b41f..00000000000 --- a/dep/src/readline/src/rlconf.h +++ /dev/null @@ -1,60 +0,0 @@ -/* rlconf.h -- readline configuration definitions */ - -/* Copyright (C) 1994 Free Software Foundation, Inc. - - This file contains the Readline Library (the Library), a set of - routines for providing Emacs style line input to programs that ask - for it. - - The Library is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - The Library is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#if !defined (_RLCONF_H_) -#define _RLCONF_H_ - -/* Define this if you want the vi-mode editing available. */ -#define VI_MODE - -/* Define this to get an indication of file type when listing completions. */ -#define VISIBLE_STATS - -/* This definition is needed by readline.c, rltty.c, and signals.c. */ -/* If on, then readline handles signals in a way that doesn't screw. */ -#define HANDLE_SIGNALS - -/* Ugly but working hack for binding prefix meta. */ -#define PREFIX_META_HACK - -/* The final, last-ditch effort file name for an init file. */ -#define DEFAULT_INPUTRC "~/.inputrc" - -/* If defined, expand tabs to spaces. */ -#define DISPLAY_TABS - -/* If defined, use the terminal escape sequence to move the cursor forward - over a character when updating the line rather than rewriting it. */ -/* #define HACK_TERMCAP_MOTION */ - -/* The string inserted by the `insert comment' command. */ -#define RL_COMMENT_BEGIN_DEFAULT "#" - -/* Define this if you want code that allows readline to be used in an - X `callback' style. */ -#define READLINE_CALLBACKS - -/* Define this if you want the cursor to indicate insert or overwrite mode. */ -/* #define CURSOR_MODE */ - -#endif /* _RLCONF_H_ */ diff --git a/dep/src/readline/src/rldefs.h b/dep/src/readline/src/rldefs.h deleted file mode 100644 index 1b042025392..00000000000 --- a/dep/src/readline/src/rldefs.h +++ /dev/null @@ -1,183 +0,0 @@ -/* rldefs.h -- an attempt to isolate some of the system-specific defines - for readline. This should be included after any files that define - system-specific constants like _POSIX_VERSION or USG. */ - -/* Copyright (C) 1987,1989 Free Software Foundation, Inc. - - This file contains the Readline Library (the Library), a set of - routines for providing Emacs style line input to programs that ask - for it. - - The Library is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - The Library is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#if !defined (_RLDEFS_H_) -#define _RLDEFS_H_ - -#if defined (HAVE_CONFIG_H) -# include "config.h" -#endif - -#include "rlstdc.h" - -#if defined (_POSIX_VERSION) && !defined (TERMIOS_MISSING) -# define TERMIOS_TTY_DRIVER -#else -# if defined (HAVE_TERMIO_H) -# define TERMIO_TTY_DRIVER -# else -# define NEW_TTY_DRIVER -# endif -#endif - -/* Posix macro to check file in statbuf for directory-ness. - This requires that be included before this test. */ -#if defined (S_IFDIR) && !defined (S_ISDIR) -# define S_ISDIR(m) (((m)&S_IFMT) == S_IFDIR) -#endif - -/* Decide which flavor of the header file describing the C library - string functions to include and include it. */ - -#if defined (HAVE_STRING_H) -# include -#else /* !HAVE_STRING_H */ -# include -#endif /* !HAVE_STRING_H */ - -#if !defined (strchr) && !defined (__STDC__) && !defined (_WIN32) -extern char *strchr (), *strrchr (); -#endif /* !strchr && !__STDC__ */ - -#if defined (PREFER_STDARG) -# include -#else -# if defined (PREFER_VARARGS) -# include -# endif -#endif - -#if defined (HAVE_STRCASECMP) -#define _rl_stricmp strcasecmp -#define _rl_strnicmp strncasecmp -#elif defined (_WIN32) -#define _rl_stricmp stricmp -#define _rl_strnicmp strnicmp -#else -READLINE_DLL_IMPEXP int _rl_stricmp PARAMS((char *, char *)); -READLINE_DLL_IMPEXP int _rl_strnicmp PARAMS((char *, char *, int)); -#endif - -#if defined (HAVE_STRPBRK) && !defined (HAVE_MULTIBYTE) -# define _rl_strpbrk(a,b) strpbrk((a),(b)) -#else -READLINE_DLL_IMPEXP char *_rl_strpbrk PARAMS((const char *, const char *)); -#endif - -#if !defined (emacs_mode) -# define no_mode -1 -# define vi_mode 0 -# define emacs_mode 1 -#endif - -#if !defined (RL_IM_INSERT) -# define RL_IM_INSERT 1 -# define RL_IM_OVERWRITE 0 -# -# define RL_IM_DEFAULT RL_IM_INSERT -#endif - -/* If you cast map[key].function to type (Keymap) on a Cray, - the compiler takes the value of map[key].function and - divides it by 4 to convert between pointer types (pointers - to functions and pointers to structs are different sizes). - This is not what is wanted. */ -#if defined (CRAY) -# define FUNCTION_TO_KEYMAP(map, key) (Keymap)((int)map[key].function) -# define KEYMAP_TO_FUNCTION(data) (rl_command_func_t *)((int)(data)) -#else -# define FUNCTION_TO_KEYMAP(map, key) (Keymap)(map[key].function) -# define KEYMAP_TO_FUNCTION(data) (rl_command_func_t *)(data) -#endif - -#ifndef savestring -#define savestring(x) strcpy ((char *)xmalloc (1 + strlen (x)), (x)) -#endif - -/* Possible values for _rl_bell_preference. */ -#define NO_BELL 0 -#define AUDIBLE_BELL 1 -#define VISIBLE_BELL 2 - -/* Definitions used when searching the line for characters. */ -/* NOTE: it is necessary that opposite directions are inverses */ -#define FTO 1 /* forward to */ -#define BTO -1 /* backward to */ -#define FFIND 2 /* forward find */ -#define BFIND -2 /* backward find */ - -/* Possible values for the found_quote flags word used by the completion - functions. It says what kind of (shell-like) quoting we found anywhere - in the line. */ -#define RL_QF_SINGLE_QUOTE 0x01 -#define RL_QF_DOUBLE_QUOTE 0x02 -#define RL_QF_BACKSLASH 0x04 -#define RL_QF_OTHER_QUOTE 0x08 - -/* Default readline line buffer length. */ -#define DEFAULT_BUFFER_SIZE 256 - -#if !defined (STREQ) -#define STREQ(a, b) (((a)[0] == (b)[0]) && (strcmp ((a), (b)) == 0)) -#define STREQN(a, b, n) (((n) == 0) ? (1) \ - : ((a)[0] == (b)[0]) && (strncmp ((a), (b), (n)) == 0)) -#endif - -#if !defined (FREE) -# define FREE(x) if (x) free (x) -#endif - -#if !defined (SWAP) -# define SWAP(s, e) do { int t; t = s; s = e; e = t; } while (0) -#endif - -#if defined (_WIN32) -#define WAIT_FOR_INPUT 200 /* milliseconds to suspend maximally - when waiting for input */ -#define FOR_INPUT 1 /* flags for open state of the console */ -#define FOR_OUTPUT 2 -#define INITIALIZED 4 - -/* undefine this when readline / history should not look into the registry - for the path to their init files */ -#define INITFILES_IN_REGISTRY 1 - -#if defined (INITFILES_IN_REGISTRY) -/* We also try to get the .inputrc and .history file paths from the registry, - define what to look for */ -#define READLINE_REGKEY "Software\\Free Software Foundation\\libreadline" -#define INPUTRC_REGVAL "inputrc-file" -#define HISTFILE_REGVAL "history-file" - -READLINE_DLL_IMPEXP char *_rl_get_user_registry_string (char *keyName, char* valName); - -#endif - -#endif /* _WIN32 */ - -/* CONFIGURATION SECTION */ -#include "rlconf.h" - -#endif /* !_RLDEFS_H_ */ diff --git a/dep/src/readline/src/rlmbutil.h b/dep/src/readline/src/rlmbutil.h deleted file mode 100644 index 9ff904be86c..00000000000 --- a/dep/src/readline/src/rlmbutil.h +++ /dev/null @@ -1,121 +0,0 @@ -/* rlmbutil.h -- utility functions for multibyte characters. */ - -/* Copyright (C) 2001, 2003 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#if !defined (_RL_MBUTIL_H_) -#define _RL_MBUTIL_H_ - -#include "rlstdc.h" - -/************************************************/ -/* check multibyte capability for I18N code */ -/************************************************/ - -/* For platforms which support the ISO C amendement 1 functionality we - support user defined character classes. */ - /* Solaris 2.5 has a bug: must be included before . */ -#if defined (HAVE_WCTYPE_H) && defined (HAVE_WCHAR_H) -# include -# include -# if defined (HAVE_MBSRTOWCS) && defined (HAVE_MBRTOWC) && defined (HAVE_MBRLEN) && defined (HAVE_WCWIDTH) - /* system is supposed to support XPG5 */ -# define HANDLE_MULTIBYTE 1 -# endif -#endif - -/* If we don't want multibyte chars even on a system that supports them, let - the configuring user turn multibyte support off. */ -#if defined (NO_MULTIBYTE_SUPPORT) -# undef HANDLE_MULTIBYTE -#endif - -/* Some systems, like BeOS, have multibyte encodings but lack mbstate_t. */ -#if HANDLE_MULTIBYTE && !defined (HAVE_MBSTATE_T) -# define wcsrtombs(dest, src, len, ps) (wcsrtombs) (dest, src, len, 0) -# define mbsrtowcs(dest, src, len, ps) (mbsrtowcs) (dest, src, len, 0) -# define wcrtomb(s, wc, ps) (wcrtomb) (s, wc, 0) -# define mbrtowc(pwc, s, n, ps) (mbrtowc) (pwc, s, n, 0) -# define mbrlen(s, n, ps) (mbrlen) (s, n, 0) -# define mbstate_t int -#endif - -/* Make sure MB_LEN_MAX is at least 16 on systems that claim to be able to - handle multibyte chars (some systems define MB_LEN_MAX as 1) */ -#ifdef HANDLE_MULTIBYTE -# include -# if defined(MB_LEN_MAX) && (MB_LEN_MAX < 16) -# undef MB_LEN_MAX -# endif -# if !defined (MB_LEN_MAX) -# define MB_LEN_MAX 16 -# endif -#endif - -/************************************************/ -/* end of multibyte capability checks for I18N */ -/************************************************/ - -/* - * Flags for _rl_find_prev_mbchar and _rl_find_next_mbchar: - * - * MB_FIND_ANY find any multibyte character - * MB_FIND_NONZERO find a non-zero-width multibyte character - */ - -#define MB_FIND_ANY 0x00 -#define MB_FIND_NONZERO 0x01 - -READLINE_DLL_IMPEXP int _rl_find_prev_mbchar PARAMS((char *, int, int)); -READLINE_DLL_IMPEXP int _rl_find_next_mbchar PARAMS((char *, int, int, int)); - -#ifdef HANDLE_MULTIBYTE - -READLINE_DLL_IMPEXP int _rl_compare_chars PARAMS((char *, int, mbstate_t *, char *, int, mbstate_t *)); -READLINE_DLL_IMPEXP int _rl_get_char_len PARAMS((char *, mbstate_t *)); -READLINE_DLL_IMPEXP int _rl_adjust_point PARAMS((char *, int, mbstate_t *)); - -READLINE_DLL_IMPEXP int _rl_read_mbchar PARAMS((char *, int)); -READLINE_DLL_IMPEXP int _rl_read_mbstring PARAMS((int, char *, int)); - -READLINE_DLL_IMPEXP int _rl_is_mbchar_matched PARAMS((char *, int, int, char *, int)); - -#define MB_INVALIDCH(x) ((x) == (size_t)-1 || (x) == (size_t)-2) -#define MB_NULLWCH(x) ((x) == 0) - -#else /* !HANDLE_MULTIBYTE */ - -#undef MB_LEN_MAX -#undef MB_CUR_MAX - -#define MB_LEN_MAX 1 -#define MB_CUR_MAX 1 - -#define _rl_find_prev_mbchar(b, i, f) (((i) == 0) ? (i) : ((i) - 1)) -#define _rl_find_next_mbchar(b, i1, i2, f) ((i1) + (i2)) - -#define MB_INVALIDCH(x) (0) -#define MB_NULLWCH(x) (0) - -#endif /* !HANDLE_MULTIBYTE */ - -READLINE_DLL_IMPEXP int rl_byte_oriented; - -#endif /* _RL_MBUTIL_H_ */ diff --git a/dep/src/readline/src/rlprivate.h b/dep/src/readline/src/rlprivate.h deleted file mode 100644 index 2944788d0fe..00000000000 --- a/dep/src/readline/src/rlprivate.h +++ /dev/null @@ -1,288 +0,0 @@ -/* rlprivate.h -- functions and variables global to the readline library, - but not intended for use by applications. */ - -/* Copyright (C) 1999-2004 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#if !defined (_RL_PRIVATE_H_) -#define _RL_PRIVATE_H_ - -#include "rlconf.h" /* for VISIBLE_STATS */ -#include "rlstdc.h" -#include "posixjmp.h" /* defines procenv_t */ - -/************************************************************************* - * * - * Global functions undocumented in texinfo manual and not in readline.h * - * * - *************************************************************************/ - -/************************************************************************* - * * - * Global variables undocumented in texinfo manual and not in readline.h * - * * - *************************************************************************/ - -/* complete.c */ -READLINE_DLL_IMPEXP int rl_complete_with_tilde_expansion; -#if defined (VISIBLE_STATS) -READLINE_DLL_IMPEXP int rl_visible_stats; -#endif /* VISIBLE_STATS */ - -/* readline.c */ -READLINE_DLL_IMPEXP int rl_line_buffer_len; -READLINE_DLL_IMPEXP int rl_arg_sign; -READLINE_DLL_IMPEXP int rl_visible_prompt_length; -READLINE_DLL_IMPEXP int readline_echoing_p; -READLINE_DLL_IMPEXP int rl_key_sequence_length; -READLINE_DLL_IMPEXP int rl_byte_oriented; - -/* display.c */ -READLINE_DLL_IMPEXP int rl_display_fixed; - -/* parens.c */ -READLINE_DLL_IMPEXP int rl_blink_matching_paren; - -/************************************************************************* - * * - * Global functions and variables unsed and undocumented * - * * - *************************************************************************/ - -/* kill.c */ -READLINE_DLL_IMPEXP int rl_set_retained_kills PARAMS((int)); - -/* terminal.c */ -READLINE_DLL_IMPEXP void _rl_set_screen_size PARAMS((int, int)); - -/* undo.c */ -READLINE_DLL_IMPEXP int _rl_fix_last_undo_of_type PARAMS((int, int, int)); - -/* util.c */ -READLINE_DLL_IMPEXP char *_rl_savestring PARAMS((const char *)); - -/************************************************************************* - * * - * Functions and variables private to the readline library * - * * - *************************************************************************/ - -/* NOTE: Functions and variables prefixed with `_rl_' are - pseudo-global: they are global so they can be shared - between files in the readline library, but are not intended - to be visible to readline callers. */ - -/************************************************************************* - * Undocumented private functions * - *************************************************************************/ - -#if defined(READLINE_CALLBACKS) - -/* readline.c */ -READLINE_DLL_IMPEXP void readline_internal_setup PARAMS((void)); -READLINE_DLL_IMPEXP char *readline_internal_teardown PARAMS((int)); -READLINE_DLL_IMPEXP int readline_internal_char PARAMS((void)); - -#endif /* READLINE_CALLBACKS */ - -/* bind.c */ - -/* complete.c */ -READLINE_DLL_IMPEXP char _rl_find_completion_word PARAMS((int *, int *)); -READLINE_DLL_IMPEXP void _rl_free_match_list PARAMS((char **)); - -/* display.c */ -READLINE_DLL_IMPEXP char *_rl_strip_prompt PARAMS((char *)); -READLINE_DLL_IMPEXP void _rl_move_cursor_relative PARAMS((int, const char *)); -READLINE_DLL_IMPEXP void _rl_move_vert PARAMS((int)); -READLINE_DLL_IMPEXP void _rl_save_prompt PARAMS((void)); -READLINE_DLL_IMPEXP void _rl_restore_prompt PARAMS((void)); -READLINE_DLL_IMPEXP char *_rl_make_prompt_for_search PARAMS((int)); -READLINE_DLL_IMPEXP void _rl_erase_at_end_of_line PARAMS((int)); -READLINE_DLL_IMPEXP void _rl_clear_to_eol PARAMS((int)); -READLINE_DLL_IMPEXP void _rl_clear_screen PARAMS((void)); -READLINE_DLL_IMPEXP void _rl_update_final PARAMS((void)); -READLINE_DLL_IMPEXP void _rl_redisplay_after_sigwinch PARAMS((void)); -READLINE_DLL_IMPEXP void _rl_clean_up_for_exit PARAMS((void)); -READLINE_DLL_IMPEXP void _rl_erase_entire_line PARAMS((void)); -READLINE_DLL_IMPEXP int _rl_current_display_line PARAMS((void)); - -/* input.c */ -READLINE_DLL_IMPEXP int _rl_any_typein PARAMS((void)); -READLINE_DLL_IMPEXP int _rl_input_available PARAMS((void)); -READLINE_DLL_IMPEXP int _rl_input_queued PARAMS((int)); -READLINE_DLL_IMPEXP void _rl_insert_typein PARAMS((int)); -READLINE_DLL_IMPEXP int _rl_unget_char PARAMS((int)); -READLINE_DLL_IMPEXP int _rl_pushed_input_available PARAMS((void)); - -/* macro.c */ -READLINE_DLL_IMPEXP void _rl_with_macro_input PARAMS((char *)); -READLINE_DLL_IMPEXP int _rl_next_macro_key PARAMS((void)); -READLINE_DLL_IMPEXP void _rl_push_executing_macro PARAMS((void)); -READLINE_DLL_IMPEXP void _rl_pop_executing_macro PARAMS((void)); -READLINE_DLL_IMPEXP void _rl_add_macro_char PARAMS((int)); -READLINE_DLL_IMPEXP void _rl_kill_kbd_macro PARAMS((void)); - -/* misc.c */ -READLINE_DLL_IMPEXP int _rl_init_argument PARAMS((void)); -READLINE_DLL_IMPEXP void _rl_start_using_history PARAMS((void)); -READLINE_DLL_IMPEXP int _rl_free_saved_history_line PARAMS((void)); -READLINE_DLL_IMPEXP void _rl_set_insert_mode PARAMS((int, int)); - -/* nls.c */ -READLINE_DLL_IMPEXP int _rl_init_eightbit PARAMS((void)); - -/* parens.c */ -READLINE_DLL_IMPEXP void _rl_enable_paren_matching PARAMS((int)); - -/* readline.c */ -READLINE_DLL_IMPEXP void _rl_init_line_state PARAMS((void)); -READLINE_DLL_IMPEXP void _rl_set_the_line PARAMS((void)); -READLINE_DLL_IMPEXP int _rl_dispatch PARAMS((int, Keymap)); -READLINE_DLL_IMPEXP int _rl_dispatch_subseq PARAMS((int, Keymap, int)); - -/* rltty.c */ -READLINE_DLL_IMPEXP int _rl_disable_tty_signals PARAMS((void)); -READLINE_DLL_IMPEXP int _rl_restore_tty_signals PARAMS((void)); - -/* terminal.c */ -READLINE_DLL_IMPEXP void _rl_get_screen_size PARAMS((int, int)); -READLINE_DLL_IMPEXP int _rl_init_terminal_io PARAMS((const char *)); -#ifdef _MINIX -READLINE_DLL_IMPEXP void _rl_output_character_function PARAMS((int)); -#else -READLINE_DLL_IMPEXP int _rl_output_character_function PARAMS((int)); -#endif -READLINE_DLL_IMPEXP void _rl_output_some_chars PARAMS((const char *, int)); -READLINE_DLL_IMPEXP int _rl_backspace PARAMS((int)); -READLINE_DLL_IMPEXP void _rl_enable_meta_key PARAMS((void)); -READLINE_DLL_IMPEXP void _rl_control_keypad PARAMS((int)); -READLINE_DLL_IMPEXP void _rl_set_cursor PARAMS((int, int)); - -/* text.c */ -READLINE_DLL_IMPEXP void _rl_fix_point PARAMS((int)); -READLINE_DLL_IMPEXP int _rl_replace_text PARAMS((const char *, int, int)); -READLINE_DLL_IMPEXP int _rl_insert_char PARAMS((int, int)); -READLINE_DLL_IMPEXP int _rl_overwrite_char PARAMS((int, int)); -READLINE_DLL_IMPEXP int _rl_overwrite_rubout PARAMS((int, int)); -READLINE_DLL_IMPEXP int _rl_rubout_char PARAMS((int, int)); -#if defined (HANDLE_MULTIBYTE) -READLINE_DLL_IMPEXP int _rl_char_search_internal PARAMS((int, int, char *, int)); -#else -READLINE_DLL_IMPEXP int _rl_char_search_internal PARAMS((int, int, int)); -#endif -READLINE_DLL_IMPEXP int _rl_set_mark_at_pos PARAMS((int)); - -/* util.c */ -READLINE_DLL_IMPEXP int _rl_abort_internal PARAMS((void)); -READLINE_DLL_IMPEXP char *_rl_strindex PARAMS((const char *, const char *)); -READLINE_DLL_IMPEXP int _rl_qsort_string_compare PARAMS((char **, char **)); -READLINE_DLL_IMPEXP int (_rl_uppercase_p) PARAMS((int)); -READLINE_DLL_IMPEXP int (_rl_lowercase_p) PARAMS((int)); -READLINE_DLL_IMPEXP int (_rl_pure_alphabetic) PARAMS((int)); -READLINE_DLL_IMPEXP int (_rl_digit_p) PARAMS((int)); -READLINE_DLL_IMPEXP int (_rl_to_lower) PARAMS((int)); -READLINE_DLL_IMPEXP int (_rl_to_upper) PARAMS((int)); -READLINE_DLL_IMPEXP int (_rl_digit_value) PARAMS((int)); - -/* vi_mode.c */ -READLINE_DLL_IMPEXP void _rl_vi_initialize_line PARAMS((void)); -READLINE_DLL_IMPEXP void _rl_vi_reset_last PARAMS((void)); -READLINE_DLL_IMPEXP void _rl_vi_set_last PARAMS((int, int, int)); -READLINE_DLL_IMPEXP int _rl_vi_textmod_command PARAMS((int)); -READLINE_DLL_IMPEXP void _rl_vi_done_inserting PARAMS((void)); - -/************************************************************************* - * Undocumented private variables * - *************************************************************************/ - -/* bind.c */ -READLINE_DLL_IMPEXP const char *_rl_possible_control_prefixes[]; -READLINE_DLL_IMPEXP const char *_rl_possible_meta_prefixes[]; - -/* complete.c */ -READLINE_DLL_IMPEXP int _rl_complete_show_all; -READLINE_DLL_IMPEXP int _rl_complete_show_unmodified; -READLINE_DLL_IMPEXP int _rl_complete_mark_directories; -READLINE_DLL_IMPEXP int _rl_complete_mark_symlink_dirs; -READLINE_DLL_IMPEXP int _rl_print_completions_horizontally; -READLINE_DLL_IMPEXP int _rl_completion_case_fold; -READLINE_DLL_IMPEXP int _rl_match_hidden_files; -READLINE_DLL_IMPEXP int _rl_page_completions; - -/* display.c */ -READLINE_DLL_IMPEXP int _rl_vis_botlin; -READLINE_DLL_IMPEXP int _rl_last_c_pos; -READLINE_DLL_IMPEXP int _rl_suppress_redisplay; -READLINE_DLL_IMPEXP char *rl_display_prompt; - -/* isearch.c */ -READLINE_DLL_IMPEXP char *_rl_isearch_terminators; - -/* macro.c */ -READLINE_DLL_IMPEXP char *_rl_executing_macro; - -/* misc.c */ -READLINE_DLL_IMPEXP int _rl_history_preserve_point; -READLINE_DLL_IMPEXP int _rl_history_saved_point; - -/* readline.c */ -READLINE_DLL_IMPEXP int _rl_horizontal_scroll_mode; -READLINE_DLL_IMPEXP int _rl_mark_modified_lines; -READLINE_DLL_IMPEXP int _rl_bell_preference; -READLINE_DLL_IMPEXP int _rl_meta_flag; -READLINE_DLL_IMPEXP int _rl_convert_meta_chars_to_ascii; -READLINE_DLL_IMPEXP int _rl_output_meta_chars; -READLINE_DLL_IMPEXP char *_rl_comment_begin; -READLINE_DLL_IMPEXP unsigned char _rl_parsing_conditionalized_out; -READLINE_DLL_IMPEXP Keymap _rl_keymap; -READLINE_DLL_IMPEXP FILE *_rl_in_stream; -READLINE_DLL_IMPEXP FILE *_rl_out_stream; -READLINE_DLL_IMPEXP int _rl_last_command_was_kill; -READLINE_DLL_IMPEXP int _rl_eof_char; -READLINE_DLL_IMPEXP procenv_t readline_top_level; - -/* terminal.c */ -READLINE_DLL_IMPEXP int _rl_enable_keypad; -READLINE_DLL_IMPEXP int _rl_enable_meta; -READLINE_DLL_IMPEXP char *_rl_term_clreol; -READLINE_DLL_IMPEXP char *_rl_term_clrpag; -READLINE_DLL_IMPEXP char *_rl_term_im; -READLINE_DLL_IMPEXP char *_rl_term_ic; -READLINE_DLL_IMPEXP char *_rl_term_ei; -READLINE_DLL_IMPEXP char *_rl_term_DC; -READLINE_DLL_IMPEXP char *_rl_term_up; -READLINE_DLL_IMPEXP char *_rl_term_dc; -READLINE_DLL_IMPEXP char *_rl_term_cr; -READLINE_DLL_IMPEXP char *_rl_term_IC; -READLINE_DLL_IMPEXP int _rl_screenheight; -READLINE_DLL_IMPEXP int _rl_screenwidth; -READLINE_DLL_IMPEXP int _rl_screenchars; -READLINE_DLL_IMPEXP int _rl_terminal_can_insert; -READLINE_DLL_IMPEXP int _rl_term_autowrap; - -/* undo.c */ -READLINE_DLL_IMPEXP int _rl_doing_an_undo; -READLINE_DLL_IMPEXP int _rl_undo_group_level; - -/* vi_mode.c */ -READLINE_DLL_IMPEXP int _rl_vi_last_command; - -#endif /* _RL_PRIVATE_H_ */ diff --git a/dep/src/readline/src/rlshell.h b/dep/src/readline/src/rlshell.h deleted file mode 100644 index c8ea012ca74..00000000000 --- a/dep/src/readline/src/rlshell.h +++ /dev/null @@ -1,34 +0,0 @@ -/* rlshell.h -- utility functions normally provided by bash. */ - -/* Copyright (C) 1999 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#if !defined (_RL_SHELL_H_) -#define _RL_SHELL_H_ - -#include "rlstdc.h" - -READLINE_DLL_IMPEXP char *sh_single_quote PARAMS((char *)); -READLINE_DLL_IMPEXP void sh_set_lines_and_columns PARAMS((int, int)); -READLINE_DLL_IMPEXP char *sh_get_env_value PARAMS((const char *)); -READLINE_DLL_IMPEXP char *sh_get_home_dir PARAMS((void)); -READLINE_DLL_IMPEXP int sh_unset_nodelay_mode PARAMS((int)); - -#endif /* _RL_SHELL_H_ */ diff --git a/dep/src/readline/src/rltty.c b/dep/src/readline/src/rltty.c deleted file mode 100644 index a033982cb6f..00000000000 --- a/dep/src/readline/src/rltty.c +++ /dev/null @@ -1,1095 +0,0 @@ -/* rltty.c -- functions to prepare and restore the terminal for readline's - use. */ - -/* Copyright (C) 1992 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ -#define READLINE_LIBRARY - -#if defined (HAVE_CONFIG_H) -# include -#endif - -/* for native Win32 environments this is hard stuff */ -#if !defined (_WIN32) - -#include -#include -#include -#include - -#if defined (HAVE_UNISTD_H) -# include -#endif /* HAVE_UNISTD_H */ - -#include "rldefs.h" - -#if defined (GWINSZ_IN_SYS_IOCTL) -# include -#endif /* GWINSZ_IN_SYS_IOCTL */ - -#include "rltty.h" - -#else /* _WIN32 */ -#include "rldefs.h" -#include -#endif /* _WIN32 */ - -#include "readline.h" -#include "rlprivate.h" - -#if !defined (errno) -extern int errno; -#endif /* !errno */ - -rl_vintfunc_t *rl_prep_term_function = rl_prep_terminal; -rl_voidfunc_t *rl_deprep_term_function = rl_deprep_terminal; - -static void block_sigint PARAMS((void)); -static void release_sigint PARAMS((void)); - -static void set_winsize PARAMS((int)); - -#if !defined (_WIN32) -/* **************************************************************** */ -/* */ -/* Signal Management */ -/* */ -/* **************************************************************** */ - -#if defined (HAVE_POSIX_SIGNALS) -static sigset_t sigint_set, sigint_oset; -#else /* !HAVE_POSIX_SIGNALS */ -# if defined (HAVE_BSD_SIGNALS) -static int sigint_oldmask; -# endif /* HAVE_BSD_SIGNALS */ -#endif /* !HAVE_POSIX_SIGNALS */ - -static int sigint_blocked; - -/* Cause SIGINT to not be delivered until the corresponding call to - release_sigint(). */ -static void -block_sigint () -{ - if (sigint_blocked) - return; - -#if defined (HAVE_POSIX_SIGNALS) - sigemptyset (&sigint_set); - sigemptyset (&sigint_oset); - sigaddset (&sigint_set, SIGINT); - sigprocmask (SIG_BLOCK, &sigint_set, &sigint_oset); -#else /* !HAVE_POSIX_SIGNALS */ -# if defined (HAVE_BSD_SIGNALS) - sigint_oldmask = sigblock (sigmask (SIGINT)); -# else /* !HAVE_BSD_SIGNALS */ -# if defined (HAVE_USG_SIGHOLD) - sighold (SIGINT); -# endif /* HAVE_USG_SIGHOLD */ -# endif /* !HAVE_BSD_SIGNALS */ -#endif /* !HAVE_POSIX_SIGNALS */ - - sigint_blocked = 1; -} - -/* Allow SIGINT to be delivered. */ -static void -release_sigint () -{ - if (sigint_blocked == 0) - return; - -#if defined (HAVE_POSIX_SIGNALS) - sigprocmask (SIG_SETMASK, &sigint_oset, (sigset_t *)NULL); -#else -# if defined (HAVE_BSD_SIGNALS) - sigsetmask (sigint_oldmask); -# else /* !HAVE_BSD_SIGNALS */ -# if defined (HAVE_USG_SIGHOLD) - sigrelse (SIGINT); -# endif /* HAVE_USG_SIGHOLD */ -# endif /* !HAVE_BSD_SIGNALS */ -#endif /* !HAVE_POSIX_SIGNALS */ - - sigint_blocked = 0; -} - -/* **************************************************************** */ -/* */ -/* Saving and Restoring the TTY */ -/* */ -/* **************************************************************** */ - -/* Non-zero means that the terminal is in a prepped state. */ -static int terminal_prepped; - -static _RL_TTY_CHARS _rl_tty_chars, _rl_last_tty_chars; - -/* If non-zero, means that this process has called tcflow(fd, TCOOFF) - and output is suspended. */ -#if defined (__ksr1__) -static int ksrflow; -#endif - -/* Dummy call to force a backgrounded readline to stop before it tries - to get the tty settings. */ -static void -set_winsize (tty) - int tty; -{ -#if defined (TIOCGWINSZ) - struct winsize w; - - if (ioctl (tty, TIOCGWINSZ, &w) == 0) - (void) ioctl (tty, TIOCSWINSZ, &w); -#endif /* TIOCGWINSZ */ -} - -#if defined (NEW_TTY_DRIVER) - -/* Values for the `flags' field of a struct bsdtty. This tells which - elements of the struct bsdtty have been fetched from the system and - are valid. */ -#define SGTTY_SET 0x01 -#define LFLAG_SET 0x02 -#define TCHARS_SET 0x04 -#define LTCHARS_SET 0x08 - -struct bsdtty { - struct sgttyb sgttyb; /* Basic BSD tty driver information. */ - int lflag; /* Local mode flags, like LPASS8. */ -#if defined (TIOCGETC) - struct tchars tchars; /* Terminal special characters, including ^S and ^Q. */ -#endif -#if defined (TIOCGLTC) - struct ltchars ltchars; /* 4.2 BSD editing characters */ -#endif - int flags; /* Bitmap saying which parts of the struct are valid. */ -}; - -#define TIOTYPE struct bsdtty - -static TIOTYPE otio; - -static void save_tty_chars PARAMS((TIOTYPE *)); -static int _get_tty_settings PARAMS((int, TIOTYPE *)); -static int get_tty_settings PARAMS((int, TIOTYPE *)); -static int _set_tty_settings PARAMS((int, TIOTYPE *)); -static int set_tty_settings PARAMS((int, TIOTYPE *)); - -static void prepare_terminal_settings PARAMS((int, TIOTYPE, TIOTYPE *)); - -static void set_special_char PARAMS((Keymap, TIOTYPE *, int, rl_command_func_t)); - -static void -save_tty_chars (tiop) - TIOTYPE *tiop; -{ - _rl_last_tty_chars = _rl_tty_chars; - - if (tiop->flags & SGTTY_SET) - { - _rl_tty_chars.t_erase = tiop->sgttyb.sg_erase; - _rl_tty_chars.t_kill = tiop->sgttyb.sg_kill; - } - - if (tiop->flags & TCHARS_SET) - { - _rl_tty_chars.t_intr = tiop->tchars.t_intrc; - _rl_tty_chars.t_quit = tiop->tchars.t_quitc; - _rl_tty_chars.t_start = tiop->tchars.t_startc; - _rl_tty_chars.t_stop = tiop->tchars.t_stopc; - _rl_tty_chars.t_eof = tiop->tchars.t_eofc; - _rl_tty_chars.t_eol = '\n'; - _rl_tty_chars.t_eol2 = tiop->tchars.t_brkc; - } - - if (tiop->flags & LTCHARS_SET) - { - _rl_tty_chars.t_susp = tiop->ltchars.t_suspc; - _rl_tty_chars.t_dsusp = tiop->ltchars.t_dsuspc; - _rl_tty_chars.t_reprint = tiop->ltchars.t_rprntc; - _rl_tty_chars.t_flush = tiop->ltchars.t_flushc; - _rl_tty_chars.t_werase = tiop->ltchars.t_werasc; - _rl_tty_chars.t_lnext = tiop->ltchars.t_lnextc; - } - - _rl_tty_chars.t_status = -1; -} - -static int -get_tty_settings (tty, tiop) - int tty; - TIOTYPE *tiop; -{ -#if defined (TIOCGWINSZ) - set_winsize (tty); -#endif - - tiop->flags = tiop->lflag = 0; - - if (ioctl (tty, TIOCGETP, &(tiop->sgttyb)) < 0) - return -1; - tiop->flags |= SGTTY_SET; - -#if defined (TIOCLGET) - if (ioctl (tty, TIOCLGET, &(tiop->lflag)) == 0) - tiop->flags |= LFLAG_SET; -#endif - -#if defined (TIOCGETC) - if (ioctl (tty, TIOCGETC, &(tiop->tchars)) == 0) - tiop->flags |= TCHARS_SET; -#endif - -#if defined (TIOCGLTC) - if (ioctl (tty, TIOCGLTC, &(tiop->ltchars)) == 0) - tiop->flags |= LTCHARS_SET; -#endif - - return 0; -} - -static int -set_tty_settings (tty, tiop) - int tty; - TIOTYPE *tiop; -{ - if (tiop->flags & SGTTY_SET) - { - ioctl (tty, TIOCSETN, &(tiop->sgttyb)); - tiop->flags &= ~SGTTY_SET; - } - readline_echoing_p = 1; - -#if defined (TIOCLSET) - if (tiop->flags & LFLAG_SET) - { - ioctl (tty, TIOCLSET, &(tiop->lflag)); - tiop->flags &= ~LFLAG_SET; - } -#endif - -#if defined (TIOCSETC) - if (tiop->flags & TCHARS_SET) - { - ioctl (tty, TIOCSETC, &(tiop->tchars)); - tiop->flags &= ~TCHARS_SET; - } -#endif - -#if defined (TIOCSLTC) - if (tiop->flags & LTCHARS_SET) - { - ioctl (tty, TIOCSLTC, &(tiop->ltchars)); - tiop->flags &= ~LTCHARS_SET; - } -#endif - - return 0; -} - -static void -prepare_terminal_settings (meta_flag, oldtio, tiop) - int meta_flag; - TIOTYPE oldtio, *tiop; -{ - readline_echoing_p = (oldtio.sgttyb.sg_flags & ECHO); - - /* Copy the original settings to the structure we're going to use for - our settings. */ - tiop->sgttyb = oldtio.sgttyb; - tiop->lflag = oldtio.lflag; -#if defined (TIOCGETC) - tiop->tchars = oldtio.tchars; -#endif -#if defined (TIOCGLTC) - tiop->ltchars = oldtio.ltchars; -#endif - tiop->flags = oldtio.flags; - - /* First, the basic settings to put us into character-at-a-time, no-echo - input mode. */ - tiop->sgttyb.sg_flags &= ~(ECHO | CRMOD); - tiop->sgttyb.sg_flags |= CBREAK; - - /* If this terminal doesn't care how the 8th bit is used, then we can - use it for the meta-key. If only one of even or odd parity is - specified, then the terminal is using parity, and we cannot. */ -#if !defined (ANYP) -# define ANYP (EVENP | ODDP) -#endif - if (((oldtio.sgttyb.sg_flags & ANYP) == ANYP) || - ((oldtio.sgttyb.sg_flags & ANYP) == 0)) - { - tiop->sgttyb.sg_flags |= ANYP; - - /* Hack on local mode flags if we can. */ -#if defined (TIOCLGET) -# if defined (LPASS8) - tiop->lflag |= LPASS8; -# endif /* LPASS8 */ -#endif /* TIOCLGET */ - } - -#if defined (TIOCGETC) -# if defined (USE_XON_XOFF) - /* Get rid of terminal output start and stop characters. */ - tiop->tchars.t_stopc = -1; /* C-s */ - tiop->tchars.t_startc = -1; /* C-q */ - - /* If there is an XON character, bind it to restart the output. */ - if (oldtio.tchars.t_startc != -1) - rl_bind_key (oldtio.tchars.t_startc, rl_restart_output); -# endif /* USE_XON_XOFF */ - - /* If there is an EOF char, bind _rl_eof_char to it. */ - if (oldtio.tchars.t_eofc != -1) - _rl_eof_char = oldtio.tchars.t_eofc; - -# if defined (NO_KILL_INTR) - /* Get rid of terminal-generated SIGQUIT and SIGINT. */ - tiop->tchars.t_quitc = -1; /* C-\ */ - tiop->tchars.t_intrc = -1; /* C-c */ -# endif /* NO_KILL_INTR */ -#endif /* TIOCGETC */ - -#if defined (TIOCGLTC) - /* Make the interrupt keys go away. Just enough to make people happy. */ - tiop->ltchars.t_dsuspc = -1; /* C-y */ - tiop->ltchars.t_lnextc = -1; /* C-v */ -#endif /* TIOCGLTC */ -} - -#else /* !defined (NEW_TTY_DRIVER) */ - -#if !defined (VMIN) -# define VMIN VEOF -#endif - -#if !defined (VTIME) -# define VTIME VEOL -#endif - -#if defined (TERMIOS_TTY_DRIVER) -# define TIOTYPE struct termios -# define DRAIN_OUTPUT(fd) tcdrain (fd) -# define GETATTR(tty, tiop) (tcgetattr (tty, tiop)) -# ifdef M_UNIX -# define SETATTR(tty, tiop) (tcsetattr (tty, TCSANOW, tiop)) -# else -# define SETATTR(tty, tiop) (tcsetattr (tty, TCSADRAIN, tiop)) -# endif /* !M_UNIX */ -#else -# define TIOTYPE struct termio -# define DRAIN_OUTPUT(fd) -# define GETATTR(tty, tiop) (ioctl (tty, TCGETA, tiop)) -# define SETATTR(tty, tiop) (ioctl (tty, TCSETAW, tiop)) -#endif /* !TERMIOS_TTY_DRIVER */ - -static TIOTYPE otio; - -static void save_tty_chars PARAMS((TIOTYPE *)); -static int _get_tty_settings PARAMS((int, TIOTYPE *)); -static int get_tty_settings PARAMS((int, TIOTYPE *)); -static int _set_tty_settings PARAMS((int, TIOTYPE *)); -static int set_tty_settings PARAMS((int, TIOTYPE *)); - -static void prepare_terminal_settings PARAMS((int, TIOTYPE, TIOTYPE *)); - -static void set_special_char PARAMS((Keymap, TIOTYPE *, int, rl_command_func_t)); -static void _rl_bind_tty_special_chars PARAMS((Keymap, TIOTYPE)); - -#if defined (FLUSHO) -# define OUTPUT_BEING_FLUSHED(tp) (tp->c_lflag & FLUSHO) -#else -# define OUTPUT_BEING_FLUSHED(tp) 0 -#endif - -static void -save_tty_chars (tiop) - TIOTYPE *tiop; -{ - _rl_last_tty_chars = _rl_tty_chars; - - _rl_tty_chars.t_eof = tiop->c_cc[VEOF]; - _rl_tty_chars.t_eol = tiop->c_cc[VEOL]; -#ifdef VEOL2 - _rl_tty_chars.t_eol2 = tiop->c_cc[VEOL2]; -#endif - _rl_tty_chars.t_erase = tiop->c_cc[VERASE]; -#ifdef VWERASE - _rl_tty_chars.t_werase = tiop->c_cc[VWERASE]; -#endif - _rl_tty_chars.t_kill = tiop->c_cc[VKILL]; -#ifdef VREPRINT - _rl_tty_chars.t_reprint = tiop->c_cc[VREPRINT]; -#endif - _rl_tty_chars.t_intr = tiop->c_cc[VINTR]; - _rl_tty_chars.t_quit = tiop->c_cc[VQUIT]; -#ifdef VSUSP - _rl_tty_chars.t_susp = tiop->c_cc[VSUSP]; -#endif -#ifdef VDSUSP - _rl_tty_chars.t_dsusp = tiop->c_cc[VDSUSP]; -#endif -#ifdef VSTART - _rl_tty_chars.t_start = tiop->c_cc[VSTART]; -#endif -#ifdef VSTOP - _rl_tty_chars.t_stop = tiop->c_cc[VSTOP]; -#endif -#ifdef VLNEXT - _rl_tty_chars.t_lnext = tiop->c_cc[VLNEXT]; -#endif -#ifdef VDISCARD - _rl_tty_chars.t_flush = tiop->c_cc[VDISCARD]; -#endif -#ifdef VSTATUS - _rl_tty_chars.t_status = tiop->c_cc[VSTATUS]; -#endif -} - -#if defined (_AIX) || defined (_AIX41) -/* Currently this is only used on AIX */ -static void -rltty_warning (msg) - char *msg; -{ - fprintf (stderr, "readline: warning: %s\n", msg); -} -#endif - -#if defined (_AIX) -void -setopost(tp) -TIOTYPE *tp; -{ - if ((tp->c_oflag & OPOST) == 0) - { - rltty_warning ("turning on OPOST for terminal\r"); - tp->c_oflag |= OPOST|ONLCR; - } -} -#endif - -static int -_get_tty_settings (tty, tiop) - int tty; - TIOTYPE *tiop; -{ - int ioctl_ret; - - while (1) - { - ioctl_ret = GETATTR (tty, tiop); - if (ioctl_ret < 0) - { - if (errno != EINTR) - return -1; - else - continue; - } - if (OUTPUT_BEING_FLUSHED (tiop)) - { -#if defined (FLUSHO) && defined (_AIX41) - rltty_warning ("turning off output flushing"); - tiop->c_lflag &= ~FLUSHO; - break; -#else - continue; -#endif - } - break; - } - - return 0; -} - -static int -get_tty_settings (tty, tiop) - int tty; - TIOTYPE *tiop; -{ -#if defined (TIOCGWINSZ) - set_winsize (tty); -#endif - - if (_get_tty_settings (tty, tiop) < 0) - return -1; - -#if defined (_AIX) - setopost(tiop); -#endif - - return 0; -} - -static int -_set_tty_settings (tty, tiop) - int tty; - TIOTYPE *tiop; -{ - while (SETATTR (tty, tiop) < 0) - { - if (errno != EINTR) - return -1; - errno = 0; - } - return 0; -} - -static int -set_tty_settings (tty, tiop) - int tty; - TIOTYPE *tiop; -{ - if (_set_tty_settings (tty, tiop) < 0) - return -1; - -#if 0 - -#if defined (TERMIOS_TTY_DRIVER) -# if defined (__ksr1__) - if (ksrflow) - { - ksrflow = 0; - tcflow (tty, TCOON); - } -# else /* !ksr1 */ - tcflow (tty, TCOON); /* Simulate a ^Q. */ -# endif /* !ksr1 */ -#else - ioctl (tty, TCXONC, 1); /* Simulate a ^Q. */ -#endif /* !TERMIOS_TTY_DRIVER */ - -#endif /* 0 */ - - return 0; -} - -static void -prepare_terminal_settings (meta_flag, oldtio, tiop) - int meta_flag; - TIOTYPE oldtio, *tiop; -{ - readline_echoing_p = (oldtio.c_lflag & ECHO); - - tiop->c_lflag &= ~(ICANON | ECHO); - - if ((unsigned char) oldtio.c_cc[VEOF] != (unsigned char) _POSIX_VDISABLE) - _rl_eof_char = oldtio.c_cc[VEOF]; - -#if defined (USE_XON_XOFF) -#if defined (IXANY) - tiop->c_iflag &= ~(IXON | IXOFF | IXANY); -#else - /* `strict' Posix systems do not define IXANY. */ - tiop->c_iflag &= ~(IXON | IXOFF); -#endif /* IXANY */ -#endif /* USE_XON_XOFF */ - - /* Only turn this off if we are using all 8 bits. */ - if (((tiop->c_cflag & CSIZE) == CS8) || meta_flag) - tiop->c_iflag &= ~(ISTRIP | INPCK); - - /* Make sure we differentiate between CR and NL on input. */ - tiop->c_iflag &= ~(ICRNL | INLCR); - -#if !defined (HANDLE_SIGNALS) - tiop->c_lflag &= ~ISIG; -#else - tiop->c_lflag |= ISIG; -#endif - - tiop->c_cc[VMIN] = 1; - tiop->c_cc[VTIME] = 0; - -#if defined (FLUSHO) - if (OUTPUT_BEING_FLUSHED (tiop)) - { - tiop->c_lflag &= ~FLUSHO; - oldtio.c_lflag &= ~FLUSHO; - } -#endif - - /* Turn off characters that we need on Posix systems with job control, - just to be sure. This includes ^Y and ^V. This should not really - be necessary. */ -#if defined (TERMIOS_TTY_DRIVER) && defined (_POSIX_VDISABLE) - -#if defined (VLNEXT) - tiop->c_cc[VLNEXT] = _POSIX_VDISABLE; -#endif - -#if defined (VDSUSP) - tiop->c_cc[VDSUSP] = _POSIX_VDISABLE; -#endif - -#endif /* TERMIOS_TTY_DRIVER && _POSIX_VDISABLE */ -} -#endif /* NEW_TTY_DRIVER */ - -/* Put the terminal in CBREAK mode so that we can detect key presses. */ -void -rl_prep_terminal (meta_flag) - int meta_flag; -{ - int tty; - TIOTYPE tio; - - if (terminal_prepped) - return; - - /* Try to keep this function from being INTerrupted. */ - block_sigint (); - - tty = fileno (rl_instream); - - if (get_tty_settings (tty, &tio) < 0) - { - release_sigint (); - return; - } - - otio = tio; - - rl_tty_unset_default_bindings (_rl_keymap); - save_tty_chars (&otio); - RL_SETSTATE(RL_STATE_TTYCSAVED); - _rl_bind_tty_special_chars (_rl_keymap, tio); - - prepare_terminal_settings (meta_flag, otio, &tio); - - if (set_tty_settings (tty, &tio) < 0) - { - release_sigint (); - return; - } - - if (_rl_enable_keypad) - _rl_control_keypad (1); - - fflush (rl_outstream); - terminal_prepped = 1; - RL_SETSTATE(RL_STATE_TERMPREPPED); - - release_sigint (); -} - -/* Restore the terminal's normal settings and modes. */ -void -rl_deprep_terminal () -{ - int tty; - - if (!terminal_prepped) - return; - - /* Try to keep this function from being interrupted. */ - block_sigint (); - - tty = fileno (rl_instream); - - if (_rl_enable_keypad) - _rl_control_keypad (0); - - fflush (rl_outstream); - - if (set_tty_settings (tty, &otio) < 0) - { - release_sigint (); - return; - } - - terminal_prepped = 0; - RL_UNSETSTATE(RL_STATE_TERMPREPPED); - - release_sigint (); -} - -/* **************************************************************** */ -/* */ -/* Bogus Flow Control */ -/* */ -/* **************************************************************** */ - -int -rl_restart_output (count, key) - int count, key; -{ - int fildes = fileno (rl_outstream); -#if defined (TIOCSTART) -#if defined (apollo) - ioctl (&fildes, TIOCSTART, 0); -#else - ioctl (fildes, TIOCSTART, 0); -#endif /* apollo */ - -#else /* !TIOCSTART */ -# if defined (TERMIOS_TTY_DRIVER) -# if defined (__ksr1__) - if (ksrflow) - { - ksrflow = 0; - tcflow (fildes, TCOON); - } -# else /* !ksr1 */ - tcflow (fildes, TCOON); /* Simulate a ^Q. */ -# endif /* !ksr1 */ -# else /* !TERMIOS_TTY_DRIVER */ -# if defined (TCXONC) - ioctl (fildes, TCXONC, TCOON); -# endif /* TCXONC */ -# endif /* !TERMIOS_TTY_DRIVER */ -#endif /* !TIOCSTART */ - - return 0; -} - -int -rl_stop_output (count, key) - int count, key; -{ - int fildes = fileno (rl_instream); - -#if defined (TIOCSTOP) -# if defined (apollo) - ioctl (&fildes, TIOCSTOP, 0); -# else - ioctl (fildes, TIOCSTOP, 0); -# endif /* apollo */ -#else /* !TIOCSTOP */ -# if defined (TERMIOS_TTY_DRIVER) -# if defined (__ksr1__) - ksrflow = 1; -# endif /* ksr1 */ - tcflow (fildes, TCOOFF); -# else -# if defined (TCXONC) - ioctl (fildes, TCXONC, TCOON); -# endif /* TCXONC */ -# endif /* !TERMIOS_TTY_DRIVER */ -#endif /* !TIOCSTOP */ - - return 0; -} - -/* **************************************************************** */ -/* */ -/* Default Key Bindings */ -/* */ -/* **************************************************************** */ - -#define SET_SPECIAL(sc, func) set_special_char(kmap, &ttybuff, sc, func) - -#if defined (NEW_TTY_DRIVER) -static void -set_special_char (kmap, tiop, sc, func) - Keymap kmap; - TIOTYPE *tiop; - int sc; - rl_command_func_t *func; -{ - if (sc != -1 && kmap[(unsigned char)sc].type == ISFUNC) - kmap[(unsigned char)sc].function = func; -} - -#define RESET_SPECIAL(c) \ - if (c != -1 && kmap[(unsigned char)c].type == ISFUNC) - kmap[(unsigned char)c].function = rl_insert; - -static void -_rl_bind_tty_special_chars (kmap, ttybuff) - Keymap kmap; - TIOTYPE ttybuff; -{ - if (ttybuff.flags & SGTTY_SET) - { - SET_SPECIAL (ttybuff.sgttyb.sg_erase, rl_rubout); - SET_SPECIAL (ttybuff.sgttyb.sg_kill, rl_unix_line_discard); - } - -# if defined (TIOCGLTC) - if (ttybuff.flags & LTCHARS_SET) - { - SET_SPECIAL (ttybuff.ltchars.t_werasc, rl_unix_word_rubout); - SET_SPECIAL (ttybuff.ltchars.t_lnextc, rl_quoted_insert); - } -# endif /* TIOCGLTC */ -} - -#else /* !NEW_TTY_DRIVER */ -static void -set_special_char (kmap, tiop, sc, func) - Keymap kmap; - TIOTYPE *tiop; - int sc; - rl_command_func_t *func; -{ - unsigned char uc; - - uc = tiop->c_cc[sc]; - if (uc != (unsigned char)_POSIX_VDISABLE && kmap[uc].type == ISFUNC) - kmap[uc].function = func; -} - -/* used later */ -#define RESET_SPECIAL(uc) \ - if (uc != (unsigned char)_POSIX_VDISABLE && kmap[uc].type == ISFUNC) \ - kmap[uc].function = rl_insert; - -static void -_rl_bind_tty_special_chars (kmap, ttybuff) - Keymap kmap; - TIOTYPE ttybuff; -{ - SET_SPECIAL (VERASE, rl_rubout); - SET_SPECIAL (VKILL, rl_unix_line_discard); - -# if defined (VLNEXT) && defined (TERMIOS_TTY_DRIVER) - SET_SPECIAL (VLNEXT, rl_quoted_insert); -# endif /* VLNEXT && TERMIOS_TTY_DRIVER */ - -# if defined (VWERASE) && defined (TERMIOS_TTY_DRIVER) - SET_SPECIAL (VWERASE, rl_unix_word_rubout); -# endif /* VWERASE && TERMIOS_TTY_DRIVER */ -} - -#endif /* !NEW_TTY_DRIVER */ - -/* Set the system's default editing characters to their readline equivalents - in KMAP. Should be static, now that we have rl_tty_set_default_bindings. */ -void -rltty_set_default_bindings (kmap) - Keymap kmap; -{ - TIOTYPE ttybuff; - int tty; - static int called = 0; - - tty = fileno (rl_instream); - - if (get_tty_settings (tty, &ttybuff) == 0) - _rl_bind_tty_special_chars (kmap, ttybuff); -} - -#else /* __MING32__ */ - -/* **************************************************************** */ -/* */ -/* Default Key Bindings for Win32 Console */ -/* */ -/* **************************************************************** */ - -#include - -#define CONSOLE_MODE ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT - -/* global vars used by other modules */ - -int haveConsole = 0; /* remember init result of the console */ -HANDLE hStdout, hStdin; /* these are different from stdin, stdout */ - -COORD rlScreenOrigin; /* readline origin in frame buffer coordinates */ -int rlScreenStart = 0; /* readline origin as frame screen buffer offset */ -COORD rlScreenEnd; /* end of line in frame buffer coordinates */ -int rlScreenMax = 0; /* end of line as linear frame buffer offset */ - -static DWORD savedConsoleMode = 0; /* to restore console on exit */ - -void -rltty_set_default_bindings (kmap) - Keymap kmap; -{ - /* I bet this is required on Win32 ;-) */ - { - char buf[40]; strcpy(buf,"set bell-style none"); - rl_parse_and_bind(buf); - } - rl_set_key ("\\M-\\&", rl_get_previous_history, kmap); - rl_set_key ("\\M-\\(", rl_get_next_history, kmap); - rl_set_key ("\\M-\\'", rl_forward, kmap); - rl_set_key ("\\M-\\%", rl_backward, kmap); - - rl_set_key ("\\M-\\$", rl_beg_of_line, kmap); - rl_set_key ("\\M-\\#", rl_end_of_line, kmap); - rl_set_key ("\\M-\\%", rl_backward_word, kmap); - rl_set_key ("\\M-\\'", rl_forward_word, kmap); - - rl_set_key ("\\M-\\-", rl_paste_from_clipboard, kmap); - rl_set_key ("\\M-\\.", rl_delete, kmap); - rl_set_key ("", rl_unix_word_rubout, kmap); -} - -/* Query and set up a Window Console */ - -void -rl_prep_terminal (meta_flag) - int meta_flag; -{ - readline_echoing_p = 1; - - if ( !(haveConsole & INITIALIZED) ) - { - if ( !(haveConsole & FOR_INPUT) - && ((hStdin = GetStdHandle(STD_INPUT_HANDLE)) != INVALID_HANDLE_VALUE) ) - { - DWORD dummy; - INPUT_RECORD irec; - if ( PeekConsoleInput(hStdin, &irec, 1, &dummy) ) - { - haveConsole |= FOR_INPUT; - if ( GetConsoleMode(hStdin, &savedConsoleMode) ) - SetConsoleMode(hStdin, CONSOLE_MODE); - } - } - if ( (hStdout = GetStdHandle(STD_OUTPUT_HANDLE)) != INVALID_HANDLE_VALUE) - { - CONSOLE_SCREEN_BUFFER_INFO csbi; - if ( GetConsoleScreenBufferInfo(hStdout, &csbi) - && (csbi.dwSize.X > 0) && (csbi.dwSize.Y > 0) ) - { - haveConsole |= FOR_OUTPUT; - rlScreenOrigin = csbi.dwCursorPosition; - rlScreenStart = (int)csbi.dwCursorPosition.Y * (int)csbi.dwSize.X - + (int)csbi.dwCursorPosition.X; - } - } - haveConsole |= INITIALIZED; - } -} - -/* Restore the consoles's normal settings and modes. */ -void -rl_deprep_terminal () -{ - SetConsoleMode(hStdin, savedConsoleMode); - haveConsole = 0; -} - -int -rl_restart_output (count, key) - int count, key; -{ - return 0; -} - -int -rl_stop_output (count, key) - int count, key; -{ - return 0; -} -#endif /* _WIN32 */ - -/* New public way to set the system default editing chars to their readline - equivalents. */ -void -rl_tty_set_default_bindings (kmap) - Keymap kmap; -{ - rltty_set_default_bindings (kmap); -} - -#ifndef _WIN32 -/* Rebind all of the tty special chars that readline worries about back - to self-insert. Call this before saving the current terminal special - chars with save_tty_chars(). This only works on POSIX termios or termio - systems. */ -void -rl_tty_unset_default_bindings (kmap) - Keymap kmap; -{ - /* Don't bother before we've saved the tty special chars at least once. */ - if (RL_ISSTATE(RL_STATE_TTYCSAVED) == 0) - return; - - RESET_SPECIAL (_rl_tty_chars.t_erase); - RESET_SPECIAL (_rl_tty_chars.t_kill); - -# if defined (VLNEXT) && defined (TERMIOS_TTY_DRIVER) - RESET_SPECIAL (_rl_tty_chars.t_lnext); -# endif /* VLNEXT && TERMIOS_TTY_DRIVER */ - -# if defined (VWERASE) && defined (TERMIOS_TTY_DRIVER) - RESET_SPECIAL (_rl_tty_chars.t_werase); -# endif /* VWERASE && TERMIOS_TTY_DRIVER */ -} -#endif /* _WIN32 */ - -#if defined (HANDLE_SIGNALS) - -#if defined (NEW_TTY_DRIVER) -int -_rl_disable_tty_signals () -{ - return 0; -} - -int -_rl_restore_tty_signals () -{ - return 0; -} -#else - -static TIOTYPE sigstty, nosigstty; -static int tty_sigs_disabled = 0; - -int -_rl_disable_tty_signals () -{ - if (tty_sigs_disabled) - return 0; - - if (_get_tty_settings (fileno (rl_instream), &sigstty) < 0) - return -1; - - nosigstty = sigstty; - - nosigstty.c_lflag &= ~ISIG; - nosigstty.c_iflag &= ~IXON; - - if (_set_tty_settings (fileno (rl_instream), &nosigstty) < 0) - return (_set_tty_settings (fileno (rl_instream), &sigstty)); - - tty_sigs_disabled = 1; - return 0; -} - -int -_rl_restore_tty_signals () -{ - int r; - - if (tty_sigs_disabled == 0) - return 0; - - r = _set_tty_settings (fileno (rl_instream), &sigstty); - - if (r == 0) - tty_sigs_disabled = 0; - - return r; -} -#endif /* !NEW_TTY_DRIVER */ - -#endif /* HANDLE_SIGNALS */ diff --git a/dep/src/readline/src/rltty.h b/dep/src/readline/src/rltty.h deleted file mode 100644 index e57e8073353..00000000000 --- a/dep/src/readline/src/rltty.h +++ /dev/null @@ -1,82 +0,0 @@ -/* rltty.h - tty driver-related definitions used by some library files. */ - -/* Copyright (C) 1995 Free Software Foundation, Inc. - - This file contains the Readline Library (the Library), a set of - routines for providing Emacs style line input to programs that ask - for it. - - The Library is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - The Library is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#if !defined (_RLTTY_H_) -#define _RLTTY_H_ - -/* Posix systems use termios and the Posix signal functions. */ -#if defined (TERMIOS_TTY_DRIVER) -# include -#endif /* TERMIOS_TTY_DRIVER */ - -/* System V machines use termio. */ -#if defined (TERMIO_TTY_DRIVER) -# include -# if !defined (TCOON) -# define TCOON 1 -# endif -#endif /* TERMIO_TTY_DRIVER */ - -/* Other (BSD) machines use sgtty. */ -#if defined (NEW_TTY_DRIVER) && !defined (_WIN32) -# include -#endif - -#include "rlwinsize.h" - -/* Define _POSIX_VDISABLE if we are not using the `new' tty driver and - it is not already defined. It is used both to determine if a - special character is disabled and to disable certain special - characters. Posix systems should set to 0, USG systems to -1. */ -#if !defined (NEW_TTY_DRIVER) && !defined (_POSIX_VDISABLE) -# if defined (_SVR4_VDISABLE) -# define _POSIX_VDISABLE _SVR4_VDISABLE -# else -# if defined (_POSIX_VERSION) -# define _POSIX_VDISABLE 0 -# else /* !_POSIX_VERSION */ -# define _POSIX_VDISABLE -1 -# endif /* !_POSIX_VERSION */ -# endif /* !_SVR4_DISABLE */ -#endif /* !NEW_TTY_DRIVER && !_POSIX_VDISABLE */ - -typedef struct _rl_tty_chars { - unsigned char t_eof; - unsigned char t_eol; - unsigned char t_eol2; - unsigned char t_erase; - unsigned char t_werase; - unsigned char t_kill; - unsigned char t_reprint; - unsigned char t_intr; - unsigned char t_quit; - unsigned char t_susp; - unsigned char t_dsusp; - unsigned char t_start; - unsigned char t_stop; - unsigned char t_lnext; - unsigned char t_flush; - unsigned char t_status; -} _RL_TTY_CHARS; - -#endif /* _RLTTY_H_ */ diff --git a/dep/src/readline/src/rlwinsize.h b/dep/src/readline/src/rlwinsize.h deleted file mode 100644 index 7838154d023..00000000000 --- a/dep/src/readline/src/rlwinsize.h +++ /dev/null @@ -1,57 +0,0 @@ -/* rlwinsize.h -- an attempt to isolate some of the system-specific defines - for `struct winsize' and TIOCGWINSZ. */ - -/* Copyright (C) 1997 Free Software Foundation, Inc. - - This file contains the Readline Library (the Library), a set of - routines for providing Emacs style line input to programs that ask - for it. - - The Library is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - The Library is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#if !defined (_RLWINSIZE_H_) -#define _RLWINSIZE_H_ - -#if defined (HAVE_CONFIG_H) -# include "config.h" -#endif - -/* Try to find the definitions of `struct winsize' and TIOGCWINSZ */ - -#if defined (GWINSZ_IN_SYS_IOCTL) && !defined (TIOCGWINSZ) -# include -#endif /* GWINSZ_IN_SYS_IOCTL && !TIOCGWINSZ */ - -#if defined (STRUCT_WINSIZE_IN_TERMIOS) && !defined (STRUCT_WINSIZE_IN_SYS_IOCTL) -# include -#endif /* STRUCT_WINSIZE_IN_TERMIOS && !STRUCT_WINSIZE_IN_SYS_IOCTL */ - -/* Not in either of the standard places, look around. */ -#if !defined (STRUCT_WINSIZE_IN_TERMIOS) && !defined (STRUCT_WINSIZE_IN_SYS_IOCTL) -# if defined (HAVE_SYS_STREAM_H) -# include -# endif /* HAVE_SYS_STREAM_H */ -# if defined (HAVE_SYS_PTEM_H) /* SVR4.2, at least, has it here */ -# include -# define _IO_PTEM_H /* work around SVR4.2 1.1.4 bug */ -# endif /* HAVE_SYS_PTEM_H */ -# if defined (HAVE_SYS_PTE_H) /* ??? */ -# include -# endif /* HAVE_SYS_PTE_H */ -#endif /* !STRUCT_WINSIZE_IN_TERMIOS && !STRUCT_WINSIZE_IN_SYS_IOCTL */ - -#endif /* _RL_WINSIZE_H */ - diff --git a/dep/src/readline/src/savestring.c b/dep/src/readline/src/savestring.c deleted file mode 100644 index 820428d8881..00000000000 --- a/dep/src/readline/src/savestring.c +++ /dev/null @@ -1,37 +0,0 @@ -/* savestring.c */ - -/* Copyright (C) 1998,2003 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ -#define READLINE_LIBRARY - -#include -#ifdef HAVE_STRING_H -# include -#endif -#include "xmalloc.h" - -/* Backwards compatibility, now that savestring has been removed from - all `public' readline header files. */ -char * -savestring (s) - const char *s; -{ - return ((char *)strcpy ((char *)xmalloc (1 + strlen (s)), (s))); -} diff --git a/dep/src/readline/src/search.c b/dep/src/readline/src/search.c deleted file mode 100644 index ce7d54eb799..00000000000 --- a/dep/src/readline/src/search.c +++ /dev/null @@ -1,475 +0,0 @@ -/* search.c - code for non-incremental searching in emacs and vi modes. */ - -/* Copyright (C) 1992 Free Software Foundation, Inc. - - This file is part of the Readline Library (the Library), a set of - routines for providing Emacs style line input to programs that ask - for it. - - The Library is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - The Library is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ -#define READLINE_LIBRARY - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#include -#include - -#if defined (HAVE_UNISTD_H) -# include -#endif - -#if defined (HAVE_STDLIB_H) -# include -#else -# include "ansi_stdlib.h" -#endif - -#include "rldefs.h" -#include "rlmbutil.h" - -#include "readline.h" -#include "history.h" - -#include "rlprivate.h" -#include "xmalloc.h" - -#ifdef abs -# undef abs -#endif -#define abs(x) (((x) >= 0) ? (x) : -(x)) - -extern HIST_ENTRY *_rl_saved_line_for_history; - -/* Functions imported from the rest of the library. */ -extern int _rl_free_history_entry PARAMS((HIST_ENTRY *)); - -static char *noninc_search_string = (char *) NULL; -static int noninc_history_pos; - -static char *prev_line_found = (char *) NULL; - -static int rl_history_search_len; -static int rl_history_search_pos; -static char *history_search_string; -static int history_string_size; - -static void make_history_line_current PARAMS((HIST_ENTRY *)); -static int noninc_search_from_pos PARAMS((char *, int, int)); -static void noninc_dosearch PARAMS((char *, int)); -static void noninc_search PARAMS((int, int)); -static int rl_history_search_internal PARAMS((int, int)); -static void rl_history_search_reinit PARAMS((void)); - -/* Make the data from the history entry ENTRY be the contents of the - current line. This doesn't do anything with rl_point; the caller - must set it. */ -static void -make_history_line_current (entry) - HIST_ENTRY *entry; -{ -#if 0 - rl_replace_line (entry->line, 1); - rl_undo_list = (UNDO_LIST *)entry->data; -#else - _rl_replace_text (entry->line, 0, rl_end); - _rl_fix_point (1); -#endif - - if (_rl_saved_line_for_history) - _rl_free_history_entry (_rl_saved_line_for_history); - _rl_saved_line_for_history = (HIST_ENTRY *)NULL; -} - -/* Search the history list for STRING starting at absolute history position - POS. If STRING begins with `^', the search must match STRING at the - beginning of a history line, otherwise a full substring match is performed - for STRING. DIR < 0 means to search backwards through the history list, - DIR >= 0 means to search forward. */ -static int -noninc_search_from_pos (string, pos, dir) - char *string; - int pos, dir; -{ - int ret, old; - - if (pos < 0) - return -1; - - old = where_history (); - if (history_set_pos (pos) == 0) - return -1; - - RL_SETSTATE(RL_STATE_SEARCH); - if (*string == '^') - ret = history_search_prefix (string + 1, dir); - else - ret = history_search (string, dir); - RL_UNSETSTATE(RL_STATE_SEARCH); - - if (ret != -1) - ret = where_history (); - - history_set_pos (old); - return (ret); -} - -/* Search for a line in the history containing STRING. If DIR is < 0, the - search is backwards through previous entries, else through subsequent - entries. */ -static void -noninc_dosearch (string, dir) - char *string; - int dir; -{ - int oldpos, pos; - HIST_ENTRY *entry; - - if (string == 0 || *string == '\0' || noninc_history_pos < 0) - { - rl_ding (); - return; - } - - pos = noninc_search_from_pos (string, noninc_history_pos + dir, dir); - if (pos == -1) - { - /* Search failed, current history position unchanged. */ - rl_maybe_unsave_line (); - rl_clear_message (); - rl_point = 0; - rl_ding (); - return; - } - - noninc_history_pos = pos; - - oldpos = where_history (); - history_set_pos (noninc_history_pos); - entry = current_history (); -#if defined (VI_MODE) - if (rl_editing_mode != vi_mode) -#endif - history_set_pos (oldpos); - - make_history_line_current (entry); - - rl_point = 0; - rl_mark = rl_end; - - rl_clear_message (); -} - -/* Search non-interactively through the history list. DIR < 0 means to - search backwards through the history of previous commands; otherwise - the search is for commands subsequent to the current position in the - history list. PCHAR is the character to use for prompting when reading - the search string; if not specified (0), it defaults to `:'. */ -static void -noninc_search (dir, pchar) - int dir; - int pchar; -{ - int saved_point, saved_mark, c; - char *p; -#if defined (HANDLE_MULTIBYTE) - char mb[MB_LEN_MAX]; -#endif - - rl_maybe_save_line (); - saved_point = rl_point; - saved_mark = rl_mark; - - /* Clear the undo list, since reading the search string should create its - own undo list, and the whole list will end up being freed when we - finish reading the search string. */ - rl_undo_list = 0; - - /* Use the line buffer to read the search string. */ - rl_line_buffer[0] = 0; - rl_end = rl_point = 0; - - p = _rl_make_prompt_for_search (pchar ? pchar : ':'); - rl_message (p, 0, 0); - free (p); - -#define SEARCH_RETURN rl_restore_prompt (); RL_UNSETSTATE(RL_STATE_NSEARCH); return - - RL_SETSTATE(RL_STATE_NSEARCH); - /* Read the search string. */ - while (1) - { - RL_SETSTATE(RL_STATE_MOREINPUT); - c = rl_read_key (); - RL_UNSETSTATE(RL_STATE_MOREINPUT); - -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - c = _rl_read_mbstring (c, mb, MB_LEN_MAX); -#endif - - if (c == 0) - break; - - switch (c) - { - case CTRL('H'): - case RUBOUT: - if (rl_point == 0) - { - rl_maybe_unsave_line (); - rl_clear_message (); - rl_point = saved_point; - rl_mark = saved_mark; - SEARCH_RETURN; - } - _rl_rubout_char (1, c); - break; - - case CTRL('W'): - rl_unix_word_rubout (1, c); - break; - - case CTRL('U'): - rl_unix_line_discard (1, c); - break; - - case RETURN: - case NEWLINE: - goto dosearch; - /* NOTREACHED */ - break; - - case CTRL('C'): - case CTRL('G'): - rl_maybe_unsave_line (); - rl_clear_message (); - rl_point = saved_point; - rl_mark = saved_mark; - rl_ding (); - SEARCH_RETURN; - - default: -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - rl_insert_text (mb); - else -#endif - _rl_insert_char (1, c); - break; - } - (*rl_redisplay_function) (); - } - - dosearch: - rl_mark = saved_mark; - - /* If rl_point == 0, we want to re-use the previous search string and - start from the saved history position. If there's no previous search - string, punt. */ - if (rl_point == 0) - { - if (!noninc_search_string) - { - rl_ding (); - SEARCH_RETURN; - } - } - else - { - /* We want to start the search from the current history position. */ - noninc_history_pos = where_history (); - FREE (noninc_search_string); - noninc_search_string = savestring (rl_line_buffer); - } - - rl_restore_prompt (); - noninc_dosearch (noninc_search_string, dir); - RL_UNSETSTATE(RL_STATE_NSEARCH); -} - -/* Search forward through the history list for a string. If the vi-mode - code calls this, KEY will be `?'. */ -int -rl_noninc_forward_search (count, key) - int count, key; -{ - noninc_search (1, (key == '?') ? '?' : 0); - return 0; -} - -/* Reverse search the history list for a string. If the vi-mode code - calls this, KEY will be `/'. */ -int -rl_noninc_reverse_search (count, key) - int count, key; -{ - noninc_search (-1, (key == '/') ? '/' : 0); - return 0; -} - -/* Search forward through the history list for the last string searched - for. If there is no saved search string, abort. */ -int -rl_noninc_forward_search_again (count, key) - int count, key; -{ - if (!noninc_search_string) - { - rl_ding (); - return (-1); - } - noninc_dosearch (noninc_search_string, 1); - return 0; -} - -/* Reverse search in the history list for the last string searched - for. If there is no saved search string, abort. */ -int -rl_noninc_reverse_search_again (count, key) - int count, key; -{ - if (!noninc_search_string) - { - rl_ding (); - return (-1); - } - noninc_dosearch (noninc_search_string, -1); - return 0; -} - -static int -rl_history_search_internal (count, dir) - int count, dir; -{ - HIST_ENTRY *temp; - int ret, oldpos; - - rl_maybe_save_line (); - temp = (HIST_ENTRY *)NULL; - - /* Search COUNT times through the history for a line whose prefix - matches history_search_string. When this loop finishes, TEMP, - if non-null, is the history line to copy into the line buffer. */ - while (count) - { - ret = noninc_search_from_pos (history_search_string, rl_history_search_pos + dir, dir); - if (ret == -1) - break; - - /* Get the history entry we found. */ - rl_history_search_pos = ret; - oldpos = where_history (); - history_set_pos (rl_history_search_pos); - temp = current_history (); - history_set_pos (oldpos); - - /* Don't find multiple instances of the same line. */ - if (prev_line_found && STREQ (prev_line_found, temp->line)) - continue; - prev_line_found = temp->line; - count--; - } - - /* If we didn't find anything at all, return. */ - if (temp == 0) - { - rl_maybe_unsave_line (); - rl_ding (); - /* If you don't want the saved history line (last match) to show up - in the line buffer after the search fails, change the #if 0 to - #if 1 */ -#if 0 - if (rl_point > rl_history_search_len) - { - rl_point = rl_end = rl_history_search_len; - rl_line_buffer[rl_end] = '\0'; - rl_mark = 0; - } -#else - rl_point = rl_history_search_len; /* rl_maybe_unsave_line changes it */ - rl_mark = rl_end; -#endif - return 1; - } - - /* Copy the line we found into the current line buffer. */ - make_history_line_current (temp); - - rl_point = rl_history_search_len; - rl_mark = rl_end; - - return 0; -} - -static void -rl_history_search_reinit () -{ - rl_history_search_pos = where_history (); - rl_history_search_len = rl_point; - prev_line_found = (char *)NULL; - if (rl_point) - { - if (rl_history_search_len >= history_string_size - 2) - { - history_string_size = rl_history_search_len + 2; - history_search_string = (char *)xrealloc (history_search_string, history_string_size); - } - history_search_string[0] = '^'; - strncpy (history_search_string + 1, rl_line_buffer, rl_point); - history_search_string[rl_point + 1] = '\0'; - } - _rl_free_saved_history_line (); -} - -/* Search forward in the history for the string of characters - from the start of the line to rl_point. This is a non-incremental - search. */ -int -rl_history_search_forward (count, ignore) - int count, ignore; -{ - if (count == 0) - return (0); - - if (rl_last_func != rl_history_search_forward && - rl_last_func != rl_history_search_backward) - rl_history_search_reinit (); - - if (rl_history_search_len == 0) - return (rl_get_next_history (count, ignore)); - return (rl_history_search_internal (abs (count), (count > 0) ? 1 : -1)); -} - -/* Search backward through the history for the string of characters - from the start of the line to rl_point. This is a non-incremental - search. */ -int -rl_history_search_backward (count, ignore) - int count, ignore; -{ - if (count == 0) - return (0); - - if (rl_last_func != rl_history_search_forward && - rl_last_func != rl_history_search_backward) - rl_history_search_reinit (); - - if (rl_history_search_len == 0) - return (rl_get_previous_history (count, ignore)); - return (rl_history_search_internal (abs (count), (count > 0) ? -1 : 1)); -} diff --git a/dep/src/readline/src/shell.c b/dep/src/readline/src/shell.c deleted file mode 100644 index 3f3eafbfee4..00000000000 --- a/dep/src/readline/src/shell.c +++ /dev/null @@ -1,237 +0,0 @@ -/* shell.c -- readline utility functions that are normally provided by - bash when readline is linked as part of the shell. */ - -/* Copyright (C) 1997 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ -#define READLINE_LIBRARY - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#include -#include - -#if defined (HAVE_UNISTD_H) -# include -#endif /* HAVE_UNISTD_H */ - -#if defined (HAVE_STDLIB_H) -# include -#else -# include "ansi_stdlib.h" -#endif /* HAVE_STDLIB_H */ - -#if defined (HAVE_STRING_H) -# include -#else -# include -#endif /* !HAVE_STRING_H */ - -#if defined (HAVE_LIMITS_H) -# include -#endif - -#include -#if !defined (_WIN32) -#include -#else /* _WIN32 */ -#include -#endif /* _WIN32 */ - -#include - -#include "rlstdc.h" -#include "rlshell.h" -#include "xmalloc.h" - -#if !defined (HAVE_GETPW_DECLS) -extern struct passwd *getpwuid PARAMS((uid_t)); -#endif /* !HAVE_GETPW_DECLS */ - -#ifndef NULL -# define NULL 0 -#endif - -#ifndef CHAR_BIT -# define CHAR_BIT 8 -#endif - -/* Nonzero if the integer type T is signed. */ -#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) - -/* Bound on length of the string representing an integer value of type T. - Subtract one for the sign bit if T is signed; - 302 / 1000 is log10 (2) rounded up; - add one for integer division truncation; - add one more for a minus sign if t is signed. */ -#define INT_STRLEN_BOUND(t) \ - ((sizeof (t) * CHAR_BIT - TYPE_SIGNED (t)) * 302 / 1000 \ - + 1 + TYPE_SIGNED (t)) - -/* All of these functions are resolved from bash if we are linking readline - as part of bash. */ - -/* Does shell-like quoting using single quotes. */ -char * -sh_single_quote (string) - char *string; -{ - register int c; - char *result, *r, *s; - - result = (char *)xmalloc (3 + (4 * strlen (string))); - r = result; - *r++ = '\''; - - for (s = string; s && (c = *s); s++) - { - *r++ = c; - - if (c == '\'') - { - *r++ = '\\'; /* insert escaped single quote */ - *r++ = '\''; - *r++ = '\''; /* start new quoted string */ - } - } - - *r++ = '\''; - *r = '\0'; - - return (result); -} - -/* Set the environment variables LINES and COLUMNS to lines and cols, - respectively. */ -void -sh_set_lines_and_columns (lines, cols) - int lines, cols; -{ - char *b; - -#if defined (HAVE_PUTENV) - b = (char *)xmalloc (INT_STRLEN_BOUND (int) + sizeof ("LINES=") + 1); - sprintf (b, "LINES=%d", lines); - putenv (b); - - b = (char *)xmalloc (INT_STRLEN_BOUND (int) + sizeof ("COLUMNS=") + 1); - sprintf (b, "COLUMNS=%d", cols); - putenv (b); -#else /* !HAVE_PUTENV */ -# if defined (HAVE_SETENV) - b = (char *)xmalloc (INT_STRLEN_BOUND (int) + 1); - sprintf (b, "%d", lines); - setenv ("LINES", b, 1); - free (b); - - b = (char *)xmalloc (INT_STRLEN_BOUND (int) + 1); - sprintf (b, "%d", cols); - setenv ("COLUMNS", b, 1); - free (b); -# endif /* HAVE_SETENV */ -#endif /* !HAVE_PUTENV */ -} - -char * -sh_get_env_value (varname) - const char *varname; -{ - return ((char *)getenv (varname)); -} - -char * -sh_get_home_dir () -{ - char *home_dir; -#if !defined (_WIN32) - struct passwd *entry; - - home_dir = (char *)NULL; - entry = getpwuid (getuid ()); - if (entry) - home_dir = entry->pw_dir; -#else - home_dir = sh_get_env_value ("HOME"); -#endif /* !_WIN32 */ - return (home_dir); -} - -#if !defined (O_NDELAY) -# if defined (FNDELAY) -# define O_NDELAY FNDELAY -# endif -#endif - -#if !defined (_WIN32) -int -sh_unset_nodelay_mode (fd) - int fd; -{ - int flags, bflags; - - if ((flags = fcntl (fd, F_GETFL, 0)) < 0) - return -1; - - bflags = 0; - -#ifdef O_NONBLOCK - bflags |= O_NONBLOCK; -#endif - -#ifdef O_NDELAY - bflags |= O_NDELAY; -#endif - - if (flags & bflags) - { - flags &= ~bflags; - return (fcntl (fd, F_SETFL, flags)); - } - - return 0; -} - -#else /* !_WIN32 */ - -char * -_rl_get_user_registry_string (char *keyName, char* valName) -{ - char *result = NULL; - HKEY subKey; - if ( keyName && (RegOpenKeyEx(HKEY_CURRENT_USER, keyName, 0, KEY_READ, &subKey) - == ERROR_SUCCESS) ) - { - DWORD type; - char *chtry = NULL; - DWORD bufSize = 0; - - if ( (RegQueryValueExA(subKey, valName, NULL, &type, chtry, &bufSize) - == ERROR_SUCCESS) && (type == REG_SZ) ) - { - if ( (chtry = (char *)xmalloc(bufSize)) - && (RegQueryValueExA(subKey, valName, NULL, &type, chtry, &bufSize) - == ERROR_SUCCESS) ) - result = chtry; - } - } - return result; -} -#endif /* !_WIN32 */ diff --git a/dep/src/readline/src/shlib/Makefile.in b/dep/src/readline/src/shlib/Makefile.in deleted file mode 100644 index e6db6194f77..00000000000 --- a/dep/src/readline/src/shlib/Makefile.in +++ /dev/null @@ -1,447 +0,0 @@ -## -*- text -*- ## -# Makefile for the GNU readline library shared library support. -# -# Copyright (C) 1998-2003 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. - -PACKAGE = @PACKAGE_NAME@ -VERSION = @PACKAGE_VERSION@ - -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_VERSION = @PACKAGE_VERSION@ - -RL_LIBRARY_VERSION = @LIBVERSION@ -RL_LIBRARY_NAME = readline - -srcdir = @srcdir@ -VPATH = .:@top_srcdir@ -topdir = @top_srcdir@ -BUILD_DIR = @BUILD_DIR@ - -INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ - -CC = @CC@ -RANLIB = @RANLIB@ -AR = @AR@ -ARFLAGS = @ARFLAGS@ -RM = rm -f -CP = cp -MV = mv -LN = ln - -SHELL = @MAKE_SHELL@ - -host_os = @host_os@ - -prefix = @prefix@ -exec_prefix = @exec_prefix@ -includedir = @includedir@ -libdir = @libdir@ -datadir = @datadir@ -localedir = $(datadir)/locale - -# Support an alternate destination root directory for package building -DESTDIR = - -CFLAGS = @CFLAGS@ -LOCAL_CFLAGS = @LOCAL_CFLAGS@ -DRL_LIBRARY_VERSION='"$(RL_LIBRARY_VERSION)"' -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ @LOCAL_LDFLAGS@ @CFLAGS@ - -DEFS = @DEFS@ -LOCAL_DEFS = @LOCAL_DEFS@ - -# -# These values are generated for configure by ${topdir}/support/shobj-conf. -# If your system is not supported by that script, but includes facilities for -# dynamic loading of shared objects, please update the script and send the -# changes to bash-maintainers@gnu.org. -# -SHOBJ_CC = @SHOBJ_CC@ -SHOBJ_CFLAGS = @SHOBJ_CFLAGS@ -SHOBJ_LD = @SHOBJ_LD@ - -SHOBJ_LDFLAGS = @SHOBJ_LDFLAGS@ -SHOBJ_XLDFLAGS = @SHOBJ_XLDFLAGS@ -SHOBJ_LIBS = @SHOBJ_LIBS@ - -SHLIB_XLDFLAGS = @LDFLAGS@ @SHLIB_XLDFLAGS@ -SHLIB_LIBS = @SHLIB_LIBS@ -SHLIB_LIBSUFF = @SHLIB_LIBSUFF@ - -SHLIB_LIBVERSION = @SHLIB_LIBVERSION@ - -SHLIB_STATUS = @SHLIB_STATUS@ - -# shared library versioning -SHLIB_MAJOR= @SHLIB_MAJOR@ -# shared library systems like SVR4's do not use minor versions -SHLIB_MINOR= .@SHLIB_MINOR@ - -# For libraries which include headers from other libraries. -INCLUDES = -I. -I.. -I$(topdir) - -CCFLAGS = $(DEFS) $(LOCAL_DEFS) $(CPPFLAGS) $(INCLUDES) $(LOCAL_CFLAGS) $(CFLAGS) - -.SUFFIXES: .so - -.c.so: - ${RM} $@ - $(SHOBJ_CC) -c $(CCFLAGS) $(SHOBJ_CFLAGS) -o $*.o $< - $(MV) $*.o $@ - -# The name of the main library target. - -SHARED_READLINE = libreadline.$(SHLIB_LIBVERSION) -SHARED_HISTORY = libhistory.$(SHLIB_LIBVERSION) -SHARED_LIBS = $(SHARED_READLINE) $(SHARED_HISTORY) - -# The C code source files for this library. -CSOURCES = $(topdir)/readline.c $(topdir)/funmap.c $(topdir)/keymaps.c \ - $(topdir)/vi_mode.c $(topdir)/parens.c $(topdir)/rltty.c \ - $(topdir)/complete.c $(topdir)/bind.c $(topdir)/isearch.c \ - $(topdir)/display.c $(topdir)/signals.c $(topdir)/emacs_keymap.c \ - $(topdir)/vi_keymap.c $(topdir)/util.c $(topdir)/kill.c \ - $(topdir)/undo.c $(topdir)/macro.c $(topdir)/input.c \ - $(topdir)/callback.c $(topdir)/terminal.c $(topdir)/xmalloc.c \ - $(topdir)/history.c $(topdir)/histsearch.c $(topdir)/histexpand.c \ - $(topdir)/histfile.c $(topdir)/nls.c $(topdir)/search.c \ - $(topdir)/shell.c $(topdir)/savestring.c $(topdir)/tilde.c \ - $(topdir)/text.c $(topdir)/misc.c $(topdir)/compat.c \ - $(topdir)/mbutil.c - -# The header files for this library. -HSOURCES = readline.h rldefs.h chardefs.h keymaps.h history.h histlib.h \ - posixstat.h posixdir.h posixjmp.h tilde.h rlconf.h rltty.h \ - ansi_stdlib.h tcap.h xmalloc.h rlprivate.h rlshell.h rlmbutil.h - -SHARED_HISTOBJ = history.so histexpand.so histfile.so histsearch.so shell.so \ - mbutil.so -SHARED_TILDEOBJ = tilde.so -SHARED_OBJ = readline.so vi_mode.so funmap.so keymaps.so parens.so search.so \ - rltty.so complete.so bind.so isearch.so display.so signals.so \ - util.so kill.so undo.so macro.so input.so callback.so terminal.so \ - text.so nls.so misc.so xmalloc.so $(SHARED_HISTOBJ) $(SHARED_TILDEOBJ) \ - compat.so - -########################################################################## - -all: $(SHLIB_STATUS) - -supported: $(SHARED_LIBS) - -unsupported: - @echo "Your system and compiler (${host_os}-${CC}) are not supported by the" - @echo "${topdir}/support/shobj-conf script." - @echo "If your operating system provides facilities for creating" - @echo "shared libraries, please update the script and re-run configure." - @echo "Please send the changes you made to bash-maintainers@gnu.org" - @echo "for inclusion in future bash and readline releases." - -$(SHARED_READLINE): $(SHARED_OBJ) - $(RM) $@ - $(SHOBJ_LD) ${SHOBJ_LDFLAGS} ${SHLIB_XLDFLAGS} -o $@ $(SHARED_OBJ) $(SHLIB_LIBS) - -$(SHARED_HISTORY): $(SHARED_HISTOBJ) xmalloc.so - $(RM) $@ - $(SHOBJ_LD) ${SHOBJ_LDFLAGS} ${SHLIB_XLDFLAGS} -o $@ $(SHARED_HISTOBJ) xmalloc.so $(SHLIB_LIBS) - -# Since tilde.c is shared between readline and bash, make sure we compile -# it with the right flags when it's built as part of readline -tilde.so: tilde.c - ${RM} $@ - $(SHOBJ_CC) -c $(CCFLAGS) $(SHOBJ_CFLAGS) -DREADLINE_LIBRARY -c -o tilde.o $(topdir)/tilde.c - $(MV) tilde.o $@ - -installdirs: $(topdir)/support/mkdirs - -$(SHELL) $(topdir)/support/mkdirs $(DESTDIR)$(libdir) - -install: installdirs $(SHLIB_STATUS) - $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -d $(DESTDIR)$(libdir) -i "$(INSTALL_DATA)" $(SHARED_HISTORY) - $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -d $(DESTDIR)$(libdir) -i "$(INSTALL_DATA)" $(SHARED_READLINE) - @echo install: you may need to run ldconfig - -uninstall: - $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -d $(DESTDIR)$(libdir) -U $(SHARED_HISTORY) - $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -d $(DESTDIR)$(libdir) -U $(SHARED_READLINE) - @echo uninstall: you may need to run ldconfig - -clean mostlyclean: force - $(RM) $(SHARED_OBJ) $(SHARED_LIBS) - -distclean maintainer-clean: clean - $(RM) Makefile - -force: - -# Tell versions [3.59,3.63) of GNU make not to export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: - -# Dependencies -bind.so: $(topdir)/ansi_stdlib.h $(topdir)/posixstat.h -bind.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h -bind.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h -bind.so: $(topdir)/rltypedefs.h -bind.so: $(topdir)/tilde.h $(topdir)/history.h -compat.so: $(topdir)/rlstdc.h -callback.so: $(topdir)/rlconf.h -callback.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h -callback.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h -callback.so: $(topdir)/rltypedefs.h -callback.so: $(topdir)/tilde.h -complete.so: $(topdir)/ansi_stdlib.h posixdir.h $(topdir)/posixstat.h -complete.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h -complete.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h -complete.so: $(topdir)/rltypedefs.h -complete.so: $(topdir)/tilde.h -display.so: $(topdir)/ansi_stdlib.h $(topdir)/posixstat.h -display.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h -display.so: $(topdir)/tcap.h -display.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h -display.so: $(topdir)/rltypedefs.h -display.so: $(topdir)/tilde.h $(topdir)/history.h -funmap.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h -funmap.so: $(topdir)/rltypedefs.h -funmap.so: $(topdir)/rlconf.h $(topdir)/ansi_stdlib.h -funmap.so: ${BUILD_DIR}/config.h $(topdir)/tilde.h -histexpand.so: $(topdir)/ansi_stdlib.h -histexpand.so: $(topdir)/history.h $(topdir)/histlib.h $(topdir)/rltypedefs.h -histexpand.so: ${BUILD_DIR}/config.h -histfile.so: $(topdir)/ansi_stdlib.h -histfile.so: $(topdir)/history.h $(topdir)/histlib.h $(topdir)/rltypedefs.h -histfile.so: ${BUILD_DIR}/config.h -history.so: $(topdir)/ansi_stdlib.h -history.so: $(topdir)/history.h $(topdir)/histlib.h $(topdir)/rltypedefs.h -history.so: ${BUILD_DIR}/config.h -histsearch.so: $(topdir)/ansi_stdlib.h -histsearch.so: $(topdir)/history.h $(topdir)/histlib.h $(topdir)/rltypedefs.h -histsearch.so: ${BUILD_DIR}/config.h -input.so: $(topdir)/ansi_stdlib.h -input.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h -input.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h -input.so: $(topdir)/rltypedefs.h -input.so: $(topdir)/tilde.h -isearch.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h -isearch.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h -isearch.so: $(topdir)/rltypedefs.h -isearch.so: $(topdir)/ansi_stdlib.h $(topdir)/history.h $(topdir)/tilde.h -keymaps.so: emacs_keymap.c vi_keymap.c -keymaps.so: $(topdir)/keymaps.h $(topdir)/chardefs.h $(topdir)/rlconf.h -keymaps.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h -keymaps.so: $(topdir)/rltypedefs.h -keymaps.so: ${BUILD_DIR}/config.h $(topdir)/ansi_stdlib.h $(topdir)/tilde.h -kill.so: $(topdir)/ansi_stdlib.h -kill.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h -kill.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h -kill.so: $(topdir)/tilde.h $(topdir)/history.h $(topdir)/rltypedefs.h -macro.so: $(topdir)/ansi_stdlib.h -macro.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h -macro.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h -macro.so: $(topdir)/tilde.h $(topdir)/history.h $(topdir)/rltypedefs.h -mbutil.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h -mbutil.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/rltypedefs.h -mbutil.so: $(topdir)/chardefs.h $(topdir)/rlstdc.h -misc.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h -misc.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h -misc.so: $(topdir)/rltypedefs.h -misc.so: $(topdir)/history.h $(topdir)/tilde.h $(topdir)/ansi_stdlib.h -nls.so: $(topdir)/ansi_stdlib.h -nls.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h -nls.o: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h -nls.o: $(topdir)/rltypedefs.h -nls.o: $(topdir)/tilde.h $(topdir)/history.h $(topdir)/rlstdc.h -parens.so: $(topdir)/rlconf.h ${BUILD_DIR}/config.h -parens.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h -parens.so: $(topdir)/rltypedefs.h -parens.so: $(topdir)/tilde.h -rltty.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h -rltty.so: $(topdir)/rltty.h $(topdir)/tilde.h -rltty.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h -rltty.so: $(topdir)/rltypedefs.h -search.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h -search.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h -search.so: $(topdir)/ansi_stdlib.h $(topdir)/history.h $(topdir)/tilde.h -search.so: $(topdir)/rltypedefs.h -signals.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h -signals.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h -signals.so: $(topdir)/history.h $(topdir)/tilde.h -signals.so: $(topdir)/rltypedefs.h -terminal.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h -terminal.so: $(topdir)/tcap.h -terminal.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h -terminal.so: $(topdir)/tilde.h $(topdir)/history.h -terminal.so: $(topdir)/rltypedefs.h -text.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h -text.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h -text.so: $(topdir)/rltypedefs.h -text.so: $(topdir)/history.h $(topdir)/tilde.h $(topdir)/ansi_stdlib.h -tilde.so: $(topdir)/ansi_stdlib.h ${BUILD_DIR}/config.h $(topdir)/tilde.h -undo.so: $(topdir)/ansi_stdlib.h -undo.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h -undo.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h -undo.so: $(topdir)/rltypedefs.h -undo.so: $(topdir)/tilde.h $(topdir)/history.h -util.so: $(topdir)/posixjmp.h $(topdir)/ansi_stdlib.h -util.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h -util.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h -util.so: $(topdir)/rltypedefs.h $(topdir)/tilde.h -vi_mode.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h -vi_mode.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h -vi_mode.so: $(topdir)/history.h $(topdir)/ansi_stdlib.h $(topdir)/tilde.h -vi_mode.so: $(topdir)/rltypedefs.h -xmalloc.so: ${BUILD_DIR}/config.h -xmalloc.so: $(topdir)/ansi_stdlib.h - -bind.so: $(topdir)/rlshell.h -histfile.so: $(topdir)/rlshell.h -nls.so: $(topdir)/rlshell.h -readline.so: $(topdir)/rlshell.h -shell.so: $(topdir)/rlshell.h -terminal.so: $(topdir)/rlshell.h -histexpand.so: $(topdir)/rlshell.h - -bind.so: $(topdir)/rlprivate.h -callback.so: $(topdir)/rlprivate.h -complete.so: $(topdir)/rlprivate.h -display.so: $(topdir)/rlprivate.h -input.so: $(topdir)/rlprivate.h -isearch.so: $(topdir)/rlprivate.h -kill.so: $(topdir)/rlprivate.h -macro.so: $(topdir)/rlprivate.h -mbutil.so: $(topdir)/rlprivate.h -misc.so: $(topdir)/rlprivate.h -nls.so: $(topdir)/rlprivate.h -parens.so: $(topdir)/rlprivate.h -readline.so: $(topdir)/rlprivate.h -rltty.so: $(topdir)/rlprivate.h -search.so: $(topdir)/rlprivate.h -signals.so: $(topdir)/rlprivate.h -terminal.so: $(topdir)/rlprivate.h -text.so: $(topdir)/rlprivate.h -undo.so: $(topdir)/rlprivate.h -util.so: $(topdir)/rlprivate.h -vi_mode.so: $(topdir)/rlprivate.h - -bind.so: $(topdir)/xmalloc.h -complete.so: $(topdir)/xmalloc.h -display.so: $(topdir)/xmalloc.h -funmap.so: $(topdir)/xmalloc.h -histexpand.so: $(topdir)/xmalloc.h -histfile.so: $(topdir)/xmalloc.h -history.so: $(topdir)/xmalloc.h -input.so: $(topdir)/xmalloc.h -isearch.so: $(topdir)/xmalloc.h -keymaps.so: $(topdir)/xmalloc.h -kill.so: $(topdir)/xmalloc.h -macro.so: $(topdir)/xmalloc.h -mbutil.so: $(topdir)/xmalloc.h -misc.so: $(topdir)/xmalloc.h -readline.so: $(topdir)/xmalloc.h -savestring.so: $(topdir)/xmalloc.h -search.so: $(topdir)/xmalloc.h -shell.so: $(topdir)/xmalloc.h -terminal.so: $(topdir)/xmalloc.h -text.so: $(topdir)/xmalloc.h -tilde.so: $(topdir)/xmalloc.h -undo.so: $(topdir)/xmalloc.h -util.so: $(topdir)/xmalloc.h -vi_mode.so: $(topdir)/xmalloc.h -xmalloc.so: $(topdir)/xmalloc.h - -complete.o: $(topdir)/rlmbutil.h -display.o: $(topdir)/rlmbutil.h -histexpand.o: $(topdir)/rlmbutil.h -input.o: $(topdir)/rlmbutil.h -isearch.o: $(topdir)/rlmbutil.h -mbutil.o: $(topdir)/rlmbutil.h -misc.o: $(topdir)/rlmbutil.h -readline.o: $(topdir)/rlmbutil.h -search.o: $(topdir)/rlmbutil.h -text.o: $(topdir)/rlmbutil.h -vi_mode.o: $(topdir)/rlmbutil.h - -bind.so: $(topdir)/bind.c -callback.so: $(topdir)/callback.c -compat.so: $(topdir)/compat.c -complete.so: $(topdir)/complete.c -display.so: $(topdir)/display.c -funmap.so: $(topdir)/funmap.c -input.so: $(topdir)/input.c -isearch.so: $(topdir)/isearch.c -keymaps.so: $(topdir)/keymaps.c $(topdir)/emacs_keymap.c $(topdir)/vi_keymap.c -kill.so: $(topdir)/kill.c -macro.so: $(topdir)/macro.c -mbutil.so: $(topdir)/mbutil.c -misc.so: $(topdir)/mbutil.c -nls.so: $(topdir)/nls.c -parens.so: $(topdir)/parens.c -readline.so: $(topdir)/readline.c -rltty.so: $(topdir)/rltty.c -savestring.so: $(topdir)/savestring.c -search.so: $(topdir)/search.c -shell.so: $(topdir)/shell.c -signals.so: $(topdir)/signals.c -terminal.so: $(topdir)/terminal.c -text.so: $(topdir)/text.c -tilde.so: $(topdir)/tilde.c -undo.so: $(topdir)/undo.c -util.so: $(topdir)/util.c -vi_mode.so: $(topdir)/vi_mode.c -xmalloc.so: $(topdir)/xmalloc.c - -histexpand.so: $(topdir)/histexpand.c -histfile.so: $(topdir)/histfile.c -history.so: $(topdir)/history.c -histsearch.so: $(topdir)/histsearch.c - -bind.so: bind.c -callback.so: callback.c -comapt.so: compat.c -complete.so: complete.c -display.so: display.c -funmap.so: funmap.c -input.so: input.c -isearch.so: isearch.c -keymaps.so: keymaps.c emacs_keymap.c vi_keymap.c -kill.so: kill.c -macro.so: macro.c -mbutil.so: mbutil.c -misc.so: misc.c -nls.so: nls.c -parens.so: parens.c -readline.so: readline.c -rltty.so: rltty.c -savestring.so: savestring.c -search.so: search.c -signals.so: signals.c -shell.so: shell.c -terminal.so: terminal.c -text.so: text.c -tilde.so: tilde.c -undo.so: undo.c -util.so: util.c -vi_mode.so: vi_mode.c -xmalloc.so: xmalloc.c - -histexpand.so: histexpand.c -histfile.so: histfile.c -history.so: history.c -histsearch.so: histsearch.c diff --git a/dep/src/readline/src/signals.c b/dep/src/readline/src/signals.c deleted file mode 100644 index 42baec8e7b9..00000000000 --- a/dep/src/readline/src/signals.c +++ /dev/null @@ -1,456 +0,0 @@ -/* signals.c -- signal handling support for readline. */ - -/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ -#define READLINE_LIBRARY - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#include /* Just for NULL. Yuck. */ -#include -#include - -#if defined (HAVE_UNISTD_H) -# include -#endif /* HAVE_UNISTD_H */ - -/* System-specific feature definitions and include files. */ -#include "rldefs.h" - -#if defined (GWINSZ_IN_SYS_IOCTL) -# include -#endif /* GWINSZ_IN_SYS_IOCTL */ - -#if defined (HANDLE_SIGNALS) -/* Some standard library routines. */ -#include "readline.h" -#include "history.h" - -#include "rlprivate.h" - -#if !defined (RETSIGTYPE) -# if defined (VOID_SIGHANDLER) -# define RETSIGTYPE void -# else -# define RETSIGTYPE int -# endif /* !VOID_SIGHANDLER */ -#endif /* !RETSIGTYPE */ - -#if defined (VOID_SIGHANDLER) -# define SIGHANDLER_RETURN return -#else -# define SIGHANDLER_RETURN return (0) -#endif - -/* This typedef is equivalent to the one for Function; it allows us - to say SigHandler *foo = signal (SIGKILL, SIG_IGN); */ -typedef RETSIGTYPE SigHandler (); - -#if defined (HAVE_POSIX_SIGNALS) -typedef struct sigaction sighandler_cxt; -# define rl_sigaction(s, nh, oh) sigaction(s, nh, oh) -#else -typedef struct { SigHandler *sa_handler; int sa_mask, sa_flags; } sighandler_cxt; -# define sigemptyset(m) -#endif /* !HAVE_POSIX_SIGNALS */ - -#ifndef SA_RESTART -# define SA_RESTART 0 -#endif - -#if !defined (_WIN32) -static SigHandler *rl_set_sighandler PARAMS((int, SigHandler *, sighandler_cxt *)); -static void rl_maybe_set_sighandler PARAMS((int, SigHandler *, sighandler_cxt *)); -#endif - -/* Exported variables for use by applications. */ - -/* If non-zero, readline will install its own signal handlers for - SIGINT, SIGTERM, SIGQUIT, SIGALRM, SIGTSTP, SIGTTIN, and SIGTTOU. */ -int rl_catch_signals = 1; - -/* If non-zero, readline will install a signal handler for SIGWINCH. */ -#ifdef SIGWINCH -int rl_catch_sigwinch = 1; -#else -int rl_catch_sigwinch = 0; /* for the readline state struct in readline.c */ -#endif - -static int signals_set_flag; -#ifdef SIGWINCH -static int sigwinch_set_flag; -#endif - -#if !defined (_WIN32) -/* **************************************************************** */ -/* */ -/* Signal Handling */ -/* */ -/* **************************************************************** */ - -static sighandler_cxt old_int, old_term, old_alrm, old_quit; -#if defined (SIGTSTP) -static sighandler_cxt old_tstp, old_ttou, old_ttin; -#endif -#if defined (SIGWINCH) -static sighandler_cxt old_winch; -#endif - -/* Readline signal handler functions. */ - -static RETSIGTYPE -rl_signal_handler (sig) - int sig; -{ -#if defined (HAVE_POSIX_SIGNALS) - sigset_t set; -#else /* !HAVE_POSIX_SIGNALS */ -# if defined (HAVE_BSD_SIGNALS) - long omask; -# else /* !HAVE_BSD_SIGNALS */ - sighandler_cxt dummy_cxt; /* needed for rl_set_sighandler call */ -# endif /* !HAVE_BSD_SIGNALS */ -#endif /* !HAVE_POSIX_SIGNALS */ - - RL_SETSTATE(RL_STATE_SIGHANDLER); - -#if !defined (HAVE_BSD_SIGNALS) && !defined (HAVE_POSIX_SIGNALS) - /* Since the signal will not be blocked while we are in the signal - handler, ignore it until rl_clear_signals resets the catcher. */ - if (sig == SIGINT || sig == SIGALRM) - rl_set_sighandler (sig, SIG_IGN, &dummy_cxt); -#endif /* !HAVE_BSD_SIGNALS && !HAVE_POSIX_SIGNALS */ - - switch (sig) - { - case SIGINT: - rl_free_line_state (); - /* FALLTHROUGH */ - -#if defined (SIGTSTP) - case SIGTSTP: - case SIGTTOU: - case SIGTTIN: -#endif /* SIGTSTP */ - case SIGALRM: - case SIGTERM: - case SIGQUIT: - rl_cleanup_after_signal (); - -#if defined (HAVE_POSIX_SIGNALS) - sigprocmask (SIG_BLOCK, (sigset_t *)NULL, &set); - sigdelset (&set, sig); -#else /* !HAVE_POSIX_SIGNALS */ -# if defined (HAVE_BSD_SIGNALS) - omask = sigblock (0); -# endif /* HAVE_BSD_SIGNALS */ -#endif /* !HAVE_POSIX_SIGNALS */ - -#if defined (__EMX__) - signal (sig, SIG_ACK); -#endif - - kill (getpid (), sig); - - /* Let the signal that we just sent through. */ -#if defined (HAVE_POSIX_SIGNALS) - sigprocmask (SIG_SETMASK, &set, (sigset_t *)NULL); -#else /* !HAVE_POSIX_SIGNALS */ -# if defined (HAVE_BSD_SIGNALS) - sigsetmask (omask & ~(sigmask (sig))); -# endif /* HAVE_BSD_SIGNALS */ -#endif /* !HAVE_POSIX_SIGNALS */ - - rl_reset_after_signal (); - } - - RL_UNSETSTATE(RL_STATE_SIGHANDLER); - SIGHANDLER_RETURN; -} - -#if defined (SIGWINCH) -static RETSIGTYPE -rl_sigwinch_handler (sig) - int sig; -{ - SigHandler *oh; - -#if defined (MUST_REINSTALL_SIGHANDLERS) - sighandler_cxt dummy_winch; - - /* We don't want to change old_winch -- it holds the state of SIGWINCH - disposition set by the calling application. We need this state - because we call the application's SIGWINCH handler after updating - our own idea of the screen size. */ - rl_set_sighandler (SIGWINCH, rl_sigwinch_handler, &dummy_winch); -#endif - - RL_SETSTATE(RL_STATE_SIGHANDLER); - rl_resize_terminal (); - - /* If another sigwinch handler has been installed, call it. */ - oh = (SigHandler *)old_winch.sa_handler; - if (oh && oh != (SigHandler *)SIG_IGN && oh != (SigHandler *)SIG_DFL) - (*oh) (sig); - - RL_UNSETSTATE(RL_STATE_SIGHANDLER); - SIGHANDLER_RETURN; -} -#endif /* SIGWINCH */ - -/* Functions to manage signal handling. */ - -#if !defined (HAVE_POSIX_SIGNALS) -static int -rl_sigaction (sig, nh, oh) - int sig; - sighandler_cxt *nh, *oh; -{ - oh->sa_handler = signal (sig, nh->sa_handler); - return 0; -} -#endif /* !HAVE_POSIX_SIGNALS */ - -/* Set up a readline-specific signal handler, saving the old signal - information in OHANDLER. Return the old signal handler, like - signal(). */ -static SigHandler * -rl_set_sighandler (sig, handler, ohandler) - int sig; - SigHandler *handler; - sighandler_cxt *ohandler; -{ - sighandler_cxt old_handler; -#if defined (HAVE_POSIX_SIGNALS) - struct sigaction act; - - act.sa_handler = handler; - act.sa_flags = (sig == SIGWINCH) ? SA_RESTART : 0; - sigemptyset (&act.sa_mask); - sigemptyset (&ohandler->sa_mask); - sigaction (sig, &act, &old_handler); -#else - old_handler.sa_handler = (SigHandler *)signal (sig, handler); -#endif /* !HAVE_POSIX_SIGNALS */ - - /* XXX -- assume we have memcpy */ - /* If rl_set_signals is called twice in a row, don't set the old handler to - rl_signal_handler, because that would cause infinite recursion. */ - if (handler != rl_signal_handler || old_handler.sa_handler != rl_signal_handler) - memcpy (ohandler, &old_handler, sizeof (sighandler_cxt)); - - return (ohandler->sa_handler); -} - -static void -rl_maybe_set_sighandler (sig, handler, ohandler) - int sig; - SigHandler *handler; - sighandler_cxt *ohandler; -{ - sighandler_cxt dummy; - SigHandler *oh; - - sigemptyset (&dummy.sa_mask); - oh = rl_set_sighandler (sig, handler, ohandler); - if (oh == (SigHandler *)SIG_IGN) - rl_sigaction (sig, ohandler, &dummy); -} - -int -rl_set_signals () -{ - sighandler_cxt dummy; - SigHandler *oh; - - if (rl_catch_signals && signals_set_flag == 0) - { - rl_maybe_set_sighandler (SIGINT, rl_signal_handler, &old_int); - rl_maybe_set_sighandler (SIGTERM, rl_signal_handler, &old_term); - rl_maybe_set_sighandler (SIGQUIT, rl_signal_handler, &old_quit); - - oh = rl_set_sighandler (SIGALRM, rl_signal_handler, &old_alrm); - if (oh == (SigHandler *)SIG_IGN) - rl_sigaction (SIGALRM, &old_alrm, &dummy); -#if defined (HAVE_POSIX_SIGNALS) && defined (SA_RESTART) - /* If the application using readline has already installed a signal - handler with SA_RESTART, SIGALRM will cause reads to be restarted - automatically, so readline should just get out of the way. Since - we tested for SIG_IGN above, we can just test for SIG_DFL here. */ - if (oh != (SigHandler *)SIG_DFL && (old_alrm.sa_flags & SA_RESTART)) - rl_sigaction (SIGALRM, &old_alrm, &dummy); -#endif /* HAVE_POSIX_SIGNALS */ - -#if defined (SIGTSTP) - rl_maybe_set_sighandler (SIGTSTP, rl_signal_handler, &old_tstp); -#endif /* SIGTSTP */ - -#if defined (SIGTTOU) - rl_maybe_set_sighandler (SIGTTOU, rl_signal_handler, &old_ttou); -#endif /* SIGTTOU */ - -#if defined (SIGTTIN) - rl_maybe_set_sighandler (SIGTTIN, rl_signal_handler, &old_ttin); -#endif /* SIGTTIN */ - - signals_set_flag = 1; - } - -#if defined (SIGWINCH) - if (rl_catch_sigwinch && sigwinch_set_flag == 0) - { - rl_maybe_set_sighandler (SIGWINCH, rl_sigwinch_handler, &old_winch); - sigwinch_set_flag = 1; - } -#endif /* SIGWINCH */ - - return 0; -} - -int -rl_clear_signals () -{ - sighandler_cxt dummy; - - if (rl_catch_signals && signals_set_flag == 1) - { - sigemptyset (&dummy.sa_mask); - - rl_sigaction (SIGINT, &old_int, &dummy); - rl_sigaction (SIGTERM, &old_term, &dummy); - rl_sigaction (SIGQUIT, &old_quit, &dummy); - rl_sigaction (SIGALRM, &old_alrm, &dummy); - -#if defined (SIGTSTP) - rl_sigaction (SIGTSTP, &old_tstp, &dummy); -#endif /* SIGTSTP */ - -#if defined (SIGTTOU) - rl_sigaction (SIGTTOU, &old_ttou, &dummy); -#endif /* SIGTTOU */ - -#if defined (SIGTTIN) - rl_sigaction (SIGTTIN, &old_ttin, &dummy); -#endif /* SIGTTIN */ - - signals_set_flag = 0; - } - -#if defined (SIGWINCH) - if (rl_catch_sigwinch && sigwinch_set_flag == 1) - { - sigemptyset (&dummy.sa_mask); - rl_sigaction (SIGWINCH, &old_winch, &dummy); - sigwinch_set_flag = 0; - } -#endif - - return 0; -} -#endif /* !_WIN32 */ - -/* Clean up the terminal and readline state after catching a signal, before - resending it to the calling application. */ -void -rl_cleanup_after_signal () -{ - _rl_clean_up_for_exit (); - (*rl_deprep_term_function) (); - rl_clear_signals (); - rl_clear_pending_input (); -} - -/* Reset the terminal and readline state after a signal handler returns. */ -void -rl_reset_after_signal () -{ - (*rl_prep_term_function) (_rl_meta_flag); - rl_set_signals (); -} - -/* Free up the readline variable line state for the current line (undo list, - any partial history entry, any keyboard macros in progress, and any - numeric arguments in process) after catching a signal, before calling - rl_cleanup_after_signal(). */ -void -rl_free_line_state () -{ - register HIST_ENTRY *entry; - - rl_free_undo_list (); - - entry = current_history (); - if (entry) - entry->data = (char *)NULL; - - _rl_kill_kbd_macro (); - rl_clear_message (); - _rl_init_argument (); -} - -#if defined (_WIN32) - -#include -#include -#include - -/* Handling of CTRL_C_EVENT, CTRL_CLOSE_EVENT, CTRL_BREAK_EVENT, - * CTRL_LOGOFF_EVENT, CTRL_SHUTDOWN_EVENT, - * WINDOW_BUFFER_SIZE_EVENTs are handled separately see input.c - */ - -BOOL CtrlEventHandler(DWORD dwEventType) -{ - if (dwEventType == CTRL_C_EVENT) - rl_free_line_state (); - rl_cleanup_after_signal (); - if (dwEventType == CTRL_C_EVENT) /* special treatment */ - { - if (rl_catch_signals == 1) /* > 1: handled only locally */ - { - raise(SIGINT); /* pass to program signal hadler */ - rl_reset_after_signal(); /* on return goon */ - } - return TRUE; /* don't pass to upstream handlers */ - } - return FALSE; /* pass other events to handler chain */ -} - -int -rl_set_signals () -{ - if (rl_catch_signals && signals_set_flag == 0) - signals_set_flag = SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlEventHandler, TRUE); - return signals_set_flag; -} - -int -rl_clear_signals () -{ - if ( signals_set_flag ) - if ( SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlEventHandler, FALSE) ) - signals_set_flag = 0; - return signals_set_flag; -} - -#endif /* _WIN32 */ -#endif /* HANDLE_SIGNALS */ diff --git a/dep/src/readline/src/support/config.guess b/dep/src/readline/src/support/config.guess deleted file mode 100644 index 9a8a49956f6..00000000000 --- a/dep/src/readline/src/support/config.guess +++ /dev/null @@ -1,1403 +0,0 @@ -#! /bin/sh -# Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002 Free Software Foundation, Inc. - -timestamp='2002-11-30' - -# This file is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# Originally written by Per Bothner . -# Please send patches to . Submit a context -# diff and a properly formatted ChangeLog entry. -# -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. -# -# The plan is that this can be called by configure scripts if you -# don't specify an explicit build system type. - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] - -Output the configuration name of the system \`$me' is run on. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.guess ($timestamp) - -Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit 0 ;; - --version | -v ) - echo "$version" ; exit 0 ;; - --help | --h* | -h ) - echo "$usage"; exit 0 ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" >&2 - exit 1 ;; - * ) - break ;; - esac -done - -if test $# != 0; then - echo "$me: too many arguments$help" >&2 - exit 1 -fi - -trap 'exit 1' 1 2 15 - -# CC_FOR_BUILD -- compiler used by this script. Note that the use of a -# compiler to aid in system detection is discouraged as it requires -# temporary files to be created and, as you can see below, it is a -# headache to deal with in a portable fashion. - -# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still -# use `HOST_CC' if defined, but it is deprecated. - -# This shell variable is my proudest work .. or something. --bje - -set_cc_for_build='tmpdir=${TMPDIR-/tmp}/config-guess-$$ ; -(old=`umask` && umask 077 && mkdir $tmpdir && umask $old && unset old) - || (echo "$me: cannot create $tmpdir" >&2 && exit 1) ; -dummy=$tmpdir/dummy ; -files="$dummy.c $dummy.o $dummy.rel $dummy" ; -trap '"'"'rm -f $files; rmdir $tmpdir; exit 1'"'"' 1 2 15 ; -case $CC_FOR_BUILD,$HOST_CC,$CC in - ,,) echo "int x;" > $dummy.c ; - for c in cc gcc c89 c99 ; do - if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then - CC_FOR_BUILD="$c"; break ; - fi ; - done ; - rm -f $files ; - if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found ; - fi - ;; - ,,*) CC_FOR_BUILD=$CC ;; - ,*,*) CC_FOR_BUILD=$HOST_CC ;; -esac ; -unset files' - -# This is needed to find uname on a Pyramid OSx when run in the BSD universe. -# (ghazi@noc.rutgers.edu 1994-08-24) -if (test -f /.attbin/uname) >/dev/null 2>&1 ; then - PATH=$PATH:/.attbin ; export PATH -fi - -UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown -UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown -UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown - -# Note: order is significant - the case branches are not exclusive. - -case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in - *:NetBSD:*:*) - # NetBSD (nbsd) targets should (where applicable) match one or - # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, - # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently - # switched to ELF, *-*-netbsd* would select the old - # object file format. This provides both forward - # compatibility and a consistent mechanism for selecting the - # object file format. - # - # Note: NetBSD doesn't particularly care about the vendor - # portion of the name. We always set it to "unknown". - sysctl="sysctl -n hw.machine_arch" - UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ - /usr/sbin/$sysctl 2>/dev/null || echo unknown)` - case "${UNAME_MACHINE_ARCH}" in - armeb) machine=armeb-unknown ;; - arm*) machine=arm-unknown ;; - sh3el) machine=shl-unknown ;; - sh3eb) machine=sh-unknown ;; - *) machine=${UNAME_MACHINE_ARCH}-unknown ;; - esac - # The Operating System including object format, if it has switched - # to ELF recently, or will in the future. - case "${UNAME_MACHINE_ARCH}" in - arm*|i386|m68k|ns32k|sh3*|sparc|vax) - eval $set_cc_for_build - if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep __ELF__ >/dev/null - then - # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). - # Return netbsd for either. FIX? - os=netbsd - else - os=netbsdelf - fi - ;; - *) - os=netbsd - ;; - esac - # The OS release - # Debian GNU/NetBSD machines have a different userland, and - # thus, need a distinct triplet. However, they do not need - # kernel version information, so it can be replaced with a - # suitable tag, in the style of linux-gnu. - case "${UNAME_VERSION}" in - Debian*) - release='-gnu' - ;; - *) - release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` - ;; - esac - # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: - # contains redundant information, the shorter form: - # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "${machine}-${os}${release}" - exit 0 ;; - amiga:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - arc:OpenBSD:*:*) - echo mipsel-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - hp300:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - mac68k:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - macppc:OpenBSD:*:*) - echo powerpc-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - mvme68k:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - mvme88k:OpenBSD:*:*) - echo m88k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - mvmeppc:OpenBSD:*:*) - echo powerpc-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - pmax:OpenBSD:*:*) - echo mipsel-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - sgi:OpenBSD:*:*) - echo mipseb-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - sun3:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - wgrisc:OpenBSD:*:*) - echo mipsel-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - *:OpenBSD:*:*) - echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - alpha:OSF1:*:*) - if test $UNAME_RELEASE = "V4.0"; then - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` - fi - # A Vn.n version is a released version. - # A Tn.n version is a released field test version. - # A Xn.n version is an unreleased experimental baselevel. - # 1.2 uses "1.2" for uname -r. - eval $set_cc_for_build - cat <$dummy.s - .data -\$Lformat: - .byte 37,100,45,37,120,10,0 # "%d-%x\n" - - .text - .globl main - .align 4 - .ent main -main: - .frame \$30,16,\$26,0 - ldgp \$29,0(\$27) - .prologue 1 - .long 0x47e03d80 # implver \$0 - lda \$2,-1 - .long 0x47e20c21 # amask \$2,\$1 - lda \$16,\$Lformat - mov \$0,\$17 - not \$1,\$18 - jsr \$26,printf - ldgp \$29,0(\$26) - mov 0,\$16 - jsr \$26,exit - .end main -EOF - $CC_FOR_BUILD -o $dummy $dummy.s 2>/dev/null - if test "$?" = 0 ; then - case `$dummy` in - 0-0) - UNAME_MACHINE="alpha" - ;; - 1-0) - UNAME_MACHINE="alphaev5" - ;; - 1-1) - UNAME_MACHINE="alphaev56" - ;; - 1-101) - UNAME_MACHINE="alphapca56" - ;; - 2-303) - UNAME_MACHINE="alphaev6" - ;; - 2-307) - UNAME_MACHINE="alphaev67" - ;; - 2-1307) - UNAME_MACHINE="alphaev68" - ;; - 3-1307) - UNAME_MACHINE="alphaev7" - ;; - esac - fi - rm -f $dummy.s $dummy && rmdir $tmpdir - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - exit 0 ;; - Alpha\ *:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # Should we change UNAME_MACHINE based on the output of uname instead - # of the specific Alpha model? - echo alpha-pc-interix - exit 0 ;; - 21064:Windows_NT:50:3) - echo alpha-dec-winnt3.5 - exit 0 ;; - Amiga*:UNIX_System_V:4.0:*) - echo m68k-unknown-sysv4 - exit 0;; - *:[Aa]miga[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-amigaos - exit 0 ;; - *:[Mm]orph[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-morphos - exit 0 ;; - *:OS/390:*:*) - echo i370-ibm-openedition - exit 0 ;; - arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix${UNAME_RELEASE} - exit 0;; - SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) - echo hppa1.1-hitachi-hiuxmpp - exit 0;; - Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) - # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - if test "`(/bin/universe) 2>/dev/null`" = att ; then - echo pyramid-pyramid-sysv3 - else - echo pyramid-pyramid-bsd - fi - exit 0 ;; - NILE*:*:*:dcosx) - echo pyramid-pyramid-svr4 - exit 0 ;; - DRS?6000:UNIX_SV:4.2*:7*) - case `/usr/bin/uname -p` in - sparc) echo sparc-icl-nx7 && exit 0 ;; - esac ;; - sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; - sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; - i86pc:SunOS:5.*:*) - echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; - sun4*:SunOS:6*:*) - # According to config.sub, this is the proper way to canonicalize - # SunOS6. Hard to guess exactly what SunOS6 will be like, but - # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; - sun4*:SunOS:*:*) - case "`/usr/bin/arch -k`" in - Series*|S4*) - UNAME_RELEASE=`uname -v` - ;; - esac - # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` - exit 0 ;; - sun3*:SunOS:*:*) - echo m68k-sun-sunos${UNAME_RELEASE} - exit 0 ;; - sun*:*:4.2BSD:*) - UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 - case "`/bin/arch`" in - sun3) - echo m68k-sun-sunos${UNAME_RELEASE} - ;; - sun4) - echo sparc-sun-sunos${UNAME_RELEASE} - ;; - esac - exit 0 ;; - aushp:SunOS:*:*) - echo sparc-auspex-sunos${UNAME_RELEASE} - exit 0 ;; - # The situation for MiNT is a little confusing. The machine name - # can be virtually everything (everything which is not - # "atarist" or "atariste" at least should have a processor - # > m68000). The system name ranges from "MiNT" over "FreeMiNT" - # to the lowercase version "mint" (or "freemint"). Finally - # the system name "TOS" denotes a system which is actually not - # MiNT. But MiNT is downward compatible to TOS, so this should - # be no problem. - atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit 0 ;; - atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit 0 ;; - *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit 0 ;; - milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint${UNAME_RELEASE} - exit 0 ;; - hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint${UNAME_RELEASE} - exit 0 ;; - *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint${UNAME_RELEASE} - exit 0 ;; - powerpc:machten:*:*) - echo powerpc-apple-machten${UNAME_RELEASE} - exit 0 ;; - RISC*:Mach:*:*) - echo mips-dec-mach_bsd4.3 - exit 0 ;; - RISC*:ULTRIX:*:*) - echo mips-dec-ultrix${UNAME_RELEASE} - exit 0 ;; - VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix${UNAME_RELEASE} - exit 0 ;; - 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix${UNAME_RELEASE} - exit 0 ;; - mips:*:*:UMIPS | mips:*:*:RISCos) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c -#ifdef __cplusplus -#include /* for printf() prototype */ - int main (int argc, char *argv[]) { -#else - int main (argc, argv) int argc; char *argv[]; { -#endif - #if defined (host_mips) && defined (MIPSEB) - #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); - #endif - #endif - exit (-1); - } -EOF - $CC_FOR_BUILD -o $dummy $dummy.c \ - && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ - && rm -f $dummy.c $dummy && rmdir $tmpdir && exit 0 - rm -f $dummy.c $dummy && rmdir $tmpdir - echo mips-mips-riscos${UNAME_RELEASE} - exit 0 ;; - Motorola:PowerMAX_OS:*:*) - echo powerpc-motorola-powermax - exit 0 ;; - Motorola:*:4.3:PL8-*) - echo powerpc-harris-powermax - exit 0 ;; - Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) - echo powerpc-harris-powermax - exit 0 ;; - Night_Hawk:Power_UNIX:*:*) - echo powerpc-harris-powerunix - exit 0 ;; - m88k:CX/UX:7*:*) - echo m88k-harris-cxux7 - exit 0 ;; - m88k:*:4*:R4*) - echo m88k-motorola-sysv4 - exit 0 ;; - m88k:*:3*:R3*) - echo m88k-motorola-sysv3 - exit 0 ;; - AViiON:dgux:*:*) - # DG/UX returns AViiON for all architectures - UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] - then - if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ - [ ${TARGET_BINARY_INTERFACE}x = x ] - then - echo m88k-dg-dgux${UNAME_RELEASE} - else - echo m88k-dg-dguxbcs${UNAME_RELEASE} - fi - else - echo i586-dg-dgux${UNAME_RELEASE} - fi - exit 0 ;; - M88*:DolphinOS:*:*) # DolphinOS (SVR3) - echo m88k-dolphin-sysv3 - exit 0 ;; - M88*:*:R3*:*) - # Delta 88k system running SVR3 - echo m88k-motorola-sysv3 - exit 0 ;; - XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - echo m88k-tektronix-sysv3 - exit 0 ;; - Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - echo m68k-tektronix-bsd - exit 0 ;; - *:IRIX*:*:*) - echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` - exit 0 ;; - ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' - i*86:AIX:*:*) - echo i386-ibm-aix - exit 0 ;; - ia64:AIX:*:*) - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} - exit 0 ;; - *:AIX:2:3) - if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - - main() - { - if (!__power_pc()) - exit(1); - puts("powerpc-ibm-aix3.2.5"); - exit(0); - } -EOF - $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && rm -f $dummy.c $dummy && rmdir $tmpdir && exit 0 - rm -f $dummy.c $dummy && rmdir $tmpdir - echo rs6000-ibm-aix3.2.5 - elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - echo rs6000-ibm-aix3.2.4 - else - echo rs6000-ibm-aix3.2 - fi - exit 0 ;; - *:AIX:*:[45]) - IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` - if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then - IBM_ARCH=rs6000 - else - IBM_ARCH=powerpc - fi - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${IBM_ARCH}-ibm-aix${IBM_REV} - exit 0 ;; - *:AIX:*:*) - echo rs6000-ibm-aix - exit 0 ;; - ibmrt:4.4BSD:*|romp-ibm:BSD:*) - echo romp-ibm-bsd4.4 - exit 0 ;; - ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to - exit 0 ;; # report: romp-ibm BSD 4.3 - *:BOSX:*:*) - echo rs6000-bull-bosx - exit 0 ;; - DPX/2?00:B.O.S.:*:*) - echo m68k-bull-sysv3 - exit 0 ;; - 9000/[34]??:4.3bsd:1.*:*) - echo m68k-hp-bsd - exit 0 ;; - hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - echo m68k-hp-bsd4.4 - exit 0 ;; - 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - case "${UNAME_MACHINE}" in - 9000/31? ) HP_ARCH=m68000 ;; - 9000/[34]?? ) HP_ARCH=m68k ;; - 9000/[678][0-9][0-9]) - if [ -x /usr/bin/getconf ]; then - sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` - sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 - 532) # CPU_PA_RISC2_0 - case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; - '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 - esac ;; - esac - fi - if [ "${HP_ARCH}" = "" ]; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - - #define _HPUX_SOURCE - #include - #include - - int main () - { - #if defined(_SC_KERNEL_BITS) - long bits = sysconf(_SC_KERNEL_BITS); - #endif - long cpu = sysconf (_SC_CPU_VERSION); - - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1"); break; - case CPU_PA_RISC2_0: - #if defined(_SC_KERNEL_BITS) - switch (bits) - { - case 64: puts ("hppa2.0w"); break; - case 32: puts ("hppa2.0n"); break; - default: puts ("hppa2.0"); break; - } break; - #else /* !defined(_SC_KERNEL_BITS) */ - puts ("hppa2.0"); break; - #endif - default: puts ("hppa1.0"); break; - } - exit (0); - } -EOF - (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` - if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi - rm -f $dummy.c $dummy && rmdir $tmpdir - fi ;; - esac - echo ${HP_ARCH}-hp-hpux${HPUX_REV} - exit 0 ;; - ia64:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux${HPUX_REV} - exit 0 ;; - 3050*:HI-UX:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - int - main () - { - long cpu = sysconf (_SC_CPU_VERSION); - /* The order matters, because CPU_IS_HP_MC68K erroneously returns - true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct - results, however. */ - if (CPU_IS_PA_RISC (cpu)) - { - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; - case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; - default: puts ("hppa-hitachi-hiuxwe2"); break; - } - } - else if (CPU_IS_HP_MC68K (cpu)) - puts ("m68k-hitachi-hiuxwe2"); - else puts ("unknown-hitachi-hiuxwe2"); - exit (0); - } -EOF - $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && rm -f $dummy.c $dummy && rmdir $tmpdir && exit 0 - rm -f $dummy.c $dummy && rmdir $tmpdir - echo unknown-hitachi-hiuxwe2 - exit 0 ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) - echo hppa1.1-hp-bsd - exit 0 ;; - 9000/8??:4.3bsd:*:*) - echo hppa1.0-hp-bsd - exit 0 ;; - *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) - echo hppa1.0-hp-mpeix - exit 0 ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) - echo hppa1.1-hp-osf - exit 0 ;; - hp8??:OSF1:*:*) - echo hppa1.0-hp-osf - exit 0 ;; - i*86:OSF1:*:*) - if [ -x /usr/sbin/sysversion ] ; then - echo ${UNAME_MACHINE}-unknown-osf1mk - else - echo ${UNAME_MACHINE}-unknown-osf1 - fi - exit 0 ;; - parisc*:Lites*:*:*) - echo hppa1.1-hp-lites - exit 0 ;; - C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - echo c1-convex-bsd - exit 0 ;; - C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit 0 ;; - C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - echo c34-convex-bsd - exit 0 ;; - C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - echo c38-convex-bsd - exit 0 ;; - C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - echo c4-convex-bsd - exit 0 ;; - CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit 0 ;; - CRAY*[A-Z]90:*:*:*) - echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ - | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ - -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ - -e 's/\.[^.]*$/.X/' - exit 0 ;; - CRAY*TS:*:*:*) - echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit 0 ;; - CRAY*T3D:*:*:*) - echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit 0 ;; - CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit 0 ;; - CRAY*SV1:*:*:*) - echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit 0 ;; - F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` - echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit 0 ;; - i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} - exit 0 ;; - sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi${UNAME_RELEASE} - exit 0 ;; - *:BSD/OS:*:*) - echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} - exit 0 ;; - amd64:FreeBSD:*:*) - echo x86_64-unknown-freebsd - exit 0 ;; - *:FreeBSD:*:*) - # Determine whether the default compiler uses glibc. - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - #if __GLIBC__ >= 2 - LIBC=gnu - #else - LIBC= - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` - rm -f $dummy.c && rmdir $tmpdir - echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC} - exit 0 ;; - i*:CYGWIN*:*) - echo ${UNAME_MACHINE}-pc-cygwin - exit 0 ;; - i*:MINGW*:*) - echo ${UNAME_MACHINE}-pc-mingw32 - exit 0 ;; - i*:PW*:*) - echo ${UNAME_MACHINE}-pc-pw32 - exit 0 ;; - x86:Interix*:3*) - echo i586-pc-interix3 - exit 0 ;; - [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) - echo i${UNAME_MACHINE}-pc-mks - exit 0 ;; - i*:Windows_NT*:* | Pentium*:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we - # UNAME_MACHINE based on the output of uname instead of i386? - echo i586-pc-interix - exit 0 ;; - i*:UWIN*:*) - echo ${UNAME_MACHINE}-pc-uwin - exit 0 ;; - p*:CYGWIN*:*) - echo powerpcle-unknown-cygwin - exit 0 ;; - prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; - *:GNU:*:*) - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` - exit 0 ;; - i*86:Minix:*:*) - echo ${UNAME_MACHINE}-pc-minix - exit 0 ;; - arm*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit 0 ;; - ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit 0 ;; - m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit 0 ;; - mips:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #undef CPU - #undef mips - #undef mipsel - #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=mipsel - #else - #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=mips - #else - CPU= - #endif - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` - rm -f $dummy.c && rmdir $tmpdir - test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 - ;; - mips64:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #undef CPU - #undef mips64 - #undef mips64el - #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=mips64el - #else - #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=mips64 - #else - CPU= - #endif - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` - rm -f $dummy.c && rmdir $tmpdir - test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 - ;; - ppc:Linux:*:*) - echo powerpc-unknown-linux-gnu - exit 0 ;; - ppc64:Linux:*:*) - echo powerpc64-unknown-linux-gnu - exit 0 ;; - alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in - EV5) UNAME_MACHINE=alphaev5 ;; - EV56) UNAME_MACHINE=alphaev56 ;; - PCA56) UNAME_MACHINE=alphapca56 ;; - PCA57) UNAME_MACHINE=alphapca56 ;; - EV6) UNAME_MACHINE=alphaev6 ;; - EV67) UNAME_MACHINE=alphaev67 ;; - EV68*) UNAME_MACHINE=alphaev68 ;; - esac - objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null - if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} - exit 0 ;; - parisc:Linux:*:* | hppa:Linux:*:*) - # Look for CPU level - case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-gnu ;; - PA8*) echo hppa2.0-unknown-linux-gnu ;; - *) echo hppa-unknown-linux-gnu ;; - esac - exit 0 ;; - parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-gnu - exit 0 ;; - s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux - exit 0 ;; - sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit 0 ;; - sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit 0 ;; - x86_64:Linux:*:*) - echo x86_64-unknown-linux-gnu - exit 0 ;; - i*86:Linux:*:*) - # The BFD linker knows what the default object file format is, so - # first see if it will tell us. cd to the root directory to prevent - # problems with other programs or directories called `ld' in the path. - # Set LC_ALL=C to ensure ld outputs messages in English. - ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ - | sed -ne '/supported targets:/!d - s/[ ][ ]*/ /g - s/.*supported targets: *// - s/ .*// - p'` - case "$ld_supported_targets" in - elf32-i386) - TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" - ;; - a.out-i386-linux) - echo "${UNAME_MACHINE}-pc-linux-gnuaout" - exit 0 ;; - coff-i386) - echo "${UNAME_MACHINE}-pc-linux-gnucoff" - exit 0 ;; - "") - # Either a pre-BFD a.out linker (linux-gnuoldld) or - # one that does not give us useful --help. - echo "${UNAME_MACHINE}-pc-linux-gnuoldld" - exit 0 ;; - esac - # Determine whether the default compiler is a.out or elf - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - #ifdef __ELF__ - # ifdef __GLIBC__ - # if __GLIBC__ >= 2 - LIBC=gnu - # else - LIBC=gnulibc1 - # endif - # else - LIBC=gnulibc1 - # endif - #else - #ifdef __INTEL_COMPILER - LIBC=gnu - #else - LIBC=gnuaout - #endif - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` - rm -f $dummy.c && rmdir $tmpdir - test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 - test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 - ;; - i*86:DYNIX/ptx:4*:*) - # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. - # earlier versions are messed up and put the nodename in both - # sysname and nodename. - echo i386-sequent-sysv4 - exit 0 ;; - i*86:UNIX_SV:4.2MP:2.*) - # Unixware is an offshoot of SVR4, but it has its own version - # number series starting with 2... - # I am not positive that other SVR4 systems won't match this, - # I just have to hope. -- rms. - # Use sysv4.2uw... so that sysv4* matches it. - echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} - exit 0 ;; - i*86:OS/2:*:*) - # If we were able to find `uname', then EMX Unix compatibility - # is probably installed. - echo ${UNAME_MACHINE}-pc-os2-emx - exit 0 ;; - i*86:XTS-300:*:STOP) - echo ${UNAME_MACHINE}-unknown-stop - exit 0 ;; - i*86:atheos:*:*) - echo ${UNAME_MACHINE}-unknown-atheos - exit 0 ;; - i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) - echo i386-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; - i*86:*DOS:*:*) - echo ${UNAME_MACHINE}-pc-msdosdjgpp - exit 0 ;; - i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) - UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` - if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} - else - echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} - fi - exit 0 ;; - i*86:*:5:[78]*) - case `/bin/uname -X | grep "^Machine"` in - *486*) UNAME_MACHINE=i486 ;; - *Pentium) UNAME_MACHINE=i586 ;; - *Pent*|*Celeron) UNAME_MACHINE=i686 ;; - esac - echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} - exit 0 ;; - i*86:*:3.2:*) - if test -f /usr/options/cb.name; then - UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then - UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` - (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 - (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ - && UNAME_MACHINE=i586 - (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ - && UNAME_MACHINE=i686 - (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ - && UNAME_MACHINE=i686 - echo ${UNAME_MACHINE}-pc-sco$UNAME_REL - else - echo ${UNAME_MACHINE}-pc-sysv32 - fi - exit 0 ;; - pc:*:*:*) - # Left here for compatibility: - # uname -m prints for DJGPP always 'pc', but it prints nothing about - # the processor, so we play safe by assuming i386. - echo i386-pc-msdosdjgpp - exit 0 ;; - Intel:Mach:3*:*) - echo i386-pc-mach3 - exit 0 ;; - paragon:*:*:*) - echo i860-intel-osf1 - exit 0 ;; - i860:*:4.*:*) # i860-SVR4 - if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 - else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 - fi - exit 0 ;; - mini*:CTIX:SYS*5:*) - # "miniframe" - echo m68010-convergent-sysv - exit 0 ;; - mc68k:UNIX:SYSTEM5:3.51m) - echo m68k-convergent-sysv - exit 0 ;; - M680?0:D-NIX:5.3:*) - echo m68k-diab-dnix - exit 0 ;; - M68*:*:R3V[567]*:*) - test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; - 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0) - OS_REL='' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && echo i486-ncr-sysv4.3${OS_REL} && exit 0 - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; - 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && echo i486-ncr-sysv4 && exit 0 ;; - m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; - mc68030:UNIX_System_V:4.*:*) - echo m68k-atari-sysv4 - exit 0 ;; - TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; - rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; - PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) - echo powerpc-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; - SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv${UNAME_RELEASE} - exit 0 ;; - RM*:ReliantUNIX-*:*:*) - echo mips-sni-sysv4 - exit 0 ;; - RM*:SINIX-*:*:*) - echo mips-sni-sysv4 - exit 0 ;; - *:SINIX-*:*:*) - if uname -p 2>/dev/null >/dev/null ; then - UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo ${UNAME_MACHINE}-sni-sysv4 - else - echo ns32k-sni-sysv - fi - exit 0 ;; - PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort - # says - echo i586-unisys-sysv4 - exit 0 ;; - *:UNIX_System_V:4*:FTX*) - # From Gerald Hewes . - # How about differentiating between stratus architectures? -djm - echo hppa1.1-stratus-sysv4 - exit 0 ;; - *:*:*:FTX*) - # From seanf@swdc.stratus.com. - echo i860-stratus-sysv4 - exit 0 ;; - *:VOS:*:*) - # From Paul.Green@stratus.com. - echo hppa1.1-stratus-vos - exit 0 ;; - mc68*:A/UX:*:*) - echo m68k-apple-aux${UNAME_RELEASE} - exit 0 ;; - news*:NEWS-OS:6*:*) - echo mips-sony-newsos6 - exit 0 ;; - R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if [ -d /usr/nec ]; then - echo mips-nec-sysv${UNAME_RELEASE} - else - echo mips-unknown-sysv${UNAME_RELEASE} - fi - exit 0 ;; - BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - echo powerpc-be-beos - exit 0 ;; - BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - echo powerpc-apple-beos - exit 0 ;; - BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - echo i586-pc-beos - exit 0 ;; - SX-4:SUPER-UX:*:*) - echo sx4-nec-superux${UNAME_RELEASE} - exit 0 ;; - SX-5:SUPER-UX:*:*) - echo sx5-nec-superux${UNAME_RELEASE} - exit 0 ;; - SX-6:SUPER-UX:*:*) - echo sx6-nec-superux${UNAME_RELEASE} - exit 0 ;; - Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody${UNAME_RELEASE} - exit 0 ;; - *:Rhapsody:*:*) - echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} - exit 0 ;; - *:Darwin:*:*) - echo `uname -p`-apple-darwin${UNAME_RELEASE} - exit 0 ;; - *:procnto*:*:* | *:QNX:[0123456789]*:*) - UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = "x86"; then - UNAME_PROCESSOR=i386 - UNAME_MACHINE=pc - fi - echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} - exit 0 ;; - *:QNX:*:4*) - echo i386-pc-qnx - exit 0 ;; - NSR-[DGKLNPTVW]:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk${UNAME_RELEASE} - exit 0 ;; - *:NonStop-UX:*:*) - echo mips-compaq-nonstopux - exit 0 ;; - BS2000:POSIX*:*:*) - echo bs2000-siemens-sysv - exit 0 ;; - DS/*:UNIX_System_V:*:*) - echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} - exit 0 ;; - *:Plan9:*:*) - # "uname -m" is not consistent, so use $cputype instead. 386 - # is converted to i386 for consistency with other x86 - # operating systems. - if test "$cputype" = "386"; then - UNAME_MACHINE=i386 - else - UNAME_MACHINE="$cputype" - fi - echo ${UNAME_MACHINE}-unknown-plan9 - exit 0 ;; - *:TOPS-10:*:*) - echo pdp10-unknown-tops10 - exit 0 ;; - *:TENEX:*:*) - echo pdp10-unknown-tenex - exit 0 ;; - KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) - echo pdp10-dec-tops20 - exit 0 ;; - XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) - echo pdp10-xkl-tops20 - exit 0 ;; - *:TOPS-20:*:*) - echo pdp10-unknown-tops20 - exit 0 ;; - *:ITS:*:*) - echo pdp10-unknown-its - exit 0 ;; -esac - -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 - -eval $set_cc_for_build -cat >$dummy.c < -# include -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); - -#endif - -#if defined (vax) -# if !defined (ultrix) -# include -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && rm -f $dummy.c $dummy && rmdir $tmpdir && exit 0 -rm -f $dummy.c $dummy && rmdir $tmpdir - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit 0 ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit 0 ;; - c34*) - echo c34-convex-bsd - exit 0 ;; - c38*) - echo c38-convex-bsd - exit 0 ;; - c4*) - echo c4-convex-bsd - exit 0 ;; - esac -fi - -cat >&2 < in order to provide the needed -information to handle your system. - -config.guess timestamp = $timestamp - -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null` - -hostinfo = `(hostinfo) 2>/dev/null` -/bin/universe = `(/bin/universe) 2>/dev/null` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` -/bin/arch = `(/bin/arch) 2>/dev/null` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` - -UNAME_MACHINE = ${UNAME_MACHINE} -UNAME_RELEASE = ${UNAME_RELEASE} -UNAME_SYSTEM = ${UNAME_SYSTEM} -UNAME_VERSION = ${UNAME_VERSION} -EOF - -exit 1 - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/dep/src/readline/src/support/config.rpath b/dep/src/readline/src/support/config.rpath deleted file mode 100644 index fa24bfc2d78..00000000000 --- a/dep/src/readline/src/support/config.rpath +++ /dev/null @@ -1,548 +0,0 @@ -#! /bin/sh -# Output a system dependent set of variables, describing how to set the -# run time search path of shared libraries in an executable. -# -# Copyright 1996-2003 Free Software Foundation, Inc. -# Taken from GNU libtool, 2001 -# Originally by Gordon Matzigkeit , 1996 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. -# -# The first argument passed to this file is the canonical host specification, -# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM -# or -# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM -# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld -# should be set by the caller. -# -# The set of defined variables is at the end of this script. - -# Known limitations: -# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer -# than 256 bytes, otherwise the compiler driver will dump core. The only -# known workaround is to choose shorter directory names for the build -# directory and/or the installation directory. - -# All known linkers require a `.a' archive for static linking (except M$VC, -# which needs '.lib'). -libext=a -shrext=.so - -host="$1" -host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` - -# Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC. - -wl= -if test "$GCC" = yes; then - wl='-Wl,' -else - case "$host_os" in - aix*) - wl='-Wl,' - ;; - mingw* | pw32* | os2*) - ;; - hpux9* | hpux10* | hpux11*) - wl='-Wl,' - ;; - irix5* | irix6* | nonstopux*) - wl='-Wl,' - ;; - newsos6) - ;; - linux*) - case $CC in - icc|ecc) - wl='-Wl,' - ;; - ccc) - wl='-Wl,' - ;; - esac - ;; - osf3* | osf4* | osf5*) - wl='-Wl,' - ;; - sco3.2v5*) - ;; - solaris*) - wl='-Wl,' - ;; - sunos4*) - wl='-Qoption ld ' - ;; - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - wl='-Wl,' - ;; - sysv4*MP*) - ;; - uts4*) - ;; - esac -fi - -# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS. - -hardcode_libdir_flag_spec= -hardcode_libdir_separator= -hardcode_direct=no -hardcode_minus_L=no - -case "$host_os" in - cygwin* | mingw* | pw32*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; - openbsd*) - with_gnu_ld=no - ;; -esac - -ld_shlibs=yes -if test "$with_gnu_ld" = yes; then - case "$host_os" in - aix3* | aix4* | aix5*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - ld_shlibs=no - fi - ;; - amigaos*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - # Samuel A. Falvo II reports - # that the semantics of dynamic libraries on AmigaOS, at least up - # to version 4, is to share data among multiple programs linked - # with the same dynamic library. Since this doesn't match the - # behavior of shared libraries on other platforms, we can use - # them. - ld_shlibs=no - ;; - beos*) - if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then - : - else - ld_shlibs=no - fi - ;; - cygwin* | mingw* | pw32*) - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec='-L$libdir' - if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - : - else - ld_shlibs=no - fi - ;; - netbsd*) - ;; - solaris* | sysv5*) - if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then - ld_shlibs=no - elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then - : - else - ld_shlibs=no - fi - ;; - sunos4*) - hardcode_direct=yes - ;; - *) - if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then - : - else - ld_shlibs=no - fi - ;; - esac - if test "$ld_shlibs" = yes; then - # Unlike libtool, we use -rpath here, not --rpath, since the documented - # option of GNU ld is called -rpath, not --rpath. - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - fi -else - case "$host_os" in - aix3*) - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - hardcode_minus_L=yes - if test "$GCC" = yes; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct=unsupported - fi - ;; - aix4* | aix5*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - else - aix_use_runtimelinking=no - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix5*) - for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi - done - esac - fi - hardcode_direct=yes - hardcode_libdir_separator=':' - if test "$GCC" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && \ - strings "$collect2name" | grep resolve_lib_name >/dev/null - then - # We have reworked collect2 - hardcode_direct=yes - else - # We have old collect2 - hardcode_direct=unsupported - hardcode_minus_L=yes - hardcode_libdir_flag_spec='-L$libdir' - hardcode_libdir_separator= - fi - esac - fi - # Begin _LT_AC_SYS_LIBPATH_AIX. - echo 'int main () { return 0; }' > conftest.c - ${CC} ${LDFLAGS} conftest.c -o conftest - aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` - if test -z "$aix_libpath"; then - aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` - fi - if test -z "$aix_libpath"; then - aix_libpath="/usr/lib:/lib" - fi - rm -f conftest.c conftest - # End _LT_AC_SYS_LIBPATH_AIX. - if test "$aix_use_runtimelinking" = yes; then - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' - else - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - fi - fi - ;; - amigaos*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - # see comment about different semantics on the GNU ld section - ld_shlibs=no - ;; - bsdi4*) - ;; - cygwin* | mingw* | pw32*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec=' ' - libext=lib - ;; - darwin* | rhapsody*) - if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then - hardcode_direct=no - fi - ;; - dgux*) - hardcode_libdir_flag_spec='-L$libdir' - ;; - freebsd1*) - ld_shlibs=no - ;; - freebsd2.2*) - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - ;; - freebsd2*) - hardcode_direct=yes - hardcode_minus_L=yes - ;; - freebsd*) - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - ;; - hpux9*) - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - ;; - hpux10* | hpux11*) - if test "$with_gnu_ld" = no; then - case "$host_cpu" in - hppa*64*) - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=no - ;; - ia64*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_direct=no - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - ;; - *) - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - ;; - esac - fi - ;; - irix5* | irix6* | nonstopux*) - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - ;; - netbsd*) - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - ;; - newsos6) - hardcode_direct=yes - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - ;; - openbsd*) - hardcode_direct=yes - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - else - case "$host_os" in - openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) - hardcode_libdir_flag_spec='-R$libdir' - ;; - *) - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - ;; - esac - fi - ;; - os2*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - osf3*) - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - ;; - osf4* | osf5*) - if test "$GCC" = yes; then - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - else - # Both cc and cxx compiler support -rpath directly - hardcode_libdir_flag_spec='-rpath $libdir' - fi - hardcode_libdir_separator=: - ;; - sco3.2v5*) - ;; - solaris*) - hardcode_libdir_flag_spec='-R$libdir' - ;; - sunos4*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_direct=yes - hardcode_minus_L=yes - ;; - sysv4) - case $host_vendor in - sni) - hardcode_direct=yes # is this really true??? - ;; - siemens) - hardcode_direct=no - ;; - motorola) - hardcode_direct=no #Motorola manual says yes, but my tests say they lie - ;; - esac - ;; - sysv4.3*) - ;; - sysv4*MP*) - if test -d /usr/nec; then - ld_shlibs=yes - fi - ;; - sysv4.2uw2*) - hardcode_direct=yes - hardcode_minus_L=no - ;; - sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) - ;; - sysv5*) - hardcode_libdir_flag_spec= - ;; - uts4*) - hardcode_libdir_flag_spec='-L$libdir' - ;; - *) - ld_shlibs=no - ;; - esac -fi - -# Check dynamic linker characteristics -# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. -libname_spec='lib$name' -case "$host_os" in - aix3*) - ;; - aix4* | aix5*) - ;; - amigaos*) - ;; - beos*) - ;; - bsdi4*) - ;; - cygwin* | mingw* | pw32*) - shrext=.dll - ;; - darwin* | rhapsody*) - shrext=.dylib - ;; - dgux*) - ;; - freebsd1*) - ;; - freebsd*) - ;; - gnu*) - ;; - hpux9* | hpux10* | hpux11*) - case "$host_cpu" in - ia64*) - shrext=.so - ;; - hppa*64*) - shrext=.sl - ;; - *) - shrext=.sl - ;; - esac - ;; - irix5* | irix6* | nonstopux*) - case "$host_os" in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; - *) libsuff= shlibsuff= ;; - esac - ;; - esac - ;; - linux*oldld* | linux*aout* | linux*coff*) - ;; - linux*) - ;; - netbsd*) - ;; - newsos6) - ;; - nto-qnx) - ;; - openbsd*) - ;; - os2*) - libname_spec='$name' - shrext=.dll - ;; - osf3* | osf4* | osf5*) - ;; - sco3.2v5*) - ;; - solaris*) - ;; - sunos4*) - ;; - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - ;; - sysv4*MP*) - ;; - uts4*) - ;; -esac - -sed_quote_subst='s/\(["`$\\]\)/\\\1/g' -escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` -shlibext=`echo "$shrext" | sed -e 's,^\.,,'` -escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` - -sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <. Submit a context -# diff and a properly formatted ChangeLog entry. -# -# Configuration subroutine to validate and canonicalize a configuration type. -# Supply the specified configuration type as an argument. -# If it is invalid, we print an error message on stderr and exit with code 1. -# Otherwise, we print the canonical config type on stdout and succeed. - -# This file is supposed to be the same for all GNU packages -# and recognize all the CPU types, system types and aliases -# that are meaningful with *any* GNU software. -# Each package is responsible for reporting which valid configurations -# it does not support. The user should be able to distinguish -# a failure to support a valid configuration from a meaningless -# configuration. - -# The goal of this file is to map all the various variations of a given -# machine specification into a single specification in the form: -# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM -# or in some cases, the newer four-part form: -# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM -# It is wrong to echo any other type of specification. - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS - $0 [OPTION] ALIAS - -Canonicalize a configuration name. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.sub ($timestamp) - -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit 0 ;; - --version | -v ) - echo "$version" ; exit 0 ;; - --help | --h* | -h ) - echo "$usage"; exit 0 ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" - exit 1 ;; - - *local*) - # First pass through any local machine types. - echo $1 - exit 0;; - - * ) - break ;; - esac -done - -case $# in - 0) echo "$me: missing argument$help" >&2 - exit 1;; - 1) ;; - *) echo "$me: too many arguments$help" >&2 - exit 1;; -esac - -# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). -# Here we must recognize all the valid KERNEL-OS combinations. -maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` -case $maybe_os in - nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) - os=-$maybe_os - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` - ;; - *) - basic_machine=`echo $1 | sed 's/-[^-]*$//'` - if [ $basic_machine != $1 ] - then os=`echo $1 | sed 's/.*-/-/'` - else os=; fi - ;; -esac - -### Let's recognize common machines as not being operating systems so -### that things like config.sub decstation-3100 work. We also -### recognize some manufacturers as not being operating systems, so we -### can provide default operating systems below. -case $os in - -sun*os*) - # Prevent following clause from handling this invalid input. - ;; - -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ - -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ - -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ - -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ - -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ - -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis) - os= - basic_machine=$1 - ;; - -sim | -cisco | -oki | -wec | -winbond) - os= - basic_machine=$1 - ;; - -scout) - ;; - -wrs) - os=-vxworks - basic_machine=$1 - ;; - -chorusos*) - os=-chorusos - basic_machine=$1 - ;; - -chorusrdb) - os=-chorusrdb - basic_machine=$1 - ;; - -hiux*) - os=-hiuxwe2 - ;; - -sco5) - os=-sco3.2v5 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco4) - os=-sco3.2v4 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2.[4-9]*) - os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2v[4-9]*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco*) - os=-sco3.2v2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -udk*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -isc) - os=-isc2.2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -clix*) - basic_machine=clipper-intergraph - ;; - -isc*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -lynx*) - os=-lynxos - ;; - -ptx*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` - ;; - -windowsnt*) - os=`echo $os | sed -e 's/windowsnt/winnt/'` - ;; - -psos*) - os=-psos - ;; - -mint | -mint[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; -esac - -# Decode aliases for certain CPU-COMPANY combinations. -case $basic_machine in - # Recognize the basic CPU types without company name. - # Some are omitted here because they have special meanings below. - 1750a | 580 \ - | a29k \ - | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ - | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ - | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ - | clipper \ - | d10v | d30v | dlx | dsp16xx \ - | fr30 | frv \ - | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | i370 | i860 | i960 | ia64 \ - | ip2k \ - | m32r | m68000 | m68k | m88k | mcore \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64el \ - | mips64vr | mips64vrel \ - | mips64orion | mips64orionel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mipsisa32 | mipsisa32el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipstx39 | mipstx39el \ - | mn10200 | mn10300 \ - | ns16k | ns32k \ - | openrisc | or32 \ - | pdp10 | pdp11 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ - | pyramid \ - | sh | sh[1234] | sh3e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ - | sh64 | sh64le \ - | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ - | strongarm \ - | tahoe | thumb | tic80 | tron \ - | v850 | v850e \ - | we32k \ - | x86 | xscale | xstormy16 | xtensa \ - | z8k) - basic_machine=$basic_machine-unknown - ;; - m6811 | m68hc11 | m6812 | m68hc12) - # Motorola 68HC11/12. - basic_machine=$basic_machine-unknown - os=-none - ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) - ;; - - # We use `pc' rather than `unknown' - # because (1) that's what they normally are, and - # (2) the word "unknown" tends to confuse beginning users. - i*86 | x86_64 | amd64) - basic_machine=$basic_machine-pc - ;; - # Object if more than one company name word. - *-*-*) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; - # Recognize the basic CPU types with company name. - 580-* \ - | a29k-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ - | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ - | amd64-* \ - | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ - | avr-* \ - | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* \ - | clipper-* | cydra-* \ - | d10v-* | d30v-* | dlx-* \ - | elxsi-* \ - | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ - | h8300-* | h8500-* \ - | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ - | i*86-* | i860-* | i960-* | ia64-* \ - | ip2k-* \ - | m32r-* \ - | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | mcore-* \ - | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ - | mips16-* \ - | mips64-* | mips64el-* \ - | mips64vr-* | mips64vrel-* \ - | mips64orion-* | mips64orionel-* \ - | mips64vr4100-* | mips64vr4100el-* \ - | mips64vr4300-* | mips64vr4300el-* \ - | mips64vr5000-* | mips64vr5000el-* \ - | mipsisa32-* | mipsisa32el-* \ - | mipsisa64-* | mipsisa64el-* \ - | mipsisa64sb1-* | mipsisa64sb1el-* \ - | mipsisa64sr71k-* | mipsisa64sr71kel-* \ - | mipstx39 | mipstx39el \ - | none-* | np1-* | ns16k-* | ns32k-* \ - | orion-* \ - | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ - | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ - | pyramid-* \ - | romp-* | rs6000-* \ - | sh-* | sh[1234]-* | sh3e-* | sh[34]eb-* | shbe-* \ - | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ - | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ - | tahoe-* | thumb-* | tic30-* | tic4x-* | tic54x-* | tic80-* | tron-* \ - | v850-* | v850e-* | vax-* \ - | we32k-* \ - | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ - | xtensa-* \ - | ymp-* \ - | z8k-*) - ;; - # Recognize the various machine names and aliases which stand - # for a CPU type and a company and sometimes even an OS. - 386bsd) - basic_machine=i386-unknown - os=-bsd - ;; - 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - basic_machine=m68000-att - ;; - 3b*) - basic_machine=we32k-att - ;; - a29khif) - basic_machine=a29k-amd - os=-udi - ;; - adobe68k) - basic_machine=m68010-adobe - os=-scout - ;; - alliant | fx80) - basic_machine=fx80-alliant - ;; - altos | altos3068) - basic_machine=m68k-altos - ;; - am29k) - basic_machine=a29k-none - os=-bsd - ;; - amdahl) - basic_machine=580-amdahl - os=-sysv - ;; - amiga | amiga-*) - basic_machine=m68k-unknown - ;; - amigaos | amigados) - basic_machine=m68k-unknown - os=-amigaos - ;; - amigaunix | amix) - basic_machine=m68k-unknown - os=-sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - os=-sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - os=-bsd - ;; - aux) - basic_machine=m68k-apple - os=-aux - ;; - balance) - basic_machine=ns32k-sequent - os=-dynix - ;; - c90) - basic_machine=c90-cray - os=-unicos - ;; - convex-c1) - basic_machine=c1-convex - os=-bsd - ;; - convex-c2) - basic_machine=c2-convex - os=-bsd - ;; - convex-c32) - basic_machine=c32-convex - os=-bsd - ;; - convex-c34) - basic_machine=c34-convex - os=-bsd - ;; - convex-c38) - basic_machine=c38-convex - os=-bsd - ;; - cray | j90) - basic_machine=j90-cray - os=-unicos - ;; - crds | unos) - basic_machine=m68k-crds - ;; - cris | cris-* | etrax*) - basic_machine=cris-axis - ;; - da30 | da30-*) - basic_machine=m68k-da30 - ;; - decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) - basic_machine=mips-dec - ;; - decsystem10* | dec10*) - basic_machine=pdp10-dec - os=-tops10 - ;; - decsystem20* | dec20*) - basic_machine=pdp10-dec - os=-tops20 - ;; - delta | 3300 | motorola-3300 | motorola-delta \ - | 3300-motorola | delta-motorola) - basic_machine=m68k-motorola - ;; - delta88) - basic_machine=m88k-motorola - os=-sysv3 - ;; - dpx20 | dpx20-*) - basic_machine=rs6000-bull - os=-bosx - ;; - dpx2* | dpx2*-bull) - basic_machine=m68k-bull - os=-sysv3 - ;; - ebmon29k) - basic_machine=a29k-amd - os=-ebmon - ;; - elxsi) - basic_machine=elxsi-elxsi - os=-bsd - ;; - encore | umax | mmax) - basic_machine=ns32k-encore - ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - os=-ose - ;; - fx2800) - basic_machine=i860-alliant - ;; - genix) - basic_machine=ns32k-ns - ;; - gmicro) - basic_machine=tron-gmicro - os=-sysv - ;; - go32) - basic_machine=i386-pc - os=-go32 - ;; - h3050r* | hiux*) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - h8300hms) - basic_machine=h8300-hitachi - os=-hms - ;; - h8300xray) - basic_machine=h8300-hitachi - os=-xray - ;; - h8500hms) - basic_machine=h8500-hitachi - os=-hms - ;; - harris) - basic_machine=m88k-harris - os=-sysv3 - ;; - hp300-*) - basic_machine=m68k-hp - ;; - hp300bsd) - basic_machine=m68k-hp - os=-bsd - ;; - hp300hpux) - basic_machine=m68k-hp - os=-hpux - ;; - hp3k9[0-9][0-9] | hp9[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k2[0-9][0-9] | hp9k31[0-9]) - basic_machine=m68000-hp - ;; - hp9k3[2-9][0-9]) - basic_machine=m68k-hp - ;; - hp9k6[0-9][0-9] | hp6[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k7[0-79][0-9] | hp7[0-79][0-9]) - basic_machine=hppa1.1-hp - ;; - hp9k78[0-9] | hp78[0-9]) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][13679] | hp8[0-9][13679]) - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][0-9] | hp8[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hppa-next) - os=-nextstep3 - ;; - hppaosf) - basic_machine=hppa1.1-hp - os=-osf - ;; - hppro) - basic_machine=hppa1.1-hp - os=-proelf - ;; - i370-ibm* | ibm*) - basic_machine=i370-ibm - ;; -# I'm not sure what "Sysv32" means. Should this be sysv3.2? - i*86v32) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv32 - ;; - i*86v4*) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv4 - ;; - i*86v) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv - ;; - i*86sol2) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-solaris2 - ;; - i386mach) - basic_machine=i386-mach - os=-mach - ;; - i386-vsta | vsta) - basic_machine=i386-unknown - os=-vsta - ;; - iris | iris4d) - basic_machine=mips-sgi - case $os in - -irix*) - ;; - *) - os=-irix4 - ;; - esac - ;; - isi68 | isi) - basic_machine=m68k-isi - os=-sysv - ;; - m88k-omron*) - basic_machine=m88k-omron - ;; - magnum | m3230) - basic_machine=mips-mips - os=-sysv - ;; - merlin) - basic_machine=ns32k-utek - os=-sysv - ;; - mingw32) - basic_machine=i386-pc - os=-mingw32 - ;; - miniframe) - basic_machine=m68000-convergent - ;; - *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; - mips3*-*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` - ;; - mips3*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown - ;; - mmix*) - basic_machine=mmix-knuth - os=-mmixware - ;; - monitor) - basic_machine=m68k-rom68k - os=-coff - ;; - morphos) - basic_machine=powerpc-unknown - os=-morphos - ;; - msdos) - basic_machine=i386-pc - os=-msdos - ;; - mvs) - basic_machine=i370-ibm - os=-mvs - ;; - ncr3000) - basic_machine=i486-ncr - os=-sysv4 - ;; - netbsd386) - basic_machine=i386-unknown - os=-netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - os=-linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - os=-newsos - ;; - news1000) - basic_machine=m68030-sony - os=-newsos - ;; - news-3600 | risc-news) - basic_machine=mips-sony - os=-newsos - ;; - necv70) - basic_machine=v70-nec - os=-sysv - ;; - next | m*-next ) - basic_machine=m68k-next - case $os in - -nextstep* ) - ;; - -ns2*) - os=-nextstep2 - ;; - *) - os=-nextstep3 - ;; - esac - ;; - nh3000) - basic_machine=m68k-harris - os=-cxux - ;; - nh[45]000) - basic_machine=m88k-harris - os=-cxux - ;; - nindy960) - basic_machine=i960-intel - os=-nindy - ;; - mon960) - basic_machine=i960-intel - os=-mon960 - ;; - nonstopux) - basic_machine=mips-compaq - os=-nonstopux - ;; - np1) - basic_machine=np1-gould - ;; - nsr-tandem) - basic_machine=nsr-tandem - ;; - op50n-* | op60c-*) - basic_machine=hppa1.1-oki - os=-proelf - ;; - or32 | or32-*) - basic_machine=or32-unknown - os=-coff - ;; - OSE68000 | ose68000) - basic_machine=m68000-ericsson - os=-ose - ;; - os68k) - basic_machine=m68k-none - os=-os68k - ;; - pa-hitachi) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - paragon) - basic_machine=i860-intel - os=-osf - ;; - pbd) - basic_machine=sparc-tti - ;; - pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 - ;; - pentium | p5 | k5 | k6 | nexgen | viac3) - basic_machine=i586-pc - ;; - pentiumpro | p6 | 6x86 | athlon | athlon_*) - basic_machine=i686-pc - ;; - pentiumii | pentium2) - basic_machine=i686-pc - ;; - pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) - basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumpro-* | p6-* | 6x86-* | athlon-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumii-* | pentium2-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pn) - basic_machine=pn-gould - ;; - power) basic_machine=power-ibm - ;; - ppc) basic_machine=powerpc-unknown - ;; - ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppcle | powerpclittle | ppc-le | powerpc-little) - basic_machine=powerpcle-unknown - ;; - ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64) basic_machine=powerpc64-unknown - ;; - ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64le | powerpc64little | ppc64-le | powerpc64-little) - basic_machine=powerpc64le-unknown - ;; - ppc64le-* | powerpc64little-*) - basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ps2) - basic_machine=i386-ibm - ;; - pw32) - basic_machine=i586-unknown - os=-pw32 - ;; - rom68k) - basic_machine=m68k-rom68k - os=-coff - ;; - rm[46]00) - basic_machine=mips-siemens - ;; - rtpc | rtpc-*) - basic_machine=romp-ibm - ;; - s390 | s390-*) - basic_machine=s390-ibm - ;; - s390x | s390x-*) - basic_machine=s390x-ibm - ;; - sa29200) - basic_machine=a29k-amd - os=-udi - ;; - sb1) - basic_machine=mipsisa64sb1-unknown - ;; - sb1el) - basic_machine=mipsisa64sb1el-unknown - ;; - sequent) - basic_machine=i386-sequent - ;; - sh) - basic_machine=sh-hitachi - os=-hms - ;; - sparclite-wrs | simso-wrs) - basic_machine=sparclite-wrs - os=-vxworks - ;; - sps7) - basic_machine=m68k-bull - os=-sysv2 - ;; - spur) - basic_machine=spur-unknown - ;; - st2000) - basic_machine=m68k-tandem - ;; - stratus) - basic_machine=i860-stratus - os=-sysv4 - ;; - sun2) - basic_machine=m68000-sun - ;; - sun2os3) - basic_machine=m68000-sun - os=-sunos3 - ;; - sun2os4) - basic_machine=m68000-sun - os=-sunos4 - ;; - sun3os3) - basic_machine=m68k-sun - os=-sunos3 - ;; - sun3os4) - basic_machine=m68k-sun - os=-sunos4 - ;; - sun4os3) - basic_machine=sparc-sun - os=-sunos3 - ;; - sun4os4) - basic_machine=sparc-sun - os=-sunos4 - ;; - sun4sol2) - basic_machine=sparc-sun - os=-solaris2 - ;; - sun3 | sun3-*) - basic_machine=m68k-sun - ;; - sun4) - basic_machine=sparc-sun - ;; - sun386 | sun386i | roadrunner) - basic_machine=i386-sun - ;; - sv1) - basic_machine=sv1-cray - os=-unicos - ;; - symmetry) - basic_machine=i386-sequent - os=-dynix - ;; - t3d) - basic_machine=alpha-cray - os=-unicos - ;; - t3e) - basic_machine=alphaev5-cray - os=-unicos - ;; - t90) - basic_machine=t90-cray - os=-unicos - ;; - tic4x | c4x*) - basic_machine=tic4x-unknown - os=-coff - ;; - tic54x | c54x*) - basic_machine=tic54x-unknown - os=-coff - ;; - tx39) - basic_machine=mipstx39-unknown - ;; - tx39el) - basic_machine=mipstx39el-unknown - ;; - toad1) - basic_machine=pdp10-xkl - os=-tops20 - ;; - tower | tower-32) - basic_machine=m68k-ncr - ;; - udi29k) - basic_machine=a29k-amd - os=-udi - ;; - ultra3) - basic_machine=a29k-nyu - os=-sym1 - ;; - v810 | necv810) - basic_machine=v810-nec - os=-none - ;; - vaxv) - basic_machine=vax-dec - os=-sysv - ;; - vms) - basic_machine=vax-dec - os=-vms - ;; - vpp*|vx|vx-*) - basic_machine=f301-fujitsu - ;; - vxworks960) - basic_machine=i960-wrs - os=-vxworks - ;; - vxworks68) - basic_machine=m68k-wrs - os=-vxworks - ;; - vxworks29k) - basic_machine=a29k-wrs - os=-vxworks - ;; - w65*) - basic_machine=w65-wdc - os=-none - ;; - w89k-*) - basic_machine=hppa1.1-winbond - os=-proelf - ;; - xps | xps100) - basic_machine=xps100-honeywell - ;; - ymp) - basic_machine=ymp-cray - os=-unicos - ;; - z8k-*-coff) - basic_machine=z8k-unknown - os=-sim - ;; - none) - basic_machine=none-none - os=-none - ;; - -# Here we handle the default manufacturer of certain CPU types. It is in -# some cases the only manufacturer, in others, it is the most popular. - w89k) - basic_machine=hppa1.1-winbond - ;; - op50n) - basic_machine=hppa1.1-oki - ;; - op60c) - basic_machine=hppa1.1-oki - ;; - romp) - basic_machine=romp-ibm - ;; - rs6000) - basic_machine=rs6000-ibm - ;; - vax) - basic_machine=vax-dec - ;; - pdp10) - # there are many clones, so DEC is not a safe bet - basic_machine=pdp10-unknown - ;; - pdp11) - basic_machine=pdp11-dec - ;; - we32k) - basic_machine=we32k-att - ;; - sh3 | sh4 | sh3eb | sh4eb | sh[1234]le | sh3ele) - basic_machine=sh-unknown - ;; - sh64) - basic_machine=sh64-unknown - ;; - sparc | sparcv9 | sparcv9b) - basic_machine=sparc-sun - ;; - cydra) - basic_machine=cydra-cydrome - ;; - orion) - basic_machine=orion-highlevel - ;; - orion105) - basic_machine=clipper-highlevel - ;; - mac | mpw | mac-mpw) - basic_machine=m68k-apple - ;; - pmac | pmac-mpw) - basic_machine=powerpc-apple - ;; - *-unknown) - # Make sure to match an already-canonicalized machine name. - ;; - *) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; -esac - -# Here we canonicalize certain aliases for manufacturers. -case $basic_machine in - *-digital*) - basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` - ;; - *-commodore*) - basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` - ;; - *) - ;; -esac - -# Decode manufacturer-specific aliases for certain operating systems. - -if [ x"$os" != x"" ] -then -case $os in - # First match some system type aliases - # that might get confused with valid system types. - # -solaris* is a basic system type, with this one exception. - -solaris1 | -solaris1.*) - os=`echo $os | sed -e 's|solaris1|sunos4|'` - ;; - -solaris) - os=-solaris2 - ;; - -svr4*) - os=-sysv4 - ;; - -unixware*) - os=-sysv4.2uw - ;; - -gnu/linux*) - os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` - ;; - # First accept the basic system types. - # The portable systems comes first. - # Each alternative MUST END IN A *, to match a version number. - # -sysv* is not here because it comes later, after sysvr4. - -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ - | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ - | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ - | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* \ - | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ - | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ - | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ - | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ - | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ - | -chorusos* | -chorusrdb* \ - | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ - | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ - | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ - | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ - | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ - | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ - | -powermax* | -dnix*) - # Remember, each alternative MUST END IN *, to match a version number. - ;; - -qnx*) - case $basic_machine in - x86-* | i*86-*) - ;; - *) - os=-nto$os - ;; - esac - ;; - -nto-qnx*) - ;; - -nto*) - os=`echo $os | sed -e 's|nto|nto-qnx|'` - ;; - -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ - | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ - | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) - ;; - -mac*) - os=`echo $os | sed -e 's|mac|macos|'` - ;; - -linux*) - os=`echo $os | sed -e 's|linux|linux-gnu|'` - ;; - -sunos5*) - os=`echo $os | sed -e 's|sunos5|solaris2|'` - ;; - -sunos6*) - os=`echo $os | sed -e 's|sunos6|solaris3|'` - ;; - -opened*) - os=-openedition - ;; - -wince*) - os=-wince - ;; - -osfrose*) - os=-osfrose - ;; - -osf*) - os=-osf - ;; - -utek*) - os=-bsd - ;; - -dynix*) - os=-bsd - ;; - -acis*) - os=-aos - ;; - -atheos*) - os=-atheos - ;; - -386bsd) - os=-bsd - ;; - -ctix* | -uts*) - os=-sysv - ;; - -nova*) - os=-rtmk-nova - ;; - -ns2 ) - os=-nextstep2 - ;; - -nsk*) - os=-nsk - ;; - # Preserve the version number of sinix5. - -sinix5.*) - os=`echo $os | sed -e 's|sinix|sysv|'` - ;; - -sinix*) - os=-sysv4 - ;; - -triton*) - os=-sysv3 - ;; - -oss*) - os=-sysv3 - ;; - -svr4) - os=-sysv4 - ;; - -svr3) - os=-sysv3 - ;; - -sysvr4) - os=-sysv4 - ;; - # This must come after -sysvr4. - -sysv*) - ;; - -ose*) - os=-ose - ;; - -es1800*) - os=-ose - ;; - -xenix) - os=-xenix - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - os=-mint - ;; - -none) - ;; - *) - # Get rid of the `-' at the beginning of $os. - os=`echo $os | sed 's/[^-]*-//'` - echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 - exit 1 - ;; -esac -else - -# Here we handle the default operating systems that come with various machines. -# The value should be what the vendor currently ships out the door with their -# machine or put another way, the most popular os provided with the machine. - -# Note that if you're going to try to match "-MANUFACTURER" here (say, -# "-sun"), then you have to tell the case statement up towards the top -# that MANUFACTURER isn't an operating system. Otherwise, code above -# will signal an error saying that MANUFACTURER isn't an operating -# system, and we'll never get to this point. - -case $basic_machine in - *-acorn) - os=-riscix1.2 - ;; - arm*-rebel) - os=-linux - ;; - arm*-semi) - os=-aout - ;; - # This must come before the *-dec entry. - pdp10-*) - os=-tops20 - ;; - pdp11-*) - os=-none - ;; - *-dec | vax-*) - os=-ultrix4.2 - ;; - m68*-apollo) - os=-domain - ;; - i386-sun) - os=-sunos4.0.2 - ;; - m68000-sun) - os=-sunos3 - # This also exists in the configure program, but was not the - # default. - # os=-sunos4 - ;; - m68*-cisco) - os=-aout - ;; - mips*-cisco) - os=-elf - ;; - mips*-*) - os=-elf - ;; - or32-*) - os=-coff - ;; - *-tti) # must be before sparc entry or we get the wrong os. - os=-sysv3 - ;; - sparc-* | *-sun) - os=-sunos4.1.1 - ;; - *-be) - os=-beos - ;; - *-ibm) - os=-aix - ;; - *-wec) - os=-proelf - ;; - *-winbond) - os=-proelf - ;; - *-oki) - os=-proelf - ;; - *-hp) - os=-hpux - ;; - *-hitachi) - os=-hiux - ;; - i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=-sysv - ;; - *-cbm) - os=-amigaos - ;; - *-dg) - os=-dgux - ;; - *-dolphin) - os=-sysv3 - ;; - m68k-ccur) - os=-rtu - ;; - m88k-omron*) - os=-luna - ;; - *-next ) - os=-nextstep - ;; - *-sequent) - os=-ptx - ;; - *-crds) - os=-unos - ;; - *-ns) - os=-genix - ;; - i370-*) - os=-mvs - ;; - *-next) - os=-nextstep3 - ;; - *-gould) - os=-sysv - ;; - *-highlevel) - os=-bsd - ;; - *-encore) - os=-bsd - ;; - *-sgi) - os=-irix - ;; - *-siemens) - os=-sysv4 - ;; - *-masscomp) - os=-rtu - ;; - f30[01]-fujitsu | f700-fujitsu) - os=-uxpv - ;; - *-rom68k) - os=-coff - ;; - *-*bug) - os=-coff - ;; - *-apple) - os=-macos - ;; - *-atari*) - os=-mint - ;; - *) - os=-none - ;; -esac -fi - -# Here we handle the case where we know the os, and the CPU type, but not the -# manufacturer. We pick the logical manufacturer. -vendor=unknown -case $basic_machine in - *-unknown) - case $os in - -riscix*) - vendor=acorn - ;; - -sunos*) - vendor=sun - ;; - -aix*) - vendor=ibm - ;; - -beos*) - vendor=be - ;; - -hpux*) - vendor=hp - ;; - -mpeix*) - vendor=hp - ;; - -hiux*) - vendor=hitachi - ;; - -unos*) - vendor=crds - ;; - -dgux*) - vendor=dg - ;; - -luna*) - vendor=omron - ;; - -genix*) - vendor=ns - ;; - -mvs* | -opened*) - vendor=ibm - ;; - -ptx*) - vendor=sequent - ;; - -vxsim* | -vxworks* | -windiss*) - vendor=wrs - ;; - -aux*) - vendor=apple - ;; - -hms*) - vendor=hitachi - ;; - -mpw* | -macos*) - vendor=apple - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - vendor=atari - ;; - -vos*) - vendor=stratus - ;; - esac - basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` - ;; -esac - -echo $basic_machine$os -exit 0 - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/dep/src/readline/src/support/install.sh b/dep/src/readline/src/support/install.sh deleted file mode 100644 index 0cac004e6dc..00000000000 --- a/dep/src/readline/src/support/install.sh +++ /dev/null @@ -1,247 +0,0 @@ -#!/bin/sh -# -# install - install a program, script, or datafile -# This comes from X11R5. -# -# $XConsortium: install.sh,v 1.2 89/12/18 14:47:22 jim Exp $ -# -# Copyright 1991 by the Massachusetts Institute of Technology -# -# Permission to use, copy, modify, distribute, and sell this software and its -# documentation for any purpose is hereby granted without fee, provided that -# the above copyright notice appear in all copies and that both that -# copyright notice and this permission notice appear in supporting -# documentation, and that the name of M.I.T. not be used in advertising or -# publicity pertaining to distribution of the software without specific, -# written prior permission. M.I.T. makes no representations about the -# suitability of this software for any purpose. It is provided "as is" -# without express or implied warranty. -# -# This script is compatible with the BSD install script, but was written -# from scratch. -# - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit="${DOITPROG-}" - - -# put in absolute paths if you don't have them in your path; or use env. vars. - -mvprog="${MVPROG-mv}" -cpprog="${CPPROG-cp}" -chmodprog="${CHMODPROG-chmod}" -chownprog="${CHOWNPROG-chown}" -chgrpprog="${CHGRPPROG-chgrp}" -stripprog="${STRIPPROG-strip}" -rmprog="${RMPROG-rm}" -mkdirprog="${MKDIRPROG-mkdir}" - -tranformbasename="" -transform_arg="" -instcmd="$mvprog" -chmodcmd="$chmodprog 0755" -chowncmd="" -chgrpcmd="" -stripcmd="" -rmcmd="$rmprog -f" -mvcmd="$mvprog" -src="" -dst="" -dir_arg="" - -while [ x"$1" != x ]; do - case $1 in - -c) instcmd="$cpprog" - shift - continue;; - - -d) dir_arg=true - shift - continue;; - - -m) chmodcmd="$chmodprog $2" - shift - shift - continue;; - - -o) chowncmd="$chownprog $2" - shift - shift - continue;; - - -g) chgrpcmd="$chgrpprog $2" - shift - shift - continue;; - - -s) stripcmd="$stripprog" - shift - continue;; - - -t=*) transformarg=`echo $1 | sed 's/-t=//'` - shift - continue;; - - -b=*) transformbasename=`echo $1 | sed 's/-b=//'` - shift - continue;; - - *) if [ x"$src" = x ] - then - src=$1 - else - # this colon is to work around a 386BSD /bin/sh bug - : - dst=$1 - fi - shift - continue;; - esac -done - -if [ x"$src" = x ] -then - echo "install: no input file specified" - exit 1 -else - true -fi - -if [ x"$dir_arg" != x ]; then - dst=$src - src="" - - if [ -d $dst ]; then - instcmd=: - else - instcmd=mkdir - fi -else - -# Waiting for this to be detected by the "$instcmd $src $dsttmp" command -# might cause directories to be created, which would be especially bad -# if $src (and thus $dsttmp) contains '*'. - - if [ -f $src -o -d $src ] - then - true - else - echo "install: $src does not exist" - exit 1 - fi - - if [ x"$dst" = x ] - then - echo "install: no destination specified" - exit 1 - else - true - fi - -# If destination is a directory, append the input filename; if your system -# does not like double slashes in filenames, you may need to add some logic - - if [ -d $dst ] - then - dst="$dst"/`basename $src` - else - true - fi -fi - -## this sed command emulates the dirname command -dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` - -# Make sure that the destination directory exists. -# this part is taken from Noah Friedman's mkinstalldirs script - -# Skip lots of stat calls in the usual case. -if [ ! -d "$dstdir" ]; then -defaultIFS=' -' -IFS="${IFS-${defaultIFS}}" - -oIFS="${IFS}" -# Some sh's can't handle IFS=/ for some reason. -IFS='%' -set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` -IFS="${oIFS}" - -pathcomp='' - -while [ $# -ne 0 ] ; do - pathcomp="${pathcomp}${1}" - shift - - if [ ! -d "${pathcomp}" ] ; - then - $mkdirprog "${pathcomp}" - else - true - fi - - pathcomp="${pathcomp}/" -done -fi - -if [ x"$dir_arg" != x ] -then - $doit $instcmd $dst && - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi -else - -# If we're going to rename the final executable, determine the name now. - - if [ x"$transformarg" = x ] - then - dstfile=`basename $dst` - else - dstfile=`basename $dst $transformbasename | - sed $transformarg`$transformbasename - fi - -# don't allow the sed command to completely eliminate the filename - - if [ x"$dstfile" = x ] - then - dstfile=`basename $dst` - else - true - fi - -# Make a temp file name in the proper directory. - - dsttmp=$dstdir/#inst.$$# - -# Move or copy the file name to the temp name - - $doit $instcmd $src $dsttmp && - - trap "rm -f ${dsttmp}" 0 && - -# and set any options; do chmod last to preserve setuid bits - -# If any of these fail, we abort the whole thing. If we want to -# ignore errors from any of these, just make sure not to ignore -# errors from the above "$doit $instcmd $src $dsttmp" command. - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && - -# Now rename the file to the real destination. - - $doit $rmcmd -f $dstdir/$dstfile && - $doit $mvcmd $dsttmp $dstdir/$dstfile - -fi && - - -exit 0 diff --git a/dep/src/readline/src/support/mkdirs b/dep/src/readline/src/support/mkdirs deleted file mode 100644 index ce4fb235db7..00000000000 --- a/dep/src/readline/src/support/mkdirs +++ /dev/null @@ -1,48 +0,0 @@ -#! /bin/sh -# -# mkdirs - a work-alike for `mkdir -p' -# -# Chet Ramey -# chet@po.cwru.edu - -# Copyright (C) 1996-2002 Free Software Foundation, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. - -for dir -do - - test -d "$dir" && continue - - tomake=$dir - while test -n "$dir" ; do - # dir=${dir%/*} - # dir=`expr "$dir" ':' '\(/.*\)/[^/]*'` - if dir=`expr "$dir" ':' '\(.*\)/[^/]*'`; then - tomake="$dir $tomake" - else - dir= - fi - done - - for d in $tomake - do - test -d "$d" && continue - echo mkdir "$d" - mkdir "$d" - done -done - -exit 0 diff --git a/dep/src/readline/src/support/mkdist b/dep/src/readline/src/support/mkdist deleted file mode 100644 index 06e6155f559..00000000000 --- a/dep/src/readline/src/support/mkdist +++ /dev/null @@ -1,120 +0,0 @@ -#! /bin/bash - -# -# mkdist - make a distribution directory from a master manifest file -# -# usage: mkdist [-m manifest] [-s srcdir] [-r rootname] [-v] version -# -# SRCDIR defaults to src -# MANIFEST defaults to $SRCDIR/MANIFEST -# -# Chet Ramey -# chet@po.cwru.edu - -# Copyright (C) 1996-2002 Free Software Foundation, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. - -SRCDIR=src -ROOTNAME=bash - -usage() -{ - echo usage: mkdist [-m manifest] [-s srcdir] [-r rootname] [-v] version 1>&2 - exit 2 -} - -vmsg() -{ - if [ -n "$verbose" ]; then - echo mkdist: "$@" - fi -} - -while getopts m:s:r:v name -do - case $name in - m) MANIFEST=$OPTARG ;; - s) SRCDIR=$OPTARG ;; - r) ROOTNAME=$OPTARG ;; - v) verbose=yes ;; - ?) usage ;; - esac -done - -: ${MANIFEST:=$SRCDIR/MANIFEST} - -vmsg using $MANIFEST - -shift $(( $OPTIND - 1 )) - -if [ $# -lt 1 ]; then - usage -fi - -version=$1 -newdir=${ROOTNAME}-$version - -vmsg creating distribution for $ROOTNAME version $version in $newdir - -if [ ! -d $newdir ]; then - mkdir $newdir || { echo $0: cannot make directory $newdir 1>&2 ; exit 1; } -fi - -dirmode=755 -filmode=644 - -while read fname type mode -do - [ -z "$fname" ] && continue - - case "$fname" in - \#*) continue ;; - esac - - case "$type" in - d) mkdir $newdir/$fname ;; - f) cp -p $SRCDIR/$fname $newdir/$fname ;; - s) ln -s $mode $newdir/$fname ; mode= ;; # symlink - l) ln $mode $newdir/$fname ; mode= ;; # hard link - *) echo "unknown file type $type" 1>&2 ;; - esac - - if [ -n "$mode" ]; then - chmod $mode $newdir/$fname - fi - -done < $MANIFEST - -# cut off the `-alpha' in something like `2.0-alpha', leaving just the -# numeric version -#version=${version%%-*} - -#case "$version" in -#*.*.*) vers=${version%.*} ;; -#*.*) vers=${version} ;; -#esac - -#echo $vers > $newdir/.distribution - -#case "$version" in -#*.*.*) plevel=${version##*.} ;; -#*) plevel=0 ;; -#esac -#[ -z "$plevel" ] && plevel=0 -#echo ${plevel} > $newdir/.patchlevel - -vmsg $newdir created - -exit 0 diff --git a/dep/src/readline/src/support/mkinstalldirs b/dep/src/readline/src/support/mkinstalldirs deleted file mode 100644 index d2d5f21b611..00000000000 --- a/dep/src/readline/src/support/mkinstalldirs +++ /dev/null @@ -1,111 +0,0 @@ -#! /bin/sh -# mkinstalldirs --- make directory hierarchy -# Author: Noah Friedman -# Created: 1993-05-16 -# Public domain - -errstatus=0 -dirmode="" - -usage="\ -Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." - -# process command line arguments -while test $# -gt 0 ; do - case $1 in - -h | --help | --h*) # -h for help - echo "$usage" 1>&2 - exit 0 - ;; - -m) # -m PERM arg - shift - test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } - dirmode=$1 - shift - ;; - --) # stop option processing - shift - break - ;; - -*) # unknown option - echo "$usage" 1>&2 - exit 1 - ;; - *) # first non-opt arg - break - ;; - esac -done - -for file -do - if test -d "$file"; then - shift - else - break - fi -done - -case $# in - 0) exit 0 ;; -esac - -case $dirmode in - '') - if mkdir -p -- . 2>/dev/null; then - echo "mkdir -p -- $*" - exec mkdir -p -- "$@" - fi - ;; - *) - if mkdir -m "$dirmode" -p -- . 2>/dev/null; then - echo "mkdir -m $dirmode -p -- $*" - exec mkdir -m "$dirmode" -p -- "$@" - fi - ;; -esac - -for file -do - set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` - shift - - pathcomp= - for d - do - pathcomp="$pathcomp$d" - case $pathcomp in - -*) pathcomp=./$pathcomp ;; - esac - - if test ! -d "$pathcomp"; then - echo "mkdir $pathcomp" - - mkdir "$pathcomp" || lasterr=$? - - if test ! -d "$pathcomp"; then - errstatus=$lasterr - else - if test ! -z "$dirmode"; then - echo "chmod $dirmode $pathcomp" - lasterr="" - chmod "$dirmode" "$pathcomp" || lasterr=$? - - if test ! -z "$lasterr"; then - errstatus=$lasterr - fi - fi - fi - fi - - pathcomp="$pathcomp/" - done -done - -exit $errstatus - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# End: -# mkinstalldirs ends here diff --git a/dep/src/readline/src/support/shlib-install b/dep/src/readline/src/support/shlib-install deleted file mode 100644 index a15b7d80c02..00000000000 --- a/dep/src/readline/src/support/shlib-install +++ /dev/null @@ -1,169 +0,0 @@ -#! /bin/sh -# -# shlib-install - install a shared library and do any necessary host-specific -# post-installation configuration (like ldconfig) -# -# usage: shlib-install [-D] -O host_os -d installation-dir -i install-prog [-U] library -# -# Chet Ramey -# chet@po.cwru.edu - -# -# defaults -# -INSTALLDIR=/usr/local/lib -LDCONFIG=ldconfig - -PROGNAME=`basename $0` -USAGE="$PROGNAME [-D] -O host_os -d installation-dir -i install-prog [-U] library" - -# process options - -while [ $# -gt 0 ]; do - case "$1" in - -O) shift; host_os="$1"; shift ;; - -d) shift; INSTALLDIR="$1"; shift ;; - -i) shift; INSTALLPROG="$1" ; shift ;; - -D) echo=echo ; shift ;; - -U) uninstall=true ; shift ;; - -*) echo "$USAGE" >&2 ; exit 2;; - *) break ;; - esac -done - -# set install target name -LIBNAME="$1" - -if [ -z "$LIBNAME" ]; then - echo "$USAGE" >&2 - exit 2 -fi - -OLDSUFF=old -MV=mv -RM="rm -f" -LN="ln -s" - -# pre-install - -if [ -z "$uninstall" ]; then - ${echo} $RM ${INSTALLDIR}/${LIBNAME}.${OLDSUFF} - if [ -f "$INSTALLDIR/$LIBNAME" ]; then - ${echo} $MV $INSTALLDIR/$LIBNAME ${INSTALLDIR}/${LIBNAME}.${OLDSUFF} - fi -fi - -# install/uninstall - -if [ -z "$uninstall" ] ; then - ${echo} eval ${INSTALLPROG} $LIBNAME ${INSTALLDIR}/${LIBNAME} -else - ${echo} ${RM} ${INSTALLDIR}/${LIBNAME} -fi - -# post-install/uninstall - -# HP-UX and Darwin/MacOS X require that a shared library have execute permission -case "$host_os" in -hpux*|darwin*|macosx*) - if [ -z "$uninstall" ]; then - chmod 555 ${INSTALLDIR}/${LIBNAME} - fi ;; -*) ;; -esac - -case "$LIBNAME" in -*.*.[0-9].[0-9]) # libname.so.M.N - LINK2=`echo $LIBNAME | sed 's:\(.*\..*\.[0-9]\)\.[0-9]:\1:'` # libname.so.M - LINK1=`echo $LIBNAME | sed 's:\(.*\..*\)\.[0-9]\.[0-9]:\1:'` # libname.so - ;; -*.*.[0-9]) # libname.so.M - LINK1=`echo $LIBNAME | sed 's:\(.*\..*\)\.[0-9]:\1:'` # libname.so - ;; -*.[0-9]) # libname.M - LINK1=`echo $LIBNAME | sed 's:\(.*\)\.[0-9]:\1:'` # libname - ;; -*.[0-9].[0-9].dylib) # libname.M.N.dylib - LINK2=`echo $LIBNAME | sed 's:\(.*\.[0-9]\)\.[0-9]:\1:'` # libname.M.dylib - LINK1=`echo $LIBNAME | sed 's:\(.*\)\.[0-9]\.[0-9]:\1:'` # libname.dylib -esac - -INSTALL_LINK1='${echo} cd $INSTALLDIR && ${echo} ${LN} $LIBNAME $LINK1' -INSTALL_LINK2='${echo} cd $INSTALLDIR && ${echo} ${LN} $LIBNAME $LINK2' - -# -# Create symlinks to the installed library. This section is incomplete. -# -case "$host_os" in -*linux*) - # libname.so.M -> libname.so.M.N - ${echo} ${RM} ${INSTALLDIR}/$LINK2 - if [ -z "$uninstall" ]; then - eval $INSTALL_LINK2 - fi - - # libname.so -> libname.so.M - ${echo} ${RM} ${INSTALLDIR}/$LINK1 - if [ -z "$uninstall" ]; then - ${echo} cd $INSTALLDIR && ${echo} ${LN} $LINK2 $LINK1 - fi - ;; - -bsdi4*|*gnu*|darwin*|macosx*|k*bsd*-gnu) - # libname.so.M -> libname.so.M.N - ${echo} ${RM} ${INSTALLDIR}/$LINK2 - if [ -z "$uninstall" ]; then - eval $INSTALL_LINK2 - fi - - # libname.so -> libname.so.M.N - ${echo} ${RM} ${INSTALLDIR}/$LINK1 - if [ -z "$uninstall" ]; then - eval $INSTALL_LINK1 - fi - ;; - -solaris2*|aix4.[2-9]*|osf*|irix[56]*|sysv[45]*|dgux*) - # libname.so -> libname.so.M - ${echo} ${RM} ${INSTALLDIR}/$LINK1 - if [ -z "$uninstall" ]; then - eval $INSTALL_LINK1 - fi - ;; - - -# FreeBSD 3.x and above can have either a.out or ELF shared libraries -freebsd[3-9]*|freebsdelf[3-9]*|freebsdaout[3-9]*) - if [ -x /usr/bin/objformat ] && [ "`/usr/bin/objformat`" = "elf" ]; then - # libname.so -> libname.so.M - ${echo} ${RM} ${INSTALLDIR}/$LINK1 - if [ -z "$uninstall" ]; then - eval $INSTALL_LINK1 - fi - else - # libname.so.M -> libname.so.M.N - ${echo} ${RM} ${INSTALLDIR}/$LINK2 - if [ -z "$uninstall" ]; then - eval $INSTALL_LINK2 - fi - - # libname.so -> libname.so.M.N - ${echo} ${RM} ${INSTALLDIR}/$LINK1 - if [ -z "$uninstall" ]; then - eval $INSTALL_LINK1 - fi - fi - ;; - -hpux1*) - # libname.sl -> libname.M - ${echo} ${RM} ${INSTALLDIR}/$LINK1.sl - if [ -z "$uninstall" ]; then - eval $INSTALL_LINK1 - fi - ;; - -*) ;; -esac - -exit 0 diff --git a/dep/src/readline/src/support/shobj-conf b/dep/src/readline/src/support/shobj-conf deleted file mode 100644 index 4c137170840..00000000000 --- a/dep/src/readline/src/support/shobj-conf +++ /dev/null @@ -1,466 +0,0 @@ -#! /bin/sh -# -# shobj-conf -- output a series of variable assignments to be substituted -# into a Makefile by configure which specify system-dependent -# information for creating shared objects that may be loaded -# into bash with `enable -f' -# -# usage: shobj-conf [-C compiler] -c host_cpu -o host_os -v host_vendor -# -# Chet Ramey -# chet@po.cwru.edu - -# Copyright (C) 1996-2002 Free Software Foundation, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. - -# -# defaults -# -SHOBJ_STATUS=supported -SHLIB_STATUS=supported - -SHOBJ_CC=cc -SHOBJ_CFLAGS= -SHOBJ_LD= -SHOBJ_LDFLAGS= -SHOBJ_XLDFLAGS= -SHOBJ_LIBS= - -SHLIB_XLDFLAGS= -SHLIB_LIBS= -SHLIB_LIBSUFF='so' - -SHLIB_LIBVERSION='$(SHLIB_LIBSUFF)' - -PROGNAME=`basename $0` -USAGE="$PROGNAME [-C compiler] -c host_cpu -o host_os -v host_vendor" - -while [ $# -gt 0 ]; do - case "$1" in - -C) shift; SHOBJ_CC="$1"; shift ;; - -c) shift; host_cpu="$1"; shift ;; - -o) shift; host_os="$1"; shift ;; - -v) shift; host_vendor="$1"; shift ;; - *) echo "$USAGE" >&2 ; exit 2;; - esac -done - -case "${host_os}-${SHOBJ_CC}" in -sunos4*-*gcc*) - SHOBJ_CFLAGS=-fpic - SHOBJ_LD=/usr/bin/ld - SHOBJ_LDFLAGS='-assert pure-text' - - SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' - ;; - -sunos4*) - SHOBJ_CFLAGS=-pic - SHOBJ_LD=/usr/bin/ld - SHOBJ_LDFLAGS='-assert pure-text' - - SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' - ;; - -sunos5*-*gcc*|solaris2*-*gcc*) - SHOBJ_CFLAGS=-fpic - SHOBJ_LD='${CC}' - # This line works for the Solaris linker in /usr/ccs/bin/ld - SHOBJ_LDFLAGS='-shared -Wl,-i -Wl,-h,$@' - # This line works for the GNU ld -# SHOBJ_LDFLAGS='-shared -Wl,-h,$@' - -# SHLIB_XLDFLAGS='-R $(libdir)' - SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' - ;; - -sunos5*|solaris2*) - SHOBJ_CFLAGS='-K pic' - SHOBJ_LD=/usr/ccs/bin/ld - SHOBJ_LDFLAGS='-G -dy -z text -i -h $@' - -# SHLIB_XLDFLAGS='-R $(libdir)' - SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' - ;; - -# All versions of Linux or the semi-mythical GNU Hurd. -linux*-*|gnu*-*|k*bsd*-gnu-*) - SHOBJ_CFLAGS=-fPIC - SHOBJ_LD='${CC}' - SHOBJ_LDFLAGS='-shared -Wl,-soname,$@' - - SHLIB_XLDFLAGS='-Wl,-rpath,$(libdir) -Wl,-soname,`basename $@ $(SHLIB_MINOR)`' - SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' - ;; - -freebsd2* | netbsd*) - SHOBJ_CFLAGS=-fpic - SHOBJ_LD=ld - SHOBJ_LDFLAGS='-x -Bshareable' - - SHLIB_XLDFLAGS='-R$(libdir)' - SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' - ;; - -# FreeBSD-3.x ELF -freebsd[3-9]*|freebsdelf[3-9]*|freebsdaout[3-9]*) - SHOBJ_CFLAGS=-fpic - SHOBJ_LD='${CC}' - - if [ -x /usr/bin/objformat ] && [ "`/usr/bin/objformat`" = "elf" ]; then - SHOBJ_LDFLAGS='-shared -Wl,-soname,$@' - - SHLIB_XLDFLAGS='-Wl,-rpath,$(libdir)' - SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' - else - SHOBJ_LDFLAGS='-shared' - - SHLIB_XLDFLAGS='-R$(libdir)' - SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' - fi - ;; - -# Darwin/MacOS X -darwin*|macosx*) - SHOBJ_STATUS=unsupported - SHLIB_STATUS=supported - - SHOBJ_CFLAGS='-fno-common' - - SHOBJ_LD='${CC}' - - SHLIB_LIBVERSION='$(SHLIB_MAJOR)$(SHLIB_MINOR).$(SHLIB_LIBSUFF)' - SHLIB_LIBSUFF='dylib' - - case "${host_os}" in - darwin7*) SHOBJ_LDFLAGS='' - SHLIB_XLDFLAGS='-dynamiclib -arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v' - ;; - *) SHOBJ_LDFLAGS='-dynamic' - SHLIB_XLDFLAGS='-arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v' - ;; - esac - - SHLIB_LIBS='-lncurses' # see if -lcurses works on MacOS X 10.1 - ;; - -openbsd*) - SHOBJ_CFLAGS=-fPIC - SHOBJ_LD='${CC}' - SHOBJ_LDFLAGS='-shared' - - SHLIB_XLDFLAGS='-R$(libdir)' - SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' - ;; - -bsdi2*) - SHOBJ_CC=shlicc2 - SHOBJ_CFLAGS= - SHOBJ_LD=ld - SHOBJ_LDFLAGS=-r - SHOBJ_LIBS=-lc_s.2.1.0 - - # BSD/OS 2.x and 3.x `shared libraries' are too much of a pain in - # the ass -- they require changing {/usr/lib,etc}/shlib.map on - # each system, and the library creation process is byzantine - SHLIB_STATUS=unsupported - ;; - -bsdi3*) - SHOBJ_CC=shlicc2 - SHOBJ_CFLAGS= - SHOBJ_LD=ld - SHOBJ_LDFLAGS=-r - SHOBJ_LIBS=-lc_s.3.0.0 - - # BSD/OS 2.x and 3.x `shared libraries' are too much of a pain in - # the ass -- they require changing {/usr/lib,etc}/shlib.map on - # each system, and the library creation process is byzantine - SHLIB_STATUS=unsupported - ;; - -bsdi4*) - # BSD/OS 4.x now supports ELF and SunOS-style dynamically-linked - # shared libraries. gcc 2.x is the standard compiler, and the - # `normal' gcc options should work as they do in Linux. - - SHOBJ_CFLAGS=-fPIC - SHOBJ_LD='${CC}' - SHOBJ_LDFLAGS='-shared -Wl,-soname,$@' - - SHLIB_XLDFLAGS='-Wl,-soname,`basename $@ $(SHLIB_MINOR)`' - SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' - ;; - -osf*-*gcc*) - # Fix to use gcc linker driver from bfischer@TechFak.Uni-Bielefeld.DE - SHOBJ_LD='${CC}' - SHOBJ_LDFLAGS='-shared -Wl,-soname,$@' - - SHLIB_XLDFLAGS='-rpath $(libdir)' - SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' - ;; - -osf*) - SHOBJ_LD=ld - SHOBJ_LDFLAGS='-shared -soname $@ -expect_unresolved "*"' - - SHLIB_XLDFLAGS='-rpath $(libdir)' - SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' - ;; - -aix4.[2-9]*-*gcc*) # lightly tested by jik@cisco.com - SHOBJ_CFLAGS=-fpic - SHOBJ_LD='ld' - SHOBJ_LDFLAGS='-bdynamic -bnoentry -bexpall' - SHOBJ_XLDFLAGS='-G' - - SHLIB_XLDFLAGS='-bM:SRE' - SHLIB_LIBS='-lcurses -lc' - SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' - ;; - -aix4.[2-9]*) - SHOBJ_CFLAGS=-K - SHOBJ_LD='ld' - SHOBJ_LDFLAGS='-bdynamic -bnoentry -bexpall' - SHOBJ_XLDFLAGS='-G' - - SHLIB_XLDFLAGS='-bM:SRE' - SHLIB_LIBS='-lcurses -lc' - SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' - ;; - -# -# THE FOLLOWING ARE UNTESTED -- and some may not support the dlopen interface -# -irix[56]*-*gcc*) - SHOBJ_CFLAGS='-fpic' - SHOBJ_LD='${CC}' - SHOBJ_LDFLAGS='-shared -Wl,-soname,$@' - - SHLIB_XLDFLAGS='-Wl,-rpath,$(libdir)' - SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' - ;; - -irix[56]*) - SHOBJ_CFLAGS='-K PIC' - SHOBJ_LD=ld -# SHOBJ_LDFLAGS='-call_shared -hidden_symbol -no_unresolved -soname $@' -# Change from David Kaelbling . If you have problems, -# remove the `-no_unresolved' - SHOBJ_LDFLAGS='-shared -no_unresolved -soname $@' - - SHLIB_XLDFLAGS='-rpath $(libdir)' - SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' - ;; - -hpux9*-*gcc*) - # must use gcc; the bundled cc cannot compile PIC code - SHOBJ_CFLAGS='-fpic' - SHOBJ_LD='${CC}' - SHOBJ_LDFLAGS='-shared -Wl,-b -Wl,+s' - - SHLIB_XLDFLAGS='-Wl,+b,$(libdir)' - SHLIB_LIBSUFF='sl' - SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' - ;; - -hpux9*) - SHOBJ_STATUS=unsupported - SHLIB_STATUS=unsupported - - # If you are using the HP ANSI C compiler, you can uncomment and use - # this code (I have not tested it) -# SHOBJ_STATUS=supported -# SHLIB_STATUS=supported -# -# SHOBJ_CFLAGS='+z' -# SHOBJ_LD='ld' -# SHOBJ_LDFLAGS='-b +s' -# -# SHLIB_XLDFLAGS='+b $(libdir)' -# SHLIB_LIBSUFF='sl' -# SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' - - ;; - -hpux10*-*gcc*) - # must use gcc; the bundled cc cannot compile PIC code - SHOBJ_CFLAGS='-fpic' - SHOBJ_LD='${CC}' - # if you have problems linking here, moving the `-Wl,+h,$@' from - # SHLIB_XLDFLAGS to SHOBJ_LDFLAGS has been reported to work - SHOBJ_LDFLAGS='-shared -Wl,-b -Wl,+s' - - SHLIB_XLDFLAGS='-Wl,+h,$@ -Wl,+b,$(libdir)' - SHLIB_LIBSUFF='sl' - SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' - ;; - -hpux10*) - SHOBJ_STATUS=unsupported - SHLIB_STATUS=unsupported - - # If you are using the HP ANSI C compiler, you can uncomment and use - # this code (I have not tested it) -# SHOBJ_STATUS=supported -# SHLIB_STATUS=supported -# -# SHOBJ_CFLAGS='+z' -# SHOBJ_LD='ld' -# SHOBJ_LDFLAGS='-b +s +h $@' -# -# SHLIB_XLDFLAGS='+b $(libdir)' -# SHLIB_LIBSUFF='sl' -# SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' - - ;; - -hpux11*-*gcc*) - # must use gcc; the bundled cc cannot compile PIC code - SHOBJ_CFLAGS='-fpic' - SHOBJ_LD='${CC}' -# SHOBJ_LDFLAGS='-shared -Wl,-b -Wl,-B,symbolic -Wl,+s -Wl,+std -Wl,+h,$@' - SHOBJ_LDFLAGS='-shared -fpic -Wl,-b -Wl,+s -Wl,+h,$@' - - SHLIB_XLDFLAGS='-Wl,+b,$(libdir)' - SHLIB_LIBSUFF='sl' - SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' - ;; - -hpux11*) - SHOBJ_STATUS=unsupported - SHLIB_STATUS=unsupported - - # If you are using the HP ANSI C compiler, you can uncomment and use - # this code (I have not tested it) -# SHOBJ_STATUS=supported -# SHLIB_STATUS=supported -# -# SHOBJ_CFLAGS='+z' -# SHOBJ_LD='ld' -# SHOBJ_LDFLAGS='-b +s +h $@' -# -# SHLIB_XLDFLAGS='+b $(libdir)' -# SHLIB_LIBSUFF='sl' -# SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' - - ;; - -sysv4*-*gcc*) - SHOBJ_CFLAGS=-shared - SHOBJ_LDFLAGS='-shared -h $@' - SHOBJ_LD='${CC}' - - SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' - ;; - -sysv4*) - SHOBJ_CFLAGS='-K PIC' - SHOBJ_LD=ld - SHOBJ_LDFLAGS='-dy -z text -G -h $@' - - SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' - ;; - -sco3.2v5*-*gcc*) - SHOBJ_CFLAGS='-fpic' # DEFAULTS TO ELF - SHOBJ_LD='${CC}' - SHOBJ_LDFLAGS='-shared' - - SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' - ;; - -sco3.2v5*) - SHOBJ_CFLAGS='-K pic -b elf' - SHOBJ_LD=ld - SHOBJ_LDFLAGS='-G -b elf -dy -z text -h $@' - - SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' - ;; - -sysv5uw7*-*gcc*) - SHOBJ_CFLAGS='-fpic' - SHOBJ_LD='${CC}' - SHOBJ_LDFLAGS='-shared' - - SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' - ;; - -sysv5uw7*) - SHOBJ_CFLAGS='-K PIC' - SHOBJ_LD=ld - SHOBJ_LDFLAGS='-G -dy -z text -h $@' - - SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' - ;; - -dgux*-*gcc*) - SHOBJ_CFLAGS=-fpic - SHOBJ_LD='${CC}' - SHOBJ_LDFLAGS='-shared' - - SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' - ;; - -dgux*) - SHOBJ_CFLAGS='-K pic' - SHOBJ_LD=ld - SHOBJ_LDFLAGS='-G -dy -h $@' - - SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' - ;; - -msdos*) - SHOBJ_STATUS=unsupported - SHLIB_STATUS=unsupported - ;; - -# -# Rely on correct gcc configuration for everything else -# -*-*gcc*) - SHOBJ_CFLAGS=-fpic - SHOBJ_LD='${CC}' - SHOBJ_LDFLAGS='-shared' - - SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' - ;; - -*) - SHOBJ_STATUS=unsupported - SHLIB_STATUS=unsupported - ;; - -esac - -echo SHOBJ_CC=\'"$SHOBJ_CC"\' -echo SHOBJ_CFLAGS=\'"$SHOBJ_CFLAGS"\' -echo SHOBJ_LD=\'"$SHOBJ_LD"\' -echo SHOBJ_LDFLAGS=\'"$SHOBJ_LDFLAGS"\' -echo SHOBJ_XLDFLAGS=\'"$SHOBJ_XLDFLAGS"\' -echo SHOBJ_LIBS=\'"$SHOBJ_LIBS"\' - -echo SHLIB_XLDFLAGS=\'"$SHLIB_XLDFLAGS"\' -echo SHLIB_LIBS=\'"$SHLIB_LIBS"\' -echo SHLIB_LIBSUFF=\'"$SHLIB_LIBSUFF"\' -echo SHLIB_LIBVERSION=\'"$SHLIB_LIBVERSION"\' - -echo SHOBJ_STATUS=\'"$SHOBJ_STATUS"\' -echo SHLIB_STATUS=\'"$SHLIB_STATUS"\' - -exit 0 diff --git a/dep/src/readline/src/support/wcwidth.c b/dep/src/readline/src/support/wcwidth.c deleted file mode 100644 index ace9a3ab92c..00000000000 --- a/dep/src/readline/src/support/wcwidth.c +++ /dev/null @@ -1,236 +0,0 @@ -/* - * This is an implementation of wcwidth() and wcswidth() as defined in - * "The Single UNIX Specification, Version 2, The Open Group, 1997" - * - * - * Markus Kuhn -- 2001-09-08 -- public domain - */ - -#include - -struct interval { - unsigned short first; - unsigned short last; -}; - -/* auxiliary function for binary search in interval table */ -static int bisearch(wchar_t ucs, const struct interval *table, int max) { - int min = 0; - int mid; - - if (ucs < table[0].first || ucs > table[max].last) - return 0; - while (max >= min) { - mid = (min + max) / 2; - if (ucs > table[mid].last) - min = mid + 1; - else if (ucs < table[mid].first) - max = mid - 1; - else - return 1; - } - - return 0; -} - - -/* The following functions define the column width of an ISO 10646 - * character as follows: - * - * - The null character (U+0000) has a column width of 0. - * - * - Other C0/C1 control characters and DEL will lead to a return - * value of -1. - * - * - Non-spacing and enclosing combining characters (general - * category code Mn or Me in the Unicode database) have a - * column width of 0. - * - * - Other format characters (general category code Cf in the Unicode - * database) and ZERO WIDTH SPACE (U+200B) have a column width of 0. - * - * - Hangul Jamo medial vowels and final consonants (U+1160-U+11FF) - * have a column width of 0. - * - * - Spacing characters in the East Asian Wide (W) or East Asian - * FullWidth (F) category as defined in Unicode Technical - * Report #11 have a column width of 2. - * - * - All remaining characters (including all printable - * ISO 8859-1 and WGL4 characters, Unicode control characters, - * etc.) have a column width of 1. - * - * This implementation assumes that wchar_t characters are encoded - * in ISO 10646. - */ - -int wcwidth(wchar_t ucs) -{ - /* sorted list of non-overlapping intervals of non-spacing characters */ - static const struct interval combining[] = { - { 0x0300, 0x034E }, { 0x0360, 0x0362 }, { 0x0483, 0x0486 }, - { 0x0488, 0x0489 }, { 0x0591, 0x05A1 }, { 0x05A3, 0x05B9 }, - { 0x05BB, 0x05BD }, { 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 }, - { 0x05C4, 0x05C4 }, { 0x064B, 0x0655 }, { 0x0670, 0x0670 }, - { 0x06D6, 0x06E4 }, { 0x06E7, 0x06E8 }, { 0x06EA, 0x06ED }, - { 0x070F, 0x070F }, { 0x0711, 0x0711 }, { 0x0730, 0x074A }, - { 0x07A6, 0x07B0 }, { 0x0901, 0x0902 }, { 0x093C, 0x093C }, - { 0x0941, 0x0948 }, { 0x094D, 0x094D }, { 0x0951, 0x0954 }, - { 0x0962, 0x0963 }, { 0x0981, 0x0981 }, { 0x09BC, 0x09BC }, - { 0x09C1, 0x09C4 }, { 0x09CD, 0x09CD }, { 0x09E2, 0x09E3 }, - { 0x0A02, 0x0A02 }, { 0x0A3C, 0x0A3C }, { 0x0A41, 0x0A42 }, - { 0x0A47, 0x0A48 }, { 0x0A4B, 0x0A4D }, { 0x0A70, 0x0A71 }, - { 0x0A81, 0x0A82 }, { 0x0ABC, 0x0ABC }, { 0x0AC1, 0x0AC5 }, - { 0x0AC7, 0x0AC8 }, { 0x0ACD, 0x0ACD }, { 0x0B01, 0x0B01 }, - { 0x0B3C, 0x0B3C }, { 0x0B3F, 0x0B3F }, { 0x0B41, 0x0B43 }, - { 0x0B4D, 0x0B4D }, { 0x0B56, 0x0B56 }, { 0x0B82, 0x0B82 }, - { 0x0BC0, 0x0BC0 }, { 0x0BCD, 0x0BCD }, { 0x0C3E, 0x0C40 }, - { 0x0C46, 0x0C48 }, { 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 }, - { 0x0CBF, 0x0CBF }, { 0x0CC6, 0x0CC6 }, { 0x0CCC, 0x0CCD }, - { 0x0D41, 0x0D43 }, { 0x0D4D, 0x0D4D }, { 0x0DCA, 0x0DCA }, - { 0x0DD2, 0x0DD4 }, { 0x0DD6, 0x0DD6 }, { 0x0E31, 0x0E31 }, - { 0x0E34, 0x0E3A }, { 0x0E47, 0x0E4E }, { 0x0EB1, 0x0EB1 }, - { 0x0EB4, 0x0EB9 }, { 0x0EBB, 0x0EBC }, { 0x0EC8, 0x0ECD }, - { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 }, { 0x0F37, 0x0F37 }, - { 0x0F39, 0x0F39 }, { 0x0F71, 0x0F7E }, { 0x0F80, 0x0F84 }, - { 0x0F86, 0x0F87 }, { 0x0F90, 0x0F97 }, { 0x0F99, 0x0FBC }, - { 0x0FC6, 0x0FC6 }, { 0x102D, 0x1030 }, { 0x1032, 0x1032 }, - { 0x1036, 0x1037 }, { 0x1039, 0x1039 }, { 0x1058, 0x1059 }, - { 0x1160, 0x11FF }, { 0x17B7, 0x17BD }, { 0x17C6, 0x17C6 }, - { 0x17C9, 0x17D3 }, { 0x180B, 0x180E }, { 0x18A9, 0x18A9 }, - { 0x200B, 0x200F }, { 0x202A, 0x202E }, { 0x206A, 0x206F }, - { 0x20D0, 0x20E3 }, { 0x302A, 0x302F }, { 0x3099, 0x309A }, - { 0xFB1E, 0xFB1E }, { 0xFE20, 0xFE23 }, { 0xFEFF, 0xFEFF }, - { 0xFFF9, 0xFFFB } - }; - - /* test for 8-bit control characters */ - if (ucs == 0) - return 0; - if (ucs < 32 || (ucs >= 0x7f && ucs < 0xa0)) - return -1; - - /* binary search in table of non-spacing characters */ - if (bisearch(ucs, combining, - sizeof(combining) / sizeof(struct interval) - 1)) - return 0; - - /* if we arrive here, ucs is not a combining or C0/C1 control character */ - - return 1 + - (ucs >= 0x1100 && - (ucs <= 0x115f || /* Hangul Jamo init. consonants */ - (ucs >= 0x2e80 && ucs <= 0xa4cf && (ucs & ~0x0011) != 0x300a && - ucs != 0x303f) || /* CJK ... Yi */ - (ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */ - (ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Compatibility Ideographs */ - (ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Compatibility Forms */ - (ucs >= 0xff00 && ucs <= 0xff5f) || /* Fullwidth Forms */ - (ucs >= 0xffe0 && ucs <= 0xffe6) || - (ucs >= 0x20000 && ucs <= 0x2ffff))); -} - - -int wcswidth(const wchar_t *pwcs, size_t n) -{ - int w, width = 0; - - for (;*pwcs && n-- > 0; pwcs++) - if ((w = wcwidth(*pwcs)) < 0) - return -1; - else - width += w; - - return width; -} - - -/* - * The following function is the same as wcwidth(), except that - * spacing characters in the East Asian Ambiguous (A) category as - * defined in Unicode Technical Report #11 have a column width of 2. - * This experimental variant might be useful for users of CJK legacy - * encodings who want to migrate to UCS. It is not otherwise - * recommended for general use. - */ -static int wcwidth_cjk(wchar_t ucs) -{ - /* sorted list of non-overlapping intervals of East Asian Ambiguous - * characters */ - static const struct interval ambiguous[] = { - { 0x00A1, 0x00A1 }, { 0x00A4, 0x00A4 }, { 0x00A7, 0x00A8 }, - { 0x00AA, 0x00AA }, { 0x00AD, 0x00AE }, { 0x00B0, 0x00B4 }, - { 0x00B6, 0x00BA }, { 0x00BC, 0x00BF }, { 0x00C6, 0x00C6 }, - { 0x00D0, 0x00D0 }, { 0x00D7, 0x00D8 }, { 0x00DE, 0x00E1 }, - { 0x00E6, 0x00E6 }, { 0x00E8, 0x00EA }, { 0x00EC, 0x00ED }, - { 0x00F0, 0x00F0 }, { 0x00F2, 0x00F3 }, { 0x00F7, 0x00FA }, - { 0x00FC, 0x00FC }, { 0x00FE, 0x00FE }, { 0x0101, 0x0101 }, - { 0x0111, 0x0111 }, { 0x0113, 0x0113 }, { 0x011B, 0x011B }, - { 0x0126, 0x0127 }, { 0x012B, 0x012B }, { 0x0131, 0x0133 }, - { 0x0138, 0x0138 }, { 0x013F, 0x0142 }, { 0x0144, 0x0144 }, - { 0x0148, 0x014B }, { 0x014D, 0x014D }, { 0x0152, 0x0153 }, - { 0x0166, 0x0167 }, { 0x016B, 0x016B }, { 0x01CE, 0x01CE }, - { 0x01D0, 0x01D0 }, { 0x01D2, 0x01D2 }, { 0x01D4, 0x01D4 }, - { 0x01D6, 0x01D6 }, { 0x01D8, 0x01D8 }, { 0x01DA, 0x01DA }, - { 0x01DC, 0x01DC }, { 0x0251, 0x0251 }, { 0x0261, 0x0261 }, - { 0x02C4, 0x02C4 }, { 0x02C7, 0x02C7 }, { 0x02C9, 0x02CB }, - { 0x02CD, 0x02CD }, { 0x02D0, 0x02D0 }, { 0x02D8, 0x02DB }, - { 0x02DD, 0x02DD }, { 0x02DF, 0x02DF }, { 0x0300, 0x034E }, - { 0x0360, 0x0362 }, { 0x0391, 0x03A1 }, { 0x03A3, 0x03A9 }, - { 0x03B1, 0x03C1 }, { 0x03C3, 0x03C9 }, { 0x0401, 0x0401 }, - { 0x0410, 0x044F }, { 0x0451, 0x0451 }, { 0x2010, 0x2010 }, - { 0x2013, 0x2016 }, { 0x2018, 0x2019 }, { 0x201C, 0x201D }, - { 0x2020, 0x2022 }, { 0x2024, 0x2027 }, { 0x2030, 0x2030 }, - { 0x2032, 0x2033 }, { 0x2035, 0x2035 }, { 0x203B, 0x203B }, - { 0x203E, 0x203E }, { 0x2074, 0x2074 }, { 0x207F, 0x207F }, - { 0x2081, 0x2084 }, { 0x20AC, 0x20AC }, { 0x2103, 0x2103 }, - { 0x2105, 0x2105 }, { 0x2109, 0x2109 }, { 0x2113, 0x2113 }, - { 0x2116, 0x2116 }, { 0x2121, 0x2122 }, { 0x2126, 0x2126 }, - { 0x212B, 0x212B }, { 0x2153, 0x2155 }, { 0x215B, 0x215E }, - { 0x2160, 0x216B }, { 0x2170, 0x2179 }, { 0x2190, 0x2199 }, - { 0x21B8, 0x21B9 }, { 0x21D2, 0x21D2 }, { 0x21D4, 0x21D4 }, - { 0x21E7, 0x21E7 }, { 0x2200, 0x2200 }, { 0x2202, 0x2203 }, - { 0x2207, 0x2208 }, { 0x220B, 0x220B }, { 0x220F, 0x220F }, - { 0x2211, 0x2211 }, { 0x2215, 0x2215 }, { 0x221A, 0x221A }, - { 0x221D, 0x2220 }, { 0x2223, 0x2223 }, { 0x2225, 0x2225 }, - { 0x2227, 0x222C }, { 0x222E, 0x222E }, { 0x2234, 0x2237 }, - { 0x223C, 0x223D }, { 0x2248, 0x2248 }, { 0x224C, 0x224C }, - { 0x2252, 0x2252 }, { 0x2260, 0x2261 }, { 0x2264, 0x2267 }, - { 0x226A, 0x226B }, { 0x226E, 0x226F }, { 0x2282, 0x2283 }, - { 0x2286, 0x2287 }, { 0x2295, 0x2295 }, { 0x2299, 0x2299 }, - { 0x22A5, 0x22A5 }, { 0x22BF, 0x22BF }, { 0x2312, 0x2312 }, - { 0x2329, 0x232A }, { 0x2460, 0x24BF }, { 0x24D0, 0x24E9 }, - { 0x2500, 0x254B }, { 0x2550, 0x2574 }, { 0x2580, 0x258F }, - { 0x2592, 0x2595 }, { 0x25A0, 0x25A1 }, { 0x25A3, 0x25A9 }, - { 0x25B2, 0x25B3 }, { 0x25B6, 0x25B7 }, { 0x25BC, 0x25BD }, - { 0x25C0, 0x25C1 }, { 0x25C6, 0x25C8 }, { 0x25CB, 0x25CB }, - { 0x25CE, 0x25D1 }, { 0x25E2, 0x25E5 }, { 0x25EF, 0x25EF }, - { 0x2605, 0x2606 }, { 0x2609, 0x2609 }, { 0x260E, 0x260F }, - { 0x261C, 0x261C }, { 0x261E, 0x261E }, { 0x2640, 0x2640 }, - { 0x2642, 0x2642 }, { 0x2660, 0x2661 }, { 0x2663, 0x2665 }, - { 0x2667, 0x266A }, { 0x266C, 0x266D }, { 0x266F, 0x266F }, - { 0x273D, 0x273D }, { 0x3008, 0x300B }, { 0x3014, 0x3015 }, - { 0x3018, 0x301B }, { 0xFFFD, 0xFFFD } - }; - - /* binary search in table of non-spacing characters */ - if (bisearch(ucs, ambiguous, - sizeof(ambiguous) / sizeof(struct interval) - 1)) - return 2; - - return wcwidth(ucs); -} - - -int wcswidth_cjk(const wchar_t *pwcs, size_t n) -{ - int w, width = 0; - - for (;*pwcs && n-- > 0; pwcs++) - if ((w = wcwidth_cjk(*pwcs)) < 0) - return -1; - else - width += w; - - return width; -} diff --git a/dep/src/readline/src/tcap.h b/dep/src/readline/src/tcap.h deleted file mode 100644 index 58ab894d93e..00000000000 --- a/dep/src/readline/src/tcap.h +++ /dev/null @@ -1,60 +0,0 @@ -/* tcap.h -- termcap library functions and variables. */ - -/* Copyright (C) 1996 Free Software Foundation, Inc. - - This file contains the Readline Library (the Library), a set of - routines for providing Emacs style line input to programs that ask - for it. - - The Library is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - The Library is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#if !defined (_RLTCAP_H_) -#define _RLTCAP_H_ - -#if defined (HAVE_CONFIG_H) -# include "config.h" -#endif - -#if defined (HAVE_TERMCAP_H) -# if defined (__linux__) && !defined (SPEED_T_IN_SYS_TYPES) -# include "rltty.h" -# endif -# include -#else - -/* On Solaris2, sys/types.h #includes sys/reg.h, which #defines PC. - Unfortunately, PC is a global variable used by the termcap library. */ -#ifdef PC -# undef PC -#endif - -extern char PC; -extern char *UP, *BC; - -extern short ospeed; - -extern int tgetent (); -extern int tgetflag (); -extern int tgetnum (); -extern char *tgetstr (); - -extern int tputs (); - -extern char *tgoto (); - -#endif /* HAVE_TERMCAP_H */ - -#endif /* !_RLTCAP_H_ */ diff --git a/dep/src/readline/src/terminal.c b/dep/src/readline/src/terminal.c deleted file mode 100644 index faaa7887ab6..00000000000 --- a/dep/src/readline/src/terminal.c +++ /dev/null @@ -1,840 +0,0 @@ -/* terminal.c -- controlling the terminal with termcap. */ - -/* Copyright (C) 1996 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ -#define READLINE_LIBRARY - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#include -#include "posixstat.h" -#include -#if defined (HAVE_SYS_FILE_H) -# include -#endif /* HAVE_SYS_FILE_H */ - -#if defined (HAVE_UNISTD_H) -# include -#endif /* HAVE_UNISTD_H */ - -#if defined (HAVE_STDLIB_H) -# include -#else -# include "ansi_stdlib.h" -#endif /* HAVE_STDLIB_H */ - -#if defined (HAVE_LOCALE_H) -# include -#endif - -#include - -/* System-specific feature definitions and include files. */ -#include "rldefs.h" - -#if defined (_WIN32) -# define WIN32_LEAN_AND_MEAN 1 -# include -extern int haveConsole; /* imported from rltty.c */ -extern HANDLE hStdout, hStdin; -extern COORD rlScreenEnd; -extern int rlScreenMax; -#else /* !_WIN32 */ -#if defined (GWINSZ_IN_SYS_IOCTL) && !defined (TIOCGWINSZ) -# include -#endif /* GWINSZ_IN_SYS_IOCTL && !TIOCGWINSZ */ -#endif /* !_WIN32 */ - -#ifdef __MSDOS__ -# include -#endif - -#include "rltty.h" -#include "tcap.h" - -/* Some standard library routines. */ -#include "readline.h" -#include "history.h" - -#include "rlprivate.h" -#include "rlshell.h" -#include "xmalloc.h" - -#define CUSTOM_REDISPLAY_FUNC() (rl_redisplay_function != rl_redisplay) -#define CUSTOM_INPUT_FUNC() (rl_getc_function != rl_getc) - -/* **************************************************************** */ -/* */ -/* Terminal and Termcap */ -/* */ -/* **************************************************************** */ - -#if !defined (__MSDOS__) && !defined (_WIN32) -static char *term_buffer = (char *)NULL; -static char *term_string_buffer = (char *)NULL; - -/* Non-zero means this terminal can't really do anything. */ -static int dumb_term; -#endif /* !__MSDOS__ && !_WIN32 */ - -static int tcap_initialized; - -#if !defined (__linux__) -# if defined (__EMX__) || defined (NEED_EXTERN_PC) -extern -# endif /* __EMX__ || NEED_EXTERN_PC */ -char PC, *BC, *UP; -#endif /* __linux__ */ - -/* Some strings to control terminal actions. These are output by tputs (). */ -char *_rl_term_clreol; -char *_rl_term_clrpag; -char *_rl_term_cr; -char *_rl_term_backspace; -char *_rl_term_goto; -char *_rl_term_pc; - -/* Non-zero if we determine that the terminal can do character insertion. */ -int _rl_terminal_can_insert = 0; - -/* How to insert characters. */ -char *_rl_term_im; -char *_rl_term_ei; -char *_rl_term_ic; -char *_rl_term_ip; -char *_rl_term_IC; - -/* How to delete characters. */ -char *_rl_term_dc; -char *_rl_term_DC; - -#if defined (HACK_TERMCAP_MOTION) -char *_rl_term_forward_char; -#endif /* HACK_TERMCAP_MOTION */ - -/* How to go up a line. */ -char *_rl_term_up; - -/* A visible bell; char if the terminal can be made to flash the screen. */ -static char *_rl_visible_bell; - -/* Non-zero means the terminal can auto-wrap lines. */ -int _rl_term_autowrap; - -/* Non-zero means that this terminal has a meta key. */ -static int term_has_meta; - -/* The sequences to write to turn on and off the meta key, if this - terminal has one. */ -static char *_rl_term_mm; -static char *_rl_term_mo; - -/* The key sequences output by the arrow keys, if this terminal has any. */ -static char *_rl_term_ku; -static char *_rl_term_kd; -static char *_rl_term_kr; -static char *_rl_term_kl; - -/* How to initialize and reset the arrow keys, if this terminal has any. */ -static char *_rl_term_ks; -static char *_rl_term_ke; - -/* The key sequences sent by the Home and End keys, if any. */ -static char *_rl_term_kh; -static char *_rl_term_kH; -static char *_rl_term_at7; /* @7 */ - -/* Insert key */ -static char *_rl_term_kI; - -/* Cursor control */ -static char *_rl_term_vs; /* very visible */ -static char *_rl_term_ve; /* normal */ - -static void bind_termcap_arrow_keys PARAMS((Keymap)); - -/* Variables that hold the screen dimensions, used by the display code. */ -int _rl_screenwidth, _rl_screenheight, _rl_screenchars; - -/* Non-zero means the user wants to enable the keypad. */ -int _rl_enable_keypad; - -/* Non-zero means the user wants to enable a meta key. */ -int _rl_enable_meta = 1; - -#if defined (__EMX__) -static void -_emx_get_screensize (swp, shp) - int *swp, *shp; -{ - int sz[2]; - - _scrsize (sz); - - if (swp) - *swp = sz[0]; - if (shp) - *shp = sz[1]; -} -#endif - -/* Get readline's idea of the screen size. TTY is a file descriptor open - to the terminal. If IGNORE_ENV is true, we do not pay attention to the - values of $LINES and $COLUMNS. The tests for TERM_STRING_BUFFER being - non-null serve to check whether or not we have initialized termcap. */ -#if !defined (_WIN32) -void -_rl_get_screen_size (tty, ignore_env) - int tty, ignore_env; -{ - char *ss; -#if defined (TIOCGWINSZ) - struct winsize window_size; -#endif /* TIOCGWINSZ */ - -#if defined (TIOCGWINSZ) - if (ioctl (tty, TIOCGWINSZ, &window_size) == 0) - { - _rl_screenwidth = (int) window_size.ws_col; - _rl_screenheight = (int) window_size.ws_row; - } -#endif /* TIOCGWINSZ */ - -#if defined (__EMX__) - _emx_get_screensize (&_rl_screenwidth, &_rl_screenheight); -#endif - - /* Environment variable COLUMNS overrides setting of "co" if IGNORE_ENV - is unset. */ - if (_rl_screenwidth <= 0) - { - if (ignore_env == 0 && (ss = sh_get_env_value ("COLUMNS"))) - _rl_screenwidth = atoi (ss); - -#if defined (__DJGPP__) - if (_rl_screenwidth <= 0) - _rl_screenwidth = ScreenCols (); -#else - if (_rl_screenwidth <= 0 && term_string_buffer) - _rl_screenwidth = tgetnum ("co"); -#endif - } - - /* Environment variable LINES overrides setting of "li" if IGNORE_ENV - is unset. */ - if (_rl_screenheight <= 0) - { - if (ignore_env == 0 && (ss = sh_get_env_value ("LINES"))) - _rl_screenheight = atoi (ss); - -#if defined (__DJGPP__) - if (_rl_screenheight <= 0) - _rl_screenheight = ScreenRows (); -#else - if (_rl_screenheight <= 0 && term_string_buffer) - _rl_screenheight = tgetnum ("li"); -#endif - } - - /* If all else fails, default to 80x24 terminal. */ - if (_rl_screenwidth <= 1) - _rl_screenwidth = 80; - - if (_rl_screenheight <= 0) - _rl_screenheight = 24; - - /* If we're being compiled as part of bash, set the environment - variables $LINES and $COLUMNS to new values. Otherwise, just - do a pair of putenv () or setenv () calls. */ - sh_set_lines_and_columns (_rl_screenheight, _rl_screenwidth); - - if (_rl_term_autowrap == 0) - _rl_screenwidth--; - - _rl_screenchars = _rl_screenwidth * _rl_screenheight; -} - -#else /* _WIN32*/ - -void -_rl_get_screen_size (tty, ignore_env) - int tty, ignore_env; -{ - CONSOLE_SCREEN_BUFFER_INFO csbi; - - if ( (haveConsole & FOR_OUTPUT) && - GetConsoleScreenBufferInfo(hStdout, &csbi) ) - { - _rl_screenwidth = csbi.dwSize.X; - _rl_screenheight = csbi.dwSize.Y; - } - else - { - _rl_screenwidth = 80; - _rl_screenheight = 24; - } - _rl_screenchars = _rl_screenwidth * _rl_screenheight; -} -#endif /* _WIN32 */ - -void -_rl_set_screen_size (rows, cols) - int rows, cols; -{ - if (rows == 0 || cols == 0) - return; - - _rl_screenheight = rows; - _rl_screenwidth = cols; - - if (_rl_term_autowrap == 0) - _rl_screenwidth--; - - _rl_screenchars = _rl_screenwidth * _rl_screenheight; -} - -void -rl_set_screen_size (rows, cols) - int rows, cols; -{ - _rl_set_screen_size (rows, cols); -} - -void -rl_get_screen_size (rows, cols) - int *rows, *cols; -{ - if (rows) - *rows = _rl_screenheight; - if (cols) - *cols = _rl_screenwidth; -} - -void -rl_resize_terminal () -{ - if (readline_echoing_p) - { - _rl_get_screen_size (fileno (rl_instream), 1); - if (CUSTOM_REDISPLAY_FUNC ()) - rl_forced_update_display (); - else - _rl_redisplay_after_sigwinch (); - } -} - -#if !defined (_WIN32) -struct _tc_string { - const char *tc_var; - char **tc_value; -}; - -/* This should be kept sorted, just in case we decide to change the - search algorithm to something smarter. */ -static struct _tc_string tc_strings[] = -{ - { "@7", &_rl_term_at7 }, - { "DC", &_rl_term_DC }, - { "IC", &_rl_term_IC }, - { "ce", &_rl_term_clreol }, - { "cl", &_rl_term_clrpag }, - { "cr", &_rl_term_cr }, - { "dc", &_rl_term_dc }, - { "ei", &_rl_term_ei }, - { "ic", &_rl_term_ic }, - { "im", &_rl_term_im }, - { "kH", &_rl_term_kH }, /* home down ?? */ - { "kI", &_rl_term_kI }, /* insert */ - { "kd", &_rl_term_kd }, - { "ke", &_rl_term_ke }, /* end keypad mode */ - { "kh", &_rl_term_kh }, /* home */ - { "kl", &_rl_term_kl }, - { "kr", &_rl_term_kr }, - { "ks", &_rl_term_ks }, /* start keypad mode */ - { "ku", &_rl_term_ku }, - { "le", &_rl_term_backspace }, - { "mm", &_rl_term_mm }, - { "mo", &_rl_term_mo }, -#if defined (HACK_TERMCAP_MOTION) - { "nd", &_rl_term_forward_char }, -#endif - { "pc", &_rl_term_pc }, - { "up", &_rl_term_up }, - { "vb", &_rl_visible_bell }, - { "vs", &_rl_term_vs }, - { "ve", &_rl_term_ve }, -}; - -#define NUM_TC_STRINGS (sizeof (tc_strings) / sizeof (struct _tc_string)) - -/* Read the desired terminal capability strings into BP. The capabilities - are described in the TC_STRINGS table. */ -static void -get_term_capabilities (bp) - char **bp; -{ -#if !defined (__DJGPP__) /* XXX - doesn't DJGPP have a termcap library? */ - register int i; - - for (i = 0; i < NUM_TC_STRINGS; i++) - *(tc_strings[i].tc_value) = tgetstr ((char *)tc_strings[i].tc_var, bp); -#endif - tcap_initialized = 1; -} -#endif /* !_WIN32 */ - -int -_rl_init_terminal_io (terminal_name) - const char *terminal_name; -{ -#if defined (_WIN32) - _rl_term_cr = "\r"; /* any value != 0 */ - _rl_term_im = _rl_term_ei = _rl_term_ic = _rl_term_IC = (char *)NULL; /* !! we emulate insertion */ - _rl_term_up = "y"; /* any value != 0 */ - _rl_term_dc = _rl_term_DC = (char *)NULL; /* !! we emulate deletion */ - _rl_visible_bell = (char *)NULL; - - _rl_get_screen_size (0, 1); - - /* Let Windows handle meta keys! */ - term_has_meta = 0; - _rl_term_mm = _rl_term_mo = (char *)NULL; - - /* It probably has arrow keys, but I don't know what they are. */ - _rl_term_ku = _rl_term_kd = _rl_term_kr = _rl_term_kl = (char *)NULL; - -#if defined (HACK_TERMCAP_MOTION) - _rl_term_forward_char = (char *)NULL; -#endif /* HACK_TERMCAP_MOTION */ - - _rl_terminal_can_insert = 0; - _rl_term_autowrap = 1; - -#else /* !_WIN32 */ - - const char *term; - char *buffer; - int tty, tgetent_ret; - - term = terminal_name ? terminal_name : sh_get_env_value ("TERM"); - _rl_term_clrpag = _rl_term_cr = _rl_term_clreol = (char *)NULL; - tty = rl_instream ? fileno (rl_instream) : 0; - _rl_screenwidth = _rl_screenheight = 0; - - if (term == 0) - term = "dumb"; - -#ifdef __MSDOS__ - _rl_term_im = _rl_term_ei = _rl_term_ic = _rl_term_IC = (char *)NULL; - _rl_term_up = _rl_term_dc = _rl_term_DC = _rl_visible_bell = (char *)NULL; - _rl_term_ku = _rl_term_kd = _rl_term_kl = _rl_term_kr = (char *)NULL; - _rl_term_mm = _rl_term_mo = (char *)NULL; - _rl_terminal_can_insert = term_has_meta = _rl_term_autowrap = 0; - _rl_term_cr = "\r"; - _rl_term_clreol = _rl_term_clrpag = _rl_term_backspace = (char *)NULL; - _rl_term_goto = _rl_term_pc = _rl_term_ip = (char *)NULL; - _rl_term_ks = _rl_term_ke =_rl_term_vs = _rl_term_ve = (char *)NULL; - _rl_term_kh = _rl_term_kH = _rl_term_at7 = _rl_term_kI = (char *)NULL; -#if defined(HACK_TERMCAP_MOTION) - _rl_term_forward_char = (char *)NULL; -#endif - - _rl_get_screen_size (tty, 0); -#else /* !__MSDOS__ */ - /* I've separated this out for later work on not calling tgetent at all - if the calling application has supplied a custom redisplay function, - (and possibly if the application has supplied a custom input function). */ - if (CUSTOM_REDISPLAY_FUNC()) - { - tgetent_ret = -1; - } - else - { - if (term_string_buffer == 0) - term_string_buffer = (char *)xmalloc(2032); - - if (term_buffer == 0) - term_buffer = (char *)xmalloc(4080); - - buffer = term_string_buffer; - - tgetent_ret = tgetent (term_buffer, term); - } - - if (tgetent_ret <= 0) - { - FREE (term_string_buffer); - FREE (term_buffer); - buffer = term_buffer = term_string_buffer = (char *)NULL; - - _rl_term_autowrap = 0; /* used by _rl_get_screen_size */ - -#if defined (__EMX__) - _emx_get_screensize (&_rl_screenwidth, &_rl_screenheight); - _rl_screenwidth--; -#else /* !__EMX__ */ - _rl_get_screen_size (tty, 0); -#endif /* !__EMX__ */ - - /* Defaults. */ - if (_rl_screenwidth <= 0 || _rl_screenheight <= 0) - { - _rl_screenwidth = 79; - _rl_screenheight = 24; - } - - /* Everything below here is used by the redisplay code (tputs). */ - _rl_screenchars = _rl_screenwidth * _rl_screenheight; - _rl_term_cr = "\r"; - _rl_term_im = _rl_term_ei = _rl_term_ic = _rl_term_IC = (char *)NULL; - _rl_term_up = _rl_term_dc = _rl_term_DC = _rl_visible_bell = (char *)NULL; - _rl_term_ku = _rl_term_kd = _rl_term_kl = _rl_term_kr = (char *)NULL; - _rl_term_kh = _rl_term_kH = _rl_term_kI = (char *)NULL; - _rl_term_ks = _rl_term_ke = _rl_term_at7 = (char *)NULL; - _rl_term_mm = _rl_term_mo = (char *)NULL; - _rl_term_ve = _rl_term_vs = (char *)NULL; -#if defined (HACK_TERMCAP_MOTION) - term_forward_char = (char *)NULL; -#endif - _rl_terminal_can_insert = term_has_meta = 0; - - /* Reasonable defaults for tgoto(). Readline currently only uses - tgoto if _rl_term_IC or _rl_term_DC is defined, but just in case we - change that later... */ - PC = '\0'; - BC = _rl_term_backspace = "\b"; - UP = _rl_term_up; - - return 0; - } - - get_term_capabilities (&buffer); - - /* Set up the variables that the termcap library expects the application - to provide. */ - PC = _rl_term_pc ? *_rl_term_pc : 0; - BC = _rl_term_backspace; - UP = _rl_term_up; - - if (!_rl_term_cr) - _rl_term_cr = "\r"; - - _rl_term_autowrap = tgetflag ("am") && tgetflag ("xn"); - - _rl_get_screen_size (tty, 0); - - /* "An application program can assume that the terminal can do - character insertion if *any one of* the capabilities `IC', - `im', `ic' or `ip' is provided." But we can't do anything if - only `ip' is provided, so... */ - _rl_terminal_can_insert = (_rl_term_IC || _rl_term_im || _rl_term_ic); - - /* Check to see if this terminal has a meta key and clear the capability - variables if there is none. */ - term_has_meta = (tgetflag ("km") || tgetflag ("MT")); - if (!term_has_meta) - _rl_term_mm = _rl_term_mo = (char *)NULL; - -#endif /* !__MSDOS__ */ - - /* Attempt to find and bind the arrow keys. Do not override already - bound keys in an overzealous attempt, however. */ - - bind_termcap_arrow_keys (emacs_standard_keymap); - -#if defined (VI_MODE) - bind_termcap_arrow_keys (vi_movement_keymap); - bind_termcap_arrow_keys (vi_insertion_keymap); -#endif /* VI_MODE */ - -#endif /* !_WIN32 */ - - return 0; -} - -#if !defined (_WIN32) -/* Bind the arrow key sequences from the termcap description in MAP. */ -static void -bind_termcap_arrow_keys (map) - Keymap map; -{ - Keymap xkeymap; - - xkeymap = _rl_keymap; - _rl_keymap = map; - - rl_bind_keyseq_if_unbound (_rl_term_ku, rl_get_previous_history); - rl_bind_keyseq_if_unbound (_rl_term_kd, rl_get_next_history); - rl_bind_keyseq_if_unbound (_rl_term_kr, rl_forward_char); - rl_bind_keyseq_if_unbound (_rl_term_kl, rl_backward_char); - - rl_bind_keyseq_if_unbound (_rl_term_kh, rl_beg_of_line); /* Home */ - rl_bind_keyseq_if_unbound (_rl_term_at7, rl_end_of_line); /* End */ - - _rl_keymap = xkeymap; -} - -char * -rl_get_termcap (cap) - const char *cap; -{ - register int i; - - if (tcap_initialized == 0) - return ((char *)NULL); - for (i = 0; i < NUM_TC_STRINGS; i++) - { - if (tc_strings[i].tc_var[0] == cap[0] && strcmp (tc_strings[i].tc_var, cap) == 0) - return *(tc_strings[i].tc_value); - } - return ((char *)NULL); -} -#endif /* !_WIN32 */ - -/* Re-initialize the terminal considering that the TERM/TERMCAP variable - has changed. */ -int -rl_reset_terminal (terminal_name) - const char *terminal_name; -{ - _rl_init_terminal_io (terminal_name); - return 0; -} - -#if !defined (_WIN32) -/* A function for the use of tputs () */ -#ifdef _MINIX -void -_rl_output_character_function (c) - int c; -{ - putc (c, _rl_out_stream); -} -#else /* !_MINIX */ -int -_rl_output_character_function (c) - int c; -{ - return putc (c, _rl_out_stream); -} -#endif /* !_MINIX */ - -/* Write COUNT characters from STRING to the output stream. */ -void -_rl_output_some_chars (string, count) - const char *string; - int count; -{ - fwrite (string, 1, count, _rl_out_stream); -} - -/* Move the cursor back. */ -int -_rl_backspace (count) - int count; -{ - register int i; - -#ifndef __MSDOS__ - if (_rl_term_backspace) - for (i = 0; i < count; i++) - tputs (_rl_term_backspace, 1, _rl_output_character_function); - else -#endif - for (i = 0; i < count; i++) - putc ('\b', _rl_out_stream); - return 0; -} - -/* Move to the start of the next line. */ -int -rl_crlf () -{ -#if defined (NEW_TTY_DRIVER) - if (_rl_term_cr) - tputs (_rl_term_cr, 1, _rl_output_character_function); -#endif /* NEW_TTY_DRIVER */ - putc ('\n', _rl_out_stream); - return 0; -} - -/* Ring the terminal bell. */ -int -rl_ding () -{ - if (readline_echoing_p) - { - switch (_rl_bell_preference) - { - case NO_BELL: - default: - break; - case VISIBLE_BELL: -#ifdef __MSDOS__ - ScreenVisualBell (); - break; -#else - if (_rl_visible_bell) - { - tputs (_rl_visible_bell, 1, _rl_output_character_function); - break; - } -#endif - /* FALLTHROUGH */ - case AUDIBLE_BELL: - fprintf (stderr, "\007"); - fflush (stderr); - break; - } - return (0); - } - return (-1); -} - -#else /* _WIN32 */ - -/* Write COUNT characters from STRING to the output stream. */ -void -_rl_output_some_chars (string, count) - const char *string; - int count; -{ - CONSOLE_SCREEN_BUFFER_INFO csbi; - fwrite (string, 1, count, _rl_out_stream); - if ( (haveConsole & FOR_OUTPUT) && GetConsoleScreenBufferInfo(hStdout, &csbi) ) - { - int linear_pos = (int)csbi.dwCursorPosition.Y * (int)csbi.dwSize.X - + (int)csbi.dwCursorPosition.X; - if (linear_pos > rlScreenMax) - { - rlScreenEnd = csbi.dwCursorPosition; - rlScreenMax = linear_pos; - } - } -} - -/* This is used to collect all putc output */ -int -_rl_output_character_function (c) - int c; -{ - _rl_output_some_chars ((char *)&c, 1); - return 1; -} - -/* Move the cursor back. */ -int -_rl_backspace (count) - int count; -{ - CONSOLE_SCREEN_BUFFER_INFO csbi; - - if ( (haveConsole & FOR_OUTPUT) && GetConsoleScreenBufferInfo(hStdout, &csbi) ) - { - while (count > csbi.dwCursorPosition.X) - { - --csbi.dwCursorPosition.Y; - count -= csbi.dwCursorPosition.X + 1; - csbi.dwCursorPosition.X = csbi.dwSize.X - 1; - } - csbi.dwCursorPosition.X -= count; - SetConsoleCursorPosition(hStdout, csbi.dwCursorPosition); - } - return 0; -} - -/* Move to the start of the next line. */ -int -rl_crlf () -{ - _rl_output_some_chars ("\n", 1); - return 0; -} - -/* Ring the terminal bell. */ -int -rl_ding () -{ - if (readline_echoing_p) - { - if (_rl_bell_preference != NO_BELL) - MessageBeep(MB_OK); - return (0); - } - return (-1); -} -#endif /* _WIN32 */ - -/* **************************************************************** */ -/* */ -/* Controlling the Meta Key and Keypad */ -/* */ -/* **************************************************************** */ - -void -_rl_enable_meta_key () -{ -#if !defined (__DJGPP__) && !defined (_WIN32) - if (term_has_meta && _rl_term_mm) - tputs (_rl_term_mm, 1, _rl_output_character_function); -#endif -} - -void -_rl_control_keypad (on) - int on; -{ -#if !defined (__DJGPP__) && !defined (_WIN32) - if (on && _rl_term_ks) - tputs (_rl_term_ks, 1, _rl_output_character_function); - else if (!on && _rl_term_ke) - tputs (_rl_term_ke, 1, _rl_output_character_function); -#endif -} - -/* **************************************************************** */ -/* */ -/* Controlling the Cursor */ -/* */ -/* **************************************************************** */ - -/* Set the cursor appropriately depending on IM, which is one of the - insert modes (insert or overwrite). Insert mode gets the normal - cursor. Overwrite mode gets a very visible cursor. Only does - anything if we have both capabilities. */ -void -_rl_set_cursor (im, force) - int im, force; -{ -#if !defined (__MSDOS__) && !defined (_WIN32) - if (_rl_term_ve && _rl_term_vs) - { - if (force || im != rl_insert_mode) - { - if (im == RL_IM_OVERWRITE) - tputs (_rl_term_vs, 1, _rl_output_character_function); - else - tputs (_rl_term_ve, 1, _rl_output_character_function); - } - } -#endif -} diff --git a/dep/src/readline/src/text.c b/dep/src/readline/src/text.c deleted file mode 100644 index 50885b04ecf..00000000000 --- a/dep/src/readline/src/text.c +++ /dev/null @@ -1,1547 +0,0 @@ -/* text.c -- text handling commands for readline. */ - -/* Copyright (C) 1987-2004 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ -#define READLINE_LIBRARY - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#if defined (HAVE_UNISTD_H) -# include -#endif /* HAVE_UNISTD_H */ - -#if defined (HAVE_STDLIB_H) -# include -#else -# include "ansi_stdlib.h" -#endif /* HAVE_STDLIB_H */ - -#if defined (HAVE_LOCALE_H) -# include -#endif - -#include - -/* System-specific feature definitions and include files. */ -#include "rldefs.h" -#include "rlmbutil.h" - -#if defined (__EMX__) -# define INCL_DOSPROCESS -# include -#endif /* __EMX__ */ - -/* Some standard library routines. */ -#include "readline.h" -#include "history.h" - -#include "rlprivate.h" -#include "rlshell.h" -#include "xmalloc.h" - -/* Forward declarations. */ -static int rl_change_case PARAMS((int, int)); -static int _rl_char_search PARAMS((int, int, int)); - -/* **************************************************************** */ -/* */ -/* Insert and Delete */ -/* */ -/* **************************************************************** */ - -/* Insert a string of text into the line at point. This is the only - way that you should do insertion. _rl_insert_char () calls this - function. Returns the number of characters inserted. */ -int -rl_insert_text (string) - const char *string; -{ - register int i, l; - - l = (string && *string) ? (int)strlen (string) : 0; - if (l == 0) - return 0; - - if (rl_end + l >= rl_line_buffer_len) - rl_extend_line_buffer (rl_end + l); - - for (i = rl_end; i >= rl_point; i--) - rl_line_buffer[i + l] = rl_line_buffer[i]; - strncpy (rl_line_buffer + rl_point, string, l); - - /* Remember how to undo this if we aren't undoing something. */ - if (_rl_doing_an_undo == 0) - { - /* If possible and desirable, concatenate the undos. */ - if ((l == 1) && - rl_undo_list && - (rl_undo_list->what == UNDO_INSERT) && - (rl_undo_list->end == rl_point) && - (rl_undo_list->end - rl_undo_list->start < 20)) - rl_undo_list->end++; - else - rl_add_undo (UNDO_INSERT, rl_point, rl_point + l, (char *)NULL); - } - rl_point += l; - rl_end += l; - rl_line_buffer[rl_end] = '\0'; - return l; -} - -/* Delete the string between FROM and TO. FROM is inclusive, TO is not. - Returns the number of characters deleted. */ -int -rl_delete_text (from, to) - int from, to; -{ - register char *text; - register int diff, i; - - /* Fix it if the caller is confused. */ - if (from > to) - SWAP (from, to); - - /* fix boundaries */ - if (to > rl_end) - { - to = rl_end; - if (from > to) - from = to; - } - if (from < 0) - from = 0; - - text = rl_copy_text (from, to); - - /* Some versions of strncpy() can't handle overlapping arguments. */ - diff = to - from; - for (i = from; i < rl_end - diff; i++) - rl_line_buffer[i] = rl_line_buffer[i + diff]; - - /* Remember how to undo this delete. */ - if (_rl_doing_an_undo == 0) - rl_add_undo (UNDO_DELETE, from, to, text); - else - free (text); - - rl_end -= diff; - rl_line_buffer[rl_end] = '\0'; - return (diff); -} - -/* Fix up point so that it is within the line boundaries after killing - text. If FIX_MARK_TOO is non-zero, the mark is forced within line - boundaries also. */ - -#define _RL_FIX_POINT(x) \ - do { \ - if (x > rl_end) \ - x = rl_end; \ - else if (x < 0) \ - x = 0; \ - } while (0) - -void -_rl_fix_point (fix_mark_too) - int fix_mark_too; -{ - _RL_FIX_POINT (rl_point); - if (fix_mark_too) - _RL_FIX_POINT (rl_mark); -} -#undef _RL_FIX_POINT - -/* Replace the contents of the line buffer between START and END with - TEXT. The operation is undoable. To replace the entire line in an - undoable mode, use _rl_replace_text(text, 0, rl_end); */ -int -_rl_replace_text (text, start, end) - const char *text; - int start, end; -{ - int n; - - rl_begin_undo_group (); - rl_delete_text (start, end + 1); - rl_point = start; - n = rl_insert_text (text); - rl_end_undo_group (); - - return n; -} - -/* Replace the current line buffer contents with TEXT. If CLEAR_UNDO is - non-zero, we free the current undo list. */ -void -rl_replace_line (text, clear_undo) - const char *text; - int clear_undo; -{ - int len; - - len = (int)strlen (text); - if (len >= rl_line_buffer_len) - rl_extend_line_buffer (len); - strcpy (rl_line_buffer, text); - rl_end = len; - - if (clear_undo) - rl_free_undo_list (); - - _rl_fix_point (1); -} - -/* **************************************************************** */ -/* */ -/* Readline character functions */ -/* */ -/* **************************************************************** */ - -/* This is not a gap editor, just a stupid line input routine. No hair - is involved in writing any of the functions, and none should be. */ - -/* Note that: - - rl_end is the place in the string that we would place '\0'; - i.e., it is always safe to place '\0' there. - - rl_point is the place in the string where the cursor is. Sometimes - this is the same as rl_end. - - Any command that is called interactively receives two arguments. - The first is a count: the numeric arg pased to this command. - The second is the key which invoked this command. -*/ - -/* **************************************************************** */ -/* */ -/* Movement Commands */ -/* */ -/* **************************************************************** */ - -/* Note that if you `optimize' the display for these functions, you cannot - use said functions in other functions which do not do optimizing display. - I.e., you will have to update the data base for rl_redisplay, and you - might as well let rl_redisplay do that job. */ - -/* Move forward COUNT bytes. */ -int -rl_forward_byte (count, key) - int count, key; -{ - if (count < 0) - return (rl_backward_byte (-count, key)); - - if (count > 0) - { - int end = rl_point + count; -#if defined (VI_MODE) - int lend = rl_end > 0 ? rl_end - (rl_editing_mode == vi_mode) : rl_end; -#else - int lend = rl_end; -#endif - - if (end > lend) - { - rl_point = lend; - rl_ding (); - } - else - rl_point = end; - } - - if (rl_end < 0) - rl_end = 0; - - return 0; -} - -#if defined (HANDLE_MULTIBYTE) -/* Move forward COUNT characters. */ -int -rl_forward_char (count, key) - int count, key; -{ - int point; - - if (MB_CUR_MAX == 1 || rl_byte_oriented) - return (rl_forward_byte (count, key)); - - if (count < 0) - return (rl_backward_char (-count, key)); - - if (count > 0) - { - point = _rl_find_next_mbchar (rl_line_buffer, rl_point, count, MB_FIND_NONZERO); - -#if defined (VI_MODE) - if (rl_end <= point && rl_editing_mode == vi_mode) - point = _rl_find_prev_mbchar (rl_line_buffer, rl_end, MB_FIND_NONZERO); -#endif - - if (rl_point == point) - rl_ding (); - - rl_point = point; - - if (rl_end < 0) - rl_end = 0; - } - - return 0; -} -#else /* !HANDLE_MULTIBYTE */ -int -rl_forward_char (count, key) - int count, key; -{ - return (rl_forward_byte (count, key)); -} -#endif /* !HANDLE_MULTIBYTE */ - -/* Backwards compatibility. */ -int -rl_forward (count, key) - int count, key; -{ - return (rl_forward_char (count, key)); -} - -/* Move backward COUNT bytes. */ -int -rl_backward_byte (count, key) - int count, key; -{ - if (count < 0) - return (rl_forward_byte (-count, key)); - - if (count > 0) - { - if (rl_point < count) - { - rl_point = 0; - rl_ding (); - } - else - rl_point -= count; - } - - if (rl_point < 0) - rl_point = 0; - - return 0; -} - -#if defined (HANDLE_MULTIBYTE) -/* Move backward COUNT characters. */ -int -rl_backward_char (count, key) - int count, key; -{ - int point; - - if (MB_CUR_MAX == 1 || rl_byte_oriented) - return (rl_backward_byte (count, key)); - - if (count < 0) - return (rl_forward_char (-count, key)); - - if (count > 0) - { - point = rl_point; - - while (count > 0 && point > 0) - { - point = _rl_find_prev_mbchar (rl_line_buffer, point, MB_FIND_NONZERO); - count--; - } - if (count > 0) - { - rl_point = 0; - rl_ding (); - } - else - rl_point = point; - } - - return 0; -} -#else -int -rl_backward_char (count, key) - int count, key; -{ - return (rl_backward_byte (count, key)); -} -#endif - -/* Backwards compatibility. */ -int -rl_backward (count, key) - int count, key; -{ - return (rl_backward_char (count, key)); -} - -/* Move to the beginning of the line. */ -int -rl_beg_of_line (count, key) - int count, key; -{ - rl_point = 0; - return 0; -} - -/* Move to the end of the line. */ -int -rl_end_of_line (count, key) - int count, key; -{ - rl_point = rl_end; - return 0; -} - -/* XXX - these might need changes for multibyte characters */ -/* Move forward a word. We do what Emacs does. */ -int -rl_forward_word (count, key) - int count, key; -{ - int c; - - if (count < 0) - return (rl_backward_word (-count, key)); - - while (count) - { - if (rl_point == rl_end) - return 0; - - /* If we are not in a word, move forward until we are in one. - Then, move forward until we hit a non-alphabetic character. */ - c = rl_line_buffer[rl_point]; - if (rl_alphabetic (c) == 0) - { - while (++rl_point < rl_end) - { - c = rl_line_buffer[rl_point]; - if (rl_alphabetic (c)) - break; - } - } - - if (rl_point == rl_end) - return 0; - - while (++rl_point < rl_end) - { - c = rl_line_buffer[rl_point]; - if (rl_alphabetic (c) == 0) - break; - } - --count; - } - - return 0; -} - -/* Move backward a word. We do what Emacs does. */ -int -rl_backward_word (count, key) - int count, key; -{ - int c; - - if (count < 0) - return (rl_forward_word (-count, key)); - - while (count) - { - if (!rl_point) - return 0; - - /* Like rl_forward_word (), except that we look at the characters - just before point. */ - - c = rl_line_buffer[rl_point - 1]; - if (rl_alphabetic (c) == 0) - { - while (--rl_point) - { - c = rl_line_buffer[rl_point - 1]; - if (rl_alphabetic (c)) - break; - } - } - - while (rl_point) - { - c = rl_line_buffer[rl_point - 1]; - if (rl_alphabetic (c) == 0) - break; - else - --rl_point; - } - - --count; - } - - return 0; -} - -/* Clear the current line. Numeric argument to C-l does this. */ -int -rl_refresh_line (ignore1, ignore2) - int ignore1, ignore2; -{ - int curr_line; - - curr_line = _rl_current_display_line (); - - _rl_move_vert (curr_line); - _rl_move_cursor_relative (0, rl_line_buffer); /* XXX is this right */ - - _rl_clear_to_eol (0); /* arg of 0 means to not use spaces */ - - rl_forced_update_display (); - rl_display_fixed = 1; - - return 0; -} - -/* C-l typed to a line without quoting clears the screen, and then reprints - the prompt and the current input line. Given a numeric arg, redraw only - the current line. */ -int -rl_clear_screen (count, key) - int count, key; -{ - if (rl_explicit_arg) - { - rl_refresh_line (count, key); - return 0; - } - - _rl_clear_screen (); /* calls termcap function to clear screen */ - rl_forced_update_display (); - rl_display_fixed = 1; - - return 0; -} - -int -rl_arrow_keys (count, c) - int count, c; -{ - int ch; - - RL_SETSTATE(RL_STATE_MOREINPUT); - ch = rl_read_key (); - RL_UNSETSTATE(RL_STATE_MOREINPUT); - - switch (_rl_to_upper (ch)) - { - case 'A': - rl_get_previous_history (count, ch); - break; - - case 'B': - rl_get_next_history (count, ch); - break; - - case 'C': - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - rl_forward_char (count, ch); - else - rl_forward_byte (count, ch); - break; - - case 'D': - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - rl_backward_char (count, ch); - else - rl_backward_byte (count, ch); - break; - - default: - rl_ding (); - } - - return 0; -} - -/* **************************************************************** */ -/* */ -/* Text commands */ -/* */ -/* **************************************************************** */ - -#ifdef HANDLE_MULTIBYTE -static char pending_bytes[MB_LEN_MAX]; -static int pending_bytes_length = 0; -static mbstate_t ps = {0}; -#endif - -/* Insert the character C at the current location, moving point forward. - If C introduces a multibyte sequence, we read the whole sequence and - then insert the multibyte char into the line buffer. */ -int -_rl_insert_char (count, c) - int count, c; -{ - register int i; - char *string; -#ifdef HANDLE_MULTIBYTE - int string_size; - char incoming[MB_LEN_MAX + 1]; - int incoming_length = 0; - mbstate_t ps_back; - static int stored_count = 0; -#endif - - if (count <= 0) - return 0; - -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX == 1 || rl_byte_oriented) - { - incoming[0] = c; - incoming[1] = '\0'; - incoming_length = 1; - } - else - { - wchar_t wc; - size_t ret; - - if (stored_count <= 0) - stored_count = count; - else - count = stored_count; - - ps_back = ps; - pending_bytes[pending_bytes_length++] = c; - ret = mbrtowc (&wc, pending_bytes, pending_bytes_length, &ps); - - if (ret == (size_t)-2) - { - /* Bytes too short to compose character, try to wait for next byte. - Restore the state of the byte sequence, because in this case the - effect of mbstate is undefined. */ - ps = ps_back; - return 1; - } - else if (ret == (size_t)-1) - { - /* Invalid byte sequence for the current locale. Treat first byte - as a single character. */ - incoming[0] = pending_bytes[0]; - incoming[1] = '\0'; - incoming_length = 1; - pending_bytes_length--; - memmove (pending_bytes, pending_bytes + 1, pending_bytes_length); - /* Clear the state of the byte sequence, because in this case the - effect of mbstate is undefined. */ - memset (&ps, 0, sizeof (mbstate_t)); - } - else if (ret == (size_t)0) - { - incoming[0] = '\0'; - incoming_length = 0; - pending_bytes_length--; - /* Clear the state of the byte sequence, because in this case the - effect of mbstate is undefined. */ - memset (&ps, 0, sizeof (mbstate_t)); - } - else - { - /* We successfully read a single multibyte character. */ - memcpy (incoming, pending_bytes, pending_bytes_length); - incoming[pending_bytes_length] = '\0'; - incoming_length = pending_bytes_length; - pending_bytes_length = 0; - } - } -#endif /* HANDLE_MULTIBYTE */ - - /* If we can optimize, then do it. But don't let people crash - readline because of extra large arguments. */ - if (count > 1 && count <= 1024) - { -#if defined (HANDLE_MULTIBYTE) - string_size = count * incoming_length; - string = (char *)xmalloc (1 + string_size); - - i = 0; - while (i < string_size) - { - strncpy (string + i, incoming, incoming_length); - i += incoming_length; - } - incoming_length = 0; - stored_count = 0; -#else /* !HANDLE_MULTIBYTE */ - string = (char *)xmalloc (1 + count); - - for (i = 0; i < count; i++) - string[i] = c; -#endif /* !HANDLE_MULTIBYTE */ - - string[i] = '\0'; - rl_insert_text (string); - free (string); - - return 0; - } - - if (count > 1024) - { - int decreaser; -#if defined (HANDLE_MULTIBYTE) - string_size = incoming_length * 1024; - string = (char *)xmalloc (1 + string_size); - - i = 0; - while (i < string_size) - { - strncpy (string + i, incoming, incoming_length); - i += incoming_length; - } - - while (count) - { - decreaser = (count > 1024) ? 1024 : count; - string[decreaser*incoming_length] = '\0'; - rl_insert_text (string); - count -= decreaser; - } - - free (string); - incoming_length = 0; - stored_count = 0; -#else /* !HANDLE_MULTIBYTE */ - char str[1024+1]; - - for (i = 0; i < 1024; i++) - str[i] = c; - - while (count) - { - decreaser = (count > 1024 ? 1024 : count); - str[decreaser] = '\0'; - rl_insert_text (str); - count -= decreaser; - } -#endif /* !HANDLE_MULTIBYTE */ - - return 0; - } - -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX == 1 || rl_byte_oriented) - { -#endif - /* We are inserting a single character. - If there is pending input, then make a string of all of the - pending characters that are bound to rl_insert, and insert - them all. */ - if (_rl_any_typein ()) - _rl_insert_typein (c); - else - { - /* Inserting a single character. */ - char str[2]; - - str[1] = '\0'; - str[0] = c; - rl_insert_text (str); - } -#if defined (HANDLE_MULTIBYTE) - } - else - { - rl_insert_text (incoming); - stored_count = 0; - } -#endif - - return 0; -} - -/* Overwrite the character at point (or next COUNT characters) with C. - If C introduces a multibyte character sequence, read the entire sequence - before starting the overwrite loop. */ -int -_rl_overwrite_char (count, c) - int count, c; -{ - int i; -#if defined (HANDLE_MULTIBYTE) - char mbkey[MB_LEN_MAX]; - int k; - - /* Read an entire multibyte character sequence to insert COUNT times. */ - if (count > 0 && MB_CUR_MAX > 1 && rl_byte_oriented == 0) - k = _rl_read_mbstring (c, mbkey, MB_LEN_MAX); -#endif - - rl_begin_undo_group (); - - for (i = 0; i < count; i++) - { -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - rl_insert_text (mbkey); - else -#endif - _rl_insert_char (1, c); - - if (rl_point < rl_end) - rl_delete (1, c); - } - - rl_end_undo_group (); - - return 0; -} - -int -rl_insert (count, c) - int count, c; -{ - return (rl_insert_mode == RL_IM_INSERT ? _rl_insert_char (count, c) - : _rl_overwrite_char (count, c)); -} - -/* Insert the next typed character verbatim. */ -int -rl_quoted_insert (count, key) - int count, key; -{ - int c; - -#if defined (HANDLE_SIGNALS) - _rl_disable_tty_signals (); -#endif - - RL_SETSTATE(RL_STATE_MOREINPUT); - c = rl_read_key (); - RL_UNSETSTATE(RL_STATE_MOREINPUT); - -#if defined (HANDLE_SIGNALS) - _rl_restore_tty_signals (); -#endif - - return (_rl_insert_char (count, c)); -} - -/* Insert a tab character. */ -int -rl_tab_insert (count, key) - int count, key; -{ - return (_rl_insert_char (count, '\t')); -} - -/* What to do when a NEWLINE is pressed. We accept the whole line. - KEY is the key that invoked this command. I guess it could have - meaning in the future. */ -int -rl_newline (count, key) - int count, key; -{ - rl_done = 1; - - if (_rl_history_preserve_point) - _rl_history_saved_point = (rl_point == rl_end) ? -1 : rl_point; - - RL_SETSTATE(RL_STATE_DONE); - -#if defined (VI_MODE) - if (rl_editing_mode == vi_mode) - { - _rl_vi_done_inserting (); - if (_rl_vi_textmod_command (_rl_vi_last_command) == 0) /* XXX */ - _rl_vi_reset_last (); - } -#endif /* VI_MODE */ - - /* If we've been asked to erase empty lines, suppress the final update, - since _rl_update_final calls rl_crlf(). */ - if (rl_erase_empty_line && rl_point == 0 && rl_end == 0) - return 0; - - if (readline_echoing_p) - _rl_update_final (); - return 0; -} - -/* What to do for some uppercase characters, like meta characters, - and some characters appearing in emacs_ctlx_keymap. This function - is just a stub, you bind keys to it and the code in _rl_dispatch () - is special cased. */ -int -rl_do_lowercase_version (ignore1, ignore2) - int ignore1, ignore2; -{ - return 0; -} - -/* This is different from what vi does, so the code's not shared. Emacs - rubout in overwrite mode has one oddity: it replaces a control - character that's displayed as two characters (^X) with two spaces. */ -int -_rl_overwrite_rubout (count, key) - int count, key; -{ - int opoint; - int i, l; - - if (rl_point == 0) - { - rl_ding (); - return 1; - } - - opoint = rl_point; - - /* L == number of spaces to insert */ - for (i = l = 0; i < count; i++) - { - rl_backward_char (1, key); - l += rl_character_len (rl_line_buffer[rl_point], rl_point); /* not exactly right */ - } - - rl_begin_undo_group (); - - if (count > 1 || rl_explicit_arg) - rl_kill_text (opoint, rl_point); - else - rl_delete_text (opoint, rl_point); - - /* Emacs puts point at the beginning of the sequence of spaces. */ - if (rl_point < rl_end) - { - opoint = rl_point; - _rl_insert_char (l, ' '); - rl_point = opoint; - } - - rl_end_undo_group (); - - return 0; -} - -/* Rubout the character behind point. */ -int -rl_rubout (count, key) - int count, key; -{ - if (count < 0) - return (rl_delete (-count, key)); - - if (!rl_point) - { - rl_ding (); - return -1; - } - - if (rl_insert_mode == RL_IM_OVERWRITE) - return (_rl_overwrite_rubout (count, key)); - - return (_rl_rubout_char (count, key)); -} - -int -_rl_rubout_char (count, key) - int count, key; -{ - int orig_point; - unsigned char c; - - /* Duplicated code because this is called from other parts of the library. */ - if (count < 0) - return (rl_delete (-count, key)); - - if (rl_point == 0) - { - rl_ding (); - return -1; - } - - if (count > 1 || rl_explicit_arg) - { - orig_point = rl_point; -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - rl_backward_char (count, key); - else -#endif - rl_backward_byte (count, key); - rl_kill_text (orig_point, rl_point); - } - else - { -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX == 1 || rl_byte_oriented) - { -#endif - c = rl_line_buffer[--rl_point]; - rl_delete_text (rl_point, rl_point + 1); -#if defined (HANDLE_MULTIBYTE) - } - else - { - int orig_point; - - orig_point = rl_point; - rl_point = _rl_find_prev_mbchar (rl_line_buffer, rl_point, MB_FIND_NONZERO); - c = rl_line_buffer[rl_point]; - rl_delete_text (rl_point, orig_point); - } -#endif /* HANDLE_MULTIBYTE */ - - /* I don't think that the hack for end of line is needed for - multibyte chars. */ -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX == 1 || rl_byte_oriented) -#endif - if (rl_point == rl_end && ISPRINT (c) && _rl_last_c_pos) - { - int l; - l = rl_character_len (c, rl_point); - _rl_erase_at_end_of_line (l); - } - } - - return 0; -} - -/* Delete the character under the cursor. Given a numeric argument, - kill that many characters instead. */ -int -rl_delete (count, key) - int count, key; -{ - int r; - - if (count < 0) - return (_rl_rubout_char (-count, key)); - - if (rl_point == rl_end) - { - rl_ding (); - return -1; - } - - if (count > 1 || rl_explicit_arg) - { - int orig_point = rl_point; -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - rl_forward_char (count, key); - else -#endif - rl_forward_byte (count, key); - - r = rl_kill_text (orig_point, rl_point); - rl_point = orig_point; - return r; - } - else - { - int new_point; - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - new_point = _rl_find_next_mbchar (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO); - else - new_point = rl_point + 1; - - return (rl_delete_text (rl_point, new_point)); - } -} - -/* Delete the character under the cursor, unless the insertion - point is at the end of the line, in which case the character - behind the cursor is deleted. COUNT is obeyed and may be used - to delete forward or backward that many characters. */ -int -rl_rubout_or_delete (count, key) - int count, key; -{ - if (rl_end != 0 && rl_point == rl_end) - return (_rl_rubout_char (count, key)); - else - return (rl_delete (count, key)); -} - -/* Delete all spaces and tabs around point. */ -int -rl_delete_horizontal_space (count, ignore) - int count, ignore; -{ - int start = rl_point; - - while (rl_point && whitespace (rl_line_buffer[rl_point - 1])) - rl_point--; - - start = rl_point; - - while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point])) - rl_point++; - - if (start != rl_point) - { - rl_delete_text (start, rl_point); - rl_point = start; - } - return 0; -} - -/* Like the tcsh editing function delete-char-or-list. The eof character - is caught before this is invoked, so this really does the same thing as - delete-char-or-list-or-eof, as long as it's bound to the eof character. */ -int -rl_delete_or_show_completions (count, key) - int count, key; -{ - if (rl_end != 0 && rl_point == rl_end) - return (rl_possible_completions (count, key)); - else - return (rl_delete (count, key)); -} - -#ifndef RL_COMMENT_BEGIN_DEFAULT -#define RL_COMMENT_BEGIN_DEFAULT "#" -#endif - -/* Turn the current line into a comment in shell history. - A K*rn shell style function. */ -int -rl_insert_comment (count, key) - int count, key; -{ - char *rl_comment_text; - int rl_comment_len; - - rl_beg_of_line (1, key); - rl_comment_text = _rl_comment_begin ? _rl_comment_begin : RL_COMMENT_BEGIN_DEFAULT; - - if (rl_explicit_arg == 0) - rl_insert_text (rl_comment_text); - else - { - rl_comment_len = (int)strlen (rl_comment_text); - if (STREQN (rl_comment_text, rl_line_buffer, rl_comment_len)) - rl_delete_text (rl_point, rl_point + rl_comment_len); - else - rl_insert_text (rl_comment_text); - } - - (*rl_redisplay_function) (); - rl_newline (1, '\n'); - - return (0); -} - -/* **************************************************************** */ -/* */ -/* Changing Case */ -/* */ -/* **************************************************************** */ - -/* The three kinds of things that we know how to do. */ -#define UpCase 1 -#define DownCase 2 -#define CapCase 3 - -/* Uppercase the word at point. */ -int -rl_upcase_word (count, key) - int count, key; -{ - return (rl_change_case (count, UpCase)); -} - -/* Lowercase the word at point. */ -int -rl_downcase_word (count, key) - int count, key; -{ - return (rl_change_case (count, DownCase)); -} - -/* Upcase the first letter, downcase the rest. */ -int -rl_capitalize_word (count, key) - int count, key; -{ - return (rl_change_case (count, CapCase)); -} - -/* The meaty function. - Change the case of COUNT words, performing OP on them. - OP is one of UpCase, DownCase, or CapCase. - If a negative argument is given, leave point where it started, - otherwise, leave it where it moves to. */ -static int -rl_change_case (count, op) - int count, op; -{ - register int start, end; - int inword, c; - - start = rl_point; - rl_forward_word (count, 0); - end = rl_point; - - if (count < 0) - SWAP (start, end); - - /* We are going to modify some text, so let's prepare to undo it. */ - rl_modifying (start, end); - - for (inword = 0; start < end; start++) - { - c = rl_line_buffer[start]; - switch (op) - { - case UpCase: - rl_line_buffer[start] = _rl_to_upper (c); - break; - - case DownCase: - rl_line_buffer[start] = _rl_to_lower (c); - break; - - case CapCase: - rl_line_buffer[start] = (inword == 0) ? _rl_to_upper (c) : _rl_to_lower (c); - inword = rl_alphabetic (rl_line_buffer[start]); - break; - - default: - rl_ding (); - return -1; - } - } - rl_point = end; - return 0; -} - -/* **************************************************************** */ -/* */ -/* Transposition */ -/* */ -/* **************************************************************** */ - -/* Transpose the words at point. If point is at the end of the line, - transpose the two words before point. */ -int -rl_transpose_words (count, key) - int count, key; -{ - char *word1, *word2; - int w1_beg, w1_end, w2_beg, w2_end; - int orig_point = rl_point; - - if (!count) - return 0; - - /* Find the two words. */ - rl_forward_word (count, key); - w2_end = rl_point; - rl_backward_word (1, key); - w2_beg = rl_point; - rl_backward_word (count, key); - w1_beg = rl_point; - rl_forward_word (1, key); - w1_end = rl_point; - - /* Do some check to make sure that there really are two words. */ - if ((w1_beg == w2_beg) || (w2_beg < w1_end)) - { - rl_ding (); - rl_point = orig_point; - return -1; - } - - /* Get the text of the words. */ - word1 = rl_copy_text (w1_beg, w1_end); - word2 = rl_copy_text (w2_beg, w2_end); - - /* We are about to do many insertions and deletions. Remember them - as one operation. */ - rl_begin_undo_group (); - - /* Do the stuff at word2 first, so that we don't have to worry - about word1 moving. */ - rl_point = w2_beg; - rl_delete_text (w2_beg, w2_end); - rl_insert_text (word1); - - rl_point = w1_beg; - rl_delete_text (w1_beg, w1_end); - rl_insert_text (word2); - - /* This is exactly correct since the text before this point has not - changed in length. */ - rl_point = w2_end; - - /* I think that does it. */ - rl_end_undo_group (); - free (word1); - free (word2); - - return 0; -} - -/* Transpose the characters at point. If point is at the end of the line, - then transpose the characters before point. */ -int -rl_transpose_chars (count, key) - int count, key; -{ -#if defined (HANDLE_MULTIBYTE) - char *dummy; - int i, prev_point; -#else - char dummy[2]; -#endif - int char_length; - - if (count == 0) - return 0; - - if (!rl_point || rl_end < 2) - { - rl_ding (); - return -1; - } - - rl_begin_undo_group (); - - if (rl_point == rl_end) - { - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - rl_point = _rl_find_prev_mbchar (rl_line_buffer, rl_point, MB_FIND_NONZERO); - else - --rl_point; - count = 1; - } - -#if defined (HANDLE_MULTIBYTE) - prev_point = rl_point; - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - rl_point = _rl_find_prev_mbchar (rl_line_buffer, rl_point, MB_FIND_NONZERO); - else -#endif - rl_point--; - -#if defined (HANDLE_MULTIBYTE) - char_length = prev_point - rl_point; - dummy = (char *)xmalloc (char_length + 1); - for (i = 0; i < char_length; i++) - dummy[i] = rl_line_buffer[rl_point + i]; - dummy[i] = '\0'; -#else - dummy[0] = rl_line_buffer[rl_point]; - dummy[char_length = 1] = '\0'; -#endif - - rl_delete_text (rl_point, rl_point + char_length); - - rl_point = _rl_find_next_mbchar (rl_line_buffer, rl_point, count, MB_FIND_NONZERO); - - _rl_fix_point (0); - rl_insert_text (dummy); - rl_end_undo_group (); - -#if defined (HANDLE_MULTIBYTE) - free (dummy); -#endif - - return 0; -} - -/* **************************************************************** */ -/* */ -/* Character Searching */ -/* */ -/* **************************************************************** */ - -int -#if defined (HANDLE_MULTIBYTE) -_rl_char_search_internal (count, dir, smbchar, len) - int count, dir; - char *smbchar; - int len; -#else -_rl_char_search_internal (count, dir, schar) - int count, dir, schar; -#endif -{ - int pos, inc; -#if defined (HANDLE_MULTIBYTE) - int prepos; -#endif - - pos = rl_point; - inc = (dir < 0) ? -1 : 1; - while (count) - { - if ((dir < 0 && pos <= 0) || (dir > 0 && pos >= rl_end)) - { - rl_ding (); - return -1; - } - -#if defined (HANDLE_MULTIBYTE) - pos = (inc > 0) ? _rl_find_next_mbchar (rl_line_buffer, pos, 1, MB_FIND_ANY) - : _rl_find_prev_mbchar (rl_line_buffer, pos, MB_FIND_ANY); -#else - pos += inc; -#endif - do - { -#if defined (HANDLE_MULTIBYTE) - if (_rl_is_mbchar_matched (rl_line_buffer, pos, rl_end, smbchar, len)) -#else - if (rl_line_buffer[pos] == schar) -#endif - { - count--; - if (dir < 0) - rl_point = (dir == BTO) ? _rl_find_next_mbchar (rl_line_buffer, pos, 1, MB_FIND_ANY) - : pos; - else - rl_point = (dir == FTO) ? _rl_find_prev_mbchar (rl_line_buffer, pos, MB_FIND_ANY) - : pos; - break; - } -#if defined (HANDLE_MULTIBYTE) - prepos = pos; -#endif - } -#if defined (HANDLE_MULTIBYTE) - while ((dir < 0) ? (pos = _rl_find_prev_mbchar (rl_line_buffer, pos, MB_FIND_ANY)) != prepos - : (pos = _rl_find_next_mbchar (rl_line_buffer, pos, 1, MB_FIND_ANY)) != prepos); -#else - while ((dir < 0) ? pos-- : ++pos < rl_end); -#endif - } - return (0); -} - -/* Search COUNT times for a character read from the current input stream. - FDIR is the direction to search if COUNT is non-negative; otherwise - the search goes in BDIR. So much is dependent on HANDLE_MULTIBYTE - that there are two separate versions of this function. */ -#if defined (HANDLE_MULTIBYTE) -static int -_rl_char_search (count, fdir, bdir) - int count, fdir, bdir; -{ - char mbchar[MB_LEN_MAX]; - int mb_len; - - mb_len = _rl_read_mbchar (mbchar, MB_LEN_MAX); - - if (count < 0) - return (_rl_char_search_internal (-count, bdir, mbchar, mb_len)); - else - return (_rl_char_search_internal (count, fdir, mbchar, mb_len)); -} -#else /* !HANDLE_MULTIBYTE */ -static int -_rl_char_search (count, fdir, bdir) - int count, fdir, bdir; -{ - int c; - - RL_SETSTATE(RL_STATE_MOREINPUT); - c = rl_read_key (); - RL_UNSETSTATE(RL_STATE_MOREINPUT); - - if (count < 0) - return (_rl_char_search_internal (-count, bdir, c)); - else - return (_rl_char_search_internal (count, fdir, c)); -} -#endif /* !HANDLE_MULTIBYTE */ - -int -rl_char_search (count, key) - int count, key; -{ - return (_rl_char_search (count, FFIND, BFIND)); -} - -int -rl_backward_char_search (count, key) - int count, key; -{ - return (_rl_char_search (count, BFIND, FFIND)); -} - -/* **************************************************************** */ -/* */ -/* The Mark and the Region. */ -/* */ -/* **************************************************************** */ - -/* Set the mark at POSITION. */ -int -_rl_set_mark_at_pos (position) - int position; -{ - if (position > rl_end) - return -1; - - rl_mark = position; - return 0; -} - -/* A bindable command to set the mark. */ -int -rl_set_mark (count, key) - int count, key; -{ - return (_rl_set_mark_at_pos (rl_explicit_arg ? count : rl_point)); -} - -/* Exchange the position of mark and point. */ -int -rl_exchange_point_and_mark (count, key) - int count, key; -{ - if (rl_mark > rl_end) - rl_mark = -1; - - if (rl_mark == -1) - { - rl_ding (); - return -1; - } - else - SWAP (rl_point, rl_mark); - - return 0; -} diff --git a/dep/src/readline/src/tilde.c b/dep/src/readline/src/tilde.c deleted file mode 100644 index 0ebc516dbf2..00000000000 --- a/dep/src/readline/src/tilde.c +++ /dev/null @@ -1,479 +0,0 @@ -/* tilde.c -- Tilde expansion code (~/foo := $HOME/foo). */ - -/* Copyright (C) 1988,1989 Free Software Foundation, Inc. - - This file is part of GNU Readline, a library for reading lines - of text with interactive input and history editing. - - Readline is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2, or (at your option) any - later version. - - Readline is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Readline; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ -#define READLINE_LIBRARY - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#if defined (HAVE_UNISTD_H) -# ifdef _MINIX -# include -# endif -# include -#endif - -#if defined (HAVE_STRING_H) -# include -#else /* !HAVE_STRING_H */ -# include -#endif /* !HAVE_STRING_H */ - -#if defined (HAVE_STDLIB_H) -# include -#else -# include "ansi_stdlib.h" -#endif /* HAVE_STDLIB_H */ - -#include -#ifndef _WIN32 -#include -#else -#include -#endif - -#include "tilde.h" - -#if defined (TEST) || defined (STATIC_MALLOC) -static void *xmalloc (), *xrealloc (); -#else -# include "xmalloc.h" -#endif /* TEST || STATIC_MALLOC */ - -#if !defined (HAVE_GETPW_DECLS) -extern struct passwd *getpwuid PARAMS((uid_t)); -extern struct passwd *getpwnam PARAMS((const char *)); -#endif /* !HAVE_GETPW_DECLS */ - -#if !defined (savestring) -#define savestring(x) strcpy ((char *)xmalloc (1 + strlen (x)), (x)) -#endif /* !savestring */ - -#if !defined (NULL) -# if defined (__STDC__) -# define NULL ((void *) 0) -# else -# define NULL 0x0 -# endif /* !__STDC__ */ -#endif /* !NULL */ - -/* If being compiled as part of bash, these will be satisfied from - variables.o. If being compiled as part of readline, they will - be satisfied from shell.o. */ -extern char *sh_get_home_dir PARAMS((void)); -extern char *sh_get_env_value PARAMS((const char *)); - -/* The default value of tilde_additional_prefixes. This is set to - whitespace preceding a tilde so that simple programs which do not - perform any word separation get desired behaviour. */ -static const char *default_prefixes[] = - { " ~", "\t~", (const char *)NULL }; - -/* The default value of tilde_additional_suffixes. This is set to - whitespace or newline so that simple programs which do not - perform any word separation get desired behaviour. */ -static const char *default_suffixes[] = - { " ", "\n", (const char *)NULL }; - -/* If non-null, this contains the address of a function that the application - wants called before trying the standard tilde expansions. The function - is called with the text sans tilde, and returns a malloc()'ed string - which is the expansion, or a NULL pointer if the expansion fails. */ -tilde_hook_func_t *tilde_expansion_preexpansion_hook = (tilde_hook_func_t *)NULL; - -/* If non-null, this contains the address of a function to call if the - standard meaning for expanding a tilde fails. The function is called - with the text (sans tilde, as in "foo"), and returns a malloc()'ed string - which is the expansion, or a NULL pointer if there is no expansion. */ -tilde_hook_func_t *tilde_expansion_failure_hook = (tilde_hook_func_t *)NULL; - -/* When non-null, this is a NULL terminated array of strings which - are duplicates for a tilde prefix. Bash uses this to expand - `=~' and `:~'. */ -char **tilde_additional_prefixes = (char **)default_prefixes; - -/* When non-null, this is a NULL terminated array of strings which match - the end of a username, instead of just "/". Bash sets this to - `:' and `=~'. */ -char **tilde_additional_suffixes = (char **)default_suffixes; - -static int tilde_find_prefix PARAMS((const char *, int *)); -static int tilde_find_suffix PARAMS((const char *)); -static char *isolate_tilde_prefix PARAMS((const char *, int *)); -static char *glue_prefix_and_suffix PARAMS((char *, const char *, int)); - -/* Find the start of a tilde expansion in STRING, and return the index of - the tilde which starts the expansion. Place the length of the text - which identified this tilde starter in LEN, excluding the tilde itself. */ -static int -tilde_find_prefix (string, len) - const char *string; - int *len; -{ - register int i, j, string_len; - register char **prefixes; - - prefixes = tilde_additional_prefixes; - - string_len = (int)strlen (string); - *len = 0; - - if (*string == '\0' || *string == '~') - return (0); - - if (prefixes) - { - for (i = 0; i < string_len; i++) - { - for (j = 0; prefixes[j]; j++) - { - if (strncmp (string + i, prefixes[j], strlen (prefixes[j])) == 0) - { - *len = (int)strlen (prefixes[j]) - 1; - return (i + *len); - } - } - } - } - return (string_len); -} - -/* Find the end of a tilde expansion in STRING, and return the index of - the character which ends the tilde definition. */ -static int -tilde_find_suffix (string) - const char *string; -{ - register int i, j, string_len; - register char **suffixes; - - suffixes = tilde_additional_suffixes; - string_len = (int)strlen (string); - - for (i = 0; i < string_len; i++) - { -#if defined (__MSDOS__) - if (string[i] == '/' || string[i] == '\\' /* || !string[i] */) -#else - if (string[i] == '/' /* || !string[i] */) -#endif - break; - - for (j = 0; suffixes && suffixes[j]; j++) - { - if (strncmp (string + i, suffixes[j], strlen (suffixes[j])) == 0) - return (i); - } - } - return (i); -} - -/* Return a new string which is the result of tilde expanding STRING. */ -char * -tilde_expand (string) - const char *string; -{ - char *result; - int result_size, result_index; - - result_index = result_size = 0; - if (result = strchr (string, '~')) - result = (char *)xmalloc (result_size = (int)(strlen (string) + 16)); - else - result = (char *)xmalloc (result_size = (int)(strlen (string) + 1)); - - /* Scan through STRING expanding tildes as we come to them. */ - while (1) - { - register int start, end; - char *tilde_word, *expansion; - int len; - - /* Make START point to the tilde which starts the expansion. */ - start = tilde_find_prefix (string, &len); - - /* Copy the skipped text into the result. */ - if ((result_index + start + 1) > result_size) - result = (char *)xrealloc (result, 1 + (result_size += (start + 20))); - - strncpy (result + result_index, string, start); - result_index += start; - - /* Advance STRING to the starting tilde. */ - string += start; - - /* Make END be the index of one after the last character of the - username. */ - end = tilde_find_suffix (string); - - /* If both START and END are zero, we are all done. */ - if (!start && !end) - break; - - /* Expand the entire tilde word, and copy it into RESULT. */ - tilde_word = (char *)xmalloc (1 + end); - strncpy (tilde_word, string, end); - tilde_word[end] = '\0'; - string += end; - - expansion = tilde_expand_word (tilde_word); - free (tilde_word); - - len = (int)strlen (expansion); -#ifdef __CYGWIN__ - /* Fix for Cygwin to prevent ~user/xxx from expanding to //xxx when - $HOME for `user' is /. On cygwin, // denotes a network drive. */ - if (len > 1 || *expansion != '/' || *string != '/') -#endif - { - if ((result_index + len + 1) > result_size) - result = (char *)xrealloc (result, 1 + (result_size += (len + 20))); - - strcpy (result + result_index, expansion); - result_index += len; - } - free (expansion); - } - - result[result_index] = '\0'; - - return (result); -} - -/* Take FNAME and return the tilde prefix we want expanded. If LENP is - non-null, the index of the end of the prefix into FNAME is returned in - the location it points to. */ -static char * -isolate_tilde_prefix (fname, lenp) - const char *fname; - int *lenp; -{ - char *ret; - int i; - - ret = (char *)xmalloc (strlen (fname)); -#if defined (__MSDOS__) - for (i = 1; fname[i] && fname[i] != '/' && fname[i] != '\\'; i++) -#else - for (i = 1; fname[i] && fname[i] != '/'; i++) -#endif - ret[i - 1] = fname[i]; - ret[i - 1] = '\0'; - if (lenp) - *lenp = i; - return ret; -} - -/* Return a string that is PREFIX concatenated with SUFFIX starting at - SUFFIND. */ -static char * -glue_prefix_and_suffix (prefix, suffix, suffind) - char *prefix; - const char *suffix; - int suffind; -{ - char *ret; - size_t plen, slen; - - plen = (prefix && *prefix) ? strlen (prefix) : 0; - slen = strlen (suffix + suffind); - ret = (char *)xmalloc (plen + slen + 1); - if (plen) - strcpy (ret, prefix); - strcpy (ret + plen, suffix + suffind); - return ret; -} - -/* Do the work of tilde expansion on FILENAME. FILENAME starts with a - tilde. If there is no expansion, call tilde_expansion_failure_hook. - This always returns a newly-allocated string, never static storage. */ -char * -tilde_expand_word (filename) - const char *filename; -{ - char *dirname, *expansion, *username; - int user_len; -#if !defined (_WIN32) - struct passwd *user_entry; -#else /* _WIN32 */ - char UserName[256]; - unsigned long UserLen = 256; -#endif /* _WIN32 */ - - if (filename == 0) - return ((char *)NULL); - - if (*filename != '~') - return (savestring (filename)); - - /* A leading `~/' or a bare `~' is *always* translated to the value of - $HOME or the home directory of the current user, regardless of any - preexpansion hook. */ - if (filename[1] == '\0' || filename[1] == '/') - { - /* Prefix $HOME to the rest of the string. */ - expansion = sh_get_env_value ("HOME"); - - /* If there is no HOME variable, look up the directory in - the password database. */ - if (expansion == 0) - expansion = sh_get_home_dir (); - - return (glue_prefix_and_suffix (expansion, filename, 1)); - } - - username = isolate_tilde_prefix (filename, &user_len); - - if (tilde_expansion_preexpansion_hook) - { - expansion = (*tilde_expansion_preexpansion_hook) (username); - if (expansion) - { - dirname = glue_prefix_and_suffix (expansion, filename, user_len); - free (username); - free (expansion); - return (dirname); - } - } - - /* No preexpansion hook, or the preexpansion hook failed. Look in the - password database. */ - dirname = (char *)NULL; -#if !defined (_WIN32) - user_entry = getpwnam (username); - if (user_entry == 0) - { - /* If the calling program has a special syntax for expanding tildes, - and we couldn't find a standard expansion, then let them try. */ - if (tilde_expansion_failure_hook) - { - expansion = (*tilde_expansion_failure_hook) (username); - if (expansion) - { - dirname = glue_prefix_and_suffix (expansion, filename, user_len); - free (expansion); - } - } - free (username); - /* If we don't have a failure hook, or if the failure hook did not - expand the tilde, return a copy of what we were passed. */ - if (dirname == 0) - dirname = savestring (filename); - } - else - { - free (username); - dirname = glue_prefix_and_suffix (user_entry->pw_dir, filename, user_len); - } - - endpwent (); -#else /* _WIN32 */ - if (GetUserName (UserName, &UserLen)) - { - if (!stricmp (username, UserName)) - dirname = glue_prefix_and_suffix (sh_get_home_dir (), filename, user_len); - else if (dirname == 0) - dirname = savestring (filename); - } - free (username); -#endif /* _WIN32 */ - return (dirname); -} - - -#if defined (TEST) -#undef NULL -#include - -main (argc, argv) - int argc; - char **argv; -{ - char *result, line[512]; - int done = 0; - - while (!done) - { - printf ("~expand: "); - fflush (stdout); - - if (!gets (line)) - strcpy (line, "done"); - - if ((strcmp (line, "done") == 0) || - (strcmp (line, "quit") == 0) || - (strcmp (line, "exit") == 0)) - { - done = 1; - break; - } - - result = tilde_expand (line); - printf (" --> %s\n", result); - free (result); - } - exit (0); -} - -static void memory_error_and_abort (); - -static void * -xmalloc (bytes) - size_t bytes; -{ - void *temp = (char *)malloc (bytes); - - if (!temp) - memory_error_and_abort (); - return (temp); -} - -static void * -xrealloc (pointer, bytes) - void *pointer; - int bytes; -{ - void *temp; - - if (!pointer) - temp = malloc (bytes); - else - temp = realloc (pointer, bytes); - - if (!temp) - memory_error_and_abort (); - - return (temp); -} - -static void -memory_error_and_abort () -{ - fprintf (stderr, "readline: out of virtual memory\n"); - abort (); -} - -/* - * Local variables: - * compile-command: "gcc -g -DTEST -o tilde tilde.c" - * end: - */ -#endif /* TEST */ diff --git a/dep/src/readline/src/undo.c b/dep/src/readline/src/undo.c deleted file mode 100644 index 25c287b5a2d..00000000000 --- a/dep/src/readline/src/undo.c +++ /dev/null @@ -1,263 +0,0 @@ -/* readline.c -- a general facility for reading lines of input - with emacs style editing and completion. */ - -/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ -#define READLINE_LIBRARY - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#include - -#if defined (HAVE_UNISTD_H) -# include /* for _POSIX_VERSION */ -#endif /* HAVE_UNISTD_H */ - -#if defined (HAVE_STDLIB_H) -# include -#else -# include "ansi_stdlib.h" -#endif /* HAVE_STDLIB_H */ - -#include - -/* System-specific feature definitions and include files. */ -#include "rldefs.h" - -/* Some standard library routines. */ -#include "readline.h" -#include "history.h" - -#include "rlprivate.h" -#include "xmalloc.h" - -/* Non-zero tells rl_delete_text and rl_insert_text to not add to - the undo list. */ -int _rl_doing_an_undo = 0; - -/* How many unclosed undo groups we currently have. */ -int _rl_undo_group_level = 0; - -/* The current undo list for THE_LINE. */ -UNDO_LIST *rl_undo_list = (UNDO_LIST *)NULL; - -/* **************************************************************** */ -/* */ -/* Undo, and Undoing */ -/* */ -/* **************************************************************** */ - -/* Remember how to undo something. Concatenate some undos if that - seems right. */ -void -rl_add_undo (what, start, end, text) - enum undo_code what; - int start, end; - char *text; -{ - UNDO_LIST *temp = (UNDO_LIST *)xmalloc (sizeof (UNDO_LIST)); - temp->what = what; - temp->start = start; - temp->end = end; - temp->text = text; - temp->next = rl_undo_list; - rl_undo_list = temp; -} - -/* Free the existing undo list. */ -void -rl_free_undo_list () -{ - while (rl_undo_list) - { - UNDO_LIST *release = rl_undo_list; - rl_undo_list = rl_undo_list->next; - - if (release->what == UNDO_DELETE) - free (release->text); - - free (release); - } - rl_undo_list = (UNDO_LIST *)NULL; -} - -/* Undo the next thing in the list. Return 0 if there - is nothing to undo, or non-zero if there was. */ -int -rl_do_undo () -{ - UNDO_LIST *release; - int waiting_for_begin, start, end; - -#define TRANS(i) ((i) == -1 ? rl_point : ((i) == -2 ? rl_end : (i))) - - start = end = waiting_for_begin = 0; - do - { - if (!rl_undo_list) - return (0); - - _rl_doing_an_undo = 1; - RL_SETSTATE(RL_STATE_UNDOING); - - /* To better support vi-mode, a start or end value of -1 means - rl_point, and a value of -2 means rl_end. */ - if (rl_undo_list->what == UNDO_DELETE || rl_undo_list->what == UNDO_INSERT) - { - start = TRANS (rl_undo_list->start); - end = TRANS (rl_undo_list->end); - } - - switch (rl_undo_list->what) - { - /* Undoing deletes means inserting some text. */ - case UNDO_DELETE: - rl_point = start; - rl_insert_text (rl_undo_list->text); - free (rl_undo_list->text); - break; - - /* Undoing inserts means deleting some text. */ - case UNDO_INSERT: - rl_delete_text (start, end); - rl_point = start; - break; - - /* Undoing an END means undoing everything 'til we get to a BEGIN. */ - case UNDO_END: - waiting_for_begin++; - break; - - /* Undoing a BEGIN means that we are done with this group. */ - case UNDO_BEGIN: - if (waiting_for_begin) - waiting_for_begin--; - else - rl_ding (); - break; - } - - _rl_doing_an_undo = 0; - RL_UNSETSTATE(RL_STATE_UNDOING); - - release = rl_undo_list; - rl_undo_list = rl_undo_list->next; - free (release); - } - while (waiting_for_begin); - - return (1); -} -#undef TRANS - -int -_rl_fix_last_undo_of_type (type, start, end) - int type, start, end; -{ - UNDO_LIST *rl; - - for (rl = rl_undo_list; rl; rl = rl->next) - { - if (rl->what == type) - { - rl->start = start; - rl->end = end; - return 0; - } - } - return 1; -} - -/* Begin a group. Subsequent undos are undone as an atomic operation. */ -int -rl_begin_undo_group () -{ - rl_add_undo (UNDO_BEGIN, 0, 0, 0); - _rl_undo_group_level++; - return 0; -} - -/* End an undo group started with rl_begin_undo_group (). */ -int -rl_end_undo_group () -{ - rl_add_undo (UNDO_END, 0, 0, 0); - _rl_undo_group_level--; - return 0; -} - -/* Save an undo entry for the text from START to END. */ -int -rl_modifying (start, end) - int start, end; -{ - if (start > end) - { - SWAP (start, end); - } - - if (start != end) - { - char *temp = rl_copy_text (start, end); - rl_begin_undo_group (); - rl_add_undo (UNDO_DELETE, start, end, temp); - rl_add_undo (UNDO_INSERT, start, end, (char *)NULL); - rl_end_undo_group (); - } - return 0; -} - -/* Revert the current line to its previous state. */ -int -rl_revert_line (count, key) - int count, key; -{ - if (!rl_undo_list) - rl_ding (); - else - { - while (rl_undo_list) - rl_do_undo (); - } - return 0; -} - -/* Do some undoing of things that were done. */ -int -rl_undo_command (count, key) - int count, key; -{ - if (count < 0) - return 0; /* Nothing to do. */ - - while (count) - { - if (rl_do_undo ()) - count--; - else - { - rl_ding (); - break; - } - } - return 0; -} diff --git a/dep/src/readline/src/util.c b/dep/src/readline/src/util.c deleted file mode 100644 index 8f4f13531ea..00000000000 --- a/dep/src/readline/src/util.c +++ /dev/null @@ -1,338 +0,0 @@ -/* util.c -- readline utility functions */ - -/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ -#define READLINE_LIBRARY - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#include -#include -#include "posixjmp.h" - -#if defined (HAVE_UNISTD_H) -# include /* for _POSIX_VERSION */ -#endif /* HAVE_UNISTD_H */ - -#if defined (HAVE_STDLIB_H) -# include -#else -# include "ansi_stdlib.h" -#endif /* HAVE_STDLIB_H */ - -#include -#include - -/* System-specific feature definitions and include files. */ -#include "rldefs.h" - -#if defined (TIOCSTAT_IN_SYS_IOCTL) -# include -#endif /* TIOCSTAT_IN_SYS_IOCTL */ - -/* Some standard library routines. */ -#include "readline.h" - -#include "rlprivate.h" -#include "xmalloc.h" - -/* **************************************************************** */ -/* */ -/* Utility Functions */ -/* */ -/* **************************************************************** */ - -/* Return 0 if C is not a member of the class of characters that belong - in words, or 1 if it is. */ - -int _rl_allow_pathname_alphabetic_chars = 0; -static const char *pathname_alphabetic_chars = "/-_=~.#$"; - -int -rl_alphabetic (c) - int c; -{ - if (ALPHABETIC (c)) - return (1); - - return (_rl_allow_pathname_alphabetic_chars && - strchr (pathname_alphabetic_chars, c) != NULL); -} - -/* How to abort things. */ -int -_rl_abort_internal () -{ - rl_ding (); - rl_clear_message (); - _rl_init_argument (); - rl_clear_pending_input (); - - RL_UNSETSTATE (RL_STATE_MACRODEF); - while (rl_executing_macro) - _rl_pop_executing_macro (); - - rl_last_func = (rl_command_func_t *)NULL; - longjmp (readline_top_level, 1); - return (0); -} - -int -rl_abort (count, key) - int count, key; -{ - return (_rl_abort_internal ()); -} - -int -rl_tty_status (count, key) - int count, key; -{ -#if defined (TIOCSTAT) - ioctl (1, TIOCSTAT, (char *)0); - rl_refresh_line (count, key); -#else - rl_ding (); -#endif - return 0; -} - -/* Return a copy of the string between FROM and TO. - FROM is inclusive, TO is not. */ -char * -rl_copy_text (from, to) - int from, to; -{ - register int length; - char *copy; - - /* Fix it if the caller is confused. */ - if (from > to) - SWAP (from, to); - - length = to - from; - copy = (char *)xmalloc (1 + length); - strncpy (copy, rl_line_buffer + from, length); - copy[length] = '\0'; - return (copy); -} - -/* Increase the size of RL_LINE_BUFFER until it has enough space to hold - LEN characters. */ -void -rl_extend_line_buffer (len) - int len; -{ - while (len >= rl_line_buffer_len) - { - rl_line_buffer_len += DEFAULT_BUFFER_SIZE; - rl_line_buffer = (char *)xrealloc (rl_line_buffer, rl_line_buffer_len); - } - - _rl_set_the_line (); -} - - -/* A function for simple tilde expansion. */ -int -rl_tilde_expand (ignore, key) - int ignore, key; -{ - register int start, end; - char *homedir, *temp; - int len; - - end = rl_point; - start = end - 1; - - if (rl_point == rl_end && rl_line_buffer[rl_point] == '~') - { - homedir = tilde_expand ("~"); - _rl_replace_text (homedir, start, end); - return (0); - } - else if (rl_line_buffer[start] != '~') - { - for (; !whitespace (rl_line_buffer[start]) && start >= 0; start--) - ; - start++; - } - - end = start; - do - end++; - while (whitespace (rl_line_buffer[end]) == 0 && end < rl_end); - - if (whitespace (rl_line_buffer[end]) || end >= rl_end) - end--; - - /* If the first character of the current word is a tilde, perform - tilde expansion and insert the result. If not a tilde, do - nothing. */ - if (rl_line_buffer[start] == '~') - { - len = end - start + 1; - temp = (char *)xmalloc (len + 1); - strncpy (temp, rl_line_buffer + start, len); - temp[len] = '\0'; - homedir = tilde_expand (temp); - free (temp); - - _rl_replace_text (homedir, start, end); - } - - return (0); -} - -/* **************************************************************** */ -/* */ -/* String Utility Functions */ -/* */ -/* **************************************************************** */ - -/* Determine if s2 occurs in s1. If so, return a pointer to the - match in s1. The compare is case insensitive. */ -char * -_rl_strindex (s1, s2) - register const char *s1, *s2; -{ - register ptrdiff_t i, l, len; - - for (i = 0, l = strlen (s2), len = strlen (s1); (len - i) >= l; i++) - if (_rl_strnicmp (s1 + i, s2, l) == 0) - return ((char *) (s1 + i)); - return ((char *)NULL); -} - -#ifndef HAVE_STRPBRK -/* Find the first occurrence in STRING1 of any character from STRING2. - Return a pointer to the character in STRING1. */ -char * -_rl_strpbrk (string1, string2) - const char *string1, *string2; -{ - register const char *scan; -#if defined (HANDLE_MULTIBYTE) - mbstate_t ps; - register int i, v; - - memset (&ps, 0, sizeof (mbstate_t)); -#endif - - for (; *string1; string1++) - { - for (scan = string2; *scan; scan++) - { - if (*string1 == *scan) - return ((char *)string1); - } -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - { - v = _rl_get_char_len (string1, &ps); - if (v > 1) - string1 += v - 1; /* -1 to account for auto-increment in loop */ - } -#endif - } - return ((char *)NULL); -} -#endif - -#if !defined (HAVE_STRCASECMP) && !defined (_WIN32) -/* Compare at most COUNT characters from string1 to string2. Case - doesn't matter. */ -int -_rl_strnicmp (string1, string2, count) - char *string1, *string2; - int count; -{ - register char ch1, ch2; - - while (count) - { - ch1 = *string1++; - ch2 = *string2++; - if (_rl_to_upper(ch1) == _rl_to_upper(ch2)) - count--; - else - break; - } - return (count); -} - -/* strcmp (), but caseless. */ -int -_rl_stricmp (string1, string2) - char *string1, *string2; -{ - register char ch1, ch2; - - while (*string1 && *string2) - { - ch1 = *string1++; - ch2 = *string2++; - if (_rl_to_upper(ch1) != _rl_to_upper(ch2)) - return (1); - } - return (*string1 - *string2); -} -#endif /* !HAVE_STRCASECMP */ - -/* Stupid comparison routine for qsort () ing strings. */ -int -_rl_qsort_string_compare (s1, s2) - char **s1, **s2; -{ -#if defined (HAVE_STRCOLL) - return (strcoll (*s1, *s2)); -#else - int result; - - result = **s1 - **s2; - if (result == 0) - result = strcmp (*s1, *s2); - - return result; -#endif -} - -/* Function equivalents for the macros defined in chardefs.h. */ -#define FUNCTION_FOR_MACRO(f) int (f) (c) int c; { return f (c); } - -FUNCTION_FOR_MACRO (_rl_digit_p) -FUNCTION_FOR_MACRO (_rl_digit_value) -FUNCTION_FOR_MACRO (_rl_lowercase_p) -FUNCTION_FOR_MACRO (_rl_pure_alphabetic) -FUNCTION_FOR_MACRO (_rl_to_lower) -FUNCTION_FOR_MACRO (_rl_to_upper) -FUNCTION_FOR_MACRO (_rl_uppercase_p) - -/* Backwards compatibility, now that savestring has been removed from - all `public' readline header files. */ -#undef _rl_savestring -char * -_rl_savestring (s) - const char *s; -{ - return (strcpy ((char *)xmalloc (1 + (int)strlen (s)), (s))); -} diff --git a/dep/src/readline/src/vi_keymap.c b/dep/src/readline/src/vi_keymap.c deleted file mode 100644 index 53a67c674ce..00000000000 --- a/dep/src/readline/src/vi_keymap.c +++ /dev/null @@ -1,877 +0,0 @@ -/* vi_keymap.c -- the keymap for vi_mode in readline (). */ - -/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#if !defined (BUFSIZ) -#include -#endif /* !BUFSIZ */ - -#include "readline.h" - -#if 0 -extern KEYMAP_ENTRY_ARRAY vi_escape_keymap; -#endif - -/* The keymap arrays for handling vi mode. */ -KEYMAP_ENTRY_ARRAY vi_movement_keymap = { - /* The regular control keys come first. */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-@ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-a */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-b */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-c */ - { ISFUNC, rl_vi_eof_maybe }, /* Control-d */ - { ISFUNC, rl_emacs_editing_mode }, /* Control-e */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-f */ - { ISFUNC, rl_abort }, /* Control-g */ - { ISFUNC, rl_backward_char }, /* Control-h */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-i */ - { ISFUNC, rl_newline }, /* Control-j */ - { ISFUNC, rl_kill_line }, /* Control-k */ - { ISFUNC, rl_clear_screen }, /* Control-l */ - { ISFUNC, rl_newline }, /* Control-m */ - { ISFUNC, rl_get_next_history }, /* Control-n */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-o */ - { ISFUNC, rl_get_previous_history }, /* Control-p */ - { ISFUNC, rl_quoted_insert }, /* Control-q */ - { ISFUNC, rl_reverse_search_history }, /* Control-r */ - { ISFUNC, rl_forward_search_history }, /* Control-s */ - { ISFUNC, rl_transpose_chars }, /* Control-t */ - { ISFUNC, rl_unix_line_discard }, /* Control-u */ - { ISFUNC, rl_quoted_insert }, /* Control-v */ - { ISFUNC, rl_unix_word_rubout }, /* Control-w */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-x */ - { ISFUNC, rl_yank }, /* Control-y */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-z */ - - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-[ */ /* vi_escape_keymap */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-\ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-] */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-^ */ - { ISFUNC, rl_vi_undo }, /* Control-_ */ - - /* The start of printing characters. */ - { ISFUNC, rl_forward_char }, /* SPACE */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* ! */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* " */ - { ISFUNC, rl_insert_comment }, /* # */ - { ISFUNC, rl_end_of_line }, /* $ */ - { ISFUNC, rl_vi_match }, /* % */ - { ISFUNC, rl_vi_tilde_expand }, /* & */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* ' */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* ( */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* ) */ - { ISFUNC, rl_vi_complete }, /* * */ - { ISFUNC, rl_get_next_history}, /* + */ - { ISFUNC, rl_vi_char_search }, /* , */ - { ISFUNC, rl_get_previous_history }, /* - */ - { ISFUNC, rl_vi_redo }, /* . */ - { ISFUNC, rl_vi_search }, /* / */ - - /* Regular digits. */ - { ISFUNC, rl_beg_of_line }, /* 0 */ - { ISFUNC, rl_vi_arg_digit }, /* 1 */ - { ISFUNC, rl_vi_arg_digit }, /* 2 */ - { ISFUNC, rl_vi_arg_digit }, /* 3 */ - { ISFUNC, rl_vi_arg_digit }, /* 4 */ - { ISFUNC, rl_vi_arg_digit }, /* 5 */ - { ISFUNC, rl_vi_arg_digit }, /* 6 */ - { ISFUNC, rl_vi_arg_digit }, /* 7 */ - { ISFUNC, rl_vi_arg_digit }, /* 8 */ - { ISFUNC, rl_vi_arg_digit }, /* 9 */ - - /* A little more punctuation. */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* : */ - { ISFUNC, rl_vi_char_search }, /* ; */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* < */ - { ISFUNC, rl_vi_complete }, /* = */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* > */ - { ISFUNC, rl_vi_search }, /* ? */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* @ */ - - /* Uppercase alphabet. */ - { ISFUNC, rl_vi_append_eol }, /* A */ - { ISFUNC, rl_vi_prev_word}, /* B */ - { ISFUNC, rl_vi_change_to }, /* C */ - { ISFUNC, rl_vi_delete_to }, /* D */ - { ISFUNC, rl_vi_end_word }, /* E */ - { ISFUNC, rl_vi_char_search }, /* F */ - { ISFUNC, rl_vi_fetch_history }, /* G */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* H */ - { ISFUNC, rl_vi_insert_beg }, /* I */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* J */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* K */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* L */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* M */ - { ISFUNC, rl_vi_search_again }, /* N */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* O */ - { ISFUNC, rl_vi_put }, /* P */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Q */ - { ISFUNC, rl_vi_replace }, /* R */ - { ISFUNC, rl_vi_subst }, /* S */ - { ISFUNC, rl_vi_char_search }, /* T */ - { ISFUNC, rl_revert_line }, /* U */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* V */ - { ISFUNC, rl_vi_next_word }, /* W */ - { ISFUNC, rl_rubout }, /* X */ - { ISFUNC, rl_vi_yank_to }, /* Y */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Z */ - - /* Some more punctuation. */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* [ */ - { ISFUNC, rl_vi_complete }, /* \ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* ] */ - { ISFUNC, rl_vi_first_print }, /* ^ */ - { ISFUNC, rl_vi_yank_arg }, /* _ */ - { ISFUNC, rl_vi_goto_mark }, /* ` */ - - /* Lowercase alphabet. */ - { ISFUNC, rl_vi_append_mode }, /* a */ - { ISFUNC, rl_vi_prev_word }, /* b */ - { ISFUNC, rl_vi_change_to }, /* c */ - { ISFUNC, rl_vi_delete_to }, /* d */ - { ISFUNC, rl_vi_end_word }, /* e */ - { ISFUNC, rl_vi_char_search }, /* f */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* g */ - { ISFUNC, rl_backward_char }, /* h */ - { ISFUNC, rl_vi_insertion_mode }, /* i */ - { ISFUNC, rl_get_next_history }, /* j */ - { ISFUNC, rl_get_previous_history }, /* k */ - { ISFUNC, rl_forward_char }, /* l */ - { ISFUNC, rl_vi_set_mark }, /* m */ - { ISFUNC, rl_vi_search_again }, /* n */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* o */ - { ISFUNC, rl_vi_put }, /* p */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* q */ - { ISFUNC, rl_vi_change_char }, /* r */ - { ISFUNC, rl_vi_subst }, /* s */ - { ISFUNC, rl_vi_char_search }, /* t */ - { ISFUNC, rl_vi_undo }, /* u */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* v */ - { ISFUNC, rl_vi_next_word }, /* w */ - { ISFUNC, rl_vi_delete }, /* x */ - { ISFUNC, rl_vi_yank_to }, /* y */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* z */ - - /* Final punctuation. */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* { */ - { ISFUNC, rl_vi_column }, /* | */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* } */ - { ISFUNC, rl_vi_change_case }, /* ~ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* RUBOUT */ - -#if KEYMAP_SIZE > 128 - /* Undefined keys. */ - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 } -#endif /* KEYMAP_SIZE > 128 */ -}; - - -KEYMAP_ENTRY_ARRAY vi_insertion_keymap = { - /* The regular control keys come first. */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-@ */ - { ISFUNC, rl_insert }, /* Control-a */ - { ISFUNC, rl_insert }, /* Control-b */ - { ISFUNC, rl_insert }, /* Control-c */ - { ISFUNC, rl_vi_eof_maybe }, /* Control-d */ - { ISFUNC, rl_insert }, /* Control-e */ - { ISFUNC, rl_insert }, /* Control-f */ - { ISFUNC, rl_insert }, /* Control-g */ - { ISFUNC, rl_rubout }, /* Control-h */ - { ISFUNC, rl_complete }, /* Control-i */ - { ISFUNC, rl_newline }, /* Control-j */ - { ISFUNC, rl_insert }, /* Control-k */ - { ISFUNC, rl_insert }, /* Control-l */ - { ISFUNC, rl_newline }, /* Control-m */ - { ISFUNC, rl_insert }, /* Control-n */ - { ISFUNC, rl_insert }, /* Control-o */ - { ISFUNC, rl_insert }, /* Control-p */ - { ISFUNC, rl_insert }, /* Control-q */ - { ISFUNC, rl_reverse_search_history }, /* Control-r */ - { ISFUNC, rl_forward_search_history }, /* Control-s */ - { ISFUNC, rl_transpose_chars }, /* Control-t */ - { ISFUNC, rl_unix_line_discard }, /* Control-u */ - { ISFUNC, rl_quoted_insert }, /* Control-v */ - { ISFUNC, rl_unix_word_rubout }, /* Control-w */ - { ISFUNC, rl_insert }, /* Control-x */ - { ISFUNC, rl_yank }, /* Control-y */ - { ISFUNC, rl_insert }, /* Control-z */ - - { ISFUNC, rl_vi_movement_mode }, /* Control-[ */ - { ISFUNC, rl_insert }, /* Control-\ */ - { ISFUNC, rl_insert }, /* Control-] */ - { ISFUNC, rl_insert }, /* Control-^ */ - { ISFUNC, rl_vi_undo }, /* Control-_ */ - - /* The start of printing characters. */ - { ISFUNC, rl_insert }, /* SPACE */ - { ISFUNC, rl_insert }, /* ! */ - { ISFUNC, rl_insert }, /* " */ - { ISFUNC, rl_insert }, /* # */ - { ISFUNC, rl_insert }, /* $ */ - { ISFUNC, rl_insert }, /* % */ - { ISFUNC, rl_insert }, /* & */ - { ISFUNC, rl_insert }, /* ' */ - { ISFUNC, rl_insert }, /* ( */ - { ISFUNC, rl_insert }, /* ) */ - { ISFUNC, rl_insert }, /* * */ - { ISFUNC, rl_insert }, /* + */ - { ISFUNC, rl_insert }, /* , */ - { ISFUNC, rl_insert }, /* - */ - { ISFUNC, rl_insert }, /* . */ - { ISFUNC, rl_insert }, /* / */ - - /* Regular digits. */ - { ISFUNC, rl_insert }, /* 0 */ - { ISFUNC, rl_insert }, /* 1 */ - { ISFUNC, rl_insert }, /* 2 */ - { ISFUNC, rl_insert }, /* 3 */ - { ISFUNC, rl_insert }, /* 4 */ - { ISFUNC, rl_insert }, /* 5 */ - { ISFUNC, rl_insert }, /* 6 */ - { ISFUNC, rl_insert }, /* 7 */ - { ISFUNC, rl_insert }, /* 8 */ - { ISFUNC, rl_insert }, /* 9 */ - - /* A little more punctuation. */ - { ISFUNC, rl_insert }, /* : */ - { ISFUNC, rl_insert }, /* ; */ - { ISFUNC, rl_insert }, /* < */ - { ISFUNC, rl_insert }, /* = */ - { ISFUNC, rl_insert }, /* > */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* @ */ - - /* Uppercase alphabet. */ - { ISFUNC, rl_insert }, /* A */ - { ISFUNC, rl_insert }, /* B */ - { ISFUNC, rl_insert }, /* C */ - { ISFUNC, rl_insert }, /* D */ - { ISFUNC, rl_insert }, /* E */ - { ISFUNC, rl_insert }, /* F */ - { ISFUNC, rl_insert }, /* G */ - { ISFUNC, rl_insert }, /* H */ - { ISFUNC, rl_insert }, /* I */ - { ISFUNC, rl_insert }, /* J */ - { ISFUNC, rl_insert }, /* K */ - { ISFUNC, rl_insert }, /* L */ - { ISFUNC, rl_insert }, /* M */ - { ISFUNC, rl_insert }, /* N */ - { ISFUNC, rl_insert }, /* O */ - { ISFUNC, rl_insert }, /* P */ - { ISFUNC, rl_insert }, /* Q */ - { ISFUNC, rl_insert }, /* R */ - { ISFUNC, rl_insert }, /* S */ - { ISFUNC, rl_insert }, /* T */ - { ISFUNC, rl_insert }, /* U */ - { ISFUNC, rl_insert }, /* V */ - { ISFUNC, rl_insert }, /* W */ - { ISFUNC, rl_insert }, /* X */ - { ISFUNC, rl_insert }, /* Y */ - { ISFUNC, rl_insert }, /* Z */ - - /* Some more punctuation. */ - { ISFUNC, rl_insert }, /* [ */ - { ISFUNC, rl_insert }, /* \ */ - { ISFUNC, rl_insert }, /* ] */ - { ISFUNC, rl_insert }, /* ^ */ - { ISFUNC, rl_insert }, /* _ */ - { ISFUNC, rl_insert }, /* ` */ - - /* Lowercase alphabet. */ - { ISFUNC, rl_insert }, /* a */ - { ISFUNC, rl_insert }, /* b */ - { ISFUNC, rl_insert }, /* c */ - { ISFUNC, rl_insert }, /* d */ - { ISFUNC, rl_insert }, /* e */ - { ISFUNC, rl_insert }, /* f */ - { ISFUNC, rl_insert }, /* g */ - { ISFUNC, rl_insert }, /* h */ - { ISFUNC, rl_insert }, /* i */ - { ISFUNC, rl_insert }, /* j */ - { ISFUNC, rl_insert }, /* k */ - { ISFUNC, rl_insert }, /* l */ - { ISFUNC, rl_insert }, /* m */ - { ISFUNC, rl_insert }, /* n */ - { ISFUNC, rl_insert }, /* o */ - { ISFUNC, rl_insert }, /* p */ - { ISFUNC, rl_insert }, /* q */ - { ISFUNC, rl_insert }, /* r */ - { ISFUNC, rl_insert }, /* s */ - { ISFUNC, rl_insert }, /* t */ - { ISFUNC, rl_insert }, /* u */ - { ISFUNC, rl_insert }, /* v */ - { ISFUNC, rl_insert }, /* w */ - { ISFUNC, rl_insert }, /* x */ - { ISFUNC, rl_insert }, /* y */ - { ISFUNC, rl_insert }, /* z */ - - /* Final punctuation. */ - { ISFUNC, rl_insert }, /* { */ - { ISFUNC, rl_insert }, /* | */ - { ISFUNC, rl_insert }, /* } */ - { ISFUNC, rl_insert }, /* ~ */ - { ISFUNC, rl_rubout }, /* RUBOUT */ - -#if KEYMAP_SIZE > 128 - /* Pure 8-bit characters (128 - 159). - These might be used in some - character sets. */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - { ISFUNC, rl_insert }, /* ? */ - - /* ISO Latin-1 characters (160 - 255) */ - { ISFUNC, rl_insert }, /* No-break space */ - { ISFUNC, rl_insert }, /* Inverted exclamation mark */ - { ISFUNC, rl_insert }, /* Cent sign */ - { ISFUNC, rl_insert }, /* Pound sign */ - { ISFUNC, rl_insert }, /* Currency sign */ - { ISFUNC, rl_insert }, /* Yen sign */ - { ISFUNC, rl_insert }, /* Broken bar */ - { ISFUNC, rl_insert }, /* Section sign */ - { ISFUNC, rl_insert }, /* Diaeresis */ - { ISFUNC, rl_insert }, /* Copyright sign */ - { ISFUNC, rl_insert }, /* Feminine ordinal indicator */ - { ISFUNC, rl_insert }, /* Left pointing double angle quotation mark */ - { ISFUNC, rl_insert }, /* Not sign */ - { ISFUNC, rl_insert }, /* Soft hyphen */ - { ISFUNC, rl_insert }, /* Registered sign */ - { ISFUNC, rl_insert }, /* Macron */ - { ISFUNC, rl_insert }, /* Degree sign */ - { ISFUNC, rl_insert }, /* Plus-minus sign */ - { ISFUNC, rl_insert }, /* Superscript two */ - { ISFUNC, rl_insert }, /* Superscript three */ - { ISFUNC, rl_insert }, /* Acute accent */ - { ISFUNC, rl_insert }, /* Micro sign */ - { ISFUNC, rl_insert }, /* Pilcrow sign */ - { ISFUNC, rl_insert }, /* Middle dot */ - { ISFUNC, rl_insert }, /* Cedilla */ - { ISFUNC, rl_insert }, /* Superscript one */ - { ISFUNC, rl_insert }, /* Masculine ordinal indicator */ - { ISFUNC, rl_insert }, /* Right pointing double angle quotation mark */ - { ISFUNC, rl_insert }, /* Vulgar fraction one quarter */ - { ISFUNC, rl_insert }, /* Vulgar fraction one half */ - { ISFUNC, rl_insert }, /* Vulgar fraction three quarters */ - { ISFUNC, rl_insert }, /* Inverted questionk mark */ - { ISFUNC, rl_insert }, /* Latin capital letter a with grave */ - { ISFUNC, rl_insert }, /* Latin capital letter a with acute */ - { ISFUNC, rl_insert }, /* Latin capital letter a with circumflex */ - { ISFUNC, rl_insert }, /* Latin capital letter a with tilde */ - { ISFUNC, rl_insert }, /* Latin capital letter a with diaeresis */ - { ISFUNC, rl_insert }, /* Latin capital letter a with ring above */ - { ISFUNC, rl_insert }, /* Latin capital letter ae */ - { ISFUNC, rl_insert }, /* Latin capital letter c with cedilla */ - { ISFUNC, rl_insert }, /* Latin capital letter e with grave */ - { ISFUNC, rl_insert }, /* Latin capital letter e with acute */ - { ISFUNC, rl_insert }, /* Latin capital letter e with circumflex */ - { ISFUNC, rl_insert }, /* Latin capital letter e with diaeresis */ - { ISFUNC, rl_insert }, /* Latin capital letter i with grave */ - { ISFUNC, rl_insert }, /* Latin capital letter i with acute */ - { ISFUNC, rl_insert }, /* Latin capital letter i with circumflex */ - { ISFUNC, rl_insert }, /* Latin capital letter i with diaeresis */ - { ISFUNC, rl_insert }, /* Latin capital letter eth (Icelandic) */ - { ISFUNC, rl_insert }, /* Latin capital letter n with tilde */ - { ISFUNC, rl_insert }, /* Latin capital letter o with grave */ - { ISFUNC, rl_insert }, /* Latin capital letter o with acute */ - { ISFUNC, rl_insert }, /* Latin capital letter o with circumflex */ - { ISFUNC, rl_insert }, /* Latin capital letter o with tilde */ - { ISFUNC, rl_insert }, /* Latin capital letter o with diaeresis */ - { ISFUNC, rl_insert }, /* Multiplication sign */ - { ISFUNC, rl_insert }, /* Latin capital letter o with stroke */ - { ISFUNC, rl_insert }, /* Latin capital letter u with grave */ - { ISFUNC, rl_insert }, /* Latin capital letter u with acute */ - { ISFUNC, rl_insert }, /* Latin capital letter u with circumflex */ - { ISFUNC, rl_insert }, /* Latin capital letter u with diaeresis */ - { ISFUNC, rl_insert }, /* Latin capital letter Y with acute */ - { ISFUNC, rl_insert }, /* Latin capital letter thorn (Icelandic) */ - { ISFUNC, rl_insert }, /* Latin small letter sharp s (German) */ - { ISFUNC, rl_insert }, /* Latin small letter a with grave */ - { ISFUNC, rl_insert }, /* Latin small letter a with acute */ - { ISFUNC, rl_insert }, /* Latin small letter a with circumflex */ - { ISFUNC, rl_insert }, /* Latin small letter a with tilde */ - { ISFUNC, rl_insert }, /* Latin small letter a with diaeresis */ - { ISFUNC, rl_insert }, /* Latin small letter a with ring above */ - { ISFUNC, rl_insert }, /* Latin small letter ae */ - { ISFUNC, rl_insert }, /* Latin small letter c with cedilla */ - { ISFUNC, rl_insert }, /* Latin small letter e with grave */ - { ISFUNC, rl_insert }, /* Latin small letter e with acute */ - { ISFUNC, rl_insert }, /* Latin small letter e with circumflex */ - { ISFUNC, rl_insert }, /* Latin small letter e with diaeresis */ - { ISFUNC, rl_insert }, /* Latin small letter i with grave */ - { ISFUNC, rl_insert }, /* Latin small letter i with acute */ - { ISFUNC, rl_insert }, /* Latin small letter i with circumflex */ - { ISFUNC, rl_insert }, /* Latin small letter i with diaeresis */ - { ISFUNC, rl_insert }, /* Latin small letter eth (Icelandic) */ - { ISFUNC, rl_insert }, /* Latin small letter n with tilde */ - { ISFUNC, rl_insert }, /* Latin small letter o with grave */ - { ISFUNC, rl_insert }, /* Latin small letter o with acute */ - { ISFUNC, rl_insert }, /* Latin small letter o with circumflex */ - { ISFUNC, rl_insert }, /* Latin small letter o with tilde */ - { ISFUNC, rl_insert }, /* Latin small letter o with diaeresis */ - { ISFUNC, rl_insert }, /* Division sign */ - { ISFUNC, rl_insert }, /* Latin small letter o with stroke */ - { ISFUNC, rl_insert }, /* Latin small letter u with grave */ - { ISFUNC, rl_insert }, /* Latin small letter u with acute */ - { ISFUNC, rl_insert }, /* Latin small letter u with circumflex */ - { ISFUNC, rl_insert }, /* Latin small letter u with diaeresis */ - { ISFUNC, rl_insert }, /* Latin small letter y with acute */ - { ISFUNC, rl_insert }, /* Latin small letter thorn (Icelandic) */ - { ISFUNC, rl_insert } /* Latin small letter y with diaeresis */ -#endif /* KEYMAP_SIZE > 128 */ -}; - -/* Unused for the time being. */ -#if 0 -KEYMAP_ENTRY_ARRAY vi_escape_keymap = { - /* The regular control keys come first. */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-@ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-a */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-b */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-c */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-d */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-e */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-f */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-g */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-h */ - { ISFUNC, rl_tab_insert}, /* Control-i */ - { ISFUNC, rl_emacs_editing_mode}, /* Control-j */ - { ISFUNC, rl_kill_line }, /* Control-k */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-l */ - { ISFUNC, rl_emacs_editing_mode}, /* Control-m */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-n */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-o */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-p */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-q */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-r */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-s */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-t */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-u */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-v */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-w */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-x */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-y */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-z */ - - { ISFUNC, rl_vi_movement_mode }, /* Control-[ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-\ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-] */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-^ */ - { ISFUNC, rl_vi_undo }, /* Control-_ */ - - /* The start of printing characters. */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* SPACE */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* ! */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* " */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* # */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* $ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* % */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* & */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* ' */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* ( */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* ) */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* * */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* + */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* , */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* - */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* . */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* / */ - - /* Regular digits. */ - { ISFUNC, rl_vi_arg_digit }, /* 0 */ - { ISFUNC, rl_vi_arg_digit }, /* 1 */ - { ISFUNC, rl_vi_arg_digit }, /* 2 */ - { ISFUNC, rl_vi_arg_digit }, /* 3 */ - { ISFUNC, rl_vi_arg_digit }, /* 4 */ - { ISFUNC, rl_vi_arg_digit }, /* 5 */ - { ISFUNC, rl_vi_arg_digit }, /* 6 */ - { ISFUNC, rl_vi_arg_digit }, /* 7 */ - { ISFUNC, rl_vi_arg_digit }, /* 8 */ - { ISFUNC, rl_vi_arg_digit }, /* 9 */ - - /* A little more punctuation. */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* : */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* ; */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* < */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* = */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* > */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* ? */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* @ */ - - /* Uppercase alphabet. */ - { ISFUNC, rl_do_lowercase_version }, /* A */ - { ISFUNC, rl_do_lowercase_version }, /* B */ - { ISFUNC, rl_do_lowercase_version }, /* C */ - { ISFUNC, rl_do_lowercase_version }, /* D */ - { ISFUNC, rl_do_lowercase_version }, /* E */ - { ISFUNC, rl_do_lowercase_version }, /* F */ - { ISFUNC, rl_do_lowercase_version }, /* G */ - { ISFUNC, rl_do_lowercase_version }, /* H */ - { ISFUNC, rl_do_lowercase_version }, /* I */ - { ISFUNC, rl_do_lowercase_version }, /* J */ - { ISFUNC, rl_do_lowercase_version }, /* K */ - { ISFUNC, rl_do_lowercase_version }, /* L */ - { ISFUNC, rl_do_lowercase_version }, /* M */ - { ISFUNC, rl_do_lowercase_version }, /* N */ - { ISFUNC, rl_do_lowercase_version }, /* O */ - { ISFUNC, rl_do_lowercase_version }, /* P */ - { ISFUNC, rl_do_lowercase_version }, /* Q */ - { ISFUNC, rl_do_lowercase_version }, /* R */ - { ISFUNC, rl_do_lowercase_version }, /* S */ - { ISFUNC, rl_do_lowercase_version }, /* T */ - { ISFUNC, rl_do_lowercase_version }, /* U */ - { ISFUNC, rl_do_lowercase_version }, /* V */ - { ISFUNC, rl_do_lowercase_version }, /* W */ - { ISFUNC, rl_do_lowercase_version }, /* X */ - { ISFUNC, rl_do_lowercase_version }, /* Y */ - { ISFUNC, rl_do_lowercase_version }, /* Z */ - - /* Some more punctuation. */ - { ISFUNC, rl_arrow_keys }, /* [ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* \ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* ] */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* ^ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* _ */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* ` */ - - /* Lowercase alphabet. */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* a */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* b */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* c */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* d */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* e */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* f */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* g */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* h */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* i */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* j */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* k */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* l */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* m */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* n */ - { ISFUNC, rl_arrow_keys }, /* o */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* p */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* q */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* r */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* s */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* t */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* u */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* v */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* w */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* x */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* y */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* z */ - - /* Final punctuation. */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* { */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* | */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* } */ - { ISFUNC, (rl_command_func_t *)0x0 }, /* ~ */ - { ISFUNC, rl_backward_kill_word }, /* RUBOUT */ - -#if KEYMAP_SIZE > 128 - /* Undefined keys. */ - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 }, - { ISFUNC, (rl_command_func_t *)0x0 } -#endif /* KEYMAP_SIZE > 128 */ -}; -#endif diff --git a/dep/src/readline/src/vi_mode.c b/dep/src/readline/src/vi_mode.c deleted file mode 100644 index 74d8acbbc05..00000000000 --- a/dep/src/readline/src/vi_mode.c +++ /dev/null @@ -1,1505 +0,0 @@ -/* vi_mode.c -- A vi emulation mode for Bash. - Derived from code written by Jeff Sparkes (jsparkes@bnr.ca). */ - -/* Copyright (C) 1987-2004 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ -#define READLINE_LIBRARY - -/* **************************************************************** */ -/* */ -/* VI Emulation Mode */ -/* */ -/* **************************************************************** */ -#include "rlconf.h" - -#if defined (VI_MODE) - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#include - -#if defined (HAVE_STDLIB_H) -# include -#else -# include "ansi_stdlib.h" -#endif /* HAVE_STDLIB_H */ - -#if defined (HAVE_UNISTD_H) -# include -#endif - -#include - -/* Some standard library routines. */ -#include "rldefs.h" -#include "rlmbutil.h" - -#include "readline.h" -#include "history.h" - -#include "rlprivate.h" -#include "xmalloc.h" - -#ifndef member -#define member(c, s) ((c) ? (char *)strchr ((s), (c)) != (char *)NULL : 0) -#endif - -int _rl_vi_last_command = 'i'; /* default `.' puts you in insert mode */ - -/* Non-zero means enter insertion mode. */ -static int _rl_vi_doing_insert; - -/* Command keys which do movement for xxx_to commands. */ -static const char *vi_motion = " hl^$0ftFT;,%wbeWBE|"; - -/* Keymap used for vi replace characters. Created dynamically since - rarely used. */ -static Keymap vi_replace_map; - -/* The number of characters inserted in the last replace operation. */ -static int vi_replace_count; - -/* If non-zero, we have text inserted after a c[motion] command that put - us implicitly into insert mode. Some people want this text to be - attached to the command so that it is `redoable' with `.'. */ -static int vi_continued_command; -static char *vi_insert_buffer; -static int vi_insert_buffer_size; - -static int _rl_vi_last_repeat = 1; -static int _rl_vi_last_arg_sign = 1; -static int _rl_vi_last_motion; -#if defined (HANDLE_MULTIBYTE) -static char _rl_vi_last_search_mbchar[MB_LEN_MAX]; -#else -static int _rl_vi_last_search_char; -#endif -static int _rl_vi_last_replacement; - -static int _rl_vi_last_key_before_insert; - -static int vi_redoing; - -/* Text modification commands. These are the `redoable' commands. */ -static const char *vi_textmod = "_*\\AaIiCcDdPpYyRrSsXx~"; - -/* Arrays for the saved marks. */ -static int vi_mark_chars['z' - 'a' + 1]; - -static void _rl_vi_stuff_insert PARAMS((int)); -static void _rl_vi_save_insert PARAMS((UNDO_LIST *)); -static int rl_digit_loop1 PARAMS((void)); - -void -_rl_vi_initialize_line () -{ - register int i; - - for (i = 0; i < sizeof (vi_mark_chars) / sizeof (int); i++) - vi_mark_chars[i] = -1; -} - -void -_rl_vi_reset_last () -{ - _rl_vi_last_command = 'i'; - _rl_vi_last_repeat = 1; - _rl_vi_last_arg_sign = 1; - _rl_vi_last_motion = 0; -} - -void -_rl_vi_set_last (key, repeat, sign) - int key, repeat, sign; -{ - _rl_vi_last_command = key; - _rl_vi_last_repeat = repeat; - _rl_vi_last_arg_sign = sign; -} - -/* A convenience function that calls _rl_vi_set_last to save the last command - information and enters insertion mode. */ -void -rl_vi_start_inserting (key, repeat, sign) - int key, repeat, sign; -{ - _rl_vi_set_last (key, repeat, sign); - rl_vi_insertion_mode (1, key); -} - -/* Is the command C a VI mode text modification command? */ -int -_rl_vi_textmod_command (c) - int c; -{ - return (member (c, vi_textmod)); -} - -static void -_rl_vi_stuff_insert (count) - int count; -{ - rl_begin_undo_group (); - while (count--) - rl_insert_text (vi_insert_buffer); - rl_end_undo_group (); -} - -/* Bound to `.'. Called from command mode, so we know that we have to - redo a text modification command. The default for _rl_vi_last_command - puts you back into insert mode. */ -int -rl_vi_redo (count, c) - int count, c; -{ - int r; - - if (!rl_explicit_arg) - { - rl_numeric_arg = _rl_vi_last_repeat; - rl_arg_sign = _rl_vi_last_arg_sign; - } - - r = 0; - vi_redoing = 1; - /* If we're redoing an insert with `i', stuff in the inserted text - and do not go into insertion mode. */ - if (_rl_vi_last_command == 'i' && vi_insert_buffer && *vi_insert_buffer) - { - _rl_vi_stuff_insert (count); - /* And back up point over the last character inserted. */ - if (rl_point > 0) - rl_point--; - } - else - r = _rl_dispatch (_rl_vi_last_command, _rl_keymap); - vi_redoing = 0; - - return (r); -} - -/* A placeholder for further expansion. */ -int -rl_vi_undo (count, key) - int count, key; -{ - return (rl_undo_command (count, key)); -} - -/* Yank the nth arg from the previous line into this line at point. */ -int -rl_vi_yank_arg (count, key) - int count, key; -{ - /* Readline thinks that the first word on a line is the 0th, while vi - thinks the first word on a line is the 1st. Compensate. */ - if (rl_explicit_arg) - rl_yank_nth_arg (count - 1, 0); - else - rl_yank_nth_arg ('$', 0); - - return (0); -} - -/* With an argument, move back that many history lines, else move to the - beginning of history. */ -int -rl_vi_fetch_history (count, c) - int count, c; -{ - int wanted; - - /* Giving an argument of n means we want the nth command in the history - file. The command number is interpreted the same way that the bash - `history' command does it -- that is, giving an argument count of 450 - to this command would get the command listed as number 450 in the - output of `history'. */ - if (rl_explicit_arg) - { - wanted = history_base + where_history () - count; - if (wanted <= 0) - rl_beginning_of_history (0, 0); - else - rl_get_previous_history (wanted, c); - } - else - rl_beginning_of_history (count, 0); - return (0); -} - -/* Search again for the last thing searched for. */ -int -rl_vi_search_again (count, key) - int count, key; -{ - switch (key) - { - case 'n': - rl_noninc_reverse_search_again (count, key); - break; - - case 'N': - rl_noninc_forward_search_again (count, key); - break; - } - return (0); -} - -/* Do a vi style search. */ -int -rl_vi_search (count, key) - int count, key; -{ - switch (key) - { - case '?': - rl_noninc_forward_search (count, key); - break; - - case '/': - rl_noninc_reverse_search (count, key); - break; - - default: - rl_ding (); - break; - } - return (0); -} - -/* Completion, from vi's point of view. */ -int -rl_vi_complete (ignore, key) - int ignore, key; -{ - if ((rl_point < rl_end) && (!whitespace (rl_line_buffer[rl_point]))) - { - if (!whitespace (rl_line_buffer[rl_point + 1])) - rl_vi_end_word (1, 'E'); - rl_point++; - } - - if (key == '*') - rl_complete_internal ('*'); /* Expansion and replacement. */ - else if (key == '=') - rl_complete_internal ('?'); /* List possible completions. */ - else if (key == '\\') - rl_complete_internal (TAB); /* Standard Readline completion. */ - else - rl_complete (0, key); - - if (key == '*' || key == '\\') - rl_vi_start_inserting (key, 1, rl_arg_sign); - - return (0); -} - -/* Tilde expansion for vi mode. */ -int -rl_vi_tilde_expand (ignore, key) - int ignore, key; -{ - rl_tilde_expand (0, key); - rl_vi_start_inserting (key, 1, rl_arg_sign); - return (0); -} - -/* Previous word in vi mode. */ -int -rl_vi_prev_word (count, key) - int count, key; -{ - if (count < 0) - return (rl_vi_next_word (-count, key)); - - if (rl_point == 0) - { - rl_ding (); - return (0); - } - - if (_rl_uppercase_p (key)) - rl_vi_bWord (count, key); - else - rl_vi_bword (count, key); - - return (0); -} - -/* Next word in vi mode. */ -int -rl_vi_next_word (count, key) - int count, key; -{ - if (count < 0) - return (rl_vi_prev_word (-count, key)); - - if (rl_point >= (rl_end - 1)) - { - rl_ding (); - return (0); - } - - if (_rl_uppercase_p (key)) - rl_vi_fWord (count, key); - else - rl_vi_fword (count, key); - return (0); -} - -/* Move to the end of the ?next? word. */ -int -rl_vi_end_word (count, key) - int count, key; -{ - if (count < 0) - { - rl_ding (); - return -1; - } - - if (_rl_uppercase_p (key)) - rl_vi_eWord (count, key); - else - rl_vi_eword (count, key); - return (0); -} - -/* Move forward a word the way that 'W' does. */ -int -rl_vi_fWord (count, ignore) - int count, ignore; -{ - while (count-- && rl_point < (rl_end - 1)) - { - /* Skip until whitespace. */ - while (!whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end) - rl_point++; - - /* Now skip whitespace. */ - while (whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end) - rl_point++; - } - return (0); -} - -int -rl_vi_bWord (count, ignore) - int count, ignore; -{ - while (count-- && rl_point > 0) - { - /* If we are at the start of a word, move back to whitespace so - we will go back to the start of the previous word. */ - if (!whitespace (rl_line_buffer[rl_point]) && - whitespace (rl_line_buffer[rl_point - 1])) - rl_point--; - - while (rl_point > 0 && whitespace (rl_line_buffer[rl_point])) - rl_point--; - - if (rl_point > 0) - { - while (--rl_point >= 0 && !whitespace (rl_line_buffer[rl_point])); - rl_point++; - } - } - return (0); -} - -int -rl_vi_eWord (count, ignore) - int count, ignore; -{ - while (count-- && rl_point < (rl_end - 1)) - { - if (!whitespace (rl_line_buffer[rl_point])) - rl_point++; - - /* Move to the next non-whitespace character (to the start of the - next word). */ - while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point])) - rl_point++; - - if (rl_point && rl_point < rl_end) - { - /* Skip whitespace. */ - while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point])) - rl_point++; - - /* Skip until whitespace. */ - while (rl_point < rl_end && !whitespace (rl_line_buffer[rl_point])) - rl_point++; - - /* Move back to the last character of the word. */ - rl_point--; - } - } - return (0); -} - -int -rl_vi_fword (count, ignore) - int count, ignore; -{ - while (count-- && rl_point < (rl_end - 1)) - { - /* Move to white space (really non-identifer). */ - if (_rl_isident (rl_line_buffer[rl_point])) - { - while (_rl_isident (rl_line_buffer[rl_point]) && rl_point < rl_end) - rl_point++; - } - else /* if (!whitespace (rl_line_buffer[rl_point])) */ - { - while (!_rl_isident (rl_line_buffer[rl_point]) && - !whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end) - rl_point++; - } - - /* Move past whitespace. */ - while (whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end) - rl_point++; - } - return (0); -} - -int -rl_vi_bword (count, ignore) - int count, ignore; -{ - while (count-- && rl_point > 0) - { - int last_is_ident; - - /* If we are at the start of a word, move back to whitespace - so we will go back to the start of the previous word. */ - if (!whitespace (rl_line_buffer[rl_point]) && - whitespace (rl_line_buffer[rl_point - 1])) - rl_point--; - - /* If this character and the previous character are `opposite', move - back so we don't get messed up by the rl_point++ down there in - the while loop. Without this code, words like `l;' screw up the - function. */ - last_is_ident = _rl_isident (rl_line_buffer[rl_point - 1]); - if ((_rl_isident (rl_line_buffer[rl_point]) && !last_is_ident) || - (!_rl_isident (rl_line_buffer[rl_point]) && last_is_ident)) - rl_point--; - - while (rl_point > 0 && whitespace (rl_line_buffer[rl_point])) - rl_point--; - - if (rl_point > 0) - { - if (_rl_isident (rl_line_buffer[rl_point])) - while (--rl_point >= 0 && _rl_isident (rl_line_buffer[rl_point])); - else - while (--rl_point >= 0 && !_rl_isident (rl_line_buffer[rl_point]) && - !whitespace (rl_line_buffer[rl_point])); - rl_point++; - } - } - return (0); -} - -int -rl_vi_eword (count, ignore) - int count, ignore; -{ - while (count-- && rl_point < rl_end - 1) - { - if (!whitespace (rl_line_buffer[rl_point])) - rl_point++; - - while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point])) - rl_point++; - - if (rl_point < rl_end) - { - if (_rl_isident (rl_line_buffer[rl_point])) - while (++rl_point < rl_end && _rl_isident (rl_line_buffer[rl_point])); - else - while (++rl_point < rl_end && !_rl_isident (rl_line_buffer[rl_point]) - && !whitespace (rl_line_buffer[rl_point])); - } - rl_point--; - } - return (0); -} - -int -rl_vi_insert_beg (count, key) - int count, key; -{ - rl_beg_of_line (1, key); - rl_vi_insertion_mode (1, key); - return (0); -} - -int -rl_vi_append_mode (count, key) - int count, key; -{ - if (rl_point < rl_end) - { - if (MB_CUR_MAX == 1 || rl_byte_oriented) - rl_point++; - else - { - int point = rl_point; - rl_forward_char (1, key); - if (point == rl_point) - rl_point = rl_end; - } - } - rl_vi_insertion_mode (1, key); - return (0); -} - -int -rl_vi_append_eol (count, key) - int count, key; -{ - rl_end_of_line (1, key); - rl_vi_append_mode (1, key); - return (0); -} - -/* What to do in the case of C-d. */ -int -rl_vi_eof_maybe (count, c) - int count, c; -{ - return (rl_newline (1, '\n')); -} - -/* Insertion mode stuff. */ - -/* Switching from one mode to the other really just involves - switching keymaps. */ -int -rl_vi_insertion_mode (count, key) - int count, key; -{ - _rl_keymap = vi_insertion_keymap; - _rl_vi_last_key_before_insert = key; - return (0); -} - -static void -_rl_vi_save_insert (up) - UNDO_LIST *up; -{ - int len, start, end; - - if (up == 0) - { - if (vi_insert_buffer_size >= 1) - vi_insert_buffer[0] = '\0'; - return; - } - - start = up->start; - end = up->end; - len = end - start + 1; - if (len >= vi_insert_buffer_size) - { - vi_insert_buffer_size += (len + 32) - (len % 32); - vi_insert_buffer = (char *)xrealloc (vi_insert_buffer, vi_insert_buffer_size); - } - strncpy (vi_insert_buffer, rl_line_buffer + start, len - 1); - vi_insert_buffer[len-1] = '\0'; -} - -void -_rl_vi_done_inserting () -{ - if (_rl_vi_doing_insert) - { - /* The `C', `s', and `S' commands set this. */ - rl_end_undo_group (); - /* Now, the text between rl_undo_list->next->start and - rl_undo_list->next->end is what was inserted while in insert - mode. It gets copied to VI_INSERT_BUFFER because it depends - on absolute indices into the line which may change (though they - probably will not). */ - _rl_vi_doing_insert = 0; - _rl_vi_save_insert (rl_undo_list->next); - vi_continued_command = 1; - } - else - { - if ((_rl_vi_last_key_before_insert == 'i' || _rl_vi_last_key_before_insert == 'a') && rl_undo_list) - _rl_vi_save_insert (rl_undo_list); - /* XXX - Other keys probably need to be checked. */ - else if (_rl_vi_last_key_before_insert == 'C') - rl_end_undo_group (); - while (_rl_undo_group_level > 0) - rl_end_undo_group (); - vi_continued_command = 0; - } -} - -int -rl_vi_movement_mode (count, key) - int count, key; -{ - if (rl_point > 0) - rl_backward_char (1, key); - - _rl_keymap = vi_movement_keymap; - _rl_vi_done_inserting (); - return (0); -} - -int -rl_vi_arg_digit (count, c) - int count, c; -{ - if (c == '0' && rl_numeric_arg == 1 && !rl_explicit_arg) - return (rl_beg_of_line (1, c)); - else - return (rl_digit_argument (count, c)); -} - -/* Change the case of the next COUNT characters. */ -#if defined (HANDLE_MULTIBYTE) -static int -_rl_vi_change_mbchar_case (count) - int count; -{ - wchar_t wc; - char mb[MB_LEN_MAX+1]; - int mblen; - mbstate_t ps; - - memset (&ps, 0, sizeof (mbstate_t)); - if (_rl_adjust_point (rl_line_buffer, rl_point, &ps) > 0) - count--; - while (count-- && rl_point < rl_end) - { - mbrtowc (&wc, rl_line_buffer + rl_point, rl_end - rl_point, &ps); - if (iswupper (wc)) - wc = towlower (wc); - else if (iswlower (wc)) - wc = towupper (wc); - else - { - /* Just skip over chars neither upper nor lower case */ - rl_forward_char (1, 0); - continue; - } - - /* Vi is kind of strange here. */ - if (wc) - { - mblen = wcrtomb (mb, wc, &ps); - if (mblen >= 0) - mb[mblen] = '\0'; - rl_begin_undo_group (); - rl_delete (1, 0); - rl_insert_text (mb); - rl_end_undo_group (); - rl_vi_check (); - } - else - rl_forward_char (1, 0); - } - - return 0; -} -#endif - -int -rl_vi_change_case (count, ignore) - int count, ignore; -{ - int c, p; - - /* Don't try this on an empty line. */ - if (rl_point >= rl_end) - return (0); - - c = 0; -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - return (_rl_vi_change_mbchar_case (count)); -#endif - - while (count-- && rl_point < rl_end) - { - if (_rl_uppercase_p (rl_line_buffer[rl_point])) - c = _rl_to_lower (rl_line_buffer[rl_point]); - else if (_rl_lowercase_p (rl_line_buffer[rl_point])) - c = _rl_to_upper (rl_line_buffer[rl_point]); - else - { - /* Just skip over characters neither upper nor lower case. */ - rl_forward_char (1, c); - continue; - } - - /* Vi is kind of strange here. */ - if (c) - { - p = rl_point; - rl_begin_undo_group (); - rl_vi_delete (1, c); - if (rl_point < p) /* Did we retreat at EOL? */ - rl_point++; - _rl_insert_char (1, c); - rl_end_undo_group (); - rl_vi_check (); - } - else - rl_forward_char (1, c); - } - return (0); -} - -int -rl_vi_put (count, key) - int count, key; -{ - if (!_rl_uppercase_p (key) && (rl_point + 1 <= rl_end)) - rl_point = _rl_find_next_mbchar (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO); - - while (count--) - rl_yank (1, key); - - rl_backward_char (1, key); - return (0); -} - -int -rl_vi_check () -{ - if (rl_point && rl_point == rl_end) - { - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - rl_point = _rl_find_prev_mbchar (rl_line_buffer, rl_point, MB_FIND_NONZERO); - else - rl_point--; - } - return (0); -} - -int -rl_vi_column (count, key) - int count, key; -{ - if (count > rl_end) - rl_end_of_line (1, key); - else - rl_point = count - 1; - return (0); -} - -int -rl_vi_domove (key, nextkey) - int key, *nextkey; -{ - int c, save; - int old_end; - - rl_mark = rl_point; - RL_SETSTATE(RL_STATE_MOREINPUT); - c = rl_read_key (); - RL_UNSETSTATE(RL_STATE_MOREINPUT); - *nextkey = c; - - if (!member (c, vi_motion)) - { - if (_rl_digit_p (c)) - { - save = rl_numeric_arg; - rl_numeric_arg = _rl_digit_value (c); - rl_explicit_arg = 1; - rl_digit_loop1 (); - rl_numeric_arg *= save; - RL_SETSTATE(RL_STATE_MOREINPUT); - c = rl_read_key (); /* real command */ - RL_UNSETSTATE(RL_STATE_MOREINPUT); - *nextkey = c; - } - else if (key == c && (key == 'd' || key == 'y' || key == 'c')) - { - rl_mark = rl_end; - rl_beg_of_line (1, c); - _rl_vi_last_motion = c; - return (0); - } - else - return (-1); - } - - _rl_vi_last_motion = c; - - /* Append a blank character temporarily so that the motion routines - work right at the end of the line. */ - old_end = rl_end; - rl_line_buffer[rl_end++] = ' '; - rl_line_buffer[rl_end] = '\0'; - - _rl_dispatch (c, _rl_keymap); - - /* Remove the blank that we added. */ - rl_end = old_end; - rl_line_buffer[rl_end] = '\0'; - if (rl_point > rl_end) - rl_point = rl_end; - - /* No change in position means the command failed. */ - if (rl_mark == rl_point) - return (-1); - - /* rl_vi_f[wW]ord () leaves the cursor on the first character of the next - word. If we are not at the end of the line, and we are on a - non-whitespace character, move back one (presumably to whitespace). */ - if ((_rl_to_upper (c) == 'W') && rl_point < rl_end && rl_point > rl_mark && - !whitespace (rl_line_buffer[rl_point])) - rl_point--; - - /* If cw or cW, back up to the end of a word, so the behaviour of ce - or cE is the actual result. Brute-force, no subtlety. */ - if (key == 'c' && rl_point >= rl_mark && (_rl_to_upper (c) == 'W')) - { - /* Don't move farther back than where we started. */ - while (rl_point > rl_mark && whitespace (rl_line_buffer[rl_point])) - rl_point--; - - /* Posix.2 says that if cw or cW moves the cursor towards the end of - the line, the character under the cursor should be deleted. */ - if (rl_point == rl_mark) - rl_point++; - else - { - /* Move past the end of the word so that the kill doesn't - remove the last letter of the previous word. Only do this - if we are not at the end of the line. */ - if (rl_point >= 0 && rl_point < (rl_end - 1) && !whitespace (rl_line_buffer[rl_point])) - rl_point++; - } - } - - if (rl_mark < rl_point) - SWAP (rl_point, rl_mark); - - return (0); -} - -/* A simplified loop for vi. Don't dispatch key at end. - Don't recognize minus sign? - Should this do rl_save_prompt/rl_restore_prompt? */ -static int -rl_digit_loop1 () -{ - int key, c; - - RL_SETSTATE(RL_STATE_NUMERICARG); - while (1) - { - if (rl_numeric_arg > 1000000) - { - rl_explicit_arg = rl_numeric_arg = 0; - rl_ding (); - rl_clear_message (); - RL_UNSETSTATE(RL_STATE_NUMERICARG); - return 1; - } - rl_message ("(arg: %d) ", rl_arg_sign * rl_numeric_arg); - RL_SETSTATE(RL_STATE_MOREINPUT); - key = c = rl_read_key (); - RL_UNSETSTATE(RL_STATE_MOREINPUT); - - if (c >= 0 && _rl_keymap[c].type == ISFUNC && - _rl_keymap[c].function == rl_universal_argument) - { - rl_numeric_arg *= 4; - continue; - } - - c = UNMETA (c); - if (_rl_digit_p (c)) - { - if (rl_explicit_arg) - rl_numeric_arg = (rl_numeric_arg * 10) + _rl_digit_value (c); - else - rl_numeric_arg = _rl_digit_value (c); - rl_explicit_arg = 1; - } - else - { - rl_clear_message (); - rl_stuff_char (key); - break; - } - } - - RL_UNSETSTATE(RL_STATE_NUMERICARG); - return (0); -} - -int -rl_vi_delete_to (count, key) - int count, key; -{ - int c; - - if (_rl_uppercase_p (key)) - rl_stuff_char ('$'); - else if (vi_redoing) - rl_stuff_char (_rl_vi_last_motion); - - if (rl_vi_domove (key, &c)) - { - rl_ding (); - return -1; - } - - /* These are the motion commands that do not require adjusting the - mark. */ - if ((strchr (" l|h^0bB", c) == 0) && (rl_mark < rl_end)) - rl_mark++; - - rl_kill_text (rl_point, rl_mark); - return (0); -} - -int -rl_vi_change_to (count, key) - int count, key; -{ - int c, start_pos; - - if (_rl_uppercase_p (key)) - rl_stuff_char ('$'); - else if (vi_redoing) - rl_stuff_char (_rl_vi_last_motion); - - start_pos = rl_point; - - if (rl_vi_domove (key, &c)) - { - rl_ding (); - return -1; - } - - /* These are the motion commands that do not require adjusting the - mark. c[wW] are handled by special-case code in rl_vi_domove(), - and already leave the mark at the correct location. */ - if ((strchr (" l|hwW^0bB", c) == 0) && (rl_mark < rl_end)) - rl_mark++; - - /* The cursor never moves with c[wW]. */ - if ((_rl_to_upper (c) == 'W') && rl_point < start_pos) - rl_point = start_pos; - - if (vi_redoing) - { - if (vi_insert_buffer && *vi_insert_buffer) - rl_begin_undo_group (); - rl_delete_text (rl_point, rl_mark); - if (vi_insert_buffer && *vi_insert_buffer) - { - rl_insert_text (vi_insert_buffer); - rl_end_undo_group (); - } - } - else - { - rl_begin_undo_group (); /* to make the `u' command work */ - rl_kill_text (rl_point, rl_mark); - /* `C' does not save the text inserted for undoing or redoing. */ - if (_rl_uppercase_p (key) == 0) - _rl_vi_doing_insert = 1; - rl_vi_start_inserting (key, rl_numeric_arg, rl_arg_sign); - } - - return (0); -} - -int -rl_vi_yank_to (count, key) - int count, key; -{ - int c, save = rl_point; - - if (_rl_uppercase_p (key)) - rl_stuff_char ('$'); - - if (rl_vi_domove (key, &c)) - { - rl_ding (); - return -1; - } - - /* These are the motion commands that do not require adjusting the - mark. */ - if ((strchr (" l|h^0%bB", c) == 0) && (rl_mark < rl_end)) - rl_mark++; - - rl_begin_undo_group (); - rl_kill_text (rl_point, rl_mark); - rl_end_undo_group (); - rl_do_undo (); - rl_point = save; - - return (0); -} - -int -rl_vi_delete (count, key) - int count, key; -{ - int end; - - if (rl_end == 0) - { - rl_ding (); - return -1; - } - - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - end = _rl_find_next_mbchar (rl_line_buffer, rl_point, count, MB_FIND_NONZERO); - else - end = rl_point + count; - - if (end >= rl_end) - end = rl_end; - - rl_kill_text (rl_point, end); - - if (rl_point > 0 && rl_point == rl_end) - rl_backward_char (1, key); - return (0); -} - -int -rl_vi_back_to_indent (count, key) - int count, key; -{ - rl_beg_of_line (1, key); - while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point])) - rl_point++; - return (0); -} - -int -rl_vi_first_print (count, key) - int count, key; -{ - return (rl_vi_back_to_indent (1, key)); -} - -int -rl_vi_char_search (count, key) - int count, key; -{ -#if defined (HANDLE_MULTIBYTE) - static char *target; - static int mb_len; -#else - static char target; -#endif - static int orig_dir, dir; - - if (key == ';' || key == ',') - dir = key == ';' ? orig_dir : -orig_dir; - else - { - if (vi_redoing) -#if defined (HANDLE_MULTIBYTE) - target = _rl_vi_last_search_mbchar; -#else - target = _rl_vi_last_search_char; -#endif - else - { -#if defined (HANDLE_MULTIBYTE) - mb_len = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX); - target = _rl_vi_last_search_mbchar; -#else - RL_SETSTATE(RL_STATE_MOREINPUT); - _rl_vi_last_search_char = target = rl_read_key (); - RL_UNSETSTATE(RL_STATE_MOREINPUT); -#endif - } - - switch (key) - { - case 't': - orig_dir = dir = FTO; - break; - - case 'T': - orig_dir = dir = BTO; - break; - - case 'f': - orig_dir = dir = FFIND; - break; - - case 'F': - orig_dir = dir = BFIND; - break; - } - } - -#if defined (HANDLE_MULTIBYTE) - return (_rl_char_search_internal (count, dir, target, mb_len)); -#else - return (_rl_char_search_internal (count, dir, target)); -#endif -} - -/* Match brackets */ -int -rl_vi_match (ignore, key) - int ignore, key; -{ - int count = 1, brack, pos, tmp, pre; - - pos = rl_point; - if ((brack = rl_vi_bracktype (rl_line_buffer[rl_point])) == 0) - { - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - { - while ((brack = rl_vi_bracktype (rl_line_buffer[rl_point])) == 0) - { - pre = rl_point; - rl_forward_char (1, key); - if (pre == rl_point) - break; - } - } - else - while ((brack = rl_vi_bracktype (rl_line_buffer[rl_point])) == 0 && - rl_point < rl_end - 1) - rl_forward_char (1, key); - - if (brack <= 0) - { - rl_point = pos; - rl_ding (); - return -1; - } - } - - pos = rl_point; - - if (brack < 0) - { - while (count) - { - tmp = pos; - if (MB_CUR_MAX == 1 || rl_byte_oriented) - pos--; - else - { - pos = _rl_find_prev_mbchar (rl_line_buffer, pos, MB_FIND_ANY); - if (tmp == pos) - pos--; - } - if (pos >= 0) - { - int b = rl_vi_bracktype (rl_line_buffer[pos]); - if (b == -brack) - count--; - else if (b == brack) - count++; - } - else - { - rl_ding (); - return -1; - } - } - } - else - { /* brack > 0 */ - while (count) - { - if (MB_CUR_MAX == 1 || rl_byte_oriented) - pos++; - else - pos = _rl_find_next_mbchar (rl_line_buffer, pos, 1, MB_FIND_ANY); - - if (pos < rl_end) - { - int b = rl_vi_bracktype (rl_line_buffer[pos]); - if (b == -brack) - count--; - else if (b == brack) - count++; - } - else - { - rl_ding (); - return -1; - } - } - } - rl_point = pos; - return (0); -} - -int -rl_vi_bracktype (c) - int c; -{ - switch (c) - { - case '(': return 1; - case ')': return -1; - case '[': return 2; - case ']': return -2; - case '{': return 3; - case '}': return -3; - default: return 0; - } -} - -/* XXX - think about reading an entire mbchar with _rl_read_mbchar and - inserting it in one bunch instead of the loop below (like in - rl_vi_char_search or _rl_vi_change_mbchar_case). Set c to mbchar[0] - for test against 033 or ^C. Make sure that _rl_read_mbchar does - this right. */ -int -rl_vi_change_char (count, key) - int count, key; -{ - int c, p; - - if (vi_redoing) - c = _rl_vi_last_replacement; - else - { - RL_SETSTATE(RL_STATE_MOREINPUT); - _rl_vi_last_replacement = c = rl_read_key (); - RL_UNSETSTATE(RL_STATE_MOREINPUT); - } - - if (c == '\033' || c == CTRL ('C')) - return -1; - - rl_begin_undo_group (); - while (count-- && rl_point < rl_end) - { - p = rl_point; - rl_vi_delete (1, c); -#if defined (HANDLE_MULTIBYTE) - if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - while (_rl_insert_char (1, c)) - { - RL_SETSTATE (RL_STATE_MOREINPUT); - c = rl_read_key (); - RL_UNSETSTATE (RL_STATE_MOREINPUT); - } - else -#endif - { - if (rl_point < p) /* Did we retreat at EOL? */ - rl_point++; - _rl_insert_char (1, c); - } - } - rl_end_undo_group (); - - return (0); -} - -int -rl_vi_subst (count, key) - int count, key; -{ - /* If we are redoing, rl_vi_change_to will stuff the last motion char */ - if (vi_redoing == 0) - rl_stuff_char ((key == 'S') ? 'c' : 'l'); /* `S' == `cc', `s' == `cl' */ - - return (rl_vi_change_to (count, 'c')); -} - -int -rl_vi_overstrike (count, key) - int count, key; -{ - if (_rl_vi_doing_insert == 0) - { - _rl_vi_doing_insert = 1; - rl_begin_undo_group (); - } - - if (count > 0) - { - _rl_overwrite_char (count, key); - vi_replace_count += count; - } - - return (0); -} - -int -rl_vi_overstrike_delete (count, key) - int count, key; -{ - int i, s; - - for (i = 0; i < count; i++) - { - if (vi_replace_count == 0) - { - rl_ding (); - break; - } - s = rl_point; - - if (rl_do_undo ()) - vi_replace_count--; - - if (rl_point == s) - rl_backward_char (1, key); - } - - if (vi_replace_count == 0 && _rl_vi_doing_insert) - { - rl_end_undo_group (); - rl_do_undo (); - _rl_vi_doing_insert = 0; - } - return (0); -} - -int -rl_vi_replace (count, key) - int count, key; -{ - int i; - - vi_replace_count = 0; - - if (!vi_replace_map) - { - vi_replace_map = rl_make_bare_keymap (); - - for (i = ' '; i < KEYMAP_SIZE; i++) - vi_replace_map[i].function = rl_vi_overstrike; - - vi_replace_map[RUBOUT].function = rl_vi_overstrike_delete; - vi_replace_map[ESC].function = rl_vi_movement_mode; - vi_replace_map[RETURN].function = rl_newline; - vi_replace_map[NEWLINE].function = rl_newline; - - /* If the normal vi insertion keymap has ^H bound to erase, do the - same here. Probably should remove the assignment to RUBOUT up - there, but I don't think it will make a difference in real life. */ - if (vi_insertion_keymap[CTRL ('H')].type == ISFUNC && - vi_insertion_keymap[CTRL ('H')].function == rl_rubout) - vi_replace_map[CTRL ('H')].function = rl_vi_overstrike_delete; - - } - _rl_keymap = vi_replace_map; - return (0); -} - -#if 0 -/* Try to complete the word we are standing on or the word that ends with - the previous character. A space matches everything. Word delimiters are - space and ;. */ -int -rl_vi_possible_completions() -{ - int save_pos = rl_point; - - if (rl_line_buffer[rl_point] != ' ' && rl_line_buffer[rl_point] != ';') - { - while (rl_point < rl_end && rl_line_buffer[rl_point] != ' ' && - rl_line_buffer[rl_point] != ';') - rl_point++; - } - else if (rl_line_buffer[rl_point - 1] == ';') - { - rl_ding (); - return (0); - } - - rl_possible_completions (); - rl_point = save_pos; - - return (0); -} -#endif - -/* Functions to save and restore marks. */ -int -rl_vi_set_mark (count, key) - int count, key; -{ - int ch; - - RL_SETSTATE(RL_STATE_MOREINPUT); - ch = rl_read_key (); - RL_UNSETSTATE(RL_STATE_MOREINPUT); - - if (ch < 'a' || ch > 'z') - { - rl_ding (); - return -1; - } - ch -= 'a'; - vi_mark_chars[ch] = rl_point; - return 0; -} - -int -rl_vi_goto_mark (count, key) - int count, key; -{ - int ch; - - RL_SETSTATE(RL_STATE_MOREINPUT); - ch = rl_read_key (); - RL_UNSETSTATE(RL_STATE_MOREINPUT); - - if (ch == '`') - { - rl_point = rl_mark; - return 0; - } - else if (ch < 'a' || ch > 'z') - { - rl_ding (); - return -1; - } - - ch -= 'a'; - if (vi_mark_chars[ch] == -1) - { - rl_ding (); - return -1; - } - rl_point = vi_mark_chars[ch]; - return 0; -} - -#endif /* VI_MODE */ diff --git a/dep/src/readline/src/xmalloc.c b/dep/src/readline/src/xmalloc.c deleted file mode 100644 index 8985d340d39..00000000000 --- a/dep/src/readline/src/xmalloc.c +++ /dev/null @@ -1,88 +0,0 @@ -/* xmalloc.c -- safe versions of malloc and realloc */ - -/* Copyright (C) 1991 Free Software Foundation, Inc. - - This file is part of GNU Readline, a library for reading lines - of text with interactive input and history editing. - - Readline is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2, or (at your option) any - later version. - - Readline is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Readline; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ -#define READLINE_LIBRARY - -#if defined (HAVE_CONFIG_H) -#include -#endif - -#include - -#if defined (HAVE_STDLIB_H) -# include -#else -# include "ansi_stdlib.h" -#endif /* HAVE_STDLIB_H */ - -#include "xmalloc.h" - -/* **************************************************************** */ -/* */ -/* Memory Allocation and Deallocation. */ -/* */ -/* **************************************************************** */ - -static void -memory_error_and_abort (fname) - char *fname; -{ - fprintf (stderr, "%s: out of virtual memory\n", fname); - exit (2); -} - -/* Return a pointer to free()able block of memory large enough - to hold BYTES number of bytes. If the memory cannot be allocated, - print an error message and abort. */ -PTR_T -xmalloc (bytes) - size_t bytes; -{ - PTR_T temp; - - temp = malloc (bytes); - if (temp == 0) - memory_error_and_abort ("xmalloc"); - return (temp); -} - -PTR_T -xrealloc (pointer, bytes) - PTR_T pointer; - size_t bytes; -{ - PTR_T temp; - - temp = pointer ? realloc (pointer, bytes) : malloc (bytes); - - if (temp == 0) - memory_error_and_abort ("xrealloc"); - return (temp); -} - -/* Use this as the function to call when adding unwind protects so we - don't need to know what free() returns. */ -void -xfree (string) - PTR_T string; -{ - if (string) - free (string); -} diff --git a/dep/src/readline/src/xmalloc.h b/dep/src/readline/src/xmalloc.h deleted file mode 100644 index 9cb08ba21f1..00000000000 --- a/dep/src/readline/src/xmalloc.h +++ /dev/null @@ -1,46 +0,0 @@ -/* xmalloc.h -- memory allocation that aborts on errors. */ - -/* Copyright (C) 1999 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#if !defined (_XMALLOC_H_) -#define _XMALLOC_H_ - -#if defined (READLINE_LIBRARY) -# include "rlstdc.h" -#else -# include -#endif - -#ifndef PTR_T - -#ifdef __STDC__ -# define PTR_T void * -#else -# define PTR_T char * -#endif - -#endif /* !PTR_T */ - -extern PTR_T xmalloc PARAMS((size_t)); -extern PTR_T xrealloc PARAMS((void *, size_t)); -extern void xfree PARAMS((void *)); - -#endif /* _XMALLOC_H_ */ diff --git a/dep/windows/include/readline/chardefs.h b/dep/windows/include/readline/chardefs.h deleted file mode 100644 index 450730b6b72..00000000000 --- a/dep/windows/include/readline/chardefs.h +++ /dev/null @@ -1,168 +0,0 @@ -/* chardefs.h -- Character definitions for readline. */ - -/* Copyright (C) 1994 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#ifndef _CHARDEFS_H_ -#define _CHARDEFS_H_ - -#include - -#if defined (HAVE_CONFIG_H) -# if defined (HAVE_STRING_H) -# if ! defined (STDC_HEADERS) && defined (HAVE_MEMORY_H) -# include -# endif -# include -# endif /* HAVE_STRING_H */ -# if defined (HAVE_STRINGS_H) -# include -# endif /* HAVE_STRINGS_H */ -#else -# include -#endif /* !HAVE_CONFIG_H */ - -#ifndef whitespace -#define whitespace(c) (((c) == ' ') || ((c) == '\t')) -#endif - -#ifdef CTRL -# undef CTRL -#endif -#ifdef UNCTRL -# undef UNCTRL -#endif - -/* Some character stuff. */ -#define control_character_threshold 0x020 /* Smaller than this is control. */ -#define control_character_mask 0x1f /* 0x20 - 1 */ -#define control_character_bit 0x40 /* 0x000000, must be off. */ - -/* Some character stuff. */ -#define control_character_threshold 0x020 /* Smaller than this is control. */ -#define control_character_mask 0x1f /* 0x20 - 1 */ -#define meta_character_threshold 0x07f /* Larger than this is Meta. */ -#define control_character_bit 0x40 /* 0x000000, must be off. */ -#define meta_character_bit 0x080 /* x0000000, must be on. */ -#define largest_char 255 /* Largest character value. */ - -#define CTRL_CHAR(c) ((c) < control_character_threshold && (((c) & 0x80) == 0)) -#define META_CHAR(c) ((c) > meta_character_threshold && (c) <= largest_char) - -#define CTRL(c) ((c) & control_character_mask) -#define META(c) ((c) | meta_character_bit) - -#define UNMETA(c) ((c) & (~meta_character_bit)) -#define UNCTRL(c) _rl_to_upper(((c)|control_character_bit)) - -#if defined STDC_HEADERS || (!defined (isascii) && !defined (HAVE_ISASCII)) -# define IN_CTYPE_DOMAIN(c) 1 -#else -# define IN_CTYPE_DOMAIN(c) isascii(c) -#endif - -#if !defined (isxdigit) && !defined (HAVE_ISXDIGIT) -# define isxdigit(c) (isdigit((c)) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F')) -#endif - -#if defined (CTYPE_NON_ASCII) -# define NON_NEGATIVE(c) 1 -#else -# define NON_NEGATIVE(c) ((unsigned char)(c) == (c)) -#endif - -/* Some systems define these; we want our definitions. */ -#undef ISPRINT - -#define ISALNUM(c) (IN_CTYPE_DOMAIN (c) && isalnum (c)) -#define ISALPHA(c) (IN_CTYPE_DOMAIN (c) && isalpha (c)) -#define ISDIGIT(c) (IN_CTYPE_DOMAIN (c) && isdigit (c)) -#define ISLOWER(c) (IN_CTYPE_DOMAIN (c) && islower (c)) -#define ISPRINT(c) (IN_CTYPE_DOMAIN (c) && isprint (c)) -#define ISUPPER(c) (IN_CTYPE_DOMAIN (c) && isupper (c)) -#define ISXDIGIT(c) (IN_CTYPE_DOMAIN (c) && isxdigit (c)) - -#define _rl_lowercase_p(c) (NON_NEGATIVE(c) && ISLOWER(c)) -#define _rl_uppercase_p(c) (NON_NEGATIVE(c) && ISUPPER(c)) -#define _rl_digit_p(c) ((c) >= '0' && (c) <= '9') - -#define _rl_pure_alphabetic(c) (NON_NEGATIVE(c) && ISALPHA(c)) -#define ALPHABETIC(c) (NON_NEGATIVE(c) && ISALNUM(c)) - -#ifndef _rl_to_upper -# define _rl_to_upper(c) (_rl_lowercase_p(c) ? toupper((unsigned char)c) : (c)) -# define _rl_to_lower(c) (_rl_uppercase_p(c) ? tolower((unsigned char)c) : (c)) -#endif - -#ifndef _rl_digit_value -# define _rl_digit_value(x) ((x) - '0') -#endif - -#ifndef _rl_isident -# define _rl_isident(c) (ISALNUM(c) || (c) == '_') -#endif - -#ifndef ISOCTAL -# define ISOCTAL(c) ((c) >= '0' && (c) <= '7') -#endif -#define OCTVALUE(c) ((c) - '0') - -#define HEXVALUE(c) \ - (((c) >= 'a' && (c) <= 'f') \ - ? (c)-'a'+10 \ - : (c) >= 'A' && (c) <= 'F' ? (c)-'A'+10 : (c)-'0') - -#ifndef NEWLINE -#define NEWLINE '\n' -#endif - -#ifndef RETURN -#define RETURN CTRL('M') -#endif - -#ifndef RUBOUT -#define RUBOUT 0x7f -#endif - -#ifndef TAB -#define TAB '\t' -#endif - -#ifdef ABORT_CHAR -#undef ABORT_CHAR -#endif -#define ABORT_CHAR CTRL('G') - -#ifdef PAGE -#undef PAGE -#endif -#define PAGE CTRL('L') - -#ifdef SPACE -#undef SPACE -#endif -#define SPACE ' ' /* XXX - was 0x20 */ - -#ifdef ESC -#undef ESC -#endif -#define ESC CTRL('[') - -#endif /* _CHARDEFS_H_ */ diff --git a/dep/windows/include/readline/history.h b/dep/windows/include/readline/history.h deleted file mode 100644 index fafe224f248..00000000000 --- a/dep/windows/include/readline/history.h +++ /dev/null @@ -1,266 +0,0 @@ -/* history.h -- the names of functions that you can call in history. */ -/* Copyright (C) 1989-2003 Free Software Foundation, Inc. - - This file contains the GNU History Library (the Library), a set of - routines for managing the text of previously typed lines. - - The Library is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - The Library is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#ifndef _HISTORY_H_ -#define _HISTORY_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include /* XXX - for history timestamp code */ - -#if defined READLINE_LIBRARY -# include "rlstdc.h" -# include "rltypedefs.h" -#else -# include -# include -#endif - -#ifdef __STDC__ -typedef void *histdata_t; -#else -typedef char *histdata_t; -#endif - -/* The structure used to store a history entry. */ -typedef struct _hist_entry { - char *line; - char *timestamp; /* char * rather than time_t for read/write */ - histdata_t data; -} HIST_ENTRY; - -/* Size of the history-library-managed space in history entry HS. */ -#define HISTENT_BYTES(hs) (strlen ((hs)->line) + strlen ((hs)->timestamp)) - -/* A structure used to pass the current state of the history stuff around. */ -typedef struct _hist_state { - HIST_ENTRY **entries; /* Pointer to the entries themselves. */ - int offset; /* The location pointer within this array. */ - int length; /* Number of elements within this array. */ - int size; /* Number of slots allocated to this array. */ - int flags; -} HISTORY_STATE; - -/* Flag values for the `flags' member of HISTORY_STATE. */ -#define HS_STIFLED 0x01 - -/* Initialization and state management. */ - -/* Begin a session in which the history functions might be used. This - just initializes the interactive variables. */ -READLINE_DLL_IMPEXP void using_history PARAMS((void)); - -/* Return the current HISTORY_STATE of the history. */ -READLINE_DLL_IMPEXP HISTORY_STATE *history_get_history_state PARAMS((void)); - -/* Set the state of the current history array to STATE. */ -READLINE_DLL_IMPEXP void history_set_history_state PARAMS((HISTORY_STATE *)); - -/* Manage the history list. */ - -/* Place STRING at the end of the history list. - The associated data field (if any) is set to NULL. */ -READLINE_DLL_IMPEXP void add_history PARAMS((const char *)); - -/* Change the timestamp associated with the most recent history entry to - STRING. */ -READLINE_DLL_IMPEXP void add_history_time PARAMS((const char *)); - -/* A reasonably useless function, only here for completeness. WHICH - is the magic number that tells us which element to delete. The - elements are numbered from 0. */ -READLINE_DLL_IMPEXP HIST_ENTRY *remove_history PARAMS((int)); - -/* Free the history entry H and return any application-specific data - associated with it. */ -READLINE_DLL_IMPEXP histdata_t free_history_entry PARAMS((HIST_ENTRY *)); - -/* Make the history entry at WHICH have LINE and DATA. This returns - the old entry so you can dispose of the data. In the case of an - invalid WHICH, a NULL pointer is returned. */ -READLINE_DLL_IMPEXP HIST_ENTRY *replace_history_entry PARAMS((int, const char *, histdata_t)); - -/* Clear the history list and start over. */ -READLINE_DLL_IMPEXP void clear_history PARAMS((void)); - -/* Stifle the history list, remembering only MAX number of entries. */ -READLINE_DLL_IMPEXP void stifle_history PARAMS((int)); - -/* Stop stifling the history. This returns the previous amount the - history was stifled by. The value is positive if the history was - stifled, negative if it wasn't. */ -READLINE_DLL_IMPEXP int unstifle_history PARAMS((void)); - -/* Return 1 if the history is stifled, 0 if it is not. */ -READLINE_DLL_IMPEXP int history_is_stifled PARAMS((void)); - -/* Information about the history list. */ - -/* Return a NULL terminated array of HIST_ENTRY which is the current input - history. Element 0 of this list is the beginning of time. If there - is no history, return NULL. */ -READLINE_DLL_IMPEXP HIST_ENTRY **history_list PARAMS((void)); - -/* Returns the number which says what history element we are now - looking at. */ -READLINE_DLL_IMPEXP int where_history PARAMS((void)); - -/* Return the history entry at the current position, as determined by - history_offset. If there is no entry there, return a NULL pointer. */ -READLINE_DLL_IMPEXP HIST_ENTRY *current_history PARAMS((void)); - -/* Return the history entry which is logically at OFFSET in the history - array. OFFSET is relative to history_base. */ -READLINE_DLL_IMPEXP HIST_ENTRY *history_get PARAMS((int)); - -/* Return the timestamp associated with the HIST_ENTRY * passed as an - argument */ -READLINE_DLL_IMPEXP time_t history_get_time PARAMS((HIST_ENTRY *)); - -/* Return the number of bytes that the primary history entries are using. - This just adds up the lengths of the_history->lines. */ -READLINE_DLL_IMPEXP int history_total_bytes PARAMS((void)); - -/* Moving around the history list. */ - -/* Set the position in the history list to POS. */ -READLINE_DLL_IMPEXP int history_set_pos PARAMS((int)); - -/* Back up history_offset to the previous history entry, and return - a pointer to that entry. If there is no previous entry, return - a NULL pointer. */ -READLINE_DLL_IMPEXP HIST_ENTRY *previous_history PARAMS((void)); - -/* Move history_offset forward to the next item in the input_history, - and return the a pointer to that entry. If there is no next entry, - return a NULL pointer. */ -READLINE_DLL_IMPEXP HIST_ENTRY *next_history PARAMS((void)); - -/* Searching the history list. */ - -/* Search the history for STRING, starting at history_offset. - If DIRECTION < 0, then the search is through previous entries, - else through subsequent. If the string is found, then - current_history () is the history entry, and the value of this function - is the offset in the line of that history entry that the string was - found in. Otherwise, nothing is changed, and a -1 is returned. */ -READLINE_DLL_IMPEXP int history_search PARAMS((const char *, int)); - -/* Search the history for STRING, starting at history_offset. - The search is anchored: matching lines must begin with string. - DIRECTION is as in history_search(). */ -READLINE_DLL_IMPEXP int history_search_prefix PARAMS((const char *, int)); - -/* Search for STRING in the history list, starting at POS, an - absolute index into the list. DIR, if negative, says to search - backwards from POS, else forwards. - Returns the absolute index of the history element where STRING - was found, or -1 otherwise. */ -READLINE_DLL_IMPEXP int history_search_pos PARAMS((const char *, int, int)); - -/* Managing the history file. */ - -/* Add the contents of FILENAME to the history list, a line at a time. - If FILENAME is NULL, then read from ~/.history. Returns 0 if - successful, or errno if not. */ -READLINE_DLL_IMPEXP int read_history PARAMS((const char *)); - -/* Read a range of lines from FILENAME, adding them to the history list. - Start reading at the FROM'th line and end at the TO'th. If FROM - is zero, start at the beginning. If TO is less than FROM, read - until the end of the file. If FILENAME is NULL, then read from - ~/.history. Returns 0 if successful, or errno if not. */ -READLINE_DLL_IMPEXP int read_history_range PARAMS((const char *, int, int)); - -/* Write the current history to FILENAME. If FILENAME is NULL, - then write the history list to ~/.history. Values returned - are as in read_history (). */ -READLINE_DLL_IMPEXP int write_history PARAMS((const char *)); - -/* Append NELEMENT entries to FILENAME. The entries appended are from - the end of the list minus NELEMENTs up to the end of the list. */ -READLINE_DLL_IMPEXP int append_history PARAMS((int, const char *)); - -/* Truncate the history file, leaving only the last NLINES lines. */ -READLINE_DLL_IMPEXP int history_truncate_file PARAMS((const char *, int)); - -/* History expansion. */ - -/* Expand the string STRING, placing the result into OUTPUT, a pointer - to a string. Returns: - - 0) If no expansions took place (or, if the only change in - the text was the de-slashifying of the history expansion - character) - 1) If expansions did take place - -1) If there was an error in expansion. - 2) If the returned line should just be printed. - - If an error ocurred in expansion, then OUTPUT contains a descriptive - error message. */ -READLINE_DLL_IMPEXP int history_expand PARAMS((char *, char **)); - -/* Extract a string segment consisting of the FIRST through LAST - arguments present in STRING. Arguments are broken up as in - the shell. */ -READLINE_DLL_IMPEXP char *history_arg_extract PARAMS((int, int, const char *)); - -/* Return the text of the history event beginning at the current - offset into STRING. Pass STRING with *INDEX equal to the - history_expansion_char that begins this specification. - DELIMITING_QUOTE is a character that is allowed to end the string - specification for what to search for in addition to the normal - characters `:', ` ', `\t', `\n', and sometimes `?'. */ -READLINE_DLL_IMPEXP char *get_history_event PARAMS((const char *, int *, int)); - -/* Return an array of tokens, much as the shell might. The tokens are - parsed out of STRING. */ -READLINE_DLL_IMPEXP char **history_tokenize PARAMS((const char *)); - -/* Exported history variables. */ -READLINE_DLL_IMPEXP int history_base; -READLINE_DLL_IMPEXP int history_length; -READLINE_DLL_IMPEXP int history_max_entries; -READLINE_DLL_IMPEXP char history_expansion_char; -READLINE_DLL_IMPEXP char history_subst_char; -READLINE_DLL_IMPEXP char *history_word_delimiters; -READLINE_DLL_IMPEXP char history_comment_char; -READLINE_DLL_IMPEXP char *history_no_expand_chars; -READLINE_DLL_IMPEXP char *history_search_delimiter_chars; -READLINE_DLL_IMPEXP int history_quotes_inhibit_expansion; - -READLINE_DLL_IMPEXP int history_write_timestamps; - -/* Backwards compatibility */ -READLINE_DLL_IMPEXP int max_input_history; - -/* If set, this function is called to decide whether or not a particular - history expansion should be treated as a special case for the calling - application and not expanded. */ -READLINE_DLL_IMPEXP rl_linebuf_func_t *history_inhibit_expansion_function; - -#ifdef __cplusplus -} -#endif - -#endif /* !_HISTORY_H_ */ diff --git a/dep/windows/include/readline/keymaps.h b/dep/windows/include/readline/keymaps.h deleted file mode 100644 index 66fa2a5ec14..00000000000 --- a/dep/windows/include/readline/keymaps.h +++ /dev/null @@ -1,103 +0,0 @@ -/* keymaps.h -- Manipulation of readline keymaps. */ - -/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#ifndef _KEYMAPS_H_ -#define _KEYMAPS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined (READLINE_LIBRARY) -# include "rlstdc.h" -# include "chardefs.h" -# include "rltypedefs.h" -#else -# include -# include -# include -#endif - -/* A keymap contains one entry for each key in the ASCII set. - Each entry consists of a type and a pointer. - FUNCTION is the address of a function to run, or the - address of a keymap to indirect through. - TYPE says which kind of thing FUNCTION is. */ -typedef struct _keymap_entry { - char type; - rl_command_func_t *function; -} KEYMAP_ENTRY; - -/* This must be large enough to hold bindings for all of the characters - in a desired character set (e.g, 128 for ASCII, 256 for ISO Latin-x, - and so on) plus one for subsequence matching. */ -#define KEYMAP_SIZE 257 -#define ANYOTHERKEY KEYMAP_SIZE-1 - -/* I wanted to make the above structure contain a union of: - union { rl_command_func_t *function; struct _keymap_entry *keymap; } value; - but this made it impossible for me to create a static array. - Maybe I need C lessons. */ - -typedef KEYMAP_ENTRY KEYMAP_ENTRY_ARRAY[KEYMAP_SIZE]; -typedef KEYMAP_ENTRY *Keymap; - -/* The values that TYPE can have in a keymap entry. */ -#define ISFUNC 0 -#define ISKMAP 1 -#define ISMACR 2 - -extern KEYMAP_ENTRY_ARRAY emacs_standard_keymap, emacs_meta_keymap, emacs_ctlx_keymap; -extern KEYMAP_ENTRY_ARRAY vi_insertion_keymap, vi_movement_keymap; - -/* Return a new, empty keymap. - Free it with free() when you are done. */ -extern Keymap rl_make_bare_keymap PARAMS((void)); - -/* Return a new keymap which is a copy of MAP. */ -extern Keymap rl_copy_keymap PARAMS((Keymap)); - -/* Return a new keymap with the printing characters bound to rl_insert, - the lowercase Meta characters bound to run their equivalents, and - the Meta digits bound to produce numeric arguments. */ -extern Keymap rl_make_keymap PARAMS((void)); - -/* Free the storage associated with a keymap. */ -extern void rl_discard_keymap PARAMS((Keymap)); - -/* These functions actually appear in bind.c */ - -/* Return the keymap corresponding to a given name. Names look like - `emacs' or `emacs-meta' or `vi-insert'. */ -extern Keymap rl_get_keymap_by_name PARAMS((const char *)); - -/* Return the current keymap. */ -extern Keymap rl_get_keymap PARAMS((void)); - -/* Set the current keymap to MAP. */ -extern void rl_set_keymap PARAMS((Keymap)); - -#ifdef __cplusplus -} -#endif - -#endif /* _KEYMAPS_H_ */ diff --git a/dep/windows/include/readline/readline.h b/dep/windows/include/readline/readline.h deleted file mode 100644 index 6d913e75b68..00000000000 --- a/dep/windows/include/readline/readline.h +++ /dev/null @@ -1,836 +0,0 @@ -/* Readline.h -- the names of functions callable from within readline. */ - -/* Copyright (C) 1987-2004 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#if !defined (_READLINE_H_) -#define _READLINE_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined (READLINE_LIBRARY) -# include "rlstdc.h" -# include "rltypedefs.h" -# include "keymaps.h" -# include "tilde.h" -#else -# include -# include -# include -# include -#endif - -/* Hex-encoded Readline version number. */ -#define RL_READLINE_VERSION 0x0500 /* Readline 5.0 */ -#define RL_VERSION_MAJOR 5 -#define RL_VERSION_MINOR 0 - -/* Readline data structures. */ - -/* Maintaining the state of undo. We remember individual deletes and inserts - on a chain of things to do. */ - -/* The actions that undo knows how to undo. Notice that UNDO_DELETE means - to insert some text, and UNDO_INSERT means to delete some text. I.e., - the code tells undo what to undo, not how to undo it. */ -enum undo_code { UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END }; - -/* What an element of THE_UNDO_LIST looks like. */ -typedef struct undo_list { - struct undo_list *next; - int start, end; /* Where the change took place. */ - char *text; /* The text to insert, if undoing a delete. */ - enum undo_code what; /* Delete, Insert, Begin, End. */ -} UNDO_LIST; - -/* The current undo list for RL_LINE_BUFFER. */ -READLINE_DLL_IMPEXP UNDO_LIST *rl_undo_list; - -/* The data structure for mapping textual names to code addresses. */ -typedef struct _funmap { - const char *name; - rl_command_func_t *function; -} FUNMAP; - -READLINE_DLL_IMPEXP FUNMAP **funmap; - -/* **************************************************************** */ -/* */ -/* Functions available to bind to key sequences */ -/* */ -/* **************************************************************** */ - -/* Bindable commands for numeric arguments. */ -READLINE_DLL_IMPEXP int rl_digit_argument PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_universal_argument PARAMS((int, int)); - -/* Bindable commands for moving the cursor. */ -READLINE_DLL_IMPEXP int rl_forward_byte PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_forward_char PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_forward PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_backward_byte PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_backward_char PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_backward PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_beg_of_line PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_end_of_line PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_forward_word PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_backward_word PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_refresh_line PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_clear_screen PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_arrow_keys PARAMS((int, int)); - -/* Bindable commands for inserting and deleting text. */ -READLINE_DLL_IMPEXP int rl_insert PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_quoted_insert PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_tab_insert PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_newline PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_do_lowercase_version PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_rubout PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_delete PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_rubout_or_delete PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_delete_horizontal_space PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_delete_or_show_completions PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_insert_comment PARAMS((int, int)); - -/* Bindable commands for changing case. */ -READLINE_DLL_IMPEXP int rl_upcase_word PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_downcase_word PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_capitalize_word PARAMS((int, int)); - -/* Bindable commands for transposing characters and words. */ -READLINE_DLL_IMPEXP int rl_transpose_words PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_transpose_chars PARAMS((int, int)); - -/* Bindable commands for searching within a line. */ -READLINE_DLL_IMPEXP int rl_char_search PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_backward_char_search PARAMS((int, int)); - -/* Bindable commands for readline's interface to the command history. */ -READLINE_DLL_IMPEXP int rl_beginning_of_history PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_end_of_history PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_get_next_history PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_get_previous_history PARAMS((int, int)); - -/* Bindable commands for managing the mark and region. */ -READLINE_DLL_IMPEXP int rl_set_mark PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_exchange_point_and_mark PARAMS((int, int)); - -/* Bindable commands to set the editing mode (emacs or vi). */ -READLINE_DLL_IMPEXP int rl_vi_editing_mode PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_emacs_editing_mode PARAMS((int, int)); - -/* Bindable commands to change the insert mode (insert or overwrite) */ -READLINE_DLL_IMPEXP int rl_overwrite_mode PARAMS((int, int)); - -/* Bindable commands for managing key bindings. */ -READLINE_DLL_IMPEXP int rl_re_read_init_file PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_dump_functions PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_dump_macros PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_dump_variables PARAMS((int, int)); - -/* Bindable commands for word completion. */ -READLINE_DLL_IMPEXP int rl_complete PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_possible_completions PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_insert_completions PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_menu_complete PARAMS((int, int)); - -/* Bindable commands for killing and yanking text, and managing the kill ring. */ -READLINE_DLL_IMPEXP int rl_kill_word PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_backward_kill_word PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_kill_line PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_backward_kill_line PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_kill_full_line PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_unix_word_rubout PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_unix_filename_rubout PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_unix_line_discard PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_copy_region_to_kill PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_kill_region PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_copy_forward_word PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_copy_backward_word PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_yank PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_yank_pop PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_yank_nth_arg PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_yank_last_arg PARAMS((int, int)); -/* Not available unless __CYGWIN__ or _WIN32 is defined. */ -#if defined (__CYGWIN__) || defined (_WIN32) -READLINE_DLL_IMPEXP int rl_paste_from_clipboard PARAMS((int, int)); -#endif - -/* Bindable commands for incremental searching. */ -READLINE_DLL_IMPEXP int rl_reverse_search_history PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_forward_search_history PARAMS((int, int)); - -/* Bindable keyboard macro commands. */ -READLINE_DLL_IMPEXP int rl_start_kbd_macro PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_end_kbd_macro PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_call_last_kbd_macro PARAMS((int, int)); - -/* Bindable undo commands. */ -READLINE_DLL_IMPEXP int rl_revert_line PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_undo_command PARAMS((int, int)); - -/* Bindable tilde expansion commands. */ -READLINE_DLL_IMPEXP int rl_tilde_expand PARAMS((int, int)); - -/* Bindable terminal control commands. */ -READLINE_DLL_IMPEXP int rl_restart_output PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_stop_output PARAMS((int, int)); - -/* Miscellaneous bindable commands. */ -READLINE_DLL_IMPEXP int rl_abort PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_tty_status PARAMS((int, int)); - -/* Bindable commands for incremental and non-incremental history searching. */ -READLINE_DLL_IMPEXP int rl_history_search_forward PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_history_search_backward PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_noninc_forward_search PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_noninc_reverse_search PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_noninc_forward_search_again PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_noninc_reverse_search_again PARAMS((int, int)); - -/* Bindable command used when inserting a matching close character. */ -READLINE_DLL_IMPEXP int rl_insert_close PARAMS((int, int)); - -/* Not available unless READLINE_CALLBACKS is defined. */ -READLINE_DLL_IMPEXP void rl_callback_handler_install PARAMS((const char *, rl_vcpfunc_t *)); -READLINE_DLL_IMPEXP void rl_callback_read_char PARAMS((void)); -READLINE_DLL_IMPEXP void rl_callback_handler_remove PARAMS((void)); - -/* Things for vi mode. Not available unless readline is compiled -DVI_MODE. */ -/* VI-mode bindable commands. */ -READLINE_DLL_IMPEXP int rl_vi_redo PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_undo PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_yank_arg PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_fetch_history PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_search_again PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_search PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_complete PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_tilde_expand PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_prev_word PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_next_word PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_end_word PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_insert_beg PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_append_mode PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_append_eol PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_eof_maybe PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_insertion_mode PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_movement_mode PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_arg_digit PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_change_case PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_put PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_column PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_delete_to PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_change_to PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_yank_to PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_delete PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_back_to_indent PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_first_print PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_char_search PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_match PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_change_char PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_subst PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_overstrike PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_overstrike_delete PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_replace PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_set_mark PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_goto_mark PARAMS((int, int)); - -/* VI-mode utility functions. */ -READLINE_DLL_IMPEXP int rl_vi_check PARAMS((void)); -READLINE_DLL_IMPEXP int rl_vi_domove PARAMS((int, int *)); -READLINE_DLL_IMPEXP int rl_vi_bracktype PARAMS((int)); - -READLINE_DLL_IMPEXP void rl_vi_start_inserting PARAMS((int, int, int)); - -/* VI-mode pseudo-bindable commands, used as utility functions. */ -READLINE_DLL_IMPEXP int rl_vi_fWord PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_bWord PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_eWord PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_fword PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_bword PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_vi_eword PARAMS((int, int)); - -/* **************************************************************** */ -/* */ -/* Well Published Functions */ -/* */ -/* **************************************************************** */ - -/* Readline functions. */ -/* Read a line of input. Prompt with PROMPT. A NULL PROMPT means none. */ -READLINE_DLL_IMPEXP char *readline PARAMS((const char *)); - -READLINE_DLL_IMPEXP int rl_set_prompt PARAMS((const char *)); -READLINE_DLL_IMPEXP int rl_expand_prompt PARAMS((char *)); - -READLINE_DLL_IMPEXP int rl_initialize PARAMS((void)); - -/* Undocumented; unused by readline */ -READLINE_DLL_IMPEXP int rl_discard_argument PARAMS((void)); - -/* Utility functions to bind keys to readline commands. */ -READLINE_DLL_IMPEXP int rl_add_defun PARAMS((const char *, rl_command_func_t *, int)); -READLINE_DLL_IMPEXP int rl_bind_key PARAMS((int, rl_command_func_t *)); -READLINE_DLL_IMPEXP int rl_bind_key_in_map PARAMS((int, rl_command_func_t *, Keymap)); -READLINE_DLL_IMPEXP int rl_unbind_key PARAMS((int)); -READLINE_DLL_IMPEXP int rl_unbind_key_in_map PARAMS((int, Keymap)); -READLINE_DLL_IMPEXP int rl_bind_key_if_unbound PARAMS((int, rl_command_func_t *)); -READLINE_DLL_IMPEXP int rl_bind_key_if_unbound_in_map PARAMS((int, rl_command_func_t *, Keymap)); -READLINE_DLL_IMPEXP int rl_unbind_function_in_map PARAMS((rl_command_func_t *, Keymap)); -READLINE_DLL_IMPEXP int rl_unbind_command_in_map PARAMS((const char *, Keymap)); -READLINE_DLL_IMPEXP int rl_bind_keyseq PARAMS((const char *, rl_command_func_t *)); -READLINE_DLL_IMPEXP int rl_bind_keyseq_in_map PARAMS((const char *, rl_command_func_t *, Keymap)); -READLINE_DLL_IMPEXP int rl_bind_keyseq_if_unbound PARAMS((const char *, rl_command_func_t *)); -READLINE_DLL_IMPEXP int rl_bind_keyseq_if_unbound_in_map PARAMS((const char *, rl_command_func_t *, Keymap)); -READLINE_DLL_IMPEXP int rl_generic_bind PARAMS((int, const char *, char *, Keymap)); -READLINE_DLL_IMPEXP int rl_variable_bind PARAMS((const char *, const char *)); - -/* Backwards compatibility, use rl_bind_keyseq_in_map instead. */ -READLINE_DLL_IMPEXP int rl_set_key PARAMS((const char *, rl_command_func_t *, Keymap)); - -/* Backwards compatibility, use rl_generic_bind instead. */ -READLINE_DLL_IMPEXP int rl_macro_bind PARAMS((const char *, const char *, Keymap)); - -/* Undocumented in the texinfo manual; not really useful to programs. */ -READLINE_DLL_IMPEXP int rl_translate_keyseq PARAMS((const char *, char *, int *)); -READLINE_DLL_IMPEXP char *rl_untranslate_keyseq PARAMS((int)); - -READLINE_DLL_IMPEXP rl_command_func_t *rl_named_function PARAMS((const char *)); -READLINE_DLL_IMPEXP rl_command_func_t *rl_function_of_keyseq PARAMS((const char *, Keymap, int *)); - -READLINE_DLL_IMPEXP void rl_list_funmap_names PARAMS((void)); -READLINE_DLL_IMPEXP char **rl_invoking_keyseqs_in_map PARAMS((rl_command_func_t *, Keymap)); -READLINE_DLL_IMPEXP char **rl_invoking_keyseqs PARAMS((rl_command_func_t *)); - -READLINE_DLL_IMPEXP void rl_function_dumper PARAMS((int)); -READLINE_DLL_IMPEXP void rl_macro_dumper PARAMS((int)); -READLINE_DLL_IMPEXP void rl_variable_dumper PARAMS((int)); - -READLINE_DLL_IMPEXP int rl_read_init_file PARAMS((const char *)); -READLINE_DLL_IMPEXP int rl_parse_and_bind PARAMS((char *)); - -/* Functions for manipulating keymaps. */ -READLINE_DLL_IMPEXP Keymap rl_make_bare_keymap PARAMS((void)); -READLINE_DLL_IMPEXP Keymap rl_copy_keymap PARAMS((Keymap)); -READLINE_DLL_IMPEXP Keymap rl_make_keymap PARAMS((void)); -READLINE_DLL_IMPEXP void rl_discard_keymap PARAMS((Keymap)); - -READLINE_DLL_IMPEXP Keymap rl_get_keymap_by_name PARAMS((const char *)); -READLINE_DLL_IMPEXP char *rl_get_keymap_name PARAMS((Keymap)); -READLINE_DLL_IMPEXP void rl_set_keymap PARAMS((Keymap)); -READLINE_DLL_IMPEXP Keymap rl_get_keymap PARAMS((void)); -/* Undocumented; used internally only. */ -READLINE_DLL_IMPEXP void rl_set_keymap_from_edit_mode PARAMS((void)); -READLINE_DLL_IMPEXP char *rl_get_keymap_name_from_edit_mode PARAMS((void)); - -/* Functions for manipulating the funmap, which maps command names to functions. */ -READLINE_DLL_IMPEXP int rl_add_funmap_entry PARAMS((const char *, rl_command_func_t *)); -READLINE_DLL_IMPEXP const char **rl_funmap_names PARAMS((void)); -/* Undocumented, only used internally -- there is only one funmap, and this - function may be called only once. */ -READLINE_DLL_IMPEXP void rl_initialize_funmap PARAMS((void)); - -/* Utility functions for managing keyboard macros. */ -READLINE_DLL_IMPEXP void rl_push_macro_input PARAMS((char *)); - -/* Functions for undoing, from undo.c */ -READLINE_DLL_IMPEXP void rl_add_undo PARAMS((enum undo_code, int, int, char *)); -READLINE_DLL_IMPEXP void rl_free_undo_list PARAMS((void)); -READLINE_DLL_IMPEXP int rl_do_undo PARAMS((void)); -READLINE_DLL_IMPEXP int rl_begin_undo_group PARAMS((void)); -READLINE_DLL_IMPEXP int rl_end_undo_group PARAMS((void)); -READLINE_DLL_IMPEXP int rl_modifying PARAMS((int, int)); - -/* Functions for redisplay. */ -READLINE_DLL_IMPEXP void rl_redisplay PARAMS((void)); -READLINE_DLL_IMPEXP int rl_on_new_line PARAMS((void)); -READLINE_DLL_IMPEXP int rl_on_new_line_with_prompt PARAMS((void)); -READLINE_DLL_IMPEXP int rl_forced_update_display PARAMS((void)); -READLINE_DLL_IMPEXP int rl_clear_message PARAMS((void)); -READLINE_DLL_IMPEXP int rl_reset_line_state PARAMS((void)); -READLINE_DLL_IMPEXP int rl_crlf PARAMS((void)); - -#if defined (USE_VARARGS) && defined (PREFER_STDARG) -READLINE_DLL_IMPEXP int rl_message (const char *, ...) __attribute__((__format__ (printf, 1, 2))); -#else -READLINE_DLL_IMPEXP int rl_message (); -#endif - -READLINE_DLL_IMPEXP int rl_show_char PARAMS((int)); - -/* Undocumented in texinfo manual. */ -READLINE_DLL_IMPEXP int rl_character_len PARAMS((int, int)); - -/* Save and restore internal prompt redisplay information. */ -READLINE_DLL_IMPEXP void rl_save_prompt PARAMS((void)); -READLINE_DLL_IMPEXP void rl_restore_prompt PARAMS((void)); - -/* Modifying text. */ -READLINE_DLL_IMPEXP void rl_replace_line PARAMS((const char *, int)); -READLINE_DLL_IMPEXP int rl_insert_text PARAMS((const char *)); -READLINE_DLL_IMPEXP int rl_delete_text PARAMS((int, int)); -READLINE_DLL_IMPEXP int rl_kill_text PARAMS((int, int)); -READLINE_DLL_IMPEXP char *rl_copy_text PARAMS((int, int)); - -/* Terminal and tty mode management. */ -READLINE_DLL_IMPEXP void rl_prep_terminal PARAMS((int)); -READLINE_DLL_IMPEXP void rl_deprep_terminal PARAMS((void)); -READLINE_DLL_IMPEXP void rl_tty_set_default_bindings PARAMS((Keymap)); -READLINE_DLL_IMPEXP void rl_tty_unset_default_bindings PARAMS((Keymap)); - -READLINE_DLL_IMPEXP int rl_reset_terminal PARAMS((const char *)); -READLINE_DLL_IMPEXP void rl_resize_terminal PARAMS((void)); -READLINE_DLL_IMPEXP void rl_set_screen_size PARAMS((int, int)); -READLINE_DLL_IMPEXP void rl_get_screen_size PARAMS((int *, int *)); - -READLINE_DLL_IMPEXP char *rl_get_termcap PARAMS((const char *)); - -/* Functions for character input. */ -READLINE_DLL_IMPEXP int rl_stuff_char PARAMS((int)); -READLINE_DLL_IMPEXP int rl_execute_next PARAMS((int)); -READLINE_DLL_IMPEXP int rl_clear_pending_input PARAMS((void)); -READLINE_DLL_IMPEXP int rl_read_key PARAMS((void)); -READLINE_DLL_IMPEXP int rl_getc PARAMS((FILE *)); -READLINE_DLL_IMPEXP int rl_set_keyboard_input_timeout PARAMS((int)); - -/* `Public' utility functions . */ -READLINE_DLL_IMPEXP void rl_extend_line_buffer PARAMS((int)); -READLINE_DLL_IMPEXP int rl_ding PARAMS((void)); -READLINE_DLL_IMPEXP int rl_alphabetic PARAMS((int)); - -/* Readline signal handling, from signals.c */ -READLINE_DLL_IMPEXP int rl_set_signals PARAMS((void)); -READLINE_DLL_IMPEXP int rl_clear_signals PARAMS((void)); -READLINE_DLL_IMPEXP void rl_cleanup_after_signal PARAMS((void)); -READLINE_DLL_IMPEXP void rl_reset_after_signal PARAMS((void)); -READLINE_DLL_IMPEXP void rl_free_line_state PARAMS((void)); - -READLINE_DLL_IMPEXP int rl_set_paren_blink_timeout PARAMS((int)); - -/* Undocumented. */ -READLINE_DLL_IMPEXP int rl_maybe_save_line PARAMS((void)); -READLINE_DLL_IMPEXP int rl_maybe_unsave_line PARAMS((void)); -READLINE_DLL_IMPEXP int rl_maybe_replace_line PARAMS((void)); - -/* Completion functions. */ -READLINE_DLL_IMPEXP int rl_complete_internal PARAMS((int)); -READLINE_DLL_IMPEXP void rl_display_match_list PARAMS((char **, int, int)); - -READLINE_DLL_IMPEXP char **rl_completion_matches PARAMS((const char *, rl_compentry_func_t *)); -READLINE_DLL_IMPEXP char *rl_username_completion_function PARAMS((const char *, int)); -READLINE_DLL_IMPEXP char *rl_filename_completion_function PARAMS((const char *, int)); - -READLINE_DLL_IMPEXP int rl_completion_mode PARAMS((rl_command_func_t *)); - -#if 0 -/* Backwards compatibility (compat.c). These will go away sometime. */ -READLINE_DLL_IMPEXP void free_undo_list PARAMS((void)); -READLINE_DLL_IMPEXP int maybe_save_line PARAMS((void)); -READLINE_DLL_IMPEXP int maybe_unsave_line PARAMS((void)); -READLINE_DLL_IMPEXP int maybe_replace_line PARAMS((void)); - -READLINE_DLL_IMPEXP int ding PARAMS((void)); -READLINE_DLL_IMPEXP int alphabetic PARAMS((int)); -READLINE_DLL_IMPEXP int crlf PARAMS((void)); - -READLINE_DLL_IMPEXP char **completion_matches PARAMS((char *, rl_compentry_func_t *)); -READLINE_DLL_IMPEXP char *username_completion_function PARAMS((const char *, int)); -READLINE_DLL_IMPEXP char *filename_completion_function PARAMS((const char *, int)); -#endif - -/* **************************************************************** */ -/* */ -/* Well Published Variables */ -/* */ -/* **************************************************************** */ - -/* The version of this incarnation of the readline library. */ -READLINE_DLL_IMPEXP const char *rl_library_version; /* e.g., "4.2" */ -READLINE_DLL_IMPEXP int rl_readline_version; /* e.g., 0x0402 */ - -/* True if this is real GNU readline. */ -READLINE_DLL_IMPEXP int rl_gnu_readline_p; - -/* Flags word encapsulating the current readline state. */ -READLINE_DLL_IMPEXP int rl_readline_state; - -/* Says which editing mode readline is currently using. 1 means emacs mode; - 0 means vi mode. */ -READLINE_DLL_IMPEXP int rl_editing_mode; - -/* Insert or overwrite mode for emacs mode. 1 means insert mode; 0 means - overwrite mode. Reset to insert mode on each input line. */ -READLINE_DLL_IMPEXP int rl_insert_mode; - -/* The name of the calling program. You should initialize this to - whatever was in argv[0]. It is used when parsing conditionals. */ -READLINE_DLL_IMPEXP const char *rl_readline_name; - -/* The prompt readline uses. This is set from the argument to - readline (), and should not be assigned to directly. */ -READLINE_DLL_IMPEXP char *rl_prompt; - -/* The line buffer that is in use. */ -READLINE_DLL_IMPEXP char *rl_line_buffer; - -/* The location of point, and end. */ -READLINE_DLL_IMPEXP int rl_point; -READLINE_DLL_IMPEXP int rl_end; - -/* The mark, or saved cursor position. */ -READLINE_DLL_IMPEXP int rl_mark; - -/* Flag to indicate that readline has finished with the current input - line and should return it. */ -READLINE_DLL_IMPEXP int rl_done; - -/* If set to a character value, that will be the next keystroke read. */ -READLINE_DLL_IMPEXP int rl_pending_input; - -/* Non-zero if we called this function from _rl_dispatch(). It's present - so functions can find out whether they were called from a key binding - or directly from an application. */ -READLINE_DLL_IMPEXP int rl_dispatching; - -/* Non-zero if the user typed a numeric argument before executing the - current function. */ -READLINE_DLL_IMPEXP int rl_explicit_arg; - -/* The current value of the numeric argument specified by the user. */ -READLINE_DLL_IMPEXP int rl_numeric_arg; - -/* The address of the last command function Readline executed. */ -READLINE_DLL_IMPEXP rl_command_func_t *rl_last_func; - -/* The name of the terminal to use. */ -READLINE_DLL_IMPEXP const char *rl_terminal_name; - -/* The input and output streams. */ -READLINE_DLL_IMPEXP FILE *rl_instream; -READLINE_DLL_IMPEXP FILE *rl_outstream; - -/* If non-zero, then this is the address of a function to call just - before readline_internal () prints the first prompt. */ -READLINE_DLL_IMPEXP rl_hook_func_t *rl_startup_hook; - -/* If non-zero, this is the address of a function to call just before - readline_internal_setup () returns and readline_internal starts - reading input characters. */ -READLINE_DLL_IMPEXP rl_hook_func_t *rl_pre_input_hook; - -/* The address of a function to call periodically while Readline is - awaiting character input, or NULL, for no event handling. */ -READLINE_DLL_IMPEXP rl_hook_func_t *rl_event_hook; - -/* The address of the function to call to fetch a character from the current - Readline input stream */ -READLINE_DLL_IMPEXP rl_getc_func_t *rl_getc_function; - -READLINE_DLL_IMPEXP rl_voidfunc_t *rl_redisplay_function; - -READLINE_DLL_IMPEXP rl_vintfunc_t *rl_prep_term_function; -READLINE_DLL_IMPEXP rl_voidfunc_t *rl_deprep_term_function; - -/* Dispatch variables. */ -READLINE_DLL_IMPEXP Keymap rl_executing_keymap; -READLINE_DLL_IMPEXP Keymap rl_binding_keymap; - -/* Display variables. */ -/* If non-zero, readline will erase the entire line, including any prompt, - if the only thing typed on an otherwise-blank line is something bound to - rl_newline. */ -READLINE_DLL_IMPEXP int rl_erase_empty_line; - -/* If non-zero, the application has already printed the prompt (rl_prompt) - before calling readline, so readline should not output it the first time - redisplay is done. */ -READLINE_DLL_IMPEXP int rl_already_prompted; - -/* A non-zero value means to read only this many characters rather than - up to a character bound to accept-line. */ -READLINE_DLL_IMPEXP int rl_num_chars_to_read; - -/* The text of a currently-executing keyboard macro. */ -READLINE_DLL_IMPEXP char *rl_executing_macro; - -/* Variables to control readline signal handling. */ -/* If non-zero, readline will install its own signal handlers for - SIGINT, SIGTERM, SIGQUIT, SIGALRM, SIGTSTP, SIGTTIN, and SIGTTOU. */ -READLINE_DLL_IMPEXP int rl_catch_signals; - -/* If non-zero, readline will install a signal handler for SIGWINCH - that also attempts to call any calling application's SIGWINCH signal - handler. Note that the terminal is not cleaned up before the - application's signal handler is called; use rl_cleanup_after_signal() - to do that. */ -READLINE_DLL_IMPEXP int rl_catch_sigwinch; - -/* Completion variables. */ -/* Pointer to the generator function for completion_matches (). - NULL means to use rl_filename_completion_function (), the default - filename completer. */ -READLINE_DLL_IMPEXP rl_compentry_func_t *rl_completion_entry_function; - -/* If rl_ignore_some_completions_function is non-NULL it is the address - of a function to call after all of the possible matches have been - generated, but before the actual completion is done to the input line. - The function is called with one argument; a NULL terminated array - of (char *). If your function removes any of the elements, they - must be free()'ed. */ -READLINE_DLL_IMPEXP rl_compignore_func_t *rl_ignore_some_completions_function; - -/* Pointer to alternative function to create matches. - Function is called with TEXT, START, and END. - START and END are indices in RL_LINE_BUFFER saying what the boundaries - of TEXT are. - If this function exists and returns NULL then call the value of - rl_completion_entry_function to try to match, otherwise use the - array of strings returned. */ -READLINE_DLL_IMPEXP rl_completion_func_t *rl_attempted_completion_function; - -/* The basic list of characters that signal a break between words for the - completer routine. The initial contents of this variable is what - breaks words in the shell, i.e. "n\"\\'`@$>". */ -READLINE_DLL_IMPEXP const char *rl_basic_word_break_characters; - -/* The list of characters that signal a break between words for - rl_complete_internal. The default list is the contents of - rl_basic_word_break_characters. */ -READLINE_DLL_IMPEXP /*const*/ char *rl_completer_word_break_characters; - -/* Hook function to allow an application to set the completion word - break characters before readline breaks up the line. Allows - position-dependent word break characters. */ -READLINE_DLL_IMPEXP rl_cpvfunc_t *rl_completion_word_break_hook; - -/* List of characters which can be used to quote a substring of the line. - Completion occurs on the entire substring, and within the substring - rl_completer_word_break_characters are treated as any other character, - unless they also appear within this list. */ -READLINE_DLL_IMPEXP const char *rl_completer_quote_characters; - -/* List of quote characters which cause a word break. */ -READLINE_DLL_IMPEXP const char *rl_basic_quote_characters; - -/* List of characters that need to be quoted in filenames by the completer. */ -READLINE_DLL_IMPEXP const char *rl_filename_quote_characters; - -/* List of characters that are word break characters, but should be left - in TEXT when it is passed to the completion function. The shell uses - this to help determine what kind of completing to do. */ -READLINE_DLL_IMPEXP const char *rl_special_prefixes; - -/* If non-zero, then this is the address of a function to call when - completing on a directory name. The function is called with - the address of a string (the current directory name) as an arg. It - changes what is displayed when the possible completions are printed - or inserted. */ -READLINE_DLL_IMPEXP rl_icppfunc_t *rl_directory_completion_hook; - -/* If non-zero, this is the address of a function to call when completing - a directory name. This function takes the address of the directory name - to be modified as an argument. Unlike rl_directory_completion_hook, it - only modifies the directory name used in opendir(2), not what is displayed - when the possible completions are printed or inserted. It is called - before rl_directory_completion_hook. I'm not happy with how this works - yet, so it's undocumented. */ -READLINE_DLL_IMPEXP rl_icppfunc_t *rl_directory_rewrite_hook; - -/* Backwards compatibility with previous versions of readline. */ -#define rl_symbolic_link_hook rl_directory_completion_hook - -/* If non-zero, then this is the address of a function to call when - completing a word would normally display the list of possible matches. - This function is called instead of actually doing the display. - It takes three arguments: (char **matches, int num_matches, int max_length) - where MATCHES is the array of strings that matched, NUM_MATCHES is the - number of strings in that array, and MAX_LENGTH is the length of the - longest string in that array. */ -READLINE_DLL_IMPEXP rl_compdisp_func_t *rl_completion_display_matches_hook; - -/* Non-zero means that the results of the matches are to be treated - as filenames. This is ALWAYS zero on entry, and can only be changed - within a completion entry finder function. */ -READLINE_DLL_IMPEXP int rl_filename_completion_desired; - -/* Non-zero means that the results of the matches are to be quoted using - double quotes (or an application-specific quoting mechanism) if the - filename contains any characters in rl_word_break_chars. This is - ALWAYS non-zero on entry, and can only be changed within a completion - entry finder function. */ -READLINE_DLL_IMPEXP int rl_filename_quoting_desired; - -/* Set to a function to quote a filename in an application-specific fashion. - Called with the text to quote, the type of match found (single or multiple) - and a pointer to the quoting character to be used, which the function can - reset if desired. */ -READLINE_DLL_IMPEXP rl_quote_func_t *rl_filename_quoting_function; - -/* Function to call to remove quoting characters from a filename. Called - before completion is attempted, so the embedded quotes do not interfere - with matching names in the file system. */ -READLINE_DLL_IMPEXP rl_dequote_func_t *rl_filename_dequoting_function; - -/* Function to call to decide whether or not a word break character is - quoted. If a character is quoted, it does not break words for the - completer. */ -READLINE_DLL_IMPEXP rl_linebuf_func_t *rl_char_is_quoted_p; - -/* Non-zero means to suppress normal filename completion after the - user-specified completion function has been called. */ -READLINE_DLL_IMPEXP int rl_attempted_completion_over; - -/* Set to a character describing the type of completion being attempted by - rl_complete_internal; available for use by application completion - functions. */ -READLINE_DLL_IMPEXP int rl_completion_type; - -/* Up to this many items will be displayed in response to a - possible-completions call. After that, we ask the user if she - is sure she wants to see them all. The default value is 100. */ -READLINE_DLL_IMPEXP int rl_completion_query_items; - -/* Character appended to completed words when at the end of the line. The - default is a space. Nothing is added if this is '\0'. */ -READLINE_DLL_IMPEXP int rl_completion_append_character; - -/* If set to non-zero by an application completion function, - rl_completion_append_character will not be appended. */ -READLINE_DLL_IMPEXP int rl_completion_suppress_append; - -/* Set to any quote character readline thinks it finds before any application - completion function is called. */ -READLINE_DLL_IMPEXP int rl_completion_quote_character; - -/* Set to a non-zero value if readline found quoting anywhere in the word to - be completed; set before any application completion function is called. */ -READLINE_DLL_IMPEXP int rl_completion_found_quote; - -/* If non-zero, the completion functions don't append any closing quote. - This is set to 0 by rl_complete_internal and may be changed by an - application-specific completion function. */ -READLINE_DLL_IMPEXP int rl_completion_suppress_quote; - -/* If non-zero, a slash will be appended to completed filenames that are - symbolic links to directory names, subject to the value of the - mark-directories variable (which is user-settable). This exists so - that application completion functions can override the user's preference - (set via the mark-symlinked-directories variable) if appropriate. - It's set to the value of _rl_complete_mark_symlink_dirs in - rl_complete_internal before any application-specific completion - function is called, so without that function doing anything, the user's - preferences are honored. */ -READLINE_DLL_IMPEXP int rl_completion_mark_symlink_dirs; - -/* If non-zero, then disallow duplicates in the matches. */ -READLINE_DLL_IMPEXP int rl_ignore_completion_duplicates; - -/* If this is non-zero, completion is (temporarily) inhibited, and the - completion character will be inserted as any other. */ -READLINE_DLL_IMPEXP int rl_inhibit_completion; - -/* Definitions available for use by readline clients. */ -#define RL_PROMPT_START_IGNORE '\001' -#define RL_PROMPT_END_IGNORE '\002' - -/* Possible values for do_replace argument to rl_filename_quoting_function, - called by rl_complete_internal. */ -#define NO_MATCH 0 -#define SINGLE_MATCH 1 -#define MULT_MATCH 2 - -/* Possible state values for rl_readline_state */ -#define RL_STATE_NONE 0x00000 /* no state; before first call */ - -#define RL_STATE_INITIALIZING 0x00001 /* initializing */ -#define RL_STATE_INITIALIZED 0x00002 /* initialization done */ -#define RL_STATE_TERMPREPPED 0x00004 /* terminal is prepped */ -#define RL_STATE_READCMD 0x00008 /* reading a command key */ -#define RL_STATE_METANEXT 0x00010 /* reading input after ESC */ -#define RL_STATE_DISPATCHING 0x00020 /* dispatching to a command */ -#define RL_STATE_MOREINPUT 0x00040 /* reading more input in a command function */ -#define RL_STATE_ISEARCH 0x00080 /* doing incremental search */ -#define RL_STATE_NSEARCH 0x00100 /* doing non-inc search */ -#define RL_STATE_SEARCH 0x00200 /* doing a history search */ -#define RL_STATE_NUMERICARG 0x00400 /* reading numeric argument */ -#define RL_STATE_MACROINPUT 0x00800 /* getting input from a macro */ -#define RL_STATE_MACRODEF 0x01000 /* defining keyboard macro */ -#define RL_STATE_OVERWRITE 0x02000 /* overwrite mode */ -#define RL_STATE_COMPLETING 0x04000 /* doing completion */ -#define RL_STATE_SIGHANDLER 0x08000 /* in readline sighandler */ -#define RL_STATE_UNDOING 0x10000 /* doing an undo */ -#define RL_STATE_INPUTPENDING 0x20000 /* rl_execute_next called */ -#define RL_STATE_TTYCSAVED 0x40000 /* tty special chars saved */ - -#define RL_STATE_DONE 0x80000 /* done; accepted line */ - -#define RL_SETSTATE(x) (rl_readline_state |= (x)) -#define RL_UNSETSTATE(x) (rl_readline_state &= ~(x)) -#define RL_ISSTATE(x) (rl_readline_state & (x)) - -struct readline_state { - /* line state */ - int point; - int end; - int mark; - char *buffer; - int buflen; - UNDO_LIST *ul; - char *prompt; - - /* global state */ - int rlstate; - int done; - Keymap kmap; - - /* input state */ - rl_command_func_t *lastfunc; - int insmode; - int edmode; - int kseqlen; - FILE *inf; - FILE *outf; - int pendingin; - char *macro; - - /* signal state */ - int catchsigs; - int catchsigwinch; - - /* search state */ - - /* completion state */ - - /* options state */ - - /* reserved for future expansion, so the struct size doesn't change */ - char reserved[64]; -}; - -READLINE_DLL_IMPEXP int rl_save_state PARAMS((struct readline_state *)); -READLINE_DLL_IMPEXP int rl_restore_state PARAMS((struct readline_state *)); - -#ifdef __cplusplus -} -#endif - -#endif /* _READLINE_H_ */ diff --git a/dep/windows/include/readline/rlstdc.h b/dep/windows/include/readline/rlstdc.h deleted file mode 100644 index e8487e11fe3..00000000000 --- a/dep/windows/include/readline/rlstdc.h +++ /dev/null @@ -1,69 +0,0 @@ -/* stdc.h -- macros to make source compile on both ANSI C and K&R C - compilers. */ - -/* Copyright (C) 1993 Free Software Foundation, Inc. - - This file is part of GNU Bash, the Bourne Again SHell. - - Bash is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - Bash is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with Bash; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#if !defined (_RL_STDC_H_) -#define _RL_STDC_H_ - -/* Adapted from BSD /usr/include/sys/cdefs.h. */ - -/* A function can be defined using prototypes and compile on both ANSI C - and traditional C compilers with something like this: - extern char *func PARAMS((char *, char *, int)); */ - -#if !defined (PARAMS) -# if defined (__STDC__) || defined (__GNUC__) || defined (__cplusplus) || (defined _WIN32) -# define PARAMS(protos) protos -# else -# define PARAMS(protos) () -# endif -#endif - -#ifndef __attribute__ -# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) -# define __attribute__(x) -# endif -#endif - -#ifndef __GNUC__ -# define __DLL_IMPORT__ __declspec(dllimport) -# define __DLL_EXPORT__ __declspec(dllexport) -#else -# define __DLL_IMPORT__ __attribute__((dllimport)) extern -# define __DLL_EXPORT__ __attribute__((dllexport)) extern -#endif - -#if (defined __WIN32__) || (defined _WIN32) -# ifdef BUILD_READLINE_DLL -# define READLINE_DLL_IMPEXP __DLL_EXPORT__ -# elif defined(READLINE_STATIC) -# define READLINE_DLL_IMPEXP extern -# elif defined (USE_READLINE_DLL) -# define READLINE_DLL_IMPEXP __DLL_IMPORT__ -# elif defined (USE_READLINE_STATIC) -# define READLINE_DLL_IMPEXP extern -# else /* assume USE_READLINE_STATIC */ -# define READLINE_DLL_IMPEXP extern -# endif -#else /* __WIN32__ */ -# define READLINE_DLL_IMPEXP -#endif - -#endif /* !_RL_STDC_H_ */ diff --git a/dep/windows/include/readline/rltypedefs.h b/dep/windows/include/readline/rltypedefs.h deleted file mode 100644 index 862bdb8e4d9..00000000000 --- a/dep/windows/include/readline/rltypedefs.h +++ /dev/null @@ -1,94 +0,0 @@ -/* rltypedefs.h -- Type declarations for readline functions. */ - -/* Copyright (C) 2000-2004 Free Software Foundation, Inc. - - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. - - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or - (at your option) any later version. - - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#ifndef _RL_TYPEDEFS_H_ -#define _RL_TYPEDEFS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Old-style */ - -#if !defined (_FUNCTION_DEF) -# define _FUNCTION_DEF - -typedef int Function (); -typedef void VFunction (); -typedef char *CPFunction (); -typedef char **CPPFunction (); - -#endif /* _FUNCTION_DEF */ - -/* New style. */ - -#if !defined (_RL_FUNCTION_TYPEDEF) -# define _RL_FUNCTION_TYPEDEF - -/* Bindable functions */ -typedef int rl_command_func_t PARAMS((int, int)); - -/* Typedefs for the completion system */ -typedef char *rl_compentry_func_t PARAMS((const char *, int)); -typedef char **rl_completion_func_t PARAMS((const char *, int, int)); - -typedef char *rl_quote_func_t PARAMS((char *, int, char *)); -typedef char *rl_dequote_func_t PARAMS((char *, int)); - -typedef int rl_compignore_func_t PARAMS((char **)); - -typedef void rl_compdisp_func_t PARAMS((char **, int, int)); - -/* Type for input and pre-read hook functions like rl_event_hook */ -typedef int rl_hook_func_t PARAMS((void)); - -/* Input function type */ -typedef int rl_getc_func_t PARAMS((FILE *)); - -/* Generic function that takes a character buffer (which could be the readline - line buffer) and an index into it (which could be rl_point) and returns - an int. */ -typedef int rl_linebuf_func_t PARAMS((char *, int)); - -/* `Generic' function pointer typedefs */ -typedef int rl_intfunc_t PARAMS((int)); -#define rl_ivoidfunc_t rl_hook_func_t -typedef int rl_icpfunc_t PARAMS((char *)); -typedef int rl_icppfunc_t PARAMS((char **)); - -typedef void rl_voidfunc_t PARAMS((void)); -typedef void rl_vintfunc_t PARAMS((int)); -typedef void rl_vcpfunc_t PARAMS((char *)); -typedef void rl_vcppfunc_t PARAMS((char **)); - -typedef char *rl_cpvfunc_t PARAMS((void)); -typedef char *rl_cpifunc_t PARAMS((int)); -typedef char *rl_cpcpfunc_t PARAMS((char *)); -typedef char *rl_cpcppfunc_t PARAMS((char **)); - -#endif /* _RL_FUNCTION_TYPEDEF */ - -#ifdef __cplusplus -} -#endif - -#endif /* _RL_TYPEDEFS_H_ */ diff --git a/dep/windows/include/readline/tilde.h b/dep/windows/include/readline/tilde.h deleted file mode 100644 index 947a8c8fe98..00000000000 --- a/dep/windows/include/readline/tilde.h +++ /dev/null @@ -1,84 +0,0 @@ -/* tilde.h: Externally available variables and function in libtilde.a. */ - -/* Copyright (C) 1992 Free Software Foundation, Inc. - - This file contains the Readline Library (the Library), a set of - routines for providing Emacs style line input to programs that ask - for it. - - The Library is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - The Library is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#if !defined (_TILDE_H_) -# define _TILDE_H_ - -#if defined READLINE_LIBRARY -# include "rlstdc.h" -#else -# include -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* A function can be defined using prototypes and compile on both ANSI C - and traditional C compilers with something like this: - extern char *func PARAMS((char *, char *, int)); */ - -#if !defined (PARAMS) -# if defined (__STDC__) || defined (__GNUC__) || defined (__cplusplus) -# define PARAMS(protos) protos -# else -# define PARAMS(protos) () -# endif -#endif - -typedef char *tilde_hook_func_t PARAMS((char *)); - -/* If non-null, this contains the address of a function that the application - wants called before trying the standard tilde expansions. The function - is called with the text sans tilde, and returns a malloc()'ed string - which is the expansion, or a NULL pointer if the expansion fails. */ -READLINE_DLL_IMPEXP tilde_hook_func_t *tilde_expansion_preexpansion_hook; - -/* If non-null, this contains the address of a function to call if the - standard meaning for expanding a tilde fails. The function is called - with the text (sans tilde, as in "foo"), and returns a malloc()'ed string - which is the expansion, or a NULL pointer if there is no expansion. */ -READLINE_DLL_IMPEXP tilde_hook_func_t *tilde_expansion_failure_hook; - -/* When non-null, this is a NULL terminated array of strings which - are duplicates for a tilde prefix. Bash uses this to expand - `=~' and `:~'. */ -READLINE_DLL_IMPEXP char **tilde_additional_prefixes; - -/* When non-null, this is a NULL terminated array of strings which match - the end of a username, instead of just "/". Bash sets this to - `:' and `=~'. */ -READLINE_DLL_IMPEXP char **tilde_additional_suffixes; - -/* Return a new string which is the result of tilde expanding STRING. */ -READLINE_DLL_IMPEXP char *tilde_expand PARAMS((const char *)); - -/* Do the work of tilde expansion on FILENAME. FILENAME starts with a - tilde. If there is no expansion, call tilde_expansion_failure_hook. */ -READLINE_DLL_IMPEXP char *tilde_expand_word PARAMS((const char *)); - -#ifdef __cplusplus -} -#endif - -#endif /* _TILDE_H_ */ diff --git a/src/mangosd/CMakeLists.txt b/src/mangosd/CMakeLists.txt index c33fe47a7e6..b9f8aff30b2 100644 --- a/src/mangosd/CMakeLists.txt +++ b/src/mangosd/CMakeLists.txt @@ -145,13 +145,10 @@ if(UNIX) ${OPENSSL_LIBRARIES} ${OPENSSL_EXTRA_LIBRARIES} ${ZLIB_LIBRARIES} + readline ) endif() -target_link_libraries(${EXECUTABLE_NAME} - readline -) - set(EXECUTABLE_LINK_FLAGS "") if(UNIX) diff --git a/src/mangosd/CliRunnable.cpp b/src/mangosd/CliRunnable.cpp index 5bf49b6e73b..e07e4efec37 100644 --- a/src/mangosd/CliRunnable.cpp +++ b/src/mangosd/CliRunnable.cpp @@ -29,8 +29,10 @@ #include "Util.h" #include "CliRunnable.h" #include "Database/DatabaseEnv.h" +#ifdef linux #include "readline/readline.h" #include "readline/history.h" +#endif void utf8print(void* /*arg*/, const char* str) { @@ -55,17 +57,20 @@ void utf8print(void* /*arg*/, const char* str) #endif } -static bool s_canReadLine = true; - void commandFinished(void*, bool /*sucess*/) { +#ifdef WIN32 + printf("mangos>"); +#endif fflush(stdout); + #ifdef linux rl_on_new_line(); - s_canReadLine = true; + #endif } // @} +#ifdef linux int checkStopped() { if (World::IsStopped()) @@ -77,6 +82,7 @@ int checkStopped() } return 0; } +#endif // %Thread start void CliRunnable::operator()() @@ -84,45 +90,60 @@ void CliRunnable::operator()() // Init new SQL thread for the world database (one connection call enough) WorldDatabase.ThreadStart(); // let thread do safe mySQL requests + char commandbuf[256]; + // Display the list of available CLI functions then beep if (sConfig.GetBoolDefault("BeepAtStart", true)) printf("\a"); // \a = Alert - rl_event_hook = &checkStopped; - // TODO: tab completion - rl_bind_key('\t', rl_insert); + // print this here the first time + // later it will be printed after command queue updates + #ifdef WIN32 + printf("\nmangos>"); + #endif // As long as the World is running (no World::m_stopEvent), get the command line and handle it while (!World::IsStopped()) { fflush(stdout); - if (s_canReadLine) + #ifdef WIN32 + char *command_str = fgets(commandbuf,sizeof(commandbuf),stdin); + #else + rl_event_hook = &checkStopped; + //TDO: tab completion + rl_bind_key ('\t', rl_insert); + char *command_str = readline("vmangos>"); + // don't save empty commands + if (command_str && *command_str) + add_history(command_str); + #endif + if (command_str != nullptr) { - char *command_str = readline("vmangos>"); - // don't save empty commands - if (command_str && *command_str) - add_history(command_str); + for(int x=0;command_str[x];x++) + if(command_str[x]=='\r'||command_str[x]=='\n') + { + command_str[x]=0; + break; + } + + if(!*command_str) + { + #ifdef WIN32 + printf("mangos>"); + #endif + continue; + } - if (command_str != nullptr) + std::string command; + if(!consoleToUtf8(command_str,command)) // convert from console encoding to utf8 { - for (int x = 0;command_str[x];x++) - if (command_str[x] == '\r' || command_str[x] == '\n') - { - command_str[x] = 0; - break; - } - - if (!*command_str) - continue; - - std::string command; - if (!consoleToUtf8(command_str, command)) // convert from console encoding to utf8 - continue; - - s_canReadLine = false; - sWorld.QueueCliCommand(new CliCommandHolder(0, SEC_CONSOLE, nullptr, command.c_str(), &utf8print, &commandFinished)); + #ifdef WIN32 + printf("mangos>"); + #endif + continue; } + sWorld.QueueCliCommand(new CliCommandHolder(0, SEC_CONSOLE, nullptr, command.c_str(), &utf8print, &commandFinished)); } } } From 3c74142bbe4ea918448845e92993fb6586bc2e31 Mon Sep 17 00:00:00 2001 From: ratkosrb Date: Fri, 21 Jun 2024 13:42:41 +0300 Subject: [PATCH 08/34] Revert "Use close() instead of freopen() to stop readline leaks (#2573)" This reverts commit 3011507375b2b3fb9b9e9889b8e6f113021e4f0b. --- src/shared/PosixDaemon.cpp | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/shared/PosixDaemon.cpp b/src/shared/PosixDaemon.cpp index 15eb8f1034c..33806a981bc 100644 --- a/src/shared/PosixDaemon.cpp +++ b/src/shared/PosixDaemon.cpp @@ -55,13 +55,8 @@ void startDaemon(uint32_t timeout) signal(SIGTERM, daemonSignal); signal(SIGALRM, daemonSignal); - // Fork the process sid = pid = fork(); - // An error occurred - // pid > 0 == parent - // pid == 0 == child - // do the real termination of the parent via a call in master.cpp Master::run() if (pid < 0) { exit(EXIT_FAILURE); @@ -76,7 +71,6 @@ void startDaemon(uint32_t timeout) umask(0); - // child process becomes the session leader sid = setsid(); if (sid < 0) @@ -89,10 +83,12 @@ void startDaemon(uint32_t timeout) exit(EXIT_FAILURE); } - close(STDIN_FILENO); - close(STDOUT_FILENO); - close(STDERR_FILENO); - + if (!freopen("/dev/null", "rt", stdin)) + exit(EXIT_FAILURE); + if (!freopen("/dev/null", "wt", stdout)) + exit(EXIT_FAILURE); + if (!freopen("/dev/null", "wt", stderr)) + exit(EXIT_FAILURE); } void stopDaemon() From 848eb15000f9647ef9c8fa5574ae376be883a5ef Mon Sep 17 00:00:00 2001 From: ratkosrb Date: Fri, 21 Jun 2024 13:42:55 +0300 Subject: [PATCH 09/34] Revert "Use gnu readline for linux console cli (#2527)" This reverts commit e5ba29cb92a568db2cd99f7893e6cd343334e0e0. --- .github/workflows/vmangos.yml | 2 +- src/mangosd/CMakeLists.txt | 1 - src/mangosd/CliRunnable.cpp | 91 ++++++++++++++++++++--------------- src/mangosd/Master.cpp | 7 +-- 4 files changed, 56 insertions(+), 45 deletions(-) diff --git a/.github/workflows/vmangos.yml b/.github/workflows/vmangos.yml index 42db2a14c1e..4f7a1d0e982 100644 --- a/.github/workflows/vmangos.yml +++ b/.github/workflows/vmangos.yml @@ -57,7 +57,7 @@ jobs: if: matrix.os == 'ubuntu-latest' run: | sudo apt-get -qq update - sudo apt-get -qq install build-essential cmake cppcheck git libace-dev libiberty-dev libmysql++-dev libssl-dev libtbb-dev make openssl libreadline-dev + sudo apt-get -qq install build-essential cmake cppcheck git libace-dev libiberty-dev libmysql++-dev libssl-dev libtbb-dev make openssl #windows dependencies - name: windows dependencies if: matrix.os == 'windows-2019' diff --git a/src/mangosd/CMakeLists.txt b/src/mangosd/CMakeLists.txt index b9f8aff30b2..85bf2bb0387 100644 --- a/src/mangosd/CMakeLists.txt +++ b/src/mangosd/CMakeLists.txt @@ -145,7 +145,6 @@ if(UNIX) ${OPENSSL_LIBRARIES} ${OPENSSL_EXTRA_LIBRARIES} ${ZLIB_LIBRARIES} - readline ) endif() diff --git a/src/mangosd/CliRunnable.cpp b/src/mangosd/CliRunnable.cpp index e07e4efec37..0a83cddd5cb 100644 --- a/src/mangosd/CliRunnable.cpp +++ b/src/mangosd/CliRunnable.cpp @@ -29,10 +29,6 @@ #include "Util.h" #include "CliRunnable.h" #include "Database/DatabaseEnv.h" -#ifdef linux -#include "readline/readline.h" -#include "readline/history.h" -#endif void utf8print(void* /*arg*/, const char* str) { @@ -59,28 +55,24 @@ void utf8print(void* /*arg*/, const char* str) void commandFinished(void*, bool /*sucess*/) { -#ifdef WIN32 printf("mangos>"); -#endif fflush(stdout); - #ifdef linux - rl_on_new_line(); - #endif } // @} #ifdef linux -int checkStopped() +// Non-blocking keypress detector, when return pressed, return 1, else always return 0 +int kb_hit_return() { - if (World::IsStopped()) - { - rl_clear_message(); - rl_done = 1; - rl_free_line_state(); - rl_cleanup_after_signal(); - } - return 0; + struct timeval tv; + fd_set fds; + tv.tv_sec = 0; + tv.tv_usec = 0; + FD_ZERO(&fds); + FD_SET(STDIN_FILENO, &fds); + select(STDIN_FILENO+1, &fds, nullptr, nullptr, &tv); + return FD_ISSET(STDIN_FILENO, &fds); } #endif @@ -98,52 +90,75 @@ void CliRunnable::operator()() // print this here the first time // later it will be printed after command queue updates - #ifdef WIN32 printf("\nmangos>"); - #endif // As long as the World is running (no World::m_stopEvent), get the command line and handle it while (!World::IsStopped()) { fflush(stdout); + #ifdef linux + while (!kb_hit_return() && !World::IsStopped()) + // With this, we limit CLI to 10commands/second + usleep(100); + if (World::IsStopped()) + break; + #endif + +#ifndef WIN32 + + int retval; + do + { + fd_set rfds; + struct timeval tv; + tv.tv_sec = 1; + tv.tv_usec = 0; + + FD_ZERO(&rfds); + FD_SET(0, &rfds); + + retval = select(1, &rfds, nullptr, nullptr, &tv); + } while (!retval); + + if (retval == -1) + { + World::StopNow(SHUTDOWN_EXIT_CODE); + break; + } +#endif - #ifdef WIN32 char *command_str = fgets(commandbuf,sizeof(commandbuf),stdin); - #else - rl_event_hook = &checkStopped; - //TDO: tab completion - rl_bind_key ('\t', rl_insert); - char *command_str = readline("vmangos>"); - // don't save empty commands - if (command_str && *command_str) - add_history(command_str); - #endif if (command_str != nullptr) { for(int x=0;command_str[x];x++) if(command_str[x]=='\r'||command_str[x]=='\n') - { - command_str[x]=0; - break; - } + { + command_str[x]=0; + break; + } + if(!*command_str) { - #ifdef WIN32 printf("mangos>"); - #endif continue; } std::string command; if(!consoleToUtf8(command_str,command)) // convert from console encoding to utf8 { - #ifdef WIN32 printf("mangos>"); - #endif continue; } + sWorld.QueueCliCommand(new CliCommandHolder(0, SEC_CONSOLE, nullptr, command.c_str(), &utf8print, &commandFinished)); } + else if (feof(stdin)) + { + World::StopNow(SHUTDOWN_EXIT_CODE); + } } + + // End the database thread + WorldDatabase.ThreadEnd(); // free mySQL thread resources } diff --git a/src/mangosd/Master.cpp b/src/mangosd/Master.cpp index 054672bce54..d56722d9ba5 100644 --- a/src/mangosd/Master.cpp +++ b/src/mangosd/Master.cpp @@ -390,12 +390,9 @@ int Master::Run() b[3].Event.KeyEvent.wRepeatCount = 1; DWORD numb; WriteConsoleInput(hStdIn, b, 4, &numb); +#else + fclose(stdin); #endif - World::StopNow(SHUTDOWN_EXIT_CODE); - // End the database thread - sLog.Out(LOG_BASIC, LOG_LVL_MINIMAL, "Stopping WorldDatabase thread..."); - WorldDatabase.ThreadEnd(); // free mySQL thread resources - if (cliThread->joinable()) cliThread->join(); From b32340ad9f8b8794d2e8f42c74b065ec79d63394 Mon Sep 17 00:00:00 2001 From: Daribon Date: Fri, 21 Jun 2024 20:45:20 +0200 Subject: [PATCH 10/34] Correct waypoints for Lapress. (#2673) --- sql/migrations/20240620145249_world.sql | 197 ++++++++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 sql/migrations/20240620145249_world.sql diff --git a/sql/migrations/20240620145249_world.sql b/sql/migrations/20240620145249_world.sql new file mode 100644 index 00000000000..303a41c3cff --- /dev/null +++ b/sql/migrations/20240620145249_world.sql @@ -0,0 +1,197 @@ +DROP PROCEDURE IF EXISTS add_migration; +DELIMITER ?? +CREATE PROCEDURE `add_migration`() +BEGIN +DECLARE v INT DEFAULT 1; +SET v = (SELECT COUNT(*) FROM `migrations` WHERE `id`='20240620145249'); +IF v = 0 THEN +INSERT INTO `migrations` VALUES ('20240620145249'); +-- Add your query below. + + +-- Pathing for Lapress Entry: 14473 +SET @NPC := 43120; +UPDATE `creature` SET `wander_distance`=0,`movement_type`=2,`position_x`=-8137.895,`position_y`=343.76996,`position_z`=-38.97235 WHERE `guid`=@NPC; +DELETE FROM `creature_movement` WHERE `id`=@NPC; +INSERT INTO `creature_movement` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`waittime`,`wander_distance`,`script_id`) VALUES +(@NPC,1,-8137.895,343.76996,-38.97235,100,0,0,0), +(@NPC,2,-8110.5913,340.87143,-37.893997,100,0,0,0), +(@NPC,3,-8076.46,345.4564,-40.294415,100,0,0,0), +(@NPC,4,-8046.1978,342.11676,-39.098663,100,0,0,0), +(@NPC,5,-8016.7095,358.033,-29.892351,100,0,0,0), +(@NPC,6,-7992.994,386.52322,-31.275818,100,0,0,0), +(@NPC,7,-7949.4556,380.0892,-28.872864,100,0,0,0), +(@NPC,8,-7921.882,345.08475,-34.168755,100,0,0,0), +(@NPC,9,-7905.155,314.37543,-21.740849,100,0,0,0), +(@NPC,10,-7877.8022,290.2435,-13.248194,100,0,0,0), +(@NPC,11,-7851.077,278.02496,-12.616152,100,0,0,0), +(@NPC,12,-7820.58,287.38324,-18.065351,100,0,0,0), +(@NPC,13,-7797.157,328.47125,-30.094643,100,0,0,0), +(@NPC,14,-7775.7734,366.7396,-33.28907,100,0,0,0), +(@NPC,15,-7782.4097,386.22385,-29.840878,100,0,0,0), +(@NPC,16,-7798.729,412.13715,-30.520775,100,0,0,0), +(@NPC,17,-7812.798,417.28452,-33.917458,100,0,0,0), +(@NPC,18,-7848.4473,418.35754,-34.260418,100,0,0,0), +(@NPC,19,-7896.8037,412.24567,-33.88425,100,0,0,0), +(@NPC,20,-7908.5645,393.38226,-34.057087,100,0,0,0), +(@NPC,21,-7948.2354,407.66516,-32.99034,100,0,0,0), +(@NPC,22,-7987.4478,426.12436,-31.20293,100,0,0,0), +(@NPC,23,-7992.52,442.75195,-30.187817,100,0,0,0), +(@NPC,24,-8022.955,458.1007,-29.052216,100,0,0,0), +(@NPC,25,-8054.291,478.80957,-22.090322,100,0,0,0), +(@NPC,26,-8075.0537,485.9926,-20.88833,100,0,0,0), +(@NPC,27,-8084.021,509.3354,-20.542072,100,0,0,0), +(@NPC,28,-8079.85,534.8083,-20.764458,100,0,0,0), +(@NPC,29,-8071.887,570.63727,-19.367218,100,0,0,0), +(@NPC,30,-8055.8594,585.5713,-18.574886,100,0,0,0), +(@NPC,31,-8042.0034,614.47723,-16.397589,100,0,0,0), +(@NPC,32,-8023.6304,640.0943,-12.880152,100,0,0,0), +(@NPC,33,-7998.1885,662.3764,-16.123465,100,0,0,0), +(@NPC,34,-7970.471,662.4094,-22.99709,100,0,0,0), +(@NPC,35,-7944.7363,654.2363,-28.814743,100,0,0,0), +(@NPC,36,-7911.558,634.8288,-27.839071,100,0,0,0), +(@NPC,37,-7888.8535,645.3262,-26.105677,100,0,0,0), +(@NPC,38,-7883.616,681.21246,-26.355162,100,0,0,0), +(@NPC,39,-7878.741,712.5344,-23.386673,100,0,0,0), +(@NPC,40,-7892.0835,744.8458,-27.192753,100,0,0,0), +(@NPC,41,-7847.4355,750.2949,-29.25401,100,0,0,0), +(@NPC,42,-7811.7954,743.3005,-35.00896,100,0,0,0), +(@NPC,43,-7816.047,714.7766,-33.74429,100,0,0,0), +(@NPC,44,-7822.1113,688.4619,-32.969376,100,0,0,0), +(@NPC,45,-7844.653,671.0931,-31.998499,100,0,0,0), +(@NPC,46,-7852.415,636.6096,-30.26825,100,0,0,0), +(@NPC,47,-7847.509,609.90497,-36.044407,100,0,0,0), +(@NPC,48,-7849.7163,579.5848,-36.584064,100,0,0,0), +(@NPC,49,-7827.0806,578.4501,-40.787888,100,0,0,0), +(@NPC,50,-7815.0757,549.4641,-39.03653,100,0,0,0), +(@NPC,51,-7789.297,542.4746,-41.51165,100,0,0,0), +(@NPC,52,-7777.7666,518.4668,-40.23777,100,0,0,0), +(@NPC,53,-7776.5054,488.76715,-41.4564,100,0,0,0), +(@NPC,54,-7786.4844,460.41928,-37.674255,100,0,0,0), +(@NPC,55,-7770.44,438.62674,-37.505535,100,0,0,0), +(@NPC,56,-7753.165,422.13293,-34.66357,100,0,0,0), +(@NPC,57,-7718.028,425.9285,-38.460876,100,0,0,0), +(@NPC,58,-7718.3926,447.68176,-40.958473,100,0,0,0), +(@NPC,59,-7724.383,480.54874,-43.890636,100,0,0,0), +(@NPC,60,-7735.2017,505.91147,-43.98311,100,0,0,0), +(@NPC,61,-7728.782,531.95886,-43.96515,100,0,0,0), +(@NPC,62,-7727.512,549.69727,-44.507896,100,0,0,0), +(@NPC,63,-7748.993,572.18915,-47.365406,100,0,0,0), +(@NPC,64,-7756.5176,617.1074,-45.745197,100,0,0,0), +(@NPC,65,-7769.3057,636.72095,-43.80711,100,0,0,0), +(@NPC,66,-7792.126,656.23047,-39.790356,100,0,0,0), +(@NPC,67,-7788.7866,682.9523,-37.975994,100,0,0,0), +(@NPC,68,-7787.221,715.0866,-35.80369,100,0,0,0), +(@NPC,69,-7763.819,738.55695,-37.772705,100,0,0,0), +(@NPC,70,-7735.151,742.1532,-40.936874,100,0,0,0), +(@NPC,71,-7716.2285,723.5569,-42.61901,100,0,0,0), +(@NPC,72,-7717.7476,699.0506,-43.188156,100,0,0,0), +(@NPC,73,-7716.2876,672.60126,-45.139717,100,0,0,0), +(@NPC,74,-7714.856,646.91785,-49.21714,100,0,0,0), +(@NPC,75,-7703.0884,622.77997,-50.345486,100,0,0,0), +(@NPC,76,-7696.961,589.5088,-47.751884,100,0,0,0), +(@NPC,77,-7709.3315,565.06415,-42.05471,100,0,0,0), +(@NPC,78,-7696.0747,535.33105,-44.411312,100,0,0,0), +(@NPC,79,-7685.83,511.58118,-42.67648,100,0,0,0), +(@NPC,80,-7658.243,479.76248,-44.624763,100,0,0,0), +(@NPC,81,-7626.0625,477.9145,-48.5382,100,0,0,0), +(@NPC,82,-7638.868,521.5262,-45.895634,100,0,0,0), +(@NPC,83,-7629.174,553.921,-51.716843,100,0,0,0), +(@NPC,84,-7620.278,593.6282,-50.864586,100,0,0,0), +(@NPC,85,-7637.7656,611.11774,-51.343918,100,0,0,0), +(@NPC,86,-7654.096,644.61523,-50.80401,100,0,0,0), +(@NPC,87,-7620.9307,668.481,-48.161835,100,0,0,0), +(@NPC,88,-7654.096,644.61523,-50.80401,100,0,0,0), +(@NPC,89,-7637.7656,611.11774,-51.343918,100,0,0,0), +(@NPC,90,-7620.278,593.6282,-50.864586,100,0,0,0), +(@NPC,91,-7629.174,553.921,-51.716843,100,0,0,0), +(@NPC,92,-7638.868,521.5262,-45.895634,100,0,0,0), +(@NPC,93,-7626.0625,477.9145,-48.5382,100,0,0,0), +(@NPC,94,-7658.243,479.76248,-44.624763,100,0,0,0), +(@NPC,95,-7685.83,511.58118,-42.67648,100,0,0,0), +(@NPC,96,-7696.0747,535.33105,-44.411312,100,0,0,0), +(@NPC,97,-7709.3315,565.06415,-42.05471,100,0,0,0), +(@NPC,98,-7696.961,589.5088,-47.751884,100,0,0,0), +(@NPC,99,-7703.0884,622.77997,-50.345486,100,0,0,0), +(@NPC,100,-7714.856,646.91785,-49.21714,100,0,0,0), +(@NPC,101,-7716.2876,672.60126,-45.139717,100,0,0,0), +(@NPC,102,-7717.7476,699.0506,-43.188156,100,0,0,0), +(@NPC,103,-7716.2285,723.5569,-42.61901,100,0,0,0), +(@NPC,104,-7735.151,742.1532,-40.936874,100,0,0,0), +(@NPC,105,-7763.819,738.55695,-37.772705,100,0,0,0), +(@NPC,106,-7787.1504,715.1924,-35.731888,100,0,0,0), +(@NPC,107,-7788.7866,682.9523,-37.975994,100,0,0,0), +(@NPC,108,-7792.126,656.23047,-39.790356,100,0,0,0), +(@NPC,109,-7769.3057,636.72095,-43.80711,100,0,0,0), +(@NPC,110,-7756.5176,617.1074,-45.745197,100,0,0,0), +(@NPC,111,-7748.993,572.18915,-47.365406,100,0,0,0), +(@NPC,112,-7727.5605,549.7871,-44.51991,100,0,0,0), +(@NPC,113,-7728.782,531.95886,-43.96515,100,0,0,0), +(@NPC,114,-7735.2017,505.91147,-43.98311,100,0,0,0), +(@NPC,115,-7724.383,480.54874,-43.890636,100,0,0,0), +(@NPC,116,-7718.3926,447.68176,-40.958473,100,0,0,0), +(@NPC,117,-7718.028,425.9285,-38.460876,100,0,0,0), +(@NPC,118,-7753.165,422.13293,-34.66357,100,0,0,0), +(@NPC,119,-7770.44,438.62674,-37.505535,100,0,0,0), +(@NPC,120,-7786.4844,460.41928,-37.674255,100,0,0,0), +(@NPC,121,-7776.5054,488.76715,-41.4564,100,0,0,0), +(@NPC,122,-7777.7666,518.4668,-40.23777,100,0,0,0), +(@NPC,123,-7789.297,542.4746,-41.51165,100,0,0,0), +(@NPC,124,-7815.0757,549.4641,-39.03653,100,0,0,0), +(@NPC,125,-7827.0806,578.4501,-40.787888,100,0,0,0), +(@NPC,126,-7849.7163,579.5848,-36.584064,100,0,0,0), +(@NPC,127,-7847.509,609.90497,-36.044407,100,0,0,0), +(@NPC,128,-7852.415,636.6096,-30.26825,100,0,0,0), +(@NPC,129,-7844.653,671.0931,-31.998499,100,0,0,0), +(@NPC,130,-7822.147,688.39954,-32.953453,100,0,0,0), +(@NPC,131,-7816.082,714.71387,-33.66269,100,0,0,0), +(@NPC,132,-7811.7954,743.3005,-35.00896,100,0,0,0), +(@NPC,133,-7847.3022,750.31555,-29.289762,100,0,0,0), +(@NPC,134,-7891.951,744.8662,-27.238768,100,0,0,0), +(@NPC,135,-7878.741,712.5344,-23.386673,100,0,0,0), +(@NPC,136,-7883.616,681.21246,-26.355162,100,0,0,0), +(@NPC,137,-7888.79,645.381,-26.057123,100,0,0,0), +(@NPC,138,-7911.496,634.8828,-27.884321,100,0,0,0), +(@NPC,139,-7944.6313,654.21063,-28.786438,100,0,0,0), +(@NPC,140,-7970.365,662.38477,-23.044718,100,0,0,0), +(@NPC,141,-7998.1885,662.3764,-16.123465,100,0,0,0), +(@NPC,142,-8023.6304,640.0943,-12.880152,100,0,0,0), +(@NPC,143,-8042.0034,614.47723,-16.397589,100,0,0,0), +(@NPC,144,-8055.8594,585.5713,-18.574886,100,0,0,0), +(@NPC,145,-8071.887,570.63727,-19.367218,100,0,0,0), +(@NPC,146,-8079.85,534.8083,-20.764458,100,0,0,0), +(@NPC,147,-8084.021,509.3354,-20.542072,100,0,0,0), +(@NPC,148,-8075.037,485.9961,-20.957674,100,0,0,0), +(@NPC,149,-8054.291,478.80957,-22.090322,100,0,0,0), +(@NPC,150,-8022.955,458.1007,-29.052216,100,0,0,0), +(@NPC,151,-7992.52,442.75195,-30.187817,100,0,0,0), +(@NPC,152,-7987.4478,426.12436,-31.20293,100,0,0,0), +(@NPC,153,-7948.2354,407.66516,-32.99034,100,0,0,0), +(@NPC,154,-7908.5645,393.38226,-34.057087,100,0,0,0), +(@NPC,155,-7896.8037,412.24567,-33.88425,100,0,0,0), +(@NPC,156,-7848.4473,418.35754,-34.260418,100,0,0,0), +(@NPC,157,-7812.798,417.28452,-33.917458,100,0,0,0), +(@NPC,158,-7798.729,412.13715,-30.520775,100,0,0,0), +(@NPC,159,-7782.4097,386.22385,-29.840878,100,0,0,0), +(@NPC,160,-7775.7734,366.7396,-33.28907,100,0,0,0), +(@NPC,161,-7797.157,328.47125,-30.094643,100,0,0,0), +(@NPC,162,-7820.58,287.38324,-18.065351,100,0,0,0), +(@NPC,163,-7851.077,278.02496,-12.616152,100,0,0,0), +(@NPC,164,-7877.8022,290.2435,-13.248194,100,0,0,0), +(@NPC,165,-7905.155,314.37543,-21.740849,100,0,0,0), +(@NPC,166,-7921.882,345.08475,-34.168755,100,0,0,0), +(@NPC,167,-7949.4556,380.0892,-28.872864,100,0,0,0), +(@NPC,168,-7992.994,386.52322,-31.275818,100,0,0,0), +(@NPC,169,-8016.6973,358.05078,-30.023216,100,0,0,0), +(@NPC,170,-8046.1978,342.11676,-39.098663,100,0,0,0), +(@NPC,171,-8076.46,345.4564,-40.294415,100,0,0,0), +(@NPC,172,-8110.5913,340.87143,-37.893997,100,0,0,0); +-- 0x204CB000200E22400000A800006E5985 .go xyz -8137.895 343.76996 -38.97235 + + +-- End of migration. +END IF; +END?? +DELIMITER ; +CALL add_migration(); +DROP PROCEDURE IF EXISTS add_migration; From c9628cbd7c440cecc72293a1681abdc4d135b860 Mon Sep 17 00:00:00 2001 From: Daribon Date: Fri, 21 Jun 2024 20:49:13 +0200 Subject: [PATCH 11/34] Add waypoints to Zora. (#2674) --- sql/migrations/20240620151038_world.sql | 31 +++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 sql/migrations/20240620151038_world.sql diff --git a/sql/migrations/20240620151038_world.sql b/sql/migrations/20240620151038_world.sql new file mode 100644 index 00000000000..4a4f0d20f90 --- /dev/null +++ b/sql/migrations/20240620151038_world.sql @@ -0,0 +1,31 @@ +DROP PROCEDURE IF EXISTS add_migration; +DELIMITER ?? +CREATE PROCEDURE `add_migration`() +BEGIN +DECLARE v INT DEFAULT 1; +SET v = (SELECT COUNT(*) FROM `migrations` WHERE `id`='20240620151038'); +IF v = 0 THEN +INSERT INTO `migrations` VALUES ('20240620151038'); +-- Add your query below. + + +-- Pathing for Zora Entry: 14474 +SET @NPC := 51835; +UPDATE `creature` SET `wander_distance`=0,`movement_type`=2,`position_x`=-7378.239,`position_y`=1714.3088,`position_z`=-91.72752 WHERE `guid`=@NPC; +DELETE FROM `creature_movement` WHERE `id`=@NPC; +INSERT INTO `creature_movement` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`waittime`,`wander_distance`,`script_id`) VALUES +(@NPC,1,-7378.239,1714.3088,-91.72752,100,0,0,0), +(@NPC,2,-7393.453,1717.8257,-92.846466,100,0,0,0), +(@NPC,3,-7401.651,1709.8647,-92.29474,100,0,0,0), +(@NPC,4,-7396.23,1696.348,-92.5287,100,0,0,0), +(@NPC,5,-7377.1226,1687.7341,-91.2392,100,0,0,0), +(@NPC,6,-7368.2925,1700.2347,-86.44376,100,0,0,0); +-- 0x204CB000200E22800000A80000679D55 .go xyz -7378.239 1714.3088 -91.72752 + + +-- End of migration. +END IF; +END?? +DELIMITER ; +CALL add_migration(); +DROP PROCEDURE IF EXISTS add_migration; From e48a72e473c0b7ab5aa9ab0ba5252c15607bd15c Mon Sep 17 00:00:00 2001 From: ratkosrb Date: Fri, 21 Jun 2024 22:57:06 +0300 Subject: [PATCH 12/34] Add missing Summon Player ability to Patchwerk. Also fixes infinite Hateful Strike range. Closes https://github.com/vmangos/core/issues/2671 --- .../naxxramas/boss_patchwerk.cpp | 41 +++++++++++++++---- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/src/scripts/eastern_kingdoms/eastern_plaguelands/naxxramas/boss_patchwerk.cpp b/src/scripts/eastern_kingdoms/eastern_plaguelands/naxxramas/boss_patchwerk.cpp index 0db889dcc18..147d69c4da4 100644 --- a/src/scripts/eastern_kingdoms/eastern_plaguelands/naxxramas/boss_patchwerk.cpp +++ b/src/scripts/eastern_kingdoms/eastern_plaguelands/naxxramas/boss_patchwerk.cpp @@ -34,7 +34,8 @@ enum PatchwerkData EMOTE_BERSERK = 4428, EMOTE_ENRAGE = 2384, - SPELL_HATEFULSTRIKE = 28308, + SPELL_SUMMON_PLAYER = 20477, + SPELL_HATEFUL_STRIKE = 28308, SPELL_ENRAGE = 28131, // 5% enrage soft enrage SPELL_BERSERK = 27680, // 7min hard enrage SPELL_SLIMEBOLT = 32309 // Added in patch 1.12 @@ -71,14 +72,16 @@ struct boss_patchwerkAI : public ScriptedAI bool m_bEnraged; bool m_bBerserk; - ObjectGuid previousTarget; + uint32 m_failedStrikes; + ObjectGuid m_previousTarget; void Reset() override { m_events.Reset(); m_bEnraged = false; m_bBerserk = false; - previousTarget = 0; + m_failedStrikes = 0; + m_previousTarget.Clear(); } void KilledUnit(Unit* pVictim) override @@ -124,11 +127,19 @@ struct boss_patchwerkAI : public ScriptedAI // todo: can it hit anything other than players? + SpellEntry const* pHatefulStrike = sSpellMgr.GetSpellEntry(SPELL_HATEFUL_STRIKE); + if (!pHatefulStrike) + { + sLog.Out(LOG_SCRIPTS, LOG_LVL_ERROR, "Patchwerk - Hateful Strike spell does not exist?!"); + return; + } + Unit* mainTank = m_creature->GetVictim(); // Shouldnt really be possible, but hey, weirder things have happened if (!mainTank) return; + ObjectGuid const& mainTankGuid = mainTank->GetObjectGuid(); Unit* pTarget = nullptr; @@ -155,6 +166,9 @@ struct boss_patchwerkAI : public ScriptedAI if (!m_creature->CanReachWithMeleeSpellAttack(pTempTarget)) continue; + if (pTempTarget->IsImmuneToSpell(pHatefulStrike, false)) + continue; + // Skipping maintank, only using him if there is no other viable target // todo: not sure if this is correct. Should we target the MT over the offtanks, if the offtanks have less hp? if (iter->getUnitGuid() != mainTankGuid) @@ -174,13 +188,24 @@ struct boss_patchwerkAI : public ScriptedAI if (!pTarget) pTarget = mainTank; - if (pTarget->GetObjectGuid() != previousTarget) + if (pTarget->GetObjectGuid() != m_previousTarget) { m_creature->SetInFront(pTarget); m_creature->SetTargetGuid(pTarget->GetObjectGuid()); - previousTarget = pTarget->GetObjectGuid(); + m_previousTarget = pTarget->GetObjectGuid(); + } + + if (m_creature->CastSpell(pTarget, pHatefulStrike, false) == SPELL_FAILED_OUT_OF_RANGE) + { + if (++m_failedStrikes >= 3) + { + if (Player* pPlayer = pTarget->ToPlayer()) + if (!pPlayer->IsBeingTeleported()) + m_creature->CastSpell(pPlayer, SPELL_SUMMON_PLAYER, true); + } } - DoCastSpellIfCan(pTarget, SPELL_HATEFULSTRIKE, CF_TRIGGERED); + else + m_failedStrikes = 0; } bool CustomGetTarget() @@ -203,11 +228,11 @@ struct boss_patchwerkAI : public ScriptedAI if (!m_creature->IsAttackReady(BASE_ATTACK) && m_creature->CanReachWithMeleeAutoAttack(target)) // he does not have offhand attack return true; - if (target->GetObjectGuid() != previousTarget) + if (target->GetObjectGuid() != m_previousTarget) { m_creature->SetInFront(target); m_creature->SetTargetGuid(target->GetObjectGuid()); - previousTarget = target->GetObjectGuid(); + m_previousTarget = target->GetObjectGuid(); } AttackStart(target); } From 7836306ddd6a376e13189c0516c72cf91cd9fd59 Mon Sep 17 00:00:00 2001 From: schell244 Date: Sat, 22 Jun 2024 00:12:48 +0200 Subject: [PATCH 13/34] Add missing completion script for quest The Affray (#1840) --- sql/migrations/20230320180317_world.sql | 25 +++++++++++++++++++ .../kalimdor/the_barrens/the_barrens.cpp | 1 - 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 sql/migrations/20230320180317_world.sql diff --git a/sql/migrations/20230320180317_world.sql b/sql/migrations/20230320180317_world.sql new file mode 100644 index 00000000000..cf17719ef5a --- /dev/null +++ b/sql/migrations/20230320180317_world.sql @@ -0,0 +1,25 @@ +DROP PROCEDURE IF EXISTS add_migration; +delimiter ?? +CREATE PROCEDURE `add_migration`() +BEGIN +DECLARE v INT DEFAULT 1; +SET v = (SELECT COUNT(*) FROM `migrations` WHERE `id`='20230320180317'); +IF v=0 THEN +INSERT INTO `migrations` VALUES ('20230320180317'); +-- Add your query below. + + +-- Add missing completion script for quest The Affray. +DELETE FROM `quest_end_scripts` WHERE `id`=1719; +INSERT INTO `quest_end_scripts` (`id`, `delay`, `priority`, `command`, `datalong`, `datalong2`, `datalong3`, `datalong4`, `target_param1`, `target_param2`, `target_type`, `data_flags`, `dataint`, `dataint2`, `dataint3`, `dataint4`, `x`, `y`, `z`, `o`, `condition_id`, `comments`) VALUES +(1719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2354, 0, 0, 0, 0, 0, 0, 0, 0, 'The Affray: Klannoc Macleod - Yell Text'); +UPDATE `quest_template` SET `CompleteScript` = 1719 WHERE `entry` = 1719; +UPDATE `broadcast_text` SET `chat_type`=1, `emote_id1`=22 WHERE `entry`=2354; + + +-- End of migration. +END IF; +END?? +delimiter ; +CALL add_migration(); +DROP PROCEDURE IF EXISTS add_migration; diff --git a/src/scripts/kalimdor/the_barrens/the_barrens.cpp b/src/scripts/kalimdor/the_barrens/the_barrens.cpp index 8f0a8afad43..60b155bd362 100644 --- a/src/scripts/kalimdor/the_barrens/the_barrens.cpp +++ b/src/scripts/kalimdor/the_barrens/the_barrens.cpp @@ -199,7 +199,6 @@ enum SAY_TWIGGY_FRAY = 2318, SAY_TWIGGY_DOWN = 2355, SAY_TWIGGY_OVER = 2320, - SAY_QUEST_TURN_IN = 2354, // TODO: implement Klannoc Macleod (id: 6236) yells after quest was turned in: Hail $n! New Champion of The Affray! NPC_TWIGGY = 6248, NPC_BIG_WILL = 6238, From a1cd3abd4a9200c6f0549a5152c1513af78da9fc Mon Sep 17 00:00:00 2001 From: Michael Serajnik Date: Sat, 22 Jun 2024 21:40:47 +0200 Subject: [PATCH 14/34] Only create releases from development branch. (#2682) --- .github/workflows/db_dump.yml | 2 ++ .github/workflows/dev-release.yml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/.github/workflows/db_dump.yml b/.github/workflows/db_dump.yml index b44f24f003a..d6e5ba78071 100644 --- a/.github/workflows/db_dump.yml +++ b/.github/workflows/db_dump.yml @@ -3,6 +3,8 @@ name: vmangos Development DB Dump on: push: + branches: + - development paths: - '**.sql' - '.github/workflows/db_dump.yml' diff --git a/.github/workflows/dev-release.yml b/.github/workflows/dev-release.yml index 58e29297fb0..a0bcfb07ba8 100644 --- a/.github/workflows/dev-release.yml +++ b/.github/workflows/dev-release.yml @@ -2,6 +2,8 @@ name: Windows Development Release on: push: + branches: + - development paths-ignore: - '.github/ISSUE_TEMPLATE/**' - '.github/ISSUE_TEMPLATE.md' From f78194ef9bb14cf2b3b483fbd0fd1ea7861ed3b5 Mon Sep 17 00:00:00 2001 From: Gamemechanic Date: Sun, 23 Jun 2024 17:43:44 +0200 Subject: [PATCH 15/34] Optimize IsPointInAreaTriggerZone (#2689) --- src/game/Database/DBCStores.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/game/Database/DBCStores.cpp b/src/game/Database/DBCStores.cpp index 2fcea448a0c..c100d826ae6 100644 --- a/src/game/Database/DBCStores.cpp +++ b/src/game/Database/DBCStores.cpp @@ -603,13 +603,12 @@ bool IsPointInAreaTriggerZone(AreaTriggerEntry const* atEntry, uint32 mapid, flo float playerBoxDistX = x - atEntry->x; float playerBoxDistY = y - atEntry->y; - float rotPlayerX = float(atEntry->x + playerBoxDistX * cosVal - playerBoxDistY * sinVal); - float rotPlayerY = float(atEntry->y + playerBoxDistY * cosVal + playerBoxDistX * sinVal); + float dx = float(playerBoxDistX * cosVal - playerBoxDistY * sinVal); + float dy = float(playerBoxDistY * cosVal + playerBoxDistX * sinVal); // box edges are parallel to coordiante axis, so we can treat every dimension independently :D float dz = z - atEntry->z; - float dx = rotPlayerX - atEntry->x; - float dy = rotPlayerY - atEntry->y; + if ((fabs(dx) > atEntry->box_x / 2 + delta) || (fabs(dy) > atEntry->box_y / 2 + delta) || (fabs(dz) > atEntry->box_z / 2 + delta)) From 47b4f67359179c7b3cc97d2d27910727376252a5 Mon Sep 17 00:00:00 2001 From: ratkosrb Date: Mon, 24 Jun 2024 03:34:18 +0300 Subject: [PATCH 16/34] Fixes for Spirit of Redemption. Closes https://github.com/vmangos/core/issues/889 Closes https://github.com/vmangos/core/issues/2665 --- sql/migrations/20240623222319_world.sql | 32 +++++++ src/game/Objects/Unit.cpp | 106 +++++++++--------------- src/game/Spells/Spell.cpp | 6 +- src/game/Spells/SpellAuras.cpp | 20 ++++- src/game/Spells/SpellEffects.cpp | 2 +- src/game/Spells/SpellEntry.h | 29 +++++++ 6 files changed, 126 insertions(+), 69 deletions(-) create mode 100644 sql/migrations/20240623222319_world.sql diff --git a/sql/migrations/20240623222319_world.sql b/sql/migrations/20240623222319_world.sql new file mode 100644 index 00000000000..c96b9572706 --- /dev/null +++ b/sql/migrations/20240623222319_world.sql @@ -0,0 +1,32 @@ +DROP PROCEDURE IF EXISTS add_migration; +DELIMITER ?? +CREATE PROCEDURE `add_migration`() +BEGIN +DECLARE v INT DEFAULT 1; +SET v = (SELECT COUNT(*) FROM `migrations` WHERE `id`='20240623222319'); +IF v = 0 THEN +INSERT INTO `migrations` VALUES ('20240623222319'); +-- Add your query below. + + +-- Events list for Spirit Of Redemption +DELETE FROM `creature_ai_events` WHERE `creature_id`=12904; +INSERT INTO `creature_ai_events` (`id`, `creature_id`, `condition_id`, `event_type`, `event_inverse_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action1_script`, `action2_script`, `action3_script`, `comment`) VALUES +(1290401, 12904, 0, 1, 0, 100, 0, 0, 0, 0, 0, 1290401, 0, 0, 'Spirit of Redemption - Cast Dummy Visuals after Spawn'), +(1290402, 12904, 0, 6, 0, 100, 0, 0, 0, 0, 0, 1290402, 0, 0, 'Spirit of Redemption - Despawn on Death'); +DELETE FROM `creature_ai_scripts` WHERE `id`=1290401; +INSERT INTO `creature_ai_scripts` (`id`, `delay`, `priority`, `command`, `datalong`, `datalong2`, `datalong3`, `datalong4`, `target_param1`, `target_param2`, `target_type`, `data_flags`, `dataint`, `dataint2`, `dataint3`, `dataint4`, `x`, `y`, `z`, `o`, `condition_id`, `comments`) VALUES +(1290401, 0, 0, 15, 20723, 2, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Spirit of Redemption - Cast Dummy Visual Spell'), +(1290401, 0, 1, 15, 20721, 2, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Spirit of Redemption - Cast Dummy Animation Spell'); +DELETE FROM `creature_ai_scripts` WHERE `id`=1290402; +INSERT INTO `creature_ai_scripts` (`id`, `delay`, `priority`, `command`, `datalong`, `datalong2`, `datalong3`, `datalong4`, `target_param1`, `target_param2`, `target_type`, `data_flags`, `dataint`, `dataint2`, `dataint3`, `dataint4`, `x`, `y`, `z`, `o`, `condition_id`, `comments`) VALUES +(1290402, 0, 0, 18, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Spirit of Redemption - Despawn'); +UPDATE `creature_template` SET `ai_name`='EventAI' WHERE `entry`=12904; + + +-- End of migration. +END IF; +END?? +DELIMITER ; +CALL add_migration(); +DROP PROCEDURE IF EXISTS add_migration; diff --git a/src/game/Objects/Unit.cpp b/src/game/Objects/Unit.cpp index c090ee7214f..1e8e823e9df 100644 --- a/src/game/Objects/Unit.cpp +++ b/src/game/Objects/Unit.cpp @@ -778,7 +778,8 @@ uint32 Unit::DealDamage(Unit* pVictim, uint32 damage, CleanDamage const* cleanDa if (health <= damage && pVictim->GetInvincibilityHpThreshold() == 0) { DEBUG_FILTER_LOG(LOG_FILTER_DAMAGE, "DealDamage: victim just died"); - Kill(pVictim, spellProto, durabilityLoss); // Function too long, we cut + Kill(pVictim, spellProto, durabilityLoss); + // last damage from non duel opponent or opponent controlled creature if (duel_hasEnded) { @@ -1053,38 +1054,53 @@ void Unit::Kill(Unit* pVictim, SpellEntry const* spellProto, bool durabilityLoss DEBUG_FILTER_LOG(LOG_FILTER_DAMAGE, "DealDamageAttackStop"); - bool damageFromSpiritOfRedemtionTalent = (spellProto && spellProto->Id == 27795); + bool const damageFromSpiritOfRedemptionTalent = (spellProto && spellProto->Id == 27965); + bool const spiritOfRedemptionTalentImmune = pVictim->GetClass() == CLASS_PRIEST && !damageFromSpiritOfRedemptionTalent && pVictim->HasAura(20711); - // if talent known but not triggered (check priest class for speedup check) - bool spiritOfRedemtionTalentImmune = false; - if (pPlayerVictim && pVictim->GetClass() == CLASS_PRIEST) + // handle spirit of redemption talent + if (spiritOfRedemptionTalentImmune) +#if SUPPORTED_CLIENT_BUILD > CLIENT_BUILD_1_9_4 { - if (!damageFromSpiritOfRedemtionTalent) // not called from SPELL_AURA_SPIRIT_OF_REDEMPTION - { - AuraList const& vDummyAuras = pVictim->GetAurasByType(SPELL_AURA_DUMMY); - for (const auto& itr : vDummyAuras) - { - if (itr->GetSpellProto()->SpellIconID == 1654) - { - spiritOfRedemtionTalentImmune = true; - break; - } - } - } + pVictim->InterruptNonMeleeSpells(false); - // Already applied spirit of redemption. Fix stuck in ANGEL form. - if (!spiritOfRedemtionTalentImmune && HasAura(27827)) - return; - } + // save value before aura remove + uint32 ressSpellId = 0; +#if SUPPORTED_CLIENT_BUILD >= CLIENT_BUILD_1_6_1 + ressSpellId = pVictim->GetUInt32Value(PLAYER_SELF_RES_SPELL); + if (!ressSpellId) + ressSpellId = ((Player*)pVictim)->SelectResurrectionSpellId(); +#else + if (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_CAN_SELF_RESURRECT)) + ressSpellId = ((Player*)pVictim)->GetResurrectionSpellId(); +#endif - if (!spiritOfRedemtionTalentImmune) + pVictim->RemoveAllAurasOnDeath(); + + // restore for use at real death +#if SUPPORTED_CLIENT_BUILD >= CLIENT_BUILD_1_6_1 + pVictim->SetUInt32Value(PLAYER_SELF_RES_SPELL, ressSpellId); +#else + pPlayerVictim->SetResurrectionSpellId(ressSpellId); + if (ressSpellId) + SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_CAN_SELF_RESURRECT); +#endif + + pVictim->CastCustomSpell(pVictim, 27827, pVictim->GetMaxHealth(), {}, {}, true); + } + else +#else + { + pVictim->CastSpell(pVictim->GetPositionX(), pVictim->GetPositionY(), pVictim->GetPositionZ(), 20713, true); + } + // no else +#endif { pVictim->SetHealth(0); DEBUG_FILTER_LOG(LOG_FILTER_DAMAGE, "SET JUST_DIED"); pVictim->SetDeathState(JUST_DIED); -// World of Warcraft Client Patch 1.6.0 (2005-07-12) -// - Self-resurrection spells show their name on the button in the release spirit dialog. + // World of Warcraft Client Patch 1.6.0 (2005-07-12) + // - Self-resurrection spells show their name on the button in the release spirit dialog. #if SUPPORTED_CLIENT_BUILD >= CLIENT_BUILD_1_6_1 if (pPlayerVictim && pVictim->GetUInt32Value(PLAYER_SELF_RES_SPELL)) pVictim->DirectSendPublicValueUpdate(PLAYER_SELF_RES_SPELL); @@ -1095,14 +1111,6 @@ void Unit::Kill(Unit* pVictim, SpellEntry const* spellProto, bool durabilityLoss // Nostalrius: Instantly send values update for health pVictim->DirectSendPublicValueUpdate(UNIT_FIELD_HEALTH); } - else - { - // Before the stop of combat, the auras of type MC are removed. We must be able to redirect the mobs to the caster. - pVictim->RemoveCharmAuras(AURA_REMOVE_BY_DEATH); - - // stop combat - pVictim->CombatStop(); - } pVictim->GetHostileRefManager().deleteReferences(); @@ -1115,39 +1123,7 @@ void Unit::Kill(Unit* pVictim, SpellEntry const* spellProto, bool durabilityLoss DEBUG_FILTER_LOG(LOG_FILTER_DAMAGE, "DealDamageHealth1"); - if (spiritOfRedemtionTalentImmune) - { - // save value before aura remove - uint32 ressSpellId = 0; -#if SUPPORTED_CLIENT_BUILD >= CLIENT_BUILD_1_6_1 - ressSpellId = pVictim->GetUInt32Value(PLAYER_SELF_RES_SPELL); - if (!ressSpellId) - ressSpellId = ((Player*)pVictim)->SelectResurrectionSpellId(); -#else - if (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_CAN_SELF_RESURRECT)) - ressSpellId = ((Player*)pVictim)->GetResurrectionSpellId(); -#endif - - //Remove all expected to remove at death auras (most important negative case like DoT or periodic triggers) - pVictim->RemoveAllAurasOnDeath(); - - // restore for use at real death -#if SUPPORTED_CLIENT_BUILD >= CLIENT_BUILD_1_6_1 - pVictim->SetUInt32Value(PLAYER_SELF_RES_SPELL, ressSpellId); -#else - pPlayerVictim->SetResurrectionSpellId(ressSpellId); - if (ressSpellId) - SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_CAN_SELF_RESURRECT); -#endif - - // FORM_SPIRITOFREDEMPTION and related auras - pVictim->AddAura(27827, ADD_AURA_NO_OPTION, pVictim); - pVictim->InterruptNonMeleeSpells(false); - } - - // remember victim PvP death for corpse type and corpse reclaim delay - // at original death (not at SpiritOfRedemtionTalent timeout) - if (pPlayerVictim && !damageFromSpiritOfRedemtionTalent) + if (pPlayerVictim && !damageFromSpiritOfRedemptionTalent) pPlayerVictim->SetPvPDeath(pPlayerTap != nullptr); // Call KilledUnit for creatures diff --git a/src/game/Spells/Spell.cpp b/src/game/Spells/Spell.cpp index 8d60d9fca87..0264edc0fdf 100644 --- a/src/game/Spells/Spell.cpp +++ b/src/game/Spells/Spell.cpp @@ -1086,7 +1086,11 @@ void Spell::AddUnitTarget(Unit* pTarget, SpellEffectIndex effIndex) if (m_spellInfo->Effect[effIndex] == 0) return; - if ((m_spellInfo->AttributesEx & SPELL_ATTR_EX_EXCLUDE_CASTER) && (m_spellInfo->EffectImplicitTargetA[effIndex] != TARGET_UNIT_CASTER) && (m_spellInfo->EffectImplicitTargetB[effIndex] != TARGET_UNIT_CASTER) && (pTarget->GetObjectGuid() == m_originalCasterGUID)) + if (m_spellInfo->HasAttribute(SPELL_ATTR_EX_EXCLUDE_CASTER) && + (pTarget->GetObjectGuid() == m_originalCasterGUID) && + (m_spellInfo->EffectImplicitTargetA[effIndex] != TARGET_UNIT_CASTER) && + (m_spellInfo->EffectImplicitTargetB[effIndex] != TARGET_UNIT_CASTER) && + !IsSummonEffect(m_spellInfo->Effect[effIndex])) // summon effects need to have unit target to work, fixes 20713 return; // Check for effect immune skip if immuned diff --git a/src/game/Spells/SpellAuras.cpp b/src/game/Spells/SpellAuras.cpp index db1ff86df14..338d97bbe18 100644 --- a/src/game/Spells/SpellAuras.cpp +++ b/src/game/Spells/SpellAuras.cpp @@ -5944,11 +5944,27 @@ void Aura::HandleSpiritOfRedemption(bool apply, bool Real) target->SetStandState(UNIT_STAND_STATE_STAND); } - target->SetHealth(1); + // set health and mana to maximum + target->SetPower(POWER_MANA, target->GetMaxPower(POWER_MANA)); + target->SetInvincibilityHpThreshold(target->GetMaxHealth()); + + // cast visual on next tick + target->m_Events.AddLambdaEventAtOffset([target]() + { + target->CastSpell(target, 25100, true); + }, BATCHING_INTERVAL); } // die at aura end else - target->DealDamage(target, target->GetHealth(), nullptr, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, GetSpellProto(), false); + { + target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); + target->m_Events.AddLambdaEventAtOffset([target]() + { + target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); + target->SetInvincibilityHpThreshold(0); + target->CastSpell(target, 27965, true); + }, BATCHING_INTERVAL); + } } void Aura::HandleAuraAoeCharm(bool apply, bool real) diff --git a/src/game/Spells/SpellEffects.cpp b/src/game/Spells/SpellEffects.cpp index 0092dd2cb81..d3b8be400f5 100644 --- a/src/game/Spells/SpellEffects.cpp +++ b/src/game/Spells/SpellEffects.cpp @@ -310,7 +310,7 @@ void Spell::EffectInstaKill(SpellEffectIndex /*effIdx*/) m_caster->SendMessageToSet(&data, true); #endif - m_caster->DealDamage(unitTarget, unitTarget->GetHealth(), nullptr, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, nullptr, false); + m_caster->DealDamage(unitTarget, unitTarget->GetHealth(), nullptr, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, m_spellInfo, false, this); } void Spell::EffectEnvironmentalDMG(SpellEffectIndex effIdx) diff --git a/src/game/Spells/SpellEntry.h b/src/game/Spells/SpellEntry.h index 9f3f60e50c3..accc7b50380 100644 --- a/src/game/Spells/SpellEntry.h +++ b/src/game/Spells/SpellEntry.h @@ -512,6 +512,35 @@ namespace Spells return false; } + + inline bool IsSummonEffect(uint32 effectName) + { + switch (effectName) + { + case SPELL_EFFECT_SUMMON: + case SPELL_EFFECT_SUMMON_WILD: + case SPELL_EFFECT_SUMMON_GUARDIAN: + case SPELL_EFFECT_SUMMON_PET: + case SPELL_EFFECT_SUMMON_POSSESSED: + case SPELL_EFFECT_SUMMON_TOTEM: + case SPELL_EFFECT_SUMMON_OBJECT_WILD: + case SPELL_EFFECT_SUMMON_TOTEM_SLOT1: + case SPELL_EFFECT_SUMMON_TOTEM_SLOT2: + case SPELL_EFFECT_SUMMON_TOTEM_SLOT3: + case SPELL_EFFECT_SUMMON_TOTEM_SLOT4: + case SPELL_EFFECT_SUMMON_PHANTASM: + case SPELL_EFFECT_SUMMON_CRITTER: + case SPELL_EFFECT_SUMMON_OBJECT_SLOT1: + case SPELL_EFFECT_SUMMON_OBJECT_SLOT2: + case SPELL_EFFECT_SUMMON_OBJECT_SLOT3: + case SPELL_EFFECT_SUMMON_OBJECT_SLOT4: + case SPELL_EFFECT_SUMMON_DEAD_PET: + case SPELL_EFFECT_SUMMON_DEMON: + return true; + } + + return false; + } } class SpellEntry From 65f155a820abf488f9bd5e7e91dff9a7ee3a467f Mon Sep 17 00:00:00 2001 From: ratkosrb Date: Mon, 24 Jun 2024 03:38:01 +0300 Subject: [PATCH 17/34] Restore a comment. --- src/game/Objects/Unit.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/game/Objects/Unit.cpp b/src/game/Objects/Unit.cpp index 1e8e823e9df..209a66dc820 100644 --- a/src/game/Objects/Unit.cpp +++ b/src/game/Objects/Unit.cpp @@ -1123,6 +1123,8 @@ void Unit::Kill(Unit* pVictim, SpellEntry const* spellProto, bool durabilityLoss DEBUG_FILTER_LOG(LOG_FILTER_DAMAGE, "DealDamageHealth1"); + // remember victim PvP death for corpse type and corpse reclaim delay + // at original death (not at SpiritOfRedemptionTalent timeout) if (pPlayerVictim && !damageFromSpiritOfRedemptionTalent) pPlayerVictim->SetPvPDeath(pPlayerTap != nullptr); From 9bc89fd23c02459177b5edeb3adee0f282e72760 Mon Sep 17 00:00:00 2001 From: Shudza <10067406+shudza@users.noreply.github.com> Date: Mon, 24 Jun 2024 12:24:55 +0200 Subject: [PATCH 18/34] Handle negative time value in CharacterScreenIdleKick (#2690) --- src/game/WorldSession.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/WorldSession.cpp b/src/game/WorldSession.cpp index cfa3f4189f4..8fa46eead20 100644 --- a/src/game/WorldSession.cpp +++ b/src/game/WorldSession.cpp @@ -1333,7 +1333,7 @@ bool WorldSession::CharacterScreenIdleKick(uint32 currTime) if (!maxIdle) // disabled return false; - if ((currTime - m_idleTime) >= (maxIdle * 1000)) + if (currTime > m_idleTime && (currTime - m_idleTime) >= (maxIdle * 1000)) { sLog.Out(LOG_BASIC, LOG_LVL_DEBUG, "SESSION: Kicking session [%s] from character selection", GetRemoteAddress().c_str()); return true; From 5d167ea2f47f0a4e4080b83e28c8b42ab29bbb03 Mon Sep 17 00:00:00 2001 From: Daribon Date: Mon, 24 Jun 2024 12:47:51 +0200 Subject: [PATCH 19/34] Correct waypoints for Huricanian. (#2681) --- sql/migrations/20240620155345_world.sql | 57 +++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 sql/migrations/20240620155345_world.sql diff --git a/sql/migrations/20240620155345_world.sql b/sql/migrations/20240620155345_world.sql new file mode 100644 index 00000000000..187f695c9be --- /dev/null +++ b/sql/migrations/20240620155345_world.sql @@ -0,0 +1,57 @@ +DROP PROCEDURE IF EXISTS add_migration; +DELIMITER ?? +CREATE PROCEDURE `add_migration`() +BEGIN +DECLARE v INT DEFAULT 1; +SET v = (SELECT COUNT(*) FROM `migrations` WHERE `id`='20240620155345'); +IF v = 0 THEN +INSERT INTO `migrations` VALUES ('20240620155345'); +-- Add your query below. + + +-- Pathing for Huricanian Entry: 14478 +SET @NPC := 43125; +UPDATE `creature` SET `wander_distance`=0,`movement_type`=2,`position_x`=-6345.296,`position_y`=1774.6196,`position_z`=4.5550184 WHERE `guid`=@NPC; +DELETE FROM `creature_movement` WHERE `id`=@NPC; +INSERT INTO `creature_movement` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`waittime`,`wander_distance`,`script_id`) VALUES +(@NPC,1,-6345.296,1774.6196,4.5550184,100,0,0,0), +(@NPC,2,-6325.3813,1751.3876,1.8625244,100,0,0,0), +(@NPC,3,-6316.682,1718.2069,2.5542636,100,0,0,0), +(@NPC,4,-6304.6895,1690.9923,1.9438471,100,0,0,0), +(@NPC,5,-6279.7686,1689.2666,4.6524825,100,0,0,0), +(@NPC,6,-6274.7256,1643.7073,4.3596115,100,0,0,0), +(@NPC,7,-6275.5103,1612.6849,5.00104,100,0,0,0), +(@NPC,8,-6295.4634,1580.6515,0.49226487,100,0,0,0), +(@NPC,9,-6310.759,1549.3423,2.7265043,100,0,0,0), +(@NPC,10,-6332.532,1518.0614,1.5303156,100,0,0,0), +(@NPC,11,-6355.5312,1514.4183,4.6444654,100,0,0,0), +(@NPC,12,-6391.027,1513.2915,4.382957,100,0,0,0), +(@NPC,13,-6421.4976,1502.6038,5.5970297,100,0,0,0), +(@NPC,14,-6453.8496,1490.2762,6.7074456,100,0,0,0), +(@NPC,15,-6487.0234,1501.0323,5.4954395,100,0,0,0), +(@NPC,16,-6522.183,1504.034,2.6894567,100,0,0,0), +(@NPC,17,-6552.0337,1512.4528,3.9522433,100,0,0,0), +(@NPC,18,-6577.8975,1544.8099,-0.016361298,100,0,0,0), +(@NPC,19,-6579.297,1580.1136,3.1706502,100,0,0,0), +(@NPC,20,-6578.3584,1614.0538,8.790588,100,0,0,0), +(@NPC,21,-6598.862,1645.8755,5.9241867,100,0,0,0), +(@NPC,22,-6593.506,1689.1737,4.128006,100,0,0,0), +(@NPC,23,-6587.8228,1725.7534,3.8820236,100,0,0,0), +(@NPC,24,-6582.305,1748.8416,3.2985492,100,0,0,0), +(@NPC,25,-6554.3096,1776.0933,3.5581336,100,0,0,0), +(@NPC,26,-6518.56,1786.3973,8.61059,100,0,0,0), +(@NPC,27,-6513.037,1813.8506,3.9484806,100,0,0,0), +(@NPC,28,-6487.1646,1817.5917,3.2325697,100,0,0,0), +(@NPC,29,-6463.739,1787.981,8.050981,100,0,0,0), +(@NPC,30,-6442.454,1782.8776,10.865346,100,0,0,0), +(@NPC,31,-6413.579,1788.1747,4.5910115,100,0,0,0), +(@NPC,32,-6382.024,1780.8433,2.4358845,100,0,0,0); +-- 0x204CB000200E23800000A8000067E7DF .go xyz -6345.296 1774.6196 4.5550184 + + +-- End of migration. +END IF; +END?? +DELIMITER ; +CALL add_migration(); +DROP PROCEDURE IF EXISTS add_migration; From 2646715596d24ba205b03a7f3e1cee1c4ffa4ab9 Mon Sep 17 00:00:00 2001 From: ratkosrb Date: Mon, 24 Jun 2024 16:06:41 +0300 Subject: [PATCH 20/34] Fix handling of attack power mods field. The positive and negative mods should be stored separately. --- src/game/Commands/UnitCommands.cpp | 4 +- src/game/Objects/Creature.cpp | 3 -- src/game/Objects/Object.h | 7 +++ src/game/Objects/Pet.cpp | 1 - src/game/Objects/Player.cpp | 6 ++- src/game/Objects/Unit.cpp | 60 ++++++++++++++++++++---- src/game/Objects/Unit.h | 25 ++++++++++ src/game/Objects/UnitDefines.h | 2 - src/game/Spells/SpellAuras.cpp | 8 ++-- src/game/StatSystem.cpp | 73 +++++++++++++++++------------- 10 files changed, 134 insertions(+), 55 deletions(-) diff --git a/src/game/Commands/UnitCommands.cpp b/src/game/Commands/UnitCommands.cpp index 3cd6cd74f82..6f010dcbc53 100644 --- a/src/game/Commands/UnitCommands.cpp +++ b/src/game/Commands/UnitCommands.cpp @@ -446,12 +446,12 @@ bool ChatHandler::HandleUnitStatInfoCommand(char* args) PSendSysMessage("Total shadow resist: %i", pTarget->GetResistance(SPELL_SCHOOL_SHADOW)); PSendSysMessage("Total arcane resist: %i", pTarget->GetResistance(SPELL_SCHOOL_ARCANE)); PSendSysMessage("Attack power: %u", pTarget->GetUInt32Value(UNIT_FIELD_ATTACK_POWER)); - PSendSysMessage("Attack power mods: %u", pTarget->GetUInt32Value(UNIT_FIELD_ATTACK_POWER_MODS)); + PSendSysMessage("Attack power mods: %i / %i", pTarget->GetInt16Value(UNIT_FIELD_ATTACK_POWER_MODS, 0), pTarget->GetInt16Value(UNIT_FIELD_ATTACK_POWER_MODS, 1)); #if SUPPORTED_CLIENT_BUILD > CLIENT_BUILD_1_8_4 PSendSysMessage("Attack power multiplier: %u", pTarget->GetFloatValue(UNIT_FIELD_ATTACK_POWER_MULTIPLIER)); #endif PSendSysMessage("Ranged attack power: %u", pTarget->GetUInt32Value(UNIT_FIELD_RANGED_ATTACK_POWER)); - PSendSysMessage("Ranged attack power mods: %u", pTarget->GetUInt32Value(UNIT_FIELD_RANGED_ATTACK_POWER_MODS)); + PSendSysMessage("Ranged attack power mods: %i / %i", pTarget->GetUInt16Value(UNIT_FIELD_RANGED_ATTACK_POWER_MODS, 0), pTarget->GetUInt16Value(UNIT_FIELD_RANGED_ATTACK_POWER_MODS, 1)); #if SUPPORTED_CLIENT_BUILD > CLIENT_BUILD_1_8_4 PSendSysMessage("Ranged attack power multiplier: %u", pTarget->GetFloatValue(UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER)); #endif diff --git a/src/game/Objects/Creature.cpp b/src/game/Objects/Creature.cpp index b0b8a0cd44d..a34e786bcfd 100644 --- a/src/game/Objects/Creature.cpp +++ b/src/game/Objects/Creature.cpp @@ -1763,9 +1763,6 @@ void Creature::InitStatsForLevel(float percentHealth, float percentMana) SetBaseWeaponDamage(RANGED_ATTACK, MINDAMAGE, rangedDamageAverage - rangedDamageVariance); SetBaseWeaponDamage(RANGED_ATTACK, MAXDAMAGE, rangedDamageAverage + rangedDamageVariance); - SetModifierValue(UNIT_MOD_ATTACK_POWER, BASE_VALUE, pCLS->attack_power); - SetModifierValue(UNIT_MOD_ATTACK_POWER_RANGED, BASE_VALUE, pCLS->ranged_attack_power); - // armor SetCreateResistance(SPELL_SCHOOL_NORMAL, pCLS->armor * cinfo->armor_multiplier); diff --git a/src/game/Objects/Object.h b/src/game/Objects/Object.h index cbdb2810461..0a135fb708a 100644 --- a/src/game/Objects/Object.h +++ b/src/game/Objects/Object.h @@ -202,6 +202,13 @@ class Object return *(((uint16*)&m_uint32Values[ index ])+offset); } + int16 GetInt16Value(uint16 index, uint8 offset) const + { + MANGOS_ASSERT(index < m_valuesCount || PrintIndexError(index, false)); + MANGOS_ASSERT(offset < 2); + return *(((int16*)&m_int32Values[index]) + offset); + } + ObjectGuid const& GetGuidValue(uint16 index) const { return *reinterpret_cast(&GetUInt64Value(index)); } void SetInt32Value(uint16 index, int32 value); diff --git a/src/game/Objects/Pet.cpp b/src/game/Objects/Pet.cpp index 64257bd8d64..e0de243a144 100644 --- a/src/game/Objects/Pet.cpp +++ b/src/game/Objects/Pet.cpp @@ -1460,7 +1460,6 @@ bool Pet::InitStatsForLevel(uint32 petlevel, Unit const* owner) { SetCreateHealth(pInfo->health * healthMod); SetCreateResistance(SPELL_SCHOOL_NORMAL, int32(pInfo->armor)); - //SetModifierValue(UNIT_MOD_ATTACK_POWER, BASE_VALUE, float(cinfo->attack_power)); for (int i = STAT_STRENGTH; i < MAX_STATS; ++i) SetCreateStat(Stats(i), float(pInfo->stats[i])); diff --git a/src/game/Objects/Player.cpp b/src/game/Objects/Player.cpp index dddb2095ea1..933e84c53d5 100644 --- a/src/game/Objects/Player.cpp +++ b/src/game/Objects/Player.cpp @@ -3767,12 +3767,14 @@ void Player::InitStatsForLevel(bool reapplyMods) SetFloatValue(UNIT_FIELD_MAXRANGEDDAMAGE, 0.0f); SetInt32Value(UNIT_FIELD_ATTACK_POWER, 0); - SetInt32Value(UNIT_FIELD_ATTACK_POWER_MODS, 0); + SetInt16Value(UNIT_FIELD_ATTACK_POWER_MODS, 0, 0); + SetInt16Value(UNIT_FIELD_ATTACK_POWER_MODS, 1, 0); #if SUPPORTED_CLIENT_BUILD > CLIENT_BUILD_1_8_4 SetFloatValue(UNIT_FIELD_ATTACK_POWER_MULTIPLIER, 0.0f); #endif SetInt32Value(UNIT_FIELD_RANGED_ATTACK_POWER, 0); - SetInt32Value(UNIT_FIELD_RANGED_ATTACK_POWER_MODS, 0); + SetInt16Value(UNIT_FIELD_RANGED_ATTACK_POWER_MODS, 0, 0); + SetInt16Value(UNIT_FIELD_RANGED_ATTACK_POWER_MODS, 1, 0); #if SUPPORTED_CLIENT_BUILD > CLIENT_BUILD_1_8_4 SetFloatValue(UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER, 0.0f); #endif diff --git a/src/game/Objects/Unit.cpp b/src/game/Objects/Unit.cpp index 209a66dc820..f22a00b2467 100644 --- a/src/game/Objects/Unit.cpp +++ b/src/game/Objects/Unit.cpp @@ -7772,6 +7772,55 @@ uint32 Unit::GetCreatureType() const ######## ######## #######################################*/ +// attack power needs special handling because positive and negative mods are set in separate update fields +bool Unit::HandleAttackPowerModifier(AttackPowerModIndex index, AttackPowerModType modifierType, float amount, bool apply) +{ + if (index >= AP_MODS_COUNT || modifierType >= AP_MOD_TYPE_COUNT) + { + sLog.Out(LOG_BASIC, LOG_LVL_ERROR, "ERROR in HandleAttackPowerModifier(): nonexistent index %u or type %u!", index, modifierType); + return false; + } + + switch (modifierType) + { + case AP_MOD_POSITIVE_FLAT: + m_attackPowerMods[index].positiveMods += apply ? amount : -amount; + break; + case AP_MOD_NEGATIVE_FLAT: + m_attackPowerMods[index].negativeMods += apply ? amount : -amount; + break; + case AP_MOD_PCT: + ApplyPercentModFloatVar(m_attackPowerMods[index].multiplier, amount, apply); + break; + } + + if (!CanModifyStats()) + return false; + + UpdateAttackPowerAndDamage(index == RANGED_AP_MODS); +} + +float Unit::GetAttackPowerModifierValue(AttackPowerModIndex index, AttackPowerModType modifierType) const +{ + if (index >= AP_MODS_COUNT || modifierType >= AP_MOD_TYPE_COUNT) + { + sLog.Out(LOG_BASIC, LOG_LVL_ERROR, "attempt to access nonexistent modifier value from m_attackPowerMods!"); + return 0.0f; + } + + switch (modifierType) + { + case AP_MOD_POSITIVE_FLAT: + return m_attackPowerMods[index].positiveMods; + case AP_MOD_NEGATIVE_FLAT: + return m_attackPowerMods[index].negativeMods; + case AP_MOD_PCT: + return std::max(0.0f, m_attackPowerMods[index].multiplier); + } + + return 0; +} + bool Unit::HandleStatModifier(UnitMods unitMod, UnitModifierType modifierType, float amount, bool apply) { if (unitMod >= UNIT_MOD_END || modifierType >= MODIFIER_TYPE_END) @@ -7832,13 +7881,6 @@ bool Unit::HandleStatModifier(UnitMods unitMod, UnitModifierType modifierType, f UpdateResistances(GetSpellSchoolByAuraGroup(unitMod)); break; - case UNIT_MOD_ATTACK_POWER: - UpdateAttackPowerAndDamage(); - break; - case UNIT_MOD_ATTACK_POWER_RANGED: - UpdateAttackPowerAndDamage(true); - break; - case UNIT_MOD_DAMAGE_MAINHAND: UpdateDamagePhysical(BASE_ATTACK); break; @@ -8026,7 +8068,7 @@ float Unit::GetTotalAttackPowerValue(WeaponAttackType attType) const { if (attType == RANGED_ATTACK) { - int32 ap = GetInt32Value(UNIT_FIELD_RANGED_ATTACK_POWER) + GetInt32Value(UNIT_FIELD_RANGED_ATTACK_POWER_MODS); + int32 ap = GetInt32Value(UNIT_FIELD_RANGED_ATTACK_POWER) + GetInt16Value(UNIT_FIELD_RANGED_ATTACK_POWER_MODS, 0) + GetInt16Value(UNIT_FIELD_RANGED_ATTACK_POWER_MODS, 1); if (ap < 0) return 0.0f; #if SUPPORTED_CLIENT_BUILD > CLIENT_BUILD_1_8_4 @@ -8037,7 +8079,7 @@ float Unit::GetTotalAttackPowerValue(WeaponAttackType attType) const } else { - int32 ap = GetInt32Value(UNIT_FIELD_ATTACK_POWER) + GetInt32Value(UNIT_FIELD_ATTACK_POWER_MODS); + int32 ap = GetInt32Value(UNIT_FIELD_ATTACK_POWER) + GetInt16Value(UNIT_FIELD_ATTACK_POWER_MODS, 0) + GetInt16Value(UNIT_FIELD_ATTACK_POWER_MODS, 1); if (ap < 0) return 0.0f; #if SUPPORTED_CLIENT_BUILD > CLIENT_BUILD_1_8_4 diff --git a/src/game/Objects/Unit.h b/src/game/Objects/Unit.h index c39726c835d..6cbd78cd3cd 100644 --- a/src/game/Objects/Unit.h +++ b/src/game/Objects/Unit.h @@ -164,6 +164,28 @@ struct SpellPeriodicAuraLogInfo float multiplier; }; +struct AttackPowerModInfo +{ + float positiveMods = 0; // int16 in client + float negativeMods = 0; // int16 in client + float multiplier = 1.0f; +}; + +enum AttackPowerModType +{ + AP_MOD_POSITIVE_FLAT, + AP_MOD_NEGATIVE_FLAT, + AP_MOD_PCT, + AP_MOD_TYPE_COUNT, +}; + +enum AttackPowerModIndex +{ + MELEE_AP_MODS, + RANGED_AP_MODS, + AP_MODS_COUNT, +}; + uint32 CreateProcExtendMask(SpellNonMeleeDamage* damageInfo, SpellMissInfo missCondition); enum SpellProcEventTriggerCheck @@ -356,6 +378,7 @@ class Unit : public SpellCaster float m_createStats[MAX_STATS]; int32 m_createResistances[MAX_SPELL_SCHOOL]; float m_auraModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_END]; + AttackPowerModInfo m_attackPowerMods[AP_MODS_COUNT]; WeaponDamageInfo m_weaponDamage[MAX_ATTACK][MAX_ITEM_PROTO_DAMAGES]; uint8 m_weaponDamageCount[MAX_ATTACK]; bool m_canModifyStats; @@ -446,6 +469,8 @@ class Unit : public SpellCaster virtual uint32 GetShieldBlockValue() const = 0; float GetPPMProcChance(uint32 WeaponSpeed, float PPM) const; + bool HandleAttackPowerModifier(AttackPowerModIndex index, AttackPowerModType modifierType, float amount, bool apply); + float GetAttackPowerModifierValue(AttackPowerModIndex index, AttackPowerModType modifierType) const; bool HandleStatModifier(UnitMods unitMod, UnitModifierType modifierType, float amount, bool apply); void SetModifierValue(UnitMods unitMod, UnitModifierType modifierType, float value) { m_auraModifiersGroup[unitMod][modifierType] = value; } float GetModifierValue(UnitMods unitMod, UnitModifierType modifierType) const; diff --git a/src/game/Objects/UnitDefines.h b/src/game/Objects/UnitDefines.h index 43380e0d036..69f8a936667 100644 --- a/src/game/Objects/UnitDefines.h +++ b/src/game/Objects/UnitDefines.h @@ -343,8 +343,6 @@ enum UnitMods UNIT_MOD_RESISTANCE_FROST, UNIT_MOD_RESISTANCE_SHADOW, UNIT_MOD_RESISTANCE_ARCANE, - UNIT_MOD_ATTACK_POWER, - UNIT_MOD_ATTACK_POWER_RANGED, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_DAMAGE_RANGED, diff --git a/src/game/Spells/SpellAuras.cpp b/src/game/Spells/SpellAuras.cpp index 338d97bbe18..0e4fbb28d54 100644 --- a/src/game/Spells/SpellAuras.cpp +++ b/src/game/Spells/SpellAuras.cpp @@ -5373,7 +5373,7 @@ void Aura::HandleAuraModAttackPower(bool apply, bool /*Real*/) modOwner->ApplySpellMod(GetSpellProto()->Id, SPELLMOD_ATTACK_POWER, m_modifier.m_amount); } - GetTarget()->HandleStatModifier(UNIT_MOD_ATTACK_POWER, TOTAL_VALUE, m_modifier.m_amount, apply); + GetTarget()->HandleAttackPowerModifier(MELEE_AP_MODS, IsPositive() ? AP_MOD_POSITIVE_FLAT : AP_MOD_NEGATIVE_FLAT, m_modifier.m_amount, apply); #if (SUPPORTED_CLIENT_BUILD > CLIENT_BUILD_1_3_1) && (SUPPORTED_CLIENT_BUILD <= CLIENT_BUILD_1_8_4) // Blood Fury- Add aura to decrease attack power on remove @@ -5403,7 +5403,7 @@ void Aura::HandleAuraModRangedAttackPower(bool apply, bool /*Real*/) modOwner->ApplySpellMod(GetSpellProto()->Id, SPELLMOD_ATTACK_POWER, m_modifier.m_amount); } - GetTarget()->HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, m_modifier.m_amount, apply); + GetTarget()->HandleAttackPowerModifier(RANGED_AP_MODS, IsPositive() ? AP_MOD_POSITIVE_FLAT : AP_MOD_NEGATIVE_FLAT, m_modifier.m_amount, apply); } void Aura::HandleAuraModAttackPowerPercent(bool apply, bool /*Real*/) @@ -5416,7 +5416,7 @@ void Aura::HandleAuraModAttackPowerPercent(bool apply, bool /*Real*/) } // UNIT_FIELD_ATTACK_POWER_MULTIPLIER = multiplier - 1 - GetTarget()->HandleStatModifier(UNIT_MOD_ATTACK_POWER, TOTAL_PCT, m_modifier.m_amount, apply); + GetTarget()->HandleAttackPowerModifier(MELEE_AP_MODS, AP_MOD_PCT, m_modifier.m_amount, apply); } void Aura::HandleAuraModRangedAttackPowerPercent(bool apply, bool /*Real*/) @@ -5433,7 +5433,7 @@ void Aura::HandleAuraModRangedAttackPowerPercent(bool apply, bool /*Real*/) } // UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER = multiplier - 1 - GetTarget()->HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_PCT, m_modifier.m_amount, apply); + GetTarget()->HandleAttackPowerModifier(RANGED_AP_MODS, AP_MOD_PCT, m_modifier.m_amount, apply); #endif } diff --git a/src/game/StatSystem.cpp b/src/game/StatSystem.cpp index fc02c7ffe9a..cb012ba6f1d 100644 --- a/src/game/StatSystem.cpp +++ b/src/game/StatSystem.cpp @@ -307,7 +307,7 @@ float Unit::GetAttackPowerFromStrengthAndAgility(bool ranged, float strength, fl void Player::UpdateAttackPowerAndDamage(bool ranged) { - UnitMods unitMod = ranged ? UNIT_MOD_ATTACK_POWER_RANGED : UNIT_MOD_ATTACK_POWER; + AttackPowerModIndex unitMod = ranged ? RANGED_AP_MODS : MELEE_AP_MODS; uint16 index = UNIT_FIELD_ATTACK_POWER; uint16 index_mod = UNIT_FIELD_ATTACK_POWER_MODS; @@ -324,18 +324,19 @@ void Player::UpdateAttackPowerAndDamage(bool ranged) #endif } - float val2 = GetAttackPowerFromStrengthAndAgility(ranged, GetStat(STAT_STRENGTH), GetStat(STAT_AGILITY)); - SetModifierValue(unitMod, BASE_VALUE, val2); + float baseAttackPower = GetAttackPowerFromStrengthAndAgility(ranged, GetStat(STAT_STRENGTH), GetStat(STAT_AGILITY)); - float base_attPower = GetModifierValue(unitMod, BASE_VALUE) * GetModifierValue(unitMod, BASE_PCT); - float attPowerMod = GetModifierValue(unitMod, TOTAL_VALUE); + // attack power mods are split into positive and negative field + float attackPowerModPositive = GetAttackPowerModifierValue(unitMod, AP_MOD_POSITIVE_FLAT); + float attackPowerModNegative = GetAttackPowerModifierValue(unitMod, AP_MOD_NEGATIVE_FLAT); - float attPowerMultiplier = GetModifierValue(unitMod, TOTAL_PCT) - 1.0f; + SetInt32Value(index, (int32)baseAttackPower); //UNIT_FIELD_(RANGED)_ATTACK_POWER field + SetInt16Value(index_mod, 0, (int16)attackPowerModPositive); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MODS field (positive) + SetInt16Value(index_mod, 1, (int16)attackPowerModNegative); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MODS field (negative) - SetInt32Value(index, (uint32)base_attPower); //UNIT_FIELD_(RANGED)_ATTACK_POWER field - SetInt32Value(index_mod, (uint32)attPowerMod); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MODS field #if SUPPORTED_CLIENT_BUILD > CLIENT_BUILD_1_8_4 - SetFloatValue(index_mult, attPowerMultiplier); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field + float attackPowerMultiplier = GetAttackPowerModifierValue(unitMod, AP_MOD_PCT) - 1.0f; + SetFloatValue(index_mult, attackPowerMultiplier); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field #endif //automatically update weapon damage after attack power modification @@ -835,7 +836,7 @@ void Creature::UpdateManaRegen() void Creature::UpdateAttackPowerAndDamage(bool ranged) { - UnitMods unitMod = ranged ? UNIT_MOD_ATTACK_POWER_RANGED : UNIT_MOD_ATTACK_POWER; + AttackPowerModIndex unitMod = ranged ? RANGED_AP_MODS : MELEE_AP_MODS; uint16 index = UNIT_FIELD_ATTACK_POWER; uint16 index_mod = UNIT_FIELD_ATTACK_POWER_MODS; @@ -852,9 +853,12 @@ void Creature::UpdateAttackPowerAndDamage(bool ranged) #endif } - float baseAttackPower = GetModifierValue(unitMod, BASE_VALUE) * GetModifierValue(unitMod, BASE_PCT); - float attackPowerMod = GetModifierValue(unitMod, TOTAL_VALUE); - float attackPowerMultiplier = GetModifierValue(unitMod, TOTAL_PCT) - 1.0f; + CreatureClassLevelStats const* pCLS = GetClassLevelStats(); + float baseAttackPower = ranged ? pCLS->ranged_attack_power : pCLS->attack_power; + + // attack power mods are split into positive and negative field + float attackPowerModPositive = GetAttackPowerModifierValue(unitMod, AP_MOD_POSITIVE_FLAT); + float attackPowerModNegative = GetAttackPowerModifierValue(unitMod, AP_MOD_NEGATIVE_FLAT); // Only apply AP bonus from stats when different than default value, // as the stats are already taken into account in the base AP values. @@ -863,13 +867,21 @@ void Creature::UpdateAttackPowerAndDamage(bool ranged) { float defaultAPBonus = GetAttackPowerFromStrengthAndAgility(ranged, GetCreateStat(STAT_STRENGTH), GetCreateStat(STAT_AGILITY)); float currentAPBonus = GetAttackPowerFromStrengthAndAgility(ranged, GetStat(STAT_STRENGTH), GetStat(STAT_AGILITY)); - attackPowerMod += (currentAPBonus - defaultAPBonus); + + float modFromStats = (currentAPBonus - defaultAPBonus); + if (modFromStats > 0.0f) + attackPowerModPositive += modFromStats; + else + attackPowerModNegative += modFromStats; } - SetInt32Value(index, (int32)baseAttackPower); //UNIT_FIELD_(RANGED)_ATTACK_POWER field - SetInt32Value(index_mod, (int32)attackPowerMod); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MODS field + SetInt32Value(index, (int32)baseAttackPower); //UNIT_FIELD_(RANGED)_ATTACK_POWER field + SetInt16Value(index_mod, 0, (int16)attackPowerModPositive); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MODS field (positive) + SetInt16Value(index_mod, 1, (int16)attackPowerModNegative); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MODS field (negative) + #if SUPPORTED_CLIENT_BUILD > CLIENT_BUILD_1_8_4 - SetFloatValue(index_mult, attackPowerMultiplier); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field + float attackPowerMultiplier = GetAttackPowerModifierValue(unitMod, AP_MOD_PCT) - 1.0f; + SetFloatValue(index_mult, attackPowerMultiplier); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field #endif //automatically update weapon damage after attack power modification @@ -1029,28 +1041,25 @@ void Pet::UpdateAttackPowerAndDamage(bool ranged) if (ranged) return; - float val = 0.0f; - UnitMods unitMod = UNIT_MOD_ATTACK_POWER; + AttackPowerModIndex unitMod = MELEE_AP_MODS; - if (GetEntry() == 416) // imp's attack power - val = GetStat(STAT_STRENGTH) - 10.0f; - else - val = 2 * GetStat(STAT_STRENGTH) - 20.0f; - - SetModifierValue(UNIT_MOD_ATTACK_POWER, BASE_VALUE, val); + float baseAttackPower = (GetEntry() == 416) ? GetStat(STAT_STRENGTH) - 10.0f : 2 * GetStat(STAT_STRENGTH) - 20.0f; - //in BASE_VALUE of UNIT_MOD_ATTACK_POWER for creatures we store data of meleeattackpower field in DB - float base_attPower = GetModifierValue(unitMod, BASE_VALUE) * GetModifierValue(unitMod, BASE_PCT); - float attPowerMod = GetModifierValue(unitMod, TOTAL_VALUE); - float attPowerMultiplier = GetModifierValue(unitMod, TOTAL_PCT) - 1.0f; + // attack power mods are split into positive and negative field + float attackPowerModPositive = GetAttackPowerModifierValue(unitMod, AP_MOD_POSITIVE_FLAT); + float attackPowerModNegative = GetAttackPowerModifierValue(unitMod, AP_MOD_NEGATIVE_FLAT); //UNIT_FIELD_(RANGED)_ATTACK_POWER field - SetInt32Value(UNIT_FIELD_ATTACK_POWER, (int32)base_attPower); + SetInt32Value(UNIT_FIELD_ATTACK_POWER, (int32)baseAttackPower); + //UNIT_FIELD_(RANGED)_ATTACK_POWER_MODS field - SetInt32Value(UNIT_FIELD_ATTACK_POWER_MODS, (int32)attPowerMod); + SetInt16Value(UNIT_FIELD_ATTACK_POWER_MODS, 0, (int16)attackPowerModPositive); // positive + SetInt16Value(UNIT_FIELD_ATTACK_POWER_MODS, 1, (int16)attackPowerModNegative); // negative + //UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field #if SUPPORTED_CLIENT_BUILD > CLIENT_BUILD_1_8_4 - SetFloatValue(UNIT_FIELD_ATTACK_POWER_MULTIPLIER, attPowerMultiplier); + float attackPowerMultiplier = GetAttackPowerModifierValue(unitMod, AP_MOD_PCT) - 1.0f; + SetFloatValue(UNIT_FIELD_ATTACK_POWER_MULTIPLIER, attackPowerMultiplier); #endif //automatically update weapon damage after attack power modification From d98e4e5ad6da178f62f3bfd0fdb240f29a010ac4 Mon Sep 17 00:00:00 2001 From: ratkosrb Date: Mon, 24 Jun 2024 16:10:13 +0300 Subject: [PATCH 21/34] Follow up to last commit. --- src/game/Commands/UnitCommands.cpp | 2 +- src/game/Objects/Unit.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/Commands/UnitCommands.cpp b/src/game/Commands/UnitCommands.cpp index 6f010dcbc53..e6e614ba373 100644 --- a/src/game/Commands/UnitCommands.cpp +++ b/src/game/Commands/UnitCommands.cpp @@ -451,7 +451,7 @@ bool ChatHandler::HandleUnitStatInfoCommand(char* args) PSendSysMessage("Attack power multiplier: %u", pTarget->GetFloatValue(UNIT_FIELD_ATTACK_POWER_MULTIPLIER)); #endif PSendSysMessage("Ranged attack power: %u", pTarget->GetUInt32Value(UNIT_FIELD_RANGED_ATTACK_POWER)); - PSendSysMessage("Ranged attack power mods: %i / %i", pTarget->GetUInt16Value(UNIT_FIELD_RANGED_ATTACK_POWER_MODS, 0), pTarget->GetUInt16Value(UNIT_FIELD_RANGED_ATTACK_POWER_MODS, 1)); + PSendSysMessage("Ranged attack power mods: %i / %i", pTarget->GetInt16Value(UNIT_FIELD_RANGED_ATTACK_POWER_MODS, 0), pTarget->GetInt16Value(UNIT_FIELD_RANGED_ATTACK_POWER_MODS, 1)); #if SUPPORTED_CLIENT_BUILD > CLIENT_BUILD_1_8_4 PSendSysMessage("Ranged attack power multiplier: %u", pTarget->GetFloatValue(UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER)); #endif diff --git a/src/game/Objects/Unit.cpp b/src/game/Objects/Unit.cpp index f22a00b2467..d555f2339b8 100644 --- a/src/game/Objects/Unit.cpp +++ b/src/game/Objects/Unit.cpp @@ -7804,7 +7804,7 @@ float Unit::GetAttackPowerModifierValue(AttackPowerModIndex index, AttackPowerMo { if (index >= AP_MODS_COUNT || modifierType >= AP_MOD_TYPE_COUNT) { - sLog.Out(LOG_BASIC, LOG_LVL_ERROR, "attempt to access nonexistent modifier value from m_attackPowerMods!"); + sLog.Out(LOG_BASIC, LOG_LVL_ERROR, "Attempt to access nonexistent modifier value from m_attackPowerMods!"); return 0.0f; } From 9ae3c85ff02ff96270f38a4a5ad21e48b202547f Mon Sep 17 00:00:00 2001 From: ratkosrb Date: Mon, 24 Jun 2024 16:13:18 +0300 Subject: [PATCH 22/34] Forgot the return value. --- src/game/Objects/Unit.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/game/Objects/Unit.cpp b/src/game/Objects/Unit.cpp index d555f2339b8..023efcfd895 100644 --- a/src/game/Objects/Unit.cpp +++ b/src/game/Objects/Unit.cpp @@ -7798,6 +7798,7 @@ bool Unit::HandleAttackPowerModifier(AttackPowerModIndex index, AttackPowerModTy return false; UpdateAttackPowerAndDamage(index == RANGED_AP_MODS); + return true; } float Unit::GetAttackPowerModifierValue(AttackPowerModIndex index, AttackPowerModType modifierType) const From fbf3580413536dd17d084bc15447ba71972b0edf Mon Sep 17 00:00:00 2001 From: ratkosrb Date: Mon, 24 Jun 2024 16:55:06 +0300 Subject: [PATCH 23/34] Fix anticheat false positive with gm fly. --- src/game/Anticheat/MovementAnticheat/MovementAnticheat.cpp | 4 +++- src/game/Handlers/MovementHandler.cpp | 7 +++++++ src/game/Objects/Player.cpp | 2 ++ src/game/WorldSession.h | 3 ++- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/game/Anticheat/MovementAnticheat/MovementAnticheat.cpp b/src/game/Anticheat/MovementAnticheat/MovementAnticheat.cpp index d93d74ec0d9..9e573ec8dab 100644 --- a/src/game/Anticheat/MovementAnticheat/MovementAnticheat.cpp +++ b/src/game/Anticheat/MovementAnticheat/MovementAnticheat.cpp @@ -1045,8 +1045,10 @@ bool MovementAnticheat::CheckMoveStart(MovementInfo const& movementInfo, uint16 } else { + if (movementInfo.HasMovementFlag(MOVEFLAG_SWIMMING) && - !GetLastMovementInfo().HasMovementFlag(MOVEFLAG_SWIMMING)) + !GetLastMovementInfo().HasMovementFlag(MOVEFLAG_SWIMMING) && + !me->HasCheatOption(PLAYER_CHEAT_FLY)) return true; } diff --git a/src/game/Handlers/MovementHandler.cpp b/src/game/Handlers/MovementHandler.cpp index 4065ffeab7a..d58c2d2d5e3 100644 --- a/src/game/Handlers/MovementHandler.cpp +++ b/src/game/Handlers/MovementHandler.cpp @@ -1073,6 +1073,13 @@ Unit* WorldSession::GetMoverFromGuid(ObjectGuid const& guid) const return nullptr; } +void WorldSession::RejectMovementPacketsFor(uint32 ms) +{ + uint32 timeout = WorldTimer::getMSTime() + ms; + if (m_moveRejectTime < timeout) + m_moveRejectTime = timeout; +} + bool WorldSession::VerifyMovementInfo(MovementInfo const& movementInfo) const { if (!MaNGOS::IsValidMapCoord(movementInfo.GetPos().x, movementInfo.GetPos().y, movementInfo.GetPos().z, movementInfo.GetPos().o)) diff --git a/src/game/Objects/Player.cpp b/src/game/Objects/Player.cpp index 933e84c53d5..63b6bf0bbd1 100644 --- a/src/game/Objects/Player.cpp +++ b/src/game/Objects/Player.cpp @@ -3216,6 +3216,7 @@ void Player::SetCheatFixedZ(bool on, bool notify) else m_movementInfo.RemoveMovementFlag(MOVEFLAG_FIXED_Z); + GetSession()->RejectMovementPacketsFor(100); SendHeartBeat(true); if (notify) @@ -5022,6 +5023,7 @@ void Player::SetFly(bool enable) m_movementInfo.moveFlags = (MOVEFLAG_NONE); } + GetSession()->RejectMovementPacketsFor(100); SendHeartBeat(true); } diff --git a/src/game/WorldSession.h b/src/game/WorldSession.h index c26a76b31bd..c00870f703c 100644 --- a/src/game/WorldSession.h +++ b/src/game/WorldSession.h @@ -374,7 +374,8 @@ class WorldSession Unit* GetMoverFromGuid(ObjectGuid const& guid) const; ObjectGuid const& GetClientMoverGuid() const { return m_clientMoverGuid; } bool HasClientMovementControl() const { return !m_clientMoverGuid.IsEmpty(); } - + void RejectMovementPacketsFor(uint32 ms); + void SetReceivedWhoRequest(bool v) { m_who_recvd = v; } bool ReceivedWhoRequest() const { return m_who_recvd; } bool m_who_recvd; From e337ac6a95776e7e6f2af42c9b015900fc13d227 Mon Sep 17 00:00:00 2001 From: ratkosrb Date: Mon, 24 Jun 2024 19:08:26 +0300 Subject: [PATCH 24/34] Fix Disarm damage exploit with resetting talents. Closes https://github.com/vmangos/core/issues/2614 --- src/game/Spells/SpellAuras.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/game/Spells/SpellAuras.cpp b/src/game/Spells/SpellAuras.cpp index 0e4fbb28d54..f2ed424c896 100644 --- a/src/game/Spells/SpellAuras.cpp +++ b/src/game/Spells/SpellAuras.cpp @@ -5445,11 +5445,18 @@ void Aura::HandleModDamageDone(bool apply, bool Real) Unit* target = GetTarget(); // apply item specific bonuses for already equipped weapon - if (Real && target->GetTypeId() == TYPEID_PLAYER) + if (Real) { - for (int i = 0; i < MAX_ATTACK; ++i) - if (Item* pItem = ((Player*)target)->GetWeaponForAttack(WeaponAttackType(i), true, false)) - ((Player*)target)->_ApplyWeaponDependentAuraDamageMod(pItem, WeaponAttackType(i), this, apply); + if (Player* player = target->ToPlayer()) + { + for (int i = 0; i < MAX_ATTACK; ++i) + { + if (Item* pItem = player->GetWeaponForAttack(WeaponAttackType(i), true, true)) + { + player->_ApplyWeaponDependentAuraDamageMod(pItem, WeaponAttackType(i), this, apply); + } + } + } } // m_modifier.m_miscvalue is bitmask of spell schools @@ -5534,7 +5541,7 @@ void Aura::HandleModDamagePercentDone(bool apply, bool Real) { for (int i = 0; i < MAX_ATTACK; ++i) { - if (Item* pItem = player->GetWeaponForAttack(WeaponAttackType(i), true, false)) + if (Item* pItem = player->GetWeaponForAttack(WeaponAttackType(i), true, true)) { player->_ApplyWeaponDependentAuraDamageMod(pItem, WeaponAttackType(i), this, apply); } From d7dd2e83ade795c64152de93c4ce30b4e1474df7 Mon Sep 17 00:00:00 2001 From: Daribon Date: Mon, 24 Jun 2024 19:14:38 +0200 Subject: [PATCH 25/34] Correct NPCs in the mountain between Elwynn and Burning Steppes. (#2676) --- sql/migrations/20240620215210_world.sql | 98 +++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 sql/migrations/20240620215210_world.sql diff --git a/sql/migrations/20240620215210_world.sql b/sql/migrations/20240620215210_world.sql new file mode 100644 index 00000000000..4b840ddb140 --- /dev/null +++ b/sql/migrations/20240620215210_world.sql @@ -0,0 +1,98 @@ +DROP PROCEDURE IF EXISTS add_migration; +DELIMITER ?? +CREATE PROCEDURE `add_migration`() +BEGIN +DECLARE v INT DEFAULT 1; +SET v = (SELECT COUNT(*) FROM `migrations` WHERE `id`='20240620215210'); +IF v = 0 THEN +INSERT INTO `migrations` VALUES ('20240620215210'); +-- Add your query below. + + +-- Expeditionary Priest createobject2 +UPDATE `creature` SET `position_x`=-8178.819, `position_y`=-589.6886, `position_z`=200.31729, `orientation`=3.118427038192749023, `movement_type`=1, `spawntimesecsmin`=240, `spawntimesecsmax`=300, `wander_distance`=5 WHERE `guid`=54003; +UPDATE `creature` SET `position_x`=-8175.9707, `position_y`=-593.94934, `position_z`=200.10762, `orientation`=5.785596370697021484, `movement_type`=1, `wander_distance`=5 WHERE `guid`=301771; + +-- Expeditionary Mountaineer createobject2 +UPDATE `creature` SET `position_x`=-8180.118, `position_y`=-591.6746, `position_z`=200.30156, `orientation`=2.092212915420532226, `movement_type`=0, `spawntimesecsmin`=240, `spawntimesecsmax`=300, `wander_distance`=0 WHERE `guid`=54001; +UPDATE `creature` SET `position_x`=-8176.637, `position_y`=-584.5677, `position_z`=200.55144, `orientation`=2.897246599197387695, `movement_type`=0, `spawntimesecsmin`=240, `spawntimesecsmax`=300, `wander_distance`=0 WHERE `guid`=301770; +UPDATE `creature` SET `position_x`=-8177.798, `position_y`=-585.94714, `position_z`=200.39417, `orientation`=1.378810048103332519, `movement_type`=0, `spawntimesecsmin`=240, `spawntimesecsmax`=300 WHERE `guid`=54000; +UPDATE `creature` SET `position_x`=-8173.9185, `position_y`=-589.4102, `position_z`=200.20743, `orientation`=3.799572467803955078, `movement_type`=1, `spawntimesecsmin`=240, `spawntimesecsmax`=300 WHERE `guid`=301773; +UPDATE `creature` SET `position_x`=-8175.9634, `position_y`=-589.83655, `position_z`=200.24149, `orientation`=1.884955525398254394, `id`=14390, `movement_type`=1, `spawntimesecsmin`=240, `spawntimesecsmax`=300, `wander_distance`=5 WHERE `guid`=301772; +UPDATE `creature` SET `position_x`=-8180.905, `position_y`=-586.19696, `position_z`=200.45303, `orientation`=5.707226753234863281, `id`=14390, `movement_type`=0, `spawntimesecsmin`=240, `spawntimesecsmax`=300, `wander_distance`=0 WHERE `guid`=301774; +INSERT INTO `creature` (`guid`, `id`, `id2`, `id3`, `id4`, `id5`, `map`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecsmin`, `spawntimesecsmax`, `wander_distance`, `health_percent`, `mana_percent`, `movement_type`, `spawn_flags`, `visibility_mod`, `patch_min`, `patch_max`) VALUES +(285080, 14390, 0, 0, 0, 0, 0, -8181.9785, -585.30597, 200.49089, 0.750491559505462646, 240, 300, 0, 100, 0, 0, 0, 0, 0, 10); + +-- Delete custom groups, none of those NPCs are grouped. +DELETE FROM `creature_groups` WHERE `member_guid`=301770; +DELETE FROM `creature_groups` WHERE `member_guid`=301774; +DELETE FROM `creature_groups` WHERE `member_guid`=301772; +DELETE FROM `creature_groups` WHERE `member_guid`=54003; + +-- Expeditionary Mountaineer emote +DELETE FROM `creature_ai_scripts` WHERE `id`=301774; +INSERT INTO `creature_ai_scripts` (`id`, `delay`, `priority`, `command`, `datalong`, `datalong2`, `datalong3`, `datalong4`, `target_param1`, `target_param2`, `target_type`, `data_flags`, `dataint`, `dataint2`, `dataint3`, `dataint4`, `x`, `y`, `z`, `o`, `condition_id`, `comments`) VALUES +(301774, 0, 0, 1, 7, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 1678803, 'Expeditionary Mountaineer - Emote Eat'), +(301774, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1678804, 'Expeditionary Mountaineer - Emote Talk'); + +DELETE FROM `creature_ai_scripts` WHERE `id`=301775; +INSERT INTO `creature_ai_scripts` (`id`, `delay`, `priority`, `command`, `datalong`, `datalong2`, `datalong3`, `datalong4`, `target_param1`, `target_param2`, `target_type`, `data_flags`, `dataint`, `dataint2`, `dataint3`, `dataint4`, `x`, `y`, `z`, `o`, `condition_id`, `comments`) VALUES +(301775, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1678805, 'Expeditionary Mountaineer - Idle'), +(301775, 0, 1, 28, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 1678805, 'Expeditionary Mountaineer - Sit State'), +(301775, 0, 1, 1, 7, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 1678805, 'Expeditionary Mountaineer - Eat Emote'); + +DELETE FROM `creature_ai_scripts` WHERE `id`=301776; +INSERT INTO `creature_ai_scripts` (`id`, `delay`, `priority`, `command`, `datalong`, `datalong2`, `datalong3`, `datalong4`, `target_param1`, `target_param2`, `target_type`, `data_flags`, `dataint`, `dataint2`, `dataint3`, `dataint4`, `x`, `y`, `z`, `o`, `condition_id`, `comments`) VALUES +(301776, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1678805, 'Expeditionary Mountaineer - Stand State'), +(301776, 0, 1, 20, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 1678805, 'Expeditionary Mountaineer - Active Random Movement'); + +-- Events list for Expeditionary Mountaineer +INSERT INTO `creature_ai_events` (`id`, `creature_id`, `condition_id`, `event_type`, `event_inverse_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action1_script`, `action2_script`, `action3_script`, `comment`) VALUES +(301774, 14390, 0, 1, 0, 100, 1, 1000, 7000, 6000, 11000, 301774, 0, 0, 'Expeditionary Mountaineer - Emote OOC'), +(301775, 14390, 0, 1, 0, 100, 1, 20000, 40000, 20000, 40000, 301775, 0, 0, 'Expeditionary Mountaineer - Sit Eat Emote OOC'), +(301776, 14390, 0, 1, 0, 100, 1, 10000, 20000, 10000, 20000, 301776, 0, 0, 'Expeditionary Mountaineer - Active Random Movement'); + +-- 1678803: Source's Guid Is 301774 +INSERT INTO `conditions` (`condition_entry`, `type`, `value1`, `value2`, `value3`, `value4`, `flags`) VALUES (1678803, 52, 301774, 0, 0, 0, 0); +-- 1678804: Source's Guid Is 54000 Or 301770 +INSERT INTO `conditions` (`condition_entry`, `type`, `value1`, `value2`, `value3`, `value4`, `flags`) VALUES (1678804, 52, 54000, 0, 301770, 0, 0); +-- 1678805: Source's Guid Is 54001 +INSERT INTO `conditions` (`condition_entry`, `type`, `value1`, `value2`, `value3`, `value4`, `flags`) VALUES (1678805, 52, 54001, 0, 0, 0, 0); + +-- Stand_State for Expeditionary Mountaineer +INSERT INTO `creature_addon` (`guid`, `patch`, `display_id`, `mount_display_id`, `equipment_id`, `stand_state`, `sheath_state`, `emote_state`, `auras`) VALUES +(285080, 0, 0, 0, -1, 3, 1, 0, NULL); + +-- Rogue Black Drake createobject2 +UPDATE `creature` SET `position_x`=-8136.846, `position_y`=-578.9975, `position_z`=200.53505, `orientation`=2.117406606674194335, `spawntimesecsmin`=300, `spawntimesecsmax`=450, `wander_distance`=0,`movement_type`=2 WHERE `guid`=53999; + +-- Pathing for Rogue Black Drake Entry: 14388 +SET @NPC := 53999; +DELETE FROM `creature_movement` WHERE `id`=@NPC; +INSERT INTO `creature_movement` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`waittime`,`wander_distance`,`script_id`) VALUES +(@NPC,1,-8151.6396,-534.9944,200.672,100,0,0,0), +(@NPC,2,-8177.0103,-497.2137,200.20819,100,0,0,0), +(@NPC,3,-8177.0103,-497.2137,200.20819,100,0,0,0), +(@NPC,4,-8205.462,-483.48578,193.67229,100,0,0,0), +(@NPC,5,-8205.462,-483.48578,193.67229,100,0,0,0), +(@NPC,6,-8221.06,-493.07852,195.86667,100,0,0,0), +(@NPC,7,-8221.06,-493.07852,195.86667,100,0,0,0), +(@NPC,8,-8204.073,-519.3674,200.09042,100,0,0,0), +(@NPC,9,-8204.073,-519.3674,200.09042,100,0,0,0), +(@NPC,10,-8178.019,-552.7796,199.89197,100,0,0,0), +(@NPC,11,-8184.3145,-578.3928,200.52078,100,0,0,0), +(@NPC,12,-8178.019,-552.7796,199.89197,100,0,0,0); +-- 0x204CB000000E0D0000009400004CEFFE .go xyz -8151.6396 -534.9944 200.672 + +-- Delete duplicate custom Rogue Black Drake +DELETE FROM `creature` WHERE `guid`=53998; +DELETE FROM `creature` WHERE `guid`=53997; +DELETE FROM `creature` WHERE `guid`=53996; + + +-- End of migration. +END IF; +END?? +DELIMITER ; +CALL add_migration(); +DROP PROCEDURE IF EXISTS add_migration; From 50b616fcc6ee121fe2048fa9a83355dfa89f949f Mon Sep 17 00:00:00 2001 From: ratkosrb Date: Wed, 26 Jun 2024 01:39:20 +0300 Subject: [PATCH 26/34] Define warden offsets for 1.10.2. --- sql/migrations/20240625223058_world.sql | 21 +++++++++++++++++++ .../Anticheat/WardenAnticheat/WardenWin.cpp | 11 ++++++++++ 2 files changed, 32 insertions(+) create mode 100644 sql/migrations/20240625223058_world.sql diff --git a/sql/migrations/20240625223058_world.sql b/sql/migrations/20240625223058_world.sql new file mode 100644 index 00000000000..850df9534fc --- /dev/null +++ b/sql/migrations/20240625223058_world.sql @@ -0,0 +1,21 @@ +DROP PROCEDURE IF EXISTS add_migration; +DELIMITER ?? +CREATE PROCEDURE `add_migration`() +BEGIN +DECLARE v INT DEFAULT 1; +SET v = (SELECT COUNT(*) FROM `migrations` WHERE `id`='20240625223058'); +IF v = 0 THEN +INSERT INTO `migrations` VALUES ('20240625223058'); +-- Add your query below. + + +--Stratholme door check fails before 1.11. +UPDATE `warden_scans` SET `build_min`=5464 WHERE `id`=74; + + +-- End of migration. +END IF; +END?? +DELIMITER ; +CALL add_migration(); +DROP PROCEDURE IF EXISTS add_migration; diff --git a/src/game/Anticheat/WardenAnticheat/WardenWin.cpp b/src/game/Anticheat/WardenAnticheat/WardenWin.cpp index 92ee4d7c6e0..2753f0a6597 100644 --- a/src/game/Anticheat/WardenAnticheat/WardenWin.cpp +++ b/src/game/Anticheat/WardenAnticheat/WardenWin.cpp @@ -84,6 +84,17 @@ static constexpr struct ClientOffsets // Click to move uint32 ClickToMovePosition; } Offsets[] = { + { + 5302, + 0x2F5CE0, + 0x22D230, 0x22E2F0, 0x22DF60, 0x2393F0, + 0x226A0, + 0xC213E4, + 0xC9470C, + 0xBB4E98, 0x38A0, 0x0, 0xA8, + 0xC8E64C, 0x228, 0x08, + 0xBF3A94 + }, { 5464, 0x2FAE20, From 50fa052ca2908983ffed90693e1cbff84fc36b0d Mon Sep 17 00:00:00 2001 From: ratkosrb <35845488+ratkosrb@users.noreply.github.com> Date: Wed, 26 Jun 2024 01:44:58 +0300 Subject: [PATCH 27/34] Add missing space before comment. --- sql/migrations/20240625223058_world.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/migrations/20240625223058_world.sql b/sql/migrations/20240625223058_world.sql index 850df9534fc..57c1755f942 100644 --- a/sql/migrations/20240625223058_world.sql +++ b/sql/migrations/20240625223058_world.sql @@ -9,7 +9,7 @@ INSERT INTO `migrations` VALUES ('20240625223058'); -- Add your query below. ---Stratholme door check fails before 1.11. +-- Stratholme door check fails before 1.11. UPDATE `warden_scans` SET `build_min`=5464 WHERE `id`=74; From 60a555f9b1d9dfbdd7cd75ecf475874d2957a539 Mon Sep 17 00:00:00 2001 From: ratkosrb Date: Mon, 1 Jul 2024 09:12:18 +0300 Subject: [PATCH 28/34] Implement trial restrictions for unverified accounts. --- sql/migrations/20240701043632_world.sql | 25 ++++ src/game/AccountMgr.cpp | 136 +++++++++++++--------- src/game/AccountMgr.h | 44 ++++--- src/game/Database/DBCEnums.h | 3 + src/game/Handlers/AuctionHouseHandler.cpp | 39 ++++++- src/game/Handlers/ChatHandler.cpp | 18 ++- src/game/Handlers/GuildHandler.cpp | 17 +++ src/game/Handlers/MailHandler.cpp | 40 +++++-- src/game/Handlers/PetitionsHandler.cpp | 24 ++++ src/game/Handlers/TradeHandler.cpp | 6 + src/game/Language.h | 3 + src/game/Objects/Player.cpp | 120 ++++++++++++------- src/game/Objects/Player.h | 8 +- src/game/Protocol/WorldSocket.cpp | 17 +-- src/game/SharedDefines.h | 3 + src/game/World.cpp | 7 +- src/game/World.h | 1 + src/game/WorldSession.cpp | 7 +- src/game/WorldSession.h | 21 +++- src/mangosd/mangosd.conf.dist.in | 14 +++ 20 files changed, 409 insertions(+), 144 deletions(-) create mode 100644 sql/migrations/20240701043632_world.sql diff --git a/sql/migrations/20240701043632_world.sql b/sql/migrations/20240701043632_world.sql new file mode 100644 index 00000000000..391e78d0abd --- /dev/null +++ b/sql/migrations/20240701043632_world.sql @@ -0,0 +1,25 @@ +SET NAMES utf8; +DROP PROCEDURE IF EXISTS add_migration; +DELIMITER ?? +CREATE PROCEDURE `add_migration`() +BEGIN +DECLARE v INT DEFAULT 1; +SET v = (SELECT COUNT(*) FROM `migrations` WHERE `id`='20240701043632'); +IF v = 0 THEN +INSERT INTO `migrations` VALUES ('20240701043632'); +-- Add your query below. + + +-- Add texts for trial account restrictions. +SET NAMES utf8; +INSERT INTO `mangos_string` (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES (182, 'You may only whisper to players who have you on their friend list.', '당신을 친구 목록에 추가한 플레이어에게만 귓속말을 할 수 있습니다.', 'Vous ne pouvez chuchoter qu\'aux joueurs qui vous ont sur leur liste d\'amis.', 'Sie dürfen nur mit Spielern flüstern, die Sie auf ihrer Freundesliste haben.', '您只能与将您添加到好友列表中的玩家私聊。', '您只能對好友清單中有您的玩家耳語。', 'Sólo puedes susurrarle a los jugadores que te tengan en su lista de amigos.', 'Sólo puedes susurrarle a los jugadores que te tengan en su lista de amigos.', 'Вы можете шептаться только с игроками, у которых вы есть в списке друзей.'); +INSERT INTO `mangos_string` (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES (183, 'You may only send messages in private chat channels.', '비공개 채팅 채널에서만 메시지를 보낼 수 있습니다.', 'Vous ne pouvez envoyer des messages que sur des canaux de discussion privés.', 'Sie können nur in privaten Chat-Kanälen Nachrichten senden.', '您只能在私人聊天频道中发送消息。', '您只能在私人聊天頻道中發送訊息。', 'Sólo puedes enviar mensajes en canales de chat privados.', 'Sólo puedes enviar mensajes en canales de chat privados.', 'Вы можете отправлять сообщения только в приватные каналы чата.'); +INSERT INTO `mangos_string` (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES (184, 'Trial accounts cannot perform that action.', '무료 체험 계정으로는 해당 기능을 사용할 수 없습니다.', 'Les comptes d\'essai ne peuvent pas accomplir cette action.', 'Diese Aktion ist mit Gästeaccounts nicht durchführbar.', '试玩帐号无法进行该动作', '試玩帳號無法進行此動作', 'Las cuentas de prueba no pueden realizar esta acción.', 'Las cuentas de prueba no pueden realizar esta acción.', 'Пользователи пробной версии не могут выполнить это действие.'); + + +-- End of migration. +END IF; +END?? +DELIMITER ; +CALL add_migration(); +DROP PROCEDURE IF EXISTS add_migration; diff --git a/src/game/AccountMgr.cpp b/src/game/AccountMgr.cpp index 041b1f20d89..bec757bc34c 100644 --- a/src/game/AccountMgr.cpp +++ b/src/game/AccountMgr.cpp @@ -151,6 +151,8 @@ AccountOpResult AccountMgr::ChangeUsername(uint32 accid, std::string new_uname, if (!update_sv) return AOR_DB_INTERNAL_ERROR; // unexpected error + GetAccountPersistentData(accid).m_username = new_uname; + return AOR_OK; } @@ -205,72 +207,47 @@ uint32 AccountMgr::GetId(std::string username) void AccountMgr::Load() { - m_accountSecurity.clear(); - - std::unique_ptr result(LoginDatabase.PQuery("SELECT `id`, `gmlevel` FROM `account_access` WHERE (`RealmID` = '%u' OR `RealmID`='-1')", realmID)); - - if (!result) - { - BarGoLink bar(1); - bar.step(); - - sLog.Out(LOG_BASIC, LOG_LVL_MINIMAL, ""); - sLog.Out(LOG_BASIC, LOG_LVL_MINIMAL, ">> Loaded 0 GM ranks"); - return; - } - - Field* fields = nullptr; - BarGoLink bar(result->GetRowCount()); - do - { - bar.step(); - fields = result->Fetch(); - uint32 accountId = fields[0].GetUInt32(); - AccountTypes secu = AccountTypes(fields[1].GetUInt32()); - switch (secu) - { - case SEC_PLAYER: - break; - case SEC_MODERATOR: - case SEC_TICKETMASTER: - case SEC_GAMEMASTER: - case SEC_BASIC_ADMIN: - case SEC_DEVELOPER: - case SEC_ADMINISTRATOR: - // Peut etre deja dans la liste ? On prend le plus haut gmlevel. - if (m_accountSecurity.find(accountId) == m_accountSecurity.end() || - m_accountSecurity[accountId] < secu) - m_accountSecurity[accountId] = secu; - break; - } - } while (result->NextRow()); - - sLog.Out(LOG_BASIC, LOG_LVL_MINIMAL, ""); - sLog.Out(LOG_BASIC, LOG_LVL_MINIMAL, ">> %u GM ranks loaded for realm %u", m_accountSecurity.size(), realmID); - sLog.Out(LOG_BASIC, LOG_LVL_MINIMAL, ""); + LoadAccountData(); LoadAccountBanList(); LoadIPBanList(std::move(LoginDatabase.Query(LOAD_IP_BANS_QUERY))); LoadAccountWarnings(); } -AccountTypes AccountMgr::GetSecurity(uint32 acc_id) +AccountTypes AccountMgr::GetSecurity(uint32 accountId) { - std::map::const_iterator it = m_accountSecurity.find(acc_id); - if (it == m_accountSecurity.end()) - return SEC_PLAYER; - return it->second; + return GetAccountPersistentData(accountId).m_security; } -void AccountMgr::SetSecurity(uint32 accId, AccountTypes sec) +void AccountMgr::SetSecurity(uint32 accountId, AccountTypes security) { - m_accountSecurity[accId] = sec; - LoginDatabase.PExecute("DELETE FROM `account_access` WHERE `RealmID`=%u AND `id`=%u", realmID, accId); - LoginDatabase.PExecute("INSERT INTO `account_access` SET `RealmID`=%u, `id`=%u, `gmlevel`=%u", realmID, accId, sec); + GetAccountPersistentData(accountId).m_security = security; + LoginDatabase.PExecute("REPLACE INTO `account_access` (`id`, `gmlevel`, `RealmID`) VALUES (%u, %u, %u)", accountId, security, realmID); } -bool AccountMgr::GetName(uint32 acc_id, std::string &name) +bool AccountMgr::HasTrialRestrictions(uint32 accountId) { - std::unique_ptr result = LoginDatabase.PQuery("SELECT `username` FROM `account` WHERE `id` = '%u'", acc_id); + if (sWorld.getConfig(CONFIG_BOOL_RESTRICT_UNVERIFIED_ACCOUNTS)) + { + AccountPersistentData const& data = GetAccountPersistentData(accountId); + return !data.m_verifiedEmail && data.m_security <= SEC_PLAYER; + } + + return false; +} + +bool AccountMgr::GetName(uint32 accountId, std::string &name) +{ + { + std::shared_lock guard(m_accountPersistentDataMutex); + auto itr = m_accountPersistentData.find(accountId); + if (itr != m_accountPersistentData.end() && !itr->second.m_email.empty()) + { + name = itr->second.m_email; + return true; + } + } + + std::unique_ptr result = LoginDatabase.PQuery("SELECT `username` FROM `account` WHERE `id` = '%u'", accountId); if (result) { name = (*result)[0].GetCppString(); @@ -567,3 +544,54 @@ bool AccountPersistentData::CanMail(uint32 targetAccount) uint32 allowedScore = sWorld.getConfig(CONFIG_UINT32_MAILSPAM_MAX_MAILS); return totalScore < allowedScore; } + +AccountPersistentData& AccountMgr::GetAccountPersistentData(uint32 accountId) +{ + { + std::shared_lock guard(m_accountPersistentDataMutex); + auto itr = m_accountPersistentData.find(accountId); + if (itr != m_accountPersistentData.end()) + return itr->second; + } + + { + std::lock_guard guard(m_accountPersistentDataMutex); + return m_accountPersistentData[accountId]; + } +} + +void AccountMgr::LoadAccountData() +{ + std::unique_ptr result(LoginDatabase.PQuery("SELECT a.`id`, a.`username`, a.`email`, a.`email_verif`, aa.`gmlevel` FROM `account` a LEFT JOIN `account_access` aa ON a.`id` = aa.`id` AND aa.`RealmID` IN (-1, %u)", realmID)); + + if (!result) + return; + + do + { + Field* fields = result->Fetch(); + uint32 id = fields[0].GetUInt32(); + AccountPersistentData& data = m_accountPersistentData[id]; + data.m_username = fields[1].GetCppString(); + data.m_email = fields[2].GetCppString(); + data.m_verifiedEmail = fields[3].GetBool() || data.m_email.empty(); // treat no email as verified (created from console) + + // gmlevel can be null + if (fields[4].GetString()) + { + AccountTypes security = AccountTypes(fields[4].GetUInt32()); + if (data.m_security < security) + data.m_security = security; + } + + } while (result->NextRow()); +} + +void AccountMgr::UpdateAccountData(uint32 accountId, std::string const& username, std::string const& email, bool verifiedEmail, AccountTypes security) +{ + AccountPersistentData& data = m_accountPersistentData[accountId]; + data.m_username = username; + data.m_email = email; + data.m_verifiedEmail = verifiedEmail; + data.m_security = security; +} diff --git a/src/game/AccountMgr.h b/src/game/AccountMgr.h index 13cc09955e5..eaacd992b37 100644 --- a/src/game/AccountMgr.h +++ b/src/game/AccountMgr.h @@ -37,6 +37,7 @@ enum AccountOpResult AOR_DB_INTERNAL_ERROR }; +class AccountMgr; class WorldSession; class ChatHandler; class MasterPlayer; @@ -48,8 +49,10 @@ class QueryResult; class AccountPersistentData { -// WHISP FLOOD + friend class AccountMgr; public: + + // WHISP FLOOD struct WhisperData { WhisperData() : first_whisp(time(nullptr)), score(0), whispers_count(0) {} @@ -63,15 +66,20 @@ class AccountPersistentData uint32 GetWhisperScore(MasterPlayer* from, MasterPlayer* player) const; uint32 CountDifferentWhispTargets() const { return m_whisperTargets.size(); } - typedef std::map WhispersMap; - WhispersMap m_whisperTargets; - -// MAIL FLOOD -public: + // MAIL FLOOD void JustMailed(uint32 toAccount); bool CanMail(uint32 targetAccount); + protected: - typedef std::map MailsSentMap; + std::string m_username; + std::string m_email; + bool m_verifiedEmail = true; + AccountTypes m_security = SEC_PLAYER; + + typedef std::map WhispersMap; + WhispersMap m_whisperTargets; + + typedef std::map MailsSentMap; MailsSentMap m_mailsSent; }; @@ -86,19 +94,22 @@ class AccountMgr AccountOpResult ChangeUsername(uint32 accid, std::string new_uname, std::string new_passwd); AccountOpResult ChangePassword(uint32 accid, std::string new_passwd, std::string username=""); bool CheckPassword(uint32 accid, std::string passwd, std::string username=""); - - uint32 GetId(std::string username); + std::string CalculateShaPassHash(std::string& name, std::string& password); void Load(); - AccountTypes GetSecurity(uint32 acc_id); - void SetSecurity(uint32 accId, AccountTypes sec); + void LoadAccountData(); + AccountPersistentData& GetAccountPersistentData(uint32 accountId); + void UpdateAccountData(uint32 accountId, std::string const& username, std::string const& email, bool verifiedEmail, AccountTypes security); - bool GetName(uint32 acc_id, std::string &name); + uint32 GetId(std::string username); + AccountTypes GetSecurity(uint32 accountId); + void SetSecurity(uint32 accountId, AccountTypes security); + bool GetName(uint32 accountId, std::string &name); uint32 GetCharactersCount(uint32 acc_id); - std::string CalculateShaPassHash(std::string& name, std::string& password); + bool HasTrialRestrictions(uint32 accountId); static bool normalizeString(std::string& utf8str); - // Nostalrius + void Update(uint32 diff); void LoadIPBanList(std::unique_ptr result, bool silent=false); void LoadAccountBanList(bool silent=false); @@ -122,11 +133,8 @@ class AccountMgr // Max instance reset per account per hour bool CheckInstanceCount(uint32 accountId, uint32 instanceId, uint32 maxCount); void AddInstanceEnterTime(uint32 accountId, uint32 instanceId, time_t enterTime); - - AccountPersistentData& GetAccountPersistentData(uint32 accountId) { return m_accountPersistentData[accountId]; } protected: std::map m_accountWarnings; - std::map m_accountSecurity; uint32 m_banlistUpdateTimer; std::map m_ipBanned; mutable std::shared_timed_mutex m_ipBannedMutex; @@ -135,7 +143,9 @@ class AccountMgr typedef std::map AccountInstanceEnterTimesMap; AccountInstanceEnterTimesMap m_instanceEnterTimes; std::map m_accountPersistentData; + std::shared_timed_mutex m_accountPersistentDataMutex; }; #define sAccountMgr MaNGOS::Singleton::Instance() + #endif diff --git a/src/game/Database/DBCEnums.h b/src/game/Database/DBCEnums.h index 22e5555766c..5298267f1b8 100644 --- a/src/game/Database/DBCEnums.h +++ b/src/game/Database/DBCEnums.h @@ -37,6 +37,9 @@ // also see MAX_LEVEL and GT_MAX_LEVEL define #define PLAYER_STRONG_MAX_LEVEL 255 +// Max level for trial accounts. +#define TRIAL_MAX_LEVEL 20 + // Max creature level in vanilla (included some bosses and elite) (no cls data above this level) #define CREATURE_MAX_LEVEL 63 diff --git a/src/game/Handlers/AuctionHouseHandler.cpp b/src/game/Handlers/AuctionHouseHandler.cpp index b36a0be3671..dd529d6ae77 100644 --- a/src/game/Handlers/AuctionHouseHandler.cpp +++ b/src/game/Handlers/AuctionHouseHandler.cpp @@ -257,23 +257,37 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recv_data) // Client limit if (bid > 2000000000 || buyout > 2000000000) { + SendAuctionCommandResult(nullptr, AUCTION_STARTED, AUCTION_ERR_NOT_ENOUGH_MONEY); ProcessAnticheatAction("GoldDupe", "Putting too high auction price", CHEAT_ACTION_LOG); return; } if (buyout && bid > buyout) { + SendAuctionCommandResult(nullptr, AUCTION_STARTED, AUCTION_ERR_HIGHER_BID); ProcessAnticheatAction("GoldDupe", "bid > buyout", CHEAT_ACTION_LOG); return; } if (!sWorld.getConfig(CONFIG_BOOL_GM_ALLOW_TRADES) && GetSecurity() > SEC_PLAYER) + { + SendAuctionCommandResult(nullptr, AUCTION_STARTED, AUCTION_ERR_RESTRICTED_ACCOUNT); + return; + } + + if (HasTrialRestrictions()) + { + SendAuctionCommandResult(nullptr, AUCTION_STARTED, AUCTION_ERR_RESTRICTED_ACCOUNT); return; + } Player* pl = GetPlayer(); AuctionHouseEntry const* auctionHouseEntry = GetCheckedAuctionHouseForAuctioneer(auctioneerGuid); if (!auctionHouseEntry) + { + SendAuctionCommandResult(nullptr, AUCTION_STARTED, AUCTION_ERR_DATABASE); return; + } // always return pointer AuctionHouseObject* auctionHouse = sAuctionMgr.GetAuctionsMap(auctionHouseEntry); @@ -299,6 +313,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recv_data) case 12*MIN_AUCTION_TIME: break; default: + SendAuctionCommandResult(nullptr, AUCTION_STARTED, AUCTION_ERR_DATABASE); return; } @@ -307,7 +322,10 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recv_data) GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH); if (!itemGuid) + { + SendAuctionCommandResult(nullptr, AUCTION_STARTED, AUCTION_ERR_ITEM_NOT_FOUND); return; + } Item *it = pl->GetItemByGuid(itemGuid); @@ -422,14 +440,29 @@ void WorldSession::HandleAuctionPlaceBid(WorldPacket& recv_data) recv_data >> auctionId >> price; if (!sWorld.getConfig(CONFIG_BOOL_GM_ALLOW_TRADES) && GetSecurity() > SEC_PLAYER) + { + SendAuctionCommandResult(nullptr, AUCTION_BID_PLACED, AUCTION_ERR_RESTRICTED_ACCOUNT); return; + } + + if (HasTrialRestrictions()) + { + SendAuctionCommandResult(nullptr, AUCTION_BID_PLACED, AUCTION_ERR_RESTRICTED_ACCOUNT); + return; + } if (!auctionId || !price) - return; // check for cheaters + { + SendAuctionCommandResult(nullptr, AUCTION_BID_PLACED, AUCTION_ERR_ITEM_NOT_FOUND); + return; + } AuctionHouseEntry const* auctionHouseEntry = GetCheckedAuctionHouseForAuctioneer(auctioneerGuid); if (!auctionHouseEntry) + { + SendAuctionCommandResult(nullptr, AUCTION_BID_PLACED, AUCTION_ERR_ITEM_NOT_FOUND); return; + } // always return pointer AuctionHouseObject* auctionHouse = sAuctionMgr.GetAuctionsMap(auctionHouseEntry); @@ -445,7 +478,6 @@ void WorldSession::HandleAuctionPlaceBid(WorldPacket& recv_data) { // item not found; auction may have expired, or been bought out SendAuctionCommandResult(nullptr, AUCTION_BID_PLACED, AUCTION_ERR_ITEM_NOT_FOUND); - return; } @@ -469,7 +501,10 @@ void WorldSession::HandleAuctionPlaceBid(WorldPacket& recv_data) // cheating if (price < auction->startbid) + { + SendAuctionCommandResult(nullptr, AUCTION_BID_PLACED, AUCTION_ERR_BID_INCREMENT); return; + } // cheating or client lags if (price <= auction->bid) diff --git a/src/game/Handlers/ChatHandler.cpp b/src/game/Handlers/ChatHandler.cpp index a5bbd3f20df..75004bacde8 100644 --- a/src/game/Handlers/ChatHandler.cpp +++ b/src/game/Handlers/ChatHandler.cpp @@ -334,10 +334,16 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recv_data) // Public channels restrictions if (!chn->HasFlag(Channel::CHANNEL_FLAG_CUSTOM)) { + if (HasTrialRestrictions()) + { + SendNotification(LANG_CANT_USE_PUBLIC_CHANNELS); + return; + } + // GMs should not be able to use public channels if (GetSecurity() > SEC_PLAYER && !sWorld.getConfig(CONFIG_BOOL_GMS_ALLOW_PUBLIC_CHANNELS)) { - ChatHandler(this).SendSysMessage("GMs can't use public channels."); + SendNotification(LANG_CANT_USE_PUBLIC_CHANNELS); return; } @@ -502,8 +508,14 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recv_data) { bool allowIgnoreAntispam = toPlayer->IsAllowedWhisperFrom(masterPlr->GetObjectGuid()); bool allowSendWhisper = allowIgnoreAntispam; - if (!sWorld.getConfig(CONFIG_BOOL_WHISPER_RESTRICTION) || !toPlayer->IsEnabledWhisperRestriction()) - allowSendWhisper = true; + + if (!allowSendWhisper) + { + if (pSecurity == SEC_PLAYER && HasTrialRestrictions()) + SendNotification(LANG_CAN_ONLY_WHISPER_FRIENDS); + else if (!sWorld.getConfig(CONFIG_BOOL_WHISPER_RESTRICTION) || !toPlayer->IsEnabledWhisperRestriction()) + allowSendWhisper = true; + } if (masterPlr->IsGameMaster() || allowSendWhisper) masterPlr->Whisper(msg, lang, player); diff --git a/src/game/Handlers/GuildHandler.cpp b/src/game/Handlers/GuildHandler.cpp index 4b6290ccbb8..1354adfa01a 100644 --- a/src/game/Handlers/GuildHandler.cpp +++ b/src/game/Handlers/GuildHandler.cpp @@ -30,6 +30,7 @@ #include "GuildMgr.h" #include "GossipDef.h" #include "SocialMgr.h" +#include "Language.h" void WorldSession::HandleGuildQueryOpcode(WorldPacket& recvPacket) { @@ -53,6 +54,12 @@ void WorldSession::HandleGuildCreateOpcode(WorldPacket& recvPacket) if (GetPlayer()->GetGuildId()) // already in guild return; + if (HasTrialRestrictions()) + { + SendNotification(LANG_RESTRICTED_ACCOUNT); + return; + } + Guild *guild = new Guild; if (!guild->Create(GetPlayer(), gname)) { @@ -86,9 +93,19 @@ void WorldSession::HandleGuildInviteOpcode(WorldPacket& recvPacket) return; } + if (player->GetSession()->HasTrialRestrictions()) + { + SendNotification(LANG_RESTRICTED_ACCOUNT); + return; + } + // OK result but not send invite if (player->GetSocial()->HasIgnore(GetPlayer()->GetObjectGuid())) + { + plname = player->GetName(); + SendGuildCommandResult(GUILD_INVITE_S, plname, ERR_GUILD_IGNORING_YOU_S); return; + } // not let enemies sign guild charter if (!sWorld.getConfig(CONFIG_BOOL_ALLOW_TWO_SIDE_INTERACTION_GUILD) && player->GetTeam() != GetPlayer()->GetTeam()) diff --git a/src/game/Handlers/MailHandler.cpp b/src/game/Handlers/MailHandler.cpp index b16e74b7842..ebe7be08d79 100644 --- a/src/game/Handlers/MailHandler.cpp +++ b/src/game/Handlers/MailHandler.cpp @@ -136,22 +136,27 @@ void WorldSession::HandleSendMail(WorldPacket& recv_data) recv_data >> mailboxGuid; if (!CheckMailBox(mailboxGuid)) + { + SendMailResult(0, MAIL_SEND, MAIL_ERR_INTERNAL_ERROR); return; + } + + if (HasTrialRestrictions()) + { + SendMailResult(0, MAIL_SEND, MAIL_ERR_DISABLED_FOR_TRIAL_ACC); + return; + } WorldSession::AsyncMailSendRequest* req = new WorldSession::AsyncMailSendRequest(); req->accountId = GetAccountId(); req->senderGuid = GetMasterPlayer()->GetObjectGuid(); - recv_data >> req->receiverName; + recv_data >> req->receiverName; recv_data >> req->subject; - recv_data >> req->body; - recv_data >> unk1; // stationery? recv_data >> unk2; // 0x00000000 - recv_data >> req->itemGuid; - recv_data >> req->money >> req->COD; // money and cod #if SUPPORTED_CLIENT_BUILD > CLIENT_BUILD_1_9_4 @@ -230,6 +235,14 @@ void WorldSession::HandleSendMail(WorldPacket& recv_data) if (req->receiverPtr) { + // check trial account restrictions for online receiver + if (GetSecurity() <= SEC_PLAYER && req->receiverPtr->GetSession()->HasTrialRestrictions()) + { + SendMailResult(0, MAIL_SEND, MAIL_ERR_DISABLED_FOR_TRIAL_ACC); + delete req; + return; + } + MasterPlayer* receiverMasterPlayer = req->receiverPtr->GetSession()->GetMasterPlayer(); ASSERT(receiverMasterPlayer); req->rcTeam = receiverMasterPlayer->GetTeam(); @@ -280,7 +293,7 @@ void WorldSession::HandleSendMailCallback(WorldSession::AsyncMailSendRequest* re return; } - uint32 rc_account = sObjectMgr.GetPlayerAccountIdByGUID(req->receiver); + uint32 receiverAccount = sObjectMgr.GetPlayerAccountIdByGUID(req->receiver); Item* item = nullptr; @@ -315,6 +328,13 @@ void WorldSession::HandleSendMailCallback(WorldSession::AsyncMailSendRequest* re } } + // check trial account restrictions for offline receiver + if (!req->receiverPtr && GetSecurity() <= SEC_PLAYER && sAccountMgr.HasTrialRestrictions(receiverAccount)) + { + SendMailResult(0, MAIL_SEND, MAIL_ERR_DISABLED_FOR_TRIAL_ACC); + return; + } + // Antispam checks if (loadedPlayer->GetLevel() < sWorld.getConfig(CONFIG_UINT32_MAILSPAM_LEVEL) && req->money < sWorld.getConfig(CONFIG_UINT32_MAILSPAM_MONEY) && @@ -325,7 +345,7 @@ void WorldSession::HandleSendMailCallback(WorldSession::AsyncMailSendRequest* re } AccountPersistentData& data = sAccountMgr.GetAccountPersistentData(GetAccountId()); - if (!data.CanMail(rc_account)) + if (!data.CanMail(receiverAccount)) { std::stringstream details; std::string from = ChatHandler(this).playerLink(GetMasterPlayer()->GetName()); @@ -343,7 +363,7 @@ void WorldSession::HandleSendMailCallback(WorldSession::AsyncMailSendRequest* re SendMailResult(0, MAIL_SEND, MAIL_OK); return; } - data.JustMailed(rc_account); + data.JustMailed(receiverAccount); SendMailResult(0, MAIL_SEND, MAIL_OK); @@ -376,7 +396,7 @@ void WorldSession::HandleSendMailCallback(WorldSession::AsyncMailSendRequest* re sLog.Player(GetAccountId(), LOG_GM, LOG_LVL_BASIC, "GM %s (Account: %u) mail item: %s (Entry: %u Count: %u) to player: %s (Account: %u)", GetPlayerName(), GetAccountId(), item->GetProto()->Name1, item->GetEntry(), item->GetCount(), - req->receiver.GetString().c_str(), rc_account); + req->receiver.GetString().c_str(), receiverAccount); } loadedPlayer->MoveItemFromInventory(item->GetBagSlot(), item->GetSlot(), true); @@ -394,7 +414,7 @@ void WorldSession::HandleSendMailCallback(WorldSession::AsyncMailSendRequest* re { sLog.Player(GetAccountId(), LOG_GM, LOG_LVL_BASIC, "GM %s (Account: %u) mail money: %u to player: %s (Account: %u)", - GetPlayerName(), GetAccountId(), req->money, req->receiver.GetString().c_str(), rc_account); + GetPlayerName(), GetAccountId(), req->money, req->receiver.GetString().c_str(), receiverAccount); } } diff --git a/src/game/Handlers/PetitionsHandler.cpp b/src/game/Handlers/PetitionsHandler.cpp index 2013b154f88..4c18c25c5d4 100644 --- a/src/game/Handlers/PetitionsHandler.cpp +++ b/src/game/Handlers/PetitionsHandler.cpp @@ -75,6 +75,12 @@ void WorldSession::HandlePetitionBuyOpcode(WorldPacket& recv_data) if (!pCreature->IsTabardDesigner()) return; + if (HasTrialRestrictions()) + { + SendNotification(LANG_RESTRICTED_ACCOUNT); + return; + } + // remove fake death if (GetPlayer()->HasUnitState(UNIT_STAT_FEIGN_DEATH)) GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH); @@ -289,6 +295,12 @@ void WorldSession::HandlePetitionSignOpcode(WorldPacket& recv_data) return; } + if (HasTrialRestrictions()) + { + SendNotification(LANG_RESTRICTED_ACCOUNT); + return; + } + // not let enemies sign guild charter if (!sWorld.getConfig(CONFIG_BOOL_ALLOW_TWO_SIDE_INTERACTION_GUILD) && GetPlayer()->GetTeam() != petition->GetTeam()) @@ -407,6 +419,12 @@ void WorldSession::HandleOfferPetitionOpcode(WorldPacket& recv_data) return; } + if (player->GetSession()->HasTrialRestrictions()) + { + SendNotification(LANG_RESTRICTED_ACCOUNT); + return; + } + Item *charter = _player->GetItemByGuid(itemGuid); if (!charter) return; @@ -457,6 +475,12 @@ void WorldSession::HandleTurnInPetitionOpcode(WorldPacket& recv_data) return; } + if (HasTrialRestrictions()) + { + SendNotification(LANG_RESTRICTED_ACCOUNT); + return; + } + // Collect petition info data if (_player->GetGuildId()) { diff --git a/src/game/Handlers/TradeHandler.cpp b/src/game/Handlers/TradeHandler.cpp index 56f71baecde..1306d98a32f 100644 --- a/src/game/Handlers/TradeHandler.cpp +++ b/src/game/Handlers/TradeHandler.cpp @@ -664,6 +664,12 @@ void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket) return; } + if (HasTrialRestrictions() || pOther->GetSession()->HasTrialRestrictions()) + { + SendTradeStatus(TRADE_STATUS_TRIAL_ACCOUNT); + return; + } + // OK start trade _player->m_trade = new TradeData(_player, pOther); pOther->m_trade = new TradeData(pOther, _player); diff --git a/src/game/Language.h b/src/game/Language.h index 8b9bc7b5c2b..5f597b15b76 100644 --- a/src/game/Language.h +++ b/src/game/Language.h @@ -190,6 +190,9 @@ enum MangosStrings LANG_XP_RATE_SET = 179, LANG_ALLIANCE_BATTLEBOT_ADDED = 180, LANG_HORDE_BATTLEBOT_ADDED = 181, + LANG_CAN_ONLY_WHISPER_FRIENDS = 182, + LANG_CANT_USE_PUBLIC_CHANNELS = 183, + LANG_RESTRICTED_ACCOUNT = 184, // Room for more level 1 182-199 not used // level 2 chat diff --git a/src/game/Objects/Player.cpp b/src/game/Objects/Player.cpp index 63b6bf0bbd1..700334d0131 100644 --- a/src/game/Objects/Player.cpp +++ b/src/game/Objects/Player.cpp @@ -3360,6 +3360,9 @@ void Player::SetCheatDebugTargetInfo(bool on, bool notify) bool Player::IsAllowedWhisperFrom(ObjectGuid guid) const { + if (GetObjectGuid() == guid) + return true; + if (PlayerSocial const* social = GetSocial()) if (social->HasFriend(guid)) return true; @@ -3481,6 +3484,9 @@ void Player::GiveXP(uint32 xp, Unit const* victim) if (level >= sWorld.getConfig(CONFIG_UINT32_MAX_PLAYER_LEVEL)) return; + if (level >= TRIAL_MAX_LEVEL && GetSession()->HasTrialRestrictions()) + return; + // XP resting bonus for kill uint32 rested_bonus_xp = victim ? GetXPRestBonus(xp) : 0; @@ -5758,12 +5764,12 @@ void Player::SetRegularAttackTime(bool resetTimer) } //skill+step, checking for max value -bool Player::UpdateSkill(uint32 skill_id, uint32 step) +bool Player::UpdateSkill(uint32 skillId, uint32 step) { - if (!skill_id) + if (!skillId) return false; - SkillStatusMap::iterator itr = mSkillStatus.find(skill_id); + SkillStatusMap::iterator itr = mSkillStatus.find(skillId); if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED) return false; @@ -5787,13 +5793,13 @@ bool Player::UpdateSkill(uint32 skill_id, uint32 step) return true; } -inline int SkillGainChance(uint32 SkillValue, uint32 GrayLevel, uint32 GreenLevel, uint32 YellowLevel) +inline int SkillGainChance(uint32 skillValue, uint32 grayLevel, uint32 greenLevel, uint32 yellowLevel) { - if (SkillValue >= GrayLevel) + if (skillValue >= grayLevel) return sWorld.getConfig(CONFIG_UINT32_SKILL_CHANCE_GREY) * 10; - if (SkillValue >= GreenLevel) + if (skillValue >= greenLevel) return sWorld.getConfig(CONFIG_UINT32_SKILL_CHANCE_GREEN) * 10; - if (SkillValue >= YellowLevel) + if (skillValue >= yellowLevel) return sWorld.getConfig(CONFIG_UINT32_SKILL_CHANCE_YELLOW) * 10; return sWorld.getConfig(CONFIG_UINT32_SKILL_CHANCE_ORANGE) * 10; } @@ -5808,42 +5814,61 @@ bool Player::UpdateCraftSkill(uint32 spellid) { if (_spell_idx->second->skillId) { - uint32 SkillValue = GetSkillValuePure(_spell_idx->second->skillId); + uint32 skillValue = GetSkillValuePure(_spell_idx->second->skillId); + uint32 craftSkillGain = sWorld.getConfig(CONFIG_UINT32_SKILL_GAIN_CRAFTING); - uint32 craft_skill_gain = sWorld.getConfig(CONFIG_UINT32_SKILL_GAIN_CRAFTING); + if (GetSession()->HasTrialRestrictions()) + { + if (SkillLineEntry const* skillInfo = sSkillLineStore.LookupEntry(_spell_idx->second->skillId)) + { + if (skillInfo->categoryId == SKILL_CATEGORY_PROFESSION && skillValue >= MAX_TRIAL_MAIN_PROFESSION_SKILL || + skillInfo->categoryId == SKILL_CATEGORY_SECONDARY && skillValue >= MAX_TRIAL_SECONDARY_PROFESSION_SKILL) + return false; + } + } - return UpdateSkillPro(_spell_idx->second->skillId, SkillGainChance(SkillValue, + return UpdateSkillPro(_spell_idx->second->skillId, SkillGainChance(skillValue, _spell_idx->second->max_value, (_spell_idx->second->max_value + _spell_idx->second->min_value) / 2, _spell_idx->second->min_value), - craft_skill_gain); + craftSkillGain); } } return false; } -bool Player::UpdateGatherSkill(uint32 SkillId, uint32 SkillValue, uint32 RedLevel, uint32 Multiplicator) +bool Player::UpdateGatherSkill(uint32 skillId, uint32 skillValue, uint32 redLevel, uint32 multiplicator) { - sLog.Out(LOG_BASIC, LOG_LVL_DEBUG, "UpdateGatherSkill(SkillId %d SkillLevel %d RedLevel %d)", SkillId, SkillValue, RedLevel); + sLog.Out(LOG_BASIC, LOG_LVL_DEBUG, "UpdateGatherSkill(SkillId %d SkillLevel %d RedLevel %d)", skillId, skillValue, redLevel); - uint32 gathering_skill_gain = sWorld.getConfig(CONFIG_UINT32_SKILL_GAIN_GATHERING); + if (GetSession()->HasTrialRestrictions()) + { + if (SkillLineEntry const* skillInfo = sSkillLineStore.LookupEntry(skillId)) + { + if (skillInfo->categoryId == SKILL_CATEGORY_PROFESSION && skillValue >= MAX_TRIAL_MAIN_PROFESSION_SKILL || + skillInfo->categoryId == SKILL_CATEGORY_SECONDARY && skillValue >= MAX_TRIAL_SECONDARY_PROFESSION_SKILL) + return false; + } + } + + uint32 gatheringSkillGain = sWorld.getConfig(CONFIG_UINT32_SKILL_GAIN_GATHERING); // For skinning and Mining chance decrease with level. 1-74 - no decrease, 75-149 - 2 times, 225-299 - 8 times - switch (SkillId) + switch (skillId) { case SKILL_HERBALISM: case SKILL_LOCKPICKING: - return UpdateSkillPro(SkillId, SkillGainChance(SkillValue, RedLevel + 100, RedLevel + 50, RedLevel + 25) * Multiplicator, gathering_skill_gain); + return UpdateSkillPro(skillId, SkillGainChance(skillValue, redLevel + 100, redLevel + 50, redLevel + 25) * multiplicator, gatheringSkillGain); case SKILL_SKINNING: if (sWorld.getConfig(CONFIG_UINT32_SKILL_CHANCE_SKINNING_STEPS) == 0) - return UpdateSkillPro(SkillId, SkillGainChance(SkillValue, RedLevel + 100, RedLevel + 50, RedLevel + 25) * Multiplicator, gathering_skill_gain); + return UpdateSkillPro(skillId, SkillGainChance(skillValue, redLevel + 100, redLevel + 50, redLevel + 25) * multiplicator, gatheringSkillGain); else - return UpdateSkillPro(SkillId, (SkillGainChance(SkillValue, RedLevel + 100, RedLevel + 50, RedLevel + 25) * Multiplicator) >> (SkillValue / sWorld.getConfig(CONFIG_UINT32_SKILL_CHANCE_SKINNING_STEPS)), gathering_skill_gain); + return UpdateSkillPro(skillId, (SkillGainChance(skillValue, redLevel + 100, redLevel + 50, redLevel + 25) * multiplicator) >> (skillValue / sWorld.getConfig(CONFIG_UINT32_SKILL_CHANCE_SKINNING_STEPS)), gatheringSkillGain); case SKILL_MINING: if (sWorld.getConfig(CONFIG_UINT32_SKILL_CHANCE_MINING_STEPS) == 0) - return UpdateSkillPro(SkillId, SkillGainChance(SkillValue, RedLevel + 100, RedLevel + 50, RedLevel + 25) * Multiplicator, gathering_skill_gain); + return UpdateSkillPro(skillId, SkillGainChance(skillValue, redLevel + 100, redLevel + 50, redLevel + 25) * multiplicator, gatheringSkillGain); else - return UpdateSkillPro(SkillId, (SkillGainChance(SkillValue, RedLevel + 100, RedLevel + 50, RedLevel + 25) * Multiplicator) >> (SkillValue / sWorld.getConfig(CONFIG_UINT32_SKILL_CHANCE_MINING_STEPS)), gathering_skill_gain); + return UpdateSkillPro(skillId, (SkillGainChance(skillValue, redLevel + 100, redLevel + 50, redLevel + 25) * multiplicator) >> (skillValue / sWorld.getConfig(CONFIG_UINT32_SKILL_CHANCE_MINING_STEPS)), gatheringSkillGain); } return false; } @@ -5852,56 +5877,57 @@ bool Player::UpdateFishingSkill() { sLog.Out(LOG_BASIC, LOG_LVL_DEBUG, "UpdateFishingSkill"); - uint32 SkillValue = GetSkillValuePure(SKILL_FISHING); + uint32 skillValue = GetSkillValuePure(SKILL_FISHING); - int32 chance = SkillValue < 75 ? 100 : 2500 / (SkillValue - 50); + if (GetSession()->HasTrialRestrictions() && skillValue >= MAX_TRIAL_SECONDARY_PROFESSION_SKILL) + return false; - uint32 gathering_skill_gain = sWorld.getConfig(CONFIG_UINT32_SKILL_GAIN_GATHERING); + int32 chance = skillValue < 75 ? 100 : 2500 / (skillValue - 50); + uint32 gatheringSkillGain = sWorld.getConfig(CONFIG_UINT32_SKILL_GAIN_GATHERING); - return UpdateSkillPro(SKILL_FISHING, chance * 10, gathering_skill_gain); + return UpdateSkillPro(SKILL_FISHING, chance * 10, gatheringSkillGain); } -bool Player::UpdateSkillPro(uint16 SkillId, int32 Chance, uint32 step) +bool Player::UpdateSkillPro(uint16 skillId, int32 chance, uint32 step) { - sLog.Out(LOG_BASIC, LOG_LVL_DEBUG, "UpdateSkillPro(SkillId %d, Chance %3.1f%%)", SkillId, Chance / 10.0); - if (!SkillId) + sLog.Out(LOG_BASIC, LOG_LVL_DEBUG, "UpdateSkillPro(SkillId %d, Chance %3.1f%%)", skillId, chance / 10.0); + if (!skillId) return false; - if (Chance <= 0) // speedup in 0 chance case + if (chance <= 0) // speedup in 0 chance case { - sLog.Out(LOG_BASIC, LOG_LVL_DEBUG, "Player::UpdateSkillPro Chance=%3.1f%% missed", Chance / 10.0); + sLog.Out(LOG_BASIC, LOG_LVL_DEBUG, "Player::UpdateSkillPro Chance=%3.1f%% missed", chance / 10.0); return false; } - SkillStatusMap::iterator itr = mSkillStatus.find(SkillId); + SkillStatusMap::iterator itr = mSkillStatus.find(skillId); if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED) return false; uint32 valueIndex = PLAYER_SKILL_VALUE_INDEX(itr->second.pos); - uint32 data = GetUInt32Value(valueIndex); - uint16 SkillValue = SKILL_VALUE(data); - uint16 MaxValue = SKILL_MAX(data); + uint16 skillValue = SKILL_VALUE(data); + uint16 maxValue = SKILL_MAX(data); - if (!MaxValue || !SkillValue || SkillValue >= MaxValue) + if (!maxValue || !skillValue || skillValue >= maxValue) return false; int32 Roll = irand(1, 1000); - if (Roll <= Chance) + if (Roll <= chance) { - uint32 new_value = SkillValue + step; - if (new_value > MaxValue) - new_value = MaxValue; + uint32 new_value = skillValue + step; + if (new_value > maxValue) + new_value = maxValue; - SetUInt32Value(valueIndex, MAKE_SKILL_VALUE(new_value, MaxValue)); + SetUInt32Value(valueIndex, MAKE_SKILL_VALUE(new_value, maxValue)); if (itr->second.uState != SKILL_NEW) itr->second.uState = SKILL_CHANGED; - sLog.Out(LOG_BASIC, LOG_LVL_DEBUG, "Player::UpdateSkillPro Chance=%3.1f%% taken", Chance / 10.0); + sLog.Out(LOG_BASIC, LOG_LVL_DEBUG, "Player::UpdateSkillPro Chance=%3.1f%% taken", chance / 10.0); return true; } - sLog.Out(LOG_BASIC, LOG_LVL_DEBUG, "Player::UpdateSkillPro Chance=%3.1f%% missed", Chance / 10.0); + sLog.Out(LOG_BASIC, LOG_LVL_DEBUG, "Player::UpdateSkillPro Chance=%3.1f%% missed", chance / 10.0); return true; } @@ -14671,6 +14697,14 @@ void Player::LogModifyMoney(int32 d, char const* type, ObjectGuid fromGuid, uint ModifyMoney(d); } +uint32 Player::GetMaxMoney() const +{ + if (GetSession()->HasTrialRestrictions()) + return MAX_TRIAL_MONEY_AMOUNT; + + return MAX_MONEY_AMOUNT; +} + void Player::MoneyChanged(uint32 count) { for (int i = 0; i < MAX_QUEST_LOG_SIZE; ++i) @@ -15101,8 +15135,8 @@ bool Player::LoadFromDB(ObjectGuid guid, SqlQueryHolder* holder) InitPlayerDisplayIds(); // model, scale and model data uint32 money = fields[8].GetUInt32(); - if (money > MAX_MONEY_AMOUNT) - money = MAX_MONEY_AMOUNT; + if (money > GetMaxMoney()) + money = GetMaxMoney(); SetMoney(money); SetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_SKIN_ID, fields[9].GetUInt8()); diff --git a/src/game/Objects/Player.h b/src/game/Objects/Player.h index ba64670716f..94644c097c0 100644 --- a/src/game/Objects/Player.h +++ b/src/game/Objects/Player.h @@ -738,8 +738,9 @@ enum ReputationSource }; // Player summoning auto-decline time (in secs) -#define MAX_PLAYER_SUMMON_DELAY (2*MINUTE) -#define MAX_MONEY_AMOUNT (0x7FFFFFFF-1) +#define MAX_PLAYER_SUMMON_DELAY (2*MINUTE) +#define MAX_MONEY_AMOUNT (0x7FFFFFFF-1) +#define MAX_TRIAL_MONEY_AMOUNT 100000 struct InstancePlayerBind { @@ -1221,12 +1222,13 @@ class Player final: public Unit uint32 GetMoney() const { return GetUInt32Value(PLAYER_FIELD_COINAGE); } void LogModifyMoney(int32 d, char const* type, ObjectGuid fromGuid = ObjectGuid(), uint32 data = 0); + uint32 GetMaxMoney() const; void ModifyMoney(int32 d) { if (d < 0) SetMoney(GetMoney() > uint32(-d) ? GetMoney() + d : 0); else - SetMoney(GetMoney() < uint32(MAX_MONEY_AMOUNT - d) ? GetMoney() + d : MAX_MONEY_AMOUNT); + SetMoney((uint32)std::min(uint64(GetMoney()) + uint64(d), GetMaxMoney())); } void LootMoney(int32 g, Loot* loot); std::string GetShortDescription() const; // "player:guid [username:accountId@IP]" diff --git a/src/game/Protocol/WorldSocket.cpp b/src/game/Protocol/WorldSocket.cpp index a6b6ac71738..0756ae90a34 100644 --- a/src/game/Protocol/WorldSocket.cpp +++ b/src/game/Protocol/WorldSocket.cpp @@ -177,9 +177,10 @@ int WorldSocket::HandleAuthSession(WorldPacket& recvPacket) std::string safe_account = account; // Duplicate, else will screw the SHA hash verification below LoginDatabase.escape_string(safe_account); // No SQL injection, username escaped. - + // 0 1 2 3 4 5 6 7 8 9 10 std::unique_ptr result(LoginDatabase.PQuery("SELECT a.`id`, aa.`gmLevel`, a.`sessionkey`, a.`last_ip`, a.`v`, a.`s`, a.`mutetime`, a.`locale`, a.`os`, a.`platform`, a.`flags`, " - "ab.`unbandate` > UNIX_TIMESTAMP() OR ab.`unbandate` = ab.`bandate` FROM `account` a LEFT JOIN `account_access` aa ON a.`id` = aa.`id` AND aa.`RealmID` IN (-1, %u) " + // 11 12 13 + "a.`email`, a.`email_verif`, ab.`unbandate` > UNIX_TIMESTAMP() OR ab.`unbandate` = ab.`bandate` FROM `account` a LEFT JOIN `account_access` aa ON a.`id` = aa.`id` AND aa.`RealmID` IN (-1, %u) " "LEFT JOIN `account_banned` ab ON a.`id` = ab.`id` AND ab.`active` = 1 WHERE a.`username` = '%s' && DATEDIFF(NOW(), a.`last_login`) < 1 ORDER BY aa.`RealmID` DESC LIMIT 1", realmID, safe_account.c_str())); // Stop if the account is not found @@ -210,25 +211,25 @@ int WorldSocket::HandleAuthSession(WorldPacket& recvPacket) } id = fields[0].GetUInt32(); - security = sAccountMgr.GetSecurity(id); + security = fields[1].GetString() ? fields[1].GetUInt32() : SEC_PLAYER; if (security > SEC_ADMINISTRATOR) // prevent invalid security settings in DB security = SEC_ADMINISTRATOR; K.SetHexStr(fields[2].GetString()); - if (K.AsByteArray().empty()) return -1; time_t mutetime = time_t (fields[6].GetUInt64()); - locale = LocaleConstant(fields[7].GetUInt8()); if (locale >= MAX_LOCALE) locale = LOCALE_enUS; os = fields[8].GetCppString(); platform = fields[9].GetCppString(); uint32 accFlags = fields[10].GetUInt32(); - bool isBanned = fields[11].GetBool(); - + std::string email = fields[11].GetCppString(); + bool verifiedEmail = fields[12].GetBool() || email.empty(); // treat no email as verified (created from console) + bool isBanned = fields[13].GetBool(); + if (isBanned || sAccountMgr.IsIPBanned(GetRemoteAddress())) { packet.Initialize(SMSG_AUTH_RESPONSE, 1); @@ -321,9 +322,11 @@ int WorldSocket::HandleAuthSession(WorldPacket& recvPacket) m_Session->SetAccountFlags(accFlags); m_Session->SetOS(clientOs); m_Session->SetPlatform(clientPlatform); + m_Session->SetVerifiedEmail(verifiedEmail); m_Session->SetSessionKey(K); m_Session->LoadGlobalAccountData(); m_Session->LoadTutorialsData(); + sAccountMgr.UpdateAccountData(id, account, email, verifiedEmail, AccountTypes(security)); sWorld.AddSession(m_Session); diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h index 2151a9e3f09..adb8943f5cc 100644 --- a/src/game/SharedDefines.h +++ b/src/game/SharedDefines.h @@ -1111,6 +1111,9 @@ enum SkillCategory SKILL_CATEGORY_GENERIC = 12 }; +#define MAX_TRIAL_MAIN_PROFESSION_SKILL 100 +#define MAX_TRIAL_SECONDARY_PROFESSION_SKILL 150 + // These errors are only printed in client console. enum TrainingFailureReason { diff --git a/src/game/World.cpp b/src/game/World.cpp index 5b44859a62b..699225bb6af 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -320,7 +320,8 @@ void World::AddSession_(WorldSession* s) WorldPacket packet(SMSG_AUTH_RESPONSE, 1 + 4 + 1 + 4); packet << uint8(AUTH_OK); packet << uint32(0); // BillingTimeRemaining - packet << uint8(0); // BillingPlanFlags + // BillingPlanFlags + packet << uint8(s->HasTrialRestrictions() ? (BILLING_FLAG_TRIAL | BILLING_FLAG_RESTRICTED) : BILLING_FLAG_NONE); packet << uint32(0); // BillingTimeRested s->SendPacket(&packet); @@ -366,7 +367,8 @@ void World::AddQueuedSession(WorldSession* sess) WorldPacket packet(SMSG_AUTH_RESPONSE, 1 + 4 + 1 + 4 + 4); packet << uint8(AUTH_WAIT_QUEUE); packet << uint32(0); // BillingTimeRemaining - packet << uint8(0); // BillingPlanFlags + // BillingPlanFlags + packet << uint8(sess->HasTrialRestrictions() ? (BILLING_FLAG_TRIAL | BILLING_FLAG_RESTRICTED) : BILLING_FLAG_NONE); packet << uint32(0); // BillingTimeRested packet << uint32(GetQueuedSessionPos(sess)); // position in queue sess->SendPacket(&packet); @@ -617,6 +619,7 @@ void World::LoadConfigSettings(bool reload) setConfigMinMax(CONFIG_UINT32_CHARACTERS_PER_REALM, "CharactersPerRealm", 10, 1, 10); setConfigMin(CONFIG_UINT32_CHARACTERS_PER_ACCOUNT, "CharactersPerAccount", 50, getConfig(CONFIG_UINT32_CHARACTERS_PER_REALM)); setConfig(CONFIG_BOOL_LIMIT_PLAY_TIME, "LimitPlayTime", false); + setConfig(CONFIG_BOOL_RESTRICT_UNVERIFIED_ACCOUNTS, "RestrictUnverifiedAccounts", false); setConfig(CONFIG_BOOL_SKIP_CINEMATICS, "SkipCinematics", false); setConfig(CONFIG_BOOL_OBJECT_HEALTH_VALUE_SHOW, "ShowHealthValues", false); diff --git a/src/game/World.h b/src/game/World.h index 16ccc52f0b3..071916b20d5 100644 --- a/src/game/World.h +++ b/src/game/World.h @@ -614,6 +614,7 @@ enum eConfigBoolValues CONFIG_BOOL_GM_CHEAT_GOD, CONFIG_BOOL_LFG_MATCHMAKING, CONFIG_BOOL_LIMIT_PLAY_TIME, + CONFIG_BOOL_RESTRICT_UNVERIFIED_ACCOUNTS, CONFIG_BOOL_VALUE_COUNT }; diff --git a/src/game/WorldSession.cpp b/src/game/WorldSession.cpp index 8fa46eead20..857d37d3e04 100644 --- a/src/game/WorldSession.cpp +++ b/src/game/WorldSession.cpp @@ -78,7 +78,7 @@ WorldSession::WorldSession(uint32 id, WorldSocket *sock, AccountTypes sec, time_ m_exhaustionState(0), m_createTime(time(nullptr)), m_previousPlayTime(0), m_logoutTime(0), m_inQueue(false), m_playerLoading(false), m_playerLogout(false), m_playerRecentlyLogout(false), m_playerSave(false), m_sessionDbcLocale(sWorld.GetAvailableDbcLocale(locale)), m_sessionDbLocaleIndex(sObjectMgr.GetIndexForLocale(locale)), m_latency(0), m_tutorialState(TUTORIALDATA_UNCHANGED), m_warden(nullptr), m_cheatData(nullptr), - m_bot(nullptr), m_clientOS(CLIENT_OS_UNKNOWN), m_clientPlatform(CLIENT_PLATFORM_UNKNOWN), m_gameBuild(0), + m_bot(nullptr), m_clientOS(CLIENT_OS_UNKNOWN), m_clientPlatform(CLIENT_PLATFORM_UNKNOWN), m_gameBuild(0), m_verifiedEmail(true), m_charactersCount(10), m_characterMaxLevel(0), m_lastPubChannelMsgTime(0), m_moveRejectTime(0), m_masterPlayer(nullptr) { if (sock) @@ -324,6 +324,11 @@ void WorldSession::LogUnprocessedTail(WorldPacket* packet) packet->rpos(), packet->wpos()); } +bool WorldSession::HasTrialRestrictions() const +{ + return !HasVerifiedEmail() && GetSecurity() <= SEC_PLAYER && sWorld.getConfig(CONFIG_BOOL_RESTRICT_UNVERIFIED_ACCOUNTS); +} + void WorldSession::CheckPlayedTimeLimit(time_t now) { #if SUPPORTED_CLIENT_BUILD > CLIENT_BUILD_1_7_1 diff --git a/src/game/WorldSession.h b/src/game/WorldSession.h index c00870f703c..3d0eb1fbb30 100644 --- a/src/game/WorldSession.h +++ b/src/game/WorldSession.h @@ -88,6 +88,19 @@ enum TutorialDataState TUTORIALDATA_NEW = 2 }; +enum BillingPlanFlags +{ + BILLING_FLAG_NONE = 0x00, + BILLING_FLAG_UNUSED = 0x01, + BILLING_FLAG_RECURRING = 0x02, + BILLING_FLAG_TRIAL = 0x04, + BILLING_FLAG_IGR = 0x08, + BILLING_FLAG_USAGE = 0x10, + BILLING_FLAG_TIME_MIXTURE = 0x20, + BILLING_FLAG_RESTRICTED = 0x40, + BILLING_FLAG_ENABLE_CAIS = 0x80 +}; + enum PlayTimeLimit : uint32 { PLAY_TIME_LIMIT_APPROACHING_PARTIAL = 2 * HOUR + 30 * MINUTE, @@ -285,6 +298,9 @@ class WorldSession uint32 GetAccountMaxLevel() const { return m_characterMaxLevel; } void SetAccountFlags(uint32 f) { m_accountFlags = f; } uint32 GetAccountFlags() const { return m_accountFlags; } + void SetVerifiedEmail(bool verified) { m_verifiedEmail = verified; } + bool HasVerifiedEmail() const { return m_verifiedEmail; } + bool HasTrialRestrictions() const; Player* GetPlayer() const { return _player; } char const* GetPlayerName() const; void SetSecurity(AccountTypes security) { m_security = security; } @@ -882,9 +898,10 @@ class WorldSession uint32 m_accountFlags; LocaleConstant m_sessionDbcLocale; int m_sessionDbLocaleIndex; - ClientOSType m_clientOS; + ClientOSType m_clientOS; ClientPlatformType m_clientPlatform; - uint32 m_gameBuild; + uint32 m_gameBuild; + bool m_verifiedEmail; std::shared_ptr m_bot; std::unique_ptr m_sniffFile; diff --git a/src/mangosd/mangosd.conf.dist.in b/src/mangosd/mangosd.conf.dist.in index a08daff26ba..75c03cc6a08 100644 --- a/src/mangosd/mangosd.conf.dist.in +++ b/src/mangosd/mangosd.conf.dist.in @@ -834,6 +834,19 @@ PerformanceLog.SlowPacketBroadcast = 0 # Default: 0 (Disabled) # 1 (Enabled) # +# RestrictUnverifiedAccounts +# Treat accounts with an unverified email as trial accounts, which are not allowed to do the following: +# - Join a guild +# - Whisper someone who has not added you to their friends list +# - Trade +# - Talk in General, Trade or LocalDefense channels +# - Level above level 20 +# - Receive mail other than from Game Masters +# - Have more then 10 gold +# - May not level higher than 100 in your two main professions, or 150 in secondary professions +# Default: 0 (Disabled) +# 1 (Enabled) +# # SkipCinematics # Disable in-game intro cinematic on first login of character (allows to prevent buggy intro when using custom start location) # Default: 0 - show intro for each new character @@ -1092,6 +1105,7 @@ CharactersCreatingDisabled = 0 CharactersPerAccount = 50 CharactersPerRealm = 10 LimitPlayTime = 0 +RestrictUnverifiedAccounts = 0 SkipCinematics = 0 ShowHealthValues = 0 MaxPlayerLevel = 60 From faf8e61b838b645803097db4a8de359dab352691 Mon Sep 17 00:00:00 2001 From: ratkosrb Date: Wed, 3 Jul 2024 00:13:07 +0300 Subject: [PATCH 29/34] Add missing include. --- src/game/GMTicketMgr.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/game/GMTicketMgr.h b/src/game/GMTicketMgr.h index a5dba301541..cb9c12721fe 100644 --- a/src/game/GMTicketMgr.h +++ b/src/game/GMTicketMgr.h @@ -21,6 +21,7 @@ #include "SharedDefines.h" #include "ObjectGuid.h" #include +#include class Player; class ChatHandler; From 115fdc525036c9f61a654a0e0732a54a43cc4f6a Mon Sep 17 00:00:00 2001 From: ReyDonovan Date: Fri, 5 Jul 2024 23:43:20 +0300 Subject: [PATCH 30/34] Add some missing includes to fix Debian build (#2699) --- src/game/AI/ScriptedEscortAI.h | 1 + src/game/Chat/Chat.h | 1 + src/game/ReputationMgr.h | 1 + 3 files changed, 3 insertions(+) diff --git a/src/game/AI/ScriptedEscortAI.h b/src/game/AI/ScriptedEscortAI.h index 4ac0bd7ae77..b351c823cda 100644 --- a/src/game/AI/ScriptedEscortAI.h +++ b/src/game/AI/ScriptedEscortAI.h @@ -6,6 +6,7 @@ #define SC_ESCORTAI_H #include "ScriptedAI.h" +#include class Quest; diff --git a/src/game/Chat/Chat.h b/src/game/Chat/Chat.h index dac4939513f..2af6b2d833f 100644 --- a/src/game/Chat/Chat.h +++ b/src/game/Chat/Chat.h @@ -25,6 +25,7 @@ #include "Common.h" #include "SharedDefines.h" #include "ObjectGuid.h" +#include struct AreaTriggerTeleport; struct AreaTriggerEntry; diff --git a/src/game/ReputationMgr.h b/src/game/ReputationMgr.h index 0093226b8af..e1977e2f897 100644 --- a/src/game/ReputationMgr.h +++ b/src/game/ReputationMgr.h @@ -26,6 +26,7 @@ #include "SharedDefines.h" #include "DBCStructure.h" #include +#include enum FactionFlags { From dd267cfe9681d5a5219bdd30f554c995686b3534 Mon Sep 17 00:00:00 2001 From: ratkosrb Date: Sat, 6 Jul 2024 00:43:08 +0300 Subject: [PATCH 31/34] Fix Stormwind and Orgrimmar world buffs not applying to pets. --- sql/migrations/20240705213916_world.sql | 22 ++++++++++++++++++++++ src/game/Maps/ScriptCommands.cpp | 4 ++++ src/game/Maps/ScriptCommands.h | 2 ++ 3 files changed, 28 insertions(+) create mode 100644 sql/migrations/20240705213916_world.sql diff --git a/sql/migrations/20240705213916_world.sql b/sql/migrations/20240705213916_world.sql new file mode 100644 index 00000000000..14d99b93486 --- /dev/null +++ b/sql/migrations/20240705213916_world.sql @@ -0,0 +1,22 @@ +DROP PROCEDURE IF EXISTS add_migration; +DELIMITER ?? +CREATE PROCEDURE `add_migration`() +BEGIN +DECLARE v INT DEFAULT 1; +SET v = (SELECT COUNT(*) FROM `migrations` WHERE `id`='20240705213916'); +IF v = 0 THEN +INSERT INTO `migrations` VALUES ('20240705213916'); +-- Add your query below. + + +-- Fix Stormwind and Orgrimmar world buffs not applying to pets. +UPDATE `generic_scripts` SET `datalong3`=1 WHERE `command`=92 && `id` IN (4974, 7782, 7496); +UPDATE `creature_movement_scripts` SET `datalong3`=1 WHERE `command`=92 && `id` IN (1439202, 1472002); + + +-- End of migration. +END IF; +END?? +DELIMITER ; +CALL add_migration(); +DROP PROCEDURE IF EXISTS add_migration; diff --git a/src/game/Maps/ScriptCommands.cpp b/src/game/Maps/ScriptCommands.cpp index 575c988d4c9..bddb63700a3 100644 --- a/src/game/Maps/ScriptCommands.cpp +++ b/src/game/Maps/ScriptCommands.cpp @@ -2528,6 +2528,10 @@ bool Map::ScriptCommand_StartScriptOnZone(ScriptInfo const& script, WorldObject* if (itr.getSource()->GetCachedZoneId() == script.startScriptOnZone.zoneId) { ScriptsStart(sGenericScripts, script.startScriptOnZone.scriptId, itr.getSource()->GetObjectGuid(), target ? target->GetObjectGuid() : ObjectGuid()); + + if (script.startScriptOnZone.withPets) + if (Pet* pPet = itr.getSource()->GetPet()) + ScriptsStart(sGenericScripts, script.startScriptOnZone.scriptId, pPet->GetObjectGuid(), target ? target->GetObjectGuid() : ObjectGuid()); } } diff --git a/src/game/Maps/ScriptCommands.h b/src/game/Maps/ScriptCommands.h index 820fd62d8d9..29a81ad00d8 100644 --- a/src/game/Maps/ScriptCommands.h +++ b/src/game/Maps/ScriptCommands.h @@ -336,6 +336,7 @@ enum eScriptCommand SCRIPT_COMMAND_START_SCRIPT_ON_ZONE = 92, // source = Map // datalong = generic_script_id // datalong2 = zone_id + // datalong3 = (bool) with_pets SCRIPT_COMMAND_MAX, @@ -1074,6 +1075,7 @@ struct ScriptInfo { uint32 scriptId; // datalong uint32 zoneId; // datalong2 + uint32 withPets; // datalong3 } startScriptOnZone; struct From 964dd21ca2a4b2c8795a13206c0a2c21dbcb6a33 Mon Sep 17 00:00:00 2001 From: Daribon Date: Sat, 6 Jul 2024 14:50:41 +0200 Subject: [PATCH 32/34] Fix patch for several spawns in Silithus. (#2685) --- sql/migrations/20240623045909_world.sql | 105 ++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 sql/migrations/20240623045909_world.sql diff --git a/sql/migrations/20240623045909_world.sql b/sql/migrations/20240623045909_world.sql new file mode 100644 index 00000000000..61d8dd8fbfe --- /dev/null +++ b/sql/migrations/20240623045909_world.sql @@ -0,0 +1,105 @@ +DROP PROCEDURE IF EXISTS add_migration; +DELIMITER ?? +CREATE PROCEDURE `add_migration`() +BEGIN +DECLARE v INT DEFAULT 1; +SET v = (SELECT COUNT(*) FROM `migrations` WHERE `id`='20240623045909'); +IF v = 0 THEN +INSERT INTO `migrations` VALUES ('20240623045909'); +-- Add your query below. + + +-- Bonfires at Blackwood GY shouldn't be spawned pre 1.11 naxx +UPDATE `gameobject` SET `patch_min`=9 WHERE `guid`=45609; +UPDATE `gameobject` SET `patch_min`=9 WHERE `guid`=45611; +UPDATE `gameobject` SET `patch_min`=9 WHERE `guid`=45610; +UPDATE `gameobject` SET `patch_min`=9 WHERE `guid`=45608; + +-- 1.12 objects in Horde camp in Silithus shouldn't be spawned pre 1.12 +UPDATE `gameobject` SET `patch_min`=10 WHERE `guid`=49377; +UPDATE `gameobject` SET `patch_min`=10 WHERE `guid`=49281; +UPDATE `gameobject` SET `patch_min`=10 WHERE `guid`=49379; +UPDATE `gameobject` SET `patch_min`=10 WHERE `guid`=49375; +-- Update in gameobject_template as well +UPDATE `gameobject_template` SET `patch`=10 WHERE `entry`=181633; +UPDATE `gameobject_template` SET `patch`=10 WHERE `entry`=181634; +UPDATE `gameobject_template` SET `patch`=10 WHERE `entry`=181619; + +-- Spawn missing pre 1.12 Cooking Brazier in Horde camp in Silithus +INSERT INTO `gameobject` (`guid`, `id`, `map`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecsmin`, `spawntimesecsmax`, `animprogress`, `state`, `spawn_flags`, `visibility_mod`, `patch_min`, `patch_max`) VALUES +(49998, 180689, 1, -7554.36, 742.9, -17.7829, 4.79809, 0, 0, 0.676168, -0.736748, 25, 25, 0, 1, 0, 0, 7, 9); + +-- 1.12 objects in Alliance camp in Silithus shouldn't be spawned pre 1.12 +UPDATE `gameobject` SET `patch_min`=10 WHERE `guid`=49274; +UPDATE `gameobject` SET `patch_min`=10 WHERE `guid`=49381; +UPDATE `gameobject` SET `patch_min`=10 WHERE `guid`=49374; +-- Update in gameobject_template as well +UPDATE `gameobject_template` SET `patch`=10 WHERE `entry`=181635; +UPDATE `gameobject_template` SET `patch`=10 WHERE `entry`=181618; + +-- Spawn missing pre 1.12 Cooking Brazier in Alliance camp in Silithus +INSERT INTO `gameobject` (`guid`, `id`, `map`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecsmin`, `spawntimesecsmax`, `animprogress`, `state`, `spawn_flags`, `visibility_mod`, `patch_min`, `patch_max`) VALUES +(49999, 180688, 1, -7165.76, 1389.52, 2.41821, 3.06785, 0, 0, 0.99932, 0.0368614, 25, 25, 0, 1, 0, 0, 7, 9); + +-- Stonelash Flayer shouldn't be spawned pre 1.8 +UPDATE `creature` SET `patch_min`=6 WHERE `guid`=44397; +UPDATE `creature` SET `patch_min`=6 WHERE `guid`=44396; + +-- Set patch of pooled food/barrel to not spawn pre 1.11 +UPDATE `gameobject` SET `patch_min`=9 WHERE `guid`=902; +UPDATE `gameobject` SET `patch_min`=9 WHERE `guid`=904; + +-- Moonwell (for mooncloth crafting) at Cenarion Hold shouldn't be spawned pre 1.8 +UPDATE `gameobject` SET `patch_min`=6 WHERE `guid`=49378; + +-- Twilight Masters in northeast Silithus shouldn't be spawned pre 1.8 +UPDATE `creature` SET `patch_min`=6 WHERE `guid`=43069; +UPDATE `creature` SET `patch_min`=6 WHERE `guid`=43070; +UPDATE `creature` SET `patch_min`=6 WHERE `guid`=43071; +UPDATE `creature` SET `patch_min`=6 WHERE `guid`=43076; +UPDATE `creature` SET `patch_min`=6 WHERE `guid`=43077; + +-- Bonfire Damage in northeast Silithus shouldn't be spawned in pre 1.8 +UPDATE `gameobject` SET `patch_min`=6 WHERE `guid`=49282; + +-- Terrain was changed a bit in Cenarion Hold in 1.9, remove objects that didn't exist prior to 1.9.0: +-- Forge +UPDATE `gameobject` SET `patch_min`=7 WHERE `guid`=49393; +-- Anvil +UPDATE `gameobject` SET `patch_min`=7 WHERE `guid`=49394; +-- Cooking Brazier +UPDATE `gameobject` SET `patch_min`=7 WHERE `guid`=49395; + +-- Cenarion Hold Infantry with waypoints should be mounted pre 1.9. +INSERT INTO `creature_addon` (`guid`, `patch`, `display_id`, `mount_display_id`, `equipment_id`, `stand_state`, `sheath_state`, `emote_state`, `auras`) VALUES +(42895, 6, 0, 14330, -1, 0, 1, 0, NULL), +(42898, 6, 0, 14330, -1, 0, 1, 0, NULL), +(42895, 7, 0, 0, -1, 0, 1, 0, NULL), +(42898, 7, 0, 0, -1, 0, 1, 0, NULL), +(42897, 6, 0, 14330, -1, 0, 1, 0, NULL), +(60006, 6, 0, 14330, -1, 0, 1, 0, NULL), +(42897, 7, 0, 0, -1, 0, 1, 0, NULL), +(60006, 7, 0, 0, -1, 0, 1, 0, NULL); + +-- Several Cenarion Hold Infantry NPCs shouldn't be spawned pre 1.9. +UPDATE `creature` SET `patch_min`=7 WHERE `guid`=42772; +UPDATE `creature` SET `patch_min`=7 WHERE `guid`=42784; +UPDATE `creature` SET `patch_min`=7 WHERE `guid`=42868; +UPDATE `creature` SET `patch_min`=7 WHERE `guid`=42769; +UPDATE `creature` SET `patch_min`=7 WHERE `guid`=42773; +UPDATE `creature` SET `patch_min`=7 WHERE `guid`=42776; +UPDATE `creature` SET `patch_min`=7 WHERE `guid`=42777; +UPDATE `creature` SET `patch_min`=7 WHERE `guid`=42768; +UPDATE `creature` SET `patch_min`=7 WHERE `guid`=42884; +UPDATE `creature` SET `patch_min`=7 WHERE `guid`=42782; +UPDATE `creature` SET `patch_min`=7 WHERE `guid`=42783; +UPDATE `creature` SET `patch_min`=7 WHERE `guid`=42766; +UPDATE `creature` SET `patch_min`=7 WHERE `guid`=42767; + + +-- End of migration. +END IF; +END?? +DELIMITER ; +CALL add_migration(); +DROP PROCEDURE IF EXISTS add_migration; From 1f65583b34b61372aef1e012de122bb66f7419af Mon Sep 17 00:00:00 2001 From: ratkosrb <35845488+ratkosrb@users.noreply.github.com> Date: Wed, 10 Jul 2024 20:14:02 +0300 Subject: [PATCH 33/34] Fix g3d build issue on arm --- dep/include/g3dlite/G3D/platform.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dep/include/g3dlite/G3D/platform.h b/dep/include/g3dlite/G3D/platform.h index d043f21491a..3f6f8d2857f 100644 --- a/dep/include/g3dlite/G3D/platform.h +++ b/dep/include/g3dlite/G3D/platform.h @@ -273,7 +273,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw) {\ # define __stdcall __attribute__((stdcall)) # endif -# elif defined(__x86_64__) || defined(__arm) || defined(__aarch64__) +# elif defined(__x86_64__) || defined(__arm) || defined(__arm__) || defined(__aarch64__) # ifndef __cdecl # define __cdecl From 3d61a81da78a8a8cfbe7973357726d5ccf1171d3 Mon Sep 17 00:00:00 2001 From: ratkosrb Date: Thu, 11 Jul 2024 07:22:28 +0300 Subject: [PATCH 34/34] Fix startup crash on arm. Fix posted by rechap79 here https://www.getmangos.eu/forums/topic/8596-attempting-to-port-to-armv7/ --- src/shared/ByteBuffer.h | 8 ++++++++ src/shared/Database/SQLStorageImpl.h | 30 ++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/shared/ByteBuffer.h b/src/shared/ByteBuffer.h index 03e7b3cfd6b..8036e95d1ec 100644 --- a/src/shared/ByteBuffer.h +++ b/src/shared/ByteBuffer.h @@ -333,7 +333,15 @@ class ByteBuffer { if(pos + sizeof(T) > size()) throw ByteBufferException(false, pos, sizeof(T), size()); + +#if defined(__arm__) || defined(_M_ARM) + // memcpy to avoid alignment issues + T val; + memcpy((void*)&val, (void*)&_storage[pos], sizeof(T)); +#else T val = *((T const*)&_storage[pos]); +#endif + EndianConvert(val); return val; } diff --git a/src/shared/Database/SQLStorageImpl.h b/src/shared/Database/SQLStorageImpl.h index c4c058dd140..d5b29b7490d 100644 --- a/src/shared/Database/SQLStorageImpl.h +++ b/src/shared/Database/SQLStorageImpl.h @@ -27,6 +27,16 @@ template template // S source-type, D destination-type void SQLStorageLoaderBase::convert(uint32 /*field_pos*/, S src, D& dst) { +#if defined(__arm__) || defined(_M_ARM) + if (((unsigned)&dst) % sizeof(D)) + { + // address not aligned. Use memcpy to avoid unaligned trap + D converted(src); + memcpy((void*)&dst, (void*)&converted, sizeof(D)); + + } + else +#endif dst = D(src); } @@ -66,6 +76,16 @@ template template // D destination-type void SQLStorageLoaderBase::convert_from_str(uint32 /*field_pos*/, char const* /*src*/, D& dst) { +#if defined(__arm__) || defined(_M_ARM) + if (((unsigned)&dst) % sizeof(D)) + { + // address not aligned. Use memcpy to avoid unaligned trap + D converted(0); + memcpy((void*)&dst, (void*)&converted, sizeof(D)); + + } + else +#endif dst = 0; } @@ -79,6 +99,16 @@ template template // S source-type, D destination-type void SQLStorageLoaderBase::default_fill(uint32 /*field_pos*/, S src, D& dst) { +#if defined(__arm__) || defined(_M_ARM) + if (((unsigned)&dst) % sizeof(D)) + { + // address not aligned. Use memcpy to avoid unaligned trap + D converted(src); + memcpy((void*)&dst, (void*)&converted, sizeof(D)); + + } + else +#endif dst = D(src); }
    ' . - &t2h_anchor('', $href, $entry) . - '  ' . - $descr . - "
    ' . - $entry . - '' . $descr . - "

    S*t@CCZn9V09$ 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 diff --git a/dep/src/readline/src/doc/history.texi b/dep/src/readline/src/doc/history.texi deleted file mode 100644 index f6a3d205167..00000000000 --- a/dep/src/readline/src/doc/history.texi +++ /dev/null @@ -1,104 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@c %**start of header (This is for running Texinfo on a region.) -@setfilename history.info -@settitle GNU History Library -@c %**end of header (This is for running Texinfo on a region.) - -@setchapternewpage odd - -@include version.texi - -@copying -This document describes the GNU History library -(version @value{VERSION}, @value{UPDATED}), -a programming tool that provides a consistent user interface for -recalling lines of previously typed input. - -Copyright @copyright{} 1988-2004 Free Software Foundation, Inc. - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -@quotation -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU Free Documentation License, Version 1.1 or -any later version published by the Free Software Foundation; with no -Invariant Sections, with the Front-Cover texts being ``A GNU Manual,'' -and with the Back-Cover Texts as in (a) below. A copy of the license is -included in the section entitled ``GNU Free Documentation License.'' - -(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify -this GNU Manual, like GNU software. Copies published by the Free -Software Foundation raise funds for GNU development.'' -@end quotation -@end copying - -@dircategory Libraries -@direntry -* History: (history). The GNU history library API. -@end direntry - -@titlepage -@title GNU History Library -@subtitle Edition @value{EDITION}, for @code{History Library} Version @value{VERSION}. -@subtitle @value{UPDATED-MONTH} -@author Chet Ramey, Case Western Reserve University -@author Brian Fox, Free Software Foundation - -@page - -@vskip 0pt plus 1filll -@insertcopying - -@sp 1 -Published by the Free Software Foundation @* -59 Temple Place, Suite 330, @* -Boston, MA 02111-1307 @* -USA @* - -@end titlepage - -@contents - -@ifnottex -@node Top -@top GNU History Library - -This document describes the GNU History library, a programming tool that -provides a consistent user interface for recalling lines of previously -typed input. - -@menu -* Using History Interactively:: GNU History User's Manual. -* Programming with GNU History:: GNU History Programmer's Manual. -* Copying This Manual:: Copying This Manual. -* Concept Index:: Index of concepts described in this manual. -* Function and Variable Index:: Index of externally visible functions - and variables. -@end menu -@end ifnottex - -@syncodeindex fn vr - -@include hsuser.texi -@include hstech.texi - -@node Copying This Manual -@appendix Copying This Manual - -@menu -* GNU Free Documentation License:: License for copying this manual. -@end menu - -@include fdl.texi - -@node Concept Index -@appendix Concept Index -@printindex cp - -@node Function and Variable Index -@appendix Function and Variable Index -@printindex vr - -@bye diff --git a/dep/src/readline/src/doc/history_3.ps b/dep/src/readline/src/doc/history_3.ps deleted file mode 100644 index 855292b333043406fc7af23103de6735816334a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44584 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 X+YdUvZ}si($)do9!u8#MeNg-_u^}*c diff --git a/dep/src/readline/src/doc/hstech.texi b/dep/src/readline/src/doc/hstech.texi deleted file mode 100644 index 4fdda5f1c9e..00000000000 --- a/dep/src/readline/src/doc/hstech.texi +++ /dev/null @@ -1,573 +0,0 @@ -@ignore -This file documents the user interface to the GNU History library. - -Copyright (C) 1988-2002 Free Software Foundation, Inc. -Authored by Brian Fox and Chet Ramey. - -Permission is granted to make and distribute verbatim copies of this manual -provided the copyright notice and this permission notice are preserved on -all copies. - -Permission is granted to process this file through Tex and print the -results, provided the printed document carries copying permission notice -identical to this one except for the removal of this paragraph (this -paragraph not being relevant to the printed manual). - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided also that the -GNU Copyright statement is available to the distributee, and provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions. -@end ignore - -@node Programming with GNU History -@chapter Programming with GNU History - -This chapter describes how to interface programs that you write -with the @sc{gnu} History Library. -It should be considered a technical guide. -For information on the interactive use of @sc{gnu} History, @pxref{Using -History Interactively}. - -@menu -* Introduction to History:: What is the GNU History library for? -* History Storage:: How information is stored. -* History Functions:: Functions that you can use. -* History Variables:: Variables that control behaviour. -* History Programming Example:: Example of using the GNU History Library. -@end menu - -@node Introduction to History -@section Introduction to History - -Many programs read input from the user a line at a time. The @sc{gnu} -History library is able to keep track of those lines, associate arbitrary -data with each line, and utilize information from previous lines in -composing new ones. - -The programmer using the History library has available functions -for remembering lines on a history list, associating arbitrary data -with a line, removing lines from the list, searching through the list -for a line containing an arbitrary text string, and referencing any line -in the list directly. In addition, a history @dfn{expansion} function -is available which provides for a consistent user interface across -different programs. - -The user using programs written with the History library has the -benefit of a consistent user interface with a set of well-known -commands for manipulating the text of previous lines and using that text -in new commands. The basic history manipulation commands are similar to -the history substitution provided by @code{csh}. - -If the programmer desires, he can use the Readline library, which -includes some history manipulation by default, and has the added -advantage of command line editing. - -Before declaring any functions using any functionality the History -library provides in other code, an application writer should include -the file @code{} in any file that uses the -History library's features. It supplies extern declarations for all -of the library's public functions and variables, and declares all of -the public data structures. - -@node History Storage -@section History Storage - -The history list is an array of history entries. A history entry is -declared as follows: - -@example -typedef void *histdata_t; - -typedef struct _hist_entry @{ - char *line; - char *timestamp; - histdata_t data; -@} HIST_ENTRY; -@end example - -The history list itself might therefore be declared as - -@example -HIST_ENTRY **the_history_list; -@end example - -The state of the History library is encapsulated into a single structure: - -@example -/* - * A structure used to pass around the current state of the history. - */ -typedef struct _hist_state @{ - HIST_ENTRY **entries; /* Pointer to the entries themselves. */ - int offset; /* The location pointer within this array. */ - int length; /* Number of elements within this array. */ - int size; /* Number of slots allocated to this array. */ - int flags; -@} HISTORY_STATE; -@end example - -If the flags member includes @code{HS_STIFLED}, the history has been -stifled. - -@node History Functions -@section History Functions - -This section describes the calling sequence for the various functions -exported by the @sc{gnu} History library. - -@menu -* Initializing History and State Management:: Functions to call when you - want to use history in a - program. -* History List Management:: Functions used to manage the list - of history entries. -* Information About the History List:: Functions returning information about - the history list. -* Moving Around the History List:: Functions used to change the position - in the history list. -* Searching the History List:: Functions to search the history list - for entries containing a string. -* Managing the History File:: Functions that read and write a file - containing the history list. -* History Expansion:: Functions to perform csh-like history - expansion. -@end menu - -@node Initializing History and State Management -@subsection Initializing History and State Management - -This section describes functions used to initialize and manage -the state of the History library when you want to use the history -functions in your program. - -@deftypefun void using_history (void) -Begin a session in which the history functions might be used. This -initializes the interactive variables. -@end deftypefun - -@deftypefun {HISTORY_STATE *} history_get_history_state (void) -Return a structure describing the current state of the input history. -@end deftypefun - -@deftypefun void history_set_history_state (HISTORY_STATE *state) -Set the state of the history list according to @var{state}. -@end deftypefun - -@node History List Management -@subsection History List Management - -These functions manage individual entries on the history list, or set -parameters managing the list itself. - -@deftypefun void add_history (const char *string) -Place @var{string} at the end of the history list. The associated data -field (if any) is set to @code{NULL}. -@end deftypefun - -@deftypefun void add_history_time (const char *string) -Change the time stamp associated with the most recent history entry to -@var{string}. -@end deftypefun - -@deftypefun {HIST_ENTRY *} remove_history (int which) -Remove history entry at offset @var{which} from the history. The -removed element is returned so you can free the line, data, -and containing structure. -@end deftypefun - -@deftypefun {histdata_t} free_history_entry (HIST_ENTRY *histent) -Free the history entry @var{histent} and any history library private -data associated with it. Returns the application-specific data -so the caller can dispose of it. -@end deftypefun - -@deftypefun {HIST_ENTRY *} replace_history_entry (int which, const char *line, histdata_t data) -Make the history entry at offset @var{which} have @var{line} and @var{data}. -This returns the old entry so the caller can dispose of any -application-specific data. In the case -of an invalid @var{which}, a @code{NULL} pointer is returned. -@end deftypefun - -@deftypefun void clear_history (void) -Clear the history list by deleting all the entries. -@end deftypefun - -@deftypefun void stifle_history (int max) -Stifle the history list, remembering only the last @var{max} entries. -@end deftypefun - -@deftypefun int unstifle_history (void) -Stop stifling the history. This returns the previously-set -maximum number of history entries (as set by @code{stifle_history()}). -The value is positive if the history was -stifled, negative if it wasn't. -@end deftypefun - -@deftypefun int history_is_stifled (void) -Returns non-zero if the history is stifled, zero if it is not. -@end deftypefun - -@node Information About the History List -@subsection Information About the History List - -These functions return information about the entire history list or -individual list entries. - -@deftypefun {HIST_ENTRY **} history_list (void) -Return a @code{NULL} terminated array of @code{HIST_ENTRY *} which is the -current input history. Element 0 of this list is the beginning of time. -If there is no history, return @code{NULL}. -@end deftypefun - -@deftypefun int where_history (void) -Returns the offset of the current history element. -@end deftypefun - -@deftypefun {HIST_ENTRY *} current_history (void) -Return the history entry at the current position, as determined by -@code{where_history()}. If there is no entry there, return a @code{NULL} -pointer. -@end deftypefun - -@deftypefun {HIST_ENTRY *} history_get (int offset) -Return the history entry at position @var{offset}, starting from -@code{history_base} (@pxref{History Variables}). -If there is no entry there, or if @var{offset} -is greater than the history length, return a @code{NULL} pointer. -@end deftypefun - -@deftypefun time_t history_get_time (HIST_ENTRY *entry) -Return the time stamp associated with the history entry @var{entry}. -@end deftypefun - -@deftypefun int history_total_bytes (void) -Return the number of bytes that the primary history entries are using. -This function returns the sum of the lengths of all the lines in the -history. -@end deftypefun - -@node Moving Around the History List -@subsection Moving Around the History List - -These functions allow the current index into the history list to be -set or changed. - -@deftypefun int history_set_pos (int pos) -Set the current history offset to @var{pos}, an absolute index -into the list. -Returns 1 on success, 0 if @var{pos} is less than zero or greater -than the number of history entries. -@end deftypefun - -@deftypefun {HIST_ENTRY *} previous_history (void) -Back up the current history offset to the previous history entry, and -return a pointer to that entry. If there is no previous entry, return -a @code{NULL} pointer. -@end deftypefun - -@deftypefun {HIST_ENTRY *} next_history (void) -Move the current history offset forward to the next history entry, and -return the a pointer to that entry. If there is no next entry, return -a @code{NULL} pointer. -@end deftypefun - -@node Searching the History List -@subsection Searching the History List -@cindex History Searching - -These functions allow searching of the history list for entries containing -a specific string. Searching may be performed both forward and backward -from the current history position. The search may be @dfn{anchored}, -meaning that the string must match at the beginning of the history entry. -@cindex anchored search - -@deftypefun int history_search (const char *string, int direction) -Search the history for @var{string}, starting at the current history offset. -If @var{direction} is less than 0, then the search is through -previous entries, otherwise through subsequent entries. -If @var{string} is found, then -the current history index is set to that history entry, and the value -returned is the offset in the line of the entry where -@var{string} was found. Otherwise, nothing is changed, and a -1 is -returned. -@end deftypefun - -@deftypefun int history_search_prefix (const char *string, int direction) -Search the history for @var{string}, starting at the current history -offset. The search is anchored: matching lines must begin with -@var{string}. If @var{direction} is less than 0, then the search is -through previous entries, otherwise through subsequent entries. -If @var{string} is found, then the -current history index is set to that entry, and the return value is 0. -Otherwise, nothing is changed, and a -1 is returned. -@end deftypefun - -@deftypefun int history_search_pos (const char *string, int direction, int pos) -Search for @var{string} in the history list, starting at @var{pos}, an -absolute index into the list. If @var{direction} is negative, the search -proceeds backward from @var{pos}, otherwise forward. Returns the absolute -index of the history element where @var{string} was found, or -1 otherwise. -@end deftypefun - -@node Managing the History File -@subsection Managing the History File - -The History library can read the history from and write it to a file. -This section documents the functions for managing a history file. - -@deftypefun int read_history (const char *filename) -Add the contents of @var{filename} to the history list, a line at a time. -If @var{filename} is @code{NULL}, then read from @file{~/.history}. -Returns 0 if successful, or @code{errno} if not. -@end deftypefun - -@deftypefun int read_history_range (const char *filename, int from, int to) -Read a range of lines from @var{filename}, adding them to the history list. -Start reading at line @var{from} and end at @var{to}. -If @var{from} is zero, start at the beginning. If @var{to} is less than -@var{from}, then read until the end of the file. If @var{filename} is -@code{NULL}, then read from @file{~/.history}. Returns 0 if successful, -or @code{errno} if not. -@end deftypefun - -@deftypefun int write_history (const char *filename) -Write the current history to @var{filename}, overwriting @var{filename} -if necessary. -If @var{filename} is @code{NULL}, then write the history list to -@file{~/.history}. -Returns 0 on success, or @code{errno} on a read or write error. -@end deftypefun - -@deftypefun int append_history (int nelements, const char *filename) -Append the last @var{nelements} of the history list to @var{filename}. -If @var{filename} is @code{NULL}, then append to @file{~/.history}. -Returns 0 on success, or @code{errno} on a read or write error. -@end deftypefun - -@deftypefun int history_truncate_file (const char *filename, int nlines) -Truncate the history file @var{filename}, leaving only the last -@var{nlines} lines. -If @var{filename} is @code{NULL}, then @file{~/.history} is truncated. -Returns 0 on success, or @code{errno} on failure. -@end deftypefun - -@node History Expansion -@subsection History Expansion - -These functions implement history expansion. - -@deftypefun int history_expand (char *string, char **output) -Expand @var{string}, placing the result into @var{output}, a pointer -to a string (@pxref{History Interaction}). Returns: -@table @code -@item 0 -If no expansions took place (or, if the only change in -the text was the removal of escape characters preceding the history expansion -character); -@item 1 -if expansions did take place; -@item -1 -if there was an error in expansion; -@item 2 -if the returned line should be displayed, but not executed, -as with the @code{:p} modifier (@pxref{Modifiers}). -@end table - -If an error ocurred in expansion, then @var{output} contains a descriptive -error message. -@end deftypefun - -@deftypefun {char *} get_history_event (const char *string, int *cindex, int qchar) -Returns the text of the history event beginning at @var{string} + -@var{*cindex}. @var{*cindex} is modified to point to after the event -specifier. At function entry, @var{cindex} points to the index into -@var{string} where the history event specification begins. @var{qchar} -is a character that is allowed to end the event specification in addition -to the ``normal'' terminating characters. -@end deftypefun - -@deftypefun {char **} history_tokenize (const char *string) -Return an array of tokens parsed out of @var{string}, much as the -shell might. The tokens are split on the characters in the -@var{history_word_delimiters} variable, -and shell quoting conventions are obeyed. -@end deftypefun - -@deftypefun {char *} history_arg_extract (int first, int last, const char *string) -Extract a string segment consisting of the @var{first} through @var{last} -arguments present in @var{string}. Arguments are split using -@code{history_tokenize}. -@end deftypefun - -@node History Variables -@section History Variables - -This section describes the externally-visible variables exported by -the @sc{gnu} History Library. - -@deftypevar int history_base -The logical offset of the first entry in the history list. -@end deftypevar - -@deftypevar int history_length -The number of entries currently stored in the history list. -@end deftypevar - -@deftypevar int history_max_entries -The maximum number of history entries. This must be changed using -@code{stifle_history()}. -@end deftypevar - -@deftypevar int history_write_timestamps -If non-zero, timestamps are written to the history file, so they can be -preserved between sessions. The default value is 0, meaning that -timestamps are not saved. -@end deftypevar - -@deftypevar char history_expansion_char -The character that introduces a history event. The default is @samp{!}. -Setting this to 0 inhibits history expansion. -@end deftypevar - -@deftypevar char history_subst_char -The character that invokes word substitution if found at the start of -a line. The default is @samp{^}. -@end deftypevar - -@deftypevar char history_comment_char -During tokenization, if this character is seen as the first character -of a word, then it and all subsequent characters up to a newline are -ignored, suppressing history expansion for the remainder of the line. -This is disabled by default. -@end deftypevar - -@deftypevar {char *} history_word_delimiters -The characters that separate tokens for @code{history_tokenize()}. -The default value is @code{" \t\n()<>;&|"}. -@end deftypevar - -@deftypevar {char *} history_search_delimiter_chars -The list of additional characters which can delimit a history search -string, in addition to space, TAB, @samp{:} and @samp{?} in the case of -a substring search. The default is empty. -@end deftypevar - -@deftypevar {char *} history_no_expand_chars -The list of characters which inhibit history expansion if found immediately -following @var{history_expansion_char}. The default is space, tab, newline, -carriage return, and @samp{=}. -@end deftypevar - -@deftypevar int history_quotes_inhibit_expansion -If non-zero, single-quoted words are not scanned for the history expansion -character. The default value is 0. -@end deftypevar - -@deftypevar {rl_linebuf_func_t *} history_inhibit_expansion_function -This should be set to the address of a function that takes two arguments: -a @code{char *} (@var{string}) -and an @code{int} index into that string (@var{i}). -It should return a non-zero value if the history expansion starting at -@var{string[i]} should not be performed; zero if the expansion should -be done. -It is intended for use by applications like Bash that use the history -expansion character for additional purposes. -By default, this variable is set to @code{NULL}. -@end deftypevar - -@node History Programming Example -@section History Programming Example - -The following program demonstrates simple use of the @sc{gnu} History Library. - -@smallexample -#include -#include - -main (argc, argv) - int argc; - char **argv; -@{ - char line[1024], *t; - int len, done = 0; - - line[0] = 0; - - using_history (); - while (!done) - @{ - printf ("history$ "); - fflush (stdout); - t = fgets (line, sizeof (line) - 1, stdin); - if (t && *t) - @{ - len = strlen (t); - if (t[len - 1] == '\n') - t[len - 1] = '\0'; - @} - - if (!t) - strcpy (line, "quit"); - - if (line[0]) - @{ - char *expansion; - int result; - - result = history_expand (line, &expansion); - if (result) - fprintf (stderr, "%s\n", expansion); - - if (result < 0 || result == 2) - @{ - free (expansion); - continue; - @} - - add_history (expansion); - strncpy (line, expansion, sizeof (line) - 1); - free (expansion); - @} - - if (strcmp (line, "quit") == 0) - done = 1; - else if (strcmp (line, "save") == 0) - write_history ("history_file"); - else if (strcmp (line, "read") == 0) - read_history ("history_file"); - else if (strcmp (line, "list") == 0) - @{ - register HIST_ENTRY **the_list; - register int i; - - the_list = history_list (); - if (the_list) - for (i = 0; the_list[i]; i++) - printf ("%d: %s\n", i + history_base, the_list[i]->line); - @} - else if (strncmp (line, "delete", 6) == 0) - @{ - int which; - if ((sscanf (line + 6, "%d", &which)) == 1) - @{ - HIST_ENTRY *entry = remove_history (which); - if (!entry) - fprintf (stderr, "No such entry %d\n", which); - else - @{ - free (entry->line); - free (entry); - @} - @} - else - @{ - fprintf (stderr, "non-numeric arg given to `delete'\n"); - @} - @} - @} -@} -@end smallexample diff --git a/dep/src/readline/src/doc/hsuser.texi b/dep/src/readline/src/doc/hsuser.texi deleted file mode 100644 index 6c891833186..00000000000 --- a/dep/src/readline/src/doc/hsuser.texi +++ /dev/null @@ -1,457 +0,0 @@ -@ignore -This file documents the user interface to the GNU History library. - -Copyright (C) 1988-2002 Free Software Foundation, Inc. -Authored by Brian Fox and Chet Ramey. - -Permission is granted to make and distribute verbatim copies of this manual -provided the copyright notice and this permission notice are preserved on -all copies. - -Permission is granted to process this file through Tex and print the -results, provided the printed document carries copying permission notice -identical to this one except for the removal of this paragraph (this -paragraph not being relevant to the printed manual). - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided also that the -GNU Copyright statement is available to the distributee, and provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions. -@end ignore - -@node Using History Interactively -@chapter Using History Interactively - -@ifclear BashFeatures -@defcodeindex bt -@end ifclear - -@ifset BashFeatures -This chapter describes how to use the @sc{gnu} History Library -interactively, from a user's standpoint. -It should be considered a user's guide. -For information on using the @sc{gnu} History Library in other programs, -see the @sc{gnu} Readline Library Manual. -@end ifset -@ifclear BashFeatures -This chapter describes how to use the @sc{gnu} History Library interactively, -from a user's standpoint. It should be considered a user's guide. For -information on using the @sc{gnu} History Library in your own programs, -@pxref{Programming with GNU History}. -@end ifclear - -@ifset BashFeatures -@menu -* Bash History Facilities:: How Bash lets you manipulate your command - history. -* Bash History Builtins:: The Bash builtin commands that manipulate - the command history. -* History Interaction:: What it feels like using History as a user. -@end menu -@end ifset -@ifclear BashFeatures -@menu -* History Interaction:: What it feels like using History as a user. -@end menu -@end ifclear - -@ifset BashFeatures -@node Bash History Facilities -@section Bash History Facilities -@cindex command history -@cindex history list - -When the @option{-o history} option to the @code{set} builtin -is enabled (@pxref{The Set Builtin}), -the shell provides access to the @dfn{command history}, -the list of commands previously typed. -The value of the @env{HISTSIZE} shell variable is used as the -number of commands to save in a history list. -The text of the last @env{$HISTSIZE} -commands (default 500) is saved. -The shell stores each command in the history list prior to -parameter and variable expansion -but after history expansion is performed, subject to the -values of the shell variables -@env{HISTIGNORE} and @env{HISTCONTROL}. - -When the shell starts up, the history is initialized from the -file named by the @env{HISTFILE} variable (default @file{~/.bash_history}). -The file named by the value of @env{HISTFILE} is truncated, if -necessary, to contain no more than the number of lines specified by -the value of the @env{HISTFILESIZE} variable. -When an interactive shell exits, the last -@env{$HISTSIZE} lines are copied from the history list to the file -named by @env{$HISTFILE}. -If the @code{histappend} shell option is set (@pxref{Bash Builtins}), -the lines are appended to the history file, -otherwise the history file is overwritten. -If @env{HISTFILE} -is unset, or if the history file is unwritable, the history is -not saved. After saving the history, the history file is truncated -to contain no more than @env{$HISTFILESIZE} -lines. If @env{HISTFILESIZE} is not set, no truncation is performed. - -If the @env{HISTTIMEFORMAT} is set, the time stamp information -associated with each history entry is written to the history file. - -The builtin command @code{fc} may be used to list or edit and re-execute -a portion of the history list. -The @code{history} builtin may be used to display or modify the history -list and manipulate the history file. -When using command-line editing, search commands -are available in each editing mode that provide access to the -history list (@pxref{Commands For History}). - -The shell allows control over which commands are saved on the history -list. The @env{HISTCONTROL} and @env{HISTIGNORE} -variables may be set to cause the shell to save only a subset of the -commands entered. -The @code{cmdhist} -shell option, if enabled, causes the shell to attempt to save each -line of a multi-line command in the same history entry, adding -semicolons where necessary to preserve syntactic correctness. -The @code{lithist} -shell option causes the shell to save the command with embedded newlines -instead of semicolons. -The @code{shopt} builtin is used to set these options. -@xref{Bash Builtins}, for a description of @code{shopt}. - -@node Bash History Builtins -@section Bash History Builtins -@cindex history builtins - -Bash provides two builtin commands which manipulate the -history list and history file. - -@table @code - -@item fc -@btindex fc -@example -@code{fc [-e @var{ename}] [-nlr] [@var{first}] [@var{last}]} -@code{fc -s [@var{pat}=@var{rep}] [@var{command}]} -@end example - -Fix Command. In the first form, a range of commands from @var{first} to -@var{last} is selected from the history list. Both @var{first} and -@var{last} may be specified as a string (to locate the most recent -command beginning with that string) or as a number (an index into the -history list, where a negative number is used as an offset from the -current command number). If @var{last} is not specified it is set to -@var{first}. If @var{first} is not specified it is set to the previous -command for editing and @minus{}16 for listing. If the @option{-l} flag is -given, the commands are listed on standard output. The @option{-n} flag -suppresses the command numbers when listing. The @option{-r} flag -reverses the order of the listing. Otherwise, the editor given by -@var{ename} is invoked on a file containing those commands. If -@var{ename} is not given, the value of the following variable expansion -is used: @code{$@{FCEDIT:-$@{EDITOR:-vi@}@}}. This says to use the -value of the @env{FCEDIT} variable if set, or the value of the -@env{EDITOR} variable if that is set, or @code{vi} if neither is set. -When editing is complete, the edited commands are echoed and executed. - -In the second form, @var{command} is re-executed after each instance -of @var{pat} in the selected command is replaced by @var{rep}. - -A useful alias to use with the @code{fc} command is @code{r='fc -s'}, so -that typing @samp{r cc} runs the last command beginning with @code{cc} -and typing @samp{r} re-executes the last command (@pxref{Aliases}). - -@item history -@btindex history -@example -history [@var{n}] -history -c -history -d @var{offset} -history [-anrw] [@var{filename}] -history -ps @var{arg} -@end example - -With no options, display the history list with line numbers. -Lines prefixed with a @samp{*} have been modified. -An argument of @var{n} lists only the last @var{n} lines. -If the shell variable @env{HISTTIMEFORMAT} is set and not null, -it is used as a format string for @var{strftime} to display -the time stamp associated with each displayed history entry. -No intervening blank is printed between the formatted time stamp -and the history line. - -Options, if supplied, have the following meanings: - -@table @code -@item -c -Clear the history list. This may be combined -with the other options to replace the history list completely. - -@item -d @var{offset} -Delete the history entry at position @var{offset}. -@var{offset} should be specified as it appears when the history is -displayed. - -@item -a -Append the new -history lines (history lines entered since the beginning of the -current Bash session) to the history file. - -@item -n -Append the history lines not already read from the history file -to the current history list. These are lines appended to the history -file since the beginning of the current Bash session. - -@item -r -Read the current history file and append its contents to -the history list. - -@item -w -Write out the current history to the history file. - -@item -p -Perform history substitution on the @var{arg}s and display the result -on the standard output, without storing the results in the history list. - -@item -s -The @var{arg}s are added to the end of -the history list as a single entry. - -@end table - -When any of the @option{-w}, @option{-r}, @option{-a}, or @option{-n} options is -used, if @var{filename} -is given, then it is used as the history file. If not, then -the value of the @env{HISTFILE} variable is used. - -@end table -@end ifset - -@node History Interaction -@section History Expansion -@cindex history expansion - -The History library provides a history expansion feature that is similar -to the history expansion provided by @code{csh}. This section -describes the syntax used to manipulate the history information. - -History expansions introduce words from the history list into -the input stream, making it easy to repeat commands, insert the -arguments to a previous command into the current input line, or -fix errors in previous commands quickly. - -History expansion takes place in two parts. The first is to determine -which line from the history list should be used during substitution. -The second is to select portions of that line for inclusion into the -current one. The line selected from the history is called the -@dfn{event}, and the portions of that line that are acted upon are -called @dfn{words}. Various @dfn{modifiers} are available to manipulate -the selected words. The line is broken into words in the same fashion -that Bash does, so that several words -surrounded by quotes are considered one word. -History expansions are introduced by the appearance of the -history expansion character, which is @samp{!} by default. -@ifset BashFeatures -Only @samp{\} and @samp{'} may be used to escape the history expansion -character. -@end ifset - -@ifset BashFeatures -Several shell options settable with the @code{shopt} -builtin (@pxref{Bash Builtins}) may be used to tailor -the behavior of history expansion. If the -@code{histverify} shell option is enabled, and Readline -is being used, history substitutions are not immediately passed to -the shell parser. -Instead, the expanded line is reloaded into the Readline -editing buffer for further modification. -If Readline is being used, and the @code{histreedit} -shell option is enabled, a failed history expansion will be -reloaded into the Readline editing buffer for correction. -The @option{-p} option to the @code{history} builtin command -may be used to see what a history expansion will do before using it. -The @option{-s} option to the @code{history} builtin may be used to -add commands to the end of the history list without actually executing -them, so that they are available for subsequent recall. -This is most useful in conjunction with Readline. - -The shell allows control of the various characters used by the -history expansion mechanism with the @code{histchars} variable. -@end ifset - -@menu -* Event Designators:: How to specify which history line to use. -* Word Designators:: Specifying which words are of interest. -* Modifiers:: Modifying the results of substitution. -@end menu - -@node Event Designators -@subsection Event Designators -@cindex event designators - -An event designator is a reference to a command line entry in the -history list. -@cindex history events - -@table @asis - -@item @code{!} -@ifset BashFeatures -Start a history substitution, except when followed by a space, tab, -the end of the line, @samp{=} or @samp{(} (when the -@code{extglob} shell option is enabled using the @code{shopt} builtin). -@end ifset -@ifclear BashFeatures -Start a history substitution, except when followed by a space, tab, -the end of the line, or @samp{=}. -@end ifclear - -@item @code{!@var{n}} -Refer to command line @var{n}. - -@item @code{!-@var{n}} -Refer to the command @var{n} lines back. - -@item @code{!!} -Refer to the previous command. This is a synonym for @samp{!-1}. - -@item @code{!@var{string}} -Refer to the most recent command starting with @var{string}. - -@item @code{!?@var{string}[?]} -Refer to the most recent command containing @var{string}. The trailing -@samp{?} may be omitted if the @var{string} is followed immediately by -a newline. - -@item @code{^@var{string1}^@var{string2}^} -Quick Substitution. Repeat the last command, replacing @var{string1} -with @var{string2}. Equivalent to -@code{!!:s/@var{string1}/@var{string2}/}. - -@item @code{!#} -The entire command line typed so far. - -@end table - -@node Word Designators -@subsection Word Designators - -Word designators are used to select desired words from the event. -A @samp{:} separates the event specification from the word designator. It -may be omitted if the word designator begins with a @samp{^}, @samp{$}, -@samp{*}, @samp{-}, or @samp{%}. Words are numbered from the beginning -of the line, with the first word being denoted by 0 (zero). Words are -inserted into the current line separated by single spaces. - -@need 0.75 -For example, - -@table @code -@item !! -designates the preceding command. When you type this, the preceding -command is repeated in toto. - -@item !!:$ -designates the last argument of the preceding command. This may be -shortened to @code{!$}. - -@item !fi:2 -designates the second argument of the most recent command starting with -the letters @code{fi}. -@end table - -@need 0.75 -Here are the word designators: - -@table @code - -@item 0 (zero) -The @code{0}th word. For many applications, this is the command word. - -@item @var{n} -The @var{n}th word. - -@item ^ -The first argument; that is, word 1. - -@item $ -The last argument. - -@item % -The word matched by the most recent @samp{?@var{string}?} search. - -@item @var{x}-@var{y} -A range of words; @samp{-@var{y}} abbreviates @samp{0-@var{y}}. - -@item * -All of the words, except the @code{0}th. This is a synonym for @samp{1-$}. -It is not an error to use @samp{*} if there is just one word in the event; -the empty string is returned in that case. - -@item @var{x}* -Abbreviates @samp{@var{x}-$} - -@item @var{x}- -Abbreviates @samp{@var{x}-$} like @samp{@var{x}*}, but omits the last word. - -@end table - -If a word designator is supplied without an event specification, the -previous command is used as the event. - -@node Modifiers -@subsection Modifiers - -After the optional word designator, you can add a sequence of one or more -of the following modifiers, each preceded by a @samp{:}. - -@table @code - -@item h -Remove a trailing pathname component, leaving only the head. - -@item t -Remove all leading pathname components, leaving the tail. - -@item r -Remove a trailing suffix of the form @samp{.@var{suffix}}, leaving -the basename. - -@item e -Remove all but the trailing suffix. - -@item p -Print the new command but do not execute it. - -@ifset BashFeatures -@item q -Quote the substituted words, escaping further substitutions. - -@item x -Quote the substituted words as with @samp{q}, -but break into words at spaces, tabs, and newlines. -@end ifset - -@item s/@var{old}/@var{new}/ -Substitute @var{new} for the first occurrence of @var{old} in the -event line. Any delimiter may be used in place of @samp{/}. -The delimiter may be quoted in @var{old} and @var{new} -with a single backslash. If @samp{&} appears in @var{new}, -it is replaced by @var{old}. A single backslash will quote -the @samp{&}. The final delimiter is optional if it is the last -character on the input line. - -@item & -Repeat the previous substitution. - -@item g -@itemx a -Cause changes to be applied over the entire event line. Used in -conjunction with @samp{s}, as in @code{gs/@var{old}/@var{new}/}, -or with @samp{&}. - -@item G -Apply the following @samp{s} modifier once to each word in the event. - -@end table diff --git a/dep/src/readline/src/doc/readline.0 b/dep/src/readline/src/doc/readline.0 deleted file mode 100644 index 9ccb693e147..00000000000 --- a/dep/src/readline/src/doc/readline.0 +++ /dev/null @@ -1,914 +0,0 @@ -READLINE(3) READLINE(3) - - - -NNAAMMEE - readline - get a line from a user with editing - -SSYYNNOOPPSSIISS - ##iinncclluuddee <> - ##iinncclluuddee <> - ##iinncclluuddee <> - - _c_h_a_r _* - rreeaaddlliinnee (_c_o_n_s_t _c_h_a_r _*_p_r_o_m_p_t); - -CCOOPPYYRRIIGGHHTT - Readline is Copyright (C) 1989-2004 by the Free Software Foundation, - Inc. - -DDEESSCCRRIIPPTTIIOONN - rreeaaddlliinnee will read a line from the terminal and return it, using pprroommpptt - as a prompt. If pprroommpptt is NNUULLLL or the empty string, no prompt is - issued. The line returned is allocated with _m_a_l_l_o_c(3); the caller must - free it when finished. The line returned has the final newline - removed, so only the text of the line remains. - - rreeaaddlliinnee offers editing capabilities while the user is entering the - line. By default, the line editing commands are similar to those of - emacs. A vi-style line editing interface is also available. - - This manual page describes only the most basic use of rreeaaddlliinnee. Much - more functionality is available; see _T_h_e _G_N_U _R_e_a_d_l_i_n_e _L_i_b_r_a_r_y and _T_h_e - _G_N_U _H_i_s_t_o_r_y _L_i_b_r_a_r_y for additional information. - -RREETTUURRNN VVAALLUUEE - rreeaaddlliinnee returns the text of the line read. A blank line returns the - empty string. If EEOOFF is encountered while reading a line, and the line - is empty, NNUULLLL is returned. If an EEOOFF is read with a non-empty line, - it is treated as a newline. - -NNOOTTAATTIIOONN - An emacs-style notation is used to denote keystrokes. Control keys are - denoted by C-_k_e_y, e.g., C-n means Control-N. Similarly, _m_e_t_a keys are - denoted by M-_k_e_y, so M-x means Meta-X. (On keyboards without a _m_e_t_a - key, M-_x means ESC _x, i.e., press the Escape key then the _x key. This - makes ESC the _m_e_t_a _p_r_e_f_i_x. The combination M-C-_x means ESC-Control-_x, - or press the Escape key then hold the Control key while pressing the _x - key.) - - Readline commands may be given numeric _a_r_g_u_m_e_n_t_s, which normally act as - a repeat count. Sometimes, however, it is the sign of the argument - that is significant. Passing a negative argument to a command that - acts in the forward direction (e.g., kkiillll--lliinnee) causes that command to - act in a backward direction. Commands whose behavior with arguments - deviates from this are noted. - - When a command is described as _k_i_l_l_i_n_g text, the text deleted is saved - for possible future retrieval (_y_a_n_k_i_n_g). The killed text is saved in a - _k_i_l_l _r_i_n_g. Consecutive kills cause the text to be accumulated into one - unit, which can be yanked all at once. Commands which do not kill text - separate the chunks of text on the kill ring. - -IINNIITTIIAALLIIZZAATTIIOONN FFIILLEE - Readline is customized by putting commands in an initialization file - (the _i_n_p_u_t_r_c file). The name of this file is taken from the value of - the IINNPPUUTTRRCC environment variable. If that variable is unset, the - default is _~_/_._i_n_p_u_t_r_c. When a program which uses the readline library - starts up, the init file is read, and the key bindings and variables - are set. There are only a few basic constructs allowed in the readline - init file. Blank lines are ignored. Lines beginning with a ## are com- - ments. Lines beginning with a $$ indicate conditional constructs. - Other lines denote key bindings and variable settings. Each program - using this library may add its own commands and bindings. - - For example, placing - - M-Control-u: universal-argument - or - C-Meta-u: universal-argument - - into the _i_n_p_u_t_r_c would make M-C-u execute the readline command _u_n_i_v_e_r_- - _s_a_l_-_a_r_g_u_m_e_n_t. - - The following symbolic character names are recognized while processing - key bindings: _D_E_L, _E_S_C, _E_S_C_A_P_E, _L_F_D, _N_E_W_L_I_N_E, _R_E_T, _R_E_T_U_R_N, _R_U_B_O_U_T, - _S_P_A_C_E, _S_P_C, and _T_A_B. - - In addition to command names, readline allows keys to be bound to a - string that is inserted when the key is pressed (a _m_a_c_r_o). - - - KKeeyy BBiinnddiinnggss - The syntax for controlling key bindings in the _i_n_p_u_t_r_c file is simple. - All that is required is the name of the command or the text of a macro - and a key sequence to which it should be bound. The name may be speci- - fied in one of two ways: as a symbolic key name, possibly with _M_e_t_a_- or - _C_o_n_t_r_o_l_- prefixes, or as a key sequence. - - When using the form kkeeyynnaammee:_f_u_n_c_t_i_o_n_-_n_a_m_e or _m_a_c_r_o, _k_e_y_n_a_m_e is the name - of a key spelled out in English. For example: - - Control-u: universal-argument - Meta-Rubout: backward-kill-word - Control-o: "> output" - - In the above example, _C_-_u is bound to the function uunniivveerrssaall--aarrgguummeenntt, - _M_-_D_E_L is bound to the function bbaacckkwwaarrdd--kkiillll--wwoorrdd, and _C_-_o is bound to - run the macro expressed on the right hand side (that is, to insert the - text ``> output'' into the line). - - In the second form, ""kkeeyysseeqq"":_f_u_n_c_t_i_o_n_-_n_a_m_e or _m_a_c_r_o, kkeeyysseeqq differs - from kkeeyynnaammee above in that strings denoting an entire key sequence may - be specified by placing the sequence within double quotes. Some GNU - Emacs style key escapes can be used, as in the following example, but - the symbolic character names are not recognized. - - "\C-u": universal-argument - "\C-x\C-r": re-read-init-file - "\e[11~": "Function Key 1" - - In this example, _C_-_u is again bound to the function uunniivveerrssaall--aarrgguummeenntt. - _C_-_x _C_-_r is bound to the function rree--rreeaadd--iinniitt--ffiillee, and _E_S_C _[ _1 _1 _~ is - bound to insert the text ``Function Key 1''. - - The full set of GNU Emacs style escape sequences available when speci- - fying key sequences is - \\CC-- control prefix - \\MM-- meta prefix - \\ee an escape character - \\\\ backslash - \\"" literal ", a double quote - \\'' literal ', a single quote - - In addition to the GNU Emacs style escape sequences, a second set of - backslash escapes is available: - \\aa alert (bell) - \\bb backspace - \\dd delete - \\ff form feed - \\nn newline - \\rr carriage return - \\tt horizontal tab - \\vv vertical tab - \\_n_n_n the eight-bit character whose value is the octal value - _n_n_n (one to three digits) - \\xx_H_H the eight-bit character whose value is the hexadecimal - value _H_H (one or two hex digits) - - When entering the text of a macro, single or double quotes should be - used to indicate a macro definition. Unquoted text is assumed to be a - function name. In the macro body, the backslash escapes described - above are expanded. Backslash will quote any other character in the - macro text, including " and '. - - BBaasshh allows the current readline key bindings to be displayed or modi- - fied with the bbiinndd builtin command. The editing mode may be switched - during interactive use by using the --oo option to the sseett builtin com- - mand. Other programs using this library provide similar mechanisms. - The _i_n_p_u_t_r_c file may be edited and re-read if a program does not pro- - vide any other means to incorporate new bindings. - - VVaarriiaabblleess - Readline has variables that can be used to further customize its behav- - ior. A variable may be set in the _i_n_p_u_t_r_c file with a statement of the - form - - sseett _v_a_r_i_a_b_l_e_-_n_a_m_e _v_a_l_u_e - - Except where noted, readline variables can take the values OOnn or OOffff - (without regard to case). The variables and their default values are: - - bbeellll--ssttyyllee ((aauuddiibbllee)) - Controls what happens when readline wants to ring the terminal - bell. If set to nnoonnee, readline never rings the bell. If set to - vviissiibbllee, readline uses a visible bell if one is available. If - set to aauuddiibbllee, readline attempts to ring the terminal's bell. - ccoommmmeenntt--bbeeggiinn ((````##'''')) - The string that is inserted in vvii mode when the iinnsseerrtt--ccoommmmeenntt - command is executed. This command is bound to MM--## in emacs mode - and to ## in vi command mode. - ccoommpplleettiioonn--iiggnnoorree--ccaassee ((OOffff)) - If set to OOnn, readline performs filename matching and completion - in a case-insensitive fashion. - ccoommpplleettiioonn--qquueerryy--iitteemmss ((110000)) - This determines when the user is queried about viewing the num- - ber of possible completions generated by the ppoossssiibbllee--ccoommppllee-- - ttiioonnss command. It may be set to any integer value greater than - or equal to zero. If the number of possible completions is - greater than or equal to the value of this variable, the user is - asked whether or not he wishes to view them; otherwise they are - simply listed on the terminal. - ccoonnvveerrtt--mmeettaa ((OOnn)) - If set to OOnn, readline will convert characters with the eighth - bit set to an ASCII key sequence by stripping the eighth bit and - prefixing it with an escape character (in effect, using escape - as the _m_e_t_a _p_r_e_f_i_x). - ddiissaabbllee--ccoommpplleettiioonn ((OOffff)) - If set to OOnn, readline will inhibit word completion. Completion - characters will be inserted into the line as if they had been - mapped to sseellff--iinnsseerrtt. - eeddiittiinngg--mmooddee ((eemmaaccss)) - Controls whether readline begins with a set of key bindings sim- - ilar to emacs or vi. eeddiittiinngg--mmooddee can be set to either eemmaaccss or - vvii. - eennaabbllee--kkeeyyppaadd ((OOffff)) - When set to OOnn, readline will try to enable the application key- - pad when it is called. Some systems need this to enable the - arrow keys. - eexxppaanndd--ttiillddee ((OOffff)) - If set to oonn, tilde expansion is performed when readline - attempts word completion. - hhiissttoorryy--pprreesseerrvvee--ppooiinntt - If set to oonn, the history code attempts to place point at the - same location on each history line retrived with pprreevviioouuss--hhiiss-- - ttoorryy or nneexxtt--hhiissttoorryy. - hhoorriizzoonnttaall--ssccrroollll--mmooddee ((OOffff)) - When set to OOnn, makes readline use a single line for display, - scrolling the input horizontally on a single screen line when it - becomes longer than the screen width rather than wrapping to a - new line. - iinnppuutt--mmeettaa ((OOffff)) - If set to OOnn, readline will enable eight-bit input (that is, it - will not clear the eighth bit in the characters it reads), - regardless of what the terminal claims it can support. The name - mmeettaa--ffllaagg is a synonym for this variable. - iisseeaarrcchh--tteerrmmiinnaattoorrss ((````CC--[[ CC--JJ'''')) - The string of characters that should terminate an incremental - search without subsequently executing the character as a com- - mand. If this variable has not been given a value, the charac- - ters _E_S_C and _C_-_J will terminate an incremental search. - kkeeyymmaapp ((eemmaaccss)) - Set the current readline keymap. The set of legal keymap names - is _e_m_a_c_s_, _e_m_a_c_s_-_s_t_a_n_d_a_r_d_, _e_m_a_c_s_-_m_e_t_a_, _e_m_a_c_s_-_c_t_l_x_, _v_i_, _v_i_-_m_o_v_e_, - _v_i_-_c_o_m_m_a_n_d, and _v_i_-_i_n_s_e_r_t. _v_i is equivalent to _v_i_-_c_o_m_m_a_n_d; - _e_m_a_c_s is equivalent to _e_m_a_c_s_-_s_t_a_n_d_a_r_d. The default value is - _e_m_a_c_s. The value of eeddiittiinngg--mmooddee also affects the default - keymap. - mmaarrkk--ddiirreeccttoorriieess ((OOnn)) - If set to OOnn, completed directory names have a slash appended. - mmaarrkk--mmooddiiffiieedd--lliinneess ((OOffff)) - If set to OOnn, history lines that have been modified are dis- - played with a preceding asterisk (**). - mmaarrkk--ssyymmlliinnkkeedd--ddiirreeccttoorriieess ((OOffff)) - If set to OOnn, completed names which are symbolic links to direc- - tories have a slash appended (subject to the value of - mmaarrkk--ddiirreeccttoorriieess). - mmaattcchh--hhiiddddeenn--ffiilleess ((OOnn)) - This variable, when set to OOnn, causes readline to match files - whose names begin with a `.' (hidden files) when performing - filename completion, unless the leading `.' is supplied by the - user in the filename to be completed. - oouuttppuutt--mmeettaa ((OOffff)) - If set to OOnn, readline will display characters with the eighth - bit set directly rather than as a meta-prefixed escape sequence. - ppaaggee--ccoommpplleettiioonnss ((OOnn)) - If set to OOnn, readline uses an internal _m_o_r_e-like pager to dis- - play a screenful of possible completions at a time. - pprriinntt--ccoommpplleettiioonnss--hhoorriizzoonnttaallllyy ((OOffff)) - If set to OOnn, readline will display completions with matches - sorted horizontally in alphabetical order, rather than down the - screen. - sshhooww--aallll--iiff--aammbbiigguuoouuss ((OOffff)) - This alters the default behavior of the completion functions. - If set to oonn, words which have more than one possible completion - cause the matches to be listed immediately instead of ringing - the bell. - sshhooww--aallll--iiff--uunnmmooddiiffiieedd ((OOffff)) - This alters the default behavior of the completion functions in - a fashion similar to sshhooww--aallll--iiff--aammbbiigguuoouuss. If set to oonn, words - which have more than one possible completion without any possi- - ble partial completion (the possible completions don't share a - common prefix) cause the matches to be listed immediately - instead of ringing the bell. - vviissiibbllee--ssttaattss ((OOffff)) - If set to OOnn, a character denoting a file's type as reported by - _s_t_a_t(2) is appended to the filename when listing possible com- - pletions. - - CCoonnddiittiioonnaall CCoonnssttrruuccttss - Readline implements a facility similar in spirit to the conditional - compilation features of the C preprocessor which allows key bindings - and variable settings to be performed as the result of tests. There - are four parser directives used. - - $$iiff The $$iiff construct allows bindings to be made based on the edit- - ing mode, the terminal being used, or the application using - readline. The text of the test extends to the end of the line; - no characters are required to isolate it. - - mmooddee The mmooddee== form of the $$iiff directive is used to test - whether readline is in emacs or vi mode. This may be - used in conjunction with the sseett kkeeyymmaapp command, for - instance, to set bindings in the _e_m_a_c_s_-_s_t_a_n_d_a_r_d and - _e_m_a_c_s_-_c_t_l_x keymaps only if readline is starting out in - emacs mode. - - tteerrmm The tteerrmm== form may be used to include terminal-specific - key bindings, perhaps to bind the key sequences output by - the terminal's function keys. The word on the right side - of the == is tested against the full name of the terminal - and the portion of the terminal name before the first --. - This allows _s_u_n to match both _s_u_n and _s_u_n_-_c_m_d, for - instance. - - aapppplliiccaattiioonn - The aapppplliiccaattiioonn construct is used to include application- - specific settings. Each program using the readline - library sets the _a_p_p_l_i_c_a_t_i_o_n _n_a_m_e, and an initialization - file can test for a particular value. This could be used - to bind key sequences to functions useful for a specific - program. For instance, the following command adds a key - sequence that quotes the current or previous word in - Bash: - - $$iiff Bash - # Quote the current or previous word - "\C-xq": "\eb\"\ef\"" - $$eennddiiff - - $$eennddiiff This command, as seen in the previous example, terminates an $$iiff - command. - - $$eellssee Commands in this branch of the $$iiff directive are executed if the - test fails. - - $$iinncclluuddee - This directive takes a single filename as an argument and reads - commands and bindings from that file. For example, the follow- - ing directive would read _/_e_t_c_/_i_n_p_u_t_r_c: - - $$iinncclluuddee _/_e_t_c_/_i_n_p_u_t_r_c - -SSEEAARRCCHHIINNGG - Readline provides commands for searching through the command history - for lines containing a specified string. There are two search modes: - _i_n_c_r_e_m_e_n_t_a_l and _n_o_n_-_i_n_c_r_e_m_e_n_t_a_l. - - Incremental searches begin before the user has finished typing the - search string. As each character of the search string is typed, read- - line displays the next entry from the history matching the string typed - so far. An incremental search requires only as many characters as - needed to find the desired history entry. To search backward in the - history for a particular string, type CC--rr. Typing CC--ss searches forward - through the history. The characters present in the value of the - iisseeaarrcchh--tteerrmmiinnaattoorrss variable are used to terminate an incremental - search. If that variable has not been assigned a value the _E_s_c_a_p_e and - CC--JJ characters will terminate an incremental search. CC--GG will abort an - incremental search and restore the original line. When the search is - terminated, the history entry containing the search string becomes the - current line. - - To find other matching entries in the history list, type CC--ss or CC--rr as - appropriate. This will search backward or forward in the history for - the next line matching the search string typed so far. Any other key - sequence bound to a readline command will terminate the search and exe- - cute that command. For instance, a newline will terminate the search - and accept the line, thereby executing the command from the history - list. A movement command will terminate the search, make the last line - found the current line, and begin editing. - - Non-incremental searches read the entire search string before starting - to search for matching history lines. The search string may be typed - by the user or be part of the contents of the current line. - -EEDDIITTIINNGG CCOOMMMMAANNDDSS - The following is a list of the names of the commands and the default - key sequences to which they are bound. Command names without an accom- - panying key sequence are unbound by default. - - In the following descriptions, _p_o_i_n_t refers to the current cursor posi- - tion, and _m_a_r_k refers to a cursor position saved by the sseett--mmaarrkk com- - mand. The text between the point and mark is referred to as the - _r_e_g_i_o_n. - - CCoommmmaannddss ffoorr MMoovviinngg - bbeeggiinnnniinngg--ooff--lliinnee ((CC--aa)) - Move to the start of the current line. - eenndd--ooff--lliinnee ((CC--ee)) - Move to the end of the line. - ffoorrwwaarrdd--cchhaarr ((CC--ff)) - Move forward a character. - bbaacckkwwaarrdd--cchhaarr ((CC--bb)) - Move back a character. - ffoorrwwaarrdd--wwoorrdd ((MM--ff)) - Move forward to the end of the next word. Words are composed of - alphanumeric characters (letters and digits). - bbaacckkwwaarrdd--wwoorrdd ((MM--bb)) - Move back to the start of the current or previous word. Words - are composed of alphanumeric characters (letters and digits). - cclleeaarr--ssccrreeeenn ((CC--ll)) - Clear the screen leaving the current line at the top of the - screen. With an argument, refresh the current line without - clearing the screen. - rreeddrraaww--ccuurrrreenntt--lliinnee - Refresh the current line. - - CCoommmmaannddss ffoorr MMaanniippuullaattiinngg tthhee HHiissttoorryy - aacccceepptt--lliinnee ((NNeewwlliinnee,, RReettuurrnn)) - Accept the line regardless of where the cursor is. If this line - is non-empty, it may be added to the history list for future - recall with aadddd__hhiissttoorryy(()). If the line is a modified history - line, the history line is restored to its original state. - pprreevviioouuss--hhiissttoorryy ((CC--pp)) - Fetch the previous command from the history list, moving back in - the list. - nneexxtt--hhiissttoorryy ((CC--nn)) - Fetch the next command from the history list, moving forward in - the list. - bbeeggiinnnniinngg--ooff--hhiissttoorryy ((MM--<<)) - Move to the first line in the history. - eenndd--ooff--hhiissttoorryy ((MM-->>)) - Move to the end of the input history, i.e., the line currently - being entered. - rreevveerrssee--sseeaarrcchh--hhiissttoorryy ((CC--rr)) - Search backward starting at the current line and moving `up' - through the history as necessary. This is an incremental - search. - ffoorrwwaarrdd--sseeaarrcchh--hhiissttoorryy ((CC--ss)) - Search forward starting at the current line and moving `down' - through the history as necessary. This is an incremental - search. - nnoonn--iinnccrreemmeennttaall--rreevveerrssee--sseeaarrcchh--hhiissttoorryy ((MM--pp)) - Search backward through the history starting at the current line - using a non-incremental search for a string supplied by the - user. - nnoonn--iinnccrreemmeennttaall--ffoorrwwaarrdd--sseeaarrcchh--hhiissttoorryy ((MM--nn)) - Search forward through the history using a non-incremental - search for a string supplied by the user. - hhiissttoorryy--sseeaarrcchh--ffoorrwwaarrdd - Search forward through the history for the string of characters - between the start of the current line and the current cursor - position (the _p_o_i_n_t). This is a non-incremental search. - hhiissttoorryy--sseeaarrcchh--bbaacckkwwaarrdd - Search backward through the history for the string of characters - between the start of the current line and the point. This is a - non-incremental search. - yyaannkk--nntthh--aarrgg ((MM--CC--yy)) - Insert the first argument to the previous command (usually the - second word on the previous line) at point. With an argument _n, - insert the _nth word from the previous command (the words in the - previous command begin with word 0). A negative argument - inserts the _nth word from the end of the previous command. - yyaannkk--llaasstt--aarrgg ((MM--..,, MM--__)) - Insert the last argument to the previous command (the last word - of the previous history entry). With an argument, behave - exactly like yyaannkk--nntthh--aarrgg. Successive calls to yyaannkk--llaasstt--aarrgg - move back through the history list, inserting the last argument - of each line in turn. - - CCoommmmaannddss ffoorr CChhaannggiinngg TTeexxtt - ddeelleettee--cchhaarr ((CC--dd)) - Delete the character at point. If point is at the beginning of - the line, there are no characters in the line, and the last - character typed was not bound to ddeelleettee--cchhaarr, then return EEOOFF. - bbaacckkwwaarrdd--ddeelleettee--cchhaarr ((RRuubboouutt)) - Delete the character behind the cursor. When given a numeric - argument, save the deleted text on the kill ring. - ffoorrwwaarrdd--bbaacckkwwaarrdd--ddeelleettee--cchhaarr - Delete the character under the cursor, unless the cursor is at - the end of the line, in which case the character behind the cur- - sor is deleted. - qquuootteedd--iinnsseerrtt ((CC--qq,, CC--vv)) - Add the next character that you type to the line verbatim. This - is how to insert characters like CC--qq, for example. - ttaabb--iinnsseerrtt ((MM--TTAABB)) - Insert a tab character. - sseellff--iinnsseerrtt ((aa,, bb,, AA,, 11,, !!,, ......)) - Insert the character typed. - ttrraannssppoossee--cchhaarrss ((CC--tt)) - Drag the character before point forward over the character at - point, moving point forward as well. If point is at the end of - the line, then this transposes the two characters before point. - Negative arguments have no effect. - ttrraannssppoossee--wwoorrddss ((MM--tt)) - Drag the word before point past the word after point, moving - point over that word as well. If point is at the end of the - line, this transposes the last two words on the line. - uuppccaassee--wwoorrdd ((MM--uu)) - Uppercase the current (or following) word. With a negative - argument, uppercase the previous word, but do not move point. - ddoowwnnccaassee--wwoorrdd ((MM--ll)) - Lowercase the current (or following) word. With a negative - argument, lowercase the previous word, but do not move point. - ccaappiittaalliizzee--wwoorrdd ((MM--cc)) - Capitalize the current (or following) word. With a negative - argument, capitalize the previous word, but do not move point. - oovveerrwwrriittee--mmooddee - Toggle overwrite mode. With an explicit positive numeric argu- - ment, switches to overwrite mode. With an explicit non-positive - numeric argument, switches to insert mode. This command affects - only eemmaaccss mode; vvii mode does overwrite differently. Each call - to _r_e_a_d_l_i_n_e_(_) starts in insert mode. In overwrite mode, charac- - ters bound to sseellff--iinnsseerrtt replace the text at point rather than - pushing the text to the right. Characters bound to bbaacckk-- - wwaarrdd--ddeelleettee--cchhaarr replace the character before point with a - space. By default, this command is unbound. - - KKiilllliinngg aanndd YYaannkkiinngg - kkiillll--lliinnee ((CC--kk)) - Kill the text from point to the end of the line. - bbaacckkwwaarrdd--kkiillll--lliinnee ((CC--xx RRuubboouutt)) - Kill backward to the beginning of the line. - uunniixx--lliinnee--ddiissccaarrdd ((CC--uu)) - Kill backward from point to the beginning of the line. The - killed text is saved on the kill-ring. - kkiillll--wwhhoollee--lliinnee - Kill all characters on the current line, no matter where point - is. - kkiillll--wwoorrdd ((MM--dd)) - Kill from point the end of the current word, or if between - words, to the end of the next word. Word boundaries are the - same as those used by ffoorrwwaarrdd--wwoorrdd. - bbaacckkwwaarrdd--kkiillll--wwoorrdd ((MM--RRuubboouutt)) - Kill the word behind point. Word boundaries are the same as - those used by bbaacckkwwaarrdd--wwoorrdd. - uunniixx--wwoorrdd--rruubboouutt ((CC--ww)) - Kill the word behind point, using white space as a word bound- - ary. The killed text is saved on the kill-ring. - uunniixx--ffiilleennaammee--rruubboouutt - Kill the word behind point, using white space and the slash - character as the word boundaries. The killed text is saved on - the kill-ring. - ddeelleettee--hhoorriizzoonnttaall--ssppaaccee ((MM--\\)) - Delete all spaces and tabs around point. - kkiillll--rreeggiioonn - Kill the text between the point and _m_a_r_k (saved cursor posi- - tion). This text is referred to as the _r_e_g_i_o_n. - ccooppyy--rreeggiioonn--aass--kkiillll - Copy the text in the region to the kill buffer. - ccooppyy--bbaacckkwwaarrdd--wwoorrdd - Copy the word before point to the kill buffer. The word bound- - aries are the same as bbaacckkwwaarrdd--wwoorrdd. - ccooppyy--ffoorrwwaarrdd--wwoorrdd - Copy the word following point to the kill buffer. The word - boundaries are the same as ffoorrwwaarrdd--wwoorrdd. - yyaannkk ((CC--yy)) - Yank the top of the kill ring into the buffer at point. - yyaannkk--ppoopp ((MM--yy)) - Rotate the kill ring, and yank the new top. Only works follow- - ing yyaannkk or yyaannkk--ppoopp. - - NNuummeerriicc AArrgguummeennttss - ddiiggiitt--aarrgguummeenntt ((MM--00,, MM--11,, ......,, MM----)) - Add this digit to the argument already accumulating, or start a - new argument. M-- starts a negative argument. - uunniivveerrssaall--aarrgguummeenntt - This is another way to specify an argument. If this command is - followed by one or more digits, optionally with a leading minus - sign, those digits define the argument. If the command is fol- - lowed by digits, executing uunniivveerrssaall--aarrgguummeenntt again ends the - numeric argument, but is otherwise ignored. As a special case, - if this command is immediately followed by a character that is - neither a digit or minus sign, the argument count for the next - command is multiplied by four. The argument count is initially - one, so executing this function the first time makes the argu- - ment count four, a second time makes the argument count sixteen, - and so on. - - CCoommpplleettiinngg - ccoommpplleettee ((TTAABB)) - Attempt to perform completion on the text before point. The - actual completion performed is application-specific. BBaasshh, for - instance, attempts completion treating the text as a variable - (if the text begins with $$), username (if the text begins with - ~~), hostname (if the text begins with @@), or command (including - aliases and functions) in turn. If none of these produces a - match, filename completion is attempted. GGddbb, on the other - hand, allows completion of program functions and variables, and - only attempts filename completion under certain circumstances. - ppoossssiibbllee--ccoommpplleettiioonnss ((MM--??)) - List the possible completions of the text before point. - iinnsseerrtt--ccoommpplleettiioonnss ((MM--**)) - Insert all completions of the text before point that would have - been generated by ppoossssiibbllee--ccoommpplleettiioonnss. - mmeennuu--ccoommpplleettee - Similar to ccoommpplleettee, but replaces the word to be completed with - a single match from the list of possible completions. Repeated - execution of mmeennuu--ccoommpplleettee steps through the list of possible - completions, inserting each match in turn. At the end of the - list of completions, the bell is rung (subject to the setting of - bbeellll--ssttyyllee) and the original text is restored. An argument of _n - moves _n positions forward in the list of matches; a negative - argument may be used to move backward through the list. This - command is intended to be bound to TTAABB, but is unbound by - default. - ddeelleettee--cchhaarr--oorr--lliisstt - Deletes the character under the cursor if not at the beginning - or end of the line (like ddeelleettee--cchhaarr). If at the end of the - line, behaves identically to ppoossssiibbllee--ccoommpplleettiioonnss. - - KKeeyybbooaarrdd MMaaccrrooss - ssttaarrtt--kkbbdd--mmaaccrroo ((CC--xx (()) - Begin saving the characters typed into the current keyboard - macro. - eenndd--kkbbdd--mmaaccrroo ((CC--xx )))) - Stop saving the characters typed into the current keyboard macro - and store the definition. - ccaallll--llaasstt--kkbbdd--mmaaccrroo ((CC--xx ee)) - Re-execute the last keyboard macro defined, by making the char- - acters in the macro appear as if typed at the keyboard. - - MMiisscceellllaanneeoouuss - rree--rreeaadd--iinniitt--ffiillee ((CC--xx CC--rr)) - Read in the contents of the _i_n_p_u_t_r_c file, and incorporate any - bindings or variable assignments found there. - aabboorrtt ((CC--gg)) - Abort the current editing command and ring the terminal's bell - (subject to the setting of bbeellll--ssttyyllee). - ddoo--uuppppeerrccaassee--vveerrssiioonn ((MM--aa,, MM--bb,, MM--_x,, ......)) - If the metafied character _x is lowercase, run the command that - is bound to the corresponding uppercase character. - pprreeffiixx--mmeettaa ((EESSCC)) - Metafy the next character typed. EESSCC ff is equivalent to MMeettaa--ff. - uunnddoo ((CC--__,, CC--xx CC--uu)) - Incremental undo, separately remembered for each line. - rreevveerrtt--lliinnee ((MM--rr)) - Undo all changes made to this line. This is like executing the - uunnddoo command enough times to return the line to its initial - state. - ttiillddee--eexxppaanndd ((MM--&&)) - Perform tilde expansion on the current word. - sseett--mmaarrkk ((CC--@@,, MM--<>)) - Set the mark to the point. If a numeric argument is supplied, - the mark is set to that position. - eexxcchhaannggee--ppooiinntt--aanndd--mmaarrkk ((CC--xx CC--xx)) - Swap the point with the mark. The current cursor position is - set to the saved position, and the old cursor position is saved - as the mark. - cchhaarraacctteerr--sseeaarrcchh ((CC--]])) - A character is read and point is moved to the next occurrence of - that character. A negative count searches for previous occur- - rences. - cchhaarraacctteerr--sseeaarrcchh--bbaacckkwwaarrdd ((MM--CC--]])) - A character is read and point is moved to the previous occur- - rence of that character. A negative count searches for subse- - quent occurrences. - iinnsseerrtt--ccoommmmeenntt ((MM--##)) - Without a numeric argument, the value of the readline ccoomm-- - mmeenntt--bbeeggiinn variable is inserted at the beginning of the current - line. If a numeric argument is supplied, this command acts as a - toggle: if the characters at the beginning of the line do not - match the value of ccoommmmeenntt--bbeeggiinn, the value is inserted, other- - wise the characters in ccoommmmeenntt--bbeeggiinn are deleted from the begin- - ning of the line. In either case, the line is accepted as if a - newline had been typed. The default value of ccoommmmeenntt--bbeeggiinn - makes the current line a shell comment. If a numeric argument - causes the comment character to be removed, the line will be - executed by the shell. - dduummpp--ffuunnccttiioonnss - Print all of the functions and their key bindings to the read- - line output stream. If a numeric argument is supplied, the out- - put is formatted in such a way that it can be made part of an - _i_n_p_u_t_r_c file. - dduummpp--vvaarriiaabblleess - Print all of the settable variables and their values to the - readline output stream. If a numeric argument is supplied, the - output is formatted in such a way that it can be made part of an - _i_n_p_u_t_r_c file. - dduummpp--mmaaccrrooss - Print all of the readline key sequences bound to macros and the - strings they output. If a numeric argument is supplied, the - output is formatted in such a way that it can be made part of an - _i_n_p_u_t_r_c file. - eemmaaccss--eeddiittiinngg--mmooddee ((CC--ee)) - When in vvii command mode, this causes a switch to eemmaaccss editing - mode. - vvii--eeddiittiinngg--mmooddee ((MM--CC--jj)) - When in eemmaaccss editing mode, this causes a switch to vvii editing - mode. - -DDEEFFAAUULLTT KKEEYY BBIINNDDIINNGGSS - The following is a list of the default emacs and vi bindings. Charac- - ters with the eighth bit set are written as M-, and are - referred to as _m_e_t_a_f_i_e_d characters. The printable ASCII characters not - mentioned in the list of emacs standard bindings are bound to the - sseellff--iinnsseerrtt function, which just inserts the given character into the - input line. In vi insertion mode, all characters not specifically men- - tioned are bound to sseellff--iinnsseerrtt. Characters assigned to signal genera- - tion by _s_t_t_y(1) or the terminal driver, such as C-Z or C-C, retain that - function. Upper and lower case metafied characters are bound to the - same function in the emacs mode meta keymap. The remaining characters - are unbound, which causes readline to ring the bell (subject to the - setting of the bbeellll--ssttyyllee variable). - - EEmmaaccss MMooddee - Emacs Standard bindings - - "C-@" set-mark - "C-A" beginning-of-line - "C-B" backward-char - "C-D" delete-char - "C-E" end-of-line - "C-F" forward-char - "C-G" abort - "C-H" backward-delete-char - "C-I" complete - "C-J" accept-line - "C-K" kill-line - "C-L" clear-screen - "C-M" accept-line - "C-N" next-history - "C-P" previous-history - "C-Q" quoted-insert - "C-R" reverse-search-history - "C-S" forward-search-history - "C-T" transpose-chars - "C-U" unix-line-discard - "C-V" quoted-insert - "C-W" unix-word-rubout - "C-Y" yank - "C-]" character-search - "C-_" undo - " " to "/" self-insert - "0" to "9" self-insert - ":" to "~" self-insert - "C-?" backward-delete-char - - Emacs Meta bindings - - "M-C-G" abort - "M-C-H" backward-kill-word - "M-C-I" tab-insert - "M-C-J" vi-editing-mode - "M-C-M" vi-editing-mode - "M-C-R" revert-line - "M-C-Y" yank-nth-arg - "M-C-[" complete - "M-C-]" character-search-backward - "M-space" set-mark - "M-#" insert-comment - "M-&" tilde-expand - "M-*" insert-completions - "M--" digit-argument - "M-." yank-last-arg - "M-0" digit-argument - "M-1" digit-argument - "M-2" digit-argument - "M-3" digit-argument - "M-4" digit-argument - "M-5" digit-argument - "M-6" digit-argument - "M-7" digit-argument - "M-8" digit-argument - "M-9" digit-argument - "M-<" beginning-of-history - "M-=" possible-completions - "M->" end-of-history - "M-?" possible-completions - "M-B" backward-word - "M-C" capitalize-word - "M-D" kill-word - "M-F" forward-word - "M-L" downcase-word - "M-N" non-incremental-forward-search-history - "M-P" non-incremental-reverse-search-history - "M-R" revert-line - "M-T" transpose-words - "M-U" upcase-word - "M-Y" yank-pop - "M-\" delete-horizontal-space - "M-~" tilde-expand - "M-C-?" backward-kill-word - "M-_" yank-last-arg - - Emacs Control-X bindings - - "C-XC-G" abort - "C-XC-R" re-read-init-file - "C-XC-U" undo - "C-XC-X" exchange-point-and-mark - "C-X(" start-kbd-macro - "C-X)" end-kbd-macro - "C-XE" call-last-kbd-macro - "C-XC-?" backward-kill-line - - - VVII MMooddee bbiinnddiinnggss - VI Insert Mode functions - - "C-D" vi-eof-maybe - "C-H" backward-delete-char - "C-I" complete - "C-J" accept-line - "C-M" accept-line - "C-R" reverse-search-history - "C-S" forward-search-history - "C-T" transpose-chars - "C-U" unix-line-discard - "C-V" quoted-insert - "C-W" unix-word-rubout - "C-Y" yank - "C-[" vi-movement-mode - "C-_" undo - " " to "~" self-insert - "C-?" backward-delete-char - - VI Command Mode functions - - "C-D" vi-eof-maybe - "C-E" emacs-editing-mode - "C-G" abort - "C-H" backward-char - "C-J" accept-line - "C-K" kill-line - "C-L" clear-screen - "C-M" accept-line - "C-N" next-history - "C-P" previous-history - "C-Q" quoted-insert - "C-R" reverse-search-history - "C-S" forward-search-history - "C-T" transpose-chars - "C-U" unix-line-discard - "C-V" quoted-insert - "C-W" unix-word-rubout - "C-Y" yank - "C-_" vi-undo - " " forward-char - "#" insert-comment - "$" end-of-line - "%" vi-match - "&" vi-tilde-expand - "*" vi-complete - "+" next-history - "," vi-char-search - "-" previous-history - "." vi-redo - "/" vi-search - "0" beginning-of-line - "1" to "9" vi-arg-digit - ";" vi-char-search - "=" vi-complete - "?" vi-search - "A" vi-append-eol - "B" vi-prev-word - "C" vi-change-to - "D" vi-delete-to - "E" vi-end-word - "F" vi-char-search - "G" vi-fetch-history - "I" vi-insert-beg - "N" vi-search-again - "P" vi-put - "R" vi-replace - "S" vi-subst - "T" vi-char-search - "U" revert-line - "W" vi-next-word - "X" backward-delete-char - "Y" vi-yank-to - "\" vi-complete - "^" vi-first-print - "_" vi-yank-arg - "`" vi-goto-mark - "a" vi-append-mode - "b" vi-prev-word - "c" vi-change-to - "d" vi-delete-to - "e" vi-end-word - "f" vi-char-search - "h" backward-char - "i" vi-insertion-mode - "j" next-history - "k" prev-history - "l" forward-char - "m" vi-set-mark - "n" vi-search-again - "p" vi-put - "r" vi-change-char - "s" vi-subst - "t" vi-char-search - "u" vi-undo - "w" vi-next-word - "x" vi-delete - "y" vi-yank-to - "|" vi-column - "~" vi-change-case - -SSEEEE AALLSSOO - _T_h_e _G_n_u _R_e_a_d_l_i_n_e _L_i_b_r_a_r_y, Brian Fox and Chet Ramey - _T_h_e _G_n_u _H_i_s_t_o_r_y _L_i_b_r_a_r_y, Brian Fox and Chet Ramey - _b_a_s_h(1) - -FFIILLEESS - _~_/_._i_n_p_u_t_r_c - Individual rreeaaddlliinnee initialization file - -AAUUTTHHOORRSS - Brian Fox, Free Software Foundation - bfox@gnu.org - - Chet Ramey, Case Western Reserve University - chet@ins.CWRU.Edu - -BBUUGG RREEPPOORRTTSS - If you find a bug in rreeaaddlliinnee,, you should report it. But first, you - should make sure that it really is a bug, and that it appears in the - latest version of the rreeaaddlliinnee library that you have. - - Once you have determined that a bug actually exists, mail a bug report - to _b_u_g_-_r_e_a_d_l_i_n_e@_g_n_u_._o_r_g. If you have a fix, you are welcome to mail - that as well! Suggestions and `philosophical' bug reports may be - mailed to _b_u_g_-_r_e_a_d_l_i_n_e@_g_n_u_._o_r_g or posted to the Usenet newsgroup - ggnnuu..bbaasshh..bbuugg. - - Comments and bug reports concerning this manual page should be directed - to _c_h_e_t_@_i_n_s_._C_W_R_U_._E_d_u. - -BBUUGGSS - It's too big and too slow. - - - -GNU Readline 5.0 2004 January 28 READLINE(3) diff --git a/dep/src/readline/src/doc/readline.3 b/dep/src/readline/src/doc/readline.3 deleted file mode 100644 index 560bbe72bc5..00000000000 --- a/dep/src/readline/src/doc/readline.3 +++ /dev/null @@ -1,1287 +0,0 @@ -.\" -.\" MAN PAGE COMMENTS to -.\" -.\" Chet Ramey -.\" Information Network Services -.\" Case Western Reserve University -.\" chet@ins.CWRU.Edu -.\" -.\" Last Change: Wed Jan 28 15:43:53 EST 2004 -.\" -.TH READLINE 3 "2004 January 28" "GNU Readline 5.0" -.\" -.\" File Name macro. This used to be `.PN', for Path Name, -.\" but Sun doesn't seem to like that very much. -.\" -.de FN -\fI\|\\$1\|\fP -.. -.SH NAME -readline \- get a line from a user with editing -.SH SYNOPSIS -.LP -.nf -.ft B -#include -#include -#include -.ft -.fi -.LP -.nf -\fIchar *\fP -.br -\fBreadline\fP (\fIconst char *prompt\fP); -.fi -.SH COPYRIGHT -.if n Readline is Copyright (C) 1989\-2004 by the Free Software Foundation, Inc. -.if t Readline is Copyright \(co 1989\-2004 by the Free Software Foundation, Inc. -.SH DESCRIPTION -.LP -.B readline -will read a line from the terminal -and return it, using -.B prompt -as a prompt. If -.B prompt -is \fBNULL\fP or the empty string, no prompt is issued. -The line returned is allocated with -.IR malloc (3); -the caller must free it when finished. The line returned -has the final newline removed, so only the text of the line -remains. -.LP -.B readline -offers editing capabilities while the user is entering the -line. -By default, the line editing commands -are similar to those of emacs. -A vi\-style line editing interface is also available. -.LP -This manual page describes only the most basic use of \fBreadline\fP. -Much more functionality is available; see -\fIThe GNU Readline Library\fP and \fIThe GNU History Library\fP -for additional information. -.SH RETURN VALUE -.LP -.B readline -returns the text of the line read. A blank line -returns the empty string. If -.B EOF -is encountered while reading a line, and the line is empty, -.B NULL -is returned. If an -.B EOF -is read with a non\-empty line, it is -treated as a newline. -.SH NOTATION -.LP -An emacs-style notation is used to denote -keystrokes. Control keys are denoted by C\-\fIkey\fR, e.g., C\-n -means Control\-N. Similarly, -.I meta -keys are denoted by M\-\fIkey\fR, so M\-x means Meta\-X. (On keyboards -without a -.I meta -key, M\-\fIx\fP means ESC \fIx\fP, i.e., press the Escape key -then the -.I x -key. This makes ESC the \fImeta prefix\fP. -The combination M\-C\-\fIx\fP means ESC\-Control\-\fIx\fP, -or press the Escape key -then hold the Control key while pressing the -.I x -key.) -.PP -Readline commands may be given numeric -.IR arguments , -which normally act as a repeat count. Sometimes, however, it is the -sign of the argument that is significant. Passing a negative argument -to a command that acts in the forward direction (e.g., \fBkill\-line\fP) -causes that command to act in a backward direction. Commands whose -behavior with arguments deviates from this are noted. -.PP -When a command is described as \fIkilling\fP text, the text -deleted is saved for possible future retrieval -(\fIyanking\fP). The killed text is saved in a -\fIkill ring\fP. Consecutive kills cause the text to be -accumulated into one unit, which can be yanked all at once. -Commands which do not kill text separate the chunks of text -on the kill ring. -.SH INITIALIZATION FILE -.LP -Readline is customized by putting commands in an initialization -file (the \fIinputrc\fP file). -The name of this file is taken from the value of the -.B INPUTRC -environment variable. If that variable is unset, the default is -.IR ~/.inputrc . -When a program which uses the readline library starts up, the -init file is read, and the key bindings and variables are set. -There are only a few basic constructs allowed in the -readline init file. Blank lines are ignored. -Lines beginning with a \fB#\fP are comments. -Lines beginning with a \fB$\fP indicate conditional constructs. -Other lines denote key bindings and variable settings. -Each program using this library may add its own commands -and bindings. -.PP -For example, placing -.RS -.PP -M\-Control\-u: universal\-argument -.RE -or -.RS -C\-Meta\-u: universal\-argument -.RE -.sp -into the -.I inputrc -would make M\-C\-u execute the readline command -.IR universal\-argument . -.PP -The following symbolic character names are recognized while -processing key bindings: -.IR DEL , -.IR ESC , -.IR ESCAPE , -.IR LFD , -.IR NEWLINE , -.IR RET , -.IR RETURN , -.IR RUBOUT , -.IR SPACE , -.IR SPC , -and -.IR TAB . -.PP -In addition to command names, readline allows keys to be bound -to a string that is inserted when the key is pressed (a \fImacro\fP). -.PP -.SS Key Bindings -.PP -The syntax for controlling key bindings in the -.I inputrc -file is simple. All that is required is the name of the -command or the text of a macro and a key sequence to which -it should be bound. The name may be specified in one of two ways: -as a symbolic key name, possibly with \fIMeta\-\fP or \fIControl\-\fP -prefixes, or as a key sequence. -.PP -When using the form \fBkeyname\fP:\^\fIfunction-name\fP or \fImacro\fP, -.I keyname -is the name of a key spelled out in English. For example: -.sp -.RS -Control\-u: universal\-argument -.br -Meta\-Rubout: backward\-kill\-word -.br -Control\-o: "> output" -.RE -.LP -In the above example, -.I C\-u -is bound to the function -.BR universal\-argument , -.I M-DEL -is bound to the function -.BR backward\-kill\-word , -and -.I C\-o -is bound to run the macro -expressed on the right hand side (that is, to insert the text -.if t \f(CW> output\fP -.if n ``> output'' -into the line). -.PP -In the second form, \fB"keyseq"\fP:\^\fIfunction\-name\fP or \fImacro\fP, -.B keyseq -differs from -.B keyname -above in that strings denoting -an entire key sequence may be specified by placing the sequence -within double quotes. Some GNU Emacs style key escapes can be -used, as in the following example, but the symbolic character names -are not recognized. -.sp -.RS -"\eC\-u": universal\-argument -.br -"\eC\-x\eC\-r": re\-read\-init\-file -.br -"\ee[11~": "Function Key 1" -.RE -.PP -In this example, -.I C-u -is again bound to the function -.BR universal\-argument . -.I "C-x C-r" -is bound to the function -.BR re\-read\-init\-file , -and -.I "ESC [ 1 1 ~" -is bound to insert the text -.if t \f(CWFunction Key 1\fP. -.if n ``Function Key 1''. -.PP -The full set of GNU Emacs style escape sequences available when specifying -key sequences is -.RS -.PD 0 -.TP -.B \eC\- -control prefix -.TP -.B \eM\- -meta prefix -.TP -.B \ee -an escape character -.TP -.B \e\e -backslash -.TP -.B \e" -literal ", a double quote -.TP -.B \e' -literal ', a single quote -.RE -.PD -.PP -In addition to the GNU Emacs style escape sequences, a second -set of backslash escapes is available: -.RS -.PD 0 -.TP -.B \ea -alert (bell) -.TP -.B \eb -backspace -.TP -.B \ed -delete -.TP -.B \ef -form feed -.TP -.B \en -newline -.TP -.B \er -carriage return -.TP -.B \et -horizontal tab -.TP -.B \ev -vertical tab -.TP -.B \e\fInnn\fP -the eight-bit character whose value is the octal value \fInnn\fP -(one to three digits) -.TP -.B \ex\fIHH\fP -the eight-bit character whose value is the hexadecimal value \fIHH\fP -(one or two hex digits) -.RE -.PD -.PP -When entering the text of a macro, single or double quotes should -be used to indicate a macro definition. Unquoted text -is assumed to be a function name. -In the macro body, the backslash escapes described above are expanded. -Backslash will quote any other character in the macro text, -including " and '. -.PP -.B Bash -allows the current readline key bindings to be displayed or modified -with the -.B bind -builtin command. The editing mode may be switched during interactive -use by using the -.B \-o -option to the -.B set -builtin command. Other programs using this library provide -similar mechanisms. The -.I inputrc -file may be edited and re-read if a program does not provide -any other means to incorporate new bindings. -.SS Variables -.PP -Readline has variables that can be used to further customize its -behavior. A variable may be set in the -.I inputrc -file with a statement of the form -.RS -.PP -\fBset\fP \fIvariable\-name\fP \fIvalue\fP -.RE -.PP -Except where noted, readline variables can take the values -.B On -or -.B Off -(without regard to case). -The variables and their default values are: -.PP -.PD 0 -.TP -.B bell\-style (audible) -Controls what happens when readline wants to ring the terminal bell. -If set to \fBnone\fP, readline never rings the bell. If set to -\fBvisible\fP, readline uses a visible bell if one is available. -If set to \fBaudible\fP, readline attempts to ring the terminal's bell. -.TP -.B comment\-begin (``#'') -The string that is inserted in \fBvi\fP mode when the -.B insert\-comment -command is executed. -This command is bound to -.B M\-# -in emacs mode and to -.B # -in vi command mode. -.TP -.B completion\-ignore\-case (Off) -If set to \fBOn\fP, readline performs filename matching and completion -in a case\-insensitive fashion. -.TP -.B completion\-query\-items (100) -This determines when the user is queried about viewing -the number of possible completions -generated by the \fBpossible\-completions\fP command. -It may be set to any integer value greater than or equal to -zero. If the number of possible completions is greater than -or equal to the value of this variable, the user is asked whether -or not he wishes to view them; otherwise they are simply listed -on the terminal. -.TP -.B convert\-meta (On) -If set to \fBOn\fP, readline will convert characters with the -eighth bit set to an ASCII key sequence -by stripping the eighth bit and prefixing it with an -escape character (in effect, using escape as the \fImeta prefix\fP). -.TP -.B disable\-completion (Off) -If set to \fBOn\fP, readline will inhibit word completion. Completion -characters will be inserted into the line as if they had been -mapped to \fBself-insert\fP. -.TP -.B editing\-mode (emacs) -Controls whether readline begins with a set of key bindings similar -to emacs or vi. -.B editing\-mode -can be set to either -.B emacs -or -.BR vi . -.TP -.B enable\-keypad (Off) -When set to \fBOn\fP, readline will try to enable the application -keypad when it is called. Some systems need this to enable the -arrow keys. -.TP -.B expand\-tilde (Off) -If set to \fBon\fP, tilde expansion is performed when readline -attempts word completion. -.TP -.B history-preserve-point -If set to \fBon\fP, the history code attempts to place point at the -same location on each history line retrived with \fBprevious-history\fP -or \fBnext-history\fP. -.TP -.B horizontal\-scroll\-mode (Off) -When set to \fBOn\fP, makes readline use a single line for display, -scrolling the input horizontally on a single screen line when it -becomes longer than the screen width rather than wrapping to a new line. -.TP -.B input\-meta (Off) -If set to \fBOn\fP, readline will enable eight-bit input (that is, -it will not clear the eighth bit in the characters it reads), -regardless of what the terminal claims it can support. The name -.B meta\-flag -is a synonym for this variable. -.TP -.B isearch\-terminators (``C\-[ C\-J'') -The string of characters that should terminate an incremental -search without subsequently executing the character as a command. -If this variable has not been given a value, the characters -\fIESC\fP and \fIC\-J\fP will terminate an incremental search. -.TP -.B keymap (emacs) -Set the current readline keymap. The set of legal keymap names is -\fIemacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move, -vi-command\fP, and -.IR vi-insert . -\fIvi\fP is equivalent to \fIvi-command\fP; \fIemacs\fP is -equivalent to \fIemacs-standard\fP. The default value is -.IR emacs . -The value of -.B editing\-mode -also affects the default keymap. -.TP -.B mark\-directories (On) -If set to \fBOn\fP, completed directory names have a slash -appended. -.TP -.B mark\-modified\-lines (Off) -If set to \fBOn\fP, history lines that have been modified are displayed -with a preceding asterisk (\fB*\fP). -.TP -.B mark\-symlinked\-directories (Off) -If set to \fBOn\fP, completed names which are symbolic links to directories -have a slash appended (subject to the value of -\fBmark\-directories\fP). -.TP -.B match\-hidden\-files (On) -This variable, when set to \fBOn\fP, causes readline to match files whose -names begin with a `.' (hidden files) when performing filename -completion, unless the leading `.' is -supplied by the user in the filename to be completed. -.TP -.B output\-meta (Off) -If set to \fBOn\fP, readline will display characters with the -eighth bit set directly rather than as a meta-prefixed escape -sequence. -.TP -.B page\-completions (On) -If set to \fBOn\fP, readline uses an internal \fImore\fP-like pager -to display a screenful of possible completions at a time. -.TP -.B print\-completions\-horizontally (Off) -If set to \fBOn\fP, readline will display completions with matches -sorted horizontally in alphabetical order, rather than down the screen. -.TP -.B show\-all\-if\-ambiguous (Off) -This alters the default behavior of the completion functions. If -set to -.BR on , -words which have more than one possible completion cause the -matches to be listed immediately instead of ringing the bell. -.TP -.B show\-all\-if\-unmodified (Off) -This alters the default behavior of the completion functions in -a fashion similar to \fBshow\-all\-if\-ambiguous\fP. -If set to -.BR on , -words which have more than one possible completion without any -possible partial completion (the possible completions don't share -a common prefix) cause the matches to be listed immediately instead -of ringing the bell. -.TP -.B visible\-stats (Off) -If set to \fBOn\fP, a character denoting a file's type as reported -by \fIstat\fP(2) is appended to the filename when listing possible -completions. -.PD -.SS Conditional Constructs -.PP -Readline implements a facility similar in spirit to the conditional -compilation features of the C preprocessor which allows key -bindings and variable settings to be performed as the result -of tests. There are four parser directives used. -.IP \fB$if\fP -The -.B $if -construct allows bindings to be made based on the -editing mode, the terminal being used, or the application using -readline. The text of the test extends to the end of the line; -no characters are required to isolate it. -.RS -.IP \fBmode\fP -The \fBmode=\fP form of the \fB$if\fP directive is used to test -whether readline is in emacs or vi mode. -This may be used in conjunction -with the \fBset keymap\fP command, for instance, to set bindings in -the \fIemacs-standard\fP and \fIemacs-ctlx\fP keymaps only if -readline is starting out in emacs mode. -.IP \fBterm\fP -The \fBterm=\fP form may be used to include terminal-specific -key bindings, perhaps to bind the key sequences output by the -terminal's function keys. The word on the right side of the -.B = -is tested against the full name of the terminal and the portion -of the terminal name before the first \fB\-\fP. This allows -.I sun -to match both -.I sun -and -.IR sun\-cmd , -for instance. -.IP \fBapplication\fP -The \fBapplication\fP construct is used to include -application-specific settings. Each program using the readline -library sets the \fIapplication name\fP, and an initialization -file can test for a particular value. -This could be used to bind key sequences to functions useful for -a specific program. For instance, the following command adds a -key sequence that quotes the current or previous word in Bash: -.sp 1 -.RS -.nf -\fB$if\fP Bash -# Quote the current or previous word -"\eC-xq": "\eeb\e"\eef\e"" -\fB$endif\fP -.fi -.RE -.RE -.IP \fB$endif\fP -This command, as seen in the previous example, terminates an -\fB$if\fP command. -.IP \fB$else\fP -Commands in this branch of the \fB$if\fP directive are executed if -the test fails. -.IP \fB$include\fP -This directive takes a single filename as an argument and reads commands -and bindings from that file. For example, the following directive -would read \fI/etc/inputrc\fP: -.sp 1 -.RS -.nf -\fB$include\fP \^ \fI/etc/inputrc\fP -.fi -.RE -.SH SEARCHING -.PP -Readline provides commands for searching through the command history -for lines containing a specified string. -There are two search modes: -.I incremental -and -.IR non-incremental . -.PP -Incremental searches begin before the user has finished typing the -search string. -As each character of the search string is typed, readline displays -the next entry from the history matching the string typed so far. -An incremental search requires only as many characters as needed to -find the desired history entry. -To search backward in the history for a particular string, type -\fBC\-r\fP. Typing \fBC\-s\fP searches forward through the history. -The characters present in the value of the \fBisearch-terminators\fP -variable are used to terminate an incremental search. -If that variable has not been assigned a value the \fIEscape\fP and -\fBC\-J\fP characters will terminate an incremental search. -\fBC\-G\fP will abort an incremental search and restore the original -line. -When the search is terminated, the history entry containing the -search string becomes the current line. -.PP -To find other matching entries in the history list, type \fBC\-s\fP or -\fBC\-r\fP as appropriate. -This will search backward or forward in the history for the next -line matching the search string typed so far. -Any other key sequence bound to a readline command will terminate -the search and execute that command. -For instance, a newline will terminate the search and accept -the line, thereby executing the command from the history list. -A movement command will terminate the search, make the last line found -the current line, and begin editing. -.PP -Non-incremental searches read the entire search string before starting -to search for matching history lines. The search string may be -typed by the user or be part of the contents of the current line. -.SH EDITING COMMANDS -.PP -The following is a list of the names of the commands and the default -key sequences to which they are bound. -Command names without an accompanying key sequence are unbound by default. -.PP -In the following descriptions, \fIpoint\fP refers to the current cursor -position, and \fImark\fP refers to a cursor position saved by the -\fBset\-mark\fP command. -The text between the point and mark is referred to as the \fIregion\fP. -.SS Commands for Moving -.PP -.PD 0 -.TP -.B beginning\-of\-line (C\-a) -Move to the start of the current line. -.TP -.B end\-of\-line (C\-e) -Move to the end of the line. -.TP -.B forward\-char (C\-f) -Move forward a character. -.TP -.B backward\-char (C\-b) -Move back a character. -.TP -.B forward\-word (M\-f) -Move forward to the end of the next word. Words are composed of -alphanumeric characters (letters and digits). -.TP -.B backward\-word (M\-b) -Move back to the start of the current or previous word. Words are -composed of alphanumeric characters (letters and digits). -.TP -.B clear\-screen (C\-l) -Clear the screen leaving the current line at the top of the screen. -With an argument, refresh the current line without clearing the -screen. -.TP -.B redraw\-current\-line -Refresh the current line. -.PD -.SS Commands for Manipulating the History -.PP -.PD 0 -.TP -.B accept\-line (Newline, Return) -Accept the line regardless of where the cursor is. -If this line is -non-empty, it may be added to the history list for future recall with -\fBadd_history()\fP. -If the line is a modified history line, the history line is restored to its original state. -.TP -.B previous\-history (C\-p) -Fetch the previous command from the history list, moving back in -the list. -.TP -.B next\-history (C\-n) -Fetch the next command from the history list, moving forward in the -list. -.TP -.B beginning\-of\-history (M\-<) -Move to the first line in the history. -.TP -.B end\-of\-history (M\->) -Move to the end of the input history, i.e., the line currently being -entered. -.TP -.B reverse\-search\-history (C\-r) -Search backward starting at the current line and moving `up' through -the history as necessary. This is an incremental search. -.TP -.B forward\-search\-history (C\-s) -Search forward starting at the current line and moving `down' through -the history as necessary. This is an incremental search. -.TP -.B non\-incremental\-reverse\-search\-history (M\-p) -Search backward through the history starting at the current line -using a non-incremental search for a string supplied by the user. -.TP -.B non\-incremental\-forward\-search\-history (M\-n) -Search forward through the history using a non-incremental search -for a string supplied by the user. -.TP -.B history\-search\-forward -Search forward through the history for the string of characters -between the start of the current line and the current cursor -position (the \fIpoint\fP). -This is a non-incremental search. -.TP -.B history\-search\-backward -Search backward through the history for the string of characters -between the start of the current line and the point. -This is a non-incremental search. -.TP -.B yank\-nth\-arg (M\-C\-y) -Insert the first argument to the previous command (usually -the second word on the previous line) at point. -With an argument -.IR n , -insert the \fIn\fPth word from the previous command (the words -in the previous command begin with word 0). A negative argument -inserts the \fIn\fPth word from the end of the previous command. -.TP -.B -yank\-last\-arg (M\-.\^, M\-_\^) -Insert the last argument to the previous command (the last word of -the previous history entry). With an argument, -behave exactly like \fByank\-nth\-arg\fP. -Successive calls to \fByank\-last\-arg\fP move back through the history -list, inserting the last argument of each line in turn. -.PD -.SS Commands for Changing Text -.PP -.PD 0 -.TP -.B delete\-char (C\-d) -Delete the character at point. If point is at the -beginning of the line, there are no characters in the line, and -the last character typed was not bound to \fBdelete\-char\fP, then return -.SM -.BR EOF . -.TP -.B backward\-delete\-char (Rubout) -Delete the character behind the cursor. When given a numeric argument, -save the deleted text on the kill ring. -.TP -.B forward\-backward\-delete\-char -Delete the character under the cursor, unless the cursor is at the -end of the line, in which case the character behind the cursor is -deleted. -.TP -.B quoted\-insert (C\-q, C\-v) -Add the next character that you type to the line verbatim. This is -how to insert characters like \fBC\-q\fP, for example. -.TP -.B tab\-insert (M-TAB) -Insert a tab character. -.TP -.B self\-insert (a,\ b,\ A,\ 1,\ !,\ ...) -Insert the character typed. -.TP -.B transpose\-chars (C\-t) -Drag the character before point forward over the character at point, -moving point forward as well. -If point is at the end of the line, then this transposes -the two characters before point. -Negative arguments have no effect. -.TP -.B transpose\-words (M\-t) -Drag the word before point past the word after point, -moving point over that word as well. -If point is at the end of the line, this transposes -the last two words on the line. -.TP -.B upcase\-word (M\-u) -Uppercase the current (or following) word. With a negative argument, -uppercase the previous word, but do not move point. -.TP -.B downcase\-word (M\-l) -Lowercase the current (or following) word. With a negative argument, -lowercase the previous word, but do not move point. -.TP -.B capitalize\-word (M\-c) -Capitalize the current (or following) word. With a negative argument, -capitalize the previous word, but do not move point. -.TP -.B overwrite\-mode -Toggle overwrite mode. With an explicit positive numeric argument, -switches to overwrite mode. With an explicit non-positive numeric -argument, switches to insert mode. This command affects only -\fBemacs\fP mode; \fBvi\fP mode does overwrite differently. -Each call to \fIreadline()\fP starts in insert mode. -In overwrite mode, characters bound to \fBself\-insert\fP replace -the text at point rather than pushing the text to the right. -Characters bound to \fBbackward\-delete\-char\fP replace the character -before point with a space. By default, this command is unbound. -.PD -.SS Killing and Yanking -.PP -.PD 0 -.TP -.B kill\-line (C\-k) -Kill the text from point to the end of the line. -.TP -.B backward\-kill\-line (C\-x Rubout) -Kill backward to the beginning of the line. -.TP -.B unix\-line\-discard (C\-u) -Kill backward from point to the beginning of the line. -The killed text is saved on the kill-ring. -.\" There is no real difference between this and backward-kill-line -.TP -.B kill\-whole\-line -Kill all characters on the current line, no matter where point is. -.TP -.B kill\-word (M\-d) -Kill from point the end of the current word, or if between -words, to the end of the next word. Word boundaries are the same as -those used by \fBforward\-word\fP. -.TP -.B backward\-kill\-word (M\-Rubout) -Kill the word behind point. -Word boundaries are the same as those used by \fBbackward\-word\fP. -.TP -.B unix\-word\-rubout (C\-w) -Kill the word behind point, using white space as a word boundary. -The killed text is saved on the kill-ring. -.TP -.B unix\-filename\-rubout -Kill the word behind point, using white space and the slash character -as the word boundaries. -The killed text is saved on the kill-ring. -.TP -.B delete\-horizontal\-space (M\-\e) -Delete all spaces and tabs around point. -.TP -.B kill\-region -Kill the text between the point and \fImark\fP (saved cursor position). -This text is referred to as the \fIregion\fP. -.TP -.B copy\-region\-as\-kill -Copy the text in the region to the kill buffer. -.TP -.B copy\-backward\-word -Copy the word before point to the kill buffer. -The word boundaries are the same as \fBbackward\-word\fP. -.TP -.B copy\-forward\-word -Copy the word following point to the kill buffer. -The word boundaries are the same as \fBforward\-word\fP. -.TP -.B yank (C\-y) -Yank the top of the kill ring into the buffer at point. -.TP -.B yank\-pop (M\-y) -Rotate the kill ring, and yank the new top. Only works following -.B yank -or -.BR yank\-pop . -.PD -.SS Numeric Arguments -.PP -.PD 0 -.TP -.B digit\-argument (M\-0, M\-1, ..., M\-\-) -Add this digit to the argument already accumulating, or start a new -argument. M\-\- starts a negative argument. -.TP -.B universal\-argument -This is another way to specify an argument. -If this command is followed by one or more digits, optionally with a -leading minus sign, those digits define the argument. -If the command is followed by digits, executing -.B universal\-argument -again ends the numeric argument, but is otherwise ignored. -As a special case, if this command is immediately followed by a -character that is neither a digit or minus sign, the argument count -for the next command is multiplied by four. -The argument count is initially one, so executing this function the -first time makes the argument count four, a second time makes the -argument count sixteen, and so on. -.PD -.SS Completing -.PP -.PD 0 -.TP -.B complete (TAB) -Attempt to perform completion on the text before point. -The actual completion performed is application-specific. -.BR Bash , -for instance, attempts completion treating the text as a variable -(if the text begins with \fB$\fP), username (if the text begins with -\fB~\fP), hostname (if the text begins with \fB@\fP), or -command (including aliases and functions) in turn. If none -of these produces a match, filename completion is attempted. -.BR Gdb , -on the other hand, -allows completion of program functions and variables, and -only attempts filename completion under certain circumstances. -.TP -.B possible\-completions (M\-?) -List the possible completions of the text before point. -.TP -.B insert\-completions (M\-*) -Insert all completions of the text before point -that would have been generated by -\fBpossible\-completions\fP. -.TP -.B menu\-complete -Similar to \fBcomplete\fP, but replaces the word to be completed -with a single match from the list of possible completions. -Repeated execution of \fBmenu\-complete\fP steps through the list -of possible completions, inserting each match in turn. -At the end of the list of completions, the bell is rung -(subject to the setting of \fBbell\-style\fP) -and the original text is restored. -An argument of \fIn\fP moves \fIn\fP positions forward in the list -of matches; a negative argument may be used to move backward -through the list. -This command is intended to be bound to \fBTAB\fP, but is unbound -by default. -.TP -.B delete\-char\-or\-list -Deletes the character under the cursor if not at the beginning or -end of the line (like \fBdelete-char\fP). -If at the end of the line, behaves identically to -\fBpossible-completions\fP. -.PD -.SS Keyboard Macros -.PP -.PD 0 -.TP -.B start\-kbd\-macro (C\-x (\^) -Begin saving the characters typed into the current keyboard macro. -.TP -.B end\-kbd\-macro (C\-x )\^) -Stop saving the characters typed into the current keyboard macro -and store the definition. -.TP -.B call\-last\-kbd\-macro (C\-x e) -Re-execute the last keyboard macro defined, by making the characters -in the macro appear as if typed at the keyboard. -.PD -.SS Miscellaneous -.PP -.PD 0 -.TP -.B re\-read\-init\-file (C\-x C\-r) -Read in the contents of the \fIinputrc\fP file, and incorporate -any bindings or variable assignments found there. -.TP -.B abort (C\-g) -Abort the current editing command and -ring the terminal's bell (subject to the setting of -.BR bell\-style ). -.TP -.B do\-uppercase\-version (M\-a, M\-b, M\-\fIx\fP, ...) -If the metafied character \fIx\fP is lowercase, run the command -that is bound to the corresponding uppercase character. -.TP -.B prefix\-meta (ESC) -Metafy the next character typed. -.SM -.B ESC -.B f -is equivalent to -.BR Meta\-f . -.TP -.B undo (C\-_, C\-x C\-u) -Incremental undo, separately remembered for each line. -.TP -.B revert\-line (M\-r) -Undo all changes made to this line. This is like executing the -.B undo -command enough times to return the line to its initial state. -.TP -.B tilde\-expand (M\-&) -Perform tilde expansion on the current word. -.TP -.B set\-mark (C\-@, M\-) -Set the mark to the point. If a -numeric argument is supplied, the mark is set to that position. -.TP -.B exchange\-point\-and\-mark (C\-x C\-x) -Swap the point with the mark. The current cursor position is set to -the saved position, and the old cursor position is saved as the mark. -.TP -.B character\-search (C\-]) -A character is read and point is moved to the next occurrence of that -character. A negative count searches for previous occurrences. -.TP -.B character\-search\-backward (M\-C\-]) -A character is read and point is moved to the previous occurrence of that -character. A negative count searches for subsequent occurrences. -.TP -.B insert\-comment (M\-#) -Without a numeric argument, the value of the readline -.B comment\-begin -variable is inserted at the beginning of the current line. -If a numeric argument is supplied, this command acts as a toggle: if -the characters at the beginning of the line do not match the value -of \fBcomment\-begin\fP, the value is inserted, otherwise -the characters in \fBcomment-begin\fP are deleted from the beginning of -the line. -In either case, the line is accepted as if a newline had been typed. -The default value of -.B comment\-begin -makes the current line a shell comment. -If a numeric argument causes the comment character to be removed, the line -will be executed by the shell. -.TP -.B dump\-functions -Print all of the functions and their key bindings to the -readline output stream. If a numeric argument is supplied, -the output is formatted in such a way that it can be made part -of an \fIinputrc\fP file. -.TP -.B dump\-variables -Print all of the settable variables and their values to the -readline output stream. If a numeric argument is supplied, -the output is formatted in such a way that it can be made part -of an \fIinputrc\fP file. -.TP -.B dump\-macros -Print all of the readline key sequences bound to macros and the -strings they output. If a numeric argument is supplied, -the output is formatted in such a way that it can be made part -of an \fIinputrc\fP file. -.TP -.B emacs\-editing\-mode (C\-e) -When in -.B vi -command mode, this causes a switch to -.B emacs -editing mode. -.TP -.B vi\-editing\-mode (M\-C\-j) -When in -.B emacs -editing mode, this causes a switch to -.B vi -editing mode. -.PD -.SH DEFAULT KEY BINDINGS -.LP -The following is a list of the default emacs and vi bindings. -Characters with the eighth bit set are written as M\-, and -are referred to as -.I metafied -characters. -The printable ASCII characters not mentioned in the list of emacs -standard bindings are bound to the -.B self\-insert -function, which just inserts the given character into the input line. -In vi insertion mode, all characters not specifically mentioned are -bound to -.BR self\-insert . -Characters assigned to signal generation by -.IR stty (1) -or the terminal driver, such as C-Z or C-C, -retain that function. -Upper and lower case metafied characters are bound to the same function in -the emacs mode meta keymap. -The remaining characters are unbound, which causes readline -to ring the bell (subject to the setting of the -.B bell\-style -variable). -.SS Emacs Mode -.RS +.6i -.nf -.ta 2.5i -.sp -Emacs Standard bindings -.sp -"C-@" set-mark -"C-A" beginning-of-line -"C-B" backward-char -"C-D" delete-char -"C-E" end-of-line -"C-F" forward-char -"C-G" abort -"C-H" backward-delete-char -"C-I" complete -"C-J" accept-line -"C-K" kill-line -"C-L" clear-screen -"C-M" accept-line -"C-N" next-history -"C-P" previous-history -"C-Q" quoted-insert -"C-R" reverse-search-history -"C-S" forward-search-history -"C-T" transpose-chars -"C-U" unix-line-discard -"C-V" quoted-insert -"C-W" unix-word-rubout -"C-Y" yank -"C-]" character-search -"C-_" undo -"\^ " to "/" self-insert -"0" to "9" self-insert -":" to "~" self-insert -"C-?" backward-delete-char -.PP -Emacs Meta bindings -.sp -"M-C-G" abort -"M-C-H" backward-kill-word -"M-C-I" tab-insert -"M-C-J" vi-editing-mode -"M-C-M" vi-editing-mode -"M-C-R" revert-line -"M-C-Y" yank-nth-arg -"M-C-[" complete -"M-C-]" character-search-backward -"M-space" set-mark -"M-#" insert-comment -"M-&" tilde-expand -"M-*" insert-completions -"M--" digit-argument -"M-." yank-last-arg -"M-0" digit-argument -"M-1" digit-argument -"M-2" digit-argument -"M-3" digit-argument -"M-4" digit-argument -"M-5" digit-argument -"M-6" digit-argument -"M-7" digit-argument -"M-8" digit-argument -"M-9" digit-argument -"M-<" beginning-of-history -"M-=" possible-completions -"M->" end-of-history -"M-?" possible-completions -"M-B" backward-word -"M-C" capitalize-word -"M-D" kill-word -"M-F" forward-word -"M-L" downcase-word -"M-N" non-incremental-forward-search-history -"M-P" non-incremental-reverse-search-history -"M-R" revert-line -"M-T" transpose-words -"M-U" upcase-word -"M-Y" yank-pop -"M-\e" delete-horizontal-space -"M-~" tilde-expand -"M-C-?" backward-kill-word -"M-_" yank-last-arg -.PP -Emacs Control-X bindings -.sp -"C-XC-G" abort -"C-XC-R" re-read-init-file -"C-XC-U" undo -"C-XC-X" exchange-point-and-mark -"C-X(" start-kbd-macro -"C-X)" end-kbd-macro -"C-XE" call-last-kbd-macro -"C-XC-?" backward-kill-line -.sp -.RE -.SS VI Mode bindings -.RS +.6i -.nf -.ta 2.5i -.sp -.PP -VI Insert Mode functions -.sp -"C-D" vi-eof-maybe -"C-H" backward-delete-char -"C-I" complete -"C-J" accept-line -"C-M" accept-line -"C-R" reverse-search-history -"C-S" forward-search-history -"C-T" transpose-chars -"C-U" unix-line-discard -"C-V" quoted-insert -"C-W" unix-word-rubout -"C-Y" yank -"C-[" vi-movement-mode -"C-_" undo -"\^ " to "~" self-insert -"C-?" backward-delete-char -.PP -VI Command Mode functions -.sp -"C-D" vi-eof-maybe -"C-E" emacs-editing-mode -"C-G" abort -"C-H" backward-char -"C-J" accept-line -"C-K" kill-line -"C-L" clear-screen -"C-M" accept-line -"C-N" next-history -"C-P" previous-history -"C-Q" quoted-insert -"C-R" reverse-search-history -"C-S" forward-search-history -"C-T" transpose-chars -"C-U" unix-line-discard -"C-V" quoted-insert -"C-W" unix-word-rubout -"C-Y" yank -"C-_" vi-undo -"\^ " forward-char -"#" insert-comment -"$" end-of-line -"%" vi-match -"&" vi-tilde-expand -"*" vi-complete -"+" next-history -"," vi-char-search -"-" previous-history -"." vi-redo -"/" vi-search -"0" beginning-of-line -"1" to "9" vi-arg-digit -";" vi-char-search -"=" vi-complete -"?" vi-search -"A" vi-append-eol -"B" vi-prev-word -"C" vi-change-to -"D" vi-delete-to -"E" vi-end-word -"F" vi-char-search -"G" vi-fetch-history -"I" vi-insert-beg -"N" vi-search-again -"P" vi-put -"R" vi-replace -"S" vi-subst -"T" vi-char-search -"U" revert-line -"W" vi-next-word -"X" backward-delete-char -"Y" vi-yank-to -"\e" vi-complete -"^" vi-first-print -"_" vi-yank-arg -"`" vi-goto-mark -"a" vi-append-mode -"b" vi-prev-word -"c" vi-change-to -"d" vi-delete-to -"e" vi-end-word -"f" vi-char-search -"h" backward-char -"i" vi-insertion-mode -"j" next-history -"k" prev-history -"l" forward-char -"m" vi-set-mark -"n" vi-search-again -"p" vi-put -"r" vi-change-char -"s" vi-subst -"t" vi-char-search -"u" vi-undo -"w" vi-next-word -"x" vi-delete -"y" vi-yank-to -"|" vi-column -"~" vi-change-case -.RE -.SH "SEE ALSO" -.PD 0 -.TP -\fIThe Gnu Readline Library\fP, Brian Fox and Chet Ramey -.TP -\fIThe Gnu History Library\fP, Brian Fox and Chet Ramey -.TP -\fIbash\fP(1) -.PD -.SH FILES -.PD 0 -.TP -.FN ~/.inputrc -Individual \fBreadline\fP initialization file -.PD -.SH AUTHORS -Brian Fox, Free Software Foundation -.br -bfox@gnu.org -.PP -Chet Ramey, Case Western Reserve University -.br -chet@ins.CWRU.Edu -.SH BUG REPORTS -If you find a bug in -.B readline, -you should report it. But first, you should -make sure that it really is a bug, and that it appears in the latest -version of the -.B readline -library that you have. -.PP -Once you have determined that a bug actually exists, mail a -bug report to \fIbug\-readline\fP@\fIgnu.org\fP. -If you have a fix, you are welcome to mail that -as well! Suggestions and `philosophical' bug reports may be mailed -to \fPbug-readline\fP@\fIgnu.org\fP or posted to the Usenet -newsgroup -.BR gnu.bash.bug . -.PP -Comments and bug reports concerning -this manual page should be directed to -.IR chet@ins.CWRU.Edu . -.SH BUGS -.PP -It's too big and too slow. diff --git a/dep/src/readline/src/doc/readline.dvi b/dep/src/readline/src/doc/readline.dvi deleted file mode 100644 index c63a313a343e12c9dbb1d504b9ee4e27d593ee14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 274068 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 I5&gga4_0j;djJ3c diff --git a/dep/src/readline/src/doc/readline.html b/dep/src/readline/src/doc/readline.html deleted file mode 100644 index fbbfad8552d..00000000000 --- a/dep/src/readline/src/doc/readline.html +++ /dev/null @@ -1,6656 +0,0 @@ - - - - - -GNU Readline Library: - - - - - - - - - - - - - - - - - -
    [Top][Contents][Index][ ? ]
    -