markdown: /************************************************* * pcregrep program * *************************************************/ /* This is a grep program that uses the PCRE regular expression library to do its pattern matching. On a Unix or Win32 system it can recurse into directories. Copyright (c) 1997-2009 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * 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. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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. ----------------------------------------------------------------------------- */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include <ctype.h> #include <locale.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <errno.h> #include <sys/types.h> #include <sys/stat.h> #ifdef HAVE_UNISTD_H #include <unistd.h> #endif #ifdef SUPPORT_LIBZ #include <zlib.h> #endif #ifdef SUPPORT_LIBBZ2 #include <bzlib.h> #endif #include "pcre.h" #define FALSE 0 #define TRUE 1 typedef int BOOL; #define MAX_PATTERN_COUNT 100 #define OFFSET_SIZE 99 #if BUFSIZ > 8192 #define MBUFTHIRD BUFSIZ #else #define MBUFTHIRD 8192 #endif /* Values for the "filenames" variable, which specifies options for file name output. The order is important; it is assumed that a file name is wanted for all values greater than FN_DEFAULT. */ enum { FN_NONE, FN_DEFAULT, FN_MATCH_ONLY, FN_NOMATCH_ONLY, FN_FORCE }; /* File reading styles */ enum { FR_PLAIN, FR_LIBZ, FR_LIBBZ2 }; /* Actions for the -d and -D options */ enum { dee_READ, dee_SKIP, dee_RECURSE }; enum { DEE_READ, DEE_SKIP }; /* Actions for special processing options (flag bits) */ #define PO_WORD_MATCH 0x0001 #define PO_LINE_MATCH 0x0002 #define PO_FIXED_STRINGS 0x0004 /* Line ending types */ enum { EL_LF, EL_CR, EL_CRLF, EL_ANY, EL_ANYCRLF }; /************************************************* * Global variables * *************************************************/ /* Jeffrey Friedl has some debugging requirements that are not part of the regular code. */ #ifdef JFRIEDL_DEBUG static int S_arg = -1; static unsigned int jfriedl_XR = 0; /* repeat regex attempt this many times */ static unsigned int jfriedl_XT = 0; /* replicate text this many times */ static const char *jfriedl_prefix = ""; static const char *jfriedl_postfix = ""; #endif static int endlinetype; static char *colour_string = (char *)"1;31"; static char *colour_option = NULL; static char *dee_option = NULL; static char *DEE_option = NULL; static char *newline = NULL; static char *pattern_filename = NULL; static char *stdin_name = (char *)"(standard input)"; static char *locale = NULL; static const unsigned char *pcretables = NULL; static int pattern_count = 0; static pcre **pattern_list = NULL; static pcre_extra **hints_list = NULL; static char *include_pattern = NULL; static char *exclude_pattern = NULL; static char *include_dir_pattern = NULL; static char *exclude_dir_pattern = NULL; static pcre *include_compiled = NULL; static pcre *exclude_compiled = NULL; static pcre *include_dir_compiled = NULL; static pcre *exclude_dir_compiled = NULL; static int after_context = 0; static int before_context = 0; static int both_context = 0; static int dee_action = dee_READ; static int DEE_action = DEE_READ; static int error_count = 0; static int filenames = FN_DEFAULT; static int process_options = 0; static BOOL count_only = FALSE; static BOOL do_colour = FALSE; static BOOL file_offsets = FALSE; static BOOL hyphenpending = FALSE; static BOOL invert = FALSE; static BOOL line_offsets = FALSE; static BOOL multiline = FALSE; static BOOL number = FALSE; static BOOL omit_zero_count = FALSE; static BOOL only_matching = FALSE; static BOOL quiet = FALSE; static BOOL silent = FALSE; static BOOL utf8 = FALSE; /* Structure for options and list of them */ enum { OP_NODATA, OP_STRING, OP_OP_STRING, OP_NUMBER, OP_OP_NUMBER, OP_PATLIST }; typedef struct option_item { int type; int one_char; void *dataptr; const char *long_name; const char *help_text; } option_item; /* Options without a single-letter equivalent get a negative value. This can be used to identify them. */ #define N_COLOUR (-1) #define N_EXCLUDE (-2) #define N_EXCLUDE_DIR (-3) #define N_HELP (-4) #define N_INCLUDE (-5) #define N_INCLUDE_DIR (-6) #define N_LABEL (-7) #define N_LOCALE (-8) #define N_NULL (-9) #define N_LOFFSETS (-10) #define N_FOFFSETS (-11) static option_item optionlist[] = { { OP_NODATA, N_NULL, NULL, "", " terminate options" }, { OP_NODATA, N_HELP, NULL, "help", "display this help and exit" }, { OP_NUMBER, 'A', &after_context, "after-context=number", "set number of following context lines" }, { OP_NUMBER, 'B', &before_context, "before-context=number", "set number of prior context lines" }, { OP_OP_STRING, N_COLOUR, &colour_option, "color=option", "matched text color option" }, { OP_NUMBER, 'C', &both_context, "context=number", "set number of context lines, before & after" }, { OP_NODATA, 'c', NULL, "count", "print only a count of matching lines per FILE" }, { OP_OP_STRING, N_COLOUR, &colour_option, "colour=option", "matched text colour option" }, { OP_STRING, 'D', &DEE_option, "devices=action","how to handle devices, FIFOs, and sockets" }, { OP_STRING, 'd', &dee_option, "directories=action", "how to handle directories" }, { OP_PATLIST, 'e', NULL, "regex(p)=pattern", "specify pattern (may be used more than once)" }, { OP_NODATA, 'F', NULL, "fixed-strings", "patterns are sets of newline-separated strings" }, { OP_STRING, 'f', &pattern_filename, "file=path", "read patterns from file" }, { OP_NODATA, N_FOFFSETS, NULL, "file-offsets", "output file offsets, not text" }, { OP_NODATA, 'H', NULL, "with-filename", "force the prefixing filename on output" }, { OP_NODATA, 'h', NULL, "no-filename", "suppress the prefixing filename on output" }, { OP_NODATA, 'i', NULL, "ignore-case", "ignore case distinctions" }, { OP_NODATA, 'l', NULL, "files-with-matches", "print only FILE names containing matches" }, { OP_NODATA, 'L', NULL, "files-without-match","print only FILE names not containing matches" }, { OP_STRING, N_LABEL, &stdin_name, "label=name", "set name for standard input" }, { OP_NODATA, N_LOFFSETS, NULL, "line-offsets", "output line numbers and offsets, not text" }, { OP_STRING, N_LOCALE, &locale, "locale=locale", "use the named locale" }, { OP_NODATA, 'M', NULL, "multiline", "run in multiline mode" }, { OP_STRING, 'N', &newline, "newline=type", "set newline type (CR, LF, CRLF, ANYCRLF or ANY)" }, { OP_NODATA, 'n', NULL, "line-number", "print line number with output lines" }, { OP_NODATA, 'o', NULL, "only-matching", "show only the part of the line that matched" }, { OP_NODATA, 'q', NULL, "quiet", "suppress output, just set return code" }, { OP_NODATA, 'r', NULL, "recursive", "recursively scan sub-directories" }, { OP_STRING, N_EXCLUDE,&exclude_pattern, "exclude=pattern","exclude matching files when recursing" }, { OP_STRING, N_INCLUDE,&include_pattern, "include=pattern","include matching files when recursing" }, { OP_STRING, N_EXCLUDE_DIR,&exclude_dir_pattern, "exclude_dir=pattern","exclude matching directories when recursing" }, { OP_STRING, N_INCLUDE_DIR,&include_dir_pattern, "include_dir=pattern","include matching directories when recursing" }, #ifdef JFRIEDL_DEBUG { OP_OP_NUMBER, 'S', &S_arg, "jeffS", "replace matched (sub)string with X" }, #endif { OP_NODATA, 's', NULL, "no-messages", "suppress error messages" }, { OP_NODATA, 'u', NULL, "utf-8", "use UTF-8 mode" }, { OP_NODATA, 'V', NULL, "version", "print version information and exit" }, { OP_NODATA, 'v', NULL, "invert-match", "select non-matching lines" }, { OP_NODATA, 'w', NULL, "word-regex(p)", "force patterns to match only as words" }, { OP_NODATA, 'x', NULL, "line-regex(p)", "force patterns to match only whole lines" }, { OP_NODATA, 0, NULL, NULL, NULL } }; /* Tables for prefixing and suffixing patterns, according to the -w, -x, and -F options. These set the 1, 2, and 4 bits in process_options, respectively. Note that the combination of -w and -x has the same effect as -x on its own, so we can treat them as the same. */ static const char *prefix[] = { "", "\\b", "^(?:", "^(?:", "\\Q", "\\b\\Q", "^(?:\\Q", "^(?:\\Q" }; static const char *suffix[] = { "", "\\b", ")$", ")$", "\\E", "\\E\\b", "\\E)$", "\\E)$" }; /* UTF-8 tables - used only when the newline setting is "any". */ const int utf8_table3[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01}; const char utf8_table4[] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 }; /************************************************* * OS-specific functions * *************************************************/ /* These functions are defined so that they can be made system specific, although at present the only ones are for Unix, Win32, and for "no support". */ /************* Directory scanning in Unix ***********/ #if defined HAVE_SYS_STAT_H && defined HAVE_DIRENT_H && defined HAVE_SYS_TYPES_H #include <sys/types.h> #include <sys/stat.h> #include <dirent.h> typedef DIR directory_type; static int isdirectory(char *filename) { struct stat statbuf; if (stat(filename, &statbuf) < 0) return 0; /* In the expectation that opening as a file will fail */ return ((statbuf.st_mode & S_IFMT) == S_IFDIR)? '/' : 0; } static directory_type * opendirectory(char *filename) { return opendir(filename); } static char * readdirectory(directory_type *dir) { for (;;) { struct dirent *dent = readdir(dir); if (dent == NULL) return NULL; if (strcmp(dent->d_name, ".") != 0 && strcmp(dent->d_name, "..") != 0) return dent->d_name; } /* Control never reaches here */ } static void closedirectory(directory_type *dir) { closedir(dir); } /************* Test for regular file in Unix **********/ static int isregfile(char *filename) { struct stat statbuf; if (stat(filename, &statbuf) < 0) return 1; /* In the expectation that opening as a file will fail */ return (statbuf.st_mode & S_IFMT) == S_IFREG; } /************* Test stdout for being a terminal in Unix **********/ static BOOL is_stdout_tty(void) { return isatty(fileno(stdout)); } /************* Directory scanning in Win32 ***********/ /* I (Philip Hazel) have no means of testing this code. It was contributed by Lionel Fourquaux. David Burgess added a patch to define INVALID_FILE_ATTRIBUTES when it did not exist. David Byron added a patch that moved the #include of <windows.h> to before the INVALID_FILE_ATTRIBUTES definition rather than after. */ #elif HAVE_WINDOWS_H #ifndef STRICT # define STRICT #endif #ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN #endif #include <windows.h> #ifndef INVALID_FILE_ATTRIBUTES #define INVALID_FILE_ATTRIBUTES 0xFFFFFFFF #endif typedef struct directory_type { HANDLE handle; BOOL first; WIN32_FIND_DATA data; } directory_type; int isdirectory(char *filename) { DWORD attr = GetFileAttributes(filename); if (attr == INVALID_FILE_ATTRIBUTES) return 0; return ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) ? '/' : 0; } directory_type * opendirectory(char *filename) { size_t len; char *pattern; directory_type *dir; DWORD err; len = strlen(filename); pattern = (char *) malloc(len + 3); dir = (directory_type *) malloc(sizeof(*dir)); if ((pattern == NULL) || (dir == NULL)) { fprintf(stderr, "pcregrep: malloc failed\n"); exit(2); } memcpy(pattern, filename, len); memcpy(&(pattern[len]), "\\*", 3); dir->handle = FindFirstFile(pattern, &(dir->data)); if (dir->handle != INVALID_HANDLE_VALUE) { free(pattern); dir->first = TRUE; return dir; } err = GetLastError(); free(pattern); free(dir); errno = (err == ERROR_ACCESS_DENIED) ? EACCES : ENOENT; return NULL; } char * readdirectory(directory_type *dir) { for (;;) { if (!dir->first) { if (!FindNextFile(dir->handle, &(dir->data))) return NULL; } else { dir->first = FALSE; } if (strcmp(dir->data.cFileName, ".") != 0 && strcmp(dir->data.cFileName, "..") != 0) return dir->data.cFileName; } #ifndef _MSC_VER return NULL; /* Keep compiler happy; never executed */ #endif } void closedirectory(directory_type *dir) { FindClose(dir->handle); free(dir); } /************* Test for regular file in Win32 **********/ /* I don't know how to do this, or if it can be done; assume all paths are regular if they are not directories. */ int isregfile(char *filename) { return !isdirectory(filename); } /************* Test stdout for being a terminal in Win32 **********/ /* I don't know how to do this; assume never */ static BOOL is_stdout_tty(void) { return FALSE; } /************* Directory scanning when we can't do it ***********/ /* The type is void, and apart from isdirectory(), the functions do nothing. */ #else typedef void directory_type; int isdirectory(char *filename) { return 0; } directory_type * opendirectory(char *filename) { return (directory_type*)0;} char *readdirectory(directory_type *dir) { return (char*)0;} void closedirectory(directory_type *dir) {} /************* Test for regular when we can't do it **********/ /* Assume all files are regular. */ int isregfile(char *filename) { return 1; } /************* Test stdout for being a terminal when we can't do it **********/ static BOOL is_stdout_tty(void) { return FALSE; } #endif #ifndef HAVE_STRERROR /************************************************* * Provide strerror() for non-ANSI libraries * *************************************************/ /* Some old-fashioned systems still around (e.g. SunOS4) don't have strerror() in their libraries, but can provide the same facility by this simple alternative function. */ extern int sys_nerr; extern char *sys_errlist[]; char * strerror(int n) { if (n < 0 || n >= sys_nerr) return "unknown error number"; return sys_errlist[n]; } #endif /* HAVE_STRERROR */ /************************************************* * Find end of line * *************************************************/ /* The length of the endline sequence that is found is set via lenptr. This may be zero at the very end of the file if there is no line-ending sequence there. Arguments: p current position in line endptr end of available data lenptr where to put the length of the eol sequence Returns: pointer to the last byte of the line */ static char * end_of_line(char *p, char *endptr, int *lenptr) { switch(endlinetype) { default: /* Just in case */ case EL_LF: while (p < endptr && *p != '\n') p++; if (p < endptr) { *lenptr = 1; return p + 1; } *lenptr = 0; return endptr; case EL_CR: while (p < endptr && *p != '\r') p++; if (p < endptr) { *lenptr = 1; return p + 1; } *lenptr = 0; return endptr; case EL_CRLF: for (;;) { while (p < endptr && *p != '\r') p++; if (++p >= endptr) { *lenptr = 0; return endptr; } if (*p == '\n') { *lenptr = 2; return p + 1; } } break; case EL_ANYCRLF: while (p < endptr) { int extra = 0; register int c = *((unsigned char *)p); if (utf8 && c >= 0xc0) { int gcii, gcss; extra = utf8_table4[c & 0x3f]; /* Number of additional bytes */ gcss = 6*extra; c = (c & utf8_table3[extra]) << gcss; for (gcii = 1; gcii <= extra; gcii++) { gcss -= 6; c |= (p[gcii] & 0x3f) << gcss; } } p += 1 + extra; switch (c) { case 0x0a: /* LF */ *lenptr = 1; return p; case 0x0d: /* CR */ if (p < endptr && *p == 0x0a) { *lenptr = 2; p++; } else *lenptr = 1; return p; default: break; } } /* End of loop for ANYCRLF case */ *lenptr = 0; /* Must have hit the end */ return endptr; case EL_ANY: while (p < endptr) { int extra = 0; register int c = *((unsigned char *)p); if (utf8 && c >= 0xc0) { int gcii, gcss; extra = utf8_table4[c & 0x3f]; /* Number of additional bytes */ gcss = 6*extra; c = (c & utf8_table3[extra]) << gcss; for (gcii = 1; gcii <= extra; gcii++) { gcss -= 6; c |= (p[gcii] & 0x3f) << gcss; } } p += 1 + extra; switch (c) { case 0x0a: /* LF */ case 0x0b: /* VT */ case 0x0c: /* FF */ *lenptr = 1; return p; case 0x0d: /* CR */ if (p < endptr && *p == 0x0a) { *lenptr = 2; p++; } else *lenptr = 1; return p; case 0x85: /* NEL */ *lenptr = utf8? 2 : 1; return p; case 0x2028: /* LS */ case 0x2029: /* PS */ *lenptr = 3; return p; default: break; } } /* End of loop for ANY case */ *lenptr = 0; /* Must have hit the end */ return endptr; } /* End of overall switch */ } /************************************************* * Find start of previous line * *************************************************/ /* This is called when looking back for before lines to print. Arguments: p start of the subsequent line startptr start of available data Returns: pointer to the start of the previous line */ static char * previous_line(char *p, char *startptr) { switch(endlinetype) { default: /* Just in case */ case EL_LF: p--; while (p > startptr && p[-1] != '\n') p--; return p; case EL_CR: p--; while (p > startptr && p[-1] != '\n') p--; return p; case EL_CRLF: for (;;) { p -= 2; while (p > startptr && p[-1] != '\n') p--; if (p <= startptr + 1 || p[-2] == '\r') return p; } return p; /* But control should never get here */ case EL_ANY: case EL_ANYCRLF: if (*(--p) == '\n' && p > startptr && p[-1] == '\r') p--; if (utf8) while ((*p & 0xc0) == 0x80) p--; while (p > startptr) { register int c; char *pp = p - 1; if (utf8) { int extra = 0; while ((*pp & 0xc0) == 0x80) pp--; c = *((unsigned char *)pp); if (c >= 0xc0) { int gcii, gcss; extra = utf8_table4[c & 0x3f]; /* Number of additional bytes */ gcss = 6*extra; c = (c & utf8_table3[extra]) << gcss; for (gcii = 1; gcii <= extra; gcii++) { gcss -= 6; c |= (pp[gcii] & 0x3f) << gcss; } } } else c = *((unsigned char *)pp); if (endlinetype == EL_ANYCRLF) switch (c) { case 0x0a: /* LF */ case 0x0d: /* CR */ return p; default: break; } else switch (c) { case 0x0a: /* LF */ case 0x0b: /* VT */ case 0x0c: /* FF */ case 0x0d: /* CR */ case 0x85: /* NEL */ case 0x2028: /* LS */ case 0x2029: /* PS */ return p; default: break; } p = pp; /* Back one character */ } /* End of loop for ANY case */ return startptr; /* Hit start of data */ } /* End of overall switch */ } /************************************************* * Print the previous "after" lines * *************************************************/ /* This is called if we are about to lose said lines because of buffer filling, and at the end of the file. The data in the line is written using fwrite() so that a binary zero does not terminate it. Arguments: lastmatchnumber the number of the last matching line, plus one lastmatchrestart where we restarted after the last match endptr end of available data printname filename for printing Returns: nothing */ static void do_after_lines(int lastmatchnumber, char *lastmatchrestart, char *endptr, char *printname) { if (after_context > 0 && lastmatchnumber > 0) { int count = 0; while (lastmatchrestart < endptr && count++ < after_context) { int ellength; char *pp = lastmatchrestart; if (printname != NULL) fprintf(stdout, "%s-", printname); if (number) fprintf(stdout, "%d-", lastmatchnumber++); pp = end_of_line(pp, endptr, &ellength); fwrite(lastmatchrestart, 1, pp - lastmatchrestart, stdout); lastmatchrestart = pp; } hyphenpending = TRUE; } } /************************************************* * Apply patterns to subject till one matches * *************************************************/ /* This function is called to run through all patterns, looking for a match. It is used multiple times for the same subject when colouring is enabled, in order to find all possible matches. Arguments: matchptr the start of the subject length the length of the subject to match offsets the offets vector to fill in mrc address of where to put the result of pcre_exec() Returns: TRUE if there was a match FALSE if there was no match invert if there was a non-fatal error */ static BOOL match_patterns(char *matchptr, size_t length, int *offsets, int *mrc) { int i; for (i = 0; i < pattern_count; i++) { *mrc = pcre_exec(pattern_list[i], hints_list[i], matchptr, length, 0, PCRE_NOTEMPTY, offsets, OFFSET_SIZE); if (*mrc >= 0) return TRUE; if (*mrc == PCRE_ERROR_NOMATCH) continue; fprintf(stderr, "pcregrep: pcre_exec() error %d while matching ", *mrc); if (pattern_count > 1) fprintf(stderr, "pattern number %d to ", i+1); fprintf(stderr, "this text:\n"); fwrite(matchptr, 1, length, stderr); /* In case binary zero included */ fprintf(stderr, "\n"); if (error_count == 0 && (*mrc == PCRE_ERROR_MATCHLIMIT || *mrc == PCRE_ERROR_RECURSIONLIMIT)) { fprintf(stderr, "pcregrep: error %d means that a resource limit " "was exceeded\n", *mrc); fprintf(stderr, "pcregrep: check your regex for nested unlimited loops\n"); } if (error_count++ > 20) { fprintf(stderr, "pcregrep: too many errors - abandoned\n"); exit(2); } return invert; /* No more matching; don't show the line again */ } return FALSE; /* No match, no errors */ } /************************************************* * Grep an individual file * *************************************************/ /* This is called from grep_or_recurse() below. It uses a buffer that is three times the value of MBUFTHIRD. The matching point is never allowed to stray into the top third of the buffer, thus keeping more of the file available for context printing or for multiline scanning. For large files, the pointer will be in the middle third most of the time, so the bottom third is available for "before" context printing. Arguments: handle the fopened FILE stream for a normal file the gzFile pointer when reading is via libz the BZFILE pointer when reading is via libbz2 frtype FR_PLAIN, FR_LIBZ, or FR_LIBBZ2 printname the file name if it is to be printed for each match or NULL if the file name is not to be printed it cannot be NULL if filenames[_nomatch]_only is set Returns: 0 if there was at least one match 1 otherwise (no matches) 2 if there is a read error on a .bz2 file */ static int pcregrep(void *handle, int frtype, char *printname) { int rc = 1; int linenumber = 1; int lastmatchnumber = 0; int count = 0; int filepos = 0; int offsets[OFFSET_SIZE]; char *lastmatchrestart = NULL; char buffer[3*MBUFTHIRD]; char *ptr = buffer; char *endptr; size_t bufflength; BOOL endhyphenpending = FALSE; FILE *in = NULL; /* Ensure initialized */ #ifdef SUPPORT_LIBZ gzFile ingz = NULL; #endif #ifdef SUPPORT_LIBBZ2 BZFILE *inbz2 = NULL; #endif /* Do the first read into the start of the buffer and set up the pointer to end of what we have. In the case of libz, a non-zipped .gz file will be read as a plain file. However, if a .bz2 file isn't actually bzipped, the first read will fail. */ #ifdef SUPPORT_LIBZ if (frtype == FR_LIBZ) { ingz = (gzFile)handle; bufflength = gzread (ingz, buffer, 3*MBUFTHIRD); } else #endif #ifdef SUPPORT_LIBBZ2 if (frtype == FR_LIBBZ2) { inbz2 = (BZFILE *)handle; bufflength = BZ2_bzread(inbz2, buffer, 3*MBUFTHIRD); if ((int)bufflength < 0) return 2; /* Gotcha: bufflength is size_t; */ } /* without the cast it is unsigned. */ else #endif { in = (FILE *)handle; bufflength = fread(buffer, 1, 3*MBUFTHIRD, in); } endptr = buffer + bufflength; /* Loop while the current pointer is not at the end of the file. For large files, endptr will be at the end of the buffer when we are in the middle of the file, but ptr will never get there, because as soon as it gets over 2/3 of the way, the buffer is shifted left and re-filled. */ while (ptr < endptr) { int endlinelength; int mrc = 0; BOOL match; char *matchptr = ptr; char *t = ptr; size_t length, linelength; /* At this point, ptr is at the start of a line. We need to find the length of the subject string to pass to pcre_exec(). In multiline mode, it is the length remainder of the data in the buffer. Otherwise, it is the length of the next line, excluding the terminating newline. After matching, we always advance by the length of the next line. In multiline mode the PCRE_FIRSTLINE option is used for compiling, so that any match is constrained to be in the first line. */ t = end_of_line(t, endptr, &endlinelength); linelength = t - ptr - endlinelength; length = multiline? (size_t)(endptr - ptr) : linelength; /* Extra processing for Jeffrey Friedl's debugging. */ #ifdef JFRIEDL_DEBUG if (jfriedl_XT || jfriedl_XR) { #include <sys/time.h> #include <time.h> struct timeval start_time, end_time; struct timezone dummy; int i; if (jfriedl_XT) { unsigned long newlen = length * jfriedl_XT + strlen(jfriedl_prefix) + strlen(jfriedl_postfix); const char *orig = ptr; ptr = malloc(newlen + 1); if (!ptr) { printf("out of memory"); exit(2); } endptr = ptr; strcpy(endptr, jfriedl_prefix); endptr += strlen(jfriedl_prefix); for (i = 0; i < jfriedl_XT; i++) { strncpy(endptr, orig, length); endptr += length; } strcpy(endptr, jfriedl_postfix); endptr += strlen(jfriedl_postfix); length = newlen; } if (gettimeofday(&start_time, &dummy) != 0) perror("bad gettimeofday"); for (i = 0; i < jfriedl_XR; i++) match = (pcre_exec(pattern_list[0], hints_list[0], ptr, length, 0, PCRE_NOTEMPTY, offsets, OFFSET_SIZE) >= 0); if (gettimeofday(&end_time, &dummy) != 0) perror("bad gettimeofday"); double delta = ((end_time.tv_sec + (end_time.tv_usec / 1000000.0)) - (start_time.tv_sec + (start_time.tv_usec / 1000000.0))); printf("%s TIMER[%.4f]\n", match ? "MATCH" : "FAIL", delta); return 0; } #endif /* We come back here after a match when the -o option (only_matching) is set, in order to find any further matches in the same line. */ ONLY_MATCHING_RESTART: /* Run through all the patterns until one matches or there is an error other than NOMATCH. This code is in a subroutine so that it can be re-used for finding subsequent matches when colouring matched lines. */ match = match_patterns(matchptr, length, offsets, &mrc); /* If it's a match or a not-match (as required), do what's wanted. */ if (match != invert) { BOOL hyphenprinted = FALSE; /* We've failed if we want a file that doesn't have any matches. */ if (filenames == FN_NOMATCH_ONLY) return 1; /* Just count if just counting is wanted. */ if (count_only) count++; /* If all we want is a file name, there is no need to scan any more lines in the file. */ else if (filenames == FN_MATCH_ONLY) { fprintf(stdout, "%s\n", printname); return 0; } /* Likewise, if all we want is a yes/no answer. */ else if (quiet) return 0; /* The --only-matching option prints just the substring that matched, and the --file-offsets and --line-offsets options output offsets for the matching substring (they both force --only-matching). None of these options prints any context. Afterwards, adjust the start and length, and then jump back to look for further matches in the same line. If we are in invert mode, however, nothing is printed - this could be still useful because the return code is set. */ else if (only_matching) { if (!invert) { if (printname != NULL) fprintf(stdout, "%s:", printname); if (number) fprintf(stdout, "%d:", linenumber); if (line_offsets) fprintf(stdout, "%d,%d", (int)(matchptr + offsets[0] - ptr), offsets[1] - offsets[0]); else if (file_offsets) fprintf(stdout, "%d,%d", (int)(filepos + matchptr + offsets[0] - ptr), offsets[1] - offsets[0]); else { if (do_colour) fprintf(stdout, "%c[%sm", 0x1b, colour_string); fwrite(matchptr + offsets[0], 1, offsets[1] - offsets[0], stdout); if (do_colour) fprintf(stdout, "%c[00m", 0x1b); } fprintf(stdout, "\n"); matchptr += offsets[1]; length -= offsets[1]; match = FALSE; goto ONLY_MATCHING_RESTART; } } /* This is the default case when none of the above options is set. We print the matching lines(s), possibly preceded and/or followed by other lines of context. */ else { /* See if there is a requirement to print some "after" lines from a previous match. We never print any overlaps. */ if (after_context > 0 && lastmatchnumber > 0) { int ellength; int linecount = 0; char *p = lastmatchrestart; while (p < ptr && linecount < after_context) { p = end_of_line(p, ptr, &ellength); linecount++; } /* It is important to advance lastmatchrestart during this printing so that it interacts correctly with any "before" printing below. Print each line's data using fwrite() in case there are binary zeroes. */ while (lastmatchrestart < p) { char *pp = lastmatchrestart; if (printname != NULL) fprintf(stdout, "%s-", printname); if (number) fprintf(stdout, "%d-", lastmatchnumber++); pp = end_of_line(pp, endptr, &ellength); fwrite(lastmatchrestart, 1, pp - lastmatchrestart, stdout); lastmatchrestart = pp; } if (lastmatchrestart != ptr) hyphenpending = TRUE; } /* If there were non-contiguous lines printed above, insert hyphens. */ if (hyphenpending) { fprintf(stdout, "--\n"); hyphenpending = FALSE; hyphenprinted = TRUE; } /* See if there is a requirement to print some "before" lines for this match. Again, don't print overlaps. */ if (before_context > 0) { int linecount = 0; char *p = ptr; while (p > buffer && (lastmatchnumber == 0 || p > lastmatchrestart) && linecount < before_context) { linecount++; p = previous_line(p, buffer); } if (lastmatchnumber > 0 && p > lastmatchrestart && !hyphenprinted) fprintf(stdout, "--\n"); while (p < ptr) { int ellength; char *pp = p; if (printname != NULL) fprintf(stdout, "%s-", printname); if (number) fprintf(stdout, "%d-", linenumber - linecount--); pp = end_of_line(pp, endptr, &ellength); fwrite(p, 1, pp - p, stdout); p = pp; } } /* Now print the matching line(s); ensure we set hyphenpending at the end of the file if any context lines are being output. */ if (after_context > 0 || before_context > 0) endhyphenpending = TRUE; if (printname != NULL) fprintf(stdout, "%s:", printname); if (number) fprintf(stdout, "%d:", linenumber); /* In multiline mode, we want to print to the end of the line in which the end of the matched string is found, so we adjust linelength and the line number appropriately, but only when there actually was a match (invert not set). Because the PCRE_FIRSTLINE option is set, the start of the match will always be before the first newline sequence. */ if (multiline) { int ellength; char *endmatch = ptr; if (!invert) { endmatch += offsets[1]; t = ptr; while (t < endmatch) { t = end_of_line(t, endptr, &ellength); if (t <= endmatch) linenumber++; else break; } } endmatch = end_of_line(endmatch, endptr, &ellength); linelength = endmatch - ptr - ellength; } /*** NOTE: Use only fwrite() to output the data line, so that binary zeroes are treated as just another data character. */ /* This extra option, for Jeffrey Friedl's debugging requirements, replaces the matched string, or a specific captured string if it exists, with X. When this happens, colouring is ignored. */ #ifdef JFRIEDL_DEBUG if (S_arg >= 0 && S_arg < mrc) { int first = S_arg * 2; int last = first + 1; fwrite(ptr, 1, offsets[first], stdout); fprintf(stdout, "X"); fwrite(ptr + offsets[last], 1, linelength - offsets[last], stdout); } else #endif /* We have to split the line(s) up if colouring, and search for further matches. */ if (do_colour) { int last_offset = 0; fwrite(ptr, 1, offsets[0], stdout); fprintf(stdout, "%c[%sm", 0x1b, colour_string); fwrite(ptr + offsets[0], 1, offsets[1] - offsets[0], stdout); fprintf(stdout, "%c[00m", 0x1b); for (;;) { last_offset += offsets[1]; matchptr += offsets[1]; length -= offsets[1]; if (!match_patterns(matchptr, length, offsets, &mrc)) break; fwrite(matchptr, 1, offsets[0], stdout); fprintf(stdout, "%c[%sm", 0x1b, colour_string); fwrite(matchptr + offsets[0], 1, offsets[1] - offsets[0], stdout); fprintf(stdout, "%c[00m", 0x1b); } fwrite(ptr + last_offset, 1, (linelength + endlinelength) - last_offset, stdout); } /* Not colouring; no need to search for further matches */ else fwrite(ptr, 1, linelength + endlinelength, stdout); } /* End of doing what has to be done for a match */ rc = 0; /* Had some success */ /* Remember where the last match happened for after_context. We remember where we are about to restart, and that line's number. */ lastmatchrestart = ptr + linelength + endlinelength; lastmatchnumber = linenumber + 1; } /* For a match in multiline inverted mode (which of course did not cause anything to be printed), we have to move on to the end of the match before proceeding. */ if (multiline && invert && match) { int ellength; char *endmatch = ptr + offsets[1]; t = ptr; while (t < endmatch) { t = end_of_line(t, endptr, &ellength); if (t <= endmatch) linenumber++; else break; } endmatch = end_of_line(endmatch, endptr, &ellength); linelength = endmatch - ptr - ellength; } /* Advance to after the newline and increment the line number. The file offset to the current line is maintained in filepos. */ ptr += linelength + endlinelength; filepos += linelength + endlinelength; linenumber++; /* If we haven't yet reached the end of the file (the buffer is full), and the current point is in the top 1/3 of the buffer, slide the buffer down by 1/3 and refill it. Before we do this, if some unprinted "after" lines are about to be lost, print them. */ if (bufflength >= sizeof(buffer) && ptr > buffer + 2*MBUFTHIRD) { if (after_context > 0 && lastmatchnumber > 0 && lastmatchrestart < buffer + MBUFTHIRD) { do_after_lines(lastmatchnumber, lastmatchrestart, endptr, printname); lastmatchnumber = 0; } /* Now do the shuffle */ memmove(buffer, buffer + MBUFTHIRD, 2*MBUFTHIRD); ptr -= MBUFTHIRD; #ifdef SUPPORT_LIBZ if (frtype == FR_LIBZ) bufflength = 2*MBUFTHIRD + gzread (ingz, buffer + 2*MBUFTHIRD, MBUFTHIRD); else #endif #ifdef SUPPORT_LIBBZ2 if (frtype == FR_LIBBZ2) bufflength = 2*MBUFTHIRD + BZ2_bzread(inbz2, buffer + 2*MBUFTHIRD, MBUFTHIRD); else #endif bufflength = 2*MBUFTHIRD + fread(buffer + 2*MBUFTHIRD, 1, MBUFTHIRD, in); endptr = buffer + bufflength; /* Adjust any last match point */ if (lastmatchnumber > 0) lastmatchrestart -= MBUFTHIRD; } } /* Loop through the whole file */ /* End of file; print final "after" lines if wanted; do_after_lines sets hyphenpending if it prints something. */ if (!only_matching && !count_only) { do_after_lines(lastmatchnumber, lastmatchrestart, endptr, printname); hyphenpending |= endhyphenpending; } /* Print the file name if we are looking for those without matches and there were none. If we found a match, we won't have got this far. */ if (filenames == FN_NOMATCH_ONLY) { fprintf(stdout, "%s\n", printname); return 0; } /* Print the match count if wanted */ if (count_only) { if (count > 0 || !omit_zero_count) { if (printname != NULL && filenames != FN_NONE) fprintf(stdout, "%s:", printname); fprintf(stdout, "%d\n", count); } } return rc; } /************************************************* * Grep a file or recurse into a directory * *************************************************/ /* Given a path name, if it's a directory, scan all the files if we are recursing; if it's a file, grep it. Arguments: pathname the path to investigate dir_recurse TRUE if recursing is wanted (-r or -drecurse) only_one_at_top TRUE if the path is the only one at toplevel Returns: 0 if there was at least one match 1 if there were no matches 2 there was some kind of error However, file opening failures are suppressed if "silent" is set. */ static int grep_or_recurse(char *pathname, BOOL dir_recurse, BOOL only_one_at_top) { int rc = 1; int sep; int frtype; int pathlen; void *handle; FILE *in = NULL; /* Ensure initialized */ #ifdef SUPPORT_LIBZ gzFile ingz = NULL; #endif #ifdef SUPPORT_LIBBZ2 BZFILE *inbz2 = NULL; #endif /* If the file name is "-" we scan stdin */ if (strcmp(pathname, "-") == 0) { return pcregrep(stdin, FR_PLAIN, (filenames > FN_DEFAULT || (filenames == FN_DEFAULT && !only_one_at_top))? stdin_name : NULL); } /* If the file is a directory, skip if skipping or if we are recursing, scan each file and directory within it, subject to any include or exclude patterns that were set. The scanning code is localized so it can be made system-specific. */ if ((sep = isdirectory(pathname)) != 0) { if (dee_action == dee_SKIP) return 1; if (dee_action == dee_RECURSE) { char buffer[1024]; char *nextfile; directory_type *dir = opendirectory(pathname); if (dir == NULL) { if (!silent) fprintf(stderr, "pcregrep: Failed to open directory %s: %s\n", pathname, strerror(errno)); return 2; } while ((nextfile = readdirectory(dir)) != NULL) { int frc, nflen; sprintf(buffer, "%.512s%c%.128s", pathname, sep, nextfile); nflen = strlen(nextfile); if (isdirectory(buffer)) { if (exclude_dir_compiled != NULL && pcre_exec(exclude_dir_compiled, NULL, nextfile, nflen, 0, 0, NULL, 0) >= 0) continue; if (include_dir_compiled != NULL && pcre_exec(include_dir_compiled, NULL, nextfile, nflen, 0, 0, NULL, 0) < 0) continue; } else { if (exclude_compiled != NULL && pcre_exec(exclude_compiled, NULL, nextfile, nflen, 0, 0, NULL, 0) >= 0) continue; if (include_compiled != NULL && pcre_exec(include_compiled, NULL, nextfile, nflen, 0, 0, NULL, 0) < 0) continue; } frc = grep_or_recurse(buffer, dir_recurse, FALSE); if (frc > 1) rc = frc; else if (frc == 0 && rc == 1) rc = 0; } closedirectory(dir); return rc; } } /* If the file is not a directory and not a regular file, skip it if that's been requested. */ else if (!isregfile(pathname) && DEE_action == DEE_SKIP) return 1; /* Control reaches here if we have a regular file, or if we have a directory and recursion or skipping was not requested, or if we have anything else and skipping was not requested. The scan proceeds. If this is the first and only argument at top level, we don't show the file name, unless we are only showing the file name, or the filename was forced (-H). */ pathlen = strlen(pathname); /* Open using zlib if it is supported and the file name ends with .gz. */ #ifdef SUPPORT_LIBZ if (pathlen > 3 && strcmp(pathname + pathlen - 3, ".gz") == 0) { ingz = gzopen(pathname, "rb"); if (ingz == NULL) { if (!silent) fprintf(stderr, "pcregrep: Failed to open %s: %s\n", pathname, strerror(errno)); return 2; } handle = (void *)ingz; frtype = FR_LIBZ; } else #endif /* Otherwise open with bz2lib if it is supported and the name ends with .bz2. */ #ifdef SUPPORT_LIBBZ2 if (pathlen > 4 && strcmp(pathname + pathlen - 4, ".bz2") == 0) { inbz2 = BZ2_bzopen(pathname, "rb"); handle = (void *)inbz2; frtype = FR_LIBBZ2; } else #endif /* Otherwise use plain fopen(). The label is so that we can come back here if an attempt to read a .bz2 file indicates that it really is a plain file. */ #ifdef SUPPORT_LIBBZ2 PLAIN_FILE: #endif { in = fopen(pathname, "rb"); handle = (void *)in; frtype = FR_PLAIN; } /* All the opening methods return errno when they fail. */ if (handle == NULL) { if (!silent) fprintf(stderr, "pcregrep: Failed to open %s: %s\n", pathname, strerror(errno)); return 2; } /* Now grep the file */ rc = pcregrep(handle, frtype, (filenames > FN_DEFAULT || (filenames == FN_DEFAULT && !only_one_at_top))? pathname : NULL); /* Close in an appropriate manner. */ #ifdef SUPPORT_LIBZ if (frtype == FR_LIBZ) gzclose(ingz); else #endif /* If it is a .bz2 file and the result is 2, it means that the first attempt to read failed. If the error indicates that the file isn't in fact bzipped, try again as a normal file. */ #ifdef SUPPORT_LIBBZ2 if (frtype == FR_LIBBZ2) { if (rc == 2) { int errnum; const char *err = BZ2_bzerror(inbz2, &errnum); if (errnum == BZ_DATA_ERROR_MAGIC) { BZ2_bzclose(inbz2); goto PLAIN_FILE; } else if (!silent) fprintf(stderr, "pcregrep: Failed to read %s using bzlib: %s\n", pathname, err); } BZ2_bzclose(inbz2); } else #endif /* Normal file close */ fclose(in); /* Pass back the yield from pcregrep(). */ return rc; } /************************************************* * Usage function * *************************************************/ static int usage(int rc) { option_item *op; fprintf(stderr, "Usage: pcregrep [-"); for (op = optionlist; op->one_char != 0; op++) { if (op->one_char > 0) fprintf(stderr, "%c", op->one_char); } fprintf(stderr, "] [long options] [pattern] [files]\n"); fprintf(stderr, "Type `pcregrep --help' for more information and the long " "options.\n"); return rc; } /************************************************* * Help function * *************************************************/ static void help(void) { option_item *op; printf("Usage: pcregrep [OPTION]... [PATTERN] [FILE1 FILE2 ...]\n"); printf("Search for PATTERN in each FILE or standard input.\n"); printf("PATTERN must be present if neither -e nor -f is used.\n"); printf("\"-\" can be used as a file name to mean STDIN.\n"); #ifdef SUPPORT_LIBZ printf("Files whose names end in .gz are read using zlib.\n"); #endif #ifdef SUPPORT_LIBBZ2 printf("Files whose names end in .bz2 are read using bzlib2.\n"); #endif #if defined SUPPORT_LIBZ || defined SUPPORT_LIBBZ2 printf("Other files and the standard input are read as plain files.\n\n"); #else printf("All files are read as plain files, without any interpretation.\n\n"); #endif printf("Example: pcregrep -i 'hello.*world' menu.h main.c\n\n"); printf("Options:\n"); for (op = optionlist; op->one_char != 0; op++) { int n; char s[4]; if (op->one_char > 0) sprintf(s, "-%c,", op->one_char); else strcpy(s, " "); n = 30 - printf(" %s --%s", s, op->long_name); if (n < 1) n = 1; printf("%.*s%s\n", n, " ", op->help_text); } printf("\nWhen reading patterns from a file instead of using a command line option,\n"); printf("trailing white space is removed and blank lines are ignored.\n"); printf("There is a maximum of %d patterns.\n", MAX_PATTERN_COUNT); printf("\nWith no FILEs, read standard input. If fewer than two FILEs given, assume -h.\n"); printf("Exit status is 0 if any matches, 1 if no matches, and 2 if trouble.\n"); } /************************************************* * Handle a single-letter, no data option * *************************************************/ static int handle_option(int letter, int options) { switch(letter) { case N_FOFFSETS: file_offsets = TRUE; break; case N_HELP: help(); exit(0); case N_LOFFSETS: line_offsets = number = TRUE; break; case 'c': count_only = TRUE; break; case 'F': process_options |= PO_FIXED_STRINGS; break; case 'H': filenames = FN_FORCE; break; case 'h': filenames = FN_NONE; break; case 'i': options |= PCRE_CASELESS; break; case 'l': omit_zero_count = TRUE; filenames = FN_MATCH_ONLY; break; case 'L': filenames = FN_NOMATCH_ONLY; break; case 'M': multiline = TRUE; options |= PCRE_MULTILINE|PCRE_FIRSTLINE; break; case 'n': number = TRUE; break; case 'o': only_matching = TRUE; break; case 'q': quiet = TRUE; break; case 'r': dee_action = dee_RECURSE; break; case 's': silent = TRUE; break; case 'u': options |= PCRE_UTF8; utf8 = TRUE; break; case 'v': invert = TRUE; break; case 'w': process_options |= PO_WORD_MATCH; break; case 'x': process_options |= PO_LINE_MATCH; break; case 'V': fprintf(stderr, "pcregrep version %s\n", pcre_version()); exit(0); break; default: fprintf(stderr, "pcregrep: Unknown option -%c\n", letter); exit(usage(2)); } return options; } /************************************************* * Construct printed ordinal * *************************************************/ /* This turns a number into "1st", "3rd", etc. */ static char * ordin(int n) { static char buffer[8]; char *p = buffer; sprintf(p, "%d", n); while (*p != 0) p++; switch (n%10) { case 1: strcpy(p, "st"); break; case 2: strcpy(p, "nd"); break; case 3: strcpy(p, "rd"); break; default: strcpy(p, "th"); break; } return buffer; } /************************************************* * Compile a single pattern * *************************************************/ /* When the -F option has been used, this is called for each substring. Otherwise it's called for each supplied pattern. Arguments: pattern the pattern string options the PCRE options filename the file name, or NULL for a command-line pattern count 0 if this is the only command line pattern, or number of the command line pattern, or linenumber for a pattern from a file Returns: TRUE on success, FALSE after an error */ static BOOL compile_single_pattern(char *pattern, int options, char *filename, int count) { char buffer[MBUFTHIRD + 16]; const char *error; int errptr; if (pattern_count >= MAX_PATTERN_COUNT) { fprintf(stderr, "pcregrep: Too many %spatterns (max %d)\n", (filename == NULL)? "command-line " : "", MAX_PATTERN_COUNT); return FALSE; } sprintf(buffer, "%s%.*s%s", prefix[process_options], MBUFTHIRD, pattern, suffix[process_options]); pattern_list[pattern_count] = pcre_compile(buffer, options, &error, &errptr, pcretables); if (pattern_list[pattern_count] != NULL) { pattern_count++; return TRUE; } /* Handle compile errors */ errptr -= (int)strlen(prefix[process_options]); if (errptr > (int)strlen(pattern)) errptr = (int)strlen(pattern); if (filename == NULL) { if (count == 0) fprintf(stderr, "pcregrep: Error in command-line regex " "at offset %d: %s\n", errptr, error); else fprintf(stderr, "pcregrep: Error in %s command-line regex " "at offset %d: %s\n", ordin(count), errptr, error); } else { fprintf(stderr, "pcregrep: Error in regex in line %d of %s " "at offset %d: %s\n", count, filename, errptr, error); } return FALSE; } /************************************************* * Compile one supplied pattern * *************************************************/ /* When the -F option has been used, each string may be a list of strings, separated by line breaks. They will be matched literally. Arguments: pattern the pattern string options the PCRE options filename the file name, or NULL for a command-line pattern count 0 if this is the only command line pattern, or number of the command line pattern, or linenumber for a pattern from a file Returns: TRUE on success, FALSE after an error */ static BOOL compile_pattern(char *pattern, int options, char *filename, int count) { if ((process_options & PO_FIXED_STRINGS) != 0) { char *eop = pattern + strlen(pattern); char buffer[MBUFTHIRD]; for(;;) { int ellength; char *p = end_of_line(pattern, eop, &ellength); if (ellength == 0) return compile_single_pattern(pattern, options, filename, count); sprintf(buffer, "%.*s", (int)(p - pattern - ellength), pattern); pattern = p; if (!compile_single_pattern(buffer, options, filename, count)) return FALSE; } } else return compile_single_pattern(pattern, options, filename, count); } /************************************************* * Main program * *************************************************/ /* Returns 0 if something matched, 1 if nothing matched, 2 after an error. */ int main(int argc, char **argv) { int i, j; int rc = 1; int pcre_options = 0; int cmd_pattern_count = 0; int hint_count = 0; int errptr; BOOL only_one_at_top; char *patterns[MAX_PATTERN_COUNT]; const char *locale_from = "--locale"; const char *error; /* Set the default line ending value from the default in the PCRE library; "lf", "cr", "crlf", and "any" are supported. Anything else is treated as "lf". Note that the return values from pcre_config(), though derived from the ASCII codes, are the same in EBCDIC environments, so we must use the actual values rather than escapes such as as '\r'. */ (void)pcre_config(PCRE_CONFIG_NEWLINE, &i); switch(i) { default: newline = (char *)"lf"; break; case 13: newline = (char *)"cr"; break; case (13 << 8) | 10: newline = (char *)"crlf"; break; case -1: newline = (char *)"any"; break; case -2: newline = (char *)"anycrlf"; break; } /* Process the options */ for (i = 1; i < argc; i++) { option_item *op = NULL; char *option_data = (char *)""; /* default to keep compiler happy */ BOOL longop; BOOL longopwasequals = FALSE; if (argv[i][0] != '-') break; /* If we hit an argument that is just "-", it may be a reference to STDIN, but only if we have previously had -e or -f to define the patterns. */ if (argv[i][1] == 0) { if (pattern_filename != NULL || pattern_count > 0) break; else exit(usage(2)); } /* Handle a long name option, or -- to terminate the options */ if (argv[i][1] == '-') { char *arg = argv[i] + 2; char *argequals = strchr(arg, '='); if (*arg == 0) /* -- terminates options */ { i++; break; /* out of the options-handling loop */ } longop = TRUE; /* Some long options have data that follows after =, for example file=name. Some options have variations in the long name spelling: specifically, we allow "regexp" because GNU grep allows it, though I personally go along with Jeffrey Friedl and Larry Wall in preferring "regex" without the "p". These options are entered in the table as "regex(p)". Options can be in both these categories. */ for (op = optionlist; op->one_char != 0; op++) { char *opbra = strchr(op->long_name, '('); char *equals = strchr(op->long_name, '='); /* Handle options with only one spelling of the name */ if (opbra == NULL) /* Does not contain '(' */ { if (equals == NULL) /* Not thing=data case */ { if (strcmp(arg, op->long_name) == 0) break; } else /* Special case xxx=data */ { int oplen = equals - op->long_name; int arglen = (argequals == NULL)? (int)strlen(arg) : argequals - arg; if (oplen == arglen && strncmp(arg, op->long_name, oplen) == 0) { option_data = arg + arglen; if (*option_data == '=') { option_data++; longopwasequals = TRUE; } break; } } } /* Handle options with an alternate spelling of the name */ else { char buff1[24]; char buff2[24]; int baselen = opbra - op->long_name; int fulllen = strchr(op->long_name, ')') - op->long_name + 1; int arglen = (argequals == NULL || equals == NULL)? (int)strlen(arg) : argequals - arg; sprintf(buff1, "%.*s", baselen, op->long_name); sprintf(buff2, "%s%.*s", buff1, fulllen - baselen - 2, opbra + 1); if (strncmp(arg, buff1, arglen) == 0 || strncmp(arg, buff2, arglen) == 0) { if (equals != NULL && argequals != NULL) { option_data = argequals; if (*option_data == '=') { option_data++; longopwasequals = TRUE; } } break; } } } if (op->one_char == 0) { fprintf(stderr, "pcregrep: Unknown option %s\n", argv[i]); exit(usage(2)); } } /* Jeffrey Friedl's debugging harness uses these additional options which are not in the right form for putting in the option table because they use only one hyphen, yet are more than one character long. By putting them separately here, they will not get displayed as part of the help() output, but I don't think Jeffrey will care about that. */ #ifdef JFRIEDL_DEBUG else if (strcmp(argv[i], "-pre") == 0) { jfriedl_prefix = argv[++i]; continue; } else if (strcmp(argv[i], "-post") == 0) { jfriedl_postfix = argv[++i]; continue; } else if (strcmp(argv[i], "-XT") == 0) { sscanf(argv[++i], "%d", &jfriedl_XT); continue; } else if (strcmp(argv[i], "-XR") == 0) { sscanf(argv[++i], "%d", &jfriedl_XR); continue; } #endif /* One-char options; many that have no data may be in a single argument; we continue till we hit the last one or one that needs data. */ else { char *s = argv[i] + 1; longop = FALSE; while (*s != 0) { for (op = optionlist; op->one_char != 0; op++) { if (*s == op->one_char) break; } if (op->one_char == 0) { fprintf(stderr, "pcregrep: Unknown option letter '%c' in \"%s\"\n", *s, argv[i]); exit(usage(2)); } if (op->type != OP_NODATA || s[1] == 0) { option_data = s+1; break; } pcre_options = handle_option(*s++, pcre_options); } } /* At this point we should have op pointing to a matched option. If the type is NO_DATA, it means that there is no data, and the option might set something in the PCRE options. */ if (op->type == OP_NODATA) { pcre_options = handle_option(op->one_char, pcre_options); continue; } /* If the option type is OP_OP_STRING or OP_OP_NUMBER, it's an option that either has a value or defaults to something. It cannot have data in a separate item. At the moment, the only such options are "colo(u)r" and Jeffrey Friedl's special -S debugging option. */ if (*option_data == 0 && (op->type == OP_OP_STRING || op->type == OP_OP_NUMBER)) { switch (op->one_char) { case N_COLOUR: colour_option = (char *)"auto"; break; #ifdef JFRIEDL_DEBUG case 'S': S_arg = 0; break; #endif } continue; } /* Otherwise, find the data string for the option. */ if (*option_data == 0) { if (i >= argc - 1 || longopwasequals) { fprintf(stderr, "pcregrep: Data missing after %s\n", argv[i]); exit(usage(2)); } option_data = argv[++i]; } /* If the option type is OP_PATLIST, it's the -e option, which can be called multiple times to create a list of patterns. */ if (op->type == OP_PATLIST) { if (cmd_pattern_count >= MAX_PATTERN_COUNT) { fprintf(stderr, "pcregrep: Too many command-line patterns (max %d)\n", MAX_PATTERN_COUNT); return 2; } patterns[cmd_pattern_count++] = option_data; } /* Otherwise, deal with single string or numeric data values. */ else if (op->type != OP_NUMBER && op->type != OP_OP_NUMBER) { *((char **)op->dataptr) = option_data; } else { char *endptr; int n = strtoul(option_data, &endptr, 10); if (*endptr != 0) { if (longop) { char *equals = strchr(op->long_name, '='); int nlen = (equals == NULL)? (int)strlen(op->long_name) : equals - op->long_name; fprintf(stderr, "pcregrep: Malformed number \"%s\" after --%.*s\n", option_data, nlen, op->long_name); } else fprintf(stderr, "pcregrep: Malformed number \"%s\" after -%c\n", option_data, op->one_char); exit(usage(2)); } *((int *)op->dataptr) = n; } } /* Options have been decoded. If -C was used, its value is used as a default for -A and -B. */ if (both_context > 0) { if (after_context == 0) after_context = both_context; if (before_context == 0) before_context = both_context; } /* Only one of --only-matching, --file-offsets, or --line-offsets is permitted. However, the latter two set the only_matching flag. */ if ((only_matching && (file_offsets || line_offsets)) || (file_offsets && line_offsets)) { fprintf(stderr, "pcregrep: Cannot mix --only-matching, --file-offsets " "and/or --line-offsets\n"); exit(usage(2)); } if (file_offsets || line_offsets) only_matching = TRUE; /* If a locale has not been provided as an option, see if the LC_CTYPE or LC_ALL environment variable is set, and if so, use it. */ if (locale == NULL) { locale = getenv("LC_ALL"); locale_from = "LCC_ALL"; } if (locale == NULL) { locale = getenv("LC_CTYPE"); locale_from = "LC_CTYPE"; } /* If a locale has been provided, set it, and generate the tables the PCRE needs. Otherwise, pcretables==NULL, which causes the use of default tables. */ if (locale != NULL) { if (setlocale(LC_CTYPE, locale) == NULL) { fprintf(stderr, "pcregrep: Failed to set locale %s (obtained from %s)\n", locale, locale_from); return 2; } pcretables = pcre_maketables(); } /* Sort out colouring */ if (colour_option != NULL && strcmp(colour_option, "never") != 0) { if (strcmp(colour_option, "always") == 0) do_colour = TRUE; else if (strcmp(colour_option, "auto") == 0) do_colour = is_stdout_tty(); else { fprintf(stderr, "pcregrep: Unknown colour setting \"%s\"\n", colour_option); return 2; } if (do_colour) { char *cs = getenv("PCREGREP_COLOUR"); if (cs == NULL) cs = getenv("PCREGREP_COLOR"); if (cs != NULL) colour_string = cs; } } /* Interpret the newline type; the default settings are Unix-like. */ if (strcmp(newline, "cr") == 0 || strcmp(newline, "CR") == 0) { pcre_options |= PCRE_NEWLINE_CR; endlinetype = EL_CR; } else if (strcmp(newline, "lf") == 0 || strcmp(newline, "LF") == 0) { pcre_options |= PCRE_NEWLINE_LF; endlinetype = EL_LF; } else if (strcmp(newline, "crlf") == 0 || strcmp(newline, "CRLF") == 0) { pcre_options |= PCRE_NEWLINE_CRLF; endlinetype = EL_CRLF; } else if (strcmp(newline, "any") == 0 || strcmp(newline, "ANY") == 0) { pcre_options |= PCRE_NEWLINE_ANY; endlinetype = EL_ANY; } else if (strcmp(newline, "anycrlf") == 0 || strcmp(newline, "ANYCRLF") == 0) { pcre_options |= PCRE_NEWLINE_ANYCRLF; endlinetype = EL_ANYCRLF; } else { fprintf(stderr, "pcregrep: Invalid newline specifier \"%s\"\n", newline); return 2; } /* Interpret the text values for -d and -D */ if (dee_option != NULL) { if (strcmp(dee_option, "read") == 0) dee_action = dee_READ; else if (strcmp(dee_option, "recurse") == 0) dee_action = dee_RECURSE; else if (strcmp(dee_option, "skip") == 0) dee_action = dee_SKIP; else { fprintf(stderr, "pcregrep: Invalid value \"%s\" for -d\n", dee_option); return 2; } } if (DEE_option != NULL) { if (strcmp(DEE_option, "read") == 0) DEE_action = DEE_READ; else if (strcmp(DEE_option, "skip") == 0) DEE_action = DEE_SKIP; else { fprintf(stderr, "pcregrep: Invalid value \"%s\" for -D\n", DEE_option); return 2; } } /* Check the values for Jeffrey Friedl's debugging options. */ #ifdef JFRIEDL_DEBUG if (S_arg > 9) { fprintf(stderr, "pcregrep: bad value for -S option\n"); return 2; } if (jfriedl_XT != 0 || jfriedl_XR != 0) { if (jfriedl_XT == 0) jfriedl_XT = 1; if (jfriedl_XR == 0) jfriedl_XR = 1; } #endif /* Get memory to store the pattern and hints lists. */ pattern_list = (pcre **)malloc(MAX_PATTERN_COUNT * sizeof(pcre *)); hints_list = (pcre_extra **)malloc(MAX_PATTERN_COUNT * sizeof(pcre_extra *)); if (pattern_list == NULL || hints_list == NULL) { fprintf(stderr, "pcregrep: malloc failed\n"); goto EXIT2; } /* If no patterns were provided by -e, and there is no file provided by -f, the first argument is the one and only pattern, and it must exist. */ if (cmd_pattern_count == 0 && pattern_filename == NULL) { if (i >= argc) return usage(2); patterns[cmd_pattern_count++] = argv[i++]; } /* Compile the patterns that were provided on the command line, either by multiple uses of -e or as a single unkeyed pattern. */ for (j = 0; j < cmd_pattern_count; j++) { if (!compile_pattern(patterns[j], pcre_options, NULL, (j == 0 && cmd_pattern_count == 1)? 0 : j + 1)) goto EXIT2; } /* Compile the regular expressions that are provided in a file. */ if (pattern_filename != NULL) { int linenumber = 0; FILE *f; char *filename; char buffer[MBUFTHIRD]; if (strcmp(pattern_filename, "-") == 0) { f = stdin; filename = stdin_name; } else { f = fopen(pattern_filename, "r"); if (f == NULL) { fprintf(stderr, "pcregrep: Failed to open %s: %s\n", pattern_filename, strerror(errno)); goto EXIT2; } filename = pattern_filename; } while (fgets(buffer, MBUFTHIRD, f) != NULL) { char *s = buffer + (int)strlen(buffer); while (s > buffer && isspace((unsigned char)(s[-1]))) s--; *s = 0; linenumber++; if (buffer[0] == 0) continue; /* Skip blank lines */ if (!compile_pattern(buffer, pcre_options, filename, linenumber)) goto EXIT2; } if (f != stdin) fclose(f); } /* Study the regular expressions, as we will be running them many times */ for (j = 0; j < pattern_count; j++) { hints_list[j] = pcre_study(pattern_list[j], 0, &error); if (error != NULL) { char s[16]; if (pattern_count == 1) s[0] = 0; else sprintf(s, " number %d", j); fprintf(stderr, "pcregrep: Error while studying regex%s: %s\n", s, error); goto EXIT2; } hint_count++; } /* If there are include or exclude patterns, compile them. */ if (exclude_pattern != NULL) { exclude_compiled = pcre_compile(exclude_pattern, 0, &error, &errptr, pcretables); if (exclude_compiled == NULL) { fprintf(stderr, "pcregrep: Error in 'exclude' regex at offset %d: %s\n", errptr, error); goto EXIT2; } } if (include_pattern != NULL) { include_compiled = pcre_compile(include_pattern, 0, &error, &errptr, pcretables); if (include_compiled == NULL) { fprintf(stderr, "pcregrep: Error in 'include' regex at offset %d: %s\n", errptr, error); goto EXIT2; } } if (exclude_dir_pattern != NULL) { exclude_dir_compiled = pcre_compile(exclude_dir_pattern, 0, &error, &errptr, pcretables); if (exclude_dir_compiled == NULL) { fprintf(stderr, "pcregrep: Error in 'exclude_dir' regex at offset %d: %s\n", errptr, error); goto EXIT2; } } if (include_dir_pattern != NULL) { include_dir_compiled = pcre_compile(include_dir_pattern, 0, &error, &errptr, pcretables); if (include_dir_compiled == NULL) { fprintf(stderr, "pcregrep: Error in 'include_dir' regex at offset %d: %s\n", errptr, error); goto EXIT2; } } /* If there are no further arguments, do the business on stdin and exit. */ if (i >= argc) { rc = pcregrep(stdin, FR_PLAIN, (filenames > FN_DEFAULT)? stdin_name : NULL); goto EXIT; } /* Otherwise, work through the remaining arguments as files or directories. Pass in the fact that there is only one argument at top level - this suppresses the file name if the argument is not a directory and filenames are not otherwise forced. */ only_one_at_top = i == argc - 1; /* Catch initial value of i */ for (; i < argc; i++) { int frc = grep_or_recurse(argv[i], dee_action == dee_RECURSE, only_one_at_top); if (frc > 1) rc = frc; else if (frc == 0 && rc == 1) rc = 0; } EXIT: if (pattern_list != NULL) { for (i = 0; i < pattern_count; i++) free(pattern_list[i]); free(pattern_list); } if (hints_list != NULL) { for (i = 0; i < hint_count; i++) free(hints_list[i]); free(hints_list); } return rc; EXIT2: rc = 2; goto EXIT; } /* End of pcregrep */

