updated sed docs

This commit is contained in:
hyung-hwan 2013-01-10 14:17:53 +00:00
parent 686f63f665
commit 4581bf1e4e
13 changed files with 509 additions and 617 deletions

View File

@ -17,13 +17,13 @@ over its corresponding core layer name.
Embedding QSEAWK involves the following steps in the simplest form: Embedding QSEAWK involves the following steps in the simplest form:
- open a new awk object - create a new awk object
- parse in a source script - parse in a source script
- open a new runtime context - create a new runtime context
- execute pattern-action blocks or call a function - execute pattern-action blocks or call a function
- decrement the reference count of the return value - decrement the reference count of the return value
- close the runtime context - destroy the runtime context
- close the awk object - destroy the awk object
The sample below follows these steps using as many standard layer functions as The sample below follows these steps using as many standard layer functions as
possible for convenience sake. It simply prints *hello, world* to the console. possible for convenience sake. It simply prints *hello, world* to the console.

View File

@ -24,30 +24,30 @@ forms:
- address - specify a single address - address - specify a single address
- address,address - specify an address range - address,address - specify an address range
- start~step - specify a starting line and a step. - start~step - specify a starting line and a step.
#QSE_SED_STARTSTEP enables this form. #QSE_SED_EXTENDEDADR enables this form.
An @b address is a line number, a regular expression, or a dollar sign ($) An *address* is a line number, a regular expression, or a dollar sign ($)
while a @b start and a @b step is a line number. while a *start* and a *step* is a line number.
A regular expression for an address has the following form: A regular expression for an address has the following form:
- /rex/ - a regular expression @b rex is enclosed in slashes - /rex/ - a regular expression *rex* is enclosed in slashes
- \\CrexC - a regular expression @b rex is enclosed in @b \\C and @b C - \\CrexC - a regular expression *rex* is enclosed in \\C and *C*
where @b C can be any character. where *C* can be any character.
It treats the @b \\n sequence specially to match a newline character. It treats the \\n sequence specially to match a newline character.
Here are examples of line selectors: Here are examples of line selectors:
- 10 - match the 10th line - 10 - match the 10th line
- 10,20 - match lines from the 10th to the 20th. - 10,20 - match lines from the 10th to the 20th.
- /^[[:space:]]*$/ - match an empty line - /^[[:space:]]*$/ - match an empty line
- /^abc$/,/^def$/ - match all lines between @b abc and @b def inclusive - /^abc$/,/^def$/ - match all lines between *abc* and *def* inclusive
- 10,$ - match the 10th line down to the last line. - 10,$ - match the 10th line down to the last line.
- 3~4 - match every 4th line from the 3rd line. - 3~4 - match every 4th line from the 3rd line.
Note that an address range always selects the line matching the first address Note that an address range always selects the line matching the first address
regardless of the second address; For example, 8,6 selects the 8th line. regardless of the second address; For example, 8,6 selects the 8th line.
The exclamation mark @b !, when used after the line selector and before The exclamation mark(!), when used after the line selector and before
the command code, negates the line selection; For example, 1! selects all the command code, negates the line selection; For example, 1! selects all
lines except the first line. lines except the first line.
@ -55,172 +55,176 @@ A command without a line selector is applied to all input lines;
A command with a single address is applied to an input line that matches A command with a single address is applied to an input line that matches
the address; A command with an address range is applied to all input the address; A command with an address range is applied to all input
lines within the range, inclusive; A command with a start and a step is lines within the range, inclusive; A command with a start and a step is
applied to every <b>step</b>'th line starting from the line @b start. applied to every <b>step</b>'th line starting from the line start.
Here is the summary of the commands. Here is the summary of the commands.
- <b># comment</b> ### # comment ###
The text beginning from # to the line end is ignored; # in a line following The text beginning from # to the line end is ignored; # in a line following
<b>a \\</b>, <b>i \\</b>, and <b>c \\</b> is treated literally and does not <b>a \\</b>, <b>i \\</b>, and <b>c \\</b> is treated literally and does not
introduce a comment. introduce a comment.
- <b>: label</b> ### : label ###
A label can be composed of letters, digits, periods, hyphens, and underlines. A label can be composed of letters, digits, periods, hyphens, and underlines.
It remembers a target label for @b b and @b t commands and prohibits a line It remembers a target label for *b* and *t* commands and prohibits a line
selector. selector.
- <b>{</b> ### { ###
The left curly bracket forms a command group where you can nest other The left curly bracket forms a command group where you can nest other
commands. It should be paired with an ending @b }. commands. It should be paired with an ending }.
- <b>q</b> ### q ###
Terminates the exection of commands. Upon termination, it prints the pattern Terminates the exection of commands. Upon termination, it prints the pattern
space if #QSE_SED_QUIET is not set. space if #QSE_SED_QUIET is not set.
- <b>Q</b> ### Q ###
Terminates the exection of commands quietly. Terminates the exection of commands quietly.
- <b>a \\ \n text</b> ### a \\ \n text ###
Stores @b text into the append buffer which is printed after the pattern Stores *text* into the append buffer which is printed after the pattern
space for each input line. If #QSE_SED_STRICT is on, an address range is not space for each input line. If #QSE_SED_STRICT is on, an address range is not
allowed for a line selector. If #QSE_SED_SAMELINE is on, the backslash and the allowed for a line selector. If #QSE_SED_SAMELINE is on, the backslash and the
text can be located on the same line without a line break. text can be located on the same line without a line break.
- <b>i \\ \n text</b> ### i \\ \n text ###
Inserts @b text into an insert buffer which is printed before the pattern Inserts *text* into an insert buffer which is printed before the pattern
space for each input line. If #QSE_SED_STRICT is on, an address range is not space for each input line. If #QSE_SED_STRICT is on, an address range is not
allowed for a line selector. If #QSE_SED_SAMELINE is on, the backslash and the allowed for a line selector. If #QSE_SED_SAMELINE is on, the backslash and the
text can be located on the same line without a line break. text can be located on the same line without a line break.
- <b>c \\ \n text</b> ### c \\ \n text ###
If a single line is selected for the command (i.e. no line selector, a single If a single line is selected for the command (i.e. no line selector, a single
address line selector, or a start~step line selector is specified), it changes address line selector, or a start~step line selector is specified), it changes
the pattern space to @b text and branches to the end of commands for the line. the pattern space to *text* and branches to the end of commands for the line.
If an address range is specified, it deletes the pattern space and branches If an address range is specified, it deletes the pattern space and branches
to the end of commands for all input lines but the last, and changes pattern to the end of commands for all input lines but the last, and changes pattern
space to @b text and branches to the end of commands. If #QSE_SED_SAMELINE is space to *text* and branches to the end of commands. If #QSE_SED_SAMELINE is
on, the backlash and the text can be located on the same line without a line on, the backlash and the text can be located on the same line without a line
break. break.
- <b>d</b> ### d ###
Deletes the pattern space and branches to the end of commands. Deletes the pattern space and branches to the end of commands.
- <b>D</b> ### D ###
Deletes the first line of the pattern space. If the pattern space is emptied, Deletes the first line of the pattern space. If the pattern space is emptied,
it branches to the end of script. Otherwise, the commands from the first are it branches to the end of script. Otherwise, the commands from the first are
reapplied to the current pattern space. reapplied to the current pattern space.
- <b>=</b> ### = ###
Prints the current line number. If #QSE_SED_STRICT is on, an address range is Prints the current line number. If #QSE_SED_STRICT is on, an address range is
not allowed as a line selector. not allowed as a line selector.
- <b>p</b> ### p ###
Prints the pattern space. Prints the pattern space.
- <b>P</b> ### P ###
Prints the first line of the pattern space. Prints the first line of the pattern space.
- <b>l</b> ### l ###
Prints the pattern space in a visually unambiguous form. Prints the pattern space in a visually unambiguous form.
- <b>h</b> ### h ###
Copies the pattern space to the hold space Copies the pattern space to the hold space
- <b>H</b> ### H ###
Appends the pattern space to the hold space Appends the pattern space to the hold space
- <b>g</b> ### g ###
Copies the hold space to the pattern space Copies the hold space to the pattern space
- <b>G</b> ### G ###
Appends the hold space to the pattern space Appends the hold space to the pattern space
- <b>x</b> ### x ###
Exchanges the pattern space and the hold space Exchanges the pattern space and the hold space
- <b>n</b> ### n ###
Prints the pattern space and read the next line from the input stream to fill Prints the pattern space and read the next line from the input stream to fill
the pattern space. the pattern space.
- <b>N</b> ### N ###
Prints the pattern space and read the next line from the input stream Prints the pattern space and read the next line from the input stream
to append it to the pattern space with a newline inserted. to append it to the pattern space with a newline inserted.
- <b>b</b> ### b ###
Branches to the end of commands. Branches to the end of commands.
- <b>b label</b> ### b label ###
Branches to @b label Branches to *label*
- <b>t</b> ### t ###
Branches to the end of commands if substitution(s//) has been made Branches to the end of commands if substitution(s//) has been made
successfully since the last reading of an input line or the last @b t command. successfully since the last reading of an input line or the last *t* command.
- <b>t label</b> ### t label ###
Branches to @b label if substitution(s//) has been made successfully Branches to *label* if substitution(s//) has been made successfully
since the last reading of an input line or the last @b t command. since the last reading of an input line or the last *t* command.
- <b>r file</b> ### r file ###
Reads text from @b file and prints it after printing the pattern space but Reads text from *file* and prints it after printing the pattern space but
before printing the append buffer. Failure to read @b file does not cause an before printing the append buffer. Failure to read *file* does not cause an
error. error.
- <b>R file</b> ### R file ###
Reads a line of text from @b file and prints it after printing pattern space Reads a line of text from *file* and prints it after printing pattern space
but before printing the append buffer. Failure to read @b file does not cause but before printing the append buffer. Failure to read *file* does not cause
an error. an error.
- <b>w file</b> ### w file ###
Writes the pattern space to @b file Writes the pattern space to *file*
- <b>W file</b> ### W file ####
Writes the first line of the pattern space to @b file Writes the first line of the pattern space to *file*
- <b>s/rex/repl/opts</b> ### s/rex/repl/opts ###
Finds a matching substring with @b rex in pattern space and replaces it Finds a matching substring with *rex* in pattern space and replaces it
with @b repl. @b & in @b repl refers to the matching substring. @b opts may with *repl*. An ampersand(&) in *repl* refers to the matching substring.
be empty; You can combine the following options into @b opts: *opts* may be empty; You can combine the following options into *opts*:
- @b g replaces all occurrences of a matching substring with @b rex
- @b number replaces the <b>number</b>'th occurrence of a matching substring - *g* replaces all occurrences of a matching substring with *rex*
with @b rex - *number* replaces the <b>number</b>'th occurrence of a matching substring
- @b p prints pattern space if a successful replacement was made with *rex*
- @b w file writes pattern space to @b file if a successful replacement - *p* prints pattern space if a successful replacement was made
- *w* file writes pattern space to *file* if a successful replacement
was made. It, if specified, should be the last option. was made. It, if specified, should be the last option.
- <b>y/src/dst/</b> ### y/src/dst/ ###
Replaces all occurrences of characters in @b src with characters in @b dst. Replaces all occurrences of characters in *src* with characters in *dst*.
@b src and @b dst must contain equal number of characters. *src* and *dst* must contain equal number of characters.
- <b>c/selector/opts</b> ### C/selector/opts ###
Selects characters or fields from the pattern space as specified by the Selects characters or fields from the pattern space as specified by the
@b selector and update the pattern space with the selected text. A selector *selector* and update the pattern space with the selected text. A selector
is a comma-separated list of specifiers. A specifier is one of the followings: is a comma-separated list of specifiers. A specifier is one of the followings:
<ul>
<li>@b d specifies the input field delimiter with the next character. e.g) d:
<li>@b D sepcifies the output field delimiter with the next character. e.g) D;
<li>@b c specifies a position or a range of characters to select. e.g) c23-25
<li>@b f specifies a position or a range of fields to select. e.g) f1,f4-3
</ul>
@b opts may be empty; You can combine the following options into @b opts:
<ul>
<li>@b f folds consecutive delimiters into one.
<li>@b w uses white spaces for a field delimiter regardless of the input
delimiter specified in the selector.
<li>@b d deletes the pattern space if the line is not delimited by
the input field delimiter
</ul>
In principle, this can replace the @b cut utility. + *d* specifies the input field delimiter with the next character. e.g) d:
+ *D* sepcifies the output field delimiter with the next character. e.g) D;
+ *c* specifies a position or a range of characters to select. e.g) c23-25
+ *f* specifies a position or a range of fields to select. e.g) f1,f4-3
Let's see actual examples: *opts* may be empty; You can combine the following options into *opts*:
- <b>G;G;G</b>
+ *f* folds consecutive delimiters into one.
+ *w* uses white spaces for a field delimiter regardless of the input
delimiter specified in the selector.
+ *d* deletes the pattern space if the line is not delimited by
the input field delimiter
In principle, this can replace the *cut* utility with the *C* command.
Examples
--------
Here are some samples.
### G;G;G ###
Triple spaces input lines. If #QSE_SED_QUIET is on, <b>G;G;G;p</b>. Triple spaces input lines. If #QSE_SED_QUIET is on, <b>G;G;G;p</b>.
It works because the hold space is empty unless something is copied to it. It works because the hold space is empty unless something is copied to it.
- <b>$!d</b> ### $!d ###
Prints the last line. If #QSE_SED_QUIET is on, try <b>$p</b>. Prints the last line. If #QSE_SED_QUIET is on, try <b>$p</b>.
- <b>1!G;h;$!d</b> ### 1!G;h;$!d ###
Prints input lines in the reverse order. That is, it prints the last line Prints input lines in the reverse order. That is, it prints the last line
first and the first line last. first and the first line last.
@ -229,10 +233,10 @@ first and the first line last.
b b
a a
- <b>s/[[:space:]]{2,}/ /g</b> ### s/[[:space:]]{2,}/ /g ###
Compacts whitespaces if #QSE_SED_REXBOUND is on. Compacts whitespaces if #QSE_SED_EXTENDEDREX is on.
- <b>C/d:,f3,1/</b> ### C/d:,f3,1/ ###
Prints the third field and the first field from a colon separated text. Prints the third field and the first field from a colon separated text.
$ head -5 /etc/passwd $ head -5 /etc/passwd

