REXXLibs (REXX Libraries)

Authors/Port authors:

Open source REXX function libraries for OS/2.

REXX libraries include:

  • RXLVM, a (read-only) REXX interface to the Logical Volume Manager;
  • RXULS,  a REXX interface to OS/2's Universal Language Support (Unicode) support;
  • RXUTILEX, a set of extended utility functions designed to supplement the standard REXXUTIL library;
  • RXPRTUTL, REXX printer utility functions.
This software is distributed as compressed package. You have to download and manually install it; if prerequisites are required, you will have to manually install them too.

Manual installation

Program is distributed as ZIP package: download to temporary directory and unpack to destination folder. See below for download link(s).

Following ones are the download links for manual installation:

RXUTILEX - REXX Utility Functions - Extended v. 0.15 (18/1/2018) Readme/What's new
REXX Utility Functions - Extended (RXUTILEX.DLL) http://trac.netlabs.org/rexxlibs/ This library requires OS/2 4.5x, as it makes use of large file support functions (e.g. DosOpenL). OBJECTIVE The purpose behind the RXUTILEX library is that it should basically provide everything that _should_ have been in RexxUtil, but isn't. Specifically, useful system-related functions of a relatively general-purpose nature, as well as commonly-needed data formatting routines. This includes things like (* = already at least partially implemented): - clipboard access * - process management * - system information (like installed RAM*) - locked-file replacement * - wrappers for strftime()*, mktime()*, and strfmon() - named pipe creation/deletion * - functions to read/write huge (>2GB) files * - a string tokenizer - access to resources (DosGetResource) and other things that the community decides is needed. While it is true that many of these functions already exist in a scattering of other REXX libraries, many of those other libraries are no longer maintained and/or are closed-source, and cannot be updated by the community. Others are relatively special-purpose, and only include one or two general-utility functions. One of the main motivations of this project is to try and reduce "Yet Another REXX Library" syndrome - wherein a REXX application requires a myriad of REXX DLLs purely for the sake of one or two useful functions in each one. It would be nice if most of the commonly-required functions were available in a single library. Moreover, that library should be open source and maintained by the OS/2 community, able to be updated and extended as needed. On the other hand, it is also desirable to avoid overloading RXUTILEX with too many functions. RXUTILEX should be limited to providing functions which are generally useful for a wide variety of applications. (There will always be relatively specialized areas of support which should continue to have their own dedicated REXX libraries - RXLVM, for example.) BUILD NOTES The included Makefile is for the IBM C/C++ compiler. Version 3.65 is required in order to support the parsing of 64-bit integers. TERMS OF USE REXX Utility Functions - Extended (RXUTILEX) (C) 2011, 2017 Alex Taylor. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. The source code for RXUTILEX is available via SVN at http://svn.netlabs.org/repos/rexxlibs/rxutilex/ FUNCTIONS IN RXUTILEX.DLL Sys2BytesRemaining - Get the number of bytes remaining in a file Sys2CheckNamedPipe - Check the status of a named pipe (server side) Sys2Close - Close a file or named pipe Sys2ConnectNamedPipe - Enable client sessions on a named pipe Sys2CreateNamedPipe - Create a named pipe Sys2DisconnectNamedPipe - Acknowledge that a named pipe session has ended Sys2DropFuncs - Deregister all functions Sys2FormatNumber - Format a number with thousands-grouping characters Sys2FormatTime - Format calender time (strftime wrapper) Sys2GetClipboardText - Retrieve the current clipboard text Sys2GetEpochTime - Get or convert calender time (seconds from epoch) Sys2KillProcess - Kill a process by name or PID Sys2LoadFuncs - Register all functions Sys2LocateDLL - Search for a loaded/loadable DLL Sys2Open - Open a file or stream (with >2GB support) Sys2PutClipboardText - Copy a text string to the clipboard Sys2QueryDriveInfo - Get non-filesystem-dependent info about a drive Sys2QueryForegroundProcess - Get the PID of the current foreground process Sys2QueryPhysicalMemory - Get the amount of installed RAM Sys2QueryProcess - Get information about a process Sys2QueryProcessList - Get the list of running processes Sys2Read - Read bytes from a file or named pipe Sys2ReadLine - Read a line of text from a file or named pipe Sys2ReplaceModule - Unlock a DLL (DosReplaceModule wrapper) Sys2Seek - Set file read/write pointer (with >2GB support) Sys2SyncBuffer - synchronize read/write (DosResetBuffer wrapper) Sys2Version - Get the version of this library Sys2Write - Write bytes to a file or named pipe If an internal error occurs in any function, the variable SYS2ERR will contain an error message of the form "RC: description" where RC is a non-zero error code, and description indicates the internal function call that failed. If no error occurs, SYS2ERR will be "0". ------------------------------------------------------------------------- Sys2BytesRemaining Return the number bytes that remain in a stream following the current read/write position. REXX ARGUMENTS: 1. File handle (returned by Sys2Open or Sys2CreateNamedPipe) (REQUIRED) REXX RETURN VALUE: The number of bytes remaining. In case of error, 0 will be returned and SYS2ERR will be set. ------------------------------------------------------------------------- Sys2CheckNamedPipe Checks the status of a named pipe that was previously created using Sys2CreateNamedPipe. This function is designed for use by the process that created the pipe (i.e. the server side). Clients which are accessing a named pipe should use the standard REXX STREAM and/or CHARS functions to determine the pipe's status. REXX ARGUMENTS: 1. The pipe handle (from Sys2CreateNamedPipe or Sys2Open). (REQUIRED) REXX RETURN VALUE: String of the format "bytes status", where bytes is the number of bytes currently waiting in the pipe, and status is one of: DISCONNECTED, LISTENING, CONNECTED, or CLOSING. ------------------------------------------------------------------------- Sys2Close Close a file or stream (wrapper to DosClose). REXX ARGUMENTS: 1. File handle (returned by Sys2Open). (REQUIRED) REXX RETURN VALUE: 1 on success, or 0 if an error occurred. ------------------------------------------------------------------------- Sys2ConnectNamedPipe Start 'listening' by allowing clients to connect to a previously-created named pipe. REXX ARGUMENTS: 1. The pipe handle, as returned by Sys2CreateNamedPipe. (REQUIRED) REXX RETURN VALUE: 1 on success, or 0 if an error occurred. ------------------------------------------------------------------------- Sys2CreateNamedPipe Creates a named pipe with the specified name and parameters. Only byte mode is supported; message mode is not. Note that the standard REXX functions such as CHARIN/OUT, which operate directly on file names, are not capable of using the pipe handle returned from this function. While the client end can use such functions after using STREAM to issue an OPEN WRITE or OPEN READ command, the server end needs to use the pipe handle from this function, and must therefore use Sys2Read/Sys2Write in order to read and write data from the pipe. Named pipes can be created in inbound-only, outbound-only, or duplex (inbound/outbound) mode. An error will result if attempting to write to an inbound-only pipe, or read from an outbound-only pipe. To activate a named pipe so that client processes can connect to it, use Sys2ConnectNamedPipe. To check the pipe's connection status, as well as the amount of data currently in the pipe, use Sys2CheckNamedPipe. To unlock a named pipe after a client has closed the connection, use Sys2DisconnectNamedPipe. Finally, the pipe can be destroyed using Sys2Close. REXX ARGUMENTS: 1. The name of the pipe, in the form "\PIPE\something". (REQUIRED) 2. The size of the outbound buffer, in bytes. (REQUIRED) 3. The size of the inbound buffer, in bytes. (REQUIRED) 4. The pipe's timeout value, in milliseconds. (DEFAULT: 3000) 5. The number of simultaneous instances of this pipe which are allowed. Must be between 1 and 254, or 0 indicating no limit. (DEFAULT: 1) 6. Pipe blocking mode, one of: W = WAIT mode, read and write block waiting for data (DEFAULT) N = NOWAIT mode, read and write return immediately 7. Pipe mode, one of: I = Inbound pipe (DEFAULT) O = Outbound pipe D = Duplex (inbound/outbound) pipe 8. Privacy/inheritance flag, one of: 0 = The pipe handle is inherited by child processes (DEFAULT) 1 = The pipe handle is private to the current process 9. Write-through flag, one of: 0 = Allow delayed writes (write-behind) to remote pipes (DEFAULT) 1 = Force immediate writes (write-through) to remote pipes REXX RETURN VALUE: A four-byte pipe handle. ------------------------------------------------------------------------- Sys2DisconnectNamedPipe Unlocks a named pipe after a client has closed its connection. REXX ARGUMENTS: 1. The pipe handle, as returned by Sys2CreateNamedPipe. (REQUIRED) REXX RETURN VALUE: 1 on success, or 0 if an error occurred. ------------------------------------------------------------------------- Sys2DropFuncs Deregisters all Sys2* REXX functions. REXX ARGUMENTS: None REXX RETURN VALUE: "" ------------------------------------------------------------------------- Sys2FormatNumber Formats a number to use thousands-grouping characters. The system values for the current locale are used for the thousands-grouping character and the decimal place, if any. Note that the IBM C runtime's locale definitions are used; these may not correspond precisely to the system locales as defined in the OS/2 Locale object. The input number may be a positive or negative integer or floating point value. It must be a simple, non-localized number value; in other words, it must not contain any thousands-grouping characters, and any decimal point which it contains must be a period (rather than any localized decimal symbol). REXX ARGUMENTS: 1. Number to be formatted. (REQUIRED) 2. Number of decimal places to use for floating point values. Ignored for integer values. (DEFAULT: 2) REXX RETURN VALUE: The formatted number, or '' on error. ------------------------------------------------------------------------- Sys2FormatTime Converts a number of seconds from the epoch (1970-01-01 0:00:00 UTC) into a formatted date and time string. REXX ARGUMENTS: 1. Number of seconds (a positive integer) to be converted. (REQUIRED) This value cannot be greater than 2,147,483,647. 2. Format type, one of: D = return in the form 'yyyy-mm-dd hh:mm:ss (w)' where w represents the weekday (0-6 where 0=Sunday) (DEFAULT) I = return in ISO8601 combined form 'yyyy-mm-ddThh:mm:ss[Z]' L = return in the form 'day month year (weekday) time' where month and weekday are language-dependent abbreviations Note: With D and I, time is returned in 24-hour format; L may vary. 3. TZ conversion flag (indicates whether to convert to UTC from local time), one of: U = return UTC or unconverted time L = assume the input is in Coordinated Universal Time, and convert to local time using the current TZ (DEFAULT) REXX RETURN VALUE: The formatted time string, or "" on error. ------------------------------------------------------------------------- Sys2GetClipboardText Retrieves a plain-text string from the clipboard if one is available. This function requires Presentation Manager to be active, although the REXX program itself need not be running in a PM process. REXX ARGUMENTS: None. REXX RETURN VALUE: The retrieved clipboard string ------------------------------------------------------------------------- Sys2GetEpochTime Converts formatted date and time into a number of seconds (UTC) from the epoch (defined as 1970-01-01 0:00:00). The input time is assumed to refer to the current timezone as defined in the TZ environment variable. If no parameters are specified, the current system time is used. If at least one parameter is specified, then any missing parameter is assumed to be its minimum possible value (1 for day or month, 0 for all others). The time is formatted according to the C runtime's locale support, as configured via the LANG and LC_* environment variables. NOTE: Any date prior to 1 January 1970, or later than 19 January 2038, cannot be supported due to the limitations in how the C library calculates epoch time. Specifying any date before 1970 will generate a REXX error. Any time/date later than 12:14:07 on 19 January 2038 will return the latter value. REXX ARGUMENTS: 1. The year (1970-2037) A 2-digit year can be specified, in which case the number will be added to 1900 if it is 70 or higher, or to 2000 otherwise. e.g. '20' ==> 2020 '75' ==> 1975 (This is subject to the limitation noted above.) 2. The month (1-12) 3. The day (1-31) 4. Hours (0-23) 5. Minutes (0-59) 6. Seconds (0-61) REXX RETURN VALUE: The number of seconds since the epoch, or 0 on error. ------------------------------------------------------------------------- Sys2KillProcess Terminates the (first) running process with the specified executable name or process-ID. REXX ARGUMENTS: 1. The process identifier (program name or process ID) (REQUIRED) 2. Flag indicicating the identifier type: 'P': decimal process ID 'H': hexadecimal process ID 'N': executable program name (with or without extension) (DEFAULT) REXX RETURN VALUE: 1 on success or 0 on failure. ------------------------------------------------------------------------- Sys2LoadFuncs Registers all Sys2* REXX functions (except this one, obviously). REXX ARGUMENTS: None REXX RETURN VALUE: "" ------------------------------------------------------------------------- Sys2LocateDLL Searches for a DLL by name and returns its fully-qualified path. If a DLL with the given name is currently loaded, that instance of the DLL will be returned. Otherwise, unless 'L' is specified in the second parameter, standard DLL loading rules (which will be governed by the current LIBPATH and/or extended LIBPATH configuration) are used to search for a loadable DLL whose module name matches the one specified. (A loadable DLL is one whose runtime dependencies are also loadable, and whose initialization routine can be executed successfully.) REXX ARGUMENTS: 1. The name of the DLL to search for. (REQUIRED) 2. Flag to limit search context, must be one of: A : 'All', search for both loaded and loadable DLLs (DEFAULT) L : 'Loaded', search only for currently-loaded DLLs REXX RETURN VALUE: The fully-qualified path of the DLL, if found; "" otherwise. ------------------------------------------------------------------------- Sys2Open Opens a file or other stream; files larger than 2GB are supported (this function is a wrapper to DosOpenL). Direct-DASD mode is not supported by this function, nor is setting the initial extended attributes. REXX ARGUMENTS: 1. Name of file or stream to open. (REQUIRED) 2. Open action flags, must be either "O" (open if exists), "R" (replace if exists), or nothing (fail if exists), optionally followed by "C" (create if file does not exist). If "C" is not specified, the operation will fail if the file does not exist. Note that a value of "" alone will therefore fail automatically. (DEFAULT: "O") In summary, the possible combinations are: O = Open only (if file exists, open it; if not, fail) OC= Open/create (if file exists, open it; if not, create it) R = Replace only (if file exists, replace it; if not, fail) RC= Replace/create (if file exists, replace it; if not, create it) C = Create only (if file exists, fail; if not, create it) (empty) = No-op (if file exists, fail; if not, fail) 3. Access mode flags, one or both of: (DEFAULT: "RW") R = Open file with read access. W = Open file with write access. 4. Sharing mode flags, any combination (or "") of: (DEFAULT: "") R = Deny read access to other processes W = Deny write access to other processes Specifying "" will permit both read and write access. 5. Deny legacy DosOpen access, one of: 0 = Allow DosOpen to access the file (DEFAULT) 1 = Deny access using the DosOpen API 6. Privacy/inheritance flag, one of: 0 = The file handle is inherited by child processes. (DEFAULT) 1 = The file handle is private to the current process. 7. Initial file attributes when creating a file: (DEFAULT: "") A = Archive attribute set D = Directory attribute set S = System attribute set H = Hidden attribute set R = Read-only attribute set 8. Initial file size when creating or replacing a file; ignored if access mode is read-only. (DEFAULT: 0) 9. I/O mode flags, any or all of: (DEFAULT: "") T = Write-through mode (default is normal write) N = No-cache mode (default is to use filesystem cache) S = Sequential access R = Random access * S and R can combine as follows: Neither: No locality known (default) S only: Mainly sequential access R only: Mainly random access Both: Random/sequential (i.e. random with some locality) REXX RETURN VALUE: File handle, or "" in case of error. ------------------------------------------------------------------------- Sys2PutClipboardText Writes a string to the clipboard in plain-text format. Specifying either no value or an empty string in the first argument will simply clear the clipboard of CF_TEXT data. This function requires Presentation Manager to be active, although the REXX program itself need not be running in a PM process. REXX ARGUMENTS: 1. String to be written to the clipboard (DEFAULT: "") 2. Flag indicating whether other clipboard formats should be cleared: Y = yes, call WinEmptyClipbrd() before writing text (DEFAULT) N = no, leave (non-CF_TEXT) clipboard data untouched REXX RETURN VALUE: 1 on success, 0 on failure ------------------------------------------------------------------------- Sys2QueryDriveInfo Get non-filesystem-dependent information about a logical drive (volume). REXX ARGUMENTS: 1. Drive/volume letter to query, trailing colon optional. (REQUIRED) REXX RETURN VALUE: On success, returns a string in the format <drive> <size> <type> <flag> where <drive> is the uppercase drive letter followed by a colon, <size> is the total size of the drive/volume in binary kilobytes, <type> is one of: FLOPPY_5L - 48 TPI low-density diskette drive FLOPPY_5H - 96 TPI high-density diskette drive FLOPPY_3L - 3.5-inch 720KB drive FLOPPY_3H - 3.5-inch high-density 1.44MB diskette drive FLOPPY_3X - 3.5-inch ext-density 2.88MB diskette drive FLOPPY_8L - 8-inch single-density diskette drive FLOPPY_8H - 8-inch double-density diskette drive OTHER - other (including CD drive with no media) HDD - hard disk drive (including PRM) TAPE - tape drive OPTICAL - read/write optical drive and <flag> is 1 for non-partitionable removable media (e.g. floppies) or 0 otherwise (including both fixed and PRM disks) On error, returns "". ------------------------------------------------------------------------- Sys2QueryForegroundProcess Queries the PID of the current foreground process. (Note that this is not necessarily the same as the process which is calling this function, which could, for example, be running in the background and/or as a child of the foreground process.) REXX ARGUMENTS: None REXX RETURN VALUE: Integer representing the process ID (in decimal), or 0 if an error occurred. ------------------------------------------------------------------------- Sys2QueryPhysicalMemory Queries the amount of physical memory (RAM) installed in the system. REXX ARGUMENTS: None REXX RETURN VALUE: Integer representing the amount of installed memory, in KiB, or 0 if an error occurred. ------------------------------------------------------------------------- Sys2QueryProcess Queries information about the specified process. Specifying a process ID of 0 will return the information for the current process (that is, the process calling this function); note that this requires the second parameter to specify that the identifier is in fact a process ID ('P' or 'H') rather than an executable name. REXX ARGUMENTS: 1. The process identifier (program name or process ID) (REQUIRED) 2. Flag indicicating the identifier type: 'P': decimal process ID 'H': hexadecimal process ID 'N': executable program name (with or without extension) (DEFAULT) REXX RETURN VALUE: A string of the format pid parent-pid process-type priority cpu-time executable-name "priority" is in hexadecimal notation, all other numbers are decimal. "" is returned if the process was not found or if an internal error occurred. ------------------------------------------------------------------------- Sys2QueryProcessList Gets a list of running processes. The results will be returned in a stem variable, where stem.0 contains number of items, and each stem item is a string of the form: pid parent-pid process-type priority cpu-time executable-name "priority" is in hexadecimal notation, all other numbers are decimal. Notes: - "process-type" will be one of: 0 Full screen protect-mode session 1 Requires real mode. Dos emulation. 2 VIO windowable protect-mode session 3 Presentation Manager protect-mode session 4 Detached protect-mode process. - If "priority" is 0 then the priority class could not be determined. - If "executable-name" is "--" then the name could not be identified. REXX ARGUMENTS: 1. The name of the stem in which to return the results (REQUIRED) REXX RETURN VALUE: Number of processes found, or "" in case of error. ------------------------------------------------------------------------- Sys2Read Read bytes from a previously-opened stream (wrapper to DosRead). REXX ARGUMENTS: 1. File handle (as returned by Sys2Open or Sys2CreateNamedPipe). (REQUIRED) 2. Number of bytes to read. (REQUIRED) REXX RETURN VALUE: String containing the bytes read, or "" in case of error. ------------------------------------------------------------------------- Sys2ReadLine Read a line (up to the next line feed) from a previously-opened stream. Only ASCII LF (0x0A) bytes are treated as line-end characters; they will be stripped from the result string. CR bytes (0x0D) will be skipped over but otherwise ignored. REXX ARGUMENTS: 1. File handle (returned by Sys2Open or Sys2CreateNamedPipe) (REQUIRED) REXX RETURN VALUE: String containing the text read. In the case of error, this will be "" and SYS2ERR will be set. ------------------------------------------------------------------------- Sys2ReplaceModule Unlocks and optionally replaces an in-use (locked) DLL or EXE. REXX ARGUMENTS: 1. The filespec of the module to be replaced. (REQUIRED) 2. The filespec of the new module to replace it with. (DEFAULT: none) 3. The filespec of the backup file to be created. (DEFAULT: none) REXX RETURN VALUE: 1 on success, or 0 if an error occurred. ------------------------------------------------------------------------- Sys2Seek Move the read/write pointer to the specified location in an open file/stream; files larger than 2GB are supported (this function is a wrapper to DosSetFilePtrL). REXX ARGUMENTS: 1. File handle (returned by Sys2Open). (REQUIRED) 2. The signed distance in bytes to move. (REQUIRED) 3. Move method, one of: B = Beginning of file C = Current position (DEFAULT) E = End of file REXX RETURN VALUE: The new file position, in bytes. ------------------------------------------------------------------------- Sys2SyncBuffer Used to synchronize buffer read/write transactions (wrapper to DosResetBuffer). For external files, writes the buffer to disk. For named pipes, blocks until the remote client end of the pipe has read the contents. REXX ARGUMENTS: 1. File handle (as returned by Sys2Open or Sys2CreateNamedPipe). (REQUIRED) REXX RETURN VALUE: 1 on success, 0 on failure ------------------------------------------------------------------------- Sys2Version Returns the current library version. REXX ARGUMENTS: None REXX RETURN VALUE: Current version in the form "major.minor.refresh" ------------------------------------------------------------------------- Sys2Write Write bytes to a previously-opened stream (wrapper to DosWrite). REXX ARGUMENTS: 1. File handle (as returned by Sys2Open or Sys2CreateNamedPipe). (REQUIRED) 2. Data to be written. (REQUIRED) REXX RETURN VALUE: The number of bytes successfully written.
 trac.netlabs.org/rexxlibs/raw-attachment/wiki/WikiStart/rxutilex_015.zip  local copy