Accept-Ranges: bytes


markdown:
XEM NHIỀU TRONG NGÀY
-
1
[Tôi Muốn Làm Siêu Sao](http://phim720p.com/movie/info/10058/toi-muon-lam-sieu-sao.html)Lượt xem: 11583
-
2
[Sự Quyễn Rũ Xấu Xa](http://phim720p.com/movie/info/9905/su-quyen-ru-xau-xa.html)Lượt xem: 767
-
3
[Người Vợ Bất Chính](http://phim720p.com/movie/info/10139/nguoi-vo-bat-chinh.html)Lượt xem: 702
-
4
[Malee: Cô Nàng Rắc Rối](http://phim720p.com/movie/info/10040/malee-co-nang-rac-roi.html)Lượt xem: 507
-
5
[Sống Lại Tuổi 20](http://phim720p.com/movie/info/10117/song-lai-tuoi-20.html)Lượt xem: 390
-
6
[Sai... Vì Người Đã Đổi Thay](http://phim720p.com/movie/info/10164/sai-vi-nguoi-da-doi-thay.html)Lượt xem: 351
-
7
[Naruto Shippuuden](http://phim720p.com/movie/info/6677/naruto-shippuuden.html)Lượt xem: 325
-
8
[Lang Nha Bảng](http://phim720p.com/movie/info/10180/lang-nha-bang.html)Lượt xem: 325
-
9
[Tình Yêu Không Có Lỗi, Lỗi Ở... Bạn Thân](http://phim720p.com/movie/info/10141/tinh-yeu-khong-co-loi-loi-o-ban-than.html)Lượt xem: 299
-
10
[Yêu Nhé Vịt Ngố (Phần 3): Đừng](http://phim720p.com/movie/info/10138/yeu-nhe-vit-ngo-phan-3-dung.html)Lượt xem: 273
Tag Cloud
[Phim bộ Thái Lan](movie/list/phim-bo-thai-lan.html), [phim chiếu rạp 2015](movie/list/phim-chieu-rap.html), [phim bo thai lan moi nhat](movie/tag/phim-bo-thai-lan-moi-nhat), [phim bo thai lan 2015](movie/tag/phim-bo-thai-lan-2015), [hitman agent 47 full vietsub](movie/tag/hitman-agent-47-full-vietsub), [qua nhanh qua nguy hiem](movie/tag/qua-nhanh-qua-nguy-hiem/), [vu khi toi thuong](movie/tag/vu-khi-toi-thuong/), [Ngã Rẽ Định Mệnh Thái Lan](movie/info/10115/nga-re-dinh-menh.html), [bóng tối trái tim - ngao jai 2015](movie/info/9996/bong-toi-trai-tim.html), [xem phim Tôi muốn làm sieu sao](movie/info/10058/toi-muon-lam-sieu-sao.html), [Yêu Nhé Vịt Ngố phần 1 2](movie/tag/yeu-nhe-vit-ngo/), [phim su quyen ru xau xa tap cuoi](movie/info/9905/su-quyen-ru-xau-xa.html), [phim thien tai lang bam](movie/tag/phim-thien-tai-lang-bam-2015), [phim Điệp Viên Quyến Rũ](movie/info/4856/diep-vien-quyen-ru.html), [Phim Anime](movie/category/32/anime.html), [đảo hải tặc](movie/tag/dao-hai-tac/), [dragon ball](movie/tag/dragon-ball/), [Phim 5s Online Tap Cuoi](movie/tag/phim-5s-online-tap-cuoi/), [Phim Dinh Menh Anh Yeu Em Long Tieng](movie/tag/phim-dinh-menh-anh-yeu-em-long-tieng/), [Phim Bo Thai Lan Moi Nhat](movie/tag/phim-bo-thai-lan-moi-nhat/), [Phim Nang Dae Jang Geum Vietsub](movie/tag/phim-nang-dae-jang-geum-vietsub/), [Phim Bo Thai Lan](movie/tag/phim-bo-thai-lan/), [Phim Hoat Hinh Doremon Thuyet Minh](movie/tag/phim-hoat-hinh-doremon-thuyet-minh/), [Phim Nguoi Tinh Bi An Tap 11 12 13 14 15 16 17 18 19 20](movie/tag/phim-nguoi-tinh-bi-an-tap-11-12-13-14-15-16-17-18-19-20/), [Phim Nang Ngoc Va Quan Su Long Tieng](movie/tag/phim-nang-ngoc-va-quan-su-long-tieng/), [Phim Nguoi Tinh Bi An Tap 1 2 3 4 5 6 7 8 9 10](movie/tag/phim-nguoi-tinh-bi-an-tap-1-2-3-4-5-6-7-8-9-10/), [Phim A Huu Chinh Truyen Thuyet Minh](movie/tag/phim-a-huu-chinh-truyen-thuyet-minh/), [Phim Nang Ngoc Va Quan Su Thuyet Minh](movie/tag/phim-nang-ngoc-va-quan-su-thuyet-minh/), [Tam Quoc Dien Nghia Full Hd](movie/tag/tam-quoc-dien-nghia-full-hd/), [Phim Tan Dong Song Ly Biet Thuyet Minh](movie/tag/phim-tan-dong-song-ly-biet-thuyet-minh/), [Phim Tro Dua Cua So Phan Philippin](movie/tag/phim-tro-dua-cua-so-phan-philippin/), [Phim Mat Na Thuy Tinh Tron Bo](movie/tag/phim-mat-na-thuy-tinh-tron-bo/), [Phim Chuyen Tinh Paris Thuyet Minh](movie/tag/phim-chuyen-tinh-paris-thuyet-minh/), [One Piece Online](movie/tag/one-piece-online/), [Phim Mat Danh Iris Thuyet Minh](movie/tag/phim-mat-danh-iris-thuyet-minh/)

WARC-Type: response

Content-Type: application/http; msgtype=response

WARC-Truncated: length

Content-Type: text/html; charset=UTF-8

Connection: close

Cache-Control: private, must-revalidate

Pragma: no-cache

Vary: Accept-Encoding

Server: cloudflare-nginx

Content-Encoding: gzip


markdown:
# Hot girl cởi chuồng show hàng | Girl xinh show hàng
,
Hot girl coi chuong show hang, hot girl coi chuong, gai dep coi chuong, gai dep show hang, girl xinh show hang, girl show hang, hang dep
![](http://4.bp.blogspot.com/-fSaK6CijO18/TrQEwgqYGZI/AAAAAAAAABU/4oTh1NEgwWI/s400/hotgirl2.JPG)
Subscribe to:
Xem phim sex online, phim lauxanh, ảnh sex dep, anh nude hot girl, tin shock, tin hot, tin scandal cap nhat hang ngay hang gio
[Phim Lau Xanh](http://phimlauxanh.blogspot.com/) - Copyright © 2011 - Powered by [Blogger](http://www.blogger.com)

Cache-Control: private, max-age=0

X-Content-Type-Options: nosniff

X-XSS-Protection: 1; mode=block

Server: GSE


markdown:
|
|
|
|![]()
|
|
Điện thoại: 0907404684
Địa chỉ: 1014/36/14 cách mạng tháng tám, f.5, quận tân bình, tp HCM.
![]()
|
|
|
|![]()
|
|
Điện thoại: 0907404684
Địa chỉ: 1014/36/14 cách mạng tháng tám, f.5, quận tân bình, tp HCM.
![]()
|
|
|
|![]()
|
|
|
|
|
|![]()
|
|
Điện thoại: 0907404684
Địa chỉ: 1014/36/14 cách mạng tháng tám, f.5, quận tân bình, tp HCM.
![]()
|
|
|
|![]()
|
|
Điện thoại: 0907404684
Địa chỉ: 1014/36/14 cách mạng tháng tám, f.5, quận tân bình, tp HCM.
![]()
|
|
|
|![]()
|
|
Điện thoại: 0907404684
Địa chỉ: 1014/36/14 cách mạng tháng tám, f.5, quận tân bình, tp HCM.
![]()
|
|
|
|![]()
|
|
Điện thoại: 0907404684
Địa chỉ: 1014/36/14 cách mạng tháng tám, f.5, quận tân bình, tp HCM.
![]()
|
|
|
|![]()
|
|
Điện thoại: 0907404684
Địa chỉ: 1014/36/14 cách mạng tháng tám, f.5, quận tân bình, tp HCM.
![]()
|
|
|
|![]()
|
|
Điện thoại: 0907404684
Địa chỉ: 1014/36/14 cách mạng tháng tám, f.5, quận tân bình, tp HCM.
![]()
|
|

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Content-Type: text/html


markdown:
Sàn nhạc sử dụng tốt nhất ở trình duyệt Firefox
Để thu âm và sử dụng sannhac một cách dễ dàng, bạn hãy cài đặt phầm mềm sau
Bắt đầu cài đặt Firefox
để duyệt web nhanh hơn
Đăng nhập
|
Đăng ký
Tên đăng nhập
Mật khẩu
Ghi nhớ
Quên mật khẩu
|
Gửi lại mail kích hoạt
Trang chủ
Phòng thu
Sàn đấu
Club
Game
Nuôi Rồng
Tam phân thiên hạ
Poker Texas
VIP Game
Cá Xinh
Đảo Thiên Đường
Heo Kute
Tam Quốc
Jay Online
Bá Vương Mini
Xứ sở Mộng Mơ
wePlay
Hát Live
Chú ý
:
Khắc phục lỗi thu âm không nghe lại được, không lưu được, bị nháy bản thu...(có video và bài viết hướng dẫn cách khắc phục rất đơn giản)
Lưu ý
: Để đảm bảo khớp độ lớn của nhạc nền và giọng hát nên khi thu âm cả nhạc nền và giọng hát đều được thu, các bạn chú ý phải bật cả loa, hoặc đặt micro gần tai phone nhé.
Những bài hát cùng ca sĩ
Ai đưa em về
Đàm Vĩnh Hưng
4755
lượt thu
Khóc cho người đi
Đàm Vĩnh Hưng
3220
lượt thu
Tiếng gió xôn xao
Đàm Vĩnh Hưng
2450
lượt thu
Bài thánh ca buồn
Đàm Vĩnh Hưng
1735
lượt thu
Cỏ úa
Đàm Vĩnh Hưng
1639
lượt thu
Anh vẫn biết
Đàm Vĩnh Hưng
1582
lượt thu
Giây phút chia xa
Đàm Vĩnh Hưng
1444
lượt thu
Lạc mất mùa xuân
Đàm Vĩnh Hưng
1309
lượt thu
Nửa vầng trăng
Đàm Vĩnh Hưng
1178
lượt thu
Ta đi tìm em
Đàm Vĩnh Hưng
1162
lượt thu
Một cõi đi về
Đàm Vĩnh Hưng
982
lượt thu
Say tình
Đàm Vĩnh Hưng
935
lượt thu
Thương hoài ngàn năm
Đàm Vĩnh Hưng
933
lượt thu
Tàn tro
Đàm Vĩnh Hưng
849
lượt thu
Góc phố rêu xanh
Đàm Vĩnh Hưng
839
lượt thu
Thành phố mưa bay
Đàm Vĩnh Hưng
732
lượt thu
Lối nhỏ vào đời
Đàm Vĩnh Hưng
699
lượt thu
Tình em xứ Quảng
Đàm Vĩnh Hưng
681
lượt thu
Đêm thấy ta là thác đổ
Đàm Vĩnh Hưng
655
lượt thu
Nỗi nhớ tình tôi
Đàm Vĩnh Hưng
582
lượt thu
Giã từ
Đàm Vĩnh Hưng
563
lượt thu
Thành phố buồn
Đàm Vĩnh Hưng
564
lượt thu
Lạc mất em
Đàm Vĩnh Hưng
559
lượt thu
Bình minh sẽ mang em đi
Đàm Vĩnh Hưng
557
lượt thu
Vùng trời bình yên
Đàm Vĩnh Hưng
529
lượt thu
Đừng thương tôi
Đàm Vĩnh Hưng
517
lượt thu
Giới hạn nào cho chúng ta
Đàm Vĩnh Hưng
504
lượt thu
Cô đơn mình anh (remix)
Đàm Vĩnh Hưng
472
lượt thu
Không phải em
Đàm Vĩnh Hưng
470
lượt thu
Về đi thôi hỡi em
Đàm Vĩnh Hưng
469
lượt thu
Cô đơn mình anh
Đàm Vĩnh Hưng
455
lượt thu
Có lẽ nào
Đàm Vĩnh Hưng
454
lượt thu
Khóc cho người ra đi
Đàm Vĩnh Hưng
440
lượt thu
Sao đổi ngôi
Đàm Vĩnh Hưng
431
lượt thu
Đánh mất
Đàm Vĩnh Hưng
426
lượt thu
Tình yêu còn đâu
Đàm Vĩnh Hưng
416
lượt thu
Cho em một ngày
Đàm Vĩnh Hưng
396
lượt thu
Anh vẫn chờ em
Đàm Vĩnh Hưng
363
lượt thu
Tình lỡ
Đàm Vĩnh Hưng
338
lượt thu
Tình ơi xin ngủ yên
Đàm Vĩnh Hưng
323
lượt thu
Tình yêu không lời
Đàm Vĩnh Hưng
323
lượt thu
Gọi tên bốn mùa
Đàm Vĩnh Hưng
314
lượt thu
Chén đắng
Đàm Vĩnh Hưng
298
lượt thu
Phôi pha
Đàm Vĩnh Hưng
291
lượt thu
Thao thức vì em
Đàm Vĩnh Hưng
286
lượt thu
Tình tuyệt vọng
Đàm Vĩnh Hưng
277
lượt thu
Nỗi nhớ
Đàm Vĩnh Hưng
274
lượt thu
Giọt nước mắt cho đời
Đàm Vĩnh Hưng
267
lượt thu
Tình đời nghệ sĩ
Đàm Vĩnh Hưng
259
lượt thu
Đổi thay
Đàm Vĩnh Hưng
256
lượt thu
Đêm lang thang
Đàm Vĩnh Hưng
247
lượt thu
Bên đời hiu quạnh
Đàm Vĩnh Hưng
238
lượt thu
Tình nhớ
Đàm Vĩnh Hưng
227
lượt thu
Nếu có yêu tôi
Đàm Vĩnh Hưng
227
lượt thu
Dịu dàng sắc xuân
Đàm Vĩnh Hưng
225
lượt thu
Sao em nỡ vô tình
Đàm Vĩnh Hưng
214
lượt thu
Xin dìu nhau đến tình yêu
Đàm Vĩnh Hưng
203
lượt thu
Không thể và có thể
Đàm Vĩnh Hưng
197
lượt thu
Mưa chiều kỷ niệm
Đàm Vĩnh Hưng
186
lượt thu
Hạ trắng
Đàm Vĩnh Hưng
182
lượt thu
Bạc tình
Đàm Vĩnh Hưng
177
lượt thu
Đành thôi người ơi
Đàm Vĩnh Hưng
169
lượt thu
Đất nước trọn niềm vui
Đàm Vĩnh Hưng
167
lượt thu
Chuyện hẹn hò
Đàm Vĩnh Hưng
162
lượt thu
Tình thơ
Đàm Vĩnh Hưng
161
lượt thu
Em đi bỏ lại con đường
Đàm Vĩnh Hưng
146
lượt thu
Nỗi đau ngọt ngào
Đàm Vĩnh Hưng
133
lượt thu
Ngày không bình yên
Đàm Vĩnh Hưng
125
lượt thu
Em đã quên một dòng sông
Đàm Vĩnh Hưng
125
lượt thu
Tình yêu còn đâu
Đàm Vĩnh Hưng
121
lượt thu
Mười năm tình cũ
Đàm Vĩnh Hưng
120
lượt thu
Hàn Mặc Tử
Đàm Vĩnh Hưng
114
lượt thu
Giải thoát
Đàm Vĩnh Hưng
112
lượt thu
Nắng thủy tinh
Đàm Vĩnh Hưng
111
lượt thu
Hoa có vàng nơi ấy
Đàm Vĩnh Hưng
109
lượt thu
Hãy nhìn lại mình đi
Đàm Vĩnh Hưng
102
lượt thu
Muộn
Đàm Vĩnh Hưng
99
lượt thu
Một phút đam mê
Đàm Vĩnh Hưng
99
lượt thu
Trên những niềm đau
Đàm Vĩnh Hưng
97
lượt thu
Đợi em trong mơ
Đàm Vĩnh Hưng
96
lượt thu
Người sở hữu:
love_xulanh
Trị giá:
31.56
Cấp độ:
Trùm
Tài sản:
9,329.31
Tài khoản:
95.23
Thông tin chi tiết
Xin lỗi tình yêu - Đàm Vĩnh Hưng
Uploader:
Sannhac
Lượt thu: 3951
Thời gian: 22/10/2007 00:00:00
Yêu thích
Tải beat
Chờ Feat
Thể hiện thành công
Sàn Nhạc
, Tầng 21 Tòa nhà Center Building - Hapulico Complex
Số 1 Nguyễn Huy Tưởng, Thanh Xuân, Hà Nội.
Email:
sannhac@gmail.com
Liên hệ hợp tác: 094.686.1289
Giới thiệu quảng cáo
Liên hệ quảng cáo:
Admicro
Hà Nội – Ms. Hải Yến: 0988 965 517 – (84 4) 3974 8899. Ext 2201
Hồ Chí Minh – Mr.Tuấn: 0983 050 185 – (84 8) 7307 7979. Ext 173
Email:
giaitrixahoi@admicro.vn
Hỗ trợ & CSKH:
Admicro
Ms.Thơm: 01268 269 779
Address: Tầng 20, Center Building Hapulico Complex, Số 1 Nguyễn Huy Tưởng, Thanh Xuân, Hà Nội
Copyright 2009
– Công ty cổ phần VCCorp.
Tầng 17, 19, 20, 21 Tòa nhà Center Building - Hapulico Complex
Số 1 Nguyễn Huy Tưởng, Thanh Xuân, Hà Nội.
Giấy phép số 375/GP-BTTTT Bộ Thông tin và Truyền thông cấp ngày 07 tháng 08 năm 2015.
Trang chủ
|
Điều khoản
|
Phòng thu
|
Beat
|
Recording

Server: Apache/2.2.15 (CentOS)

Set-Cookie: viewbeat=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0


markdown:
![ ](http://upload.satgai.com//files/72013/-Qa991hammuon.jpg)
![ ](http://upload.satgai.com//files/72013/-Qa991hammuon.jpg)
### Bạn đã xem chưa
[Dục vọng tăng trào khi nhìn mấy em này](http://satgai.com/duc-vong-tang-trao-khi-nhin-may-em-nay.html) [Tình Yêu và Dục Vọng](http://satgai.com/tinh-yeu-va-duc-vong.html) [Phim sex cực mạnh Tokyo hot nô lệ tình dục](http://satgai.com/phim-sex-cuc-manh-tokyo-hot-no-le-tinh-duc.html) [Gái dâm tận hưởng tình dục 1 cách sung sướng](http://satgai.com/gai-dam-tan-huong-tinh-duc-1-cach-sung-suong.html) [Phim sex thiên thần tình dục Azumi Mizushima](http://satgai.com/phim-sex-thien-than-tinh-duc-azumi-mizushima.html) [Clip sex cực mạnh tra tấn tình dục gái xinh](http://satgai.com/clip-sex-cuc-manh-tra-tan-tinh-duc-gai-xinh.html) [Phim sex mạnh tra tấn tình dục gái xinh vú hồng](http://satgai.com/phim-sex-manh-tra-tan-tinh-duc-gai-xinh-vu-hong.html) [Phim sex loạn luân với chị dâu dâm đãng gợi dục](http://satgai.com/phim-sex-loan-luan-voi-chi-dau-dam-dang-goi-duc.html) [Tra tấn tình dục – Móc lồn gái xinh nước ra ào ào](http://satgai.com/tra-tan-tinh-duc-moc-lon-gai-xinh-nuoc-ra-ao-ao.html) [Gia đình sống trong tình dục – Phim loạn luân](http://satgai.com/gia-dinh-song-trong-tinh-duc-phim-loan-luan.html) [Phim sex gái xinh Tokyo hot 2013](http://satgai.com/phim-sex-gai-xinh-tokyo-hot-2013.html) [Phim sex gái xinh 9x lồn đẹp không che cực hot](http://satgai.com/phim-sex-gai-xinh-9x-lon-dep-khong-che-cuc-hot.html) [Teen show hàng cực hot vú đẹp lồn to](http://satgai.com/teen-show-hang-cuc-hot-vu-dep-lon-to.html) [Phim sex Ayumi Suzumoto hot Asian vú đẹp](http://satgai.com/phim-sex-ayumi-suzumoto-hot-asian-vu-dep.html) [Phim sex gái xinh 18 tuổi Hàn Quốc cực hot](http://satgai.com/phim-sex-gai-xinh-18-tuoi-han-quoc-cuc-hot.html) [Phim sex châu á hot](http://satgai.com/phim-sex-chau-a-hot.html) [Clip sex nữ sinh vú tròn hồng lồn to cực hot](http://satgai.com/clip-sex-nu-sinh-vu-tron-hong-lon-to-cuc-hot.html) [Nữ sinh show hàng vú hồng lồn non cực hot](http://satgai.com/nu-sinh-show-hang-vu-hong-lon-non-cuc-hot.html) [Phim sex hot girl 9x vú hồng dáng chuẩn](http://satgai.com/phim-sex-hot-girl-9x-vu-hong-dang-chuan.html) [Gái xinh lồn non show hàng chat sex rất hot](http://satgai.com/gai-xinh-lon-non-show-hang-chat-sex-rat-hot.html)
Tags:

Set-Cookie: __cfduid=d095c1ee2699caf4427037e8fa2e869101443934612; expires=Mon, 03-Oct-16 04:56:52 GMT; path=/; domain=.satgai.com; HttpOnly

Vary: Accept-Encoding, User-Agent

X-Cache: uncached

X-Cache-Hit: MISS


markdown:
Tư vấn mua hàng
Tư vấn sử dụng
Hotline
Tp. HCM: 0987 054 910
Hà Nội: 0936 348 626
Đà Nẵng: 0935 072 299
15/10/2010
BỘ TÀI CHÍNH
CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM
-----------
Độc lập - Tự do - Hạnh phúc
Số: 129/2008/TT- BTC
---------------------
Hà Nội, ngày 26 tháng 12 năm 2008
THÔNG TƯ
Hướng dẫn thi hành một số điều của Luật Thuế giá trị gia tăng và hướng dẫn thi hành Nghị định số 123/2008/NĐ-CP ngày 08 tháng 12 năm 2008 của Chính phủ quy định chi tiết và hướng dẫn thi hành một số điều của Luật Thuế giá trị gia tăng
-----------------------
Căn cứ Luật Thuế giá trị gia tăng số 13/2008/QH12 ngày 03 tháng 6 năm 2008;Căn cứ Luật Quản lý thuế số 78/2006/QH11 ngày 29 tháng 11 năm 2006; Căn cứ Nghị định số 123/2008/NĐ-CP ngày 08 tháng 12 năm 2008 của Chính phủ quy định chi tiết và hướng dẫn thi hành một số điều của Luật Thuế giá trị gia tăng; Căn cứ Nghị định số 118/2008/NĐ-CP ngày 27 tháng 11 năm 2008 của Chính phủ quy định chức năng, nhiệm vụ, quyền hạn và cơ cấu tổ chức của Bộ Tài chính, Bộ Tài chính hướng dẫn thi hành về thuế giá trị gia tăng như sau:A. PHẠM VI ÁP DỤNG I. ĐỐI TƯỢNG CHỊU THUẾ, NGƯỜI NỘP THUẾ 1. Đối tượng chịu thuế Đối tượng chịu thuế giá trị gia tăng (GTGT) là hàng hoá, dịch vụ dùng cho sản xuất, kinh doanh và tiêu dùng ở Việt Nam (bao gồm cả hàng hóa, dịch vụ mua của tổ chức, cá nhân ở nước ngoài), trừ các đối tượng không chịu thuế GTGT nêu tại Mục II, Phần A Thông tư này.----------------Download bản đầy đủ tại đây

Cache-Control: private

Content-Type: text/html; charset=utf-8


markdown:
**Giá từ:** **Liên Hệ** **Giảm giá:** **Liên Hệ** **Mã sản phẩm:**SFPK911 **Bảo hành:** ![ sofa goc](http://sofaphongkhach.vn/images/bep-xinh-vn.png)
**Xuất xứ:**Malaysia - Italia *"Sofa Góc - Mẫu sofa sẽ là giải pháp tối ưu nhất cho căn phòng khách của bạn, giúp bạn có được một không gian tiếp khách thật thoải mái, thông thoáng."*
Sofa Gỗ – Với mẫu Sofa được sản xuất và nhập khẩu từ Đài Loan này, bạn sẽ có thêm nhiều giải pháp để lựa chọn việc trang trí cho không gian phòng khách của mình.

Cache-Control: public


markdown:
Tư Vấn Y Khoa Miễn Phí Qua Mạng (PalTalk, Diễn Đàn, & Email)
Bỏ qua nội dung
Các điều hành viên: thai, dcthuy, BS Nguyen Quyen Quoi, BS Nguyen Quyen Tai
Gửi bàigửi bởi buingan2011 » Thứ 5 Tháng 12 15, 2011 8:07 pm
Gửi bàigửi bởi admin » Thứ 6 Tháng 12 16, 2011 10:55 am
Quay về
Đang xem chuyên mục này: 7 và 0 khách

Set-Cookie: phpbb3_2c5y5_sid=340ccec6004797b94673ebbbc0b05da3; expires=Mon, 03-Oct-2016 04:56:54 GMT; path=/; domain=songkhoe.crctvn.org; HttpOnly

Cache-Control: private, no-cache="set-cookie"


markdown:
# Giáo án lớp 7 môn Hình Học: LUYỆN TẬP HAI TAM GIÁC BẰNG NHAU
Chia sẻ: Tranthithanhhang Hang | Ngày: | Loại File: PDF | Số trang:5
![](images/blank.gif)
![](images/blank.gif)
lượt xem 33
download
![](http://image1.tailieu.vn/document/thumbnail/2011/20110831/abcdef_22/80x100/luyen_tap_hai_tam_giac_bang_nhau_6828.jpg)
##
Giáo án lớp 7 môn Hình Học: LUYỆN TẬP HAI TAM GIÁC BẰNG NHAU
[Vui lòng tải xuống để xem tài liệu đầy đủ](javascript:void(0);)
Download
![](images/down16x21.png)
A. Mục tiêu: củng cố các kiến thức, kỹ năng, thái độ về: Định nghĩa hai tam giác bằng nhau Viết đúng và thành thạo về sự bằng nhau của hai tam giác theo quy ước, biết sử dụng định nghĩa hai tam giác bằng nhau để suy ra các đoạn thẳng, các góc bằng nhau. Rèn khả năng phán đoán, nhận xét để kết luận hai tam giác bằng nhau. tập tính cẩn thận chính xác. B. Chuẩn bị của giáo viên và học sinh: Giáo viên: êke, bảng phụ, thước đo góc. Học sinh: dụng cụ học tập,...
![](images/graphics/blank.gif)
Bình luận(0)
[Đăng nhập để gửi bình luận!](javascript:void(0);)
CÓ THỂ BẠN MUỐN DOWNLOAD


markdown:
|wWw.thptTamPhước.Net|
| Chào mừng đến với diễn đàn học sinh trường thpt Tam Phước |
-----------------------------------------------------------------------------------
Diễn Đàn trường thpt Tam Phước luôn luôn chào đón bạn ghé thăm. Hãy cùng nhau kết nối vòng tay bè bạn với Diễn Đàn nhé!
- Mọi thắc mắc các bạn có thể post bài để mọi người cùng nhau chia sẻ và giải đáp giúp bạn.
Cảm ơn và chúc bạn có những giây phút vui vẻ trong 4Rum này!
[ Admin ]
wWw.thptTamPhước.Net
Diễn Đàn này không chịu sự quản lý của nhà trường, Quản trị viên tự quản lý!
![]()
Chào mừng các bạn đến với Diễn Đàn THPT Tam Phước, bạn có thể truy cập 4Rum bằng địa chỉ sau: Http://thptTamPhuoc.Cow.vn - http://thptTamPhuoc.Net
4Rum THPT Tam Phước hoan nghênh bạn đã ghé thăm, chúc bạn có những giây phút thật Dzui dzẻ và hạnh phúc ...
Bạn nên đọc qua mục " Thông Báo & Hướng dẫn " để biết thêm thông tin và cách sử dụng Diễn Đàn.
Nếu như đây là lần đầu bạn tham gia Diễn Đàn THPT Tam Phước, bạn hãy "Đăng Kí" làm thành viên để được sử dụng Diễn Đàn ở chế độ tốt nhất nhé!
Diễn Đàn THPT Tam Phước được thiết kế bởi Nguyễn Trần Cung học sinh lớp 11A9 trường THPT Tam Phước... với mong muốn gắn kết thế hệ trẻ của trường THPT Tam Phước lại với nhau. Mong các bạn ủng hộ mình nhé! Thanks.
![]()
Thành viên nổi tiếng
![]()
![]()
![]()
Tên: Tr0n
Giới tính:
![]()
Số bài gửi: 342
Tuổi: 22
Sinh ngày: 23/09/1993
Đến từ: tAm phUoc schOol
Công việc: petr0n_boon_likekiss
Hiện trạng:: Chưa thèm yêu!
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
## Giáo án Ngữ văn 10 - trọn bộ
![]()

P3P: CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"

Cache-Control: post-check=0, pre-check=0


markdown:
ban ghe cafe
qua tang van phong
ban xe lexus RX350
viec lam them tai dong nai
viec lam them tai can tho
may cat sat makita
suc khoe lam dep
ban laptop cu gia re tphcm
ban laptop cu
bi quyet lam dep
game hay cho android
cho thue xe tai
Bạn đứng thứ mấy trong lớp không quan trọng nhưng phải thể hiện được đẳng cấp khi bước ra xã hội "
Ngày 04 tháng 10 năm 2015
Quên mật khẩu ?Đăng kí tài khoản


markdown:
##
[
Viên giảm cân Biotin Collagen Slim ](http://thuocgiamcan.me/shop/vien-giam-can-biotin-collagen-slim)
1.190.000 Đ
##
[
Thuốc giảm cân Beautiful Slim Body ](http://thuocgiamcan.me/shop/thuoc-giam-can-beautiful-slim-body)
949.000 Đ
##
[
Thuốc giảm cân SlimFit USA ](http://thuocgiamcan.me/shop/thuoc-giam-can-slimfit-usa)
949.000 Đ

Vary: Accept-Encoding,User-Agent


markdown:
# Giáo trình Lập trình C_Chương 1: Biến, Con trỏ
Nội dung: - Bài 1: Khái niệm chung - Bài 2: Các phép toán về con trỏ - Bài 3: Tầm quan trọng của dữ liệu khi khai báo con trỏ - Bài 4: Các biểu thức con trỏ - Bài 5: Con trỏ và mảng - Bài 6: Con trỏ và chuỗi - Bài 7: Con trỏ trỏ đến con trỏ
![ pdf](/images/icons/pdf16x16.gif)
[diunt88](#)| Ngày: 30/08/2012 | Lượt xem: 763 | Lượt tải: 7 ![ download](/images/download.gif)
![ download](/images/download.gif)
**Giáo trình Lập trình C_Chương 1: Biến, Con trỏ**, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên


markdown:
1,500,000 đ
1,800,000 đ
2,499,000 đ
229,000 đ
390,000 đ
680,000 đ
1,100,000 đ
14,000,000 đ
219,000 đ
360,000 đ

Server: Apache/2.2.3 (CentOS)


markdown:
Bài Tập Hệ Phương Trình-Luyện Thi Đại Học Có Đáp Án - File Word
phương trình, học sinh, đại học, cao đẳng, tác giả, nâng cao, tham khảo
Nội dung
Mã an toàn:
Mã an toàn:
![ Mã chống spam](/index.php?scaptcha=captcha)

Server: Apache/2.2.31 (Unix) mod_ssl/2.2.31 OpenSSL/1.0.1e-fips mod_bwlimited/1.4

Set-Cookie: nv3c_Ao3yo_nvvithemever=lg%2C%2C; expires=Mon, 03-Oct-2016 04:59:14 GMT; path=/; domain=.toancapba.net; httponly


markdown: Nên học nghề gì? Mình 38 tuổi, ở quê, bây giờ muốn học 1 nghề gì đó mà băn khoăn lựa chọn mãi chưa được. Có một vài lựa chọn như học sửa chữa xe máy, học sửa điện thoại, học cơ khí,... Các bác có lời khuyên gợi ý nào hay giúp em với ạ. Vote ngàn *****************

Server: nginx

X-Frame-Options: SAMEORIGIN


markdown:
ME
TV
MP3
NEWS
Đăng nhập
/
Đăng ký
Tắt quảng cáo
Trang chủ
Trang chủ
TV Show
Show Việt Nam
Show Âu Mỹ
Show Hàn Quốc
Show Hoa Ngữ
Show Thực Tế
Show Hài Hước
Show Âm Nhạc
Show Thời Trang
Lễ Trao Giải
Game Show
Talk Show
Phim Truyền Hình
Phim Việt Nam
Phim Âu Mỹ
Phim Hàn - Nhật
Phim Hong Kong
Phim Hoa Ngữ
Phim Thái Lan
Phim Gia Đình
Phim Thần Tượng
Hành Động - Phiêu Lưu
Khoa Học - Viễn Tưởng
Hình Sự - Tội Phạm
Tâm Lý - Lãng Mạn
Lịch Sử - Cổ Trang
Kinh Dị - Siêu Nhiên
Giải Trí - Âm Nhạc
Hài Hước
Thể Thao
Khác
Hoạt Hình
Anime
Hành Động - Phiêu Lưu
Tâm Lý - Lãng Mạn
Khoa Học - Viễn Tưởng
Kinh Dị - Siêu Nhiên
Hài Hước
Hài Hước
Tiểu Phẩm Hài
Sân Khấu - Liveshow Hài
Giải Trí - Vui Nhộn
Thiếu Nhi
0 Tuổi - 2 Tuổi
2 Tuổi - 4 Tuổi
5 Tuổi - 7 Tuổi
8 Tuổi - 12 Tuổi
Giáo Dục
Khoa học/ Khám phá
Hoạt Hình
Âm Nhạc
Kid Movies
Làm Cha Mẹ
Khoa Học - Giáo Dục
Khoa Học Vũ Trụ
Thiên Nhiên Hoang Dã
Kết Nối Công Nghệ
Lịch Sử - Chiến Tranh
Thám Hiểm - Du Lịch
Khoa Học Quân Sự
Gia Đình - Ẩm Thực
Khoa Học Huyền Bí
Khoa Học Thường Thức
Làm Cha Mẹ
Học Đường - Luyện Thi
Sức Khỏe - Y Tế
Kinh Doanh
Con Người
Kênh Truyền Hình
CJ Entertaiment
VTV
Đài TH Vĩnh Long
Let's Việt
TV Plus
Style TV
FBNC
Quốc Phòng Việt Nam
Tuyển tập
Khác
Phim Điện Ảnh
Phim Việt Nam
Phim Âu Mỹ
Phim Châu Á
Phim Gia Đình
Hình Sự - Tội Phạm
Hành Động - Phiêu Lưu
Tâm Lý - Lãng Mạn
Khoa Học - Viễn Tưởng
Lịch Sử - Cổ Trang
Giải Trí - Âm Nhạc
Hoạt Hình
Kinh Dị - Siêu Nhiên
Hài Hước
Thể Thao
Khác
Âm Nhạc
Nhạc Việt Nam
Nhạc Hàn Quốc
Nhạc Âu Mỹ
Nhạc Hoa Ngữ
Liveshow
Tin Tức - Sự Kiện
Thể Thao
Kinh Tế
Pháp Luật
Giáo Dục
Giải Trí
Chính Trị - Xã Hội
Khoa Học - Công Nghệ
Gia Đình - Sức Khỏe
Thế Giới
Thể Thao
Bóng Đá Việt Nam
Ngoại Hạng Anh
Bóng Đá Thế Giới
La Liga
Các Môn Thể Thao Khác
Video Games
Trailer Game
eSport
Khác
Cộng Đồng
Video cộng Đồng
Shop
Trang chủ
Trang chủ
Thể Loại
TV Show
Phim Truyền Hình
Hoạt Hình
Hài Hước
Video Games
Phim Điện Ảnh
Thiếu Nhi
Giáo Dục
Âm Nhạc
Thể Thao
Tin Tức - Sự Kiện
Kênh Truyền Hình
CJ Entertaiment
VTV
Đài TH Vĩnh Long
Let's Việt
TV Plus
Style TV
FBNC
Quốc Phòng Việt Nam
Zing TV App
Cộng Đồng
Phim Ngắn: Những Câu Chuyện Nói Dối
Chương trình:
Phim Ngắn
Thể loại:
Phim Truyền Hình
,
Phim Việt Nam
Ngày phát hành:
01/4/2013
Đóng góp:
M3o.dihoang
lượt xem
Báo lỗi
0.0
(-/10)
0 lượt đánh giá
Chia sẻ:
facebook
google plus
zing me
embed code
Phim Ngắn
Quan tâm
Mã nhúng:
Sử dụng mã nhúng cũ
Video size
560x315
640x360
853x480
1280x720
Custom size
x
<iframe width="450" height="285" src="http://tv.zing.vn/embed/video/IWZA0CWA" frameborder="0" allowfullscreen="true"></iframe>
Sắc Màu Định Mệnh - Victor Vũ
Tập 1 - Thuyền Lá
16/6/2015
00:08:18
Tập 2 - Áo Dài
16/6/2015
00:06:50
Tập 3 - Hoa Hồng
16/6/2015
00:05:59
Phòng Tự Học Học Viện Nam Sinh
Play all
|
Xem tất cả (10)
Tập 10 - Chia Tay [END]
00:14:53
Tập 9 - Tạm Biệt
00:10:21


markdown:
Đăng nhập
Đăng ký
Thêm từ
Phát âm
Nghe & Học
Ngôn ngữ
Thể loại
Phát âm
Thành viên
Phát âm
Dịch + Phát âm BETA
Tìm kiếm từ
Idiomas
Tiếng Anh - Tiếng Ả Rập
Tiếng Anh - Tiếng Đức
Tiếng Anh - Tiếng Nga
Tiếng Anh - Tiếng Nhật
Tiếng Anh - Tiếng Pháp
Tiếng Anh - Tiếng Tây Ban Nha
Tiếng Anh - Tiếng Ý
Tiếng Pháp - Tiếng Ả Rập
Tiếng Pháp - Tiếng Anh
Tiếng Pháp - Tiếng Đức
Tiếng Pháp - Tiếng Nga
Tiếng Pháp - Tiếng Nhật
Tiếng Pháp - Tiếng Tây Ban Nha
Tiếng Pháp - Tiếng Ý
Tiếng Tây Ban Nha - Tiếng Ả Rập
Tiếng Tây Ban Nha - Tiếng Anh
Tiếng Tây Ban Nha - Tiếng Đức
Tiếng Tây Ban Nha - Tiếng Nga
Tiếng Tây Ban Nha - Tiếng Nhật
Tiếng Tây Ban Nha - Tiếng Pháp
Tiếng Tây Ban Nha - Tiếng Ý
Buscar
Thể loại:
生化学
Đăng ký theo dõi 生化学 phát âm
2 từ được đánh dấu là "生化学".
Sắp xếp
theo ngày
theo độ phổ biến
theo vần
phát âm デオキシリボ核酸
デオキシリボ核酸
[
ja
]
phát âm 核酸
核酸
[
ja
]

Set-Cookie: forvo_cookies=1; expires=Mon, 03-Oct-2016 05:06:33 GMT; Max-Age=31536000; path=/; domain=.forvo.com


markdown:
*mvura phát âm trong* [Tiếng Shona](http://vi.forvo.com/languages/sn/)[sn]
-
[phát âm mvura](http://vi.forvo.com/word/mvura/)Phát âm của [Choto](javascript:;)(Nữ từ Zimbabwe)
Bạn có thể làm tốt hơn? bằng giọng khác?
[Phát âm mvura trong Tiếng Shona](http://vi.forvo.com/word-record/mvura/sn/)
Bạn có thể làm tốt hơn? bằng giọng khác?
[Phát âm mvura trong Tiếng Shona](http://vi.forvo.com/word-record/mvura/sn/)
Từ ngẫu nhiên:
[masvosvobwa](http://vi.forvo.com/word/masvosvobwa/), [masvosve](http://vi.forvo.com/word/masvosve/), [tsvaira](http://vi.forvo.com/word/tsvaira/), [masvavembasvwi](http://vi.forvo.com/word/masvavembasvwi/), [zvizvuvhutswa](http://vi.forvo.com/word/zvizvuvhutswa/)

Set-Cookie: forvo_cookies=1; expires=Mon, 03-Oct-2016 05:06:32 GMT; Max-Age=31536000; path=/; domain=.forvo.com


markdown:
*tenis phát âm trong
* [Tiếng Croatia](http://vi.forvo.com/languages/hr/)[hr]
-
[phát âm tenis](http://vi.forvo.com/word/tenis/)Phát âm của [fsdance](javascript:;)(Nam từ Croatia)
Bạn có thể làm tốt hơn? bằng giọng khác?
[Phát âm tenis trong Tiếng Croatia](http://vi.forvo.com/word-record/tenis/hr/)
Bạn có thể làm tốt hơn? bằng giọng khác?
[Phát âm tenis trong Tiếng Croatia](http://vi.forvo.com/word-record/tenis/hr/)
Bạn có thể làm tốt hơn? bằng giọng khác?
[Phát âm tenis trong Tiếng Ba Lan](http://vi.forvo.com/word-record/tenis/pl/)
Bạn có thể làm tốt hơn? bằng giọng khác?
[Phát âm tenis trong Tiếng Slovakia](http://vi.forvo.com/word-record/tenis/sk/)
Bạn có thể làm tốt hơn? bằng giọng khác?
[Phát âm tenis trong Tiếng Romania](http://vi.forvo.com/word-record/tenis/ro/)
Bạn có thể làm tốt hơn? bằng giọng khác?
[Phát âm tenis trong Tiếng Tây Ban Nha](http://vi.forvo.com/word-record/tenis/es/)
Bạn có thể làm tốt hơn? bằng giọng khác?
[Phát âm tenis trong Tiếng Slovenia](http://vi.forvo.com/word-record/tenis/sl/)
Bạn có thể làm tốt hơn? bằng giọng khác?
[Phát âm tenis trong Quốc tế ngữ](http://vi.forvo.com/word-record/tenis/eo/)
Bạn có thể làm tốt hơn? bằng giọng khác?
[Phát âm tenis trong Tiếng Séc](http://vi.forvo.com/word-record/tenis/cs/)
Bạn có thể làm tốt hơn? bằng giọng khác?
[Phát âm tenis trong Tiếng Indonesia](http://vi.forvo.com/word-record/tenis/ind/)

Set-Cookie: forvo_cookies=1; expires=Mon, 03-Oct-2016 05:04:54 GMT; Max-Age=31536000; path=/; domain=.forvo.com


markdown:
# Khách sạn gần Perrysburg
## Tìm khách sạn ở Perrysburg, Toledo, Ohio, Mỹ
## Đang được quan tâm tại Toledo
- Đặt nhiều nhất
Country Inn & Suites By Carlson, Toledo South, OH
45 người đã xem khách sạn này trong 1 giờ vừa qua
31 người đã xem khách sạn này trong 1 giờ vừa qua
27 người đã xem khách sạn này trong 1 giờ vừa qua
26 người đã xem khách sạn này trong 1 giờ vừa qua
24 người đã xem khách sạn này trong 1 giờ vừa qua
22 người đã xem khách sạn này trong 1 giờ vừa qua
20 người đã xem khách sạn này trong 1 giờ vừa qua
16 người đã xem khách sạn này trong 1 giờ vừa qua
13 người đã xem khách sạn này trong 1 giờ vừa qua
12 người đã xem khách sạn này trong 1 giờ vừa qua
![ Toledo, Ohio, United States of America](http://a2.cdn-hotels.com/da/assets/s/25.0/images/themes/red/core/dio/widget/1.gif)
![ Toledo, Ohio, United States of America](http://a2.cdn-hotels.com/da/assets/s/25.0/images/themes/red/core/dio/widget/1.gif)
Xem khách sạn gần Perrysburg trên bản đồ
## Địa danh
[Sở thú Toledo](http://vi.hotels.com/de1667779/khach-san-gan-so-thu-toledo-toledo-my/) [Sòng bạc Hollywood](http://vi.hotels.com/de1774863/khach-san-gan-song-bac-hollywood-toledo-my/) [Đại học Bang Bowling Green](http://vi.hotels.com/de1667775/khach-san-gan-ai-hoc-bang-bowling-green-bowling-green-my/) [Đại học Toledo](http://vi.hotels.com/de1667773/khach-san-gan-ai-hoc-toledo-toledo-my/) [Trung tâm Huntington](http://vi.hotels.com/de1687629/khach-san-gan-trung-tam-huntington-toledo-my/) [Sân Fifth Third](http://vi.hotels.com/de1689052/khach-san-gan-san-fifth-third-toledo-my/) [Trung tâm hội nghị Seagate](http://vi.hotels.com/de1689082/khach-san-gan-trung-tam-hoi-nghi-seagate-toledo-my/) [Bảo tàng Cứu hỏa Toledo](http://vi.hotels.com/de1774870/khach-san-gan-bao-tang-cuu-hoa-toledo-toledo-my/) [Đường đua Toledo](http://vi.hotels.com/de1667784/khach-san-gan-uong-ua-toledo-toledo-my/) [Sân Golf Maumee Bay](http://vi.hotels.com/de1774852/khach-san-gan-san-golf-maumee-bay-oregon-my/) [Bảo tàng Nghệ thuật Toledo](http://vi.hotels.com/de1667778/khach-san-gan-bao-tang-nghe-thuat-toledo-toledo-my/) [Nhà hát Stranahan](http://vi.hotels.com/de1667783/khach-san-gan-nha-hat-stranahan-toledo-my/) [Maumee Antique Mall](http://vi.hotels.com/de1731287/khach-san-gan-maumee-antique-mall-maumee-my/) [Lucas County Recreation Center](http://vi.hotels.com/de1731284/khach-san-gan-lucas-county-recreation-center-maumee-my/) [Imagination Station (Trung tâm Khoa học Thiếu nhi)](http://vi.hotels.com/de1774851/khach-san-gan-imagination-station-trung-tam-khoa-hoc-thieu-nhi-toledo-my/) [Vườn Bách thảo Toledo](http://vi.hotels.com/de1667782/khach-san-gan-vuon-bach-thao-toledo-toledo-my/) [Sân Golf Ottawa Park](http://vi.hotels.com/de1774854/khach-san-gan-san-golf-ottawa-park-toledo-my/) [Maumee Sports Mall](http://vi.hotels.com/de1731280/khach-san-gan-maumee-sports-mall-maumee-my/) [Đấu trường Anderson](http://vi.hotels.com/de1667777/khach-san-gan-au-truong-anderson-bowling-green-my/) [Câu lạc bộ Golf Collins Park American](http://vi.hotels.com/de1774853/khach-san-gan-cau-lac-bo-golf-collins-park-american-toledo-my/)
## Phương tiện giao thông
## Khám phá Perrysburg
![ Hotels.com™ Rewards](http://a2.cdn-hotels.com/da/assets/s/25.0/images/brands/hcom/hcomrewards/logos/rewards-logo-purple-no-moon-vi_VN.png)
![ Hotels.com™ Rewards](http://a2.cdn-hotels.com/da/assets/s/25.0/images/brands/hcom/hcomrewards/logos/rewards-logo-white-no-moon-vi_VN.png)
## Đang được quan tâm tại Toledo
- Đặt nhiều nhất
Country Inn & Suites By Carlson, Toledo South, OH
45 người đã xem khách sạn này trong 1 giờ vừa qua
31 người đã xem khách sạn này trong 1 giờ vừa qua
27 người đã xem khách sạn này trong 1 giờ vừa qua
26 người đã xem khách sạn này trong 1 giờ vừa qua
24 người đã xem khách sạn này trong 1 giờ vừa qua
22 người đã xem khách sạn này trong 1 giờ vừa qua
20 người đã xem khách sạn này trong 1 giờ vừa qua
16 người đã xem khách sạn này trong 1 giờ vừa qua
13 người đã xem khách sạn này trong 1 giờ vừa qua
12 người đã xem khách sạn này trong 1 giờ vừa qua
![ Hotels.com™ Rewards](http://a2.cdn-hotels.com/da/assets/s/25.0/images/brands/hcom/hcomrewards/logos/rewards-logo-purple-no-moon-vi_VN.png)
![ Hotels.com™ Rewards](http://a2.cdn-hotels.com/da/assets/s/25.0/images/brands/hcom/hcomrewards/logos/rewards-logo-white-no-moon-vi_VN.png)

Server: Application-Server

Content-Language: vi-VN

Cache-Control: max-age=0, no-cache, no-store

Set-Cookie: user=QSp2aV9WTnxIQ09NX1ZO; Domain=.hotels.com; Expires=Mon, 03-Oct-2016 05:14:04 GMT; Path=/


markdown:
Vui lòng cho biết email của bạn để nhận Từ vựng của Urban mỗi sáng nhé!
Địa chỉ daily@urbandictionary.com sẽ gửi thư cho bạn. Chúng tôi cam kết sẽ không để xảy ra tình trạng gửi thư rác vào hộp mail của bạn.

Server: Cowboy

Cache-Control: max-age=3600, public

Via: 1.1 varnish

X-Cache: MISS


markdown:
**Mamblota**đến **mammal to mammal**
-
[Mamblota](/define.php?term=Mamblota)
-
[Mambo](/define.php?term=Mambo)
-
[Mambo #5](/define.php?term=Mambo+%235)
-
[Mambo Bambo](/define.php?term=Mambo+Bambo)
-
[mamboboy](/define.php?term=mamboboy)
-
[Mambo dogface to the banana patch?](/define.php?term=Mambo+dogface+to+the+banana+patch%3F)
-
[mambo-gig-a-france](/define.php?term=mambo-gig-a-france)
-
[mambo jambo](/define.php?term=mambo+jambo)
-
[mamboking](/define.php?term=mamboking)
-
[Mambo Mafia](/define.php?term=Mambo+Mafia)
-
[Mambo Number 5](/define.php?term=Mambo+Number+5)
-
[Mamboola](/define.php?term=Mamboola)
-
[Mambooza](/define.php?term=Mambooza)
-
[mambo sauce](/define.php?term=mambo+sauce)
-
[mambo tooth](/define.php?term=mambo+tooth)
-
[Mambriz](/define.php?term=Mambriz)
-
[mambumpcious](/define.php?term=mambumpcious)
-
[Mamburay](/define.php?term=Mamburay)
-
[Mamburger](/define.php?term=Mamburger)
-
[mamby pamby](/define.php?term=mamby+pamby)
-
[Mamby Pamby Land](/define.php?term=Mamby+Pamby+Land)
-
[Mamcaps](/define.php?term=Mamcaps)
-
[Mam crush](/define.php?term=Mam+crush)
-
[MamDad](/define.php?term=MamDad)
-
[Mamdani](/define.php?term=Mamdani)
-
[Mamdouh](/define.php?term=Mamdouh)
-
[mamdy](/define.php?term=mamdy)
-
[MAME](/define.php?term=MAME)
-
[Mamecita](/define.php?term=Mamecita)
-
[ma'm-ed](/define.php?term=ma%27m-ed)
-
[Ma$$ Media](/define.php?term=Ma%24%24+Media)
-
[mamedis](/define.php?term=mamedis)
-
[mamegoma](/define.php?term=mamegoma)
-
[mamejin](/define.php?term=mamejin)
-
[mamel](/define.php?term=mamel)
-
[Mamelas](/define.php?term=Mamelas)
-
[Mameli](/define.php?term=Mameli)
-
[mameltoe](/define.php?term=mameltoe)
-
[Mameluco](/define.php?term=Mameluco)
-
[mameluke](/define.php?term=mameluke)
-
[Ma'Melville](/define.php?term=Ma%27Melville)
-
[Mamer](/define.php?term=Mamer)
-
[ma mère](/define.php?term=ma+m%C3%A8re)
-
[mamerro](/define.php?term=mamerro)
-
[mameshiba](/define.php?term=mameshiba)
-
[Mamet dammit](/define.php?term=Mamet+dammit)
-
[Mametsa](/define.php?term=Mametsa)
-
[mametsubu](/define.php?term=mametsubu)
-
[mam-exam](/define.php?term=mam-exam)
-
[Mamexico](/define.php?term=Mamexico)
-
[Mamey](/define.php?term=Mamey)
-
[mamf](/define.php?term=mamf)
-
[MAMFA](/define.php?term=MAMFA)
-
[mamfawamfa](/define.php?term=mamfawamfa)
-
[mamge](/define.php?term=mamge)
-
[Mamgu](/define.php?term=Mamgu)
-
[Mami](/define.php?term=Mami)
-
[mami chula](/define.php?term=mami+chula)
-
[mamichulita](/define.php?term=mamichulita)
-
[Mami Dance](/define.php?term=Mami+Dance)
-
[Mamie](/define.php?term=Mamie)
-
[mamifest](/define.php?term=mamifest)
-
[Mamifest Destiny](/define.php?term=Mamifest+Destiny)
-
[Mamification](/define.php?term=Mamification)
-
[mamihlapinatapai](/define.php?term=mamihlapinatapai)
-
[mamihlapinatapei](/define.php?term=mamihlapinatapei)
-
[mamij](/define.php?term=mamij)
-
[mamijoes](/define.php?term=mamijoes)
-
[mamijol](/define.php?term=mamijol)
-
[MAMIL](/define.php?term=MAMIL)
-
[mamilalas](/define.php?term=mamilalas)
-
[Mamill](/define.php?term=Mamill)
-
[mamilla](/define.php?term=mamilla)
-
[Mamilon](/define.php?term=Mamilon)
-
[MAMILT](/define.php?term=MAMILT)
-
[Mamil Toe](/define.php?term=Mamil+Toe)
-
[Mamilucos](/define.php?term=Mamilucos)
-
[mamily](/define.php?term=mamily)
-
[Mamimi](/define.php?term=Mamimi)
-
[maminal](/define.php?term=maminal)
-
[mamirriki](/define.php?term=mamirriki)
-
[Mami Sammy](/define.php?term=Mami+Sammy)
-
[mamiscus](/define.php?term=mamiscus)
-
[mamise](/define.php?term=mamise)
-
[mamisita](/define.php?term=mamisita)
-
[mamistahay](/define.php?term=mamistahay)
-
[Mami T](/define.php?term=Mami+T)
-
[Mamita](/define.php?term=Mamita)
-
[mamitis](/define.php?term=mamitis)
-
[Mami Uno](/define.php?term=Mami+Uno)
-
[MamiXChulaX](/define.php?term=MamiXChulaX)
-
[mamiya](/define.php?term=mamiya)
-
[Mamiyiye](/define.php?term=Mamiyiye)
-
[mamiz](/define.php?term=mamiz)
-
[mam jam](/define.php?term=mam+jam)
-
[mamkind](/define.php?term=mamkind)
-
[mamler](/define.php?term=mamler)
-
[Mamling](/define.php?term=Mamling)
-
[mamm](/define.php?term=mamm)
-
[mamma](/define.php?term=mamma)
-
[mamma ballin](/define.php?term=mamma+ballin)
-
[Mamma Bear](/define.php?term=Mamma+Bear)
-
[Mamma bird](/define.php?term=Mamma+bird)
-
[mamma brava](/define.php?term=mamma+brava)
-
[mamma bravo](/define.php?term=mamma+bravo)
-
[Mamma Cat](/define.php?term=Mamma+Cat)
-
[Mammacommisto](/define.php?term=Mammacommisto)
-
[mammadex](/define.php?term=mammadex)
-
[mammadons](/define.php?term=mammadons)
-
[MammaDoo](/define.php?term=MammaDoo)
-
[mamma dukes](/define.php?term=mamma+dukes)
-
[mamma dumpling](/define.php?term=mamma+dumpling)
-
[mamma fin](/define.php?term=mamma+fin)
-
[mamma g](/define.php?term=mamma+g)
-
[mammagantic](/define.php?term=mammagantic)
-
[Mammager](/define.php?term=Mammager)
-
[Mammagination](/define.php?term=Mammagination)
-
[Mammagucci](/define.php?term=Mammagucci)
-
[mammah](/define.php?term=mammah)
-
[Mammaherb](/define.php?term=Mammaherb)
-
[MammaJ](/define.php?term=MammaJ)
-
[mammajam](/define.php?term=mammajam)
-
[mamma jamma](/define.php?term=mamma+jamma)
-
[mamma jammin](/define.php?term=mamma+jammin)
-
[Mamma kitty](/define.php?term=Mamma+kitty)
-
[mammal](/define.php?term=mammal)
-
[mammalade](/define.php?term=mammalade)
-
[Mammalanche](/define.php?term=Mammalanche)
-
[Mammalate](/define.php?term=Mammalate)
-
[mammalaya](/define.php?term=mammalaya)
-
[Mammaled](/define.php?term=Mammaled)
-
[mammalian protruberances](/define.php?term=mammalian+protruberances)
-
[mammalian protuberances](/define.php?term=mammalian+protuberances)
-
[mammaling](/define.php?term=mammaling)
-
[Mammal Punch](/define.php?term=Mammal+Punch)
-
[Mammal Sauce](/define.php?term=Mammal+Sauce)
-
[mammal soap](/define.php?term=mammal+soap)
-
[mammaltarian](/define.php?term=mammaltarian)
-
[mammal toe](/define.php?term=mammal+toe)
-
[mammal to mammal](/define.php?term=mammal+to+mammal)