CgovKgojaW5jbHVkZSAmbHQ7ZXJybm8uaCZndDsKI2luY2x1ZGUgJmx0O3NpZ25hbC5oJmd0OwojaW5jbHVkZSAmbHQ7c3RkYXJnLmgmZ3Q7CiNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwojaW5jbHVkZSAmbHQ7c3RkbGliLmgmZ3Q7CiNpbmNsdWRlICZsdDtzdGRub3JldHVybi5oJmd0OwojaW5jbHVkZSAmbHQ7dGltZS5oJmd0OwojaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CgojZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKI2RlZmluZSBfR05VX1NPVVJDRQoKI2RlZmluZSBDSEsob3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpZiAoKG9wKSA9PSAtMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgcmFsZXIgKDEsICNvcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUgKDApCgpub3JldHVybiB2b2lkIHJhbGVyIChpbnQgc3lzZXJyLCBjb25zdCBjaGFyICptc2csIC4uLikKewogICAgdmFfbGlzdCBhcDsKCiAgICB2YV9zdGFydCAoYXAsIG1zZyk7CiAgICB2ZnByaW50ZiAoc3RkZXJyLCBtc2csIGFwKTsKICAgIGZwcmludGYgKHN0ZGVyciwgJnF1b3Q7XG4mcXVvdDspOwogICAgdmFfZW5kIChhcCk7CgogICAgaWYgKHN5c2VyciA9PSAxKQogICAgICAgIHBlcnJvciAoJnF1b3Q7JnF1b3Q7KTsKCiAgICBleGl0IChFWElUX0ZBSUxVUkUpOwp9Cgp2b2lkIHRyaV9hX2J1bGxlcyAoaW50ICp0YWIsIGludCBzaXplKQp7CiAgICBmb3IgKGludCBpID0gc2l6ZSAtIDE7IGkgJmd0OyAwOyBpLS0pIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiAmbHQ7IGk7IGorKykgewogICAgICAgICAgICBpZiAodGFiIFtqICsgMV0gJmx0OyB0YWIgW2pdKSB7CiAgICAgICAgICAgICAgICAvLyBTd2FwIHRoZSBlbGVtZW50cwogICAgICAgICAgICAgICAgaW50IHRlbXAgPSB0YWIgW2pdOwogICAgICAgICAgICAgICAgdGFiIFtqXSA9IHRhYiBbaiArIDFdOwogICAgICAgICAgICAgICAgdGFiIFtqICsgMV0gPSB0ZW1wOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIHNpZ2Fscm1faGFuZGxlciAoaW50IHNpZ25vKQp7CiAgICAodm9pZClzaWdubzsgLy8gRXhwbGljaXRseSBpbmRpY2F0ZSB0aGF0IHRoZSBwYXJhbWV0ZXIgaXMgbm90IHVzZWQKICAgIHByaW50ZiAoJnF1b3Q7d29ya2luZ1xuJnF1b3Q7KTsKICAgIGFsYXJtICgxKTsgLy8gU2NoZWR1bGUgdGhlIG5leHQgYWxhcm0KfQoKaW50IG1haW4gKGludCBhcmdjLCBjaGFyICphcmd2IFtdKQp7CiAgICBpZiAoYXJnYyAhPSAyKSB7CiAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAmcXVvdDtVc2FnZTogJXMgJmx0O3NpemUmZ3Q7XG4mcXVvdDssIGFyZ3YgWzBdKTsKICAgICAgICBleGl0IChFWElUX0ZBSUxVUkUpOwogICAgfQoKICAgIGludCBzaXplID0gYXRvaSAoYXJndiBbMV0pOwogICAgaWYgKHNpemUgJmx0Oz0gMCkgewogICAgICAgIGZwcmludGYgKHN0ZGVyciwgJnF1b3Q7SW52YWxpZCBzaXplXG4mcXVvdDspOwogICAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7CiAgICB9CgogICAgLy8gQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBhcnJheQogICAgaW50ICphcnJheSA9IChpbnQgKiltYWxsb2MgKHNpemUgKiBzaXplb2YgKGludCkpOwogICAgaWYgKGFycmF5ID09IE5VTEwpCiAgICAgICAgcmFsZXIgKDEsICZxdW90O21hbGxvYyBmYWlsZWQmcXVvdDspOwoKICAgIHNyYW5kICgodW5zaWduZWQgaW50KXRpbWUgKE5VTEwpKTsKICAgIGZvciAoaW50IGkgPSAwOyBpICZsdDsgc2l6ZTsgaSsrKQogICAgICAgIGFycmF5IFtpXSA9IHJhbmQgKCkgJSAxMDAxOwoKICAgIC8vIFNldCB1cCB0aGUgU0lHQUxSTSBoYW5kbGVyCiAgICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhOwogICAgc2Euc2FfaGFuZGxlciA9IHNpZ2Fscm1faGFuZGxlcjsKICAgIHNhLnNhX2ZsYWdzID0gMDsKICAgIENISyAoc2lnYWN0aW9uIChTSUdBTFJNLCAmYW1wO3NhLCBOVUxMKSk7CgogICAgLy8gU2V0IHRoZSBpbml0aWFsIGFsYXJtCiAgICBhbGFybSAoMSk7CgogICAgLy8gU29ydCB0aGUgYXJyYXkgdXNpbmcgYnViYmxlIHNvcnQKICAgIHRyaV9hX2J1bGxlcyAoYXJyYXksIHNpemUpOwoKICAgIC8vIENhbmNlbCB0aGUgbmV4dCBTSUdBTFJNCiAgICBhbGFybSAoMCk7CgogICAgLy8gUHJpbnQgdGhlIHNvcnRlZCBhcnJheQogICAgZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBzaXplOyBpKyspCiAgICAgICAgcHJpbnRmICgmcXVvdDslZFxuJnF1b3Q7LCBhcnJheSBbaV0pOwoKICAgIGZyZWUgKGFycmF5KTsKCiAgICByZXR1cm4gMDsKfQoqLwojaW5jbHVkZSAmbHQ7ZXJybm8uaCZndDsKI2luY2x1ZGUgJmx0O3NpZ25hbC5oJmd0OwojaW5jbHVkZSAmbHQ7c3RkYXJnLmgmZ3Q7CiNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwojaW5jbHVkZSAmbHQ7c3RkbGliLmgmZ3Q7CiNpbmNsdWRlICZsdDtzdGRub3JldHVybi5oJmd0OwojaW5jbHVkZSAmbHQ7dGltZS5oJmd0OwojaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CgojZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKCiNkZWZpbmUgQ0hLKG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaWYgKChvcCkgPT0gLTEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHJhbGVyICgxLCAjb3ApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlICgwKQoKbm9yZXR1cm4gdm9pZCByYWxlciAoaW50IHN5c2VyciwgY29uc3QgY2hhciAqbXNnLCAuLi4pCnsKICAgIHZhX2xpc3QgYXA7CgogICAgdmFfc3RhcnQgKGFwLCBtc2cpOwogICAgdmZwcmludGYgKHN0ZGVyciwgbXNnLCBhcCk7CiAgICBmcHJpbnRmIChzdGRlcnIsICZxdW90O1xuJnF1b3Q7KTsKICAgIHZhX2VuZCAoYXApOwoKICAgIGlmIChzeXNlcnIgPT0gMSkKICAgICAgICBwZXJyb3IgKCZxdW90OyZxdW90Oyk7CgogICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKfQoKdm9pZCB0cmlfYV9idWxsZXMgKGludCAqdGFiLCBpbnQgc2l6ZSkKewogICAgZm9yIChpbnQgaSA9IHNpemUgLSAxOyBpICZndDsgMDsgaS0tKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogJmx0OyBpOyBqKyspIHsKICAgICAgICAgICAgaWYgKHRhYiBbaiArIDFdICZsdDsgdGFiIFtqXSkgewogICAgICAgICAgICAgICAgLy8gU3dhcCB0aGUgZWxlbWVudHMKICAgICAgICAgICAgICAgIGludCB0ZW1wID0gdGFiIFtqXTsKICAgICAgICAgICAgICAgIHRhYiBbal0gPSB0YWIgW2ogKyAxXTsKICAgICAgICAgICAgICAgIHRhYiBbaiArIDFdID0gdGVtcDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKdm9pZCBzaWdhbHJtX2hhbmRsZXIgKGludCBzaWdubykKewogICAgVU5VU0VEIChzaWdubyk7CiAgICBwcmludGYgKCZxdW90O3dvcmtpbmdcbiZxdW90Oyk7CiAgICBhbGFybSAoMSk7Cn0KCmludCBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndiBbXSkKewogICAgaWYgKGFyZ2MgIT0gMikgewogICAgICAgIGZwcmludGYgKHN0ZGVyciwgJnF1b3Q7VXNhZ2U6ICVzICZsdDtzaXplJmd0O1xuJnF1b3Q7LCBhcmd2IFswXSk7CiAgICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKICAgIH0KCiAgICBpbnQgc2l6ZSA9IGF0b2kgKGFyZ3YgWzFdKTsKICAgIGlmIChzaXplICZsdDs9IDApIHsKICAgICAgICBmcHJpbnRmIChzdGRlcnIsICZxdW90O0ludmFsaWQgc2l6ZVxuJnF1b3Q7KTsKICAgICAgICBleGl0IChFWElUX0ZBSUxVUkUpOwogICAgfQoKICAgIC8vIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgYXJyYXkKICAgIGludCAqYXJyYXkgPSAoaW50ICopbWFsbG9jIChzaXplICogc2l6ZW9mIChpbnQpKTsKICAgIGlmIChhcnJheSA9PSBOVUxMKQogICAgICAgIHJhbGVyICgxLCAmcXVvdDttYWxsb2MgZmFpbGVkJnF1b3Q7KTsKCiAgICBzcmFuZCAoKHVuc2lnbmVkIGludCl0aW1lIChOVUxMKSk7CiAgICBmb3IgKGludCBpID0gMDsgaSAmbHQ7IHNpemU7IGkrKykKICAgICAgICBhcnJheSBbaV0gPSByYW5kICgpICUgMTAwMTsKCiAgICAvLyBTZXQgdXAgdGhlIFNJR0FMUk0gaGFuZGxlcgogICAgc3RydWN0IHNpZ2FjdGlvbiBzYTsKICAgIHNhLnNhX2hhbmRsZXIgPSBzaWdhbHJtX2hhbmRsZXI7CiAgICBzYS5zYV9mbGFncyA9IDA7CiAgICBDSEsgKHNpZ2FjdGlvbiAoU0lHQUxSTSwgJmFtcDtzYSwgTlVMTCkpOwoKICAgIC8vIFNldCB0aGUgaW5pdGlhbCBhbGFybQogICAgYWxhcm0gKDEpOwoKICAgIC8vIFNvcnQgdGhlIGFycmF5IHVzaW5nIGJ1YmJsZSBzb3J0CiAgICB0cmlfYV9idWxsZXMgKGFycmF5LCBzaXplKTsKCiAgICAvLyBDYW5jZWwgdGhlIG5leHQgU0lHQUxSTQogICAgYWxhcm0gKDApOwoKICAgIC8vIFByaW50IHRoZSBzb3J0ZWQgYXJyYXkKICAgIGZvciAoaW50IGkgPSAwOyBpICZsdDsgc2l6ZTsgaSsrKQogICAgICAgIHByaW50ZiAoJnF1b3Q7JWRcbiZxdW90OywgYXJyYXkgW2ldKTsKCiAgICBmcmVlIChhcnJheSk7CgogICAgcmV0dXJuIDA7Cn0K
/*
#include <errno.h>
#include <signal.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdnoreturn.h>
#include <time.h>
#include <unistd.h>
#define UNUSED(x) (void)(x)
#define _GNU_SOURCE
#define CHK(op) \
do { \
if ((op) == -1) \
raler (1, #op); \
} while (0)
noreturn void raler (int syserr, const char *msg, ...)
{
va_list ap;
va_start (ap, msg);
vfprintf (stderr, msg, ap);
fprintf (stderr, "\n");
va_end (ap);
if (syserr == 1)
perror ("");
exit (EXIT_FAILURE);
}
void tri_a_bulles (int *tab, int size)
{
for (int i = size - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
if (tab [j + 1] < tab [j]) {
// Swap the elements
int temp = tab [j];
tab [j] = tab [j + 1];
tab [j + 1] = temp;
}
}
}
}
void sigalrm_handler (int signo)
{
(void)signo; // Explicitly indicate that the parameter is not used
printf ("working\n");
alarm (1); // Schedule the next alarm
}
int main (int argc, char *argv [])
{
if (argc != 2) {
fprintf (stderr, "Usage: %s <size>\n", argv [0]);
exit (EXIT_FAILURE);
}
int size = atoi (argv [1]);
if (size <= 0) {
fprintf (stderr, "Invalid size\n");
exit (EXIT_FAILURE);
}
// Create and initialize the array
int *array = (int *)malloc (size * sizeof (int));
if (array == NULL)
raler (1, "malloc failed");
srand ((unsigned int)time (NULL));
for (int i = 0; i < size; i++)
array [i] = rand () % 1001;
// Set up the SIGALRM handler
struct sigaction sa;
sa.sa_handler = sigalrm_handler;
sa.sa_flags = 0;
CHK (sigaction (SIGALRM, &sa, NULL));
// Set the initial alarm
alarm (1);
// Sort the array using bubble sort
tri_a_bulles (array, size);
// Cancel the next SIGALRM
alarm (0);
// Print the sorted array
for (int i = 0; i < size; i++)
printf ("%d\n", array [i]);
free (array);
return 0;
}
*/
#include <errno.h>
#include <signal.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdnoreturn.h>
#include <time.h>
#include <unistd.h>
#define UNUSED(x) (void)(x)
#define CHK(op) \
do { \
if ((op) == -1) \
raler (1, #op); \
} while (0)
noreturn void raler (int syserr, const char *msg, ...)
{
va_list ap;
va_start (ap, msg);
vfprintf (stderr, msg, ap);
fprintf (stderr, "\n");
va_end (ap);
if (syserr == 1)
perror ("");
exit (EXIT_FAILURE);
}
void tri_a_bulles (int *tab, int size)
{
for (int i = size - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
if (tab [j + 1] < tab [j]) {
// Swap the elements
int temp = tab [j];
tab [j] = tab [j + 1];
tab [j + 1] = temp;
}
}
}
}
void sigalrm_handler (int signo)
{
UNUSED (signo);
printf ("working\n");
alarm (1);
}
int main (int argc, char *argv [])
{
if (argc != 2) {
fprintf (stderr, "Usage: %s <size>\n", argv [0]);
exit (EXIT_FAILURE);
}
int size = atoi (argv [1]);
if (size <= 0) {
fprintf (stderr, "Invalid size\n");
exit (EXIT_FAILURE);
}
// Create and initialize the array
int *array = (int *)malloc (size * sizeof (int));
if (array == NULL)
raler (1, "malloc failed");
srand ((unsigned int)time (NULL));
for (int i = 0; i < size; i++)
array [i] = rand () % 1001;
// Set up the SIGALRM handler
struct sigaction sa;
sa.sa_handler = sigalrm_handler;
sa.sa_flags = 0;
CHK (sigaction (SIGALRM, &sa, NULL));
// Set the initial alarm
alarm (1);
// Sort the array using bubble sort
tri_a_bulles (array, size);
// Cancel the next SIGALRM
alarm (0);
// Print the sorted array
for (int i = 0; i < size; i++)
printf ("%d\n", array [i]);
free (array);
return 0;
}