RXPRTUTL - REXX printer utility functions v. 0.3 (13/2/2017)
 trac.netlabs.org/rexxlibs/raw-attachment/wiki/WikiStart/rxprtutl_03.zip
RXUTILEX - REXX Utility Functions - Extended v. 0.14 (13/2/2017)
 trac.netlabs.org/rexxlibs/raw-attachment/wiki/WikiStart/rxutilex_014.zip  local copy
RXULS - REXX Universal Language Support API v. 0.5.2 (10/3/2008) Readme/What's new
0.5.2 (2008-03-10) - Fixed a bug which could have resulted in a slight memory leak under some error conditions (thanks to Rich Walsh). - Slight correction to PM initialization/termination logic in the clipboard functions. - A few minor code optimizations. - Miscellaneous code cleanup.
 www.altsan.org/os2/toolkits/uls/rxuls_052.zip  local copy
RxLVM library v. 0.51 (18/3/2007) Readme/What's new
v0.5.1 (2007-03-18) - Added RxLvmGetPartitions() function. - Fix for filesystem names containing spaces. - All reported handles are now eight digits long, with leading 0s if needed. - Code cleanup.
 www.altsan.org/os2/toolkits/lvm/rxlvm_051.zip  local copy
Record updated last time on: 22/06/2018 - 15:22

GTranslate

English Dutch French German Korean Russian Swedish

Add new comment