View File

@ -4,6 +4,30 @@ QSESED Embedding Guide {#sed-embed}
Overview Overview
-------- --------
The QSESED library is divided into the core layer and the standard layer.
The core layer is a skeleton implmenetation that requires various callbacks
to be useful. The standard layer provides these callbacks in a general respect.
You can find core layer routines in <qse/sed/sed.h> while you can find standard
layer routines in <qse/sed/std.h>.
Embedding QSESED involves the following steps in the simplest form:
- create a new sed object
- compile commands
- execute commands
- destroy the sed object
The sample here shows a simple stream editor than can accepts a command string,
and optionally an input file name and an output file name.
\includelineno sed01.c
Accessing Pattern Space
-----------------------
Accessing Hold Space
--------------------
Embedding In C++ Embedding In C++
---------------- ----------------

View File

@ -413,21 +413,57 @@ public:
public: public:
friend class Awk; friend class Awk;
/// Console mode enumerators
enum Mode enum Mode
{ {
READ = QSE_AWK_RIO_CONSOLE_READ, READ = QSE_AWK_RIO_CONSOLE_READ, ///< open for input
WRITE = QSE_AWK_RIO_CONSOLE_WRITE WRITE = QSE_AWK_RIO_CONSOLE_WRITE ///< open for output
}; };
///
/// The Handler class is an abstract class that can be
/// implemented for customized I/O handling.
class QSE_EXPORT Handler class QSE_EXPORT Handler
{ {
public: public:
virtual int open (Console& io) = 0; /// The open() function is called before the initial
virtual int close (Console& io) = 0; /// access to the console for input and output.
/// It must return 0 for success and -1 for failure.
/// Upon successful opening, it can store information
/// required using setHandle() and setUflags().
/// The information set here is available in subsequent
/// calls to other methods and are accessible with
/// getHandle() and getUflags().
virtual int open (Console& io) = 0;
/// The close() function is called when the console
/// is not needed any more. It must return 0 for success
/// and -1 for failure.
virtual int close (Console& io) = 0;
/// The read() function is called when the console
/// is read for input. It must fill the buffer \a buf with
/// data not more than \a len characters and return the
/// number of characters filled into the buufer. It can
/// return 0 to indicate EOF and -1 for failure.
virtual ssize_t read (Console& io, char_t* buf, size_t len) = 0; virtual ssize_t read (Console& io, char_t* buf, size_t len) = 0;
/// The write() function is called when the console
/// is written for output. It can write upto \a len characters
/// available in the buffer \a buf and return the number of
/// characters written. It can return 0 to indicate EOF and -1
/// for failure.
virtual ssize_t write (Console& io, const char_t* buf, size_t len) = 0; virtual ssize_t write (Console& io, const char_t* buf, size_t len) = 0;
virtual int flush (Console& io) = 0;
virtual int next (Console& io) = 0; /// You may choose to buffer the data passed to the write()
/// function and perform actual writing when flush() is called.
/// It must return 0 for success and -1 for failure.
virtual int flush (Console& io) = 0;
/// The next() function is called when \b nextfile or
/// \b nextofile is executed. It must return 0 for success
/// and -1 for failure.
virtual int next (Console& io) = 0;
}; };
protected: protected:
@ -435,7 +471,10 @@ public:
~Console (); ~Console ();
public: public:
/// The getMode() function returns if the console is
/// opened for reading or writing.
Mode getMode () const; Mode getMode () const;
int setFileName (const char_t* name); int setFileName (const char_t* name);
int setFNR (long_t fnr); int setFNR (long_t fnr);

View File

@ -1,35 +1,71 @@
/*
* $Id$
*
Copyright 2006-2012 Chung, Hyung-Hwan.
This file is part of QSE.
QSE is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
QSE 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 Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with QSE. If not, see <http://www.gnu.org/licenses/>.
*/
#include <qse/awk/StdAwk.hpp> #include <qse/awk/StdAwk.hpp>
#include <qse/cmn/stdio.h> #include <qse/cmn/stdio.h>
#include <qse/cmn/main.h> #include <string>
#include <qse/cmn/mbwc.h>
#include <locale.h> #if defined(QSE_CHAR_IS_WCHAR)
#if defined(_WIN32) typedef std::wstring String;
# include <windows.h> #else
typedef std::string String;
#endif #endif
typedef QSE::StdAwk StdAwk;
typedef QSE::StdAwk::Run Run;
typedef QSE::StdAwk::Value Value;
class MyAwk: public StdAwk
{
public:
//
// this class overrides console methods to use
// string buffers for console input and output.
//
MyAwk () { }
~MyAwk () { close (); }
void setInput (const char_t* instr)
{
this->input = instr;
this->inptr = this->input.c_str();
this->inend = inptr + this->input.length();
}
void clearOutput () { this->output.clear (); }
const char_t* getOutput () { return this->output.c_str(); }
protected:
String input; // console input buffer
const char_t* inptr;
const char_t* inend;
String output; // console output buffer
int openConsole (Console& io) { return 0; }
int closeConsole (Console& io) { return 0; }
int flushConsole (Console& io) { return 0; }
int nextConsole (Console& io) { return 0; }
ssize_t readConsole (Console& io, char_t* data, size_t size)
{
if (this->inptr >= this->inend) return 0; // EOF
size_t x = qse_strxncpy (data, size, inptr, inend - inptr);
this->inptr += x;
return x;
}
ssize_t writeConsole (Console& io, const char_t* data, size_t size)
{
try { this->output.append (data, size); }
catch (...)
{
((Run*)io)->setError (QSE_AWK_ENOMEM);
return -1;
}
return size;
}
};
static void print_error ( static void print_error (
const QSE::StdAwk::loc_t& loc, const QSE::StdAwk::char_t* msg) const MyAwk::loc_t& loc, const MyAwk::char_t* msg)
{ {
if (loc.line > 0 || loc.colm > 0) if (loc.line > 0 || loc.colm > 0)
qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s at LINE %lu COLUMN %lu\n"), msg, loc.line, loc.colm); qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s at LINE %lu COLUMN %lu\n"), msg, loc.line, loc.colm);
@ -38,41 +74,55 @@ static void print_error (
} }
static int run_awk (QSE::StdAwk& awk) static int run_awk (MyAwk& awk)
{ {
// sample input string
const qse_char_t* instr = QSE_T(
"aardvark 555-5553 1200/300 B\n"
"alpo-net 555-3412 2400/1200/300 A\n"
"barfly 555-7685 1200/300 A\n"
"bites 555-1675 2400/1200/300 A\n"
"camelot 555-0542 300 C\n"
"core 555-2912 1200/300 C\n"
"fooey 555-1234 2400/1200/300 B\n"
"foot 555-6699 1200/300 B\n"
"macfoo 555-6480 1200/300 A\n"
"sdace 555-3430 2400/1200/300 A\n"
"sabafoo 555-2127 1200/300 C\n");
// ARGV[0] // ARGV[0]
if (awk.addArgument (QSE_T("awk05")) <= -1) return -1; if (awk.addArgument (QSE_T("awk22")) <= -1) return -1;
// ARGV[1] and/or the first console input file // prepare a script to print the second and the first column
if (awk.addArgument (QSE_T("Makefile")) <= -1) return -1; MyAwk::SourceString in (QSE_T("{ print $2, $1; }"));
// parse the script.
if (awk.parse (in, MyAwk::Source::NONE) == QSE_NULL) return -1;
MyAwk::Value r;
const qse_char_t* script = QSE_T( awk.setInput (instr); // locate the input string
"BEGIN { print \">> PRINT ALL LINES WHOSE LENGTH IS GREATER THAN 0\"; }\n" awk.clearOutput (); // clear the output string
"length($0) > 0 { print $0; count++; }\n" int x = awk.loop (&r); // execute the BEGIN, pattern-action, END blocks.
"END { print \">> TOTAL\", count, \"LINES\"; }\n"
);
QSE::StdAwk::SourceString in (script); if (x >= 0)
QSE::StdAwk::SourceFile out (QSE_T("awk05.out")); {
qse_printf (QSE_T("%s"), awk.getOutput()); // print the console output
qse_printf (QSE_T("-----------------------------\n"));
}
// parse the script string and deparse it to awk05.out. return x;
if (awk.parse (in, out) == QSE_NULL) return -1;
QSE::StdAwk::Value r;
// execute the BEGIN, pattern-action, END blocks.
return awk.loop (&r);
} }
static int awk_main (int argc, qse_char_t* argv[]) int main (int argc, char* argv[])
{ {
QSE::StdAwk awk; MyAwk awk;
int ret = awk.open (); int ret = awk.open ();
if (ret >= 0) ret = run_awk (awk); if (ret >= 0) ret = run_awk (awk);
if (ret <= -1) if (ret <= -1)
{ {
QSE::StdAwk::loc_t loc = awk.getErrorLocation(); MyAwk::loc_t loc = awk.getErrorLocation();
print_error (loc, awk.getErrorMessage()); print_error (loc, awk.getErrorMessage());
} }
@ -80,26 +130,3 @@ static int awk_main (int argc, qse_char_t* argv[])
return ret; return ret;
} }
int qse_main (int argc, qse_achar_t* argv[])
{
#if defined(_WIN32)
char locale[100];
UINT codepage = GetConsoleOutputCP();
if (codepage == CP_UTF8)
{
/*SetConsoleOUtputCP (CP_UTF8);*/
qse_setdflcmgrbyid (QSE_CMGR_UTF8);
}
else
{
sprintf (locale, ".%u", (unsigned int)codepage);
setlocale (LC_ALL, locale);
qse_setdflcmgrbyid (QSE_CMGR_SLMB);
}
#else
setlocale (LC_ALL, "");
qse_setdflcmgrbyid (QSE_CMGR_SLMB);
#endif
return qse_runmain (argc,argv,awk_main);
}

