mirror of
https://github.com/postgres/postgres.git
synced 2025-07-12 21:01:52 +03:00
Ye-old pgindent run. Same 4-space tabs.
This commit is contained in:
1253
contrib/bit/varbit.c
1253
contrib/bit/varbit.c
File diff suppressed because it is too large
Load Diff
@ -2,7 +2,7 @@
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <float.h> /* faked on sunos4 */
|
||||
#include <float.h> /* faked on sunos4 */
|
||||
|
||||
#include <math.h>
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
#ifdef HAVE_LIMITS_H
|
||||
#include <limits.h>
|
||||
#ifndef MAXINT
|
||||
#define MAXINT INT_MAX
|
||||
#define MAXINT INT_MAX
|
||||
#endif
|
||||
#else
|
||||
#ifdef HAVE_VALUES_H
|
||||
@ -22,7 +22,7 @@
|
||||
#include "utils/builtins.h"
|
||||
|
||||
|
||||
#define HEXDIG(z) (z)<10 ? ((z)+'0') : ((z)-10+'A')
|
||||
#define HEXDIG(z) (z)<10 ? ((z)+'0') : ((z)-10+'A')
|
||||
|
||||
/* Modeled on struct varlena from postgres.h, bu data type is bits8 */
|
||||
struct varbita
|
||||
@ -49,25 +49,25 @@ struct varbita
|
||||
#define VARBITEND(PTR) ((bits8 *) (PTR + VARSIZE(PTR)))
|
||||
/* Mask that will cover exactly one byte, i.e. BITSPERBYTE bits */
|
||||
#define BITMASK 0xFF
|
||||
#define BITHIGH 0x80
|
||||
#define BITHIGH 0x80
|
||||
|
||||
|
||||
bits8 * zpbitin(char *s, int dummy, int32 atttypmod);
|
||||
char * zpbitout(bits8 *s);
|
||||
char * zpbitsout(bits8 *s);
|
||||
bits8 * varbitin(char *s, int dummy, int32 atttypmod);
|
||||
bool biteq (bits8 *arg1, bits8 *arg2);
|
||||
bool bitne (bits8 *arg1, bits8 *arg2);
|
||||
bool bitge (bits8 *arg1, bits8 *arg2);
|
||||
bool bitgt (bits8 *arg1, bits8 *arg2);
|
||||
bool bitle (bits8 *arg1, bits8 *arg2);
|
||||
bool bitlt (bits8 *arg1, bits8 *arg2);
|
||||
int bitcmp (bits8 *arg1, bits8 *arg2);
|
||||
bits8 * bitand (bits8 * arg1, bits8 * arg2);
|
||||
bits8 * bitor (bits8 * arg1, bits8 * arg2);
|
||||
bits8 * bitxor (bits8 * arg1, bits8 * arg2);
|
||||
bits8 * bitnot (bits8 * arg);
|
||||
bits8 * bitshiftright (bits8 * arg, int shft);
|
||||
bits8 * bitshiftleft (bits8 * arg, int shft);
|
||||
bits8 * bitcat (bits8 *arg1, bits8 *arg2);
|
||||
bits8 * bitsubstr (bits8 *arg, int32 s, int32 l);
|
||||
bits8 *zpbitin(char *s, int dummy, int32 atttypmod);
|
||||
char *zpbitout(bits8 *s);
|
||||
char *zpbitsout(bits8 *s);
|
||||
bits8 *varbitin(char *s, int dummy, int32 atttypmod);
|
||||
bool biteq(bits8 *arg1, bits8 *arg2);
|
||||
bool bitne(bits8 *arg1, bits8 *arg2);
|
||||
bool bitge(bits8 *arg1, bits8 *arg2);
|
||||
bool bitgt(bits8 *arg1, bits8 *arg2);
|
||||
bool bitle(bits8 *arg1, bits8 *arg2);
|
||||
bool bitlt(bits8 *arg1, bits8 *arg2);
|
||||
int bitcmp(bits8 *arg1, bits8 *arg2);
|
||||
bits8 *bitand(bits8 *arg1, bits8 *arg2);
|
||||
bits8 *bitor(bits8 *arg1, bits8 *arg2);
|
||||
bits8 *bitxor(bits8 *arg1, bits8 *arg2);
|
||||
bits8 *bitnot(bits8 *arg);
|
||||
bits8 *bitshiftright(bits8 *arg, int shft);
|
||||
bits8 *bitshiftleft(bits8 *arg, int shft);
|
||||
bits8 *bitcat(bits8 *arg1, bits8 *arg2);
|
||||
bits8 *bitsubstr(bits8 *arg, int32 s, int32 l);
|
||||
|
@ -2,21 +2,23 @@
|
||||
|
||||
#include "varbit.h"
|
||||
|
||||
bits8 * varbit_in (char * s);
|
||||
char * varbit_out (bits8 *s);
|
||||
bits8 *varbit_in(char *s);
|
||||
char *varbit_out(bits8 *s);
|
||||
|
||||
bits8 *
|
||||
varbit_in (char * s) {
|
||||
return varbitin (s, 0, -1);
|
||||
varbit_in(char *s)
|
||||
{
|
||||
return varbitin(s, 0, -1);
|
||||
}
|
||||
|
||||
/*char *
|
||||
/*char *
|
||||
varbit_out (bits8 *s) {
|
||||
return zpbitout(s);
|
||||
}
|
||||
*/
|
||||
|
||||
char *
|
||||
varbit_out (bits8 *s) {
|
||||
return zpbitsout(s);
|
||||
char *
|
||||
varbit_out(bits8 *s)
|
||||
{
|
||||
return zpbitsout(s);
|
||||
}
|
||||
|
@ -2,173 +2,183 @@
|
||||
#include "varbit.h"
|
||||
#include <stdio.h>
|
||||
|
||||
void print_details (unsigned char *s);
|
||||
void print_details(unsigned char *s);
|
||||
|
||||
const int numb = 8;
|
||||
|
||||
const int numb = 8;
|
||||
/*
|
||||
const char *b[] = { "B0010", "B11011011", "B0001", "X3F12", "X27", "B",
|
||||
"X11", "B100111"};
|
||||
"X11", "B100111"};
|
||||
int atttypmod[] = {-1, -1, -1,-1,-1,-1,-1,-1 };
|
||||
*/
|
||||
const char *b[] = { "B0010", "B11011011", "B10001", "X3D12", "X27", "B",
|
||||
"X11", "B100111"};
|
||||
int atttypmod[] = { 7, 9, 6, 18, 11, 6, -1, -1 };
|
||||
const char *b[] = {"B0010", "B11011011", "B10001", "X3D12", "X27", "B",
|
||||
"X11", "B100111"};
|
||||
int atttypmod[] = {7, 9, 6, 18, 11, 6, -1, -1};
|
||||
|
||||
|
||||
void print_details (unsigned char *s)
|
||||
void
|
||||
print_details(unsigned char *s)
|
||||
{
|
||||
int i;
|
||||
printf ("Length in bytes : %d\n",VARSIZE(s));
|
||||
printf ("Length of bitstring: %d\n",VARBITLEN(s));
|
||||
for (i=8; i<VARSIZE(s); i++)
|
||||
printf ("%X%X ",s[i]>>4,s[i]&0xF);
|
||||
printf("\n");
|
||||
int i;
|
||||
|
||||
printf("Length in bytes : %d\n", VARSIZE(s));
|
||||
printf("Length of bitstring: %d\n", VARBITLEN(s));
|
||||
for (i = 8; i < VARSIZE(s); i++)
|
||||
printf("%X%X ", s[i] >> 4, s[i] & 0xF);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
int
|
||||
main ()
|
||||
main()
|
||||
{
|
||||
int i, j;
|
||||
char *s[numb];
|
||||
int i,
|
||||
j;
|
||||
char *s[numb];
|
||||
|
||||
for (i=0; i<numb; i++) {
|
||||
printf ("Input: %s\n",b[i]);
|
||||
s[i] = zpbitin(b[i], 0, atttypmod[i]);
|
||||
//print_details(s[i]);
|
||||
printf ("%s = %s\n",zpbitout(s[i]),zpbitsout(s[i]));
|
||||
}
|
||||
for (i = 0; i < numb; i++)
|
||||
{
|
||||
printf("Input: %s\n", b[i]);
|
||||
s[i] = zpbitin(b[i], 0, atttypmod[i]);
|
||||
//print_details(s[i]);
|
||||
printf("%s = %s\n", zpbitout(s[i]), zpbitsout(s[i]));
|
||||
}
|
||||
|
||||
printf ("\nCOMPARISONS:\n");
|
||||
for (i=0; i<numb; i++)
|
||||
for (j=i+1; j<numb; j++)
|
||||
printf("%s <=> %s = %d\n",zpbitsout(s[i]),zpbitsout(s[j]),
|
||||
bitcmp(s[i],s[j]));
|
||||
printf("\nCOMPARISONS:\n");
|
||||
for (i = 0; i < numb; i++)
|
||||
for (j = i + 1; j < numb; j++)
|
||||
printf("%s <=> %s = %d\n", zpbitsout(s[i]), zpbitsout(s[j]),
|
||||
bitcmp(s[i], s[j]));
|
||||
|
||||
printf ("\nCONCATENATION:\n");
|
||||
for (i=0; i<numb; i++)
|
||||
for (j=i+1; j<numb; j++)
|
||||
printf("%s || %s = %s\n",zpbitsout(s[i]),zpbitsout(s[j]),
|
||||
zpbitsout(bitcat(s[i],s[j])));
|
||||
printf("\nCONCATENATION:\n");
|
||||
for (i = 0; i < numb; i++)
|
||||
for (j = i + 1; j < numb; j++)
|
||||
printf("%s || %s = %s\n", zpbitsout(s[i]), zpbitsout(s[j]),
|
||||
zpbitsout(bitcat(s[i], s[j])));
|
||||
|
||||
printf("\nSUBSTR:\n");
|
||||
printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),1,8,
|
||||
zpbitsout(bitsubstr(s[3],1,8)));
|
||||
printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),9,8,
|
||||
zpbitsout(bitsubstr(s[3],9,8)));
|
||||
printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),1,9,
|
||||
zpbitsout(bitsubstr(s[3],1,9)));
|
||||
printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),3,5,
|
||||
zpbitsout(bitsubstr(s[3],3,5)));
|
||||
printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),3,9,
|
||||
zpbitsout(bitsubstr(s[3],3,9)));
|
||||
printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),3,17,
|
||||
zpbitsout(bitsubstr(s[3],3,17)));
|
||||
printf ("\nLOGICAL AND:\n");
|
||||
for (i=0; i<numb; i++)
|
||||
for (j=i+1; j<numb; j++)
|
||||
printf("%s & %s = %s\n",zpbitsout(s[i]),zpbitsout(s[j]),
|
||||
zpbitsout(bitand(s[i],s[j])));
|
||||
printf("\nSUBSTR:\n");
|
||||
printf("%s (%d,%d) => %s\n", zpbitsout(s[3]), 1, 8,
|
||||
zpbitsout(bitsubstr(s[3], 1, 8)));
|
||||
printf("%s (%d,%d) => %s\n", zpbitsout(s[3]), 9, 8,
|
||||
zpbitsout(bitsubstr(s[3], 9, 8)));
|
||||
printf("%s (%d,%d) => %s\n", zpbitsout(s[3]), 1, 9,
|
||||
zpbitsout(bitsubstr(s[3], 1, 9)));
|
||||
printf("%s (%d,%d) => %s\n", zpbitsout(s[3]), 3, 5,
|
||||
zpbitsout(bitsubstr(s[3], 3, 5)));
|
||||
printf("%s (%d,%d) => %s\n", zpbitsout(s[3]), 3, 9,
|
||||
zpbitsout(bitsubstr(s[3], 3, 9)));
|
||||
printf("%s (%d,%d) => %s\n", zpbitsout(s[3]), 3, 17,
|
||||
zpbitsout(bitsubstr(s[3], 3, 17)));
|
||||
printf("\nLOGICAL AND:\n");
|
||||
for (i = 0; i < numb; i++)
|
||||
for (j = i + 1; j < numb; j++)
|
||||
printf("%s & %s = %s\n", zpbitsout(s[i]), zpbitsout(s[j]),
|
||||
zpbitsout(bitand(s[i], s[j])));
|
||||
|
||||
printf ("\nLOGICAL OR:\n");
|
||||
for (i=0; i<numb; i++)
|
||||
for (j=i+1; j<numb; j++)
|
||||
printf("%s | %s = %s\n",zpbitsout(s[i]),zpbitsout(s[j]),
|
||||
zpbitsout(bitor(s[i],s[j])));
|
||||
printf("\nLOGICAL OR:\n");
|
||||
for (i = 0; i < numb; i++)
|
||||
for (j = i + 1; j < numb; j++)
|
||||
printf("%s | %s = %s\n", zpbitsout(s[i]), zpbitsout(s[j]),
|
||||
zpbitsout(bitor(s[i], s[j])));
|
||||
|
||||
printf ("\nLOGICAL XOR:\n");
|
||||
for (i=0; i<numb; i++)
|
||||
for (j=i+1; j<numb; j++)
|
||||
printf("%s ^ %s = %s\n",zpbitsout(s[i]),zpbitsout(s[j]),
|
||||
zpbitsout(bitxor(s[i],s[j])));
|
||||
|
||||
printf ("\nLOGICAL NOT:\n");
|
||||
for (i=0; i<numb; i++)
|
||||
printf("~%s = %s\n",zpbitsout(s[i]),zpbitsout(bitnot(s[i])));
|
||||
printf("\nLOGICAL XOR:\n");
|
||||
for (i = 0; i < numb; i++)
|
||||
for (j = i + 1; j < numb; j++)
|
||||
printf("%s ^ %s = %s\n", zpbitsout(s[i]), zpbitsout(s[j]),
|
||||
zpbitsout(bitxor(s[i], s[j])));
|
||||
|
||||
printf("\nLOGICAL NOT:\n");
|
||||
for (i = 0; i < numb; i++)
|
||||
printf("~%s = %s\n", zpbitsout(s[i]), zpbitsout(bitnot(s[i])));
|
||||
|
||||
|
||||
printf ("\nSHIFT LEFT:\n");
|
||||
for (i=0; i<numb; i++) {
|
||||
printf("%s\n",zpbitsout(s[i]));
|
||||
for (j=0; j<=VARBITLEN(s[i]); j++)
|
||||
printf("\t%3d\t%s\n",j,zpbitsout(bitshiftleft(s[i],j)));
|
||||
}
|
||||
printf("\nSHIFT LEFT:\n");
|
||||
for (i = 0; i < numb; i++)
|
||||
{
|
||||
printf("%s\n", zpbitsout(s[i]));
|
||||
for (j = 0; j <= VARBITLEN(s[i]); j++)
|
||||
printf("\t%3d\t%s\n", j, zpbitsout(bitshiftleft(s[i], j)));
|
||||
}
|
||||
|
||||
printf ("\nSHIFT RIGHT:\n");
|
||||
for (i=0; i<numb; i++) {
|
||||
printf("%s\n",zpbitsout(s[i]));
|
||||
for (j=0; j<=VARBITLEN(s[i]); j++)
|
||||
printf("\t%3d\t%s\n",j,zpbitsout(bitshiftright(s[i],j)));
|
||||
}
|
||||
printf("\nSHIFT RIGHT:\n");
|
||||
for (i = 0; i < numb; i++)
|
||||
{
|
||||
printf("%s\n", zpbitsout(s[i]));
|
||||
for (j = 0; j <= VARBITLEN(s[i]); j++)
|
||||
printf("\t%3d\t%s\n", j, zpbitsout(bitshiftright(s[i], j)));
|
||||
}
|
||||
|
||||
printf ("\n\n ********** VARYING **********\n");
|
||||
for (i=0; i<numb; i++) {
|
||||
printf ("Input: %s\n",b[i]);
|
||||
s[i] = varbitin(b[i], 0, atttypmod[i]);
|
||||
/*print_details(s);*/
|
||||
printf ("%s\n",zpbitout(s[i]));
|
||||
printf ("%s\n",zpbitsout(s[i]));
|
||||
}
|
||||
printf("\n\n ********** VARYING **********\n");
|
||||
for (i = 0; i < numb; i++)
|
||||
{
|
||||
printf("Input: %s\n", b[i]);
|
||||
s[i] = varbitin(b[i], 0, atttypmod[i]);
|
||||
/* print_details(s); */
|
||||
printf("%s\n", zpbitout(s[i]));
|
||||
printf("%s\n", zpbitsout(s[i]));
|
||||
}
|
||||
|
||||
printf ("\nCOMPARISONS:\n");
|
||||
for (i=0; i<numb; i++)
|
||||
for (j=i+1; j<numb; j++)
|
||||
printf("%s <=> %s = %d\n",zpbitsout(s[i]),zpbitsout(s[j]),
|
||||
bitcmp(s[i],s[j]));
|
||||
printf("\nCOMPARISONS:\n");
|
||||
for (i = 0; i < numb; i++)
|
||||
for (j = i + 1; j < numb; j++)
|
||||
printf("%s <=> %s = %d\n", zpbitsout(s[i]), zpbitsout(s[j]),
|
||||
bitcmp(s[i], s[j]));
|
||||
|
||||
printf ("\nCONCATENATION:\n");
|
||||
for (i=0; i<numb; i++)
|
||||
for (j=i+1; j<numb; j++)
|
||||
printf("%s || %s = %s\n",zpbitsout(s[i]),zpbitsout(s[j]),
|
||||
zpbitsout(bitcat(s[i],s[j])));
|
||||
printf("\nCONCATENATION:\n");
|
||||
for (i = 0; i < numb; i++)
|
||||
for (j = i + 1; j < numb; j++)
|
||||
printf("%s || %s = %s\n", zpbitsout(s[i]), zpbitsout(s[j]),
|
||||
zpbitsout(bitcat(s[i], s[j])));
|
||||
|
||||
printf("\nSUBSTR:\n");
|
||||
printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),1,8,
|
||||
zpbitsout(bitsubstr(s[3],1,8)));
|
||||
printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),9,8,
|
||||
zpbitsout(bitsubstr(s[3],9,8)));
|
||||
printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),1,9,
|
||||
zpbitsout(bitsubstr(s[3],1,9)));
|
||||
printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),3,5,
|
||||
zpbitsout(bitsubstr(s[3],3,5)));
|
||||
printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),3,9,
|
||||
zpbitsout(bitsubstr(s[3],3,9)));
|
||||
printf("%s (%d,%d) => %s (%s)\n",zpbitsout(s[3]),3,17,
|
||||
zpbitsout(bitsubstr(s[3],3,17)),zpbitsout(bitsubstr(s[3],3,17)));
|
||||
printf ("\nLOGICAL AND:\n");
|
||||
for (i=0; i<numb; i++)
|
||||
for (j=i+1; j<numb; j++)
|
||||
printf("%s & %s = %s\n",zpbitsout(s[i]),zpbitsout(s[j]),
|
||||
zpbitsout(bitand(s[i],s[j])));
|
||||
printf("\nSUBSTR:\n");
|
||||
printf("%s (%d,%d) => %s\n", zpbitsout(s[3]), 1, 8,
|
||||
zpbitsout(bitsubstr(s[3], 1, 8)));
|
||||
printf("%s (%d,%d) => %s\n", zpbitsout(s[3]), 9, 8,
|
||||
zpbitsout(bitsubstr(s[3], 9, 8)));
|
||||
printf("%s (%d,%d) => %s\n", zpbitsout(s[3]), 1, 9,
|
||||
zpbitsout(bitsubstr(s[3], 1, 9)));
|
||||
printf("%s (%d,%d) => %s\n", zpbitsout(s[3]), 3, 5,
|
||||
zpbitsout(bitsubstr(s[3], 3, 5)));
|
||||
printf("%s (%d,%d) => %s\n", zpbitsout(s[3]), 3, 9,
|
||||
zpbitsout(bitsubstr(s[3], 3, 9)));
|
||||
printf("%s (%d,%d) => %s (%s)\n", zpbitsout(s[3]), 3, 17,
|
||||
zpbitsout(bitsubstr(s[3], 3, 17)), zpbitsout(bitsubstr(s[3], 3, 17)));
|
||||
printf("\nLOGICAL AND:\n");
|
||||
for (i = 0; i < numb; i++)
|
||||
for (j = i + 1; j < numb; j++)
|
||||
printf("%s & %s = %s\n", zpbitsout(s[i]), zpbitsout(s[j]),
|
||||
zpbitsout(bitand(s[i], s[j])));
|
||||
|
||||
printf ("\nLOGICAL OR:\n");
|
||||
for (i=0; i<numb; i++)
|
||||
for (j=i+1; j<numb; j++)
|
||||
printf("%s | %s = %s\n",zpbitsout(s[i]),zpbitsout(s[j]),
|
||||
zpbitsout(bitor(s[i],s[j])));
|
||||
printf("\nLOGICAL OR:\n");
|
||||
for (i = 0; i < numb; i++)
|
||||
for (j = i + 1; j < numb; j++)
|
||||
printf("%s | %s = %s\n", zpbitsout(s[i]), zpbitsout(s[j]),
|
||||
zpbitsout(bitor(s[i], s[j])));
|
||||
|
||||
printf ("\nLOGICAL XOR:\n");
|
||||
for (i=0; i<numb; i++)
|
||||
for (j=i+1; j<numb; j++)
|
||||
printf("%s ^ %s = %s\n",zpbitsout(s[i]),zpbitsout(s[j]),
|
||||
zpbitsout(bitxor(s[i],s[j])));
|
||||
|
||||
printf ("\nLOGICAL NOT:\n");
|
||||
for (i=0; i<numb; i++)
|
||||
printf("~%s = %s\n",zpbitsout(s[i]),zpbitsout(bitnot(s[i])));
|
||||
printf("\nLOGICAL XOR:\n");
|
||||
for (i = 0; i < numb; i++)
|
||||
for (j = i + 1; j < numb; j++)
|
||||
printf("%s ^ %s = %s\n", zpbitsout(s[i]), zpbitsout(s[j]),
|
||||
zpbitsout(bitxor(s[i], s[j])));
|
||||
|
||||
printf("\nLOGICAL NOT:\n");
|
||||
for (i = 0; i < numb; i++)
|
||||
printf("~%s = %s\n", zpbitsout(s[i]), zpbitsout(bitnot(s[i])));
|
||||
|
||||
|
||||
printf ("\nSHIFT LEFT:\n");
|
||||
for (i=0; i<numb; i++) {
|
||||
printf("%s\n",zpbitsout(s[i]));
|
||||
for (j=0; j<=VARBITLEN(s[i]); j++)
|
||||
printf("\t%3d\t%s\n",j,zpbitsout(bitshiftleft(s[i],j)));
|
||||
}
|
||||
printf("\nSHIFT LEFT:\n");
|
||||
for (i = 0; i < numb; i++)
|
||||
{
|
||||
printf("%s\n", zpbitsout(s[i]));
|
||||
for (j = 0; j <= VARBITLEN(s[i]); j++)
|
||||
printf("\t%3d\t%s\n", j, zpbitsout(bitshiftleft(s[i], j)));
|
||||
}
|
||||
|
||||
printf ("\nSHIFT RIGHT:\n");
|
||||
for (i=0; i<numb; i++) {
|
||||
printf("%s\n",zpbitsout(s[i]));
|
||||
for (j=0; j<=VARBITLEN(s[i]); j++)
|
||||
printf("\t%3d\t%s\n",j,zpbitsout(bitshiftright(s[i],j)));
|
||||
}
|
||||
printf("\nSHIFT RIGHT:\n");
|
||||
for (i = 0; i < numb; i++)
|
||||
{
|
||||
printf("%s\n", zpbitsout(s[i]));
|
||||
for (j = 0; j <= VARBITLEN(s[i]); j++)
|
||||
printf("\t%3d\t%s\n", j, zpbitsout(bitshiftright(s[i], j)));
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user