Programming This forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.
Notices
Welcome to
LinuxQuestions.org , a friendly and active Linux Community.
You are currently viewing LQ as a guest. By joining our community you will have the ability to post topics, receive our newsletter, use the advanced search, subscribe to threads and access many other special features. Registration is quick, simple and absolutely free.
Join our community today!
Note that registered members see fewer ads, and ContentLink is completely disabled once you log in.
Are you new to LinuxQuestions.org? Visit the following links:
Site Howto |
Site FAQ |
Sitemap |
Register Now
If you have any problems with the registration process or your account login, please
contact us . If you need to reset your password,
click here .
Having a problem logging in? Please visit this page to clear all LQ-related cookies.
Get a
virtual cloud desktop with the Linux distro that you want in less than five minutes with Shells! With over 10 pre-installed distros to choose from, the worry-free installation life is here! Whether you are a digital nomad or just looking for flexibility, Shells can put your Linux machine on the device that you want to use.
Exclusive for LQ members, get up to 45% off per month.
Click here for more info.
11-05-2013, 12:15 AM
#1
Senior Member
Registered: Jun 2006
Location: UNIX
Distribution: FreeBSD
Posts: 2,657
Remove double entries in C?
Hi,
I have been looking for a minimalist way to remove
double entries in C such as does the uniq.c.
I cannot compile it , and it shall work on Windows.
Would you know possible alternatives dependencies free (or to minimum)?
Thank you
X.
Code:
/* vi: set sw=4 ts=4: */
/*
* uniq implementation for busybox
*
* Copyright (C) 2005 Manuel Novoa III <mjn3@codepoet.org>
*
* Licensed under GPLv2 or later, see file LICENSE in this source tree.
*/
/* BB_AUDIT SUSv3 compliant */
/* http://www.opengroup.org/onlinepubs/007904975/utilities/uniq.html */
//usage:#define uniq_trivial_usage
//usage: "[-cdu][-f,s,w N] [INPUT [OUTPUT]]"
//usage:#define uniq_full_usage "\n\n"
//usage: "Discard duplicate lines\n"
//usage: "\n -c Prefix lines by the number of occurrences"
//usage: "\n -d Only print duplicate lines"
//usage: "\n -u Only print unique lines"
//usage: "\n -f N Skip first N fields"
//usage: "\n -s N Skip first N chars (after any skipped fields)"
//usage: "\n -w N Compare N characters in line"
//usage:
//usage:#define uniq_example_usage
//usage: "$ echo -e \"a\\na\\nb\\nc\\nc\\na\" | sort | uniq\n"
//usage: "a\n"
//usage: "b\n"
//usage: "c\n"
#include "libbb.h"
int uniq_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int uniq_main(int argc UNUSED_PARAM, char **argv)
{
const char *input_filename;
unsigned skip_fields, skip_chars, max_chars;
unsigned opt;
char *cur_line;
const char *cur_compare;
enum {
OPT_c = 0x1,
OPT_d = 0x2, /* print only dups */
OPT_u = 0x4, /* print only uniq */
OPT_f = 0x8,
OPT_s = 0x10,
OPT_w = 0x20,
};
skip_fields = skip_chars = 0;
max_chars = INT_MAX;
opt_complementary = "f+:s+:w+";
opt = getopt32(argv, "cduf:s:w:", &skip_fields, &skip_chars, &max_chars);
argv += optind;
input_filename = argv[0];
if (input_filename) {
const char *output;
if (input_filename[0] != '-' || input_filename[1]) {
close(STDIN_FILENO); /* == 0 */
xopen(input_filename, O_RDONLY); /* fd will be 0 */
}
output = argv[1];
if (output) {
if (argv[2])
bb_show_usage();
if (output[0] != '-' || output[1]) {
// Won't work with "uniq - FILE" and closed stdin:
//close(STDOUT_FILENO);
//xopen(output, O_WRONLY | O_CREAT | O_TRUNC);
xmove_fd(xopen(output, O_WRONLY | O_CREAT | O_TRUNC), STDOUT_FILENO);
}
}
}
cur_compare = cur_line = NULL; /* prime the pump */
do {
unsigned i;
unsigned long dups;
char *old_line;
const char *old_compare;
old_line = cur_line;
old_compare = cur_compare;
dups = 0;
/* gnu uniq ignores newlines */
while ((cur_line = xmalloc_fgetline(stdin)) != NULL) {
cur_compare = cur_line;
for (i = skip_fields; i; i--) {
cur_compare = skip_whitespace(cur_compare);
cur_compare = skip_non_whitespace(cur_compare);
}
for (i = skip_chars; *cur_compare && i; i--) {
++cur_compare;
}
if (!old_line || strncmp(old_compare, cur_compare, max_chars)) {
break;
}
free(cur_line);
++dups; /* testing for overflow seems excessive */
}
if (old_line) {
if (!(opt & (OPT_d << !!dups))) { /* (if dups, opt & OPT_u) */
if (opt & OPT_c) {
/* %7lu matches GNU coreutils 6.9 */
printf("%7lu ", dups + 1);
}
printf("%s\n", old_line);
}
free(old_line);
}
} while (cur_line);
die_if_ferror(stdin, input_filename);
fflush_stdout_and_exit(EXIT_SUCCESS);
}
https://gitorious.org/busybox/busybo...reutils/uniq.c
11-05-2013, 01:35 AM
#2
Member
Registered: Nov 2004
Location: Russia (St.Petersburg)
Distribution: Debian
Posts: 666
Rep:
it is in C of course:
Code:
#include <assert.h>
#include <lauxlib.h>
#include <lualib.h>
#include <string.h>
int main() {
const char *prog_uniq = ""
"prev = nil\n"
"for line in io.stdin:lines() do\n"
" if line ~= prev then\n"
" print(line)\n"
" prev = line\n"
" end\n"
"end";
lua_State *L = luaL_newstate();
assert(L);
luaL_openlibs(L);
int r = luaL_loadbuffer(L, prog_uniq, strlen(prog_uniq), "uniq");
assert(r == LUA_OK);
lua_call(L, 0, 0);
return 0;
}
usage:
Code:
$ gcc -l lua5.2 -I /usr/include/lua5.2/ c.c
$ { seq 4 ; seq 2 ; } | sort | ./a.out
1
2
3
4
11-05-2013, 09:10 PM
#3
Senior Member
Registered: Jun 2006
Location: UNIX
Distribution: FreeBSD
Posts: 2,657
Original Poster
Quote:
Originally Posted by
Ygrex
it is in C of course:
Code:
#include <assert.h>
#include <lauxlib.h>
#include <lualib.h>
#include <string.h>
int main() {
const char *prog_uniq = ""
"prev = nil\n"
"for line in io.stdin:lines() do\n"
" if line ~= prev then\n"
" print(line)\n"
" prev = line\n"
" end\n"
"end";
lua_State *L = luaL_newstate();
assert(L);
luaL_openlibs(L);
int r = luaL_loadbuffer(L, prog_uniq, strlen(prog_uniq), "uniq");
assert(r == LUA_OK);
lua_call(L, 0, 0);
return 0;
}
usage:
Code:
$ gcc -l lua5.2 -I /usr/include/lua5.2/ c.c
$ { seq 4 ; seq 2 ; } | sort | ./a.out
1
2
3
4
Thank you. But, actually, the probem is this since I have to port it to Windows XP:
Code:
#include <assert.h>
#include <lauxlib.h>
#include <lualib.h>
11-06-2013, 05:27 PM
#4
Senior Member
Registered: Dec 2004
Location: Olympia, WA, USA
Distribution: Fedora, (K)Ubuntu
Posts: 4,187
Why not start with the
BSD code ? It might be easier to port then the Busybox version, since that one is intended to be a component of a single stand-alone program.
All times are GMT -5. The time now is 06:21 PM .
LinuxQuestions.org is looking for people interested in writing
Editorials, Articles, Reviews, and more. If you'd like to contribute
content, let us know .
Latest Threads
LQ News