View File

@ -1,35 +1,98 @@
/*
* $Id$
*
Copyright 2006-2012 Chung, Hyung-Hwan.
This file is part of QSE.
QSE is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
QSE 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 Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with QSE. If not, see <http://www.gnu.org/licenses/>.
*/
#include <qse/awk/StdAwk.hpp> #include <qse/awk/StdAwk.hpp>
#include <qse/cmn/stdio.h> #include <qse/cmn/stdio.h>
#include <qse/cmn/main.h> #include <string>
#include <qse/cmn/mbwc.h>
#include <locale.h> #if defined(QSE_CHAR_IS_WCHAR)
#if defined(_WIN32) typedef std::wstring String;
# include <windows.h> #else
typedef std::string String;
#endif #endif
typedef QSE::StdAwk StdAwk;
typedef QSE::StdAwk::Run Run;
typedef QSE::StdAwk::Value Value;
class MyAwk: public StdAwk
{
public:
//
// this class overrides console methods to use
// string buffers for console input and output.
//
MyAwk () { }
~MyAwk () { close (); }
void setInput (const char_t* instr)
{
this->input = instr;
this->inptr = this->input.c_str();
this->inend = inptr + this->input.length();
}
const char_t* getOutput () { return this->output.c_str(); }
protected:
String input; // console input buffer
const char_t* inptr;
const char_t* inend;
String output; // console output buffer
int openConsole (Console& io)
{
if (io.getMode() == Console::READ)
{
this->inptr = this->input.c_str();
this->inend = inptr + this->input.length();
}
else
{
this->output.clear ();
}
return 1; // return open-success
}
int closeConsole (Console& io)
{
return 0; // return success
}
int flushConsole (Console& io)
{
// there is nothing to flush since a string buffer
// is used for a console output. just return success.
return 0;
}
int nextConsole (Console& io)
{
// this stripped-down awk doesn't honor the nextfile statement
// or the nextofile statement. just return failure.
return -1;
}
ssize_t readConsole (Console& io, char_t* data, size_t size)
{
if (this->inptr >= this->inend) return 0; // EOF
size_t x = qse_strxncpy (data, size, inptr, inend - inptr);
this->inptr += x;
return x;
}
ssize_t writeConsole (Console& io, const char_t* data, size_t size)
{
try { this->output.append (data, size); }
catch (...)
{
((Run*)io)->setError (QSE_AWK_ENOMEM);
return -1;
}
return size;
}
};
static void print_error ( static void print_error (
const QSE::StdAwk::loc_t& loc, const QSE::StdAwk::char_t* msg) const MyAwk::loc_t& loc, const MyAwk::char_t* msg)
{ {
if (loc.line > 0 || loc.colm > 0) if (loc.line > 0 || loc.colm > 0)
qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s at LINE %lu COLUMN %lu\n"), msg, loc.line, loc.colm); qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s at LINE %lu COLUMN %lu\n"), msg, loc.line, loc.colm);
@ -38,94 +101,85 @@ static void print_error (
} }
static int run_awk (QSE::StdAwk& awk) static int run_awk (MyAwk& awk)
{ {
QSE::StdAwk::Run* run; // sample input string
const qse_char_t* instr = QSE_T(
"aardvark 555-5553 1200/300 B\n"
"alpo-net 555-3412 2400/1200/300 A\n"
"barfly 555-7685 1200/300 A\n"
"bites 555-1675 2400/1200/300 A\n"
"camelot 555-0542 300 C\n"
"core 555-2912 1200/300 C\n"
"fooey 555-1234 2400/1200/300 B\n"
"foot 555-6699 1200/300 B\n"
"macfoo 555-6480 1200/300 A\n"
"sdace 555-3430 2400/1200/300 A\n"
"sabafoo 555-2127 1200/300 C\n");
const qse_char_t* script = QSE_T( const qse_char_t* instr2 = QSE_T(
"function add (a, b) { return a + b }\n" "aardvark 555-5553 1200/300 A\n"
"function mul (a, b) { return a * b }\n" "alpo-net 555-3412 2400/1200/300 B\n"
"function div (a, b) { return a / b }\n" "barfly 555-7685 1200/300 C\n"
"function sine (a) { return sin(a) }\n" "bites 555-1675 2400/1200/300 A\n"
); "camelot 555-0542 300 C\n"
"core 555-2912 1200/300 B\n"
"fooey 555-1234 2400/1200/300 A\n"
"foot 555-6699 1200/300 A\n"
"macfoo 555-6480 1200/300 B\n"
"sdace 555-3430 2400/1200/300 B\n"
"sabafoo 555-2127 1200/300 A\n");
QSE::StdAwk::SourceString in (script); // ARGV[0]
QSE::StdAwk::SourceFile out (QSE_T("awk06.out")); if (awk.addArgument (QSE_T("awk23")) <= -1) return -1;
// parse the script and deparse it to awk06.out // prepare a string to print lines with A in the fourth column
run = awk.parse (in, out); MyAwk::SourceString in (QSE_T("$4 == \"A\" { print $2, $1, $3; }"));
if (run == QSE_NULL) return -1;
// parse the script.
if (awk.parse (in, MyAwk::Source::NONE) == QSE_NULL) return -1;
MyAwk::Value r;
QSE::StdAwk::Value arg[2]; awk.setInput (instr); // locate the input string
if (arg[0].setInt (run, -20) <= -1) return -1; int x = awk.loop (&r); // execute the BEGIN, pattern-action, END blocks.
if (arg[1].setStr (run, QSE_T("51")) <= -1) return -1;
// ret = add (-20, 51) if (x >= 0)
QSE::StdAwk::Value ret; {
if (awk.call (QSE_T("add"), &ret, arg, 2) <= -1) return -1; qse_printf (QSE_T("%s"), awk.getOutput()); // print the console output
qse_printf (QSE_T("-----------------------------\n"));
// ret = mul (ret, 51); awk.setInput (instr2);
arg[0] = ret;
if (awk.call (QSE_T("mul"), &ret, arg, 2) <= -1) return -1;
// ret = div (ret, 2); // reset the runtime context so that the next loop() method
arg[0] = ret; // is performed over a new console stream.
if (arg[1].setFlt (run, 2) <= -1) return -1; if (awk.resetRunContext() == QSE_NULL) return -1;
if (awk.call (QSE_T("div"), &ret, arg, 2) <= -1) return -1;
// output the result in various types int x = awk.loop (&r);
qse_printf (QSE_T("RESULT: (int) [%lld]\n"), (long long)ret.toInt());
qse_printf (QSE_T(" (flt) [%Lf]\n"), (long double)ret.toFlt());
qse_printf (QSE_T(" (str) [%s]\n"), ret.toStr(QSE_NULL));
// ret = sine (ret); if (x >= 0)
arg[0] = ret; {
if (awk.call (QSE_T("sine"), &ret, arg, 1) <= -1) return -1; qse_printf (QSE_T("%s"), awk.getOutput());
qse_printf (QSE_T("-----------------------------\n"));
}
}
// output the result in various types return x;
qse_printf (QSE_T("RESULT: (int) [%lld]\n"), (long long)ret.toInt());
qse_printf (QSE_T(" (flt) [%Lf]\n"), (long double)ret.toFlt());
qse_printf (QSE_T(" (str) [%s]\n"), ret.toStr(QSE_NULL));
return 0;
} }
static int awk_main (int argc, qse_char_t* argv[]) int main (int argc, char* argv[])
{ {
QSE::StdAwk awk; MyAwk awk;
int ret = awk.open();
int ret = awk.open ();
if (ret >= 0) ret = run_awk (awk); if (ret >= 0) ret = run_awk (awk);
if (ret <= -1) if (ret <= -1)
{ {
QSE::StdAwk::loc_t loc = awk.getErrorLocation(); MyAwk::loc_t loc = awk.getErrorLocation();
print_error (loc, awk.getErrorMessage()); print_error (loc, awk.getErrorMessage());
} }
awk.close (); awk.close ();
return -1; return ret;
} }
int qse_main (int argc, qse_achar_t* argv[])
{
#if defined(_WIN32)
char locale[100];
UINT codepage = GetConsoleOutputCP();
if (codepage == CP_UTF8)
{
/*SetConsoleOUtputCP (CP_UTF8);*/
qse_setdflcmgrbyid (QSE_CMGR_UTF8);
}
else
{
sprintf (locale, ".%u", (unsigned int)codepage);
setlocale (LC_ALL, locale);
qse_setdflcmgrbyid (QSE_CMGR_SLMB);
}
#else
setlocale (LC_ALL, "");
qse_setdflcmgrbyid (QSE_CMGR_SLMB);
#endif
return qse_runmain (argc,argv,awk_main);
}

View File

@ -22,96 +22,14 @@
#include <qse/cmn/stdio.h> #include <qse/cmn/stdio.h>
#include <qse/cmn/main.h> #include <qse/cmn/main.h>
#include <qse/cmn/mbwc.h> #include <qse/cmn/mbwc.h>
#include <qse/cmn/str.h>
#include <locale.h> #include <locale.h>
#if defined(_WIN32) #if defined(_WIN32)
# include <windows.h> # include <windows.h>
#endif #endif
#include <string>
#if defined(QSE_CHAR_IS_WCHAR)
typedef std::wstring String;
#else
typedef std::string String;
#endif
typedef QSE::StdAwk StdAwk;
typedef QSE::StdAwk::Run Run;
typedef QSE::StdAwk::Value Value;
class MyAwk: public StdAwk
{
public:
//
// this class overrides console methods to use
// string buffers for console input and output.
//
MyAwk () { }
~MyAwk () { close (); }
void setInput (const char_t* instr)
{
this->input = instr;
this->inptr = this->input.c_str();
this->inend = inptr + this->input.length();
}
void clearOutput () { this->output.clear (); }
const char_t* getOutput () { return this->output.c_str(); }
protected:
String input; // console input buffer
const char_t* inptr;
const char_t* inend;
String output; // console output buffer
int openConsole (Console& io)
{
return 1; // return open-success
}
int closeConsole (Console& io)
{
return 0; // return success
}
int flushConsole (Console& io)
{
// there is nothing to flush since a string buffer
// is used for a console output. just return success.
return 0;
}
int nextConsole (Console& io)
{
// this stripped-down awk doesn't honor the nextfile statement
// or the nextofile statement. just return success.
return 0;
}
ssize_t readConsole (Console& io, char_t* data, size_t size)
{
if (this->inptr >= this->inend) return 0; // EOF
size_t x = qse_strxncpy (data, size, inptr, inend - inptr);
this->inptr += x;
return x;
}
ssize_t writeConsole (Console& io, const char_t* data, size_t size)
{
try { this->output.append (data, size); }
catch (...)
{
((Run*)io)->setError (QSE_AWK_ENOMEM);
return -1;
}
return size;
}
};
static void print_error ( static void print_error (
const MyAwk::loc_t& loc, const MyAwk::char_t* msg) const QSE::StdAwk::loc_t& loc, const QSE::StdAwk::char_t* msg)
{ {
if (loc.line > 0 || loc.colm > 0) if (loc.line > 0 || loc.colm > 0)
qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s at LINE %lu COLUMN %lu\n"), msg, loc.line, loc.colm); qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s at LINE %lu COLUMN %lu\n"), msg, loc.line, loc.colm);
@ -120,70 +38,41 @@ static void print_error (
} }
static int run_awk (MyAwk& awk) static int run_awk (QSE::StdAwk& awk)
{ {
// sample input string
const qse_char_t* instr = QSE_T(
"aardvark 555-5553 1200/300 B\n"
"alpo-net 555-3412 2400/1200/300 A\n"
"barfly 555-7685 1200/300 A\n"
"bites 555-1675 2400/1200/300 A\n"
"camelot 555-0542 300 C\n"
"core 555-2912 1200/300 C\n"
"fooey 555-1234 2400/1200/300 B\n"
"foot 555-6699 1200/300 B\n"
"macfoo 555-6480 1200/300 A\n"
"sdace 555-3430 2400/1200/300 A\n"
"sabafoo 555-2127 1200/300 C\n");
// ARGV[0] // ARGV[0]
if (awk.addArgument (QSE_T("awk12")) <= -1) return -1; if (awk.addArgument (QSE_T("awk05")) <= -1) return -1;
// prepare a script to print the second and the first column // ARGV[1] and/or the first console input file
MyAwk::SourceString in (QSE_T("{ print $2, $1; }")); if (awk.addArgument (QSE_T("Makefile")) <= -1) return -1;
// parse the script.
if (awk.parse (in, MyAwk::Source::NONE) == QSE_NULL) return -1;
MyAwk::Value r;
awk.setInput (instr); // locate the input string const qse_char_t* script = QSE_T(
awk.clearOutput (); // clear the output string "BEGIN { print \">> PRINT ALL LINES WHOSE LENGTH IS GREATER THAN 0\"; }\n"
int x = awk.loop (&r); // execute the BEGIN, pattern-action, END blocks. "length($0) > 0 { print $0; count++; }\n"
"END { print \">> TOTAL\", count, \"LINES\"; }\n"
);
if (x >= 0) QSE::StdAwk::SourceString in (script);
{ QSE::StdAwk::SourceFile out (QSE_T("awk05.out"));
qse_printf (QSE_T("%s"), awk.getOutput()); // print the console output
qse_printf (QSE_T("-----------------------------\n"));
// prepare a string to print lines with A in the fourth column // parse the script string and deparse it to awk05.out.
MyAwk::SourceString in2 (QSE_T("$4 == \"A\" { print $1; }")); if (awk.parse (in, out) == QSE_NULL) return -1;
if (awk.parse (in2, MyAwk::Source::NONE) == QSE_NULL) return -1;
awk.setInput (instr); QSE::StdAwk::Value r;
awk.clearOutput (); // execute the BEGIN, pattern-action, END blocks.
return awk.loop (&r);
int x = awk.loop (&r);
if (x >= 0)
{
qse_printf (QSE_T("%s"), awk.getOutput());
qse_printf (QSE_T("-----------------------------\n"));
}
}
return x;
} }
static int awk_main (int argc, qse_char_t* argv[]) static int awk_main (int argc, qse_char_t* argv[])
{ {
MyAwk awk; QSE::StdAwk awk;
int ret = awk.open (); int ret = awk.open ();
if (ret >= 0) ret = run_awk (awk); if (ret >= 0) ret = run_awk (awk);
if (ret <= -1) if (ret <= -1)
{ {
MyAwk::loc_t loc = awk.getErrorLocation(); QSE::StdAwk::loc_t loc = awk.getErrorLocation();
print_error (loc, awk.getErrorMessage()); print_error (loc, awk.getErrorMessage());
} }

View File

@ -22,105 +22,14 @@
#include <qse/cmn/stdio.h> #include <qse/cmn/stdio.h>
#include <qse/cmn/main.h> #include <qse/cmn/main.h>
#include <qse/cmn/mbwc.h> #include <qse/cmn/mbwc.h>
#include <qse/cmn/str.h>
#include <locale.h> #include <locale.h>
#if defined(_WIN32) #if defined(_WIN32)
# include <windows.h> # include <windows.h>
#endif #endif
#include <string>
#if defined(QSE_CHAR_IS_WCHAR)
typedef std::wstring String;
#else
typedef std::string String;
#endif
typedef QSE::StdAwk StdAwk;
typedef QSE::StdAwk::Run Run;
typedef QSE::StdAwk::Value Value;
class MyAwk: public StdAwk
{
public:
//
// this class overrides console methods to use
// string buffers for console input and output.
//
MyAwk () { }
~MyAwk () { close (); }
void setInput (const char_t* instr)
{
this->input = instr;
this->inptr = this->input.c_str();
this->inend = inptr + this->input.length();
}
const char_t* getOutput () { return this->output.c_str(); }
protected:
String input; // console input buffer
const char_t* inptr;
const char_t* inend;
String output; // console output buffer
int openConsole (Console& io)
{
if (io.getMode() == Console::READ)
{
this->inptr = this->input.c_str();
this->inend = inptr + this->input.length();
}
else
{
this->output.clear ();
}
return 1; // return open-success
}
int closeConsole (Console& io)
{
return 0; // return success
}
int flushConsole (Console& io)
{
// there is nothing to flush since a string buffer
// is used for a console output. just return success.
return 0;
}
int nextConsole (Console& io)
{
// this stripped-down awk doesn't honor the nextfile statement
// or the nextofile statement. just return failure.
return -1;
}
ssize_t readConsole (Console& io, char_t* data, size_t size)
{
if (this->inptr >= this->inend) return 0; // EOF
size_t x = qse_strxncpy (data, size, inptr, inend - inptr);
this->inptr += x;
return x;
}
ssize_t writeConsole (Console& io, const char_t* data, size_t size)
{
try { this->output.append (data, size); }
catch (...)
{
((Run*)io)->setError (QSE_AWK_ENOMEM);
return -1;
}
return size;
}
};
static void print_error ( static void print_error (
const MyAwk::loc_t& loc, const MyAwk::char_t* msg) const QSE::StdAwk::loc_t& loc, const QSE::StdAwk::char_t* msg)
{ {
if (loc.line > 0 || loc.colm > 0) if (loc.line > 0 || loc.colm > 0)
qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s at LINE %lu COLUMN %lu\n"), msg, loc.line, loc.colm); qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s at LINE %lu COLUMN %lu\n"), msg, loc.line, loc.colm);
@ -129,86 +38,73 @@ static void print_error (
} }
static int run_awk (MyAwk& awk) static int run_awk (QSE::StdAwk& awk)
{ {
// sample input string QSE::StdAwk::Run* run;
const qse_char_t* instr = QSE_T(
"aardvark 555-5553 1200/300 B\n"
"alpo-net 555-3412 2400/1200/300 A\n"
"barfly 555-7685 1200/300 A\n"
"bites 555-1675 2400/1200/300 A\n"
"camelot 555-0542 300 C\n"
"core 555-2912 1200/300 C\n"
"fooey 555-1234 2400/1200/300 B\n"
"foot 555-6699 1200/300 B\n"
"macfoo 555-6480 1200/300 A\n"
"sdace 555-3430 2400/1200/300 A\n"
"sabafoo 555-2127 1200/300 C\n");
const qse_char_t* instr2 = QSE_T( const qse_char_t* script = QSE_T(
"aardvark 555-5553 1200/300 A\n" "function add (a, b) { return a + b }\n"
"alpo-net 555-3412 2400/1200/300 B\n" "function mul (a, b) { return a * b }\n"
"barfly 555-7685 1200/300 C\n" "function div (a, b) { return a / b }\n"
"bites 555-1675 2400/1200/300 A\n" "function sine (a) { return sin(a) }\n"
"camelot 555-0542 300 C\n" );
"core 555-2912 1200/300 B\n"
"fooey 555-1234 2400/1200/300 A\n"
"foot 555-6699 1200/300 A\n"
"macfoo 555-6480 1200/300 B\n"
"sdace 555-3430 2400/1200/300 B\n"
"sabafoo 555-2127 1200/300 A\n");
// ARGV[0] QSE::StdAwk::SourceString in (script);
if (awk.addArgument (QSE_T("awk13")) <= -1) return -1; QSE::StdAwk::SourceFile out (QSE_T("awk06.out"));
// prepare a string to print lines with A in the fourth column // parse the script and deparse it to awk06.out
MyAwk::SourceString in (QSE_T("$4 == \"A\" { print $2, $1, $3; }")); run = awk.parse (in, out);
if (run == QSE_NULL) return -1;
// parse the script.
if (awk.parse (in, MyAwk::Source::NONE) == QSE_NULL) return -1;
MyAwk::Value r;
awk.setInput (instr); // locate the input string QSE::StdAwk::Value arg[2];
int x = awk.loop (&r); // execute the BEGIN, pattern-action, END blocks. if (arg[0].setInt (run, -20) <= -1) return -1;
if (arg[1].setStr (run, QSE_T("51")) <= -1) return -1;
if (x >= 0) // ret = add (-20, 51)
{ QSE::StdAwk::Value ret;
qse_printf (QSE_T("%s"), awk.getOutput()); // print the console output if (awk.call (QSE_T("add"), &ret, arg, 2) <= -1) return -1;
qse_printf (QSE_T("-----------------------------\n"));
awk.setInput (instr2); // ret = mul (ret, 51);
arg[0] = ret;
if (awk.call (QSE_T("mul"), &ret, arg, 2) <= -1) return -1;
// reset the runtime context so that the next loop() method // ret = div (ret, 2);
// is performed over a new console stream. arg[0] = ret;
if (awk.resetRunContext() == QSE_NULL) return -1; if (arg[1].setFlt (run, 2) <= -1) return -1;
if (awk.call (QSE_T("div"), &ret, arg, 2) <= -1) return -1;
int x = awk.loop (&r); // output the result in various types
qse_printf (QSE_T("RESULT: (int) [%lld]\n"), (long long)ret.toInt());
qse_printf (QSE_T(" (flt) [%Lf]\n"), (long double)ret.toFlt());
qse_printf (QSE_T(" (str) [%s]\n"), ret.toStr(QSE_NULL));
if (x >= 0) // ret = sine (ret);
{ arg[0] = ret;
qse_printf (QSE_T("%s"), awk.getOutput()); if (awk.call (QSE_T("sine"), &ret, arg, 1) <= -1) return -1;
qse_printf (QSE_T("-----------------------------\n"));
}
}
return x; // output the result in various types
qse_printf (QSE_T("RESULT: (int) [%lld]\n"), (long long)ret.toInt());
qse_printf (QSE_T(" (flt) [%Lf]\n"), (long double)ret.toFlt());
qse_printf (QSE_T(" (str) [%s]\n"), ret.toStr(QSE_NULL));
return 0;
} }
static int awk_main (int argc, qse_char_t* argv[]) static int awk_main (int argc, qse_char_t* argv[])
{ {
MyAwk awk; QSE::StdAwk awk;
int ret = awk.open();
int ret = awk.open ();
if (ret >= 0) ret = run_awk (awk); if (ret >= 0) ret = run_awk (awk);
if (ret <= -1) if (ret <= -1)
{ {
MyAwk::loc_t loc = awk.getErrorLocation(); QSE::StdAwk::loc_t loc = awk.getErrorLocation();
print_error (loc, awk.getErrorMessage()); print_error (loc, awk.getErrorMessage());
} }
awk.close (); awk.close ();
return ret; return -1;
} }
int qse_main (int argc, qse_achar_t* argv[]) int qse_main (int argc, qse_achar_t* argv[])
@ -231,6 +127,5 @@ int qse_main (int argc, qse_achar_t* argv[])
setlocale (LC_ALL, ""); setlocale (LC_ALL, "");
qse_setdflcmgrbyid (QSE_CMGR_SLMB); qse_setdflcmgrbyid (QSE_CMGR_SLMB);
#endif #endif
return qse_runmain (argc,argv,awk_main); return qse_runmain (argc,argv,awk_main);
} }

View File

@ -15,20 +15,20 @@ LDADD += $(UNICOWS_LIBS)
endif endif
endif endif
bin_PROGRAMS = sed01 bin_PROGRAMS = sed01
sed01_SOURCES = sed01.c sed01_SOURCES = sed01.c
sed01_LDADD = $(LDADD) sed01_LDADD = $(LDADD)
if ENABLE_CXX if ENABLE_CXX
CXXLIB = -lqsesedxx -lqsecmnxx CXXLIB = -lqsesedxx -lqsecmnxx
bin_PROGRAMS += sed02 sed03 bin_PROGRAMS += sed21 sed22
sed02_SOURCES = sed02.cpp sed21_SOURCES = sed21.cpp
sed02_LDADD = $(CXXLIB) $(LDADD) sed21_LDADD = $(CXXLIB) $(LDADD)
sed03_SOURCES = sed03.cpp sed22_SOURCES = sed22.cpp
sed03_LDADD = $(CXXLIB) $(LDADD) sed22_LDADD = $(CXXLIB) $(LDADD)
endif endif

View File

@ -36,7 +36,7 @@ build_triplet = @build@
host_triplet = @host@ host_triplet = @host@
@WCHAR_TRUE@@WIN32_TRUE@am__append_1 = $(UNICOWS_LIBS) @WCHAR_TRUE@@WIN32_TRUE@am__append_1 = $(UNICOWS_LIBS)
bin_PROGRAMS = sed01$(EXEEXT) $(am__EXEEXT_1) bin_PROGRAMS = sed01$(EXEEXT) $(am__EXEEXT_1)
@ENABLE_CXX_TRUE@am__append_2 = sed02 sed03 @ENABLE_CXX_TRUE@am__append_2 = sed21 sed22
subdir = samples/sed subdir = samples/sed
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@ -52,7 +52,7 @@ mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = $(top_builddir)/include/qse/config.h CONFIG_HEADER = $(top_builddir)/include/qse/config.h
CONFIG_CLEAN_FILES = CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES = CONFIG_CLEAN_VPATH_FILES =
@ENABLE_CXX_TRUE@am__EXEEXT_1 = sed02$(EXEEXT) sed03$(EXEEXT) @ENABLE_CXX_TRUE@am__EXEEXT_1 = sed21$(EXEEXT) sed22$(EXEEXT)
am__installdirs = "$(DESTDIR)$(bindir)" am__installdirs = "$(DESTDIR)$(bindir)"
PROGRAMS = $(bin_PROGRAMS) PROGRAMS = $(bin_PROGRAMS)
am_sed01_OBJECTS = sed01.$(OBJEXT) am_sed01_OBJECTS = sed01.$(OBJEXT)
@ -61,15 +61,15 @@ am__DEPENDENCIES_1 =
@WCHAR_TRUE@@WIN32_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) @WCHAR_TRUE@@WIN32_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1)
am__DEPENDENCIES_3 = $(am__DEPENDENCIES_2) am__DEPENDENCIES_3 = $(am__DEPENDENCIES_2)
sed01_DEPENDENCIES = $(am__DEPENDENCIES_3) sed01_DEPENDENCIES = $(am__DEPENDENCIES_3)
am__sed02_SOURCES_DIST = sed02.cpp am__sed21_SOURCES_DIST = sed21.cpp
@ENABLE_CXX_TRUE@am_sed02_OBJECTS = sed02.$(OBJEXT) @ENABLE_CXX_TRUE@am_sed21_OBJECTS = sed21.$(OBJEXT)
sed02_OBJECTS = $(am_sed02_OBJECTS) sed21_OBJECTS = $(am_sed21_OBJECTS)
@ENABLE_CXX_TRUE@sed02_DEPENDENCIES = $(am__DEPENDENCIES_1) \ @ENABLE_CXX_TRUE@sed21_DEPENDENCIES = $(am__DEPENDENCIES_1) \
@ENABLE_CXX_TRUE@ $(am__DEPENDENCIES_3) @ENABLE_CXX_TRUE@ $(am__DEPENDENCIES_3)
am__sed03_SOURCES_DIST = sed03.cpp am__sed22_SOURCES_DIST = sed22.cpp
@ENABLE_CXX_TRUE@am_sed03_OBJECTS = sed03.$(OBJEXT) @ENABLE_CXX_TRUE@am_sed22_OBJECTS = sed22.$(OBJEXT)
sed03_OBJECTS = $(am_sed03_OBJECTS) sed22_OBJECTS = $(am_sed22_OBJECTS)
@ENABLE_CXX_TRUE@sed03_DEPENDENCIES = $(am__DEPENDENCIES_1) \ @ENABLE_CXX_TRUE@sed22_DEPENDENCIES = $(am__DEPENDENCIES_1) \
@ENABLE_CXX_TRUE@ $(am__DEPENDENCIES_3) @ENABLE_CXX_TRUE@ $(am__DEPENDENCIES_3)
DEFAULT_INCLUDES = DEFAULT_INCLUDES =
depcomp = $(SHELL) $(top_srcdir)/ac/depcomp depcomp = $(SHELL) $(top_srcdir)/ac/depcomp
@ -93,9 +93,9 @@ CXXLD = $(CXX)
CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
$(LDFLAGS) -o $@ $(LDFLAGS) -o $@
SOURCES = $(sed01_SOURCES) $(sed02_SOURCES) $(sed03_SOURCES) SOURCES = $(sed01_SOURCES) $(sed21_SOURCES) $(sed22_SOURCES)
DIST_SOURCES = $(sed01_SOURCES) $(am__sed02_SOURCES_DIST) \ DIST_SOURCES = $(sed01_SOURCES) $(am__sed21_SOURCES_DIST) \
$(am__sed03_SOURCES_DIST) $(am__sed22_SOURCES_DIST)
ETAGS = etags ETAGS = etags
CTAGS = ctags CTAGS = ctags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@ -277,13 +277,13 @@ AM_CPPFLAGS = \
-I$(includedir) -I$(includedir)
LDADD = -lqsesed -lqsecmn $(am__append_1) LDADD = -lqsesed -lqsecmn $(am__append_1)
sed01_SOURCES = sed01.c sed01_SOURCES = sed01.c
sed01_LDADD = $(LDADD) sed01_LDADD = $(LDADD)
@ENABLE_CXX_TRUE@CXXLIB = -lqsesedxx -lqsecmnxx @ENABLE_CXX_TRUE@CXXLIB = -lqsesedxx -lqsecmnxx
@ENABLE_CXX_TRUE@sed02_SOURCES = sed02.cpp @ENABLE_CXX_TRUE@sed21_SOURCES = sed21.cpp
@ENABLE_CXX_TRUE@sed02_LDADD = $(CXXLIB) $(LDADD) @ENABLE_CXX_TRUE@sed21_LDADD = $(CXXLIB) $(LDADD)
@ENABLE_CXX_TRUE@sed03_SOURCES = sed03.cpp @ENABLE_CXX_TRUE@sed22_SOURCES = sed22.cpp
@ENABLE_CXX_TRUE@sed03_LDADD = $(CXXLIB) $(LDADD) @ENABLE_CXX_TRUE@sed22_LDADD = $(CXXLIB) $(LDADD)
all: all-am all: all-am
.SUFFIXES: .SUFFIXES:
@ -364,12 +364,12 @@ clean-binPROGRAMS:
sed01$(EXEEXT): $(sed01_OBJECTS) $(sed01_DEPENDENCIES) $(EXTRA_sed01_DEPENDENCIES) sed01$(EXEEXT): $(sed01_OBJECTS) $(sed01_DEPENDENCIES) $(EXTRA_sed01_DEPENDENCIES)
@rm -f sed01$(EXEEXT) @rm -f sed01$(EXEEXT)
$(LINK) $(sed01_OBJECTS) $(sed01_LDADD) $(LIBS) $(LINK) $(sed01_OBJECTS) $(sed01_LDADD) $(LIBS)
sed02$(EXEEXT): $(sed02_OBJECTS) $(sed02_DEPENDENCIES) $(EXTRA_sed02_DEPENDENCIES) sed21$(EXEEXT): $(sed21_OBJECTS) $(sed21_DEPENDENCIES) $(EXTRA_sed21_DEPENDENCIES)
@rm -f sed02$(EXEEXT) @rm -f sed21$(EXEEXT)
$(CXXLINK) $(sed02_OBJECTS) $(sed02_LDADD) $(LIBS) $(CXXLINK) $(sed21_OBJECTS) $(sed21_LDADD) $(LIBS)
sed03$(EXEEXT): $(sed03_OBJECTS) $(sed03_DEPENDENCIES) $(EXTRA_sed03_DEPENDENCIES) sed22$(EXEEXT): $(sed22_OBJECTS) $(sed22_DEPENDENCIES) $(EXTRA_sed22_DEPENDENCIES)
@rm -f sed03$(EXEEXT) @rm -f sed22$(EXEEXT)
$(CXXLINK) $(sed03_OBJECTS) $(sed03_LDADD) $(LIBS) $(CXXLINK) $(sed22_OBJECTS) $(sed22_LDADD) $(LIBS)
mostlyclean-compile: mostlyclean-compile:
-rm -f *.$(OBJEXT) -rm -f *.$(OBJEXT)
@ -378,8 +378,8 @@ distclean-compile:
-rm -f *.tab.c -rm -f *.tab.c
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sed01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sed01.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sed02.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sed21.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sed03.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sed22.Po@am__quote@
.c.o: .c.o:
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<

View File

@ -1,23 +1,3 @@
/*
* $Id$
*
Copyright 2006-2012 Chung, Hyung-Hwan.
This file is part of QSE.
QSE is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
QSE 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 Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with QSE. If not, see <http://www.gnu.org/licenses/>.
*/
#include <qse/sed/std.h> #include <qse/sed/std.h>
#include <qse/cmn/main.h> #include <qse/cmn/main.h>
#include <qse/cmn/mbwc.h> #include <qse/cmn/mbwc.h>
@ -75,7 +55,7 @@ int qse_main (int argc, qse_achar_t* argv[])
UINT codepage = GetConsoleOutputCP(); UINT codepage = GetConsoleOutputCP();
if (codepage == CP_UTF8) if (codepage == CP_UTF8)
{ {
/*SetConsoleOUtputCP (CP_UTF8);*/ /*SetConsoleOutputCP (CP_UTF8);*/
qse_setdflcmgrbyid (QSE_CMGR_UTF8); qse_setdflcmgrbyid (QSE_CMGR_UTF8);
} }
else else

View File

@ -1,23 +1,3 @@
/**
* $Id$
*
Copyright 2006-2012 Chung, Hyung-Hwan.
This file is part of QSE.
QSE is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
QSE 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 Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with QSE. If not, see <http://www.gnu.org/licenses/>.
*/
#include <qse/sed/StdSed.hpp> #include <qse/sed/StdSed.hpp>
#include <qse/cmn/main.h> #include <qse/cmn/main.h>
#include <qse/cmn/mbwc.h> #include <qse/cmn/mbwc